diff -Nru acm-5.0/ACM-Bibliography acm-6.0+20200416/ACM-Bibliography --- acm-5.0/ACM-Bibliography 1992-10-22 15:25:35.000000000 +0000 +++ acm-6.0+20200416/ACM-Bibliography 1970-01-01 00:00:00.000000000 +0000 @@ -1,40 +0,0 @@ -Here is a list of my references for those looking for more detailed information -about modern air combat and the technical basis for this software. - -Good General References: [Spick87], [Sweet87] - -Air Combat Tactics: [Shaw85] - -Aerodynamics: [Huenecke87, [Blake91] - -Aircraft Performance Data: [Spick87], [AirI Aug92], [Blake91], - [Gunston80], [Chant81] - -Modern Air-to-Air Missiles: [Blake91], [Shaw85] - ---------- - -[Spick87] Spick, Mike. An Illustrated Guide to Modern Fighter Combat. - New York: Prentice Hall, 1987. - -[Sweet87] Sweetman, Bill, et al. The Great Book of Modern Warplanes. - New York: Portland House, 1987. - -[Shaw85] Shaw, Robert L. Fighter Combat. - Annapolis: Naval Institute Press, 1985. - -[Huenecke87] Huenecke, Klaus. Modern Combat Aircraft Design. - Trans. Airlife Publishing Ltd. Annapolis: Naval Institute - Press, 1987. - -[Blake91] Blakelock, John H. Automatic Control of Aircraft and Missiles. - New York: John Wiley and Sons, 1991. - -[Gunston80] Gunston, Bill. An Illustrated Guide to Modern Fighters and - Attack Aircraft. New York: Arco Publishing Inc., 1980. - -[Chant81] Chant, Chris (editor). Concise Guide to Military Aircraft of - the World. Feltham: Temple Press, 1981. - -[AirI Aug92] Braybrook, Roy. ``Rapidly Going Nowhere?'', Air International, - 43, No. 2 (1992), 67-74. diff -Nru acm-5.0/acmdoc.rtf acm-6.0+20200416/acmdoc.rtf --- acm-5.0/acmdoc.rtf 1998-12-30 21:11:39.000000000 +0000 +++ acm-6.0+20200416/acmdoc.rtf 1970-01-01 00:00:00.000000000 +0000 @@ -1,22708 +0,0 @@ -{\rtf1\ansi\ansicpg1252\uc1 \deff1\deflang1033\deflangfe1033{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f1\fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;} -{\f2\fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;}{\f3\froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}{\f4\froman\fcharset0\fprq2{\*\panose 02020603050405020304}TIMES;} -{\f5\fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}HELVETICA;}{\f6\fmodern\fcharset0\fprq1{\*\panose 00000000000000000000}Courier;}{\f7\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}Geneva;} -{\f8\froman\fcharset0\fprq2{\*\panose 00000000000000000000}Tms Rmn;}{\f9\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}Helv;}{\f10\froman\fcharset0\fprq2{\*\panose 00000000000000000000}MS Serif;} -{\f11\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}MS Sans Serif;}{\f12\froman\fcharset0\fprq2{\*\panose 00000000000000000000}New York;}{\f13\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}System;} -{\f14\fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings;}{\f15\fswiss\fcharset0\fprq2{\*\panose 020b0604030504040204}Tahoma;}{\f16\fmodern\fcharset0\fprq1{\*\panose 00000000000000000000}Letter Gothic;} -{\f17\fmodern\fcharset0\fprq1{\*\panose 00000000000000000000}Courier 16.67 Pitch;}{\f18\froman\fcharset0\fprq2{\*\panose 00000000000000000000}CG Times;}{\f19\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}Univers;} -{\f20\fnil\fcharset2\fprq2{\*\panose 00000000000000000000}Marlett;}{\f21\fmodern\fcharset0\fprq1{\*\panose 020b0609040504020204}Lucida Console;}{\f22\fswiss\fcharset0\fprq2{\*\panose 020b0602030504020204}Lucida Sans Unicode;} -{\f23\fnil\fcharset0\fprq2{\*\panose 00000000000000000000}Balloon;}{\f24\fscript\fcharset0\fprq2{\*\panose 03030803040807090c04}CommercialScript BT;}{\f25\fnil\fcharset0\fprq2{\*\panose 00000000000000000000}Copperplate;} -{\f26\fnil\fcharset0\fprq2{\*\panose 00000000000000000000}Dom Casual;}{\f27\fswiss\fcharset0\fprq2{\*\panose 020b0706020204020204}Futura BdCn BT;}{\f28\fswiss\fcharset0\fprq2{\*\panose 020b0506020204030203}Futura MdCn BT;} -{\f29\fswiss\fcharset0\fprq2{\*\panose 020b0806020204090204}Futura XBlkCnIt BT;}{\f30\fswiss\fcharset0\fprq2{\*\panose 020b0903020204090204}Futura XBlkIt BT;}{\f31\froman\fcharset0\fprq2{\*\panose 02020404030301010803}Garamond;} -{\f32\fnil\fcharset0\fprq2{\*\panose 00000000000000000000}Marriage;}{\f33\fnil\fcharset0\fprq2{\*\panose 00000000000000000000}Mural Script;}{\f34\fnil\fcharset0\fprq2{\*\panose 00000000000000000000}Optimum;} -{\f35\froman\fcharset0\fprq2{\*\panose 02070a02080905020204}PosterBodoni BT;}{\f36\froman\fcharset0\fprq2{\*\panose 02070a02080905090204}PosterBodoni It BT;}{\f37\fnil\fcharset0\fprq2{\*\panose 00000000000000000000}Serpentine;} -{\f38\froman\fcharset0\fprq2{\*\panose 02060706050705050204}Schadow BlkCn BT;}{\f39\fscript\fcharset0\fprq2{\*\panose 03090702030407020403}Staccato222 BT;}{\f40\fscript\fcharset0\fprq2{\*\panose 03090702030407020404}Staccato555 BT;} -{\f41\fnil\fcharset0\fprq2{\*\panose 00000000000000000000}Bodoni-DTC;}{\f42\fnil\fcharset0\fprq2{\*\panose 00000000000000000000}Broadway;}{\f43\fnil\fcharset0\fprq2{\*\panose 00000000000000000000}Cooper Black;} -{\f44\froman\fcharset0\fprq2{\*\panose 0208090405030b090404}Cooper BlkIt BT;}{\f45\fnil\fcharset0\fprq2{\*\panose 00000000000000000000}Eurostile Extended;}{\f46\fnil\fcharset0\fprq2{\*\panose 00000000000000000000}Fette Engschrift;} -{\f47\fswiss\fcharset0\fprq2{\*\panose 020b7200000000000000}Franklin Cond. Gothic;}{\f48\fnil\fcharset0\fprq2{\*\panose 00000000000000000000}Frugal Sans;}{\f49\fnil\fcharset0\fprq2{\*\panose 00000000000000000000}Heritage;} -{\f50\fnil\fcharset0\fprq2{\*\panose 00000000000000000000}Latin Wide;}{\f51\fnil\fcharset0\fprq2{\*\panose 00000000000000000000}Stencil;}{\f52\fnil\fcharset0\fprq2{\*\panose 00000000000000000000}Stop;} -{\f53\fswiss\fcharset0\fprq2{\*\panose 020b0506020202030204}Arial Narrow;}{\f54\fswiss\fcharset0\fprq2{\*\panose 020b0a04020102020204}Arial Black;}{\f55\fswiss\fcharset0\fprq2{\*\panose 020f0704030504030204}Arial Rounded MT Bold;} -{\f56\froman\fcharset0\fprq2{\*\panose 02040602050305030304}Book Antiqua;}{\f57\froman\fcharset0\fprq2{\*\panose 02050604050505020204}Bookman Old Style;}{\f58\fswiss\fcharset0\fprq2{\*\panose 020b0502020202020204}Century Gothic;} -{\f59\froman\fcharset0\fprq2{\*\panose 02040604050505020304}Century Schoolbook;}{\f60\fnil\fcharset2\fprq2{\*\panose 01010601010101010101}Monotype Sorts;}{\f61\fswiss\fcharset0\fprq2{\*\panose 020b0706040902060204}Haettenschweiler;} -{\f62\fdecor\fcharset0\fprq2{\*\panose 04020705040a02060702}Algerian;}{\f63\fdecor\fcharset0\fprq2{\*\panose 04030b070d0b02020403}Braggadocio;}{\f64\fswiss\fcharset0\fprq2{\*\panose 020b0903060703020204}Britannic Bold;} -{\f65\fscript\fcharset0\fprq2{\*\panose 03060802040406070304}Brush Script MT;}{\f66\fdecor\fcharset0\fprq2{\*\panose 04020805060202030203}Colonna MT;}{\f67\fdecor\fcharset0\fprq2{\*\panose 04020505020e03040504}Desdemona;} -{\f68\froman\fcharset0\fprq2{\*\panose 0204060206030a020304}Footlight MT Light;}{\f69\fdecor\fcharset0\fprq2{\*\panose 040307050d0c02020703}Kino MT;}{\f70\fscript\fcharset0\fprq2{\*\panose 03020802060602070202}Matura MT Script Capitals;} -{\f71\fdecor\fcharset0\fprq2{\*\panose 040506030a0602020202}Playbill;}{\f72\froman\fcharset2\fprq2{\*\panose 05050102010706020507}Bookshelf Symbol 3;}{\f73\fmodern\fcharset2\fprq2{\*\panose 050b0009000000000000}OCR-A;} -{\f74\fmodern\fcharset0\fprq2{\*\panose 020b0009000000000000}QuickType Mono;}{\f75\fswiss\fcharset0\fprq2{\*\panose 020b0000000000000000}QuickType;}{\f76\fswiss\fcharset0\fprq2{\*\panose 020b0506030403020203}QuickType Condensed;} -{\f77\fnil\fcharset2\fprq2{\*\panose 05000000000000000000}QuickType Pi;}{\f78\fnil\fcharset0\fprq2{\*\panose 00000400000000000000}CAC Camelot;}{\f79\fnil\fcharset0\fprq2{\*\panose 00000400000000000000}CAC Champagne;} -{\f80\fnil\fcharset0\fprq2{\*\panose 00000400000000000000}CAC Futura Casual;}{\f81\fnil\fcharset0\fprq2{\*\panose 00000400000000000000}CAC Futura Casual Bold;}{\f82\fnil\fcharset0\fprq2{\*\panose 00000400000000000000}CAC Futura Casual Bold Italic;} -{\f83\fnil\fcharset0\fprq2{\*\panose 00000400000000000000}CAC Futura Casual Med. Italic;}{\f84\fnil\fcharset0\fprq2{\*\panose 00000400000000000000}CAC Krazy Legs;}{\f85\fnil\fcharset0\fprq2{\*\panose 00000400000000000000}CAC Krazy Legs Bold;} -{\f86\fswiss\fcharset0\fprq2{\*\panose 000b0604020202020204}CAC Logo Alternate;}{\f87\fnil\fcharset0\fprq2{\*\panose 00000400000000000000}CAC Lasko Condensed;}{\f88\fnil\fcharset0\fprq2{\*\panose 00000400000000000000}CAC Leslie;} -{\f89\fnil\fcharset0\fprq2{\*\panose 00000300000000000000}CAC Lasko Even Weight;}{\f90\fnil\fcharset0\fprq2{\*\panose 00000400000000000000}CAC Moose;}{\f91\fnil\fcharset0\fprq2{\*\panose 00000700000000000000}CAC Norm Heavy;} -{\f92\fnil\fcharset0\fprq2{\*\panose 00000400000000000000}CAC One Seventy;}{\f93\fnil\fcharset0\fprq2{\*\panose 00000400000000000000}CAC Pinafore;}{\f94\fnil\fcharset0\fprq2{\*\panose 00000700000000000000}CAC Saxon Bold;} -{\f95\fnil\fcharset0\fprq2{\*\panose 00000400000000000000}CAC Shishoni Brush;}{\f96\fnil\fcharset0\fprq2{\*\panose 00000400000000000000}CAC Valiant;}{\f97\froman\fcharset0\fprq2{\*\panose 02020502050305020303}GoudyOlSt BT;} -{\f98\fswiss\fcharset0\fprq2{\*\panose 020b0602020204020303}Futura Md BT;}{\f99\fswiss\fcharset0\fprq2{\*\panose 020b0903020204020204}Futura XBlk BT;}{\f100\fswiss\fcharset0\fprq2{\*\panose 020b0806020204020204}Futura XBlkCn BT;} -{\f101\froman\fcharset0\fprq2{\*\panose 02070603080706020303}BauerBodni BT;}{\f102\fscript\fcharset0\fprq2{\*\panose 03020602050506080705}ParkAvenue BT;}{\f103\fdecor\fcharset0\fprq2{\*\panose 04020605080303030203}CaslonOpnface BT;} -{\f104\fscript\fcharset0\fprq2{\*\panose 03060902030302020204}DomCasual BT;}{\f105\fdecor\fcharset0\fprq2{\*\panose 04030505050b02020a03}Exotc350 Lt BT;}{\f106\fscript\fcharset0\fprq2{\*\panose 03060902030402060201}Balloon XBd BT;} -{\f107\fdecor\fcharset0\fprq2{\*\panose 04030805030b02020c03}HandelGothic BT;}{\f108\fscript\fcharset0\fprq2{\*\panose 03020702040502020203}Lydian BT;}{\f109\fscript\fcharset0\fprq2{\*\panose 03090802040305080204}Brush455 BT;} -{\f110\fscript\fcharset0\fprq2{\*\panose 03020702040507090a04}Amazone BT;}{\f111\fscript\fcharset0\fprq2{\*\panose 03080402040206030403}Freehand591 BT;}{\f112\fscript\fcharset0\fprq2{\*\panose 03080702030306060204}Freehand575 BT;} -{\f113\fdecor\fcharset0\fprq2{\*\panose 04030205020b02020502}BernhardFashion BT;}{\f114\fdecor\fcharset0\fprq2{\*\panose 04030605060b02020503}Parisian BT;}{\f115\fscript\fcharset0\fprq2{\*\panose 03060702050402020204}Calligraph421 BT;} -{\f116\fdecor\fcharset0\fprq2{\*\panose 04040805040b02020603}AdLib BT;}{\f117\fscript\fcharset0\fprq2{\*\panose 03080702020302020206}OzHandicraft BT;}{\f118\fscript\fcharset0\fprq2{\*\panose 03080802020302020203}MisterEarl BT;} -{\f119\fswiss\fcharset0\fprq2{\*\panose 020b0504020202020204}Swiss 721 SWA;}{\f120\fdecor\fcharset0\fprq2{\*\panose 04040a05050d02020502}Beesknees ITC;}{\f121\fscript\fcharset0\fprq2{\*\panose 03070402050302030203}Bradley Hand ITC;} -{\f122\froman\fcharset0\fprq2{\*\panose 02040603050505030304}Calisto MT;}{\f123\fscript\fcharset0\fprq2{\*\panose 030f0702030302020204}Comic Sans MS;}{\f124\fdecor\fcharset0\fprq2{\*\panose 04040404050702020202}Curlz MT;} -{\f125\froman\fcharset0\fprq2{\*\panose 02020904090505020303}Elephant;}{\f126\fswiss\fcharset0\fprq2{\*\panose 020b0907030504020204}Eras Bold ITC;}{\f127\fswiss\fcharset0\fprq2{\*\panose 020b0805030504020804}Eras Demi ITC;} -{\f128\fswiss\fcharset0\fprq2{\*\panose 020b0402030504020804}Eras Light ITC;}{\f129\fswiss\fcharset0\fprq2{\*\panose 020b0602030504020804}Eras Medium ITC;}{\f130\fswiss\fcharset0\fprq2{\*\panose 020b0a07030504020204}Eras Ultra ITC;} -{\f131\fswiss\fcharset0\fprq2{\*\panose 020b0806030902050204}Impact;}{\f132\fdecor\fcharset0\fprq2{\*\panose 04040403040a02020202}Juice ITC;}{\f133\fdecor\fcharset0\fprq2{\*\panose 04040403030d02020704}Matisse ITC;} -{\f134\froman\fcharset0\fprq2{\*\panose 02060603020205020403}Rockwell;}{\f135\froman\fcharset0\fprq2{\*\panose 02060903040505020403}Rockwell Extra Bold;}{\f136\fdecor\fcharset0\fprq2{\*\panose 04040a07060a02020202}Snap ITC;} -{\f137\fdecor\fcharset0\fprq2{\*\panose 04020404030d07020202}Tempus Sans ITC;}{\f138\fscript\fcharset0\fprq2{\*\panose 03070502030502020203}Viner Hand ITC;}{\f139\froman\fcharset0\fprq2{\*\panose 020a0a07050505020404}Wide Latin;} -{\f140\fswiss\fcharset0\fprq2{\*\panose 020b0604030504040204}Verdana;}{\f141\froman\fcharset2\fprq2{\*\panose 05030102010509060703}Webdings;}{\f142\fswiss\fcharset0\fprq2{\*\panose 020e0705020206020404}Copperplate Gothic Bold;} -{\f143\fswiss\fcharset0\fprq2{\*\panose 020e0507020206020404}Copperplate Gothic Light;}{\f144\froman\fcharset0\fprq2{\*\panose 02040502050405020303}Georgia;}{\f145\fswiss\fcharset0\fprq2{\*\panose 020b0603020202020204}Trebuchet MS;} -{\f146\froman\fcharset2\fprq2{\*\panose 05050102010205020202}MT Extra;}{\f147\fnil\fcharset2\fprq2{\*\panose 05000000000000000000}MS Outlook;}{\f148\fswiss\fcharset0\fprq2{\*\panose 020b0506030101010103}Abadi MT Condensed;} -{\f149\froman\fcharset2\fprq2{\*\panose 05020102010507070707}Wingdings 2;}{\f150\froman\fcharset2\fprq2{\*\panose 05040102010807070707}Wingdings 3;}{\f151\fswiss\fcharset2\fprq2{\*\panose 050b0604020202020204}Bookshelf Symbol 4;} -{\f152\fnil\fcharset2\fprq2{\*\panose 05010101010101010101}Bookshelf Symbol 5;}{\f153\froman\fcharset0\fprq2{\*\panose 02020500000000000000}CODE3OF9X1;}{\f154\froman\fcharset0\fprq2{\*\panose 02040803050506020403}Aldine721 BT;} -{\f155\fscript\fcharset0\fprq2{\*\panose 03060802040406070304}BrushScript BT;}{\f156\froman\fcharset0\fprq2{\*\panose 02020602050506020403}ClassGarmnd BT;}{\f157\fdecor\fcharset0\fprq2{\*\panose 04030605060702020802}UnivrstyRoman Bd BT;} -{\f158\froman\fcharset0\fprq2{\*\panose 02030506050405070503}Windsor LtCn BT;}{\f159\froman\fcharset0\fprq2{\*\panose 0208060305030b020404}Cooper Md BT;}{\f160\froman\fcharset0\fprq2{\*\panose 02020702060506020403}ElegaGarmnd BT;} -{\f161\fscript\fcharset0\fprq2{\*\panose 03080802040207080305}Kaufmann Bd BT;}{\f162\fswiss\fcharset0\fprq2{\*\panose 020f0702020204020204}VAGRounded BT;}{\f163\fscript\fcharset0\fprq2{\*\panose 030306020304040d0d03}English157 BT;} -{\f164\fscript\fcharset0\fprq2{\*\panose 03050602040405050b04}MurrayHill Bd BT;}{\f165\fscript\fcharset0\fprq2{\*\panose 03020802040502060804}Cataneo BT;}{\f166\froman\fcharset0\fprq2{\*\panose 02030602020205020202}DellaRobbia BT;} -{\f167\fscript\fcharset0\fprq2{\*\panose 03060802040302020203}Formal436 BT;}{\f168\fdecor\fcharset0\fprq2{\*\panose 04040704021002020703}Tango BT;}{\f169\fdecor\fcharset0\fprq2{\*\panose 04080805060107010802}OldDreadfulNo7 BT;} -{\f170\fdecor\fcharset0\fprq2{\*\panose 04060505060202020a04}Felix Titling;}{\f171\fscript\fcharset0\fprq2{\*\panose 03060902040502070203}Forte;}{\f172\fscript\fcharset0\fprq2{\*\panose 03020402040607040605}French Script MT;} -{\f173\fswiss\fcharset0\fprq2{\*\panose 020b0a04020203020204}Gill Sans Ultra Bold;}{\f174\fswiss\fcharset0\fprq2{\*\panose 020b0802020104020203}Gill Sans MT Ext Condensed Bold;}{\f175\froman\fcharset0\fprq2{\*\panose 0202090407030b020401}Goudy Stout;} -{\f176\fdecor\fcharset0\fprq2{\*\panose 04020605060303030202}Imprint MT Shadow;}{\f177\fscript\fcharset0\fprq2{\*\panose 030304020206070d0d06}Kunstler Script;}{\f178\fscript\fcharset0\fprq2{\*\panose 03060402040502070804}Pepita MT;} -{\f179\fscript\fcharset0\fprq2{\*\panose 03070502040507070304}Rage Italic;}{\f180\fscript\fcharset0\fprq2{\*\panose 03040602040607080904}Script MT Bold;}{\f181\fswiss\fcharset0\fprq2{\*\panose 020b0802020104020603}Tw Cen MT;} -{\f182\fswiss\fcharset0\fprq2{\*\panose 020b0606020104020203}Tw Cen MT Condensed;}{\f183\fscript\fcharset0\fprq2{\*\panose 03050402040407070305}Vladimir Script;}{\f184\froman\fcharset238\fprq2 Times New Roman CE;} -{\f185\froman\fcharset204\fprq2 Times New Roman Cyr;}{\f187\froman\fcharset161\fprq2 Times New Roman Greek;}{\f188\froman\fcharset162\fprq2 Times New Roman Tur;}{\f189\froman\fcharset186\fprq2 Times New Roman Baltic;} -{\f190\fswiss\fcharset238\fprq2 Arial CE;}{\f191\fswiss\fcharset204\fprq2 Arial Cyr;}{\f193\fswiss\fcharset161\fprq2 Arial Greek;}{\f194\fswiss\fcharset162\fprq2 Arial Tur;}{\f195\fswiss\fcharset186\fprq2 Arial Baltic;} -{\f196\fmodern\fcharset238\fprq1 Courier New CE;}{\f197\fmodern\fcharset204\fprq1 Courier New Cyr;}{\f199\fmodern\fcharset161\fprq1 Courier New Greek;}{\f200\fmodern\fcharset162\fprq1 Courier New Tur;}{\f201\fmodern\fcharset186\fprq1 Courier New Baltic;} -{\f208\froman\fcharset238\fprq2 TIMES CE;}{\f209\froman\fcharset204\fprq2 TIMES Cyr;}{\f211\froman\fcharset161\fprq2 TIMES Greek;}{\f212\froman\fcharset162\fprq2 TIMES Tur;}{\f213\froman\fcharset186\fprq2 TIMES Baltic;} -{\f214\fswiss\fcharset238\fprq2 HELVETICA CE;}{\f215\fswiss\fcharset204\fprq2 HELVETICA Cyr;}{\f217\fswiss\fcharset161\fprq2 HELVETICA Greek;}{\f218\fswiss\fcharset162\fprq2 HELVETICA Tur;}{\f219\fswiss\fcharset186\fprq2 HELVETICA Baltic;} -{\f274\fswiss\fcharset238\fprq2 Tahoma CE;}{\f275\fswiss\fcharset204\fprq2 Tahoma Cyr;}{\f277\fswiss\fcharset161\fprq2 Tahoma Greek;}{\f278\fswiss\fcharset162\fprq2 Tahoma Tur;}{\f279\fswiss\fcharset186\fprq2 Tahoma Baltic;} -{\f310\fmodern\fcharset238\fprq1 Lucida Console CE;}{\f311\fmodern\fcharset204\fprq1 Lucida Console Cyr;}{\f313\fmodern\fcharset161\fprq1 Lucida Console Greek;}{\f314\fmodern\fcharset162\fprq1 Lucida Console Tur;} -{\f316\fswiss\fcharset238\fprq2 Lucida Sans Unicode CE;}{\f317\fswiss\fcharset204\fprq2 Lucida Sans Unicode Cyr;}{\f319\fswiss\fcharset161\fprq2 Lucida Sans Unicode Greek;}{\f320\fswiss\fcharset162\fprq2 Lucida Sans Unicode Tur;} -{\f328\fscript\fcharset238\fprq2 CommercialScript BT CE;}{\f331\fscript\fcharset161\fprq2 CommercialScript BT Greek;}{\f332\fscript\fcharset162\fprq2 CommercialScript BT Tur;}{\f346\fswiss\fcharset238\fprq2 Futura BdCn BT CE;} -{\f349\fswiss\fcharset161\fprq2 Futura BdCn BT Greek;}{\f350\fswiss\fcharset162\fprq2 Futura BdCn BT Tur;}{\f352\fswiss\fcharset238\fprq2 Futura MdCn BT CE;}{\f355\fswiss\fcharset161\fprq2 Futura MdCn BT Greek;} -{\f356\fswiss\fcharset162\fprq2 Futura MdCn BT Tur;}{\f358\fswiss\fcharset238\fprq2 Futura XBlkCnIt BT CE;}{\f361\fswiss\fcharset161\fprq2 Futura XBlkCnIt BT Greek;}{\f362\fswiss\fcharset162\fprq2 Futura XBlkCnIt BT Tur;} -{\f364\fswiss\fcharset238\fprq2 Futura XBlkIt BT CE;}{\f367\fswiss\fcharset161\fprq2 Futura XBlkIt BT Greek;}{\f368\fswiss\fcharset162\fprq2 Futura XBlkIt BT Tur;}{\f370\froman\fcharset238\fprq2 Garamond CE;}{\f371\froman\fcharset204\fprq2 Garamond Cyr;} -{\f373\froman\fcharset161\fprq2 Garamond Greek;}{\f374\froman\fcharset162\fprq2 Garamond Tur;}{\f375\froman\fcharset186\fprq2 Garamond Baltic;}{\f394\froman\fcharset238\fprq2 PosterBodoni BT CE;}{\f397\froman\fcharset161\fprq2 PosterBodoni BT Greek;} -{\f398\froman\fcharset162\fprq2 PosterBodoni BT Tur;}{\f400\froman\fcharset238\fprq2 PosterBodoni It BT CE;}{\f403\froman\fcharset161\fprq2 PosterBodoni It BT Greek;}{\f404\froman\fcharset162\fprq2 PosterBodoni It BT Tur;} -{\f412\froman\fcharset238\fprq2 Schadow BlkCn BT CE;}{\f415\froman\fcharset161\fprq2 Schadow BlkCn BT Greek;}{\f416\froman\fcharset162\fprq2 Schadow BlkCn BT Tur;}{\f418\fscript\fcharset238\fprq2 Staccato222 BT CE;} -{\f421\fscript\fcharset161\fprq2 Staccato222 BT Greek;}{\f422\fscript\fcharset162\fprq2 Staccato222 BT Tur;}{\f424\fscript\fcharset238\fprq2 Staccato555 BT CE;}{\f427\fscript\fcharset161\fprq2 Staccato555 BT Greek;} -{\f428\fscript\fcharset162\fprq2 Staccato555 BT Tur;}{\f448\froman\fcharset238\fprq2 Cooper BlkIt BT CE;}{\f451\froman\fcharset161\fprq2 Cooper BlkIt BT Greek;}{\f452\froman\fcharset162\fprq2 Cooper BlkIt BT Tur;} -{\f502\fswiss\fcharset238\fprq2 Arial Narrow CE;}{\f503\fswiss\fcharset204\fprq2 Arial Narrow Cyr;}{\f505\fswiss\fcharset161\fprq2 Arial Narrow Greek;}{\f506\fswiss\fcharset162\fprq2 Arial Narrow Tur;}{\f507\fswiss\fcharset186\fprq2 Arial Narrow Baltic;} -{\f508\fswiss\fcharset238\fprq2 Arial Black CE;}{\f509\fswiss\fcharset204\fprq2 Arial Black Cyr;}{\f511\fswiss\fcharset161\fprq2 Arial Black Greek;}{\f512\fswiss\fcharset162\fprq2 Arial Black Tur;}{\f513\fswiss\fcharset186\fprq2 Arial Black Baltic;} -{\f526\froman\fcharset238\fprq2 Bookman Old Style CE;}{\f527\froman\fcharset204\fprq2 Bookman Old Style Cyr;}{\f529\froman\fcharset161\fprq2 Bookman Old Style Greek;}{\f530\froman\fcharset162\fprq2 Bookman Old Style Tur;} -{\f531\froman\fcharset186\fprq2 Bookman Old Style Baltic;}{\f550\fswiss\fcharset238\fprq2 Haettenschweiler CE;}{\f551\fswiss\fcharset204\fprq2 Haettenschweiler Cyr;}{\f553\fswiss\fcharset161\fprq2 Haettenschweiler Greek;} -{\f554\fswiss\fcharset162\fprq2 Haettenschweiler Tur;}{\f555\fswiss\fcharset186\fprq2 Haettenschweiler Baltic;}{\f589\fdecor\fcharset161\fprq2 Desdemona Greek;}{\f766\froman\fcharset238\fprq2 GoudyOlSt BT CE;} -{\f769\froman\fcharset161\fprq2 GoudyOlSt BT Greek;}{\f770\froman\fcharset162\fprq2 GoudyOlSt BT Tur;}{\f772\fswiss\fcharset238\fprq2 Futura Md BT CE;}{\f775\fswiss\fcharset161\fprq2 Futura Md BT Greek;}{\f776\fswiss\fcharset162\fprq2 Futura Md BT Tur;} -{\f778\fswiss\fcharset238\fprq2 Futura XBlk BT CE;}{\f781\fswiss\fcharset161\fprq2 Futura XBlk BT Greek;}{\f782\fswiss\fcharset162\fprq2 Futura XBlk BT Tur;}{\f784\fswiss\fcharset238\fprq2 Futura XBlkCn BT CE;} -{\f787\fswiss\fcharset161\fprq2 Futura XBlkCn BT Greek;}{\f788\fswiss\fcharset162\fprq2 Futura XBlkCn BT Tur;}{\f790\froman\fcharset238\fprq2 BauerBodni BT CE;}{\f793\froman\fcharset161\fprq2 BauerBodni BT Greek;} -{\f794\froman\fcharset162\fprq2 BauerBodni BT Tur;}{\f796\fscript\fcharset238\fprq2 ParkAvenue BT CE;}{\f799\fscript\fcharset161\fprq2 ParkAvenue BT Greek;}{\f800\fscript\fcharset162\fprq2 ParkAvenue BT Tur;} -{\f802\fdecor\fcharset238\fprq2 CaslonOpnface BT CE;}{\f805\fdecor\fcharset161\fprq2 CaslonOpnface BT Greek;}{\f806\fdecor\fcharset162\fprq2 CaslonOpnface BT Tur;}{\f808\fscript\fcharset238\fprq2 DomCasual BT CE;} -{\f811\fscript\fcharset161\fprq2 DomCasual BT Greek;}{\f812\fscript\fcharset162\fprq2 DomCasual BT Tur;}{\f814\fdecor\fcharset238\fprq2 Exotc350 Lt BT CE;}{\f817\fdecor\fcharset161\fprq2 Exotc350 Lt BT Greek;} -{\f818\fdecor\fcharset162\fprq2 Exotc350 Lt BT Tur;}{\f820\fscript\fcharset238\fprq2 Balloon XBd BT CE;}{\f823\fscript\fcharset161\fprq2 Balloon XBd BT Greek;}{\f824\fscript\fcharset162\fprq2 Balloon XBd BT Tur;} -{\f826\fdecor\fcharset238\fprq2 HandelGothic BT CE;}{\f829\fdecor\fcharset161\fprq2 HandelGothic BT Greek;}{\f830\fdecor\fcharset162\fprq2 HandelGothic BT Tur;}{\f832\fscript\fcharset238\fprq2 Lydian BT CE;} -{\f835\fscript\fcharset161\fprq2 Lydian BT Greek;}{\f836\fscript\fcharset162\fprq2 Lydian BT Tur;}{\f838\fscript\fcharset238\fprq2 Brush455 BT CE;}{\f841\fscript\fcharset161\fprq2 Brush455 BT Greek;}{\f842\fscript\fcharset162\fprq2 Brush455 BT Tur;} -{\f844\fscript\fcharset238\fprq2 Amazone BT CE;}{\f847\fscript\fcharset161\fprq2 Amazone BT Greek;}{\f848\fscript\fcharset162\fprq2 Amazone BT Tur;}{\f850\fscript\fcharset238\fprq2 Freehand591 BT CE;}{\f853\fscript\fcharset161\fprq2 Freehand591 BT Greek;} -{\f854\fscript\fcharset162\fprq2 Freehand591 BT Tur;}{\f856\fscript\fcharset238\fprq2 Freehand575 BT CE;}{\f859\fscript\fcharset161\fprq2 Freehand575 BT Greek;}{\f860\fscript\fcharset162\fprq2 Freehand575 BT Tur;} -{\f862\fdecor\fcharset238\fprq2 BernhardFashion BT CE;}{\f865\fdecor\fcharset161\fprq2 BernhardFashion BT Greek;}{\f866\fdecor\fcharset162\fprq2 BernhardFashion BT Tur;}{\f868\fdecor\fcharset238\fprq2 Parisian BT CE;} -{\f871\fdecor\fcharset161\fprq2 Parisian BT Greek;}{\f872\fdecor\fcharset162\fprq2 Parisian BT Tur;}{\f874\fscript\fcharset238\fprq2 Calligraph421 BT CE;}{\f877\fscript\fcharset161\fprq2 Calligraph421 BT Greek;} -{\f878\fscript\fcharset162\fprq2 Calligraph421 BT Tur;}{\f880\fdecor\fcharset238\fprq2 AdLib BT CE;}{\f883\fdecor\fcharset161\fprq2 AdLib BT Greek;}{\f884\fdecor\fcharset162\fprq2 AdLib BT Tur;}{\f886\fscript\fcharset238\fprq2 OzHandicraft BT CE;} -{\f889\fscript\fcharset161\fprq2 OzHandicraft BT Greek;}{\f890\fscript\fcharset162\fprq2 OzHandicraft BT Tur;}{\f892\fscript\fcharset238\fprq2 MisterEarl BT CE;}{\f895\fscript\fcharset161\fprq2 MisterEarl BT Greek;} -{\f896\fscript\fcharset162\fprq2 MisterEarl BT Tur;}{\f898\fswiss\fcharset238\fprq2 Swiss 721 SWA CE;}{\f901\fswiss\fcharset161\fprq2 Swiss 721 SWA Greek;}{\f902\fswiss\fcharset162\fprq2 Swiss 721 SWA Tur;} -{\f922\fscript\fcharset238\fprq2 Comic Sans MS CE;}{\f923\fscript\fcharset204\fprq2 Comic Sans MS Cyr;}{\f925\fscript\fcharset161\fprq2 Comic Sans MS Greek;}{\f926\fscript\fcharset162\fprq2 Comic Sans MS Tur;} -{\f927\fscript\fcharset186\fprq2 Comic Sans MS Baltic;}{\f970\fswiss\fcharset238\fprq2 Impact CE;}{\f971\fswiss\fcharset204\fprq2 Impact Cyr;}{\f973\fswiss\fcharset161\fprq2 Impact Greek;}{\f974\fswiss\fcharset162\fprq2 Impact Tur;} -{\f975\fswiss\fcharset186\fprq2 Impact Baltic;}{\f1024\fswiss\fcharset238\fprq2 Verdana CE;}{\f1025\fswiss\fcharset204\fprq2 Verdana Cyr;}{\f1027\fswiss\fcharset161\fprq2 Verdana Greek;}{\f1028\fswiss\fcharset162\fprq2 Verdana Tur;} -{\f1029\fswiss\fcharset186\fprq2 Verdana Baltic;}{\f1054\fswiss\fcharset238\fprq2 Trebuchet MS CE;}{\f1058\fswiss\fcharset162\fprq2 Trebuchet MS Tur;}{\f1108\froman\fcharset238\fprq2 Aldine721 BT CE;}{\f1111\froman\fcharset161\fprq2 Aldine721 BT Greek;} -{\f1112\froman\fcharset162\fprq2 Aldine721 BT Tur;}{\f1114\fscript\fcharset238\fprq2 BrushScript BT CE;}{\f1117\fscript\fcharset161\fprq2 BrushScript BT Greek;}{\f1118\fscript\fcharset162\fprq2 BrushScript BT Tur;} -{\f1120\froman\fcharset238\fprq2 ClassGarmnd BT CE;}{\f1123\froman\fcharset161\fprq2 ClassGarmnd BT Greek;}{\f1124\froman\fcharset162\fprq2 ClassGarmnd BT Tur;}{\f1126\fdecor\fcharset238\fprq2 UnivrstyRoman Bd BT CE;} -{\f1129\fdecor\fcharset161\fprq2 UnivrstyRoman Bd BT Greek;}{\f1130\fdecor\fcharset162\fprq2 UnivrstyRoman Bd BT Tur;}{\f1132\froman\fcharset238\fprq2 Windsor LtCn BT CE;}{\f1135\froman\fcharset161\fprq2 Windsor LtCn BT Greek;} -{\f1136\froman\fcharset162\fprq2 Windsor LtCn BT Tur;}{\f1138\froman\fcharset238\fprq2 Cooper Md BT CE;}{\f1141\froman\fcharset161\fprq2 Cooper Md BT Greek;}{\f1142\froman\fcharset162\fprq2 Cooper Md BT Tur;} -{\f1144\froman\fcharset238\fprq2 ElegaGarmnd BT CE;}{\f1147\froman\fcharset161\fprq2 ElegaGarmnd BT Greek;}{\f1148\froman\fcharset162\fprq2 ElegaGarmnd BT Tur;}{\f1150\fscript\fcharset238\fprq2 Kaufmann Bd BT CE;} -{\f1153\fscript\fcharset161\fprq2 Kaufmann Bd BT Greek;}{\f1154\fscript\fcharset162\fprq2 Kaufmann Bd BT Tur;}{\f1156\fswiss\fcharset238\fprq2 VAGRounded BT CE;}{\f1159\fswiss\fcharset161\fprq2 VAGRounded BT Greek;} -{\f1160\fswiss\fcharset162\fprq2 VAGRounded BT Tur;}{\f1162\fscript\fcharset238\fprq2 English157 BT CE;}{\f1165\fscript\fcharset161\fprq2 English157 BT Greek;}{\f1166\fscript\fcharset162\fprq2 English157 BT Tur;} -{\f1168\fscript\fcharset238\fprq2 MurrayHill Bd BT CE;}{\f1171\fscript\fcharset161\fprq2 MurrayHill Bd BT Greek;}{\f1172\fscript\fcharset162\fprq2 MurrayHill Bd BT Tur;}{\f1174\fscript\fcharset238\fprq2 Cataneo BT CE;} -{\f1177\fscript\fcharset161\fprq2 Cataneo BT Greek;}{\f1178\fscript\fcharset162\fprq2 Cataneo BT Tur;}{\f1180\froman\fcharset238\fprq2 DellaRobbia BT CE;}{\f1183\froman\fcharset161\fprq2 DellaRobbia BT Greek;} -{\f1184\froman\fcharset162\fprq2 DellaRobbia BT Tur;}{\f1186\fscript\fcharset238\fprq2 Formal436 BT CE;}{\f1189\fscript\fcharset161\fprq2 Formal436 BT Greek;}{\f1190\fscript\fcharset162\fprq2 Formal436 BT Tur;} -{\f1192\fdecor\fcharset238\fprq2 Tango BT CE;}{\f1195\fdecor\fcharset161\fprq2 Tango BT Greek;}{\f1196\fdecor\fcharset162\fprq2 Tango BT Tur;}{\f1198\fdecor\fcharset238\fprq2 OldDreadfulNo7 BT CE;}{\f1201\fdecor\fcharset161\fprq2 OldDreadfulNo7 BT Greek;} -{\f1202\fdecor\fcharset162\fprq2 OldDreadfulNo7 BT Tur;}{\f1270\fswiss\fcharset238\fprq2 Tw Cen MT CE;}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0; -\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\stylesheet{ -\sa120\widctlpar\adjustright \f1\fs22\cgrid \snext0 Normal;}{\s1\sb240\sa60\keepn\widctlpar\adjustright \f1\fs36\cf9\kerning28 \sbasedon0 \snext0 heading 1;}{\s2\sb240\sa60\keepn\widctlpar\adjustright \b\i\f1 \sbasedon0 \snext0 heading 2;}{ -\s3\sa120\keepn\widctlpar\adjustright \b\f1\fs22\cgrid \sbasedon0 \snext0 heading 3;}{\s4\sa120\keepn\widctlpar\adjustright \f1\fs144\cgrid \sbasedon0 \snext0 heading 4;}{\s5\li720\sa120\keepn\widctlpar\outlinelevel4\adjustright \b\f2\fs22\cgrid -\sbasedon0 \snext0 heading 5;}{\s6\sa120\keepn\widctlpar\outlinelevel5\adjustright \b\i\f1\fs144\cgrid \sbasedon0 \snext0 heading 6;}{\*\cs10 \additive Default Paragraph Font;}{\s15\sa120\widctlpar\adjustright \f2\fs18 \sbasedon0 \snext15 footnote text;}{ -\s16\fi-720\li720\sa120\nowidctlpar\adjustright \f1\fs18 \sbasedon0 \snext16 Key;}{\s17\fi-1440\li1440\sa120\widctlpar\tx1440\adjustright \f1\fs18 \sbasedon0 \snext17 Legend;}{\s18\sa120\widctlpar\adjustright \b\f2\fs16 \sbasedon0 \snext18 Typed;}{ -\s19\li720\sa120\widctlpar\adjustright \f2\fs22\cgrid \sbasedon0 \snext19 Body Text 2;}{\s20\widctlpar\adjustright \f2\fs20\cgrid \sbasedon0 \snext20 Plain Text;}{\*\cs21 \additive \ul\cf2 \sbasedon10 Hyperlink;}{\s22\sb120\widctlpar\adjustright -\b\i\f1\cgrid \sbasedon0 \snext0 \sautoupd toc 1;}{\s23\li220\sb120\widctlpar\adjustright \b\f1\fs22\cgrid \sbasedon0 \snext0 \sautoupd toc 2;}{\s24\li440\widctlpar\adjustright \f1\fs20\cgrid \sbasedon0 \snext0 \sautoupd toc 3;}{ -\s25\li660\widctlpar\adjustright \f1\fs20\cgrid \sbasedon0 \snext0 \sautoupd toc 4;}{\s26\li880\widctlpar\adjustright \f1\fs20\cgrid \sbasedon0 \snext0 \sautoupd toc 5;}{\s27\li1100\widctlpar\adjustright \f1\fs20\cgrid \sbasedon0 \snext0 \sautoupd toc 6;} -{\s28\li1320\widctlpar\adjustright \f1\fs20\cgrid \sbasedon0 \snext0 \sautoupd toc 7;}{\s29\li1540\widctlpar\adjustright \f1\fs20\cgrid \sbasedon0 \snext0 \sautoupd toc 8;}{\s30\li1760\widctlpar\adjustright \f1\fs20\cgrid \sbasedon0 \snext0 \sautoupd -toc 9;}{\s31\sa120\widctlpar\tqc\tx4320\tqr\tx8640\adjustright \f1\fs22\cgrid \sbasedon0 \snext31 header;}{\s32\sa120\widctlpar\tqc\tx4320\tqr\tx8640\adjustright \f1\fs22\cgrid \sbasedon0 \snext32 footer;}{\*\cs33 \additive \sbasedon10 page number;}{ -\s34\widctlpar\adjustright \f2\fs16\cgrid \sbasedon0 \snext34 Body Text;}{\*\cs35 \additive \super \sbasedon10 footnote reference;}{\s36\qc\keepn\widctlpar\adjustright \b\f1\fs18\cgrid \sbasedon0 \snext36 PDUfieldbits;}{ -\s37\qc\sb120\keepn\widctlpar\adjustright \b\f1\fs18\cgrid \sbasedon38 \snext37 PDUheader;}{\s38\qc\sa240\sl360\slmult0\keepn\widctlpar\adjustright \b\f1\cgrid \sbasedon0 \snext38 tablelabel;}{\s39\qc\widctlpar\adjustright \f1\fs18\cgrid -\sbasedon40 \snext39 PDUrecsize;}{\s40\widctlpar\adjustright \f1\fs18\cgrid \sbasedon0 \snext40 PDUsizes;}{\s41\sl-120\slmult1\widctlpar\adjustright \f1\fs18\cgrid \sbasedon40 \snext41 PDUext;}}{\*\listtable{\list\listtemplateid1418755918\listsimple -{\listlevel\levelnfc0\leveljc0\levelfollow0\levelstartat1\levelold\levelspace0\levelindent360{\leveltext\'02\'00.;}{\levelnumbers\'01;}\fi-360\li360 }{\listname ;}\listid778111067}{\list\listtemplateid1418755918\listsimple{\listlevel\levelnfc0\leveljc0 -\levelfollow0\levelstartat1\levelold\levelspace0\levelindent360{\leveltext\'02\'00.;}{\levelnumbers\'01;}\fi-360\li360 }{\listname ;}\listid819230066}}{\*\listoverridetable{\listoverride\listid778111067\listoverridecount0\ls1} -{\listoverride\listid819230066\listoverridecount0\ls2}}{\info{\title Introduction}{\author Riley Rainey}{\operator Riley Rainey}{\creatim\yr1998\mo12\dy23\hr11\min44}{\revtim\yr1998\mo12\dy30\hr14\min37}{\version4}{\edmins10}{\nofpages43}{\nofwords6561} -{\nofchars-32766}{\*\company Web Simulations Inc.}{\nofcharsws0}{\vern89}}\widowctrl\ftnbj\aenddoc\hyphcaps0\formshade\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot \fet0\sectd \linex0\endnhere\titlepg\pgbrdropt32\sectdefaultcl {\footer \pard\plain -\s32\sa120\widctlpar\tqc\tx4320\tqr\tx8640\adjustright \f1\fs22\cgrid {ACM for UNIX and Windows\tab }{\field{\*\fldinst {\cs33 PAGE }}{\fldrslt {\cs33\lang1024 8}}}{\cs33 \tab }{\field{\*\fldinst {\cs33 DATE \\@ "MM/dd/yy" }}{\fldrslt {\cs33\lang1024 12 -/30/98}}}{ -\par }}{\headerf \pard\plain \s31\qr\sa120\widctlpar\tqc\tx4320\tqr\tx8640\adjustright \f1\fs22\cgrid { -\par }}{\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang{\pntxta )}} -{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl8 -\pnlcltr\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}\pard\plain \s22\sb120\widctlpar\adjustright \b\i\f1\cgrid {\lang1024 -{\shp{\*\shpinst\shpleft4560\shptop1095\shpright8190\shpbottom12060\shpfhdr0\shpbxcolumn\shpbypage\shpwr3\shpwrk0\shpfblwtxt0\shpz0\shplid1026{\sp{\sn shapeType}{\sv 75}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn pib}{\sv -{\pict\picscalex32\picscaley32\piccropl0\piccropr0\piccropt0\piccropb0\picw20003\pich60431\picwgoal11340\pichgoal34260\wmetafile8\bliptag-1553027465{\*\blipuid 5113ca6f3ff86420dc4c5130b3b4e401} -0100090000039e06000007003a00000000001400000026060f001e00ffffffff040014000000576f72640e004d6963726f736f667420576f7264050000000b02 -00000000050000000c02ec08f4021c000000fb021000070000000000bc02000000000000000253797374656d0000080000000c008a0100000a00060000000c00 -8a0100000a00040000002d010000050000000201010000001c000000fb02d6ff0000000000009001000000000440001254696d6573204e657720526f6d616e00 -2a82ed77c067ef771d060a0d00000a00040000002d01010005000000090200000000050000000201010000001000000026060f001600ffffffff000023010000 -d2030000d2010000ed0800000800000026060f000600ffffffff000008000000fa0205000100000000000000040000002d01020007000000fc02010000000000 -0000040000002d0103000500000007010400000007000000fc020000c0c0c0000000040000002d0104000c000000240304002301d203d201d203d201ed032301 -ed030c000000240304002301ed03d201ed03d20108042301080407000000fc020000c1c1c1000000040000002d01050004000000f00104000c00000024030400 -23010804d2010804d2012404230124040c0000002403040023012404d2012404d2013f0423013f0407000000fc020000c2c2c2000000040000002d0104000400 -0000f00105000c0000002403040023013f04d2013f04d2015a0423015a040c0000002403040023015a04d2015a04d20175042301750407000000fc020000c3c3 -c3000000040000002d01050004000000f00104000c0000002403040023017504d2017504d20191042301910407000000fc020000c4c4c4000000040000002d01 -040004000000f00105000c0000002403040023019104d2019104d201ac042301ac0407000000fc020000c5c5c5000000040000002d01050004000000f0010400 -0c000000240304002301ac04d201ac04d201c7042301c70407000000fc020000c6c6c6000000040000002d01040004000000f00105000c000000240304002301 -c704d201c704d201e2042301e20407000000fc020000c8c8c8000000040000002d01050004000000f00104000c000000240304002301e204d201e204d201fe04 -2301fe0407000000fc020000c9c9c9000000040000002d01040004000000f00105000c000000240304002301fe04d201fe04d20119052301190507000000fc02 -0000cacaca000000040000002d01050004000000f00104000c0000002403040023011905d2011905d20134052301340507000000fc020000cccccc0000000400 -00002d01040004000000f00105000c0000002403040023013405d2013405d2014f0523014f0507000000fc020000cecece000000040000002d01050004000000 -f00104000c0000002403040023014f05d2014f05d2016a0523016a0507000000fc020000cfcfcf000000040000002d01040004000000f00105000c0000002403 -040023016a05d2016a05d20186052301860507000000fc020000d1d1d1000000040000002d01050004000000f00104000c0000002403040023018605d2018605 -d201a1052301a10507000000fc020000d3d3d3000000040000002d01040004000000f00105000c000000240304002301a105d201a105d201bc052301bc050700 -0000fc020000d5d5d5000000040000002d01050004000000f00104000c000000240304002301bc05d201bc05d201d7052301d70507000000fc020000d8d8d800 -0000040000002d01040004000000f00105000c000000240304002301d705d201d705d201f3052301f30507000000fc020000dadada000000040000002d010500 -04000000f00104000c000000240304002301f305d201f305d2010e0623010e0607000000fc020000dcdcdc000000040000002d01040004000000f00105000c00 -00002403040023010e06d2010e06d20129062301290607000000fc020000dedede000000040000002d01050004000000f00104000c0000002403040023012906 -d2012906d20144062301440607000000fc020000e0e0e0000000040000002d01040004000000f00105000c0000002403040023014406d2014406d2015f062301 -5f0607000000fc020000e2e2e2000000040000002d01050004000000f00104000c0000002403040023015f06d2015f06d2017b0623017b0607000000fc020000 -e5e5e5000000040000002d01040004000000f00105000c0000002403040023017b06d2017b06d20196062301960607000000fc020000e7e7e700000004000000 -2d01050004000000f00104000c0000002403040023019606d2019606d201b1062301b10607000000fc020000e9e9e9000000040000002d01040004000000f001 -05000c000000240304002301b106d201b106d201cc062301cc0607000000fc020000eaeaea000000040000002d01050004000000f00104000c00000024030400 -2301cc06d201cc06d201e8062301e80607000000fc020000ededed000000040000002d01040004000000f00105000c000000240304002301e806d201e806d201 -03072301030707000000fc020000eeeeee000000040000002d01050004000000f00104000c0000002403040023010307d2010307d2011e0723011e0707000000 -fc020000f0f0f0000000040000002d01040004000000f00105000c0000002403040023011e07d2011e07d20139072301390707000000fc020000f2f2f2000000 -040000002d01050004000000f00104000c0000002403040023013907d2013907d20155072301550707000000fc020000f3f3f3000000040000002d0104000400 -0000f00105000c0000002403040023015507d2015507d20170072301700707000000fc020000f5f5f5000000040000002d01050004000000f00104000c000000 -2403040023017007d2017007d2018b0723018b0707000000fc020000f6f6f6000000040000002d01040004000000f00105000c0000002403040023018b07d201 -8b07d201a6072301a60707000000fc020000f7f7f7000000040000002d01050004000000f00104000c000000240304002301a607d201a607d201c1072301c107 -07000000fc020000f8f8f8000000040000002d01040004000000f00105000c000000240304002301c107d201c107d201dd072301dd0707000000fc020000f9f9 -f9000000040000002d01050004000000f00104000c000000240304002301dd07d201dd07d201f8072301f80707000000fc020000fafafa000000040000002d01 -040004000000f00105000c000000240304002301f807d201f807d20113082301130807000000fc020000fbfbfb000000040000002d01050004000000f0010400 -0c0000002403040023011308d2011308d2012e0823012e0807000000fc020000fcfcfc000000040000002d01040004000000f00105000c000000240304002301 -2e08d2012e08d2014a0823014a080c0000002403040023014a08d2014a08d20165082301650807000000fc020000fdfdfd000000040000002d01050004000000 -f00104000c0000002403040023016508d2016508d2018008230180080c0000002403040023018008d2018008d2019b0823019b0807000000fc020000fefefe00 -0000040000002d01040004000000f00105000c0000002403040023019b08d2019b08d201b7082301b7080c000000240304002301b708d201b708d201d2082301 -d2080c000000240304002301d208d201d208d201ed082301ed08040000002d01030004000000f001040008000000fa0200000000000000000000040000002d01 -040007000000fc020000ffffff000000040000002d010500050000000701010000000800000026060f000600ffffffff01000800000026060f000600ffffffff -01001000000026060f001600ffffffff00007701000026000000f20200003e040000040000002d01020007000000fc020000808080000000040000002d010600 -3a00000024031b007701260087013f0093015b009a017d00a001b200a3010701a9013c01d201d201e5010402e5011a02e802fb02e802a002f102a302f1026503 -f4011a03f70143037402c3035e02f203f401eb03db01c003d201e803bc01eb03a301eb039a01c3038d01270477013d0477012600040000002d01040004000000 -2d01050004000000f00106000800000026060f000600ffffffff01001000000026060f001600ffffffff000078010000010000007d0100003f00000008000000 -fa0200000300000080808000040000002d010600040000002d01030008000000250302007a0103007a013c00040000002d01040004000000f001060004000000 -2d0105000800000026060f000600ffffffff01001000000026060f001600ffffffff000000000000260000007b0100003e040000040000002d01020007000000 -fc020000808080000000040000002d0106003a00000024031b007a0126006b013f005e015b0058017d005201b2004f01070148013c012001d2010d0104020d01 -1a020a00fb020a00a0020000a30200006503fd001a03fa0043037d00c3039300f203fd00eb031601c0032001e8033601eb034f01eb035801c303640127047a013d047a012600040000002d010400040000002d01050004000000f00106000800000026060f000600ffffffff0100040000002d010000030000000000} -}}{\sp{\sn pictureId}{\sv 65536}}{\sp{\sn pictureGray}{\sv 0}}{\sp{\sn pictureBiLevel}{\sv 0}}{\sp{\sn pictureActive}{\sv 0}}{\sp{\sn fillColor}{\sv 268435473}}{\sp{\sn fFilled}{\sv 0}}{\sp{\sn fHitTestFill}{\sv 1}}{\sp{\sn fillShape}{\sv 1}} -{\sp{\sn fillUseRect}{\sv 0}}{\sp{\sn fNoFillHitTest}{\sv 0}}{\sp{\sn fLine}{\sv 0}}{\shptxt \pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid {\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid {\object\objemb\objw3631\objh10966 -{\*\objclass Word.Picture.8}{\*\objdata 01050000020000000f000000576f72642e506963747572652e38000000000000000000005c0000 -d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff0900060000000000000000000000010000000100000000000000001000000200000001000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffdffffff0c000000feffffff0d00000005000000060000000700000008000000090000000a0000000b000000feffffff1c0000000e0000000f00000010000000110000001200000013000000feffffff15000000160000001700000018000000190000001a0000001b000000fefffffffeffffff1e00 -00001f0000002000000021000000220000002300000024000000feffffff260000002700000028000000290000002a0000002b0000002c000000feffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffff040000000709020000000000c00000000000004600000000000000000000000020c6 -8f393434be0103000000800e00000000000001004f006c00650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000201ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000 -000000000000000000000000140000000000000031005400610062006c006500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0002010100000003000000ffffffff0000000000000000000000000000000000000000000000000000 -00000000000000000000040000000010000000000000010043006f006d0070004f0062006a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012000201ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 -000000000000000000000000010000006800000000000000feffffff02000000fefffffffeffffff05000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f000000100000001100000012000000130000001400000015000000160000001700000018000000190000001a00 -00001b0000001c0000001d0000001e0000001f000000200000002100000022000000230000002400000025000000260000002700000028000000290000002a0000002b0000002c0000002d0000002e0000002f00000030000000310000003200000033000000340000003500000036000000370000003800000039000000 -feffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0100000200000000000000000000000000000000e8451600000000000000000000000000000000000000000000000000000000000000000000000000000000000100feff030a0000ffffffff0709020000000000c0000000000000461700 -00004d6963726f736f667420576f72642050696374757265000a0000004d53576f7264446f63000f000000576f72642e506963747572652e3800f439b27100000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000ffffffff030000000400000001000000ffffffff0000000000000000031900008d4b00003c0d00000100090000039e06000007003a00000000001400000026060f001e00ffffffff040014000000576f72640e004d6963726f73 -6f667420576f7264050000000b0200000000050000000c02ec08f4021c000000fb021000070000000000bc02000000000000000253797374656d0000080000000c008a0100000a00060000000c008a0100000a00040000002d010000050000000201010000001c000000fb02d6ff00000000000090010000000004400012 -54696d6573204e657720526f6d616e002a82ed77c067ef771d060a0d00000a00040000002d01010012000f000a0001005b000f00020000000000000024000040f1ff02002400000006004e006f0072006d0061006c0000000200000004006d4809040000000000000000000000000000000000003c004140f2ffa1003c00 -00001600440065006600610075006c0074002000500061007200610067007200610070006800200046006f006e00740000000000000000000000000000000000050000000700000c00000800ffffffff010000000420ffff0100000000000000000005000000000000000000000400000504000003000000000400000504 -0000040000000004000005040000050000000f0000f038000000000006f01800000008040000020000000700000001000000010000000800000040001ef110000000ffff00000000ff0080808000f7000010000f0002f008040000100008f00800000005000000070400000f0003f0a60300000f0004f028000000010009 -f010000000940cce00ff000000ff0000000100000002000af00800000000040000050000000f0004f04e00000012000af00800000007040000000a000053000bf01e0000008001070000008101c0c0c0008c0164000000bf0114001400ff0100000800000010f00400000000000000000011f0040000000a0000000f0004 -f05a01000002000af00800000004040000000a0000b3000bf02a0100000400000000004201170700004301a113000044010400000045c16c00000046c1760000007f0101000100800100000000810180808000bf0110001000ff01100018001b001b00f0ff000000004b0078008700ff00a500a401c300a302d2003804f0 -003705b30107080d02f7080d026009ea06980dea06e50b1707f40b1707960f58022e0e6702f10ebf0458115604391258021b12e0014911b3010c124a011b12d2001b12a5005811690038130000a1130000000038003c000200004000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac01 -0000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac01600080000010f00400000003000000000011f0040000001f0000000f0004f04e00000042010af00800000005040000400a000053000b -f01e0000004401040000007f0100000100bf0100001000c00180808000ff0118001800000010f00400000002000000000011f004000000050000000f0004f06001000002000af00800000006040000400a0000c3000bf0300100000400000000004201170700004301a113000044010400000045c16c00000046c1760000 -007f0101000100800100000000810180808000bf0110001000ff01100018008803000000001b001b00f0ff000000004b0078008700ff00a500a401c300a302d2003804f0003705b30107080d02f7080d026009ea06980dea06e50b1707f40b1707960f58022e0e6702f10ebf0458115604391258021b12e0014911b3010c -124a011b12d2001b12a5005811690038130000a1130000000038003c000200004000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000 -ac010000ac010000ac010000ac01600080000010f00400000001000000000011f004000000080000000f0004f04200000012000af00800000001040000000e000053000bf01e000000bf0100001000cb0100000000ff01000008000403090000003f0301000100000011f004000000010000000000000001000000020000 -000300000005000000070400007305000057120000bb080000d52a00007400000000000604000000000000b4000000170700005514000074000000000005040000170700000f000000170700001d0100007400000000000404000008070000b40000001f0e00005514000074000000000000000000070000000700000000 -00070000000700ff40038001000000000000000000489fd50001000100000000000000000000000000000000000210000000000000000500000070000008004000000300000047169001000002020603050405020304870200000000000000000000000000009f00000000000000540069006d006500730020004e006500 -7700200052006f006d0061006e00000035169001020005050102010706020507000000000000001000000000000000000000008000000000530079006d0062006f006c000000332690010000020b0604020202020204870200000000000000000000000000009f0000000000000041007200690061006c00000022000400 -f10888180000d0020000680100000000158a2826188a2826000000000200010000000000000000000000010001000000040003100100000000000000000000000100010000000100000000000000210300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000a506c007b400b4008000723000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000001602ffff120000000000 -000000000000000000000c00520069006c006500790020005200610069006e00650079000c00520069006c006500790020005200610069006e006500790000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003004f0062006a0049006e0066006f00000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000120002010200000006000000ffffffff0000000000000000000000000000000000000000000000000000000000000000000000000300000004000000000000004f0062006a0065006300740050006f006f006c00 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000101ffffffffffffffffffffffff000000000000000000000000000000000000000020c68f393434be0120c68f393434be0100000000000000000000000002004f006c00650050007200650073003000 -30003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000180002010500000008000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000004000000640d00000000000057006f007200640044006f0063007500 -6d0065006e007400000000000000000000000000000000000000000000000000000000000000000000000000000000001a000200ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000001400000000100000000000000500000009020000000005000000 -0201010000001000000026060f001600ffffffff000023010000d2030000d2010000ed0800000800000026060f000600ffffffff000008000000fa0205000100000000000000040000002d01020007000000fc020100000000000000040000002d0103000500000007010400000007000000fc020000c0c0c00000000400 -00002d0104000c000000240304002301d203d201d203d201ed032301ed030c000000240304002301ed03d201ed03d20108042301080407000000fc020000c1c1c1000000040000002d01050004000000f00104000c0000002403040023010804d2010804d2012404230124040c0000002403040023012404d2012404d201 -3f0423013f0407000000fc020000c2c2c2000000040000002d01040004000000f00105000c0000002403040023013f04d2013f04d2015a0423015a040c0000002403040023015a04d2015a04d20175042301750407000000fc020000c3c3c3000000040000002d01050004000000f00104000c0000002403040023017504 -d2017504d20191042301910407000000fc020000c4c4c4000000040000002d01040004000000f00105000c0000002403040023019104d2019104d201ac042301ac0407000000fc020000c5c5c5000000040000002d01050004000000f00104000c000000240304002301ac04d201ac04d201c7042301c70407000000fc02 -0000c6c6c6000000040000002d01040004000000f00105000c000000240304002301c704d201c704d201e2042301e20407000000fc020000c8c8c8000000040000002d01050004000000f00104000c000000240304002301e204d201e204d201fe042301fe0407000000fc020000c9c9c9000000040000002d0104000400 -0000f00105000c000000240304002301fe04d201fe04d20119052301190507000000fc020000cacaca000000040000002d01050004000000f00104000c0000002403040023011905d2011905d20134052301340507000000fc020000cccccc000000040000002d01040004000000f00105000c0000002403040023013405 -d2013405d2014f0523014f0507000000fc020000cecece000000040000002d01050004000000f00104000c0000002403040023014f05d2014f05d2016a0523016a0507000000fc020000cfcfcf000000040000002d01040004000000f00105000c0000002403040023016a05d2016a05d20186052301860507000000fc02 -0000d1d1d1000000040000002d01050004000000f00104000c0000002403040023018605d2018605d201a1052301a10507000000fc020000d3d3d3000000040000002d01040004000000f00105000c000000240304002301a105d201a105d201bc052301bc0507000000fc020000d5d5d5000000040000002d0105000400 -0000f00104000c000000240304002301bc05d201bc05d201d7052301d70507000000fc020000d8d8d8000000040000002d01040004000000f00105000c000000240304002301d705d201d705d201f3052301f30507000000fc020000dadada000000040000002d01050004000000f00104000c000000240304002301f305 -d201f305d2010e0623010e0607000000fc020000dcdcdc000000040000002d01040004000000f00105000c0000002403040023010e06d2010e06d20129062301290607000000fc020000dedede000000040000002d01050004000000f00104000c0000002403040023012906d2012906d20144062301440607000000fc02 -0000e0e0e0000000040000002d01040004000000f00105000c0000002403040023014406d2014406d2015f0623015f0607000000fc020000e2e2e2000000040000002d01050004000000f00104000c0000002403040023015f06d2015f06d2017b0623017b0607000000fc020000e5e5e5000000040000002d0104000400 -0000f00105000c0000002403040023017b06d2017b06d20196062301960607000000fc020000e7e7e7000000040000002d01050004000000f00104000c0000002403040023019606d2019606d201b1062301b10607000000fc020000e9e9e9000000040000002d01040004000000f00105000c000000240304002301b106 -d201b106d201cc062301cc0607000000fc020000eaeaea000000040000002d01050004000000f00104000c000000240304002301cc06d201cc06d201e8062301e80607000000fc020000ededed000000040000002d01040004000000f00105000c000000240304002301e806d201e806d20103072301030707000000fc02 -0000eeeeee000000040000002d01050004000000f00104000c0000002403040023010307d2010307d2011e0723011e0707000000fc020000f0f0f0000000040000002d01040004000000f00105000c0000002403040023011e07d2011e07d20139072301390707000000fc020000f2f2f2000000040000002d0105000400 -0000f00104000c0000002403040023013907d2013907d20155072301550707000000fc020000f3f3f3000000040000002d01040004000000f00105000c0000002403040023015507d2015507d20170072301700707000000fc020000f5f5f5000000040000002d01050004000000f00104000c0000002403040023017007 -d2017007d2018b0723018b0707000000fc020000f6f6f6000000040000002d01040004000000f00105000c0000002403040023018b07d2018b07d201a6072301a60707000000fc020000f7f7f7000000040000002d01050004000000f00104000c000000240304002301a607d201a607d201c1072301c10707000000fc02 -0000f8f8f8000000040000002d01040004000000f00105000c000000240304002301c107d201c107d201dd072301dd0707000000fc020000f9f9f9000000040000002d01050004000000f00104000c000000240304002301dd07d201dd07d201f8072301f80707000000fc020000fafafa000000040000002d0104000400 -0000f00105000c000000240304002301f807d201f807d20113082301130807000000fc020000fbfbfb000000040000002d01050004000000f00104000c0000002403040023011308d2011308d2012e0823012e0807000000fc020000fcfcfc000000040000002d01040004000000f00105000c0000002403040023012e08 -d2012e08d2014a0823014a080c0000002403040023014a08d2014a08d20165082301650807000000fc020000fdfdfd000000040000002d01050004000000f00104000c0000002403040023016508d2016508d2018008230180080c0000002403040023018008d2018008d2019b0823019b0807000000fc020000fefefe00 -0000040000002d01040004000000f00105000c0000002403040023019b08d2019b08d201b7082301b7080c000000240304002301b708d201b708d201d2082301d2080c000000240304002301d208d201d208d201ed082301ed08040000002d01030004000000f001040008000000fa020000000000000000000004000000 -2d01040007000000fc020000ffffff000000040000002d010500050000000701010000000800000026060f000600ffffffff01000800000026060f000600ffffffff01001000000026060f001600ffffffff00007701000026000000f20200003e040000040000002d01020007000000fc02000080808000000004000000 -2d0106003a00000024031b007701260087013f0093015b009a017d00a001b200a3010701a9013c01d201d201e5010402e5011a02e802fb02e802a002f102a302f1026503f4011a03f70143037402c3035e02f203f401eb03db01c003d201e803bc01eb03a301eb039a01c3038d01270477013d0477012600040000002d01 -0400040000002d01050004000000f00106000800000026060f000600ffffffff01001000000026060f001600ffffffff000078010000010000007d0100003f00000008000000fa0200000300000080808000040000002d010600040000002d01030008000000250302007a0103007a013c00040000002d01040004000000 -f0010600040000002d0105000800000026060f000600ffffffff01001000000026060f001600ffffffff000000000000260000007b0100003e040000040000002d01020007000000fc020000808080000000040000002d0106003a00000024031b007a0126006b013f005e015b0058017d005201b2004f01070148013c01 -2001d2010d0104020d011a020a00fb020a00a0020000a30200006503fd001a03fa0043037d00c3039300f203fd00eb031601c0032001e8033601eb034f01eb035801c303640127047a013d047a012600040000002d010400040000002d01050004000000f00106000800000026060f000600ffffffff0100040000002d01 -000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000eca5c1005900090400000012bf000000000000100000000000040000050400000e00626a626af357f357000000000000000000000000000000000000090416001e0c0000913d0100913d01000500000000000000 -000000000000000000000000000000000000000000000000ffff0f000000000000000000ffff0f000000000000000000ffff0f00000000000000000000000000000000005d000000000092000000000000009200000092000000000000009200000000000000920000000000000092000000000000009200000014000000 -0000000000000000c200000000000000c200000000000000c200000000000000c200000000000000c20000000c000000ce0000000c000000c20000000000000002060000b6000000e600000000000000e600000000000000e600000000000000e600000000000000e600000000000000b305000000000000b30500000000 -0000b305000000000000c705000002000000c905000000000000c905000000000000c905000000000000c905000000000000c905000000000000c905000024000000b8060000f4010000ac0800005a000000ed05000015000000000000000000000000000000000000009200000000000000b30500000000000000000000 -000000000000000000000000370500007c000000b305000000000000b305000000000000b305000000000000ed05000000000000c70500000000000092000000000000009200000000000000e6000000000000000000000000000000e600000051040000e600000000000000c705000000000000c705000000000000c705 -000000000000b30500000a0000009200000000000000e6000000000000009200000000000000e600000000000000c70500000000000000000000000000000000000000000000a60000000e000000b40000000e0000009200000000000000920000000000000092000000000000009200000000000000b305000000000000 -c705000000000000c705000000000000c7050000000000000000000000000000c705000000000000920000000000000092000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c705000000000000e60000000000 -0000da0000000c00000060f0f066e2c9bd01c200000000000000c200000000000000bd0500000a000000c70500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080808080d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000404000005040000f80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d036a000000005508016d48000400020004000005040000fd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000001000400000104000002040000030400000404000005040000fefefefefe000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020101051c001fb0c04e20b0c04e21b0df2022b0b31f2390771f2490740425b00000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000500530075006d006d0061007200790049006e00 -66006f0072006d006100740069006f006e000000000000000000000000000000000000000000000000000000280002010700000009000000ffffffff0000000000000000000000000000000000000000000000000000000000000000000000001d0000000010000000000000050044006f00630075006d0065006e007400 -530075006d006d0061007200790049006e0066006f0072006d006100740069006f006e000000000000000000000038000200ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000025000000001000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000feff00000400020000000000 -00000000000000000000000001000000e0859ff2f94f6810ab9108002b27b3d930000000600100001000000001000000880000000200000090000000030000009c00000004000000a800000005000000c000000007000000cc00000008000000dc00000009000000f400000012000000000100000a0000001c0100000c00 -0000280100000d000000340100000e000000400100000f000000480100001000000050010000130000005801000002000000e40400001e00000001000000000073001e00000001000000000073001e0000000d00000052696c6579205261696e657900006f001e0000000100000000696c651e000000070000004e6f726d -616c00611e0000000d00000052696c6579205261696e657900006f001e0000000200000032006c651e000000130000004d6963726f736f667420576f726420382e300000400000000046c323000000004000000000c60ce0e1c9bd01400000000098564be2c9bd0103000000010000000300000000000000030000000000 -000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000feff000004000200000000000000000000000000000000000200000002d5cdd59c2e1b10939708002b2cf9ae4400000005d5cdd59c2e1b10939708002b2cf9ae40010000fc0000000c00 -000001000000680000000f000000700000000500000090000000060000009800000011000000a000000017000000a80000000b000000b000000010000000b800000013000000c000000016000000c80000000d000000d00000000c000000dd00000002000000e40400001e000000150000005765622053696d756c617469 -6f6e7320496e632e0000310003000000010000000300000001000000030000000000000003000000e81008000b000000000000000b000000000000000b000000000000000b000000000000001e1000000100000001000000000c100000020000001e000000060000005469746c6500030000000100000000980000000300 -000000000000200000000100000036000000020000003e00000001000000020000000a0000005f5049445f475549440002000000e4040000410000004e0000007b00340034004300370034004400330030002d0033003500440034002d0031003100440032002d0041003300390044002d00300030004100300032003400 -4200460031003300350041007d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105000005000000 -0d0000004d45544146494c4550494354000319000073b4ffff440d0000080003198d4b0000 -0100090000039e06000007003a00000000001400000026060f001e00ffffffff040014000000576f72640e004d6963726f736f667420576f7264050000000b0200000000050000000c02ec08f4021c000000fb021000070000000000bc02000000000000000253797374656d0000080000000c008a0100000a0006000000 -0c008a0100000a00040000002d010000050000000201010000001c000000fb02d6ff0000000000009001000000000440001254696d6573204e657720526f6d616e002a82ed77c067ef771d060a0d00000a00040000002d01010005000000090200000000050000000201010000001000000026060f001600ffffffff0000 -23010000d2030000d2010000ed0800000800000026060f000600ffffffff000008000000fa0205000100000000000000040000002d01020007000000fc020100000000000000040000002d0103000500000007010400000007000000fc020000c0c0c0000000040000002d0104000c000000240304002301d203d201d203 -d201ed032301ed030c000000240304002301ed03d201ed03d20108042301080407000000fc020000c1c1c1000000040000002d01050004000000f00104000c0000002403040023010804d2010804d2012404230124040c0000002403040023012404d2012404d2013f0423013f0407000000fc020000c2c2c20000000400 -00002d01040004000000f00105000c0000002403040023013f04d2013f04d2015a0423015a040c0000002403040023015a04d2015a04d20175042301750407000000fc020000c3c3c3000000040000002d01050004000000f00104000c0000002403040023017504d2017504d20191042301910407000000fc020000c4c4 -c4000000040000002d01040004000000f00105000c0000002403040023019104d2019104d201ac042301ac0407000000fc020000c5c5c5000000040000002d01050004000000f00104000c000000240304002301ac04d201ac04d201c7042301c70407000000fc020000c6c6c6000000040000002d01040004000000f001 -05000c000000240304002301c704d201c704d201e2042301e20407000000fc020000c8c8c8000000040000002d01050004000000f00104000c000000240304002301e204d201e204d201fe042301fe0407000000fc020000c9c9c9000000040000002d01040004000000f00105000c000000240304002301fe04d201fe04 -d20119052301190507000000fc020000cacaca000000040000002d01050004000000f00104000c0000002403040023011905d2011905d20134052301340507000000fc020000cccccc000000040000002d01040004000000f00105000c0000002403040023013405d2013405d2014f0523014f0507000000fc020000cece -ce000000040000002d01050004000000f00104000c0000002403040023014f05d2014f05d2016a0523016a0507000000fc020000cfcfcf000000040000002d01040004000000f00105000c0000002403040023016a05d2016a05d20186052301860507000000fc020000d1d1d1000000040000002d01050004000000f001 -04000c0000002403040023018605d2018605d201a1052301a10507000000fc020000d3d3d3000000040000002d01040004000000f00105000c000000240304002301a105d201a105d201bc052301bc0507000000fc020000d5d5d5000000040000002d01050004000000f00104000c000000240304002301bc05d201bc05 -d201d7052301d70507000000fc020000d8d8d8000000040000002d01040004000000f00105000c000000240304002301d705d201d705d201f3052301f30507000000fc020000dadada000000040000002d01050004000000f00104000c000000240304002301f305d201f305d2010e0623010e0607000000fc020000dcdc -dc000000040000002d01040004000000f00105000c0000002403040023010e06d2010e06d20129062301290607000000fc020000dedede000000040000002d01050004000000f00104000c0000002403040023012906d2012906d20144062301440607000000fc020000e0e0e0000000040000002d01040004000000f001 -05000c0000002403040023014406d2014406d2015f0623015f0607000000fc020000e2e2e2000000040000002d01050004000000f00104000c0000002403040023015f06d2015f06d2017b0623017b0607000000fc020000e5e5e5000000040000002d01040004000000f00105000c0000002403040023017b06d2017b06 -d20196062301960607000000fc020000e7e7e7000000040000002d01050004000000f00104000c0000002403040023019606d2019606d201b1062301b10607000000fc020000e9e9e9000000040000002d01040004000000f00105000c000000240304002301b106d201b106d201cc062301cc0607000000fc020000eaea -ea000000040000002d01050004000000f00104000c000000240304002301cc06d201cc06d201e8062301e80607000000fc020000ededed000000040000002d01040004000000f00105000c000000240304002301e806d201e806d20103072301030707000000fc020000eeeeee000000040000002d01050004000000f001 -04000c0000002403040023010307d2010307d2011e0723011e0707000000fc020000f0f0f0000000040000002d01040004000000f00105000c0000002403040023011e07d2011e07d20139072301390707000000fc020000f2f2f2000000040000002d01050004000000f00104000c0000002403040023013907d2013907 -d20155072301550707000000fc020000f3f3f3000000040000002d01040004000000f00105000c0000002403040023015507d2015507d20170072301700707000000fc020000f5f5f5000000040000002d01050004000000f00104000c0000002403040023017007d2017007d2018b0723018b0707000000fc020000f6f6 -f6000000040000002d01040004000000f00105000c0000002403040023018b07d2018b07d201a6072301a60707000000fc020000f7f7f7000000040000002d01050004000000f00104000c000000240304002301a607d201a607d201c1072301c10707000000fc020000f8f8f8000000040000002d01040004000000f001 -05000c000000240304002301c107d201c107d201dd072301dd0707000000fc020000f9f9f9000000040000002d01050004000000f00104000c000000240304002301dd07d201dd07d201f8072301f80707000000fc020000fafafa000000040000002d01040004000000f00105000c000000240304002301f807d201f807 -d20113082301130807000000fc020000fbfbfb000000040000002d01050004000000f00104000c0000002403040023011308d2011308d2012e0823012e0807000000fc020000fcfcfc000000040000002d01040004000000f00105000c0000002403040023012e08d2012e08d2014a0823014a080c000000240304002301 -4a08d2014a08d20165082301650807000000fc020000fdfdfd000000040000002d01050004000000f00104000c0000002403040023016508d2016508d2018008230180080c0000002403040023018008d2018008d2019b0823019b0807000000fc020000fefefe000000040000002d01040004000000f00105000c000000 -2403040023019b08d2019b08d201b7082301b7080c000000240304002301b708d201b708d201d2082301d2080c000000240304002301d208d201d208d201ed082301ed08040000002d01030004000000f001040008000000fa0200000000000000000000040000002d01040007000000fc020000ffffff00000004000000 -2d010500050000000701010000000800000026060f000600ffffffff01000800000026060f000600ffffffff01001000000026060f001600ffffffff00007701000026000000f20200003e040000040000002d01020007000000fc020000808080000000040000002d0106003a00000024031b007701260087013f009301 -5b009a017d00a001b200a3010701a9013c01d201d201e5010402e5011a02e802fb02e802a002f102a302f1026503f4011a03f70143037402c3035e02f203f401eb03db01c003d201e803bc01eb03a301eb039a01c3038d01270477013d0477012600040000002d010400040000002d01050004000000f001060008000000 -26060f000600ffffffff01001000000026060f001600ffffffff000078010000010000007d0100003f00000008000000fa0200000300000080808000040000002d010600040000002d01030008000000250302007a0103007a013c00040000002d01040004000000f0010600040000002d0105000800000026060f000600 -ffffffff01001000000026060f001600ffffffff000000000000260000007b0100003e040000040000002d01020007000000fc020000808080000000040000002d0106003a00000024031b007a0126006b013f005e015b0058017d005201b2004f01070148013c012001d2010d0104020d011a020a00fb020a00a0020000 -a30200006503fd001a03fa0043037d00c3039300f203fd00eb031601c0032001e8033601eb034f01eb035801c303640127047a013d047a012600040000002d010400040000002d01050004000000f00106000800000026060f000600ffffffff0100040000002d010000030000000000}{\result {\b\i\fs20 -{\pict{\*\picprop\shplid1026{\sp{\sn shapeType}{\sv 75}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fLine}{\sv 0}}}\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0 -\picw6403\pich19341\picwgoal3630\pichgoal10965\wmetafile8\bliptag1830359438\blipupi-163{\*\blipuid 6d19118ec337f5448ed155b6986bb3d1} -0100090000039e06000007003a00000000001400000026060f001e00ffffffff040014000000576f72640e004d6963726f736f667420576f7264050000000b02 -00000000050000000c02ec08f4021c000000fb021000070000000000bc02000000000000000253797374656d0000080000000c008a0100000a00060000000c00 -8a0100000a00040000002d010000050000000201010000001c000000fb02d6ff0000000000009001000000000440001254696d6573204e657720526f6d616e00 -2a82ed77c067ef771d060a0d00000a00040000002d01010005000000090200000000050000000201010000001000000026060f001600ffffffff000023010000 -d2030000d2010000ed0800000800000026060f000600ffffffff000008000000fa0205000100000000000000040000002d01020007000000fc02010000000000 -0000040000002d0103000500000007010400000007000000fc020000c0c0c0000000040000002d0104000c000000240304002301d203d201d203d201ed032301 -ed030c000000240304002301ed03d201ed03d20108042301080407000000fc020000c1c1c1000000040000002d01050004000000f00104000c00000024030400 -23010804d2010804d2012404230124040c0000002403040023012404d2012404d2013f0423013f0407000000fc020000c2c2c2000000040000002d0104000400 -0000f00105000c0000002403040023013f04d2013f04d2015a0423015a040c0000002403040023015a04d2015a04d20175042301750407000000fc020000c3c3 -c3000000040000002d01050004000000f00104000c0000002403040023017504d2017504d20191042301910407000000fc020000c4c4c4000000040000002d01 -040004000000f00105000c0000002403040023019104d2019104d201ac042301ac0407000000fc020000c5c5c5000000040000002d01050004000000f0010400 -0c000000240304002301ac04d201ac04d201c7042301c70407000000fc020000c6c6c6000000040000002d01040004000000f00105000c000000240304002301 -c704d201c704d201e2042301e20407000000fc020000c8c8c8000000040000002d01050004000000f00104000c000000240304002301e204d201e204d201fe04 -2301fe0407000000fc020000c9c9c9000000040000002d01040004000000f00105000c000000240304002301fe04d201fe04d20119052301190507000000fc02 -0000cacaca000000040000002d01050004000000f00104000c0000002403040023011905d2011905d20134052301340507000000fc020000cccccc0000000400 -00002d01040004000000f00105000c0000002403040023013405d2013405d2014f0523014f0507000000fc020000cecece000000040000002d01050004000000 -f00104000c0000002403040023014f05d2014f05d2016a0523016a0507000000fc020000cfcfcf000000040000002d01040004000000f00105000c0000002403 -040023016a05d2016a05d20186052301860507000000fc020000d1d1d1000000040000002d01050004000000f00104000c0000002403040023018605d2018605 -d201a1052301a10507000000fc020000d3d3d3000000040000002d01040004000000f00105000c000000240304002301a105d201a105d201bc052301bc050700 -0000fc020000d5d5d5000000040000002d01050004000000f00104000c000000240304002301bc05d201bc05d201d7052301d70507000000fc020000d8d8d800 -0000040000002d01040004000000f00105000c000000240304002301d705d201d705d201f3052301f30507000000fc020000dadada000000040000002d010500 -04000000f00104000c000000240304002301f305d201f305d2010e0623010e0607000000fc020000dcdcdc000000040000002d01040004000000f00105000c00 -00002403040023010e06d2010e06d20129062301290607000000fc020000dedede000000040000002d01050004000000f00104000c0000002403040023012906 -d2012906d20144062301440607000000fc020000e0e0e0000000040000002d01040004000000f00105000c0000002403040023014406d2014406d2015f062301 -5f0607000000fc020000e2e2e2000000040000002d01050004000000f00104000c0000002403040023015f06d2015f06d2017b0623017b0607000000fc020000 -e5e5e5000000040000002d01040004000000f00105000c0000002403040023017b06d2017b06d20196062301960607000000fc020000e7e7e700000004000000 -2d01050004000000f00104000c0000002403040023019606d2019606d201b1062301b10607000000fc020000e9e9e9000000040000002d01040004000000f001 -05000c000000240304002301b106d201b106d201cc062301cc0607000000fc020000eaeaea000000040000002d01050004000000f00104000c00000024030400 -2301cc06d201cc06d201e8062301e80607000000fc020000ededed000000040000002d01040004000000f00105000c000000240304002301e806d201e806d201 -03072301030707000000fc020000eeeeee000000040000002d01050004000000f00104000c0000002403040023010307d2010307d2011e0723011e0707000000 -fc020000f0f0f0000000040000002d01040004000000f00105000c0000002403040023011e07d2011e07d20139072301390707000000fc020000f2f2f2000000 -040000002d01050004000000f00104000c0000002403040023013907d2013907d20155072301550707000000fc020000f3f3f3000000040000002d0104000400 -0000f00105000c0000002403040023015507d2015507d20170072301700707000000fc020000f5f5f5000000040000002d01050004000000f00104000c000000 -2403040023017007d2017007d2018b0723018b0707000000fc020000f6f6f6000000040000002d01040004000000f00105000c0000002403040023018b07d201 -8b07d201a6072301a60707000000fc020000f7f7f7000000040000002d01050004000000f00104000c000000240304002301a607d201a607d201c1072301c107 -07000000fc020000f8f8f8000000040000002d01040004000000f00105000c000000240304002301c107d201c107d201dd072301dd0707000000fc020000f9f9 -f9000000040000002d01050004000000f00104000c000000240304002301dd07d201dd07d201f8072301f80707000000fc020000fafafa000000040000002d01 -040004000000f00105000c000000240304002301f807d201f807d20113082301130807000000fc020000fbfbfb000000040000002d01050004000000f0010400 -0c0000002403040023011308d2011308d2012e0823012e0807000000fc020000fcfcfc000000040000002d01040004000000f00105000c000000240304002301 -2e08d2012e08d2014a0823014a080c0000002403040023014a08d2014a08d20165082301650807000000fc020000fdfdfd000000040000002d01050004000000 -f00104000c0000002403040023016508d2016508d2018008230180080c0000002403040023018008d2018008d2019b0823019b0807000000fc020000fefefe00 -0000040000002d01040004000000f00105000c0000002403040023019b08d2019b08d201b7082301b7080c000000240304002301b708d201b708d201d2082301 -d2080c000000240304002301d208d201d208d201ed082301ed08040000002d01030004000000f001040008000000fa0200000000000000000000040000002d01 -040007000000fc020000ffffff000000040000002d010500050000000701010000000800000026060f000600ffffffff01000800000026060f000600ffffffff -01001000000026060f001600ffffffff00007701000026000000f20200003e040000040000002d01020007000000fc020000808080000000040000002d010600 -3a00000024031b007701260087013f0093015b009a017d00a001b200a3010701a9013c01d201d201e5010402e5011a02e802fb02e802a002f102a302f1026503 -f4011a03f70143037402c3035e02f203f401eb03db01c003d201e803bc01eb03a301eb039a01c3038d01270477013d0477012600040000002d01040004000000 -2d01050004000000f00106000800000026060f000600ffffffff01001000000026060f001600ffffffff000078010000010000007d0100003f00000008000000 -fa0200000300000080808000040000002d010600040000002d01030008000000250302007a0103007a013c00040000002d01040004000000f001060004000000 -2d0105000800000026060f000600ffffffff01001000000026060f001600ffffffff000000000000260000007b0100003e040000040000002d01020007000000 -fc020000808080000000040000002d0106003a00000024031b007a0126006b013f005e015b0058017d005201b2004f01070148013c012001d2010d0104020d01 -1a020a00fb020a00a0020000a30200006503fd001a03fa0043037d00c3039300f203fd00eb031601c0032001e8033601eb034f01eb035801c303640127047a01 -3d047a012600040000002d010400040000002d01050004000000f00106000800000026060f000600ffffffff0100040000002d0100000300000000000000000000}}}}}{ -\par }}}{\shprslt{\*\do\dobxcolumn\dobypage\dodhgt8192\dptxbx{\dptxbxtext\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid {\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid {\object\objemb\objw3631\objh10966{\*\objclass Word.Picture.8} -{\*\objdata 01050000020000000f000000576f72642e506963747572652e38000000000000000000005c0000 -d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff0900060000000000000000000000010000000100000000000000001000000200000001000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffdffffff0c000000feffffff0d00000005000000060000000700000008000000090000000a0000000b000000feffffff1c0000000e0000000f00000010000000110000001200000013000000feffffff15000000160000001700000018000000190000001a0000001b000000fefffffffeffffff1e00 -00001f0000002000000021000000220000002300000024000000feffffff260000002700000028000000290000002a0000002b0000002c000000feffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffff040000000709020000000000c00000000000004600000000000000000000000020fb -9b393434be0103000000800e00000000000001004f006c00650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000201ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000 -000000000000000000000000140000000000000031005400610062006c006500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0002010100000003000000ffffffff0000000000000000000000000000000000000000000000000000 -00000000000000000000040000000010000000000000010043006f006d0070004f0062006a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012000201ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 -000000000000000000000000010000006800000000000000feffffff02000000fefffffffeffffff05000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f000000100000001100000012000000130000001400000015000000160000001700000018000000190000001a00 -00001b0000001c0000001d0000001e0000001f000000200000002100000022000000230000002400000025000000260000002700000028000000290000002a0000002b0000002c0000002d0000002e0000002f00000030000000310000003200000033000000340000003500000036000000370000003800000039000000 -feffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0100000200000000000000000000000000000000b8001400200045006e00740072007900000000000000000000000000000000000000000000000000000000000100feff030a0000ffffffff0709020000000000c0000000000000461700 -00004d6963726f736f667420576f72642050696374757265000a0000004d53576f7264446f63000f000000576f72642e506963747572652e3800f439b2710000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000ffffffffffffffff -ffffffff0000000000000000000000000000000000000000000000000000000000000000ffffffff030000000400000001000000ffffffff0000000000000000031900008d4b00003c0d00000100090000039e06000007003a00000000001400000026060f001e00ffffffff040014000000576f72640e004d6963726f73 -6f667420576f7264050000000b0200000000050000000c02ec08f4021c000000fb021000070000000000bc02000000000000000253797374656d0000080000000c008a0100000a00060000000c008a0100000a00040000002d010000050000000201010000001c000000fb02d6ff00000000000090010000000004400012 -54696d6573204e657720526f6d616e002a82ed77c067ef771d060a0d00000a00040000002d01010012000f000a0001005b000f00020000000000000024000040f1ff02002400000006004e006f0072006d0061006c0000000200000004006d4809040000000000000000000000000000000000003c004140f2ffa1003c00 -00001600440065006600610075006c0074002000500061007200610067007200610070006800200046006f006e00740000000000000000000000000000000000050000000700000c00000800ffffffff010000000420ffff0100000000000000000005000000000000000000000400000504000003000000000400000504 -0000040000000004000005040000050000000f0000f038000000000006f01800000008040000020000000700000001000000010000000800000040001ef110000000ffff00000000ff0080808000f7000010000f0002f008040000100008f00800000005000000070400000f0003f0a60300000f0004f028000000010009 -f010000000940cce00ff000000ff0000000100000002000af00800000000040000050000000f0004f04e00000012000af00800000007040000000a000053000bf01e0000008001070000008101c0c0c0008c0164000000bf0114001400ff0100000800000010f00400000000000000000011f0040000000a0000000f0004 -f05a01000002000af00800000004040000000a0000b3000bf02a0100000400000000004201170700004301a113000044010400000045c16c00000046c1760000007f0101000100800100000000810180808000bf0110001000ff01100018001b001b00f0ff000000004b0078008700ff00a500a401c300a302d2003804f0 -003705b30107080d02f7080d026009ea06980dea06e50b1707f40b1707960f58022e0e6702f10ebf0458115604391258021b12e0014911b3010c124a011b12d2001b12a5005811690038130000a1130000000038003c000200004000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac01 -0000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac01600080000010f00400000003000000000011f0040000001f0000000f0004f04e00000042010af00800000005040000400a000053000b -f01e0000004401040000007f0100000100bf0100001000c00180808000ff0118001800000010f00400000002000000000011f004000000050000000f0004f06001000002000af00800000006040000400a0000c3000bf0300100000400000000004201170700004301a113000044010400000045c16c00000046c1760000 -007f0101000100800100000000810180808000bf0110001000ff01100018008803000000001b001b00f0ff000000004b0078008700ff00a500a401c300a302d2003804f0003705b30107080d02f7080d026009ea06980dea06e50b1707f40b1707960f58022e0e6702f10ebf0458115604391258021b12e0014911b3010c -124a011b12d2001b12a5005811690038130000a1130000000038003c000200004000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac010000 -ac010000ac010000ac010000ac01600080000010f00400000001000000000011f004000000080000000f0004f04200000012000af00800000001040000000e000053000bf01e000000bf0100001000cb0100000000ff01000008000403090000003f0301000100000011f004000000010000000000000001000000020000 -000300000005000000070400007305000057120000bb080000d52a00007400000000000604000000000000b4000000170700005514000074000000000005040000170700000f000000170700001d0100007400000000000404000008070000b40000001f0e00005514000074000000000000000000070000000700000000 -00070000000700ff40038001000000000000000000489fd50001000100000000000000000000000000000000000210000000000000000500000070000008004000000300000047169001000002020603050405020304870200000000000000000000000000009f00000000000000540069006d006500730020004e006500 -7700200052006f006d0061006e00000035169001020005050102010706020507000000000000001000000000000000000000008000000000530079006d0062006f006c000000332690010000020b0604020202020204870200000000000000000000000000009f0000000000000041007200690061006c00000022000400 -f10888180000d0020000680100000000158a2826188a2826000000000200010000000000000000000000010001000000040003100100000000000000000000000100010000000100000000000000210300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000a506c007b400b4008000723000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000001602ffff120000000000 -000000000000000000000c00520069006c006500790020005200610069006e00650079000c00520069006c006500790020005200610069006e006500790000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003004f0062006a0049006e0066006f00000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000120002010200000006000000ffffffff0000000000000000000000000000000000000000000000000000000000000000000000000300000004000000000000004f0062006a0065006300740050006f006f006c00 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000101ffffffffffffffffffffffff000000000000000000000000000000000000000080749a393434be0180749a393434be0100000000000000000000000002004f006c00650050007200650073003000 -30003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000180002010500000008000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000004000000640d00000000000057006f007200640044006f0063007500 -6d0065006e007400000000000000000000000000000000000000000000000000000000000000000000000000000000001a000200ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000001400000000100000000000000500000009020000000005000000 -0201010000001000000026060f001600ffffffff000023010000d2030000d2010000ed0800000800000026060f000600ffffffff000008000000fa0205000100000000000000040000002d01020007000000fc020100000000000000040000002d0103000500000007010400000007000000fc020000c0c0c00000000400 -00002d0104000c000000240304002301d203d201d203d201ed032301ed030c000000240304002301ed03d201ed03d20108042301080407000000fc020000c1c1c1000000040000002d01050004000000f00104000c0000002403040023010804d2010804d2012404230124040c0000002403040023012404d2012404d201 -3f0423013f0407000000fc020000c2c2c2000000040000002d01040004000000f00105000c0000002403040023013f04d2013f04d2015a0423015a040c0000002403040023015a04d2015a04d20175042301750407000000fc020000c3c3c3000000040000002d01050004000000f00104000c0000002403040023017504 -d2017504d20191042301910407000000fc020000c4c4c4000000040000002d01040004000000f00105000c0000002403040023019104d2019104d201ac042301ac0407000000fc020000c5c5c5000000040000002d01050004000000f00104000c000000240304002301ac04d201ac04d201c7042301c70407000000fc02 -0000c6c6c6000000040000002d01040004000000f00105000c000000240304002301c704d201c704d201e2042301e20407000000fc020000c8c8c8000000040000002d01050004000000f00104000c000000240304002301e204d201e204d201fe042301fe0407000000fc020000c9c9c9000000040000002d0104000400 -0000f00105000c000000240304002301fe04d201fe04d20119052301190507000000fc020000cacaca000000040000002d01050004000000f00104000c0000002403040023011905d2011905d20134052301340507000000fc020000cccccc000000040000002d01040004000000f00105000c0000002403040023013405 -d2013405d2014f0523014f0507000000fc020000cecece000000040000002d01050004000000f00104000c0000002403040023014f05d2014f05d2016a0523016a0507000000fc020000cfcfcf000000040000002d01040004000000f00105000c0000002403040023016a05d2016a05d20186052301860507000000fc02 -0000d1d1d1000000040000002d01050004000000f00104000c0000002403040023018605d2018605d201a1052301a10507000000fc020000d3d3d3000000040000002d01040004000000f00105000c000000240304002301a105d201a105d201bc052301bc0507000000fc020000d5d5d5000000040000002d0105000400 -0000f00104000c000000240304002301bc05d201bc05d201d7052301d70507000000fc020000d8d8d8000000040000002d01040004000000f00105000c000000240304002301d705d201d705d201f3052301f30507000000fc020000dadada000000040000002d01050004000000f00104000c000000240304002301f305 -d201f305d2010e0623010e0607000000fc020000dcdcdc000000040000002d01040004000000f00105000c0000002403040023010e06d2010e06d20129062301290607000000fc020000dedede000000040000002d01050004000000f00104000c0000002403040023012906d2012906d20144062301440607000000fc02 -0000e0e0e0000000040000002d01040004000000f00105000c0000002403040023014406d2014406d2015f0623015f0607000000fc020000e2e2e2000000040000002d01050004000000f00104000c0000002403040023015f06d2015f06d2017b0623017b0607000000fc020000e5e5e5000000040000002d0104000400 -0000f00105000c0000002403040023017b06d2017b06d20196062301960607000000fc020000e7e7e7000000040000002d01050004000000f00104000c0000002403040023019606d2019606d201b1062301b10607000000fc020000e9e9e9000000040000002d01040004000000f00105000c000000240304002301b106 -d201b106d201cc062301cc0607000000fc020000eaeaea000000040000002d01050004000000f00104000c000000240304002301cc06d201cc06d201e8062301e80607000000fc020000ededed000000040000002d01040004000000f00105000c000000240304002301e806d201e806d20103072301030707000000fc02 -0000eeeeee000000040000002d01050004000000f00104000c0000002403040023010307d2010307d2011e0723011e0707000000fc020000f0f0f0000000040000002d01040004000000f00105000c0000002403040023011e07d2011e07d20139072301390707000000fc020000f2f2f2000000040000002d0105000400 -0000f00104000c0000002403040023013907d2013907d20155072301550707000000fc020000f3f3f3000000040000002d01040004000000f00105000c0000002403040023015507d2015507d20170072301700707000000fc020000f5f5f5000000040000002d01050004000000f00104000c0000002403040023017007 -d2017007d2018b0723018b0707000000fc020000f6f6f6000000040000002d01040004000000f00105000c0000002403040023018b07d2018b07d201a6072301a60707000000fc020000f7f7f7000000040000002d01050004000000f00104000c000000240304002301a607d201a607d201c1072301c10707000000fc02 -0000f8f8f8000000040000002d01040004000000f00105000c000000240304002301c107d201c107d201dd072301dd0707000000fc020000f9f9f9000000040000002d01050004000000f00104000c000000240304002301dd07d201dd07d201f8072301f80707000000fc020000fafafa000000040000002d0104000400 -0000f00105000c000000240304002301f807d201f807d20113082301130807000000fc020000fbfbfb000000040000002d01050004000000f00104000c0000002403040023011308d2011308d2012e0823012e0807000000fc020000fcfcfc000000040000002d01040004000000f00105000c0000002403040023012e08 -d2012e08d2014a0823014a080c0000002403040023014a08d2014a08d20165082301650807000000fc020000fdfdfd000000040000002d01050004000000f00104000c0000002403040023016508d2016508d2018008230180080c0000002403040023018008d2018008d2019b0823019b0807000000fc020000fefefe00 -0000040000002d01040004000000f00105000c0000002403040023019b08d2019b08d201b7082301b7080c000000240304002301b708d201b708d201d2082301d2080c000000240304002301d208d201d208d201ed082301ed08040000002d01030004000000f001040008000000fa020000000000000000000004000000 -2d01040007000000fc020000ffffff000000040000002d010500050000000701010000000800000026060f000600ffffffff01000800000026060f000600ffffffff01001000000026060f001600ffffffff00007701000026000000f20200003e040000040000002d01020007000000fc02000080808000000004000000 -2d0106003a00000024031b007701260087013f0093015b009a017d00a001b200a3010701a9013c01d201d201e5010402e5011a02e802fb02e802a002f102a302f1026503f4011a03f70143037402c3035e02f203f401eb03db01c003d201e803bc01eb03a301eb039a01c3038d01270477013d0477012600040000002d01 -0400040000002d01050004000000f00106000800000026060f000600ffffffff01001000000026060f001600ffffffff000078010000010000007d0100003f00000008000000fa0200000300000080808000040000002d010600040000002d01030008000000250302007a0103007a013c00040000002d01040004000000 -f0010600040000002d0105000800000026060f000600ffffffff01001000000026060f001600ffffffff000000000000260000007b0100003e040000040000002d01020007000000fc020000808080000000040000002d0106003a00000024031b007a0126006b013f005e015b0058017d005201b2004f01070148013c01 -2001d2010d0104020d011a020a00fb020a00a0020000a30200006503fd001a03fa0043037d00c3039300f203fd00eb031601c0032001e8033601eb034f01eb035801c303640127047a013d047a012600040000002d010400040000002d01050004000000f00106000800000026060f000600ffffffff0100040000002d01 -000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000eca5c1005900090400000012bf000000000000100000000000040000050400000e00626a626af357f357000000000000000000000000000000000000090416001e0c0000913d0100913d01000500000000000000 -000000000000000000000000000000000000000000000000ffff0f000000000000000000ffff0f000000000000000000ffff0f00000000000000000000000000000000005d000000000092000000000000009200000092000000000000009200000000000000920000000000000092000000000000009200000014000000 -0000000000000000c200000000000000c200000000000000c200000000000000c200000000000000c20000000c000000ce0000000c000000c20000000000000002060000b6000000e600000000000000e600000000000000e600000000000000e600000000000000e600000000000000b305000000000000b30500000000 -0000b305000000000000c705000002000000c905000000000000c905000000000000c905000000000000c905000000000000c905000000000000c905000024000000b8060000f4010000ac0800005a000000ed05000015000000000000000000000000000000000000009200000000000000b30500000000000000000000 -000000000000000000000000370500007c000000b305000000000000b305000000000000b305000000000000ed05000000000000c70500000000000092000000000000009200000000000000e6000000000000000000000000000000e600000051040000e600000000000000c705000000000000c705000000000000c705 -000000000000b30500000a0000009200000000000000e6000000000000009200000000000000e600000000000000c70500000000000000000000000000000000000000000000a60000000e000000b40000000e0000009200000000000000920000000000000092000000000000009200000000000000b305000000000000 -c705000000000000c705000000000000c7050000000000000000000000000000c705000000000000920000000000000092000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c705000000000000e60000000000 -0000da0000000c00000060f0f066e2c9bd01c200000000000000c200000000000000bd0500000a000000c70500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080808080d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000404000005040000f80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d036a000000005508016d48000400020004000005040000fd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000001000400000104000002040000030400000404000005040000fefefefefe000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020101051c001fb0c04e20b0c04e21b0df2022b0b31f2390771f2490740425b00000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000500530075006d006d0061007200790049006e00 -66006f0072006d006100740069006f006e000000000000000000000000000000000000000000000000000000280002010700000009000000ffffffff0000000000000000000000000000000000000000000000000000000000000000000000001d0000000010000000000000050044006f00630075006d0065006e007400 -530075006d006d0061007200790049006e0066006f0072006d006100740069006f006e000000000000000000000038000200ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000025000000001000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000feff00000400020000000000 -00000000000000000000000001000000e0859ff2f94f6810ab9108002b27b3d930000000600100001000000001000000880000000200000090000000030000009c00000004000000a800000005000000c000000007000000cc00000008000000dc00000009000000f400000012000000000100000a0000001c0100000c00 -0000280100000d000000340100000e000000400100000f000000480100001000000050010000130000005801000002000000e40400001e00000001000000000073001e00000001000000000073001e0000000d00000052696c6579205261696e657900006f001e0000000100000000696c651e000000070000004e6f726d -616c00611e0000000d00000052696c6579205261696e657900006f001e0000000200000032006c651e000000130000004d6963726f736f667420576f726420382e300000400000000046c323000000004000000000c60ce0e1c9bd01400000000098564be2c9bd0103000000010000000300000000000000030000000000 -000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000feff000004000200000000000000000000000000000000000200000002d5cdd59c2e1b10939708002b2cf9ae4400000005d5cdd59c2e1b10939708002b2cf9ae40010000fc0000000c00 -000001000000680000000f000000700000000500000090000000060000009800000011000000a000000017000000a80000000b000000b000000010000000b800000013000000c000000016000000c80000000d000000d00000000c000000dd00000002000000e40400001e000000150000005765622053696d756c617469 -6f6e7320496e632e0000310003000000010000000300000001000000030000000000000003000000e81008000b000000000000000b000000000000000b000000000000000b000000000000001e1000000100000001000000000c100000020000001e000000060000005469746c6500030000000100000000980000000300 -000000000000200000000100000036000000020000003e00000001000000020000000a0000005f5049445f475549440002000000e4040000410000004e0000007b00340034004300370034004400330030002d0033003500440034002d0031003100440032002d0041003300390044002d00300030004100300032003400 -4200460031003300350041007d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105000005000000 -0d0000004d45544146494c4550494354000319000073b4ffff440d0000080003198d4b0000 -0100090000039e06000007003a00000000001400000026060f001e00ffffffff040014000000576f72640e004d6963726f736f667420576f7264050000000b0200000000050000000c02ec08f4021c000000fb021000070000000000bc02000000000000000253797374656d0000080000000c008a0100000a0006000000 -0c008a0100000a00040000002d010000050000000201010000001c000000fb02d6ff0000000000009001000000000440001254696d6573204e657720526f6d616e002a82ed77c067ef771d060a0d00000a00040000002d01010005000000090200000000050000000201010000001000000026060f001600ffffffff0000 -23010000d2030000d2010000ed0800000800000026060f000600ffffffff000008000000fa0205000100000000000000040000002d01020007000000fc020100000000000000040000002d0103000500000007010400000007000000fc020000c0c0c0000000040000002d0104000c000000240304002301d203d201d203 -d201ed032301ed030c000000240304002301ed03d201ed03d20108042301080407000000fc020000c1c1c1000000040000002d01050004000000f00104000c0000002403040023010804d2010804d2012404230124040c0000002403040023012404d2012404d2013f0423013f0407000000fc020000c2c2c20000000400 -00002d01040004000000f00105000c0000002403040023013f04d2013f04d2015a0423015a040c0000002403040023015a04d2015a04d20175042301750407000000fc020000c3c3c3000000040000002d01050004000000f00104000c0000002403040023017504d2017504d20191042301910407000000fc020000c4c4 -c4000000040000002d01040004000000f00105000c0000002403040023019104d2019104d201ac042301ac0407000000fc020000c5c5c5000000040000002d01050004000000f00104000c000000240304002301ac04d201ac04d201c7042301c70407000000fc020000c6c6c6000000040000002d01040004000000f001 -05000c000000240304002301c704d201c704d201e2042301e20407000000fc020000c8c8c8000000040000002d01050004000000f00104000c000000240304002301e204d201e204d201fe042301fe0407000000fc020000c9c9c9000000040000002d01040004000000f00105000c000000240304002301fe04d201fe04 -d20119052301190507000000fc020000cacaca000000040000002d01050004000000f00104000c0000002403040023011905d2011905d20134052301340507000000fc020000cccccc000000040000002d01040004000000f00105000c0000002403040023013405d2013405d2014f0523014f0507000000fc020000cece -ce000000040000002d01050004000000f00104000c0000002403040023014f05d2014f05d2016a0523016a0507000000fc020000cfcfcf000000040000002d01040004000000f00105000c0000002403040023016a05d2016a05d20186052301860507000000fc020000d1d1d1000000040000002d01050004000000f001 -04000c0000002403040023018605d2018605d201a1052301a10507000000fc020000d3d3d3000000040000002d01040004000000f00105000c000000240304002301a105d201a105d201bc052301bc0507000000fc020000d5d5d5000000040000002d01050004000000f00104000c000000240304002301bc05d201bc05 -d201d7052301d70507000000fc020000d8d8d8000000040000002d01040004000000f00105000c000000240304002301d705d201d705d201f3052301f30507000000fc020000dadada000000040000002d01050004000000f00104000c000000240304002301f305d201f305d2010e0623010e0607000000fc020000dcdc -dc000000040000002d01040004000000f00105000c0000002403040023010e06d2010e06d20129062301290607000000fc020000dedede000000040000002d01050004000000f00104000c0000002403040023012906d2012906d20144062301440607000000fc020000e0e0e0000000040000002d01040004000000f001 -05000c0000002403040023014406d2014406d2015f0623015f0607000000fc020000e2e2e2000000040000002d01050004000000f00104000c0000002403040023015f06d2015f06d2017b0623017b0607000000fc020000e5e5e5000000040000002d01040004000000f00105000c0000002403040023017b06d2017b06 -d20196062301960607000000fc020000e7e7e7000000040000002d01050004000000f00104000c0000002403040023019606d2019606d201b1062301b10607000000fc020000e9e9e9000000040000002d01040004000000f00105000c000000240304002301b106d201b106d201cc062301cc0607000000fc020000eaea -ea000000040000002d01050004000000f00104000c000000240304002301cc06d201cc06d201e8062301e80607000000fc020000ededed000000040000002d01040004000000f00105000c000000240304002301e806d201e806d20103072301030707000000fc020000eeeeee000000040000002d01050004000000f001 -04000c0000002403040023010307d2010307d2011e0723011e0707000000fc020000f0f0f0000000040000002d01040004000000f00105000c0000002403040023011e07d2011e07d20139072301390707000000fc020000f2f2f2000000040000002d01050004000000f00104000c0000002403040023013907d2013907 -d20155072301550707000000fc020000f3f3f3000000040000002d01040004000000f00105000c0000002403040023015507d2015507d20170072301700707000000fc020000f5f5f5000000040000002d01050004000000f00104000c0000002403040023017007d2017007d2018b0723018b0707000000fc020000f6f6 -f6000000040000002d01040004000000f00105000c0000002403040023018b07d2018b07d201a6072301a60707000000fc020000f7f7f7000000040000002d01050004000000f00104000c000000240304002301a607d201a607d201c1072301c10707000000fc020000f8f8f8000000040000002d01040004000000f001 -05000c000000240304002301c107d201c107d201dd072301dd0707000000fc020000f9f9f9000000040000002d01050004000000f00104000c000000240304002301dd07d201dd07d201f8072301f80707000000fc020000fafafa000000040000002d01040004000000f00105000c000000240304002301f807d201f807 -d20113082301130807000000fc020000fbfbfb000000040000002d01050004000000f00104000c0000002403040023011308d2011308d2012e0823012e0807000000fc020000fcfcfc000000040000002d01040004000000f00105000c0000002403040023012e08d2012e08d2014a0823014a080c000000240304002301 -4a08d2014a08d20165082301650807000000fc020000fdfdfd000000040000002d01050004000000f00104000c0000002403040023016508d2016508d2018008230180080c0000002403040023018008d2018008d2019b0823019b0807000000fc020000fefefe000000040000002d01040004000000f00105000c000000 -2403040023019b08d2019b08d201b7082301b7080c000000240304002301b708d201b708d201d2082301d2080c000000240304002301d208d201d208d201ed082301ed08040000002d01030004000000f001040008000000fa0200000000000000000000040000002d01040007000000fc020000ffffff00000004000000 -2d010500050000000701010000000800000026060f000600ffffffff01000800000026060f000600ffffffff01001000000026060f001600ffffffff00007701000026000000f20200003e040000040000002d01020007000000fc020000808080000000040000002d0106003a00000024031b007701260087013f009301 -5b009a017d00a001b200a3010701a9013c01d201d201e5010402e5011a02e802fb02e802a002f102a302f1026503f4011a03f70143037402c3035e02f203f401eb03db01c003d201e803bc01eb03a301eb039a01c3038d01270477013d0477012600040000002d010400040000002d01050004000000f001060008000000 -26060f000600ffffffff01001000000026060f001600ffffffff000078010000010000007d0100003f00000008000000fa0200000300000080808000040000002d010600040000002d01030008000000250302007a0103007a013c00040000002d01040004000000f0010600040000002d0105000800000026060f000600 -ffffffff01001000000026060f001600ffffffff000000000000260000007b0100003e040000040000002d01020007000000fc020000808080000000040000002d0106003a00000024031b007a0126006b013f005e015b0058017d005201b2004f01070148013c012001d2010d0104020d011a020a00fb020a00a0020000 -a30200006503fd001a03fa0043037d00c3039300f203fd00eb031601c0032001e8033601eb034f01eb035801c303640127047a013d047a012600040000002d010400040000002d01050004000000f00106000800000026060f000600ffffffff0100040000002d010000030000000000}{\result {\b\i\fs20 -{\pict{\*\picprop\shplid1026{\sp{\sn shapeType}{\sv 75}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fLine}{\sv 0}}}\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0 -\picw6403\pich19341\picwgoal3630\pichgoal10965\wmetafile8\bliptag1830359438\blipupi-163{\*\blipuid 6d19118ec337f5448ed155b6986bb3d1} -0100090000039e06000007003a00000000001400000026060f001e00ffffffff040014000000576f72640e004d6963726f736f667420576f7264050000000b02 -00000000050000000c02ec08f4021c000000fb021000070000000000bc02000000000000000253797374656d0000080000000c008a0100000a00060000000c00 -8a0100000a00040000002d010000050000000201010000001c000000fb02d6ff0000000000009001000000000440001254696d6573204e657720526f6d616e00 -2a82ed77c067ef771d060a0d00000a00040000002d01010005000000090200000000050000000201010000001000000026060f001600ffffffff000023010000 -d2030000d2010000ed0800000800000026060f000600ffffffff000008000000fa0205000100000000000000040000002d01020007000000fc02010000000000 -0000040000002d0103000500000007010400000007000000fc020000c0c0c0000000040000002d0104000c000000240304002301d203d201d203d201ed032301 -ed030c000000240304002301ed03d201ed03d20108042301080407000000fc020000c1c1c1000000040000002d01050004000000f00104000c00000024030400 -23010804d2010804d2012404230124040c0000002403040023012404d2012404d2013f0423013f0407000000fc020000c2c2c2000000040000002d0104000400 -0000f00105000c0000002403040023013f04d2013f04d2015a0423015a040c0000002403040023015a04d2015a04d20175042301750407000000fc020000c3c3 -c3000000040000002d01050004000000f00104000c0000002403040023017504d2017504d20191042301910407000000fc020000c4c4c4000000040000002d01 -040004000000f00105000c0000002403040023019104d2019104d201ac042301ac0407000000fc020000c5c5c5000000040000002d01050004000000f0010400 -0c000000240304002301ac04d201ac04d201c7042301c70407000000fc020000c6c6c6000000040000002d01040004000000f00105000c000000240304002301 -c704d201c704d201e2042301e20407000000fc020000c8c8c8000000040000002d01050004000000f00104000c000000240304002301e204d201e204d201fe04 -2301fe0407000000fc020000c9c9c9000000040000002d01040004000000f00105000c000000240304002301fe04d201fe04d20119052301190507000000fc02 -0000cacaca000000040000002d01050004000000f00104000c0000002403040023011905d2011905d20134052301340507000000fc020000cccccc0000000400 -00002d01040004000000f00105000c0000002403040023013405d2013405d2014f0523014f0507000000fc020000cecece000000040000002d01050004000000 -f00104000c0000002403040023014f05d2014f05d2016a0523016a0507000000fc020000cfcfcf000000040000002d01040004000000f00105000c0000002403 -040023016a05d2016a05d20186052301860507000000fc020000d1d1d1000000040000002d01050004000000f00104000c0000002403040023018605d2018605 -d201a1052301a10507000000fc020000d3d3d3000000040000002d01040004000000f00105000c000000240304002301a105d201a105d201bc052301bc050700 -0000fc020000d5d5d5000000040000002d01050004000000f00104000c000000240304002301bc05d201bc05d201d7052301d70507000000fc020000d8d8d800 -0000040000002d01040004000000f00105000c000000240304002301d705d201d705d201f3052301f30507000000fc020000dadada000000040000002d010500 -04000000f00104000c000000240304002301f305d201f305d2010e0623010e0607000000fc020000dcdcdc000000040000002d01040004000000f00105000c00 -00002403040023010e06d2010e06d20129062301290607000000fc020000dedede000000040000002d01050004000000f00104000c0000002403040023012906 -d2012906d20144062301440607000000fc020000e0e0e0000000040000002d01040004000000f00105000c0000002403040023014406d2014406d2015f062301 -5f0607000000fc020000e2e2e2000000040000002d01050004000000f00104000c0000002403040023015f06d2015f06d2017b0623017b0607000000fc020000 -e5e5e5000000040000002d01040004000000f00105000c0000002403040023017b06d2017b06d20196062301960607000000fc020000e7e7e700000004000000 -2d01050004000000f00104000c0000002403040023019606d2019606d201b1062301b10607000000fc020000e9e9e9000000040000002d01040004000000f001 -05000c000000240304002301b106d201b106d201cc062301cc0607000000fc020000eaeaea000000040000002d01050004000000f00104000c00000024030400 -2301cc06d201cc06d201e8062301e80607000000fc020000ededed000000040000002d01040004000000f00105000c000000240304002301e806d201e806d201 -03072301030707000000fc020000eeeeee000000040000002d01050004000000f00104000c0000002403040023010307d2010307d2011e0723011e0707000000 -fc020000f0f0f0000000040000002d01040004000000f00105000c0000002403040023011e07d2011e07d20139072301390707000000fc020000f2f2f2000000 -040000002d01050004000000f00104000c0000002403040023013907d2013907d20155072301550707000000fc020000f3f3f3000000040000002d0104000400 -0000f00105000c0000002403040023015507d2015507d20170072301700707000000fc020000f5f5f5000000040000002d01050004000000f00104000c000000 -2403040023017007d2017007d2018b0723018b0707000000fc020000f6f6f6000000040000002d01040004000000f00105000c0000002403040023018b07d201 -8b07d201a6072301a60707000000fc020000f7f7f7000000040000002d01050004000000f00104000c000000240304002301a607d201a607d201c1072301c107 -07000000fc020000f8f8f8000000040000002d01040004000000f00105000c000000240304002301c107d201c107d201dd072301dd0707000000fc020000f9f9 -f9000000040000002d01050004000000f00104000c000000240304002301dd07d201dd07d201f8072301f80707000000fc020000fafafa000000040000002d01 -040004000000f00105000c000000240304002301f807d201f807d20113082301130807000000fc020000fbfbfb000000040000002d01050004000000f0010400 -0c0000002403040023011308d2011308d2012e0823012e0807000000fc020000fcfcfc000000040000002d01040004000000f00105000c000000240304002301 -2e08d2012e08d2014a0823014a080c0000002403040023014a08d2014a08d20165082301650807000000fc020000fdfdfd000000040000002d01050004000000 -f00104000c0000002403040023016508d2016508d2018008230180080c0000002403040023018008d2018008d2019b0823019b0807000000fc020000fefefe00 -0000040000002d01040004000000f00105000c0000002403040023019b08d2019b08d201b7082301b7080c000000240304002301b708d201b708d201d2082301 -d2080c000000240304002301d208d201d208d201ed082301ed08040000002d01030004000000f001040008000000fa0200000000000000000000040000002d01 -040007000000fc020000ffffff000000040000002d010500050000000701010000000800000026060f000600ffffffff01000800000026060f000600ffffffff -01001000000026060f001600ffffffff00007701000026000000f20200003e040000040000002d01020007000000fc020000808080000000040000002d010600 -3a00000024031b007701260087013f0093015b009a017d00a001b200a3010701a9013c01d201d201e5010402e5011a02e802fb02e802a002f102a302f1026503 -f4011a03f70143037402c3035e02f203f401eb03db01c003d201e803bc01eb03a301eb039a01c3038d01270477013d0477012600040000002d01040004000000 -2d01050004000000f00106000800000026060f000600ffffffff01001000000026060f001600ffffffff000078010000010000007d0100003f00000008000000 -fa0200000300000080808000040000002d010600040000002d01030008000000250302007a0103007a013c00040000002d01040004000000f001060004000000 -2d0105000800000026060f000600ffffffff01001000000026060f001600ffffffff000000000000260000007b0100003e040000040000002d01020007000000 -fc020000808080000000040000002d0106003a00000024031b007a0126006b013f005e015b0058017d005201b2004f01070148013c012001d2010d0104020d01 -1a020a00fb020a00a0020000a30200006503fd001a03fa0043037d00c3039300f203fd00eb031601c0032001e8033601eb034f01eb035801c303640127047a01 -3d047a012600040000002d010400040000002d01050004000000f00106000800000026060f000600ffffffff0100040000002d0100000300000000000000000000}}}}}{ -\par }}\dpx4560\dpy1095\dpxsize3630\dpysize10965\dpfillfgcr255\dpfillfgcg255\dpfillfgcb255\dpfillbgcr17\dpfillbgcg0\dpfillbgcb0\dpfillpat0\dplinehollow}}}}{ -\par -\par }\pard\plain \s3\sa120\keepn\widctlpar\outlinelevel2\adjustright \b\f1\fs22\cgrid { -\par }\pard\plain \s6\sa120\keepn\widctlpar\outlinelevel5\adjustright \b\i\f1\fs144\cgrid {ACM -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid {\b\i\fs40 -\par -\par -\par -\par -\par -\par -\par -\par -\par -\par air combat simulation for UNIX and Windows}{\b\i\fs144 \line }{\b\i\fs32 version 5.0 -\par -\par -\par }{\fs24 Web Simulations Incorporated\line }{\fs16 www.websimulations.com}{\fs24 \page }{\field\fldedit{\*\fldinst {\fs24 TOC \\o "1-2" }}{\fldrslt {\fs24\lang1024 -\par }\pard\plain \s22\sb120\widctlpar\tqr\tlul\tx8630\adjustright \b\i\f1\cgrid {\lang1024 Introduction\tab }{\field{\*\fldinst {\lang1024 PAGEREF _Toc431273854 \\h }{\fs20\lang1024 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400330031003200370033003800350034000000000000}}}{\fldrslt {\lang1024 4}}}{\lang1024 -\par }\pard\plain \s23\li220\sb120\widctlpar\tqr\tlul\tx8630\adjustright \b\f1\fs22\cgrid {\lang1024 Acknowledgements\tab }{\field{\*\fldinst {\lang1024 PAGEREF _Toc431273855 \\h }{\fs20\lang1024 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400330031003200370033003800350035000000000000}}}{\fldrslt {\lang1024 4}}}{\lang1024 -\par }\pard\plain \s22\sb120\widctlpar\tqr\tlul\tx8630\adjustright \b\i\f1\cgrid {\lang1024 Abbreviations\tab }{\field{\*\fldinst {\lang1024 PAGEREF _Toc431273856 \\h }{\fs20\lang1024 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400330031003200370033003800350036000000000000}}}{\fldrslt {\lang1024 5}}}{\lang1024 -\par ACM for UNIX\tab }{\field{\*\fldinst {\lang1024 PAGEREF _Toc431273857 \\h }{\fs20\lang1024 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400330031003200370033003800350037000000000000}}}{\fldrslt {\lang1024 5}}}{ -\lang1024 -\par }\pard\plain \s23\li220\sb120\widctlpar\tqr\tlul\tx8630\adjustright \b\f1\fs22\cgrid {\lang1024 Command line options\tab }{\field{\*\fldinst {\lang1024 PAGEREF _Toc431273858 \\h }{\fs20\lang1024 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400330031003200370033003800350038000000000000}}}{\fldrslt {\lang1024 5}}}{\lang1024 -\par Other Initialization Parameters\tab }{\field{\*\fldinst {\lang1024 PAGEREF _Toc431273859 \\h }{\fs20\lang1024 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400330031003200370033003800350039000000000000}} -}{\fldrslt {\lang1024 8}}}{\lang1024 -\par }\pard\plain \s22\sb120\widctlpar\tqr\tlul\tx8630\adjustright \b\i\f1\cgrid {\lang1024 Keyboard Commands\tab }{\field{\*\fldinst {\lang1024 PAGEREF _Toc431273860 \\h }{\fs20\lang1024 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400330031003200370033003800360030000000000000}}}{\fldrslt {\lang1024 11}}}{\lang1024 -\par The Head-Up Display\tab }{\field{\*\fldinst {\lang1024 PAGEREF _Toc431273861 \\h }{\fs20\lang1024 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400330031003200370033003800360031000000000000}}}{\fldrslt { -\lang1024 13}}}{\lang1024 -\par }\pard\plain \s23\li220\sb120\widctlpar\tqr\tlul\tx8630\adjustright \b\f1\fs22\cgrid {\lang1024 Ladders\tab }{\field{\*\fldinst {\lang1024 PAGEREF _Toc431273862 \\h }{\fs20\lang1024 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400330031003200370033003800360032000000000000}}}{\fldrslt {\lang1024 13}}}{\lang1024 -\par Angle of Attack\tab }{\field{\*\fldinst {\lang1024 PAGEREF _Toc431273863 \\h }{\fs20\lang1024 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400330031003200370033003800360033000000000000}}}{\fldrslt {\lang1024 13 -}}}{\lang1024 -\par The G-Meter\tab }{\field{\*\fldinst {\lang1024 PAGEREF _Toc431273864 \\h }{\fs20\lang1024 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400330031003200370033003800360034000000000000}}}{\fldrslt {\lang1024 14}}}{ -\lang1024 -\par Weapon State\tab }{\field{\*\fldinst {\lang1024 PAGEREF _Toc431273865 \\h }{\fs20\lang1024 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400330031003200370033003800360035000000000000}}}{\fldrslt {\lang1024 14}}} -{\lang1024 -\par }\pard\plain \s22\sb120\widctlpar\tqr\tlul\tx8630\adjustright \b\i\f1\cgrid {\lang1024 The Radar System\tab }{\field{\*\fldinst {\lang1024 PAGEREF _Toc431273866 \\h }{\fs20\lang1024 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400330031003200370033003800360036000000000000}}}{\fldrslt {\lang1024 15}}}{\lang1024 -\par Electronic Countermeasures\tab }{\field{\*\fldinst {\lang1024 PAGEREF _Toc431273867 \\h }{\fs20\lang1024 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400330031003200370033003800360037000000000000}}}{\fldrslt { -\lang1024 17}}}{\lang1024 -\par }\pard\plain \s23\li220\sb120\widctlpar\tqr\tlul\tx8630\adjustright \b\f1\fs22\cgrid {\lang1024 Radar Warning Receiver\tab }{\field{\*\fldinst {\lang1024 PAGEREF _Toc431273868 \\h }{\fs20\lang1024 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400330031003200370033003800360038000000000000}}}{\fldrslt {\lang1024 17}}}{\lang1024 -\par }\pard\plain \s22\sb120\widctlpar\tqr\tlul\tx8630\adjustright \b\i\f1\cgrid {\lang1024 Weapon Systems\tab }{\field{\*\fldinst {\lang1024 PAGEREF _Toc431273869 \\h }{\fs20\lang1024 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400330031003200370033003800360039000000000000}}}{\fldrslt {\lang1024 18}}}{\lang1024 -\par }\pard\plain \s23\li220\sb120\widctlpar\tqr\tlul\tx8630\adjustright \b\f1\fs22\cgrid {\lang1024 Air-to-Air Missiles\tab }{\field{\*\fldinst {\lang1024 PAGEREF _Toc431273870 \\h }{\fs20\lang1024 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400330031003200370033003800370030000000000000}}}{\fldrslt {\lang1024 18}}}{\lang1024 -\par Cannon\tab }{\field{\*\fldinst {\lang1024 PAGEREF _Toc431273871 \\h }{\fs20\lang1024 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400330031003200370033003800370031000000000000}}}{\fldrslt {\lang1024 18}}}{ -\lang1024 -\par }\pard\plain \s22\sb120\widctlpar\tqr\tlul\tx8630\adjustright \b\i\f1\cgrid {\lang1024 The HSI\tab }{\field{\*\fldinst {\lang1024 PAGEREF _Toc431273872 \\h }{\fs20\lang1024 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400330031003200370033003800370032000000000000}}}{\fldrslt {\lang1024 20}}}{\lang1024 -\par Drones\tab }{\field{\*\fldinst {\lang1024 PAGEREF _Toc431273873 \\h }{\fs20\lang1024 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400330031003200370033003800370033000000000000}}}{\fldrslt {\lang1024 21}}}{ -\lang1024 -\par Stealth Mode\tab }{\field{\*\fldinst {\lang1024 PAGEREF _Toc431273874 \\h }{\fs20\lang1024 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400330031003200370033003800370034000000000000}}}{\fldrslt {\lang1024 22}}} -{\lang1024 -\par Developer Studio Setup (ACM for Windows only)\tab }{\field{\*\fldinst {\lang1024 PAGEREF _Toc431273875 \\h }{\fs20\lang1024 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400330031003200370033003800370035000000000000}}}{\fldrslt {\lang1024 24}}}{\lang1024 -\par Building ACM on UNIX Systems\tab }{\field{\*\fldinst {\lang1024 PAGEREF _Toc431273876 \\h }{\fs20\lang1024 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400330031003200370033003800370036000000000000}}}{\fldrslt -{\lang1024 25}}}{\lang1024 -\par Defining New Scenes\tab }{\field{\*\fldinst {\lang1024 PAGEREF _Toc431273877 \\h }{\fs20\lang1024 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400330031003200370033003800370037000000000000}}}{\fldrslt { -\lang1024 26}}}{\lang1024 -\par }\pard\plain \s23\li220\sb120\widctlpar\tqr\tlul\tx8630\adjustright \b\f1\fs22\cgrid {\lang1024 Team Locations\tab }{\field{\*\fldinst {\lang1024 PAGEREF _Toc431273878 \\h }{\fs20\lang1024 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400330031003200370033003800370038000000000000}}}{\fldrslt {\lang1024 26}}}{\lang1024 -\par Ground Color\tab }{\field{\*\fldinst {\lang1024 PAGEREF _Toc431273879 \\h }{\fs20\lang1024 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400330031003200370033003800370039000000000000}}}{\fldrslt {\lang1024 26}}} -{\lang1024 -\par Runway record\tab }{\field{\*\fldinst {\lang1024 PAGEREF _Toc431273880 \\h }{\fs20\lang1024 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400330031003200370033003800380030000000000000}}}{\fldrslt {\lang1024 26} -}}{\lang1024 -\par TACAN Record\tab }{\field{\*\fldinst {\lang1024 PAGEREF _Toc431273881 \\h }{\fs20\lang1024 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400330031003200370033003800380031000000000000}}}{\fldrslt {\lang1024 27}}} -{\lang1024 -\par ILS Record\tab }{\field{\*\fldinst {\lang1024 PAGEREF _Toc431273882 \\h }{\fs20\lang1024 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400330031003200370033003800380032000000000000}}}{\fldrslt {\lang1024 27}}}{ -\lang1024 -\par Features\tab }{\field{\*\fldinst {\lang1024 PAGEREF _Toc431273883 \\h }{\fs20\lang1024 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400330031003200370033003800380033000000000000}}}{\fldrslt {\lang1024 28}}}{ -\lang1024 -\par Feature Record\tab }{\field{\*\fldinst {\lang1024 PAGEREF _Toc431273884 \\h }{\fs20\lang1024 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400330031003200370033003800380034000000000000}}}{\fldrslt {\lang1024 28} -}}{\lang1024 -\par }\pard\plain \s22\sb120\widctlpar\tqr\tlul\tx8630\adjustright \b\i\f1\cgrid {\lang1024 Defining New Aircraft\tab }{\field{\*\fldinst {\lang1024 PAGEREF _Toc431273885 \\h }{\fs20\lang1024 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400330031003200370033003800380035000000000000}}}{\fldrslt {\lang1024 29}}}{\lang1024 -\par Starting ACM for Windows\tab }{\field{\*\fldinst {\lang1024 PAGEREF _Toc431273886 \\h }{\fs20\lang1024 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400330031003200370033003800380036000000000000}}}{\fldrslt { -\lang1024 38}}}{\lang1024 -\par Setting up an ACM session (ACM for Windows only)\tab }{\field{\*\fldinst {\lang1024 PAGEREF _Toc431273887 \\h }{\fs20\lang1024 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400330031003200370033003800380037000000000000}}}{\fldrslt {\lang1024 39}}}{\lang1024 -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid }}\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid { -\par }\pard\plain \s1\sb240\sa60\keepn\widctlpar\outlinelevel0\adjustright \f1\fs36\cf9\kerning28 {\page {\*\bkmkstart _Toc431273854}Introduction}{\b {\*\bkmkend _Toc431273854} -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid {ACM is a distributed multiplayer air combat simulation that runs on UNIX and Windows. Players engage in air-to-air combat with infrared missiles and cannon. -\par The first version of ACM was released in 1991 via the venerable Usenet comp.sources.unix newsgroup. Since then, ACM has been upgraded to support the IEEE 1278 Distributed Interactive Simulation (DIS) protocol. -\par }\pard\plain \s2\sb240\sa60\keepn\widctlpar\outlinelevel1\adjustright \b\i\f1 {{\*\bkmkstart _Toc431273855}Acknowledgements{\*\bkmkend _Toc431273855} -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid {Parts of ACM were derived from other sources. The DIS protocol compiler is based on technology originated at Sun Microsystems in their public domain ONC RPC product. ACM\rquote -s DIS glue code was created by Mats Loftkvist. The C++ interface to Microsoft\rquote s DirectDraw is derived from samples created by Nigel Thompson in his book, 3D Graphics Programming for Windows 95. -\par Many others have generously supplied bug fixes and other changes to ACM since it was originally released. In particular, I\rquote -d like to thank Brad Bass and Tim Tessin for their encouragement and continued support. Charlie Briggs and Tom Giertz have helped out a lot, too. -\par -\par }{\b Suggested Further Reading}{ -\par -\par 3D Graphics Programming for Windows 95\line by Nigel Thompson\tab \tab \tab \tab ISBN 1-57231-345-5 -\par Fighter Combat\line by Robert L. Shaw\tab \tab \tab \tab ISBN 0-87021-059-9 -\par Aircraft Control and Simulation\line by Brian L. Stevens and Frank L. Lewis\tab ISBN 0-471-61397-5 -\par 1278.1-1995 IEEE Standard for Distributed Interactive Simulation--Application Protocols ISBN 1-55937-572-8 -\par The Surveying Handbook, second edition\line edited by Russel Brinker and Roy Minnick\tab ISBN 0-412-98511-X -\par }{\f2 -\par }{\b Support -\par }{ -\par Support information can be found at our web site: http://www.websimulations.com/support}{\b -\par -\par }\pard\plain \s1\sb240\sa60\keepn\widctlpar\outlinelevel0\adjustright \f1\fs36\cf9\kerning28 {\page {\*\bkmkstart _Toc431273856}Abbreviations{\*\bkmkend _Toc431273856} -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid {ACM\tab air combat maneuvering -\par AAM\tab air-to-air missile -\par AOA \tab angle of attack -\par DIS\tab Distributed interactive simulation -\par ECM \tab electronic countermeasures -\par HUD \tab head-up display -\par IAS\tab indicated airspeed -\par IR\tab infrared -\par kts\tab nautical miles per hour. A nautical mile is defined as 6076 feet. -\par KIAS\tab knots indicated airspeed -\par RWR\tab radar warning receiver -\par TAA\tab target aspect angle -\par TAS\tab true airspeed -\par TEWS\tab threat early warning system \endash a form of radar warning receiver -\par -\par }\pard\plain \s1\sb240\sa60\keepn\widctlpar\outlinelevel0\adjustright \f1\fs36\cf9\kerning28 {{\*\bkmkstart _Toc431273857}ACM for UNIX{\*\bkmkend _Toc431273857} -\par }\pard\plain \s2\sb240\sa60\keepn\widctlpar\outlinelevel1\adjustright \b\i\f1 {{\*\bkmkstart _Toc431273858}Command line options{\*\bkmkend _Toc431273858} -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid {ACM uses POSIX style command line formatting: -\par }{\f2 acm [ -init }{\i\f2 command-file-name}{\f2 ]}{\line }{\f2 [ -stealth ]\line [ -subject-entity-id }{\i\f2 site-id.appl-id.entity-id}{\f2 ]\line [ -geometry }{\i\f2 x11-geometry-specification}{\f2 ]\line [ -frame-rate }{\i\f2 -target-frame-rate-hertz}{\f2 ]\line [ -update-rate }{\i\f2 internal-update-rate-hertz}{\f2 ]\line [ -plane \{ F-16 | MiG-29 | Su-30 | C-172 \} ]\line [ -team \{ 1 | 2 \} ]\line [ -latitude }{\i\f2 latitude-degrees}{\f2 ]\line - [ -longitude }{\i\f2 longitude-degrees}{\f2 ]\line [ -altitude }{\i\f2 altitude-msl-feet}{\f2 ]\line [ -heading }{\i\f2 initial-heading-degrees-true}{\f2 ]\line [ -airspeed-kts }{\i\f2 initial-airspeed-knots}{\f2 ]\line - [ -dis-site }{\i\f2 DIS-site-id}{\f2 ]\line [ -dis-appl }{\i\f2 DIS-application-id}{\f2 ]\line [ -dis-exercise }{\i\f2 DIS-exercise-id}{\f2 ]\line [ -visibility }{\i\f2 flight-visibility-nm}{\f2 ]\line [ -js }{\i\f2 -joystick-serial-port-pathname}{\f2 ]\line [ -end-game ]\line [ -threshold-range }{\i\f2 threshold-nautical-miles}{\f2 ]\line \line -init }{\i\f2 command file-name}{\f2 -\par }\pard\plain \s19\li720\sa120\widctlpar\adjustright \f2\fs22\cgrid {Take extra command options, in command line format, from the specified text file. For example, say there is a file in your home directory named \lquote .acmrc\rquote -. Its contents look like this: -\par -\par }\pard \s19\li1440\sa120\widctlpar\adjustright {-dis-site 34\line -dis-appl 4 -\par -\par }\pard \s19\li720\sa120\widctlpar\adjustright {New lines are treated as normal white space, so feel free to separate command line options onto multiple lines. -\par From a shell, you enter the command: -\par -\par }\pard \s19\li1440\sa120\widctlpar\adjustright {$ acm -geometry 800x600 -init ~/.acmrc -\par }\pard \s19\li720\sa120\widctlpar\adjustright { -\par This would be equivalent to: -\par -\par }\pard \s19\li1440\sa120\widctlpar\adjustright {$ acm -geometry 800x600 -dis-site 34 \endash dis-appl 4 -\par }\pard\plain \li720\sa120\widctlpar\adjustright \f1\fs22\cgrid {\f2 -\par }\pard \sa120\widctlpar\adjustright {\f2 -stealth -\par }\pard\plain \s19\li720\sa120\widctlpar\adjustright \f2\fs22\cgrid { -Start ACM in stealth mode. ACM allows users to monitor out-the-window views for any aircraft active in an exercise. Additionally, ACM supports an experimental DIS Request/Grant Control protocol that would permit ACM to \ldblquote take over\rdblquote - aircraft of similarly enabled applications. See the \ldblquote Stealth Mode\rdblquote section for detailed information on this capability. -\par }\pard\plain \li720\sa120\widctlpar\adjustright \f1\fs22\cgrid {\f2 -\par }\pard \sa120\widctlpar\adjustright {\f2 -subject-entity-id }{\i\f2 site-id.appl-id.entity-id}{\f2 -\par }\pard \li720\sa120\widctlpar\adjustright {\f2 This option can be used in conjunction with the \endash stealth flag to identify the initial DIS entity to be \ldblquote stealthed\rdblquote . -\par -\par \tab $ acm -stealth -subject-entity-id 32.1.1 -\par -\par }\pard \sa120\widctlpar\adjustright {\f2 -geometry }{\i\f2 x11-geometry-specification}{\f2 -\par }\pard\plain \s19\li720\sa120\widctlpar\adjustright \f2\fs22\cgrid {Specify precise location and size settings for the main ACM window. -\par }\pard \s19\sa120\widctlpar\adjustright { -\par }\pard \s19\sa120\keepn\widctlpar\adjustright {-frame-rate }{\i target-frame-rate-hertz}{ -\par }\pard \s19\li720\sa120\widctlpar\adjustright {Specifies a not-to-exceed rate at which ACM will attempt to render the cockpit scene. The default is to update the scene as fast as possible, which will use all available CPU time on a system. -\par }\pard \s19\sa120\keepn\widctlpar\adjustright {\line -update-rate }{\i internal-update-rate-hertz -\par }\pard \s19\li720\sa120\widctlpar\adjustright {Specifies the update rate for the inner integration loop for the simulation. The default is to run as fast as possible. If the \endash frame-rate option is specified, the default changes to 50 hertz. -\par }\pard \s19\sa120\widctlpar\adjustright { -\par }\pard\plain \sa120\keepn\widctlpar\adjustright \f1\fs22\cgrid {\f2 -plane \{ F-16 | MiG-29 | Su-30 \} -\par }\pard \li720\sa120\widctlpar\adjustright {\f2 Allows the user to select the aircraft type to be flown. -\par }\pard \sa120\widctlpar\adjustright {\f2 -\par }\pard \sa120\keepn\widctlpar\adjustright {\f2 -scene }{\i\f2 scene-file-name -\par }\pard\plain \s19\li720\sa120\widctlpar\adjustright \f2\fs22\cgrid {ACM takes airport and NAVAID information from a text-based scene file. Normally, a file named \ldblquote default-scene\rdblquote is used. -\par -\par }\pard\plain \sa120\keepn\widctlpar\adjustright \f1\fs22\cgrid {\f2 -team \{ 1 | 2 \} -\par }\pard\plain \s19\li720\sa120\widctlpar\adjustright \f2\fs22\cgrid {Allows the user to select which team the aircraft is to be associated with. Team 1 corresponds to the DIS \ldblquote Friendly\rdblquote force, team 2 is the \ldblquote Opposing -\rdblquote force. Each team has an associated \ldblquote home\rdblquote location which is defined in the scene file read by ACM at startup. -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid {\f2 -\par -latitude }{\i\f2 latitude-degrees}{\f2 \line -longitude longitude-degrees \line -altitude altitude-msl-feet \line -heading }{\i\f2 initial-heading-degrees-true}{\f2 \line -airspeed-kts }{\i\f2 initial-airspeed-knots}{\f2 -\par }\pard\plain \s19\li720\sa120\widctlpar\adjustright \f2\fs22\cgrid {These options may be combined to tailor the startup location of the ACM aircraft. If the \endash altitude option is }{\i not}{ - supplied, ACM automatically sets the aircraft on the ground at the specified location. Care should be taken not to specify an altitude too close to the ground. -\par -\par }\pard \s19\sa120\widctlpar\adjustright {-dis-site }{\i DIS-site-id}{\line -dis-appl }{\i DIS-application-id\line }{-dis-exercise}{\i DIS-exercise-id -\par }\pard \s19\li720\sa120\widctlpar\adjustright {Use these options to select a specific IEEE 1278 DIS site or application identifier. By default, ACM uses the last two octets of the host machine\rquote -s IP address as the site and application identifiers. The default exercise identifier is one (1). -\par -\par }\pard \s19\sa120\keepn\widctlpar\adjustright {-visibility }{\i flight-visibility-nm -\par }\pard \s19\li720\sa120\widctlpar\adjustright {Sets the flight visibility in the ACM environment. The default is 50 nautical miles. -\par -\par }\pard \s19\sa120\keepn\widctlpar\adjustright {-js }{\i joystick-serial-port-pathname -\par }\pard \s19\li720\sa120\widctlpar\adjustright {ACM supports Noesis and Colorado Spectrum (now defunct) serial joystick adapters. This command specifies the name of the serial port connected to the joystick adapter and enables joystick polling. -\par }\pard \s19\sa120\widctlpar\adjustright { -\par }\pard \s19\sa120\keepn\widctlpar\adjustright {-end-game}{\i -\par }\pard \s19\li720\sa120\widctlpar\adjustright {This flag is only valid in stealth mode. Hostile aircraft near the subject aircraft are tracked. If any of these aircraft moves within the subject aircraft\rquote s - radar locking range, then ACM will request control of subject aircraft}{\cs35\super \chftn {\footnote \pard\plain \s15\sa120\widctlpar\adjustright \f2\fs18 {\cs35\super \chftn }{ - Control is requested using a variant of the proposed DIS 2.1.4++ transfer control protocol sequence.}}}{ -\par }\pard \s19\sa120\widctlpar\adjustright { -\par }{-threshold-range }{\i threshold-nautical-miles}{\i -\par }\pard \s19\li720\sa120\widctlpar\adjustright {This flag is only valid in the end-game mode. If a hostile aircraft moves within the specified threshold distance }{of the stealthed (subject) aircraft}{, ACM will attempt to take control and engage the -hostile target. If threshold range is not specified, then the subject aircraft\rquote s radar lock range is used as the distance threshold. -\par -\par }\pard\plain \s2\sb240\sa60\keepn\widctlpar\outlinelevel1\adjustright \b\i\f1 {{\*\bkmkstart _Toc431273859}Other Initialization Parameters{\*\bkmkend _Toc431273859} -\par }\pard\plain \s19\sa120\widctlpar\adjustright \f2\fs22\cgrid {At startup, ACM reads several text-based data files to configure the operating environment. -\par }\pard \s19\sa120\keepn\widctlpar\adjustright {default-scene -\par }\pard \s19\li720\sa120\widctlpar\adjustright {This file contains the locations of each team\rquote s home base, airport runway information, NAVAID information, as well as the locations of man-made ground features. The \endash scen -e command line option may be used to direct ACM to read an alternate scene file. -\par }\pard \s19\sa120\keepn\widctlpar\adjustright {object-map.txt -\par }\pard \s19\li720\sa120\widctlpar\adjustright {This file defines a mapping from DIS entity types to 3D object definition files. The object files are used to render an image of the entity. -\par }\pard \s19\sa120\keepn\widctlpar\adjustright {munition-map.txt -\par }\pard \s19\li720\sa120\widctlpar\adjustright {This file defines the explosion and damage producing characteristics of DIS munition entity type and warhead combinations. -\par }\pard \s19\sa120\widctlpar\adjustright {inventory -\par }\pard \s19\li720\sa120\widctlpar\adjustright {This file defines the performance characteristics of all aircraft types modeled by ACM. The layout of this file is defined in the section titled \ldblquote Defining New Aircraft\rdblquote . -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid { -\par \page IEEE 1278.1 (DIS) Compliance -\par -\par ACM emits and recognizes the following DIS PDU Types: -\par -\par }\pard \li720\sa120\widctlpar\adjustright {Entity State -\par Fire -\par Detonation -\par Electromagnetic Emission -\par }\pard \sa120\widctlpar\adjustright { -\par ACM uses the DIS/x DIS interface library. DIS/x supports dead reckoning of external entities using any of these methods: -\par -\par \tab }{\ul Name\tab \tab Enumeration Value -\par }{\tab Static\tab \tab \tab 1 -\par \tab FPW\tab \tab \tab 2 -\par \tab RPW\tab \tab \tab 3 -\par \tab RVW\tab \tab \tab 4 -\par \tab FVW\tab \tab \tab 5 -\par -\par These dead reckoning methods are currently }{\b unsupported}{ by DIS/x: -\par -\par \tab }{\ul Name\tab \tab Enumeration Value}{ -\par \tab FPB\tab \tab \tab 6 -\par \tab RPB\tab \tab \tab 7 -\par \tab RVB\tab \tab \tab 8 -\par \tab FVB\tab \tab \tab 9 -\par \tab RPW\tab \tab \tab 10 -\par \tab RVW\tab \tab \tab 11 -\par -\par Entities managed by ACM emit entity state PDU\rquote s specifying the RPW(3) dead reckoning method. No articulation parameters are currently sent by entities managed by ACM. - As with most current DIS-based simulations, altitudes are expressed as heights above the WGS-84 ellipsoid, not as heights above the geoid. Dead reckoning threshold values are hard-coded in this version of the product: -\par -\par }\pard \sa120\keepn\widctlpar\adjustright {\tab }{\ul Description\tab \tab \tab \tab \tab Value -\par }\pard \sa120\widctlpar\adjustright {\tab Maximum time between Entity State PDUs\tab \tab 5 seconds -\par \tab Dead Reckoning Cartesian distance error\tab \tab 2 meters -\par \tab Dead Reckoning angular orientation error\tab \tab 3 degrees -\par -\par When operating in IEEE 1278 mode, the default UDP port number for PDU transmission is 3000. -\par }\pard\plain \s1\sb240\sa60\keepn\widctlpar\outlinelevel0\adjustright \f1\fs36\cf9\kerning28 {\page {\*\bkmkstart _Toc431273860}Keyboard Commands{\*\bkmkend _Toc431273860} -\par }\pard\plain \sa120\nowidctlpar\adjustright \f1\fs22\cgrid {\fs40 -\par }{\fs24\ul General -\par -\par }{\fs28 G}{\tab Landing gear up/down -\par }{\fs28 B}{\tab Wheel brakes on/off -\par }{\fs28 H}{\tab Flaps down 10 degrees -\par }{\fs28 Y}{\tab Flaps up 10 degrees -\par }{\fs28 S}{\tab Deploy speed brakes -\par }{\fs28 W}{\tab Retract speed brakes -\par }{\fs28 L}{\tab Create a drone opponent aircraft. -\par }{\fs28 Q}{\tab Quit the simulation -\par -\par }{\fs28 ? or F1}{\tab Help -\par }{\fs28 F2}{\b\fs28 \tab }{\tab Set Preferences -\par -\par }{\fs24\ul Views \endash view buttons are located on the PC\rquote s numeric keypad -\par -\par }{\fs28 KP8}{\tab Forward view -\par }{\fs28 KP2}{\tab Rear view -\par }{\fs28 KP4}{\tab Look Left -\par }{\fs28 KP6}{\tab Look Right -\par }{\fs28 KP5}{\tab Look Up -\par }{\fs28 N}{\tab Chase plane view (this view button is not located on the numeric keypad) -\par -\par }{\fs24\ul Joystick Buttons -\par -\par }{\b Button2 (top)}{\tab Select weapon (Sidewinder IR missile or 20mm cannon) -\par }{\b Button1 (front)}{\tab Fire selected weapon -\par -\par }{\fs24\ul Radar -\par -\par }\pard\plain \s16\fi-720\li720\sa120\nowidctlpar\adjustright \f1\fs18 {\fs28 R}{\tab Toggle Radar Mode (Standby, Normal, ACM 20x30, STT, HSI-mode) (also Button3 on Microsoft Sidewinder}{{\field{\*\fldinst SYMBOL 212 \\f "Symbol" \\s 9}{\fldrslt\f3\fs18}}} -{ Joysticks) -\par }\pard\plain \sa120\nowidctlpar\adjustright \f1\fs22\cgrid {\fs28 T}{\tab Break Lock -- track a different target (also Button4) -\par -\par }{\fs24\ul Throttle (for joysticks without a throttle control) -\par -\par }{\fs28 4}{\tab Full Power -\par }\pard \sa120\widctlpar\adjustright {\fs28 3}{\tab Increase Power -\par }\pard \sa120\nowidctlpar\adjustright {\fs28 2}{\tab Decrease Power -\par }{\fs28 1}{\tab Flight Idle -\par }{\fs28 A}{\tab Toggle Afterburner -\par -\par }{\fs24\ul NAVAID receiver control -\par -\par }{\fs28 7}{\tab Rotate HSI Selected Course Pointer (SCP) 20 degrees -\par }{\fs28 8}{\tab Rotate HSI SCP 1 degree -\par }{\fs28 9}{\tab Increment NAV1 receiver frequency by 1.0 MHz -\par }{\fs28 0}{\tab Increment NAV1 receiver frequency by 0.05 MHz -\par -\par }{\fs24\ul Trim -\par -\par }{\fs24 Trim buttons may be pressed until the desired trim is attained -\par -\par }\pard\plain \s16\fi-720\li720\sa120\nowidctlpar\adjustright \f1\fs18 {\fs28 Ctrl-Shft-UpArrow}{\tab Forward (down) pitch trim -\par }\pard\plain \sa120\nowidctlpar\adjustright \f1\fs22\cgrid {\fs28 Ctrl-Shft-DownArrow}{\tab Aft (up) pitch trim -\par }\pard\plain \s16\fi-720\li720\sa120\nowidctlpar\adjustright \f1\fs18 {\fs28 Ctrl-Shft-LeftArrow}{\tab Left roll trim -\par }\pard\plain \sa120\nowidctlpar\adjustright \f1\fs22\cgrid {\fs28 Ctrl-Shft-RightArrow}{\tab Right roll trim -\par -\par -\par }\pard\plain \s1\sb240\sa60\keepn\widctlpar\outlinelevel0\adjustright \f1\fs36\cf9\kerning28 {\page {\*\bkmkstart _Toc431273861}The Head-Up Display{\*\bkmkend _Toc431273861} -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid {The Head-Up Display (HUD) is a collection of indicators that permits pilots to focus their atte -ntion on what's going on outside of the cockpit. These indicators are projected onto a flat pane of glass located near the windscreen. Much of the information is displayed graphically to give the pilot a quicker understanding of the immediate situation. - -\par }\pard \sa120\nowidctlpar\adjustright {\cf9 -\par }{\fs20\cf9 {\*\shppict{\pict{\*\picprop\shplid1027{\sp{\sn shapeType}{\sv 75}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn pibName}{\sv \'46\'3a\'5c\'73\'6e\'61\'70\'73\'68\'6f\'74\'5c\'61\'63\'6d\'5c\'70\'63\'5c\'68\'6c\'70 -\'5c\'48\'55\'44\'2e\'62\'6d\'70}}{\sp{\sn pibFlags}{\sv 2}}{\sp{\sn fillColor}{\sv 268435473}}{\sp{\sn fFilled}{\sv 0}}{\sp{\sn fLine}{\sv 0}}}\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0 -\picw11904\pich9259\picwgoal6749\pichgoal5249\pngblip\bliptag-1901124716{\*\blipuid 8eaf23940da765ef1ff58d6d032b7b73}89504e470d0a1a0a0000000d49484452000001c20000015e080200000099de882a0000000467414d410000b1889598f4a6000000097048597300000ec400000e -c401952b0e1b0000200049444154789ced9d3d8fdc469a80df1114f464a3d0e1fd03cf601578704a24ac030be7c0c26e60c1fb076c29b1333b94323b91ececa2 -5dc8c12db4810fdac00729f1420abc98d1bf90b3e9ac1918d0053553aaa9228b455691ac2a3e0f06836e7e379b7cfa7deb8b7b27a7270200902b87ef1f2e7d08 -3d5c59fa000000ca068d02004481460100a240a3000051a051008028d028004014681400208ac9357a7478a4fee2b793e4780000d27275d2ad1f1d1ee9e6fde6 -6b00806a98301ab5bc79727ae246946a8a8e58cd05cc29e67f71225c6b2e00c09ccc5a36da1a8d6adb9e9c9e68d5aa897a8a5ec09d656d04a05c468402a3a387 -de15ad3065eae3299a69937a8d3eb9aeecbaf4e7f93edc5938144a478502f30404841d699949a33a9014af52dd5586ce02a806335c30eb18e4a288ccbc113cb7 -9535cb4cf8ba16738bd1cc75dde371f7bb2a534fa851eb9bb672f3703cdfc7aabe2a17f7461a71362283a0413758c82fe89cdf69fed78f75fbb867db9cebbe6e -9dd5fa75bb8b99fbb25eb8cbf88fa17aa68d46cde2cb41a7b57545f32218b14df010efd0de1b2cc3db6cb624ba1733c8083924b7c236b250b2b50678d032b97d -b9733279521f98b97b5eb86f3db340860486aee9f44642b2c8ae2fab97aec4d39fa55a47d215a00d0a87b33269ccea911fc1fa911bbd8ce4744a6763a6b25198 -88d63664e181a1a7b2ae77c9ae83f127ecd65eac636e6d7ae13992d2c361853fc5ee5a257c6b430f66dc32599dd29941a365d31abe5957b927170b49e5c29774 -8dd675b45dcb987b0939e6d68fdf3545afa88a86fc9f254fcc8f60a50e5d3f51818560ad5bb67ea5dc65ba36beb680148d5688bff66089231a437c4141d794dc -eef0aee36c2dc8ea2ad1f22bb2778abba9d62d8717be657586a786a1496aa6b71622dcaafe2553d9b92b5b1cb4afae8f69c64d05fd9c981c19fdfd56e5a9cc21 -1aad0d37cff2e462bd42095cd2b353cf14cf5e423e45c2032885420fbb7af6f8622090113521b31d490e9b8289c8ffc9a044a3e0a3b509943965360df98f64f4 -367128c443340a0059937f344a1513004014681400200a340a0010051a050088829afa55e016d29fbe3e6d9da5a7cf8ce708cd05963a3c000f68741558d2b464 -64ce3d7cff701155f98f10206748ea57846ba84c42514d9743f36ff2026ba6b068d4bc9dc2ef79021c8d7b12723b2dadc7a3262253c5d0bb60dc5d03e194148d -6a1b0ebaa9b8f74c54da9ef339c9ff089765e85d30eeae814194a451317e4b07fda8f20bac50f752ce6723ff23cc81a177c1b8bb06c2292ca91f0abfbd5004e1 -79f75015a2ce19a859a3148986b054d53c28b4404f5f9fead75d3fffad8dc046ec0bd252b34605878a88f37362053ee6dba56e33cf11ae0133e90efced37e51b -b28ba1cbc3202ad7a8eb88155e46eae6f4a48d8bd7e4f61e61ddb809813f1a1d7a25aff6ca9f8d9206ca33af861157129711e489be9843aeea153a34ffeca4a4 -68d48a59e82c0875e006e3bd7445ee21fd17b847925352340a69c93f42cfff086106f28f460b6b370a00901b681400200a340ac9c83ff9caff08a144d0280040 -14681400200a340a0010050d9e00206bf22fd1261a85f4e47fdd0324048d02004481460100a240a3000051a051008028d028004014681400200a340ae961743b -5815681400200a340a0010051a050088028d02004481460100a240a3000051a051008028d028004014681400200a340a0010051a050088028d02004481460100 -a240a3000051a051008028d0e8488e0e8fccfffacf9deb597de82ccf32e16b852c0900e15c5dfa002ae1e4f444bd383a3c3a393dd16f01a07ad0e8249861a952 -aa9e621a564dec72aebb8abb7cd7143d511d803e0c00480e1a1d89b292c74da6bc4c8bb9135b1de7aee21ad933a575fbbdc70c002340a369680d365bd10bf897 -54de0c9c654e71d7c29b00938246d3905c55565cb9e09100801f6aeae76668457948a57ceb36a991079807a2d169d115f7e159bf5e4c571f8d7811be23008864 -8f9bad320edf3f3c7d7d7af8fea17acb23e3a174f4c59c2d24f55561da5309f4f0fdc3fcaf4280a241a3b561869fc8146006d0688e8cab1dea12253205981434 -5a159e9250640a3011d4d4678adbc0debf7ca0192d93520105100f1acd97d69ef29e65c29d68ca1493964beb6f275fe8fca0d132e81dbe24707913d52e8ab0b4 -5cf8d632a1128dd6f7b31c382c53a45ec9f101e2a944a3dcff16817a558b215380182ad1684d4c3a36a867cbc814601c3478824bd02e0a602868345f3c438e4e -0d320508078d4227a64c973e16807c41a3d0036129801f340afd90e30378a0a63e6bb27aa82755f9b9515f73e94241a3300c649a0f9cfc4ca844a3fc2ccf0c32 -05d054a2516ee34540a600421553fe2cd87a3410da45c1caa9241a85c5211485d542349a17f9d4cb03402068b400f2cfeb01d6cc95e6f7a50f0100a064ae8808 -26050018cd79159332e9860a278072a0b974265c122732cd96ac7a85422660cc4c685166f37b7926e567190096a2dd97c585a518130096c2d7e0a9f99dda2700 -801efadb8d22d34ca0f528409e84e6ed1315985a659a666eee990500900f03d4385181a9f6a31a28c8d425ea0480fc19dc1974ba1c1f690240898cec533f854c -1966adb76528c5a300191295a2c717989a19bd380129c5a3001e682e9d09b1259d490a4c5b1dea572a0060cc4c4853611423d371cf9f08b12a171900cc40ca7a -f711321dfd0c9fd52a92cef5fa1774b5d700e446fab6a0e105a61e875ab3c8e841c373f422197adea8a2e865926ef383c2d2d62fe9f4f5a9be4fcce945c0ed3d -03c8744e38bd7e261c7da457a6feefa6d06f6e86bb9abc5e63c9548abd6c6683c46e0a261fc4a9b8c1a2a038ac8e70824cbbe151d8533093de4a1cc37434dcc3 -4b41a63f11148ffa99cf6d6b084b5b7fe4dd895c8593824cd3420bee5ee6b65af5326dbde63c23578d83e2d15ed6506c4aebe94c58c66755cab4eb9a76af636b -202b988eba8b4d6bfa2c457375d734fb9bcd22fb4e58609a49e7e298f487e87252c8f4c7410bee10ae8ac8ae6944641199a60a4b73b82b5a8f217c22ccc01a32 -fd18dcdf98a25b70cfc63b815520d3fc49f8634ef1e868eacef443e8fabcfcea8fc31e6f74d734caa7f353e5439f4c6faef38ecd99d3d7a76e7c0a3094f6619b -97956935b84d9d716886205388c497482f55fb54538eef162d419e506c0aa3e97988c8ae698eaf5f7a6a85f576228eaf1f5593e3ab6047873c09e19922c931bf -297eff20909e90efd68de3e7bfbc3cbe7ef4fc97972a327df9ebac751a3545a65010e31a485180b34eae6e773b1139d8dfef5d549596deba71fcf2d793e3eb47 -fabf1821aa7eabe68aa15d6b19cf14d7d4abea923f086aea2765904ccd65dca7854f4126cda5e15c4ee132950b9f9a0e353d684db4841b32a5b5dca0cab0949c -b108c2cda8e7aa32f1790e0c16e792962c99aa8c5e449efff252bfd6e8b766e0a9cde84694ae1cbb8a59f5065dba645aeecfb2599b4f27d1cca972845c88a725 -ba33657aebc6b16765dd62df0d4b5ddc59a38b59dd1cbfc42bb8b51c8db6a5793234b424cf5815579aa669da9a88aaf0d3fceb52eaf1f523e553338af454e8f7 -86a5218d01eaa8c7d7ba54fd91a823ce99f05a267e0bd7c67950a74cbab9dc4a34b0c0d434ac99d49bf545a6617ba778927a8b720b4c3d9664108ddc08f949eb -aaa32feb4bb4ba17abb77aa2f576d0a6eae6ea59d35cbbb0a729d3a73f3f5713b54c7539a91805a30afdd66cb16fe5ec2149bda768d543a1320d296843a699d0 -75fe435a3895f2ddf55a723d5a1cca1511396b9a3323af6f4df3b7bb9df2692ff422ed253c6127cd5f9c98d35ec157a6fa77e8ffd65b6b31731973963bb132ae -ea085499b43532d584a7f98b8c175550583a284221325d16cf0977078bb2962ffdcbb2e2537fb86aa6ffd614a93acdbffa667bf6dec1b529642a0b0dbe97bf4c -c7dd5ac8741102cf73e95f87765c920118cd6eca75c7a18aab22f2667b2622c8b408902968d236979ec877b546a026ef3453ab4ceb33a920d37298b44b45aa2d -bbe1e7a080d4f56fab912b4eeaaf6ce48df9fecdf64cf95455347df1e73baa02eaeec7b7d59f590175e7c35bea85aa80ba75e358fd59fb30a7b84346998c1e3e -ea833f1cba7f6a561d2d4c5ba1022a73dc01670bc5ad35928bccdd2d396d9d52b1434564efeb479f8b1c884823ef59f3bebbffc5b77f7d22225ffde5eef7fff3 -5444ae6d36773fbefde4a7672272f7e3db62b48bbaf3e12df5fa607fdfea39dafab62b2cf577858a24dbc834fe2263944ca895fc7f87aeec4b23b215d96ee48d -19997e77ff8b2f1f7daf22d36ffffa4445a0ba5d9496a98e4cad76a6ade858f5d68d6335c0fef1f523f5a797096f7b3f0222530048ce5511d997464476b21511 -15229a91a955662a22674da38253456099a98e49dd17fb9bcda441a845ad05a6429929c0125c1551c1e3be2b5313255395e6374da32ba0345aa63abb17233275 -078812a317a9eab39ff263f5516b3dbe624199326e31ac10fd10919df2e9be341769be78d27c5dd164f580baf3e12d95ec5b3cfdf979ebc826e6a027f33f472f -931c7fa2d2f7a5d27c73bfb3ed146041ae8a3446f4791e3c5ea4e2ef22d387f71f7ef9e87b3555a7f9226246a65ffcf98e5960ba712a91b6bb5d6b9a6f8e679a -d6a4babe7e34a5875409235386434d48fc6f0cdf453ea8b45699cbb4de79642a223bd93ebcff83887c77ff0b354ff954c9542ea4f9d55feeca45f5bd883cf9e9 -9925d3a73f3fd7f9be1e854f87a856529faa91e9ab7f0fb8d46acdf165de349f3603216478723c1d377583277381de29eec66312afbdbdbdb76fdfaaffe3b630 -1d7b0f1e7d7279ca3b737d73ffc7078f3e55b1e9ee7c7a7bd32815998a21cd6b970de846a65d2df6dd52d4995beccf2fd3999bd48dd61cd1686e24ecc5643954 -2efbd17a1d32a575e3e32e75f531b5403334a9eb8c7791e983479f5e98f43ccd0faccd0fe901d5dafda9b526ca1c7c6f06eaae7d922ce32018c714bd98b416f5 -dcc8df786b38a8ae214ddddde9899634338c49bb6c712e53e55011b948f3d5aba964da555fdf9be3b796810ecae82daa9729402bc9132377e0676b81dec1a173 -93a68bdf135d65a6ead5b491a98b47a631c6f450710b5380a14c54fad4ba4d1da29e9c9e64ee50e9d3a842579d5faad0bf70de6f3bd904cad42c309d42a653b0 -e6b0d42d7aa3fa68b5ccdf295e07a77568546305a766bbfd2099aaaa7d645a049e3afd9027b6434dccef5073fcd3d293fa5652caf4d3fffac8dcf43ffeef857a -b1dded3ef9e34d73d68b7fbd720f05994e8ae7e14234ad5f0f561dd1c9e9895929640ef66c4ef16c2dc4c8e6063377a888ec3d78f4515be7cf40ac15cf43c89d -6c029b467dfea74f7efcdf7faa294aa9daa49ffcf1a67a7db0bf7ff33f3f900e93bedbf78cb5f9694d9ae71862fe789368b432f2bc0815d66f7686c1a9ea0cda -5cfc0dc55acbec51fa9b3b6a9438e3998a316a94f2a99a6886a2dbdd4ebbd5c39c7d4933e9450a900aabd551b664e85031fad42be696a988344da33ae6eb045f -99d45567c8a349e7ec95bf729992d75746b6d1a849860e958eb251b79d53084165a66264fa6fb6675f3dfe4195997ef9d9a722f2c3dfff11ffcc92b20a4c3349 -a64638b1ab8494647f3638ff99e0b9fb2791a9384d4ddf6ccfbebdf7b9887cf7b71fe5a202eadde6d621d3c571efbd10b172c72e0be73f137aeffb84326d6fb7 -af1cfad5e31fc4191cda8a4c4dac7afc565efceb15328da1ab1e89741ec024f08e4f2253713b417d7bef815c38542e0fc1f7f99f3ef9e1efff908eee4f56c929 -91697254ceee9a9471f5012c629adf8f5eeb5ca65fdffb6f11f9e6f1179bcbada35499e9b7f73ed7ed4c3fffd3bb61a848f367439bd49dbec8f14012f8214cce -e8e6f732d0a7ed32159107f7be3797d391a988a87a27852732d558c342b7824c07c1cd06d04bccfd3d2238bdb4cac3c7772fa6bf1bd25447a6a64f75a37dab3b -69597d49a5649f421d50ae3d05f1b7f568998ab48d75d23a7094bf6f7e8c4c671e13baf4e0144a87c7644d41aa1b3a5985feb9f936ffb16b4e6790e9cc61a962 -25326538285809696fe574ada39a57fb9b0f76cda9cc12992e28d38a59f039cf00733245449448a6cd8b7dd997da652a650e0e1ddef90a994e075d243261badb -37a94c672c335d36322dcea78120d329e03466c2d4776d92d6513d83edebeea416e6905179caf4f8fad1cb5f2fc57475179b2253a892d9eed7d8d651fef1a175 -eb286b3cd31223532941a631cf1c47a6501933dfa9d3ca542a4af3a50499c660c954f0e98c70aad3b2c83d8a4c07b006990ac12994cc8277672a99aa6253645a -3664fa502e8bdf97f13215a30e6a1532957a7d8a4ca14432b91d4754e8af57a6527b708a4ca12caef42f322b431f06e52ebf13d9753d06ca7aa09e7a06d4bb6d -5d3c654fb3dded7a1f0035e7a3f42c967d18d4d40f413b7d7dea56430164489ef1ccd04cdf33d6099169d950a1ef8167316542ce375f9a3a28645a0154e8b7c2 -49c884fc6fbb20997e7defa93bf1623cd3d5c9546af7293285ac28e56eeb91e9c3c7773ae6ac3132957504a7c8143221b72a263f432ba0dc5556540125d3d741 -4d5dcbe4873a28c88412c395f8d651cb44a672393875c725990822d356a8b38254147d6f8dabd05f4ca69241b1293255e050484859497d2b914d4de74ef32583 -a6a6b50ebc6fa6f9bd4bce7244b00aaa094ed247a672119c4e1499ca12cfd4d3ac21384db518809fca6ea3643215112bd3af2fcd9714328d1978740a02eb9a5a -177327e25908a1328d2a12c8543a8a4d9169fe8c0b45dd42d5fc6bffe9c59409b5dc3a2d44ca543c7550c8344f624251295040c51d70ad947cd3187c7def993b -f1e1e3dbc35b470de89e1f29d3e7bfbc6c3d02641a434c28ea9f02d045b1b7cb651e3ebeddb7c854ada3befcec53b5c4777ffb51ea8a4ca5289f868baf55b5ee -44623d08a49cbb240d03647a2637afc98bcbcbb7c8543d4defdb7b9f2b9f0e92a9e4dda3544a0b4e111f2cc2de83471f2d7d0c4b31d44dd6f2fb22b2938dc881 -5c44a6fa39cf4aa6d6d349cfb7d2e6c490d651b2a84fc52bd3ac2aeb4770f8fea15bb984943321ff029642c28c49489fe68f8b4ca5a84cbf94c8742896497128 -84b3e668d484c87418964c4b8f46c50979d0683ee41f8da2518b416e5abb4ce5c2a7156814b2257f8d569aa18da7592acd97022bf445aaed9e0f100ed1681703 -c4742637af89d5087464642a6dc1691191e9f17502d2b959492fa6fca35134ea679932532950a67af8d45aeba06029f2d76825977c772fa64886d5e69fc9f135 -79119fe64bb1edf6a5f60a7d0017a2d1704637da578446a6125007956164da35983f3e8548f28f46d1e850664af3259d4c65169ffa9f89824c613468b456a264 -7a707073bb7d559f4c7b9f2e854c6104f96b348beb5a956c5a45995671678a82ce84c48ec27770f0816c5ff596996e361bf5d8925483ed0bc5a600a9c9fa8ace -4c9d2e2365baddbe109183839b22824c014a67f96bb9b592bd28b293a950a10f3023cb5fc52ae45ca14c55a3fd5e992af4e0d052d1582752e6c0a60016595fbc -79178fb63240a6d7e4c599dc1411bf4ccd91f665c860fb528e4c85e074142be9c5943ff95eb6fe1aa7bc0995e9450b5331235345eb48fb32fcc92532a34c5ffe -7ad25b59ef07990e02636642a9176c8855978e5e0747a6bd3da08a90693cc814caa2d44b756945863334320d7d06942053803cc8f422b55a921695d1b732d503 -f5647a990a7550005e32bd361f3ebefdf5bd67a63dcb093f3d44c9f44c0eafc9cbf9652a04a7005ee80cba14e9fbe66bde3bb876be4eea51f82440a691b54c21 -20d355416750e862b1345f0aef042544a690195c89cb824cc7834c2113b80673a02a994e9dd15b5007058bc3a5970f55c9747e084e6129b8e872636e994a2d03 -47299029cc0f975b9ecc27d3ca068e52205398132eb49cc94ba65254bb7d41a630175c62f953aa4c258fe01499c2d470719502328d820a7d980eaea9b29850a6 -6aa47d1932d8be94265321388509a03368b94cd29d74f4034a25a7679406824c8b20ffcea057963e00184d73116c8e5b7e27b2db97665f7e13d96ee4cd46de6c -64fbd5e31fd4c34bbefcecd32f3ffbb4699af3d6514d73d6bc5bbd699a3b1fde32ff44e4d68de3ed6e77ebc671ebeecde9bba6d935cdf1f5236b99e3eb47faaf -eb63e85921cb78a68848f3fbbb645f448e0e3b3708e0819fe3d24999e68bc8467622fb81cfd47bf2d3337122d3a73f3fdfee768191e9ae69ba3a41450e7162ae -ee11ae90e6433444a37590323215d90d8d4c1be3ad8a4c5558aa2250330eb526deba71ac2253cfb19af1a9f9df9c1bfec9ad68576f50c954fdd761e9d1e191fa -d36f85a0151cf809ae8959235311b9fbf1f920b04f7e7ad65c56e19d0f6f3dfdf9b9380e7dfecb4bfd42bf15a3a9a98515545a8f7bd2afddd0552fa9ffb76ecd -5df7e8f0fcedd1e1d1c9e9899ea85e9b13011468b43ee693e9b77f7d6265f44aa6a6529ffefcfcce87b75485be96a6071d272a976903b63234eb6fdd9ab911ad -542b2cd5e0507041a3b532b94cbffacb5db930e699bb3d91a669dcd651bd65a6667cbabfd984177186d0bb352bda552f2836053f5c207533a14ce5a2a9e9777f -fb51879f679773f3a66974e2afd0ddf3433033fd110ef53cf079d0d69adfe5f83ab93c744215d31a98a4024a44cc0aa8f3352feaa09efcf4eceec7b7ef7e7c5b -d5e6374ed1a7f26957eb28cdf35f5eaa1a212bf51ef271dea1c4ea6f03a0137fbdb05adeac830230a1f9fdaa18d1e8ddd7685f64bf9103711aedcbe5c7406999 -4a2dedf6854c7f46f26f7e8f4657c81c325525a70aedd0779b43a6100c1a856c994aa69a110f2815640a0ef96b94ef7fb50cad7d725769af80d2321d31d8be14 -38d689d00f6af5f0cdaf9cb9655aebc051824c570cdf3908324d08039bae10be6ad02497e976233b997d7c68c9c9a7c8740df02583454299ca4eb67ac66c3295 -fc8253645a377cbdd00a324d0932ad1bbe58f0804c53824c6b25bbaff4eb7bcf44e4e1e3dbd6141335f7eb7bcfdcc5cc299008649a92f03a28abbde4e9eb5377 -a29e6ecdd2133dd32115d969b415bf5561169069627a8353d38ffab5e547cba15ab57a56d77448485e4393684506ba72e8f210cdd0514edc55f440278dc8563f -064acf7eb33d533e0d1c6c5fb1ddedc2c78eea1d6f7f4eace741b974f5e1f184a59628bba6432af2d2a8883c7c7c7b5c624e3a3f23b9c8d4f269ad32edd29f39 -1d452e4819493dc166962c9fe64b5ba6af4d5a56bb7de94ef3cdc43c84fc3ba15746461ab55c69d620e93a2571a2cecc0d3bf4f00a8ca93395a994d9094a9c3a -a8d69aa5de4c9fe0744e32d2a8c2e39d878f6f5b73f5946ced93ed81a5a61e994a663eedaa8372453934688554e45536aa0a4675f168ab52330f3fd7cdf265a6 -524b1dd4077f388f2b9bdf8392748f43f5ea24fb139151346a056ead719c3b7135e15e41d410994a0699be36a988bcfaf7a918916957c8e936113d7d7daada39 -f957841818b6192625e1e0d0a2c687d63255e8c1a165b2f1a1259b345fb1b67e50f907d12bfb42606e668a4cc5191fbab2c8d4844ea5b9c157013330b94c65fa -c1f6254b990a3ecd80bcbe01b7223e7095d625dd4ef743fbe09bc7a397a42fff58169069f53d4a85e03403323af7968f32a991d76d062c7bc25890e92420d305 -c9abc1d35026ed83df1a8a8edb2f384cde344ad6d73d5f027ae8c31464a451b3ad68b89e16ef834f881a01329d04643a33196934b7108fd1f9e6a22a99e6e353 -25537c3a037915a50c3297a70ffea0b5fc47d2b500624d4d2565a642b1e9fa28fed40ed299db07df6fde2eade7df97bf587297a95007050e659f544b73c92bd3 -f506893de72523990a15fad0475ea7736868e9791bb856f8218ddb1d4490854c85d651d0077deaa10826ef9b2f46f77c6dcceabbe72b32f7297dea0192305564 -2ab2dfc8817ab5cec854084ea3e1cc4141a494a9c86f2a38ddc80e990a328d807306c59146a622fbfbd220530b643a02ce16144a6d32959c7c8a4c07c17982a2 -a947a6925f708a4c03e10c410534c3abf29169280c6cda0b2706ea604458eaae854c7d109c76c129819a5858a6527bf77c41a66d6434c2134022460c192522cd -991c1b6f7717ada39a7df94d642bb2dbc89b8d6cf512eea85132c1c05192df407cc2587c979949a3dfdcff67f8dbd9f0ec77a94382740c96e93579d13a049f20 -d30e90a9628168f49bfbff7cf0e8233c05b33032328d94e9d0214dcb1d225a18d874b6b251e5cdd6fefb7aba16ab5ecc9a62fad7b38cb953775fe6f174eddd33 -6bdcc787a599b5cc54868fc227e5b7db9715179be6f2894dc96a5d5a53dc17adcbb8537a773168d674270126662699cad8214d059996c9dc9fd5949dab3973c9 -d6c43fc66266246b6dc75fc840f9435dd42953c9cca7ab9269469fd2529b150626dc851b54faf745045a23d9c954681d552cf35531b9e1675781a9a71e3fc6a7 -6ee9a767991173a14066aa80928067ea49ed15fa15d741e5f23361aacdccfadd59661593bbd6a05dc8451cdaba2f6b56c82ea04c328a4ca5de76fb526f705ad2 -e8f7d4f0c0f48cf34ecb48fb723ed8be72e825992ae6196c5ff293a9225ca68c7e0f501644a6335153645a52340a302f44a633e19729d12840b91099ce44e991 -69b1070e3013c87426ca1dd8b4b4e30558866a652ab9fab42099ce3d3489d99c48fdc56cc47ceb6eaa75e3d67e43d6d2ab0c5a2b8490b55235564ddee87595ad -682b6c672a59363595a2868f9a55f8493aaabbbde9dded4bb7433dfdf45bd76aed989faa5e6eb6fa3dcf4983e11413994a45997ececc178d06dec3a9fa2c4d84 -35e6931b507be256f7b5feefc6e6815b1e1ddd5b07e03f0cff81ad95e523d3de51f8a48a4e50f9b34cf183a76b900e9a46844ed6ba8177bb7f2d77683e8d19cf -5a53a4238cedfa509ef1a53c5b8e8ceeddb5ac0dfa1708d9c50a583232159129c63a915c23d36c5946a3fedb3e6470d218cf0e3d5a531c5d12ec2a366d3dcef0 -23f76cd93c18cfe055d27dd2acf10d5a0fa0eb748d3b93f532914cb71bd9894823efe97590698694531976c1d0bbd70a7b478f1ad5353a54eb625310b25fcfcf -cf143b85cb2497a9ec64abe721d36cc951a35df96fc894d671a43ccb77add5bb8ab58c674573e34383e8de8a32cfbe7a171e84bbd9a15b580dc874756457361a -99b68fde6fc82ae224c23a95b65e846fdfbfd3c02da7da6fef665b8f07dac851a692a8a92932b598b54f7d722d029440f2bef9a2bae79b3255b87df3a5fceef9 -1ffc21f73ef5b336bf27848155927fed44490000028549444154b469d4e6705f1a91adc876236f36f2c65c27e469cfd2d13a6a5cd3285a4709233c01cc4b8ac8 -74735344a479151899caf40347c994c169fed1688e554c00f592a2ccb4792122b2b9b92f4aa6be325399a57bbeacbbd8148d02cc4f529936afa4bb024a661ceb -44d62a53340ab014e964da579b2fc8744ad028c0b2ccd7344a90e934a051801c2849a64253d3cbecbd7dfb76e96300002898b9876d0600a80c340a0010051a05 -0088028d02004481460100a240a3000051a051008028d028004014681400200a340a0010051a050088028d02004481460100a240a3000051a051008028d02800 -4014681400200a340a0010051a050088028d02004451de9341f7f6f6ba66bd7dfb766f2fc143faba369264e3911b4c786cad67d2da48e4474e7ec60032a43c8d -9ab725776924eed9b34e29a717a017927ab8848ae8973e0a8092282f1a0dc114819ba5b64e8fd94b6b4c37f4003cab0c3d2a5385233665968d58c169eb4186ef -d1b3bafb11861e36c05254a851f7ce6fbd631396fa79f6e83f809055d21e5b0c912736ed6704c8870a35da7573baa57e9e3bd99fd87a36e5dfa6bbd6a08f1048 -f8c74cb817ff1e9126544c851a4d42573c3568450a19359ed3626917e14271ac4ba309bde6d994554a18285fb7dcd0d5cdb8434d45eb418633e2b40014c1ba34 -9ad0448199fbb80daa8d2cee4d97d1859b810be35628915537789a27382d8ef9d3eac8a60500cbb2228d5a39698c2cc2376565c1d65aadaf07edbaf500623ee6 -b86ab7a17bace957076075497daaa8a76b536e0162d7dbaed7bdc7e69ad45a3efc63ba3af32cef39c8de3dfa4f8b9e42280a25c2855b1bf3cb28d51ed12814ca8a927ac8191c0ae5b2aea41e324465f73814ca85100000208aff07556f6e4884a3c3010000000049454e44ae426082}}{\nonshppict -{\pict\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0\picw11904\pich9259\picwgoal6749\pichgoal5249\wmetafile8\bliptag-1901124716\blipupi96{\*\blipuid 8eaf23940da765ef1ff58d6d032b7b73} -0100090000037e9c030000005a9c030000000400000003010800050000000b0200000000050000000c025e01c201050000000701040000005a9c0300430f2000 -cc0000005e01c201000000005e01c2010000000028000000c20100005e010000010018000000000070380700c40e0000c40e00000000000000000000ffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff000000 -ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffff -ffffffffffffffff000000ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff000000000000000000000000ffffff0000 -00ffffffffffffffffffffffff000000000000000000ffffff000000ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffffffffffffffffffffff000000ffffff000000000000000000ffffffff -ffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000ffffffffffffffffffffffffffffff000000ffff -ffffffffffffffffffff000000000000000000000000ffffffffffffffffff000000ffffff000000000000000000ffffffffffffffffffffffff000000ffffff -ffffffffffff000000000000000000000000ffffff000000ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff000000ffffffffffffffffffff -ffffffffff000000ffffffffffffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff -ffffffffffffffffffffffffffffffff000000ffffffffffffffffff000000ffffffffffffffffff000000ffffffffffffffffff000000ffffffffffffffffff -ffffff000000000000ffffffffffffffffff000000ffffffffffffffffff000000000000ffffffffffff000000ffffffffffffffffffffffff000000ffffffff -ffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff000000ffffffffffffffffff000000000000ffffffffff -ffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff -ffffff000000ffffffffffffffffff000000ffffffffffffffffffffffff000000ffffffffffff000000000000ffffffffffffffffff000000ffffffffffffff -ffff000000ffffffffffff000000ffffffffffffffffffffffff000000000000ffffffffffffffffffffffff000000ffffff000000ffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff000000ffff -ffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff -000000ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffffffffffffffffffffff000000ffffffffffff000000ff -ffffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffff -ff000000ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff000000 -ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff00 -0000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffffffffffffffffffff -ff000000ffffffffffff000000ffffffffffff000000ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff000000ffffff000000ffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff -ffffff000000ffffffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffffffffffffffffffffffffffffffff -ffffffff000000ffffffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff -ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff000000ff -ffffffffff000000ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffff -ffffffffffffffffffff000000ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffff -ffffffffffffffffff000000ffffffffffff000000ffffffffffff000000ffffffffffffffffffffffffffffff000000ffffffffffffffffff000000ffffffff -ffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffff -ffffffffffffffffffffff000000ffffffffffffffffffffffffffffff000000ffffffffffff000000000000000000000000000000000000000000ffffffffff -ffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff000000000000000000000000000000 -000000000000ffffffffffffffffff000000000000000000ffffffffffff000000ffffffffffff000000ffffffffffffffffffffffffffffff000000ffffffff -ffffffffff000000000000000000000000ffffffffffff000000000000000000000000000000ffffffffffff000000ffffffffffffffffffffffffffffffffff -ffffffff000000ffffffffffff000000ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff -ffffffffffffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff00 -0000ffffffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000000000000000ffffffffffff000000ffffffffffffffff -ff000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff000000ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffffffffffffffffffffff -000000ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff000000ffffffff -ffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff000000ffffffffffffffffffffffffffff -ff000000ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff -ffffffffffffffffffffffff000000ffffffffffff000000ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff00 -0000ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffffffff -ffffffffffffff000000ffffffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffffffffffffffffffffffffffff000000000000000000 -ffffffffffffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffff000000ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffffff -ffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000ffffffffff -ff000000ffffffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffff -ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ff -ffffffffffffffffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffff -ffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff -ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffff000000ffffffffffffffffffff -ffffffffff000000ffffffffffff000000ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff000000ffffffffffffffff -ff000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff -000000ffffffffffffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffff000000ffffffffffffffffffffffff000000ffffffffffffff -ffff000000ffffffffffffffffff000000000000ffffffffffff000000ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffff -ffffffff000000ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff000000000000ffffffffffffffffff000000ffffffffffffffffff -ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff00 -0000ffffffffffffffffffffffff000000ffffffffffff000000000000ffffffffffffffffff000000ffffffffffffffffff000000ffffffffffffffffff0000 -00ffffffffffffffffffffffff000000ffffffffffff000000ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff000000ffffff000000000000000000000000ffffff -ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffff -ffffffffffffffff000000ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff000000000000000000000000ffff -ffffffffffffffffffffffffff000000000000000000ffffff000000ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff -ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff000000ffffff000000000000000000ffffffff -ffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff000000ffff -ffffffffffffffffffff000000000000000000000000ffffffffffffffffff000000ffffff000000000000000000ffffffffffffffffffffffff000000ffffff -ffffffffffffffffff000000000000000000000000ffffffffffffffffff000000ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff000000ffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff -ffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff000000ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -000000ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff000000ff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000 -ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff000000ff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000 -00000000ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284529284529284529284529284529284 -5292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a92846392846392846392846b -927b6b927b7b927b7b927b949273949273949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2 -a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bd -c6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a928452928452928452928452928452 -92845292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a92846392846392846392 -846b927b6b927b7b927b7b927b949273949273949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5 -b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6 -c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92845292845292845292845292 -845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a9284639284639284 -6392846b927b6b927b7b927b7b927b949273949273949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5 -b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3 -bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284529284529284529284 -5292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a92849c9a8463 -92846392846b927b6b927b7b927b7b927b949273949273949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2 -a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bd -c6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a928452928452928452 -92845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a92849c9a -849c9a846392846b927b6b927b7b927b7b927b949273949273949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5 -b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6 -c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92845292845292 -845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a9284 -9c9a849c9a846392846b927b6b927b7b927b7b927b949273949273949273949273949273949273a5a28ca5a28ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5 -b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3 -bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92840000004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284529284 -5292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a -92846392849c9a846392846b927b6b927b7b927b7b927b949273949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94adaa94adaa94b5b2 -a5b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bd -c6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92840000004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a928452 -92845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92 -845a92846392846392846392846b927b6b927b7b927b7b927b949273949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94adaa94adaa94 -b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6 -c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92840000004a92844a92844a92844a92840000000000000000004a92844a92844a92844a92844a92840000004a92844a92844a9284 -0000004a92844a92844a92844a92840000004a92844a92844a92844a92844a92840000004a92840000004a92840000004a92844a92840000004a92844a928400 -00004a92844a92844a92844a92844a92844a92840000000000000000004a92844a92840000004a92844a92840000004a92844a92840000004a92844a92844a92 -844a92844a92840000000000000000000000004a92844a92840000004a92844a92840000000000004a92840000004a92844a92840000000000000000004a9284 -4a92844a92844a92840000004a92844a92844a92840000004a92844a92844a92840000004a92840000004a92844a92844a92840000004a92844a928400000000 -00004a92840000004a92844a92840000000000000000004a92844a92840000004a92844a92844a92844a92840000000000000000004a92844a92844a92844a92 -844a92840000004a92844a92844a92844a92844a92840000004a92840000004a92844a92844a92840000004a92844a92840000004a92844a92840000004a9284 -4a92840000000000000000004a92844a92844a92840000000000004a92840000004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a9284 -5a92845a92846392846392846392846b927b6b927b7b927b7b927b949273949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94adaa94ad -aa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3 -bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92840000004a92844a92844a92840000004a92844a92844a92840000004a92844a92844a92844a92844a928400 -00004a92840000004a92844a92844a92844a92844a92840000004a92844a92844a92844a92844a92840000004a92840000004a92840000004a92844a92840000 -004a92844a92840000004a92844a92844a92844a92844a92840000004a92844a92844a92840000004a92840000004a92844a92840000004a92844a9284000000 -4a92844a92844a92844a92840000004a92844a92844a92844a92840000004a92840000004a92840000004a92844a92840000000000004a92840000004a92844a -92844a92840000004a92844a92844a92840000004a92844a92844a92840000004a92844a92844a92840000004a92840000004a92844a92844a92840000004a92 -840000004a92844a92840000000000004a92840000004a92844a92844a92840000004a92840000004a92844a92844a92840000004a92844a92844a9284000000 -4a92844a92844a92844a92840000004a92844a92844a92844a92844a92840000004a92840000004a92844a92844a92840000004a92844a92840000004a92844a -92840000004a92840000004a92844a92844a92840000004a92840000004a92844a92840000000000004a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a -92845a92845a92846392846392846392846b927b6b927b7b927b7b927b949273949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94adaa -94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bd -c6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92840000004a92844a92844a92840000004a92844a92844a92840000004a92844a92844a92 -844a92844a92844a92840000004a92844a92844a92844a92844a92844a92844a92840000000000000000000000000000004a92844a92840000004a9284000000 -4a92840000004a92840000004a92840000004a92840000000000000000004a92844a92844a92844a92844a92840000004a92840000004a92840000004a928400 -00004a92840000004a92844a92844a92844a92844a92844a92844a92844a92844a92840000004a92840000004a92840000004a92844a92844a92840000004a92 -840000004a92844a92844a92844a92844a92844a92840000004a92840000004a92840000004a92840000004a92844a92840000004a92840000004a92844a9284 -4a92840000004a92840000004a92844a92844a92840000004a92840000004a92844a92844a92844a92844a92840000004a92844a92844a92844a92844a92844a -92840000004a92844a92844a92844a92844a92844a92840000000000000000000000000000004a92844a92840000004a92844a92844a92840000004a92844a92 -840000004a92844a92840000004a92840000004a92844a92844a92844a92844a92840000004a92844a92844a92840000004a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92 -845a92845a92845a92846392846392846392846b927b6b927b7b927b7b927b949273949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94 -adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6 -c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92840000004a92844a92844a92840000004a92844a92844a9284000000 -4a92844a92844a92844a92844a92844a92840000004a92844a92844a92844a92844a92844a92844a92840000004a92844a92844a92840000004a92844a928400 -00004a92840000004a92840000004a92840000004a92840000004a92844a92844a92844a92844a92844a92840000000000000000000000004a92840000004a92 -840000004a92840000004a92840000004a92844a92844a92844a92844a92844a92844a92840000000000004a92844a92840000004a92840000004a92844a9284 -4a92840000004a92840000000000000000000000000000004a92844a92840000004a92840000004a92840000004a92840000004a92844a92840000004a928400 -00004a92844a92844a92840000004a92840000004a92844a92844a92840000004a92840000000000000000000000000000004a92840000004a92844a92844a92 -844a92840000000000004a92844a92844a92844a92844a92844a92844a92840000004a92844a92844a92840000004a92844a92840000004a92844a92844a9284 -0000004a92844a92840000004a92844a92840000004a92840000000000000000000000000000004a92840000004a92844a92844a92840000004a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a9284 -5a92845a92845a92845a92846392846392846392846b927b6b927b7b927b7b927b949273949273949273949273949273949273a5a28ca5a28ca5a28cadaa94ad -aa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3 -bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92840000004a92844a92844a92844a928400000000 -00000000004a92844a92844a92844a92844a92844a92840000004a92840000004a92844a92844a92844a92844a92844a92844a92840000004a92840000004a92 -844a92844a92840000004a92840000004a92840000004a92840000004a92840000004a92844a92844a92844a92844a92840000004a92844a92844a9284000000 -4a92840000004a92840000004a92840000004a92840000004a92844a92844a92844a92844a92840000000000004a92844a92844a92844a92840000004a928400 -00004a92844a92840000000000004a92840000004a92844a92844a92840000004a92840000004a92844a92840000004a92840000004a92844a92840000004a92 -840000004a92840000004a92844a92844a92840000004a92840000004a92844a92840000000000004a92840000004a92844a92844a92840000004a9284000000 -0000004a92844a92840000004a92844a92844a92840000004a92844a92844a92844a92844a92844a92840000004a92840000004a92844a92844a928400000000 -00004a92844a92840000000000004a92840000004a92844a92840000004a92840000004a92844a92844a92840000004a92840000004a92844a92840000000000 -004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a -92845a92845a92845a92845a92846392846392846392846b927b7b927b7b927b84927b949273949273949273949273949273949273a5a28ca5a28ca5a28cadaa -94adaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bd -c6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92840000004a92844a92844a92 -840000004a92844a92844a92840000004a92844a92844a92844a92840000004a92844a92844a92840000004a92844a92844a92844a92844a92844a9284000000 -4a92840000004a92844a92844a92840000004a92840000000000004a92844a92844a92840000000000004a92844a92844a92844a92844a92840000004a92844a -92844a92840000004a92840000000000004a92844a92844a92840000000000004a92844a92844a92844a92840000004a92844a92844a92844a92844a92844a92 -840000004a92844a92840000000000004a92840000004a92844a92840000000000000000004a92844a92840000004a92844a92844a92840000004a92844a9284 -4a92840000004a92840000004a92840000000000000000000000004a92844a92844a92840000000000004a92840000004a92844a92840000000000000000004a -92844a92840000004a92840000004a92844a92840000000000000000004a92844a92844a92844a92844a92844a92844a92840000004a92840000004a92844a92 -844a92840000004a92840000004a92840000004a92840000000000000000000000004a92844a92844a92840000000000000000004a92844a92844a9284000000 -0000004a92840000004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292 -845a92845a92845a92845a92845a92846392846392846392846b927b7b927b7b927b84927b949273949273949273949273949273949273a5a28ca5a28ca5a28c -adaa94adaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6 -c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -0000004a92844a92840000004a92844a92844a92840000004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92840000004a92840000004a92844a92844a92840000004a92840000000000004a92844a92844a92840000000000004a92844a92844a92844a92844a92 -840000004a92844a92844a92840000004a92840000000000004a92844a92844a92840000000000004a92844a92844a92844a92840000004a92844a92844a9284 -4a92840000004a92844a92844a92844a92844a92844a92844a92840000004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92840000004a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92840000004a9284 -0000004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92840000004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a9284529284529284529284529284529284529284529284529284529284529284529284529284529284529284529284529284529284 -5292845a92845a92845a92845a92845a92846392846392846392846b927b7b927b7b927b84927b949273949273949273949273949273949273a5a28ca5a28ca5 -a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3 -bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92840000004a92844a92840000000000000000004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92840000004a92844a92844a92844a92840000004a92840000004a92844a92844a92844a92844a92840000004a92844a9284 -4a92844a92844a92844a92840000000000000000004a92844a92840000004a92844a92844a92844a92844a92840000004a92844a92844a92844a92844a928400 -00000000000000000000004a92844a92840000004a92844a92844a92844a92844a92840000004a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92840000004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284000000 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92840000004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92840000004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a928452928452928452928452928452928452928452928452928452928452928452928452928452928452928452928452928452 -92845292845a92845a92845a92845a92845a92846392846392846392846b927b7b927b7b927b84927b949273949273949273949273949273949273a5a28ca5a2 -8ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bd -c6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfce -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292 -845292845292845a92845a92845a92845a92845a92846392846392846392846b927b7b927b7b927b84927b949273949273949273949273949273949273a5a28c -a5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6 -c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a9284529284529284529284529284529284529284529284529284529284529284529284529284529284529284529284 -5292845292845292845a92845a92845a92845a92845a92846392846392846392846b927b7b927b7b927b84927b949273949273949273949273949273949273a5 -a28ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3 -bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a928452928452928452928452928452928452928452928452928452928452928452928452928452928452928452 -92845292845292845292845a92845a92845a92845a92845a92846392846392846392846b927b7b927b7b927b84927b9492739492739492739492739492739492 -73a5a28ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bd -c6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92845292845292845292845292845292845292845292845292845292845292845292845292845292845292 -845292845292845292845292845a92845a92845a92845a92845a92846392846392846392846b927b7b927b7b927b84927b949273949273949273949273949273 -949273a5a28ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6 -c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92840000004a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a9284529284529284529284529284529284529284529284529284529284529284529284529284529284 -5292845292845292845292845292845a92845a92845a92845a92845a92846392846392846392846b927b7b927b7b927b84927b94927394927394927394927394 -9273949273a5a28ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3 -bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92840000004a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a928452928452928452928452928452928452928452928452928452928452928452928452928452 -92845292845292845292845292845292845a92845a92845a92845a92845a92846392846392846392846b927b7b927b7b927b84927b9492739492739492739492 -73949273949273a5a28ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaad -c6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -0000004a92844a92844a92844a92844a92840000004a92844a92844a92840000000000000000004a92844a92844a92840000000000004a92840000004a928400 -00004a92840000000000004a92844a92844a92840000000000000000004a92844a92840000004a92844a92844a92840000004a92844a92844a92844a92844a92 -840000000000000000004a92844a92840000000000004a92844a92840000000000004a92840000004a92840000000000004a92844a9284000000000000000000 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92845292845292845292845292845292845292845292845292845292845292845292845292 -845292845292845292845292845292845292845a92845a92845a92845a92845a92846392846392846392846b927b7b927b7b927b84927b949273949273949273 -949273949273949273a5a28ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbd -baadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92840000004a92844a92844a92844a92844a92840000004a92844a92840000004a92844a92844a92840000004a92840000004a92844a92840000 -000000004a92840000000000004a92844a92840000004a92840000004a92844a92844a92840000004a92840000004a92844a92844a92840000004a92844a9284 -4a92844a92840000004a92844a92844a92840000004a92840000004a92844a92840000004a92844a92840000000000004a92840000004a92844a92840000004a -92844a92844a92840000004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284529284529284529284529284529284529284529284529284529284529284529284 -5292845292845292845292845292845292845292845a92845a92845a92845a92845a92846392846392846392846b927b7b927b7b927b84927b94927394927394 -9273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdba -adbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92840000004a92840000004a92844a92844a92840000004a92840000004a92840000004a92844a92844a92844a92844a9284000000 -4a92844a92844a92840000004a92840000004a92844a92844a92840000004a92840000004a92844a92844a92840000004a92840000004a92844a92844a928400 -00004a92844a92844a92844a92844a92844a92844a92840000004a92844a92840000004a92844a92840000004a92844a92844a92840000004a92840000004a92 -844a92840000004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a928452928452928452928452928452928452928452928452928452928452928452 -92845292845292845292845292845292845292845292845a92845a92845a92845a92845a92846392846392846392846b927b7b927b7b927b84927b9492739492 -73949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaad -bdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92840000004a92840000004a92844a92844a92840000004a92840000004a928400000000000000000000000000 -00004a92844a92840000000000000000000000004a92840000004a92844a92844a92840000004a92840000004a92844a92844a92840000004a92840000004a92 -844a92844a92840000004a92844a92844a92844a92844a92840000000000004a92844a92844a92840000004a92844a92844a9284000000000000000000000000 -4a92840000004a92844a92840000000000000000000000000000004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92845292845292845292845292845292845292845292845292845292845292 -845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a92846392846392846392846b927b7b927b7b927b84927b949273 -949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbd -baadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92840000004a92844a92840000004a92840000004a92844a92840000004a92840000004a92 -844a92844a92840000004a92840000004a92844a92844a92840000004a92840000000000004a92844a92840000004a92840000004a92844a92844a9284000000 -4a92840000004a92844a92844a92840000004a92844a92844a92844a92840000004a92844a92844a92840000004a92840000004a92844a92840000004a92844a -92844a92840000004a92840000004a92844a92840000004a92844a92844a92840000004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284529284529284529284529284529284529284529284529284529284 -5292845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a92846392846392846392846b927b7b927b7b927b84927b94 -9273949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdba -adbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92840000004a92844a92840000004a92840000004a92844a9284000000 -4a92844a92840000000000000000004a92844a92844a92840000000000000000004a92844a92840000004a92840000000000004a92844a92844a928400000000 -00000000004a92844a92840000000000000000000000004a92844a92844a92844a92844a92844a92840000000000000000004a92840000000000000000004a92 -844a92840000000000000000004a92840000000000000000004a92844a92840000000000000000004a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a928452928452928452928452928452928452928452928452928452 -92845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a92846392846392846392846b927b7b927b7b927b8492 -7b949273949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaad -bdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92840000004a92844a92844a92840000004a92840000004a -92844a92844a92840000004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -0000004a92844a92844a92844a92844a92844a92844a92844a92840000004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92845292845292845292845292845292845292845292845292 -845292845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a92846392846392846392846b927b7b927b7b927b -84927b949273949273949273949273949273a5a28ca5a28ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbd -baadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92840000004a92844a92844a92844a92 -840000004a92844a92844a92844a92840000004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92840000004a92844a92844a92844a92844a92844a92844a92844a92840000004a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284529284529284529284529284529284529284529284 -5292845292845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a92846392846392846392846b927b7b927b7b -927b84927b949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdba -adbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a928452928452928452928452928452928452928452 -92845292845292845292845292845292845292845292845292845292845292849492735a92845a92845a92845a92845a92846392846392846392846b927b7b92 -7b7b927b84927b949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaad -bdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92845292845292845292845292845292845292 -845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a92846392846392846392846b927b -7b927b7b927b84927b949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbd -baadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3 -bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284529284529284529284529284529284 -5292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a92846392846392846392846b -927b7b927b7b927b84927b949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdba -adbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bd -c6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a928452928452928452928452928452 -92845292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a92846392846392846392 -846b927b7b927b7b927b84927b949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5 -bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6 -c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92845292845292845292 -845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a9284639284639284 -6392846b927b7b927b7b927b84927b949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5b5 -b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3 -bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284529284529284 -5292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a928463928463 -92846392846b927b7b927b7b927b84927b949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2 -a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bd -c6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a928452928452 -92845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a92846392 -846392846392846b927b7b927b7b927b84927b949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5 -b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6 -c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92845292 -845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a9284 -6392846392846392846b927b7b927b7b927b84927b949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5 -b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3 -bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -5292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a -92846392846392846b927b6b927b7b927b7b927b84927b949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2 -a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bd -c6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92 -845a92846392846392846b927b6b927b7b927b7b927b949273949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5 -b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6 -c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284ffffffffffffffffffffffffffffffffffff -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284ff -ffff4a92844a92844a92844a9284ffffff4a92844a92844a92844a92844a9284ffffff4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -84ffffffffffffffffffffffff4a92844a92844a9284ffffff4a92844a92844a92844a92844a9284ffffff4a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a9284 -5a92845a92846392846392846b927b6b927b7b927b7b927b949273949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5 -b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3 -bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284ffffff4a92844a92844a -92844a9284ffffff4a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284ffffff4a92844a92844a92844a9284ffffffffffff4a92844a92 -844a92844a9284ffffff4a92844a92844a92844a9284ffffff4a9284ffffffffffff4a92844a9284ffffff4a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a9284ffffff4a92844a9284ffffffffffff4a92844a9284ffffff4a9284ffffffffffff4a92844a9284ffffff4a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a -92845a92845a92846392846392846b927b6b927b7b927b7b927b949273949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94adaa94b5b2 -a5b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bd -c6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284ffff -ff4a92844a92844a92844a9284ffffff4a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284ffffffffffffffffffffffffffffffffffff -4a92844a92844a92844a92844a9284ffffff4a92844a92844a92844a9284ffffff4a9284ffffffffffff4a92844a9284ffffff4a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a9284ffffff4a92844a9284ffffff4a9284ffffffffffff4a92844a9284ffffff4a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92 -845a92845a92845a92846392846392846b927b6b927b7b927b7b927b949273949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94adaa94 -b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6 -c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a9284ffffff4a92844a92844a92844a9284ffffff4a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284ffffffffffff4a92844a -9284ffffffffffff4a92844a92844a92844a92844a9284ffffff4a92844a92844a92844a9284ffffffffffffffffffffffffffffff4a9284ffffffffffffffff -ffffffffffffffffffffffffffffffffffffff4a92844a9284ffffffffffffffffffffffffffffff4a92844a9284ffffffffffffffffffffffffffffff4a9284 -ffffff4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a9284 -5a92845a92845a92845a92846392846392846b927b6b927b7b927b7b927b949273949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94ad -aa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3 -bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a9284ffffffffffffffffffffffffffffffffffff4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -84ffffff4a92844a9284ffffff4a92844a92844a92844a92844a92844a9284ffffff4a92844a92844a92844a9284ffffffffffff4a92844a9284ffffff4a9284 -ffffff4a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284ffffff4a92844a9284ffffffffffff4a92844a9284ffffffffffff4a92844a -9284ffffff4a9284ffffff4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a -92845a92845a92845a92845a92846392846392846b927b6b927b7b927b7b927b949273949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa -94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bd -c6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a9284ffffffffffff4a9284ffffffffffff4a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a9284ffffff4a92844a9284ffffff4a92844a92844a92844a92844a92844a9284ffffff4a92844a92844a92844a9284ffffffffffff4a92844a -9284ffffff4a9284ffffff4a92844a92844a92844a92844a92844a92844a92844a92844a9284ffffffffffff4a92844a92844a9284ffffff4a92844a9284ffff -ffffffff4a92844a9284ffffff4a9284ffffff4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292 -845a92845a92845a92845a92845a92846392846392846b927b6b927b7b927b7b927b949273949273949273949273949273949273a5a28ca5a28ca5a28cadaa94 -adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6 -c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284ffffffffffff4a92844a92844a9284ffffff4a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a9284ffffffffffffffffffffffff4a92844a92844a92844a92844a92844a9284ffffff4a92844a92844a92844a9284ffff -ffffffff4a92844a9284ffffffffffffffffff4a92844a92844a92844a92844a92844a92844a92844a92844a9284ffffffffffff4a92844a92844a9284ffffff -4a92844a9284ffffffffffff4a92844a9284ffffffffffffffffff4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a9284529284529284529284529284529284529284529284529284529284529284529284529284529284529284529284529284 -5292845a92845a92845a92845a92845a92846392846392846b927b6b927b7b927b7b927b949273949273949273949273949273949273a5a28ca5a28ca5a28cad -aa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3 -bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284ffffffffffff4a92844a92844a9284ffffff4a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a9284ffffffffffff4a92844a92844a92844a92844a92844a92844a9284ffffff4a92844a9284 -4a92844a9284ffffff4a92844a92844a92844a9284ffffffffffff4a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284ffffff4a92844a -9284ffffffffffff4a92844a9284ffffff4a92844a92844a92844a9284ffffffffffff4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a928452928452928452928452928452928452928452928452928452928452928452928452928452928452928452928452 -92845292845a92845a92845a92845a92845a92846392846392846b927b6b927b7b927b7b927b949273949273949273949273949273949273a5a28ca5a28ca5a2 -8cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bd -c6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284ffffffffffffffffffffffffffffff -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284ffffffffffff4a92844a92844a92844a92844a92844a92844a9284ff -ffff4a92844a92844a92844a9284ffffff4a92844a92844a92844a9284ffffffffffff4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -84ffffffffffffffffffffffff4a92844a92844a9284ffffff4a92844a92844a92844a9284ffffffffffff4a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292 -845292845292845a92845a92845a92845a92845a92846392846392846b927b6b927b7b927b7b927b949273949273949273949273949273949273a5a28ca5a28c -a5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6 -c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a9284529284529284529284529284529284529284529284529284529284529284529284529284529284529284 -5292845292845292845a92845a92845a92845a92845a92846392846392846b927b6b927b7b927b7b927b949273949273949273949273949273949273a5a28ca5 -a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3 -bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a928452928452928452928452928452928452928452928452928452928452928452928452928452928452 -92845292845292845292845a92845a92845a92845a92845a92846392846392846b927b6b927b7b927b7b927b949273949273949273949273949273949273a5a2 -8ca5a28ca5a28cadaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bd -c6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92845292845292845292845292845292845292845292845292845292845292845292845292845292 -845292845292845292845292845a92845a92845a92845a92845a92846392846392846b927b6b927b7b927b7b927b949273949273949273949273949273a5a28c -a5a28ca5a28ca5a28cadaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6 -c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284ffffff4a92844a92844a92844a92844a92844a92844a9284ffff -ff4a92844a92844a92844a92844a9284ffffff4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a9284529284529284529284529284529284529284529284529284529284529284529284529284 -5292845292845292845292845292845a92845a92845a92845a92845a92846392846392846b927b6b927b7b927b7b927b949273949273949273949273949273a5 -a28ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3 -bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ffffffffffffffffffffffffffffffcecbc6cecbc6cecfcececfcececfcececfcececf -cececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffcecfcececfcececfceffffffffffffffffffffffffcecfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a9284ffffff4a92844a92844a92844a9284ffffffffffff4a9284ffffff4a92844a92844a9284ffffffffffff -4a92844a9284ffffff4a9284ffffffffffff4a92844a9284ffffff4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a928452928452928452928452928452928452928452928452928452928452928452928452 -92845292845292845292845292845292845a92845a92845a92845a92845a92846392846392846b927b6b927b7b927b7b927b9492739492739492739492739492 -73a5a28ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bd -c6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ffffffcecbc6cecbc6cecbc6ffffffffffffcecfcececfcececfce -cecfceffffffcecfcececfcececfcececfcececfceffffffffffffcecfcececfcececfcececfcececfcececfceffffffffffffcecfcececfceffffffffffffce -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284ffffffffffffffffffffffffffffffffffff4a92844a9284ffffff4a92844a92844a -9284ffffff4a92844a92844a9284ffffff4a9284ffffffffffff4a92844a9284ffffff4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92845292845292845292845292845292845292845292845292845292845292845292 -845292845292845292845292845292845292845a92845a92845a92845a92845a92846392846392846b927b6b927b7b927b7b927b949273949273949273949273 -949273a5a28ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6 -c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfceffffffce -cfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfceffffffffffffcecfcececfcececfcececfcececfceffffffcecfcececfcececf -cececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284ffffffffffff4a92844a9284ffffffffffff4a92844a9284ffff -ff4a92844a9284ffffffffffff4a92844a92844a9284ffffffffffffffffffffffffffffff4a9284ffffff4a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284ffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284529284529284529284529284529284529284529284529284529284529284 -5292845292845292845292845292845292845292845a92845a92845a92845a92845a92846392846392846b927b6b927b7b927b7b927b94927394927394927394 -9273949273a5a28ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3 -bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececf -cececfceffffffcecfcececfcececfcececfceffffffffffffcecfcececfcececfcececfcececfcececfceffffffffffffffffffcecfcececfcececfceffffff -cecfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284ffffff4a92844a9284ffffff4a9284 -4a92844a9284ffffffffffffffffffffffffffffffffffff4a92844a9284ffffffffffff4a92844a9284ffffff4a9284ffffff4a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a928452928452928452928452928452928452928452928452928452928452 -92845292845292845292845292845292845292845292845a92845a92845a92845a92845a92846392846392846b927b6b927b7b927b7b927b9492739492739492 -73949273949273a5a28ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaad -c6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfce -cecfcececfceffffffffffffffffffcecfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfceffffffffffffce -cfcececfceffffffcecfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284ffffff4a92844a -9284ffffff4a92844a92844a9284ffffff4a92844a92844a92844a9284ffffff4a92844a9284ffffffffffff4a92844a9284ffffff4a9284ffffff4a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92845292845292845292845292845292845292845292845292845292 -845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a92846392846392846b927b6b927b7b927b7b927b949273949273 -949273949273949273a5a28ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6 -c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcece -cfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececf -cececfceffffffcecfcececfceffffffcecfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -84ffffffffffffffffffffffff4a92844a92844a9284ffffff4a92844a92844a92844a9284ffffff4a92844a9284ffffffffffff4a92844a9284ffffffffffff -ffffff4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284529284529284529284529284529284529284529284529284 -5292845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a92846392846392846b927b6b927b7b927b7b927b94927394 -9273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdba -adc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececf -cececfcececfcececfcececfcececfcececfcececfceffffffffffffcecfcececfcececfcececfcececfcececfceffffffffffffcecfcececfcececfceffffff -cecfcececfcececfcececfceffffffcecfcececfceffffffcecfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a9284ffffffffffff4a92844a92844a92844a9284ffffff4a92844a92844a92844a9284ffffff4a92844a9284ffffff4a92844a92844a -92844a9284ffffffffffff4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a928452928452928452928452928452928452928452928452 -92845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a92846392846392846b927b6b927b7b927b7b927b9492 -73949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaad -bdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfceffffffcecfcece -cfcececfceffffffffffffcecfcececfceffffffffffffcecfcececfceffffffffffffcecfcececfceffffffffffffcecfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a9284ffffffffffff4a92844a92844a92844a9284ffffffffffffffffffffffffffffffffffff4a92844a9284ffff -ff4a92844a92844a92844a9284ffffffffffff4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92845292845292845292845292845292845292845292 -845292845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a92846392846392846b927b6b927b7b927b7b927b -949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbd -baadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffcecfcececfceffffffffffffffffffffff -ffffffffffffffcecfcececfcececfceffffffffffffffffffffffffcecfcececfcececfcececfceffffffffffffffffffffffffcecfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284529284529284529284529284529284529284 -5292845292845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a92846392846392846b927b6b927b7b927b7b -927b949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdba -adbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a928452928452928452928452928452928452 -92845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a92846392846392846b927b6b927b7b92 -7b7b927b949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaad -bdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92845292845292845292845292845292 -845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a92846392846392846b927b6b927b -7b927b7b927b949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbd -baadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284529284529284529284529284 -5292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a92846392846392846b927b6b -927b7b927b7b927b949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdba -adbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a928452928452928452928452 -92845292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a92846392846392846b92 -7b7b927b7b927b84927b949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaad -bdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92845292845292845292 -845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a9284639284639284 -6b927b7b927b7b927b84927b949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbd -baadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284529284529284 -5292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a928463928463 -92846b927b7b927b7b927b84927b949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdba -adbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a928452928452 -92845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a92846392 -846392846b927b7b927b7b927b84927b949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5 -bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92845292 -845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a9284 -6392846392846b927b7b927b7b927b84927b949273949273ffffffffffffffffffa5a28c000000000000000000000000b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5b5 -b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3 -bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -5292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a -92846392846392846b927b7b927b7b927b84927b949273949273ffffffffffffffffffa5a28ca5a28ca5a28cadaa94adaa94b5b2a5b5b2a5000000b5b2a5b5b2 -a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bd -c6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92 -845a92846392846392846b927b7b927b7b927b84927b000000949273ffffffffffffffffffa5a28c000000a5a28c000000adaa94b5b2a5000000000000b5b2a5 -000000b5b2a5000000bdbaadbdbaadbdbaad000000bdbaad000000000000c6c3bdc6c3bdc6c3bdc6c3bd000000c6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bd00 -0000000000cecbc6000000cecbc6000000000000cecbc6000000cecbc6cecbc6cecbc6000000cecbc6cecbc6cecbc6cecbc6000000cecbc6cecbc6000000cecb -c6cecbc6000000cecbc6cecbc6000000000000cecbc6000000cecbc6000000cecbc6cecbc6cecbc6000000cecbc6cecbc6000000cecbc6cecbc6000000000000 -000000cecbc6cecbc6000000cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a9284 -5a92845a92846392846392846b927b7b927b7b927b84927b949273949273000000ffffffffffffa5a28ca5a28ca5a28c000000adaa94000000b5b2a5000000b5 -b2a5b5b2a5000000000000bdbaad000000bdbaadbdbaadbdbaad000000c6c3bd000000c6c3bdc6c3bdc6c3bdc6c3bdc6c3bd000000c6c3bdc6c3bdc6c3bdc6c3 -bdc6c3bd000000cecbc6cecbc6000000000000cecbc6000000cecbc6cecbc6000000cecbc6cecbc6cecbc6000000cecbc6cecbc6cecbc6cecbc6000000cecbc6 -cecbc6000000cecbc6cecbc6000000cecbc6000000cecbc6cecbc6000000000000cecbc6000000cecbc6cecbc6cecbc6000000cecbc6000000cecbc6cecbc600 -0000cecbc6cecbc6cecbc6000000cecfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a -92845a92845a92846392846392846b927b7b927b7b927b84927b949273949273ffffffffffff000000a5a28ca5a28ca5a28cadaa94adaa94000000b5b2a50000 -00b5b2a5000000b5b2a5bdbaadbdbaad000000bdbaad000000bdbaadc6c3bdc6c3bd000000c6c3bd000000c6c3bdc6c3bdc6c3bdc6c3bdc6c3bd000000c6c3bd -c6c3bdc6c3bdc6c3bdcecbc6000000cecbc6cecbc6cecbc6000000cecbc6000000cecbc6cecbc6000000cecbc6cecbc6cecbc6000000cecbc6cecbc6cecbc6ce -cbc6000000cecbc6000000cecbc6000000cecbc6000000cecbc6000000cecbc6cecbc6cecbc6000000cecbc6000000cecbc6cecbc6cecbc6000000cecbc60000 -00cecbc6cecbc6000000cecbc6cecbc6cecfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92 -845a92845a92845a92846392846392846b927b7b927b7b927b84927b949273949273ffffffffffffffffffa5a28c000000a5a28cadaa94adaa94b5b2a5b5b2a5 -000000b5b2a5000000b5b2a5000000bdbaadbdbaadbdbaad000000bdbaad000000c6c3bdc6c3bdc6c3bd000000c6c3bd000000c6c3bdc6c3bdc6c3bdc6c3bdc6 -c3bd000000000000000000000000cecbc6cecbc6cecbc6000000000000000000000000cecbc6000000cecbc6cecbc6000000cecbc6cecbc6cecbc6000000cecb -c6cecbc6cecbc6cecbc6000000cecbc6000000cecbc6000000cecbc6000000cecbc6cecbc6000000000000000000000000cecbc6000000cecbc6cecbc6cecbc6 -000000000000cecbc6cecbc6cecbc6000000000000000000000000000000cecfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a9284 -5a92845a92845a92845a92846392846392846b927b7b927b7b927b84927b949273949273ffffffffffffffffffa5a28ca5a28cadaa9400000000000000000000 -0000b5b2a5b5b2a5000000bdbaad000000bdbaad000000bdbaadbdbaad000000000000c6c3bd000000000000c6c3bdc6c3bd000000c6c3bd000000c6c3bdc6c3 -bdc6c3bdc6c3bdc6c3bd000000cecbc6cecbc6cecbc6000000cecbc6000000cecbc6cecbc6cecbc6000000cecbc6000000cecbc6cecbc6000000000000cecbc6 -cecbc6000000cecbc6cecbc6cecbc6cecbc6000000cecbc6000000cecbc6000000cecbc6000000cecbc6000000cecbc6cecbc6cecbc6000000cecbc600000000 -0000cecbc6cecbc6000000cecbc6000000cecbc6cecfce000000cecfcececfcececfce000000cecfce000000000000cecfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a -92845a92845a92845a92845a92846392846392846b927b7b927b7b927b84927b949273949273ffffffffffffffffffa5a28ca5a28cadaa94adaa94adaa940000 -00b5b2a5b5b2a5b5b2a5b5b2a5bdbaad000000bdbaad000000bdbaadbdbaad000000000000c6c3bd000000c6c3bd000000c6c3bd000000000000c6c3bd000000 -000000000000c6c3bdc6c3bdcecbc6cecbc6000000cecbc6cecbc6cecbc6000000cecbc6cecbc6000000000000000000cecbc6000000000000000000cecbc600 -0000cecbc6000000000000cecbc6cecbc6cecbc6cecbc6cecbc6000000000000cecbc6cecbc6cecbc6000000000000cecbc6cecbc6000000000000000000cecb -c6cecbc6000000cecbc6000000cecbc6000000cecbc6cecfce000000cecfcececfce000000000000000000cecfcececfce000000cecfce000000cecfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292 -845a92845a92845a92845a92845a92846392846392846b927b7b927b7b927b84927b949273949273ffffffffffffffffffa5a28ca5a28cadaa94adaa94adaa94 -b5b2a5b5b2a5000000b5b2a5b5b2a5bdbaadbdbaadbdbaad000000bdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bd000000c6c3bdc6c3bdc6 -c3bdc6c3bdc6c3bd000000c6c3bdcecbc6cecbc6cecbc6cecbc6000000cecbc6cecbc6cecbc6000000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc60000 -00cecbc6cecbc6000000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6000000000000cecbc6cecbc6cecbc6000000000000cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a9284529284529284529284529284529284529284529284529284529284529284529284529284529284529284529284 -5292845a92845a92845a92845a92845a92846392846392846b927b7b927b7b927b84927b949273949273ffffffffffffffffffa5a28ca5a28cadaa94adaa94ad -aa94b5b2a5b5b2a5b5b2a5b5b2a5000000000000000000000000000000bdbaad000000bdbaad000000c6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bd0000 -00c6c3bdc6c3bdc6c3bdc6c3bdc6c3bd000000cecbc6cecbc6cecbc6cecbc6cecbc6000000000000000000000000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6000000cecbc6cecbc6000000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6000000cecbc6cecbc6cecbc6cecbc6cecbc6000000ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a928452928452928452928452928452928452928452928452928452928452928452928452928452928452928452 -92845292845a92845a92845a92845a92845a92846392846392846b927b7b927b7b927b949273949273949273ffffffffffffffffffa5a28ca5a28cadaa94adaa -94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bd -c6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92845292845292845292845292845292845292845292845292845292845292845292845292845292845292 -845292845292845a92845a92845a92845a92845a92846392846392846b927b7b927b7b927b949273949273949273ffffffffffffffffffa5a28ca5a28cadaa94 -adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6 -c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a9284529284529284529284529284529284529284529284529284529284529284529284529284529284 -5292845292845292845a92845a92845a92845a92845a92846392846392846b927b7b927b7b927b949273949273949273949273949273a5a28ca5a28ca5a28cad -aa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3 -bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a928452928452928452928452928452928452928452928452928452928452928452928452928452 -92845292845292845292845a92845a92845a92845a92845a92846392846392846b927b7b927b7b927b949273949273949273949273949273a5a28ca5a28ca5a2 -8cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bd -c6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92845292845292845292845292845292845292845292845292845292845292845292845292 -845292845292845292845292845a92845a92845a92845a92845a92846392846392846b927b7b927b7b927b949273949273949273949273949273a5a28ca5a28c -a5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6 -c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284529284529284529284529284529284529284529284529284529284529284529284 -5292845292845292845292845292845a92845a92845a92845a92845a92846392846392846b927b7b927b7b927b949273949273949273949273949273a5a28ca5 -a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3 -bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a928452928452928452928452928452928452928452928452928452928452928452 -92845292845292845292845292845292845a92845a92845a92845a92845a92846392846392846b927b7b927b7b927b949273949273949273949273949273a5a2 -8ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bd -c6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92845292845292845292845292845292845292845292845292845292845292 -845292845292845292845292845292845292845a92845a92845a92845a92845a92846392846392846b927b7b927b7b927b949273949273949273949273949273 -a5a28ca5a28ca5a28cadaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6 -c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284529284529284529284529284529284529284529284529284529284 -5292845292845292845292845292845292845292845a92845a92845a92845a92845a92846392846392846b927b7b927b7b927b94927394927394927394927394 -9273a5a28ca5a28ca5a28cadaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3 -bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a928452928452928452928452928452928452928452928452928452 -92845292845292845292845292845292845292845292845a92845a92845a92845a92845a92846392846392846b927b7b927b7b927b9492739492739492739492 -73949273a5a28ca5a28ca5a28cadaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bd -c6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6000000cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92845292845292845292845292845292845292845292845292 -845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a92846392846392846b927b7b927b7b927b949273949273949273 -949273949273a5a28ca5a28ca5a28cadaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6 -c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc60000 -00cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284529284529284529284529284529284529284529284 -5292845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a92846392846392846b927b7b927b7b927b94927394927394 -9273949273949273a5a28ca5a28ca5a28cadaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3 -bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6000000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a9284ffffff4a92844a92844a92844a92844a9284ffffffffffffffffffffffffffffff4a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a928452928452928452928452928452928452928452 -92845292845292845292845292845292845292845292845292845292845a92845a92845a92849492735a92846392846392846b927b7b927b7b927b9492739492 -73949273949273949273a5a28ca5a28ca5a28cadaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bd -c6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6000000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a9284ffffff4a92844a92844a92844a9284ffffffffffff4a92844a92844a9284ffffffffffff4a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92845292845292845292845292845292845292 -845292845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a92846392846392846b927b7b927b7b927b949273 -949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6 -c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6000000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a9284ffffff4a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284ffffff4a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284529284529284529284529284529284 -5292845292845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a92846392846392846b927b7b927b7b927b94 -9273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdba -adc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6000000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a9284ffffff4a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284ffffff4a -92844a92844a92844a9284ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a928452928452928452928452928452 -92845292845292845292845292845292845292845292845292845292849492735292845a92845a92845a92845a92845a92846392846392846b927b7b927b7b92 -7b949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaad -bdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6000000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284ffffff4a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a9284ffffff4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92845292845292845292845292 -845292845292845292845292845292845292845292845292845292845292845292849492735a92845a92845a92845a92845a92846392846392846b927b7b927b -7b927b949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbd -baadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6000000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284ffffff4a92844a92844a92844a92844a9284ffffff -ffffffffffffffffffffffffffffff4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284529284529284529284 -5292845292845292845292845292845292845292845292845292845292845292849492739492735a92845a92845a92849ca2949ca2946392846392846b927b7b -927b7b927b949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdba -adbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6000000cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffcecfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284ffffff4a92844a92844a92844a -92844a9284ffffff4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a928452928452928452 -92845292845292845292845292845292845292845292845292845292845292845292845292849492735a92845a92845a92849ca2949ca2946392846392846b92 -7b7b927b7b927b949273949273949273949273a5a28ca5a28ca5a28ca5a28cadaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaad -bdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6000000cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284ffffffffffffffffff4a92 -844a92844a92844a92844a9284ffffff4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92845292845292 -845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a92849ca2949ca294639284639284 -6b927b7b927b7b927b949273949273ffffffffffffffffffa5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbd -baadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -000000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -ffffffffffff4a92844a92844a92844a92844a9284ffffff4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284529284 -5292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a92849ca2949ca29463928463 -92846b927b7b927b7b927b949273949273ffffffffffffffffffa5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdba -adbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6000000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a9284ffffffffffff4a92844a92844a92844a92844a9284ffffffffffffffffffffffffffffff4a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a928452 -92845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a92849ca2949ca2946392 -846392846b927b7b927b7b927b949273949273ffffffffffffffffffa5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaad -bdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6000000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a9284 -9ca2946392846b927b7b927b7b927b949273949273ffffffffffffffffffa5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbd -baadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6000000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a -92846392846392846b927b7b927b7b927b949273949273ffffffffffffffffffa5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdba -adbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6000000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92845292845292845292845292845292845292845292845292845292845292845292845292845292849492735292845292845a92845a92845a92845a92 -845a92846392846392846b927b7b927b7b927b949273949273ffffffffffffffffffa5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5 -bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6000000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284ffffffffffffffffffffffffffffffffffffffffff4a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92845292845292845292845292845292845292845292845292845292845292845292845292845292845292849492735292845a92845a92845a9284 -5a92845a92846392846392846b927b7b927b7b927b949273949273ffffffffffffffffffa5a28ca5a28cadaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5b5 -b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6000000cecbc6cecbc6cecbc6cecbc6cecfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a -92845a92845a92846392846392846b927b7b927b7b927b949273949273ffffffffffffffffffa5a28ca5a28cadaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2 -a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6000000cecbc6cecbc6cecf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292849492735a92845a92 -845a92845a92845a92846392846392846b927b7b927b7b927b949273949273ffffffffffffffffffa5a28ca5a28cadaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5 -b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6000000 -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffff -ffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a9284 -5a92845a92845a92845a92846392846392846b927b7b927b7b927b949273949273ffffffffffffffffffa5a28ca5a28cadaa94adaa94b5b2a5b5b2a5b5b2a5b5 -b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3 -bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a -92845a92845a92845a92845a92846392846392846b927b7b927b7b927b949273949273ffffffffffffffffffa5a28ca5a28cadaa94adaa94b5b2a5b5b2a5b5b2 -a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bd -c6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292 -845a92845a92845a92845a92845a92846392846392846b927b7b927b7b927b949273949273ffffffffffffffffffa5a28ca5a28cadaa94adaa94b5b2a5b5b2a5 -b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6 -c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a9284529284529284529284529284529284529284529284529284529284529284529284529284529284529284529284 -5292845a92845a92845a92845a92845a92846392846392846b927b7b927b7b927b949273949273ffffffffffffffffffa5a28ca5a28cadaa94adaa94b5b2a5b5 -b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3 -bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffcecfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a928452928452928452928452928452928452928452928452928452928452928452928452928452928452928452 -92845292845a92845a92845a92845a92845a92846392846392846b927b7b927b7b927b949273949273ffffffffffffffffffa5a28ca5a28cadaa94adaa94b5b2 -a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bd -c6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfceffffffffffffcecfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92845292845292845292845292845292845292845292845292845292845292845292845292845292849492 -735292845292845a92845a92845a92845a92845a92846392846392846b927b7b927b7b927b949273949273ffffffffffffffffffa5a28ca5a28cadaa94adaa94 -b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6 -c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfceffffffce -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a9284529284529284529284529284529284529284529284529284529284529284529284529284529284 -5292845292845292845a92845a92845a92845a92845a92846392846392846b927b7b927b7b927b949273949273ffffffffffffffffffa5a28ca5a28cadaa94ad -aa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3 -bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffcecfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececf -cececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284ffffffffffff -ffffffffffffffffffffffffffffff4a92844a92844a92844a928452928452928452928452928452928452928452928452928452928452928452928452928452 -92845292845292845292845a92845a92845a92845a92845a92846392846392846b927b7b927b7b927b949273949273949273949273a5a28ca5a28ca5a28cadaa -94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bd -c6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -ceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfceffffffffffff -cecfcececfcececfcececfceffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92845292845292845292845292845292845292845292845292845292845292845292845292845292 -845292845292845292845a92845a92845a92845a92845a92845a92846392846392846b927b7b927b7b927b949273949273949273949273a5a28ca5a28ca5a28c -adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bd000000c6c3bdc6c3bdc6 -c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce00 -0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfceffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffcecfcececfcececfcece -cfcececfceffffffcecfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a9284529284529284529284529284529284529284529284529284529284529284529284529284 -5292845292845292845292845a92845a92845a92845a92845a92845a92846392846392846b927b7b927b7b927b949273949273949273949273a5a28ca5a28ca5 -a28cadaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bd0000 -00c6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecf -cececfcececfcececfcececfceffffffffffffcecfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -ceffffffffffffffffffffffffffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a928452928452928452928452928452928452928452928452928452928452928452928452 -92845292845292845292845292845a92845a92845a92845a92845a92846392846392846392846b927b7b927b7b927b949273949273949273949273a5a28ca5a2 -8ca5a28cadaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bd -c6c3bdc6c3bd000000c6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfceffffffffffffcecfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92845292845292845292845292845292845292845292845292845292845292845292 -845292845292845292845292845292845a92845a92845a92845a92845a92846392846392846b927b7b927b7b927b7b927b949273949273949273949273a5a28c -a5a28ca5a28cadaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6 -c3bdc6c3bdc6c3bdc6c3bdc6c3bd000000c6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284529284529284529284529284529284529284529284529284529284529284 -5292845292845292845292845292845292845a92845a92845a92845a92845a92846392846392846b927b7b927b7b927b949273949273949273949273949273a5 -a28ca5a28ca5a28cadaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3 -bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bd000000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffcecfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfceffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a928452928452928452928452928452928452928452928452928452928452 -92845292845292845292845292845292845292845a92845a92845a92845a92845a92846392846392846b927b7b927b7b927b9492739492739492739492739492 -73a5a28ca5a28ca5a28cadaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bd -c6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6000000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffcecfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92845292845292845292845292845292845292845292845292845292 -845292845292845292845292845292845292845292845a92845a92845a92845a92845a92846392846392846b927b7b927b7b927b949273949273949273949273 -949273a5a28ca5a28ca5a28cadaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6 -c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6000000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffcecfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffcecfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284529284529284529284529284529284529284529284529284529284 -5292845292845292845292845292845292845292845292845a92845a92845a92845a92845a92846392846392846b927b7b927b7b927b94927394927394927394 -9273949273a5a28ca5a28ca5a28cadaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3 -bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6000000cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffcecf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a928452928452928452928452928452928452928452928452928452 -92845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a92846392846392846b927b7b927b7b927b9492739492739492 -73949273949273a5a28ca5a28ca5a28cadaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bd -c6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6000000cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffff -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92845292845292845292845292845292845292845292845292 -84529284529284529284ffffffffffffffffffffffffffffffffffffffffff5a92845a92845a92845a92846392846392846b927b7b927b7b927b949273949273 -949273949273949273a5a28ca5a28ca5a28cadaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6 -c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6000000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -ce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffff -ffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284529284529284529284529284529284529284529284 -5292845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a92846392846392846b927b7b927b7b927b94927394 -9273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3 -bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6000000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffff -ffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a928452928452928452928452928452928452928452 -92845292845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a92846392846392846b927b7b927b7b927b9492 -73949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bd -c6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6000000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffff -ffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92845292845292845292845292845292845292 -845292845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a92845a92846392846392846b927b7b927b7b927b -949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6 -c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6000000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffff -ffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284529284529284529284529284529284 -5292845292845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a92845a92846392846392846b927b7b927b7b -927b949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdba -adc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6000000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffff -ffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a928452928452928452928452928452928452 -92845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a92845a92846392846392846b927b7b92 -7b7b927b949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaad -bdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6000000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -ffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92845292845292845292845292845292 -845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a92845a92846392846392846b927b -7b927b7b927b949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbd -baadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6000000cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfceffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284529284529284529284529284 -5292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a92846392846392846392846b -927b7b927b7b927b949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdba -adbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6000000cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfceffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a928452928452928452928452 -92845292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a92846392846392846392 -846b927b7b927b7b927b949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaad -bdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6000000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce0000 -00cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfceffffffffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92845292845292845292 -845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a9284639284639284 -6392846b927b7b927b7b927b949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbd -baadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6000000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfceffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284529284529284 -5292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a928463928463 -92846392846b927b7b927b7b927b949273949273949273949273ffffffffffffffffffffffffffffffffffffffffffb5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdba -adbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6000000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfceffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a928452928452928452 -92845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a92846392 -846392846b927b6b927b7b927b7b927b949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaad -bdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6000000cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfceffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92845292845292 -845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a9284 -6392849c9a846b927b6b927b7b927b7b927b949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bd -baadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6000000cecbc6cecfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfceffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffcecfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284529284 -5292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92845a -92846392849c9a846b927b6b927b7b927b7b927b949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2 -a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6000000cecfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfceffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a9284 -4a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a928452 -92845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a92845a92 -845a92846392846392849c9a846b927b7b927b7b927b949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5 -b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfce000000cecfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfceffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a -92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a9284 -5a92845a92846392846392846b927b6b927b7b927b7b927b949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94b5b2a5b5b2a5b5b2a5b5 -b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfce000000ce -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a92845a -92845a92845a92846392846392846b927b6b927b7b927b7b927b949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94b5b2a5b5b2a5b5b2 -a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bd -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececf -cececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffcecfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a92845a92 -845a92845a9284ffffffffffffffffffffffffffffffffffffffffff949273949273949273ffffffffffffffffffffffffffffffadaa94adaa94b5b2a5b5b2a5 -b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6 -c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfce -cecfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceff -ffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92 -844a92845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a9284 -5a92845a92845a92845a9284639284ffffffffffff6b927b7b927b7b927b949273949273949273949273949273ffffffa5a28ca5a28cadaa94ffffffffffffb5 -b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3 -bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffff -ffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfceffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a92844a9284 -4a92844a92845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a92845a -92845a92845a92845a92845a92846392846392846b927b6b927bffffffffffff949273949273949273949273949273a5a28cffffffffffffadaa94adaa94b5b2 -a5b5b2a5ffffffb5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bd -c6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffcecf -cececfcececfcececfcececfceffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92844a92844a92844a -92844a92844a92845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845a92 -845a92845a92845a92845a92845a92846392846392846b927b6b927b7b927b7b927b949273ffffffffffff949273949273a5a28ca5a28ca5a28cffffffadaa94 -b5b2a5b5b2a5b5b2a5b5b2a5ffffffbdbaadbdbaadbdbaadbdbaadffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6 -c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffff -ffffffcecfcececfcececfcececfcececfcececfcececfceffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a92844a92844a92844a92 -844a92844a92844a9284529284529284529284529284529284529284529284529284529284529284529284529284529284529284529284529284529284529284 -5a92845a92845a92845a92845a92846392846392846392846b927b6b927b7b927b7b927b949273949273949273949273ffffffffffffa5a28ca5a28cadaa94ad -aa94ffffffb5b2a5b5b2a5b5b2a5b5b2a5bdbaadffffffbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3 -bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a92844a92844a9284 -4a92844a92844a92844a928452928452928452928452928452928452928452928452928452928452928452928452928452928452928452928452928452928452 -92845a92845a92845a92845a92845a92846392846392846392846b927b7b927b7b927b7b927b949273949273949273949273949273a5a28ca5a28cffffffffff -ffadaa94b5b2a5b5b2a5ffffffb5b2a5b5b2a5bdbaadbdbaadbdbaadffffffbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bd -c6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffff -ffffffffffffffffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfceffffffffffffffffffffffffffffff -ffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffff -ffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00004a92844a -92844a92844a92844a92844a92845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292845292 -845292845a92845a92845a92845a92845a92846392846392846392846b927b7b927b7b927b949273949273949273949273949273949273a5a28cffffffa5a28c -adaa94adaa94ffffffffffffb5b2a5b5b2a5ffffffbdbaadbdbaadbdbaadbdbaadbdbaadffffffbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6 -c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce00 -0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffcecfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff00004a92844a92844a92844a9284529284529284529284529284529284529284529284529284529284529284529284529284529284529284529284529284 -5292845292845a92845a92845a92845a92845a92846392846392846392846b927b7b927b7b927b949273949273949273949273949273949273a5a28ca5a28ca5 -a28cffffffadaa94b5b2a5b5b2a5b5b2a5ffffffb5b2a5bdbaadffffffffffffbdbaadbdbaadbdbaadbdbaadffffffc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3 -bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffff000000ffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff00004a928452928452928452928452928452928452928452928452928452928452928452928452928452928452928452928452928452 -92845292845292845a92845a92845a92845a92845a92846392846392846392846b927b7b927b7b927b949273949273949273949273949273949273a5a28ca5a2 -8ca5a28cadaa94adaa94ffffffb5b2a5b5b2a5b5b2a5ffffffffffffbdbaadbdbaadbdbaadffffffbdbaadbdbaadc6c3bdffffffffffffc6c3bdc6c3bdc6c3bd -c6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfce -cecfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffff00 -0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff00005292845292845292845292845292845292845292845292845292845292845292845292845292845292845292 -845292845292845292845a92845a92845a92845a92845a92846392846392846392846b927b7b927b7b927b949273949273949273949273949273949273a5a28c -a5a28ca5a28cadaa94adaa94b5b2a5b5b2a5ffffffffffffffffffffffffffffffbdbaadbdbaadbdbaadbdbaadffffffffffffffffffffffffffffffc6c3bdc6 -c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcece -cfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfce000000cecfcececfcececfce000000000000000000 -000000000000cecfcececfce000000000000000000cecfcececfcececfce000000000000000000cecfcececfcececfcececfcececfcececfce000000cecfcece -cfce000000000000cecfcececfcececfcececfce000000cecfcececfce000000cecfcececfce000000cecfcececfce000000000000000000ffffffffffff0000 -00ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff0000529284529284529284529284529284529284529284529284529284529284529284529284 -5292845292845292845292845a92845a92845a92845a92845a92846392846392846392846b927b7b927b7b927b949273949273949273949273949273949273a5 -a28ca5a28ca5a28cadaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3 -bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffcecfcececf -cececfcececfcececfcececfcececfceffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfce000000cecfcececfcececfcece -cfce000000cecfcececfcececfcececfce000000cecfcececfcececfce000000cecfce000000cecfcececfcececfce000000cecfcececfcececfcececfcececf -ce000000cecfcececfce000000cecfcececfcececfcececfcececfce000000cecfcececfce000000cecfcececfce000000cecfce000000cecfcececfcececfce -000000ffffff000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000052928452928452928452928452928452928452928452928452928452 -92845292845292845292845292845a92845a92845a92845a92845a92846392846392846392846b927b7b927b7b927b9492739492739492739492739492739492 -73a5a28ca5a28ca5a28cadaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bd -c6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -ffffffffffffffffffffffffffffffffffffffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfce000000cecf -cececfcececfcececfcececfce000000cecfcececfcececfce000000cecfcececfcececfce000000cecfce000000cecfcececfcececfce000000cecfcececfce -cecfcececfcececfce000000cecfcececfce000000cecfcececfcececfcececfcececfce000000cecfcececfce000000cecfcececfce000000cecfcececfcece -cfcececfce000000ffffffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00005292845292845292845292845292845292845292 -845292845292845292845292845a92845a92845a92845a92845a92845a92846392846392846b927b6b927b7b927b7b927b949273949273949273949273949273 -949273a5a28ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6 -c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfce -cecfce000000cecfcececfcececfcececfcececfcececfce000000cecfcececfce000000cecfcececfcececfce000000cecfce000000cecfcececfcececfce00 -0000cecfcececfcececfcececfcececfce000000cecfcececfce000000cecfcececfcececfcececfcececfce000000cecfcececfce000000cecfcececfce0000 -00cecfcececfce000000000000cecfceffffffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000529284529284529284529284 -5292845292845292845292845292845a92845a92845a92845a92845a92845a92846392846392846b927b6b927b7b927b7b927b94927394927394927394927394 -9273949273a5a28ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3 -bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ffffffffffff -ffffffffffffffffffffffffffffffcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcece -cfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfce000000cecfce000000cecfcececfcececfce000000cecfce000000cecf -cececfcececfce000000cecfcececfcececfcececfcececfce000000cecfcececfce000000cecfcececfcececfcececfcececfce000000000000cecfce000000 -cecfcececfce000000cecfce000000cecfcececfcececfce000000ffffff000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000052928452 -92845292845292845292845292845292845a92845a92845a92840000005a92845a92846392846392846b927b6b927b7b927b7b927b9492739492739492739492 -73949273949273a5a28ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bd -c6c3bdc6c3bdc6c3bd000000c6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce00 -0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -ce000000cecfcececfcececfce000000cecfce000000cecfcececfcececfcececfcececfcececfcececfce000000cecfce000000cecfcececfcececfce000000 -cecfce000000cecfcececfcececfce000000cecfcececfcececfcececfce000000000000000000000000000000000000cecfcececfcececfcececfce000000ce -cfce000000000000000000000000cecfcececfcececfce000000000000000000ffffffffffff000000ffffffffffffffffff000000ffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff00005292845292845292845292845292845a92845a92845a92845a92840000005a92846392846392846b927b6b927b7b927b7b927b949273949273949273 -949273949273949273a5a28ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6 -c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bd000000c6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffce -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -ceffffffffffffffffffffffffffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfce000000cecfcececfcececfce000000000000cecfcececfcececfce000000cecfcececfcececfce000000cecfce000000cecfcece -cfcececfce000000cecfce000000cecfcececfcececfce000000cecfcececfcececfcececfcececfce000000cecfcececfce000000cecfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffff000000ffffffffffff000000ffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff00005292845292845292845a92845a92845a92845a92845a92840000006392846392846b927b00000000000000000000000000000094 -9273949273949273000000a5a28ca5a28ca5a28c000000000000000000000000000000b5b2a5b5b2a5b5b2a5bdbaad000000bdbaadbdbaad000000bdbaad0000 -00000000c6c3bdc6c3bd000000000000000000c6c3bdc6c3bdc6c3bdc6c3bd000000c6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffff -ffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfce000000cecfcececfcececfcececfce000000000000000000cecfcececf -cececfce000000000000000000cecfcececfcececfce000000000000000000cecfcececfcececfcececfcececfcececfcececfce000000cecfce000000cecfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffff000000ffffff000000ff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff00005292845a92845a92845a92845a92845a92845a92846392840000006b927b6b927b7b927b7b927b0000009492 -73949273949273949273949273a5a28c000000a5a28cadaa94adaa94adaa94000000b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaad000000bdbaad000000 -bdbaadc6c3bd000000c6c3bdc6c3bd000000c6c3bdc6c3bdc6c3bd000000c6c3bdc6c3bdc6c3bd000000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcecfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffff -ffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceff -ffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfceffffffffffffcecfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff00005a92845a92845a92845a92846392846392846392846b927b0000007b927b7b927b949273 -949273949273000000949273949273a5a28ca5a28ca5a28c000000adaa94adaa94b5b2a5b5b2a5b5b2a5000000b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaad00 -0000bdbaad000000c6c3bdc6c3bd000000c6c3bdc6c3bdc6c3bdc6c3bdc6c3bd000000c6c3bdc6c3bdc6c3bdcecbc6000000cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffff -ffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfceffffffffffffcecfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00005a92845a92846392846392846392846b927b6b927b7b927b00000094 -9273949273949273949273949273949273000000a5a28ca5a28cadaa94adaa94000000b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaad000000bdbaadbdbaadbdba -adbdbaadbdbaad000000000000c6c3bdc6c3bdc6c3bd000000c6c3bdc6c3bdc6c3bd000000000000c6c3bdc6c3bdcecbc6cecbc6cecbc6000000cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffff -ffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffce -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00006392846392846392846b927b6b927b7b927b7b92 -7b949273000000949273949273949273949273a5a28ca5a28ca5a28c000000adaa94adaa94b5b2a5000000b5b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaad -000000bdbaadbdbaadc6c3bdc6c3bd000000c6c3bd000000c6c3bdc6c3bd000000c6c3bdc6c3bd000000c6c3bdc6c3bdcecbc6000000cecbc6cecbc6cecbc600 -0000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -ffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00006392846b927b6b927b7b927b -7b927b949273949273949273000000949273949273a5a28ca5a28ca5a28cadaa94adaa94000000b5b2a5000000b5b2a5000000b5b2a5bdbaadbdbaadbdbaadbd -baadbdbaadbdbaad000000c6c3bdc6c3bdc6c3bdc6c3bd000000c6c3bdc6c3bd000000000000000000000000c6c3bdc6c3bd000000000000000000cecbc6cecb -c6cecbc6cecbc6000000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfceffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00006b927b7b -927b7b927b949273949273949273949273949273949273000000a5a28ca5a28c000000adaa94adaa94b5b2a5000000b5b2a5b5b2a5000000000000bdbaadbdba -adbdbaad000000bdbaadbdbaadc6c3bd000000c6c3bdc6c3bdc6c3bdc6c3bd000000c6c3bdc6c3bdc6c3bdc6c3bd000000c6c3bdcecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6000000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfceffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff00007b927b949273949273949273949273949273949273a5a28ca5a28ca5a28c000000adaa94adaa94000000000000000000b5b2a5b5b2a5bdbaadbdbaad -000000bdbaadbdbaadbdbaadbdbaad000000000000000000c6c3bdc6c3bdc6c3bdc6c3bdc6c3bd000000c6c3bdc6c3bdc6c3bdc6c3bd000000cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6000000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6ffffffffffffffffffffffffffffffffffffffffffcecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfceffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffcecfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfce000000cecfcececfcececfcececfcececfce000000cecfce000000cecfce000000000000cecfce000000cecfce000000000000cecfcece -cfce000000000000cecfce000000cecfcececfce000000000000cecfce000000cecfcececfce000000000000000000cecfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff0000949273949273949273949273949273a5a28ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdbaadbd -baadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfceffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffcecfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfce000000cecfce000000cecfce000000cecfcececfce000000cecfce0000 -00cecfcececfce000000cecfcececfce000000000000cecfce000000cecfcececfce000000000000cecfce000000cecfcececfcececfce000000cecfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff0000949273949273949273a5a28ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5bdba -adbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfceffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfce000000000000000000000000000000cecfcececfce000000cecfce000000cecfcececfce -000000cecfce000000cecfcececfce000000cecfcececfcececfce000000cecfce000000cecfcececfcececfce000000cecfce000000cecfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff0000949273a5a28ca5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5b2a5 -bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfceffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfce000000cecfcececfce000000cecfce00 -0000cecfcececfce000000cecfce000000cecfcececfce000000cecfcececfcececfce000000cecfce000000cecfcececfcececfce000000cecfce0000000000 -00000000000000000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000a5a28ca5a28cadaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2a5b5 -b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3 -bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfceffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffcecfcececfcececf -ceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfce000000cecfcececfcececf -ce000000cecfce000000cecfcececfce000000cecfce000000cecfcececfce000000cecfcececfcececfce000000cecfce000000cecfcececfce000000000000 -cecfce000000cecfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000adaa94adaa94adaa94b5b2a5b5b2a5b5b2a5b5b2 -a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bd -000000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffcecfcececfcececfcececfce000000cecfcececfcececfcececf -cececfcececfcececfcececfcececfceffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfceffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffcecfcececfcececfce -cecfcececfcececfceffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfce000000 -cecfcececfcececfce000000000000000000000000cecfce000000000000000000000000cecfce000000cecfcececfcececfce000000cecfcececfce00000000 -0000cecfce000000cecfcececfce000000000000000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000adaa94b5b2a5b5b2a5b5b2a5 -b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6 -c3bdc6c3bdcecbc6000000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfce000000cecfce -cecfcececfcececfcececfcececfcececfceffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffce -cfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce00 -0000cecfce000000cecfcececfcececfce000000cecfce000000cecfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000b5b2a5b5 -b2a5b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaad000000bdbaadbdbaadc6c3bdc6c3bdc6c3bd000000c6c3bd000000c6c3bd000000c6c3bdc6c3bdc6c3bdc6c3 -bd000000000000000000cecbc6cecbc6000000cecbc6000000000000cecbc6cecbc6cecbc6000000000000000000cecbc6cecbc6cecbc6000000000000000000 -cecbc6cecbc6cecbc6000000000000cecbc6000000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffcecfcececfcece -cfce000000cecfcececfcececfcececfcececfceffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececf -cececfceffffffffffffffffffffffffcecfcececfcececfcececfceffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfce000000cecfcececfcececfcececfce000000cecfce000000cecfcececfce000000cecfce000000cecfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff0000b5b2a5b5b2a5bdbaadbdbaadbdbaadbdbaadbdbaadbdbaad000000c6c3bdc6c3bdc6c3bdc6c3bdc6c3bd000000c6c3bd000000c6c3bd000000c6c3bd -c6c3bdc6c3bd000000c6c3bdcecbc6cecbc6000000cecbc6000000000000cecbc6cecbc6000000cecbc6000000cecbc6cecbc6cecbc6000000cecbc6000000ce -cbc6cecbc6cecbc6000000cecbc6000000cecbc6cecbc6000000000000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffff -ffcecfcececfcececfce000000cecfcececfcececfceffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfceffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff0000bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bd000000000000000000000000000000c6c3bdc6c3bd000000c6 -c3bd000000c6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6000000cecbc6cecbc6000000cecbc6cecbc6cecbc6000000cecbc6000000cecbc6cecbc6cecbc6cecb -c6cecbc6000000cecbc6cecbc6cecbc6cecbc6cecbc6000000cecbc6cecbc6cecbc6000000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfceffffffffffffcecfcececfcececfce000000ffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffcecfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffcecfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff0000bdbaadbdbaadbdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bd000000c6c3bdc6c3bdc6c3bd000000c6c3 -bdc6c3bd000000c6c3bd000000c6c3bdcecbc6cecbc6cecbc6000000000000cecbc6cecbc6cecbc6000000cecbc6cecbc6cecbc6000000cecbc6000000000000 -000000000000000000cecbc6000000000000000000000000000000cecbc6000000cecbc6cecbc6cecbc6000000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffcecfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfceffffffcecfcececfceffffff000000ffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffff -ffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff0000bdbaadbdbaadbdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bd000000c6c3bd -000000c6c3bdc6c3bdc6c3bd000000c6c3bd000000000000cecbc6cecbc6000000cecbc6cecbc6cecbc6000000cecbc6000000000000cecbc6cecbc6000000ce -cbc6000000cecbc6cecbc6cecbc6000000cecbc6000000cecbc6cecbc6cecbc6000000cecbc6000000cecbc6cecbc6000000000000cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffff000000cecfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfceffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfceffffffcecfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000bdbaadbdbaadc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6 -c3bd000000c6c3bd000000c6c3bdc6c3bdc6c3bd000000cecbc6000000cecbc6000000cecbc6cecbc6000000000000000000cecbc6cecbc6000000cecbc60000 -00000000cecbc6cecbc6cecbc6000000000000000000cecbc6cecbc6cecbc6000000000000000000cecbc6cecbc6cecbc6000000000000cecbc6000000cecbc6 -cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfceffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffcecfcececfceffffffffff -ffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffcecfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000c6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3 -bdc6c3bdc6c3bdc6c3bd000000c6c3bd000000c6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6000000cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfceffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffff -ffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000c6c3bdc6c3bdc6c3bdc6c3bd -c6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bd000000cecbc6cecbc6cecbc6cecbc6000000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6000000cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000 -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfceffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000c6c3bdc6 -c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcece -cfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfceffffffffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff0000c6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffcecfcececfceffffffcecfcececfcececfcececfcececf -cececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfceffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff0000c6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffcecfcececfcececfceffffffffffffcecfce -cecfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfceffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff0000c6c3bdc6c3bdc6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcece -cfceffffffffffffcecfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfceffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff0000c6c3bdc6c3bdc6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececf -cececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfceffffffffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfceffffffffffffcecfcececfcececfcececfcececfceff -ffffffffffffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000c6c3bdcecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffce -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfce -ffffffffffffcecfcececfcececfcececfcececfceffffffffffffcecfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfceffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfceffffffffffffcecfcececfcececfceffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffcecfcece -cfcececfcececfcececfceffffffcecfcececfcececfcececfcececfceffffffffffffcecfcececfcececfcececfcececfcececfcececfce000000cecfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfceffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -ceffffffcecfcececfcececfcececfcececfceffffffffffffcecfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfce -000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfceffffffffffffcecfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffcecfcececfcececfcececfcececfcece -cfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfceffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff0000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffcecfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff0000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff0000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffcecfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfceffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffcecfcececfcececfceffffffffffffffffffffff -ffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffcecfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfceffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceff -ffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffcecfcececfcececfcececfcececfcececfcececfceffffffffffff -cecfcececfcececfceffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfceffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfceffffffffffffffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffcecfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffcecfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -ffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff0000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfceffffffffffffcecfcececfcececfcececfceffffffffffffffffffffffffffffffffffffcecfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -ceffffffffffffffffffffffffffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff0000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfceffffffcecfcececfcececfceffffffffffffcecfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000ce -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff0000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfceffffffcecfcececfcececfceffffffcecfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececf -ce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfceffffffffffffcecfcececfcececfceffffffcecfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfce -cecfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffcecfcececfcececfcececfceffffff -ffffffffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcece -cfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecb -c6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecf -cececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecbc6cecbc6cecbc6cecbc6 -cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfce000000cecfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecbc6ce -cbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff0000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff0000cecbc6cecbc6cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff0000cecbc6cecbc6cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfce000000cecf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecbc6cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfce -cecfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecbc6cecfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcece -cfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecf -cececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfce000000cecfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfceffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfce000000cecfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfceffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffcecfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfce000000cecfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfceffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfce000000 -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfceffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcece -cfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfceffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffcecfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce0000 -00cecfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfce000000cecfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfce000000cecfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfce000000cecfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfce000000cecfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffcecfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfce000000cecfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfce000000000000000000000000000000cecfcececfcececfcececfceffffffffffffffffffcecfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffce -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfce00 -0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce0000000000 -00000000000000000000000000000000000000cecfcececfcececfcececfcececfcececfcececfceffffffffffffffffffcecfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -ce000000000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000000000000000000000000000000000000000 -000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffcecfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfce000000000000cecfcececfcececfcececfce000000000000000000000000000000000000000000000000cecfcececfcececfceffffffce -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffcecfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffff -ffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfce000000000000000000000000000000000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfceffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffcecfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffcecfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfceffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffcecf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfceffffffffffffffffff -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffcecfcececfcececfceffffffffffffff -ffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfceffffffffff -ffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcece -cfce000000cecfce000000000000cecfcececfce000000000000000000cecfcececfce000000cecfcececfcececfce000000cecfcececfcececfcececfce0000 -00cecfcececfce000000000000cecfce000000cecfcececfce000000000000cecfce000000cecfcececfce000000000000cecfce000000cecfcececfce000000 -000000000000cecfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececf -cececfcececfcececfce000000cecfce000000cecfcececfce000000cecfcececfcececfce000000cecfce000000cecfcececfcececfce000000cecfcececfce -cecfcececfce000000cecfce000000cecfcececfce000000000000cecfce000000cecfcececfce000000000000cecfce000000cecfcececfce000000000000ce -cfce000000cecfcececfcececfce000000cecfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -000000cecfcececfcececfcececfcececfce000000cecfce000000cecfcececfce000000cecfcececfcececfcececfcececfce000000cecfcececfcececfce00 -0000cecfcececfcececfcececfce000000cecfce000000cecfcececfcececfce000000cecfce000000cecfcececfcececfce000000cecfce000000cecfcececf -cececfce000000cecfce000000cecfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfce000000000000000000000000cecfcececfce000000cecfce000000cecfcececfce000000cecfcececfcececfcececfcececfce000000cecf -cececfcececfce000000cecfcececfcececfcececfce000000cecfcececfce000000000000000000000000cecfce000000cecfcececfcececfce000000cecfce -000000cecfcececfcececfce000000cecfce000000000000000000000000000000cecfce000000cecfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfce000000cecfcececfcececfce000000cecfce000000cecfce000000cecfcececfce000000cecfcececfcececfce000000 -cecfce000000000000cecfcececfce000000cecfcececfcececfcececfce000000cecfce000000cecfcececfcececfce000000cecfce000000cecfcececfce00 -0000000000cecfce000000cecfcececfce000000000000cecfce000000cecfcececfcececfce000000cecfce000000000000cecfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfce000000cecfce000000cecfce000000cecfcececfcececfce000000cecfce000000000000000000000000cecfcececfce00000000 -0000000000cecfcececfce000000cecfce000000000000cecfcececfcececfcececfcececfce000000cecfcececfce000000000000000000cecfcececfcececf -ce000000000000cecfce000000cecfcececfce000000000000cecfce000000cecfcececfce000000000000000000cecfcececfce000000cecfce000000cecfce -000000cecfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfce000000cecfce000000cecfce000000cecfcececfcececfce000000cecfcececfcececfce000000cecfcececf -cececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfce000000cecfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfce000000cecfce000000000000000000000000cecfcececfce000000cecfce -000000cecfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfce000000cecfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -ceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -ffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceff -ffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfceffffffffffffffffffffffffcecfcececfcececfcececfcececfceffffffffffffcecfcececfcececfcececfcece -cfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffcecfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffcecfcececfcececfcececfceffffffffffffcecfcececfcece -cfcececfceffffffffffffffffffffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfceffffffffffffcecfcececfceffffffffffffcecfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffcecfceffffffffffffce -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfceffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfceffffffcecfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffcecfcececfcececfcececfceffffffffffffffffffffff -ffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffff -ffffffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffcecfcececf -cececfceffffffcecfceffffffffffffffffffffffffffffffffffffffffffffffffcecfcececfceffffffffffffcecfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfceffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfceffffffcecfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffcecfcececfcececfceffffffffffffcecfcececfcececfceffffff -cecfcececfcececfceffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -ceffffffffffffcecfcececfcececfceffffffffffffcecfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffff -cecfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffcecfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffcecfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfceffff -ffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffcecfcececfceffffffcecfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcece -cfceffffffffffffcecfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfceffffffffffffffffffcecfceffffffffffffcecfceffffffffffffffffffffffffffffffffffffffffffffffffcecfcececfcececfcececfcececf -ceffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffcecfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfce -cecfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffcecfceffffffcecfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -ceffffffcecfcececfceffffffcecfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfceffffffcecfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffce -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceff -ffffcecfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfceffffffcecf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfceffffffcecfcececfceffffffcecfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfce -ffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfceffffffcecfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececf -cececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfceffffffffffffcecfcececfceffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffff -ffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfceffffffffffffffffffffffffcecfcececfceffffffcecfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffcecfcececfcececfcece -cfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfceffffffffffffcecfcececfceffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffff -ffffffcecfcececfceffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfceffffffffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfceffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfceffffffcecfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffcecfcececfcececfcececf -cececfcececfcececfcececfcececfceffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfceffffffffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfceffffffffffffcecfcececfcececfcececfceffffffffffffcecfcececfcececfcececfceffffffce -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffff -cecfcececfcececfcececfcececfcececfceffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffcecfcececfcececfcececfceffffffcecfcececfcececf -ceffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfceffffffffffffcecfcececfcececfcececfcececfcececfceffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffcecfcececfcececfceffffff -ffffffffffffffffffffffffcecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfceffffffffffffffffffffffffffffffffffffcecfcececfcececfcececfcececfceffffffffffffcecfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfce000000000000000000000000cecfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfce000000000000000000000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfce000000cecfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececf -cececfcececfce000000cecfcececfce000000000000000000cecfcececfcececfce000000000000cecfce000000cecfcececfce000000000000cecfce000000 -cecfce000000cecfce000000cecfcececfcececfce000000cecfcececfce000000000000cecfce000000cecfcececfcececfcececfce000000cecfcececfcece -cfcececfce000000000000000000cecfcececfcececfce000000000000000000cecfcececfcececfce000000000000000000cecfcececfcececfcececfcececf -cececfce000000000000cecfce000000cecfcececfce000000000000000000cecfcececfcececfce000000000000cecfce000000cecfce000000cecfcececfce -cecfcececfce000000000000000000cecfcececfcececfce000000000000000000cecfcececfcececfce000000000000000000cecfcececfcececfcececfce00 -0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -000000cecfcececfcececfcececfce000000cecfce000000cecfcececfcececfce000000cecfce000000cecfcececfce000000000000cecfce000000cecfcece -cfce000000000000cecfce000000cecfce000000cecfcececfcececfce000000cecfce000000cecfcececfce000000000000cecfcececfcececfcececfce0000 -00cecfcececfcececfce000000cecfcececfcececfce000000cecfce000000cecfcececfcececfce000000cecfce000000cecfcececfcececfce000000cecfce -cecfcececfcececfce000000cecfcececfce000000000000cecfce000000cecfcececfcececfce000000cecfce000000cecfcececfce000000000000cecfce00 -0000cecfcececfcececfce000000cecfcececfcececfce000000cecfce000000cecfcececfcececfce000000cecfce000000cecfcececfcececfce000000cecf -cececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000000000000000000000cecf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfce000000cecfcececfcececfcececfce000000cecfce000000cecfcececfcececfcececfcececfce000000cecfcececfcececfce000000cecf -ce000000cecfcececfcececfce000000cecfce000000cecfce000000cecfcececfcececfce000000cecfce000000cecfcececfcececfce000000cecfcececfce -cecfcececfce000000cecfcececfcececfcececfcececfcececfcececfce000000cecfce000000cecfcececfcececfce000000cecfce000000cecfcececfcece -cfce000000cecfcececfcececfcececfce000000cecfcececfcececfce000000cecfce000000cecfcececfcececfcececfcececfce000000cecfcececfcececf -ce000000cecfce000000cecfcececfcececfce000000cecfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfce -000000cecfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfce000000cecfcececfcececfcececfce000000cecfce000000000000000000000000000000cecfcececfce000000000000 -000000000000cecfce000000cecfcececfcececfce000000cecfce000000cecfce000000cecfcececfcececfce000000cecfce000000cecfcececfcececfce00 -0000cecfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfce000000cecfce000000cecfcececfcececfce000000cecfce0000 -00cecfcececfcececfce000000cecfcececfcececfcececfce000000cecfcececfcececfce000000cecfce000000000000000000000000000000cecfce000000 -cecfcececfcececfce000000cecfce000000cecfcececfcececfce000000000000000000000000000000cecfce000000000000000000000000000000cecfcece -cfce000000000000cecfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfce000000cecfce000000cecfcececfcececfce000000ce -cfcececfce000000000000cecfce000000cecfce000000cecfcececfce000000000000000000cecfcececfcececfcececfcececfcececfce0000000000000000 -00cecfcececfcececfce000000cecfcececfcececfcececfcececfcececfce000000000000cecfce000000cecfce000000000000cecfce000000000000cecfce -cecfce000000000000cecfce000000cecfcececfce000000000000000000cecfcececfce000000cecfcececfce000000cecfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfce000000000000000000000000000000000000cecfce000000cecfcececfcececfce000000cecfce00 -0000cecfcececfcececfce000000cecfce000000cecfcececfce000000000000cecfce000000cecfce000000cecfcececfcececfce000000cecfce000000cecf -cececfce000000000000cecfcececfcececfcececfce000000cecfcececfcececfcececfcececfce000000000000cecfcececfce000000cecfcececfcececfce -000000cecfce000000000000000000000000cecfcececfcececfcececfcececfce000000cecfcececfce000000000000cecfce000000cecfcececfcececfce00 -0000cecfce000000cecfcececfce000000000000cecfce000000000000cecfcececfce000000cecfcececfcececfce000000cecfce000000cecfcececfcececf -ce000000cecfce000000cecfcececfcececfce000000cecfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfce000000cecfce000000cecfcececf -cececfce000000cecfce000000cecfcececfce000000000000cecfce000000cecfce000000cecfcececfcececfce000000cecfcececfcececfcececfce000000 -cecfcececfcececfce000000cecfcececfce000000cecfcececfcececfcececfcececfce000000cecfcececfce000000000000cecfce000000cecfcececfce00 -0000cecfcececfce000000cecfcececfce000000000000cecfce000000cecfcececfcececfce000000cecfce000000cecfce000000cecfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfce000000cecfcececfce0000000000000000 -00cecfcececfcececfce000000000000000000cecfcececfcececfce000000000000cecfce000000cecfce000000cecfce000000000000000000000000cecfce -cecfcececfce000000000000cecfce000000cecfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfce000000cecfce000000ce -cfcececfcececfce000000cecfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfce000000000000cecfce000000cecfcececfce0000 -00000000000000cecfcececfcececfce000000000000cecfce000000cecfce000000cecfce000000cecfcececfce000000000000000000cecfcececfcececfce -000000000000000000cecfcececfcececfce000000000000000000cecfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000000000000000000000000000cecfcececfce -000000cecfcececfcececfce000000cecfce000000cecfcececfcececfce000000cecfce000000cecfce000000cecfcececfcececfcececfcececfcececfcece -cfcececfce000000cecfcececfcececfce000000cecfcececfce000000cecfcececfcececfcececfcececfce000000cecfcececfcececfce000000cecfce0000 -00cecfcececfce000000cecfcececfce000000cecfcececfcececfce000000cecfce000000cecfcececfcececfcececfcececfce000000cecfce000000cecfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfce000000000000000000cecfcececfcececfcececfcececfcececfcececfce000000cecfcececfce000000cecfcececfce000000ce -cfcececfce000000000000000000cecfcececfce000000000000cecfcececfce000000000000000000cecfcececfce000000cecfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfce000000cecfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfce000000cecfcececfcececfce0000 -00cecfce000000cecfcececfcececfce000000cecfce000000cecfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfce000000 -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfce00 -0000cecfcececfce000000cecfcececfcececfce000000cecfce000000cecfcececfcececfce000000cecfce000000cecfce0000000000000000000000000000 -00cecfcececfcececfcececfce000000cecfcececfcececfce000000cecfcececfce000000cecfcececfcececfcececfcececfcececfce000000000000000000 -000000cecfce000000cecfcececfce000000cecfcececfcececfce000000000000000000000000cecfce000000cecfcececfcececfcececfcececfce00000000 -0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfce000000cecfcececfcececfce000000cecfcececfcececfcececfcececfcececfce000000cecfcececfce000000cecf -cececfce000000cecfce000000cecfcececfcececfce000000cecfce000000cecfcececfce000000cecfcececfcececfce000000cecfce000000cecfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfce00 -0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfce000000cecf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfce000000 -000000000000cecfcececfcececfce000000000000000000cecfcececfcececfce000000000000000000cecfcececfcececfcececfcececfcececfcececfcece -cfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce0000 -00cecfce000000cecfcececfcececfce000000cecfcececfcececfce000000cecfce000000cecfcececfce000000000000cecfce000000cecfce000000cecfce -cecfcececfce000000cecfcececfcececfcececfce000000cecfcececfcececfce000000cecfcececfce000000cecfcececfcececfcececfcececfce000000ce -cfcececfcececfce000000cecfce000000cecfcececfce000000cecfcececfce000000cecfcececfcececfce000000cecfce000000cecfcececfcececfce0000 -00cecfce000000cecfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfce000000cecfce000000000000000000cecfce000000cecfce -cecfce000000cecfcececfce000000cecfce000000cecfcececfcececfcececfcececfce000000cecfcececfce000000cecfcececfcececfcececfcececfce00 -0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfce000000cecfce000000cecfcececfcececfce000000000000000000000000cecfcececfcececfce000000000000cecfce000000cecfce000000ce -cfcececfce000000000000000000cecfcececfcececfcececfcececfcececfce000000000000000000cecfcececfce000000000000000000cecfcececfcececf -cececfcececfce000000000000000000cecfce000000000000000000000000000000000000cecfcececfce000000000000000000cecfcececfcececfce000000 -000000000000cecfcececfce000000cecfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfce000000000000000000cecfcececfcececfcececfcece -cfce000000cecfcececfce000000cecfcececfce000000cecfce000000000000000000000000000000cecfce000000cecfcececfce0000000000000000000000 -00000000cecfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfce000000cecfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfce000000cecfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfce000000000000cecfce000000cecfcececfce000000cecfce000000cecfcececfcececfce000000cecfce000000cecfcececfce000000 -cecfcececfcececfce000000cecfce000000000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfce000000cecfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcececfcececfcececfcececfce -000000cecfcececfcececfcececfcececfce000000cecfce000000000000000000000000cecfcececfcececfce000000000000000000cecfce00000000000000 -0000cecfcececfce000000000000000000cecfcececfce000000cecfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce000000cecfcece -cfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfce000000000000000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfce000000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfceffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000cecfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececf -cececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfce -cecfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcececfcece -cfcececfcececfceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000005000000070101000000030000000000}}}{ -\cf9 -\par }\pard \sa120\widctlpar\adjustright { -\par }\pard \qc\sa120\widctlpar\adjustright {THE ACM HEAD UP DISPLAY -\par }\pard\plain \s2\sb240\sa60\keepn\widctlpar\outlinelevel1\adjustright \b\i\f1 {{\*\bkmkstart _Toc431273862}Ladders{\*\bkmkend _Toc431273862} -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid {Four tape-style "ladders" display basic flight information. On the left, is the plane's true airspeed. Each minor tick on the airspe -ed ladder represents 10 nautical miles per hour (also known as knots and abbreviated "kts"). -\par On the right is the altitude ladder. Each tick represents 100 feet. In ACM, the ground is completely flat (except for a few mountains) and located at sea level. A - rate-of-climb readout is located just below this ladder; rate-of-climb is expressed in feet per minute. -\par In the lower center is a horizontal heading ladder. Each tick represents five degrees. -\par In the center is an attitude ladder. Each line corresponds to ten degrees of aircraft pitch. The ladder rolls as the aircraft does, providing an artificial horizon. -\par }\pard\plain \s2\sb240\sa60\keepn\widctlpar\outlinelevel1\adjustright \b\i\f1 {{\*\bkmkstart _Toc431273863}Angle of Attack{\*\bkmkend _Toc431273863} -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid {The ACM HUD has two indicators to give the pilot cues as to the planes current angle of attack and sideslip. -First, above the altitude ladder, is a readout of the plane's current angle of attack in degrees. The ACM F-16 will stall at a positive angle of 30 degrees and a negative angle of -30 degrees. -\par -\par Additionally, a plane-shaped "flight path marker" indicates the aircraft's current direction of travel. Level flight occurs when the flight path marker is aligned with the zero- degree artificial horizon line. -\par }\pard\plain \s2\sb240\sa60\keepn\widctlpar\outlinelevel1\adjustright \b\i\f1 {{\*\bkmkstart _Toc431273864}The G-Meter{\*\bkmkend _Toc431273864} -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid {A readout of the current vertical G-force on the pilot is located above the airspeed ladder. -\par }\pard\plain \s2\sb240\sa60\keepn\widctlpar\outlinelevel1\adjustright \b\i\f1 {{\*\bkmkstart _Toc431273865}Weapon State{\*\bkmkend _Toc431273865} -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid {Below the throttle indicator are discretes that show the state of the currently selected weapon system. -\par -\par }\pard\plain \s1\sb240\sa60\keepn\widctlpar\outlinelevel0\adjustright \f1\fs36\cf9\kerning28 {\page {\*\bkmkstart _Toc431273866}The Radar System{\*\bkmkend _Toc431273866} -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid { -\par The ACM radar system has a field of vi -ew that extends 130 degrees laterally and vertically from the front of the aircraft. The F-16 radar set's range is about 80 nm. All aircraft within that range and field of view will appear as a box on the radar display -\par -\par }\pard \sa120\nowidctlpar\adjustright {\fs20\cf9 {\*\shppict{\pict{\*\picprop\shplid1028{\sp{\sn shapeType}{\sv 75}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn pibName}{\sv \'46\'3a\'5c\'73\'6e -\'61\'70\'73\'68\'6f\'74\'5c\'61\'63\'6d\'5c\'70\'63\'5c\'68\'6c\'70\'5c\'6e\'6f\'72\'6d\'61\'6c\'20\'72\'61\'64\'61\'72\'2e\'62\'6d\'70}}{\sp{\sn pibFlags}{\sv 2}}{\sp{\sn fillColor}{\sv 268435473}}{\sp{\sn fFilled}{\sv 0}}{\sp{\sn fLine}{\sv 0}}} -\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0\picw7618\pich7618\picwgoal4319\pichgoal4319\pngblip\bliptag20157325{\*\blipuid 0133938d128710dcf6f1c1423399dfb5} -89504e470d0a1a0a0000000d4948445200000120000001200803000000235d5eb20000000467414d410000b1889598f4a600000300504c544500000000004000 -00800000a00000c00000ff0040000040400040800040a00040c00040ff0080000080400080800080a00080c00080ff00a00000a04000a08000a0a000a0c000a0 -ff00c00000c04000c08000c0a000c0c000c0ff00ff0000ff4000ff8000ffa000ffc000ffff4000004000404000804000a04000c04000ff404000404040404080 -4040a04040c04040ff4080004080404080804080a04080c04080ff40a00040a04040a08040a0a040a0c040a0ff40c00040c04040c08040c0a040c0c040c0ff40 -ff0040ff4040ff8040ffa040ffc040ffff8000008000408000808000a08000c08000ff8040008040408040808040a08040c08040ff8080008080408080808080 -a08080c08080ff80a00080a04080a08080a0a080a0c080a0ff80c00080c04080c08080c0a080c0c080c0ff80ff0080ff4080ff8080ffa080ffc080ffffa00000 -a00040a00080a000a0a000c0a000ffa04000a04040a04080a040a0a040c0a040ffa08000a08040a08080a080a0a080c0a080ffa0a000a0a040a0a080a0a0a0a0 -a0c0a0a0ffa0c000a0c040a0c080a0c0a0a0c0c0a0c0ffa0ff00a0ff40a0ff80a0ffa0a0ffc0a0ffffc00000c00040c00080c000a0c000c0c000ffc04000c040 -40c04080c040a0c040c0c040ffc08000c08040c08080c080a0c080c0c080ffc0a000c0a040c0a080c0a0a0c0a0c0c0a0ffc0c000c0c040c0c080c0c0a0c0c0c0 -c0c0ffc0ff00c0ff40c0ff80c0ffa0c0ffc0c0ffffff0000ff0040ff0080ff00a0ff00c0ff00ffff4000ff4040ff4080ff40a0ff40c0ff40ffff8000ff8040ff -8080ff80a0ff80c0ff80ffffa000ffa040ffa080ffa0a0ffa0c0ffa0ffffc000ffc040ffc080ffc0a0ffc0c0ffc0ffffff00ffff40ffff80ffffa0ffffc0ffff -ff101010202020303030505050606060707070787878888888909090989898a8a8a8b0b0b0b8b8b8c8c8c8d0d0d0d8d8d8e0e0e0e8e8e8f0f0f0f8f8f8000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c65504db000000 -097048597300000ec400000ec401952b0e1b000009e249444154789ced9d0b96ab300886b31ff6c32ab31fb77305e2a3ad8a779a4268f9cfe9f8e84bbf018c29 -21654a5daa781fc0e84a408a1290a204a42801294a408a1290a204a42801294a408a1290a204a42801294a408a1290a204a42801291a0110a2f7115cc81f502d -25019dab4229a53a1fc4959c01119ee2fd4fba94ebc1e10c0713d0a92af29f0474299c12d095662302703e864b2980b0888e2fc472fd81f2772ba875f066d07b -8090f7139cbf9ea444a1bfbdd746fa7f1e173a88642f156b5d70d402ed0fca99e224ab951f7af3463e67e466d07d40950c09169b6a61838d879ea7156ed3d479 -7b5a1f8aead06844b701d1b953b4e1abf2d2f845dec9cfb225d5f905f428400ffda3df3b7613dd05b4861b5e59dc0e97f8cc4f000abd791fd243fde4378fdd44 -ef019acda46e4fb4db86f949da7be393df3a7223dd05b4c663a4155800cd2bec6d0bb9895fcaf6a37a58083ef76310cc1e24319857d62739044d129870b1b3ba -213c5584083dfdcf659ec85471205e69ef5f42b8f45cf013f7ae61310ce8ff6f35b053f756103e6e808238d81f00dd6920df501403f2ba9b0fc3c709501807f3 -0214c7807c0005e293803479008ac4c70350a0083db9000a65400e8062f1b10714cbc11c000533207340d1f858038ae660e680c2199031a0787c129026534001 -f998028a17a1275b40110dc81250483e8680423a9825a09806640728281f33400f0e565baeda1e5a9f9fdbfacb0ad09e0570d263dd12d5f8400635312340fbb3 -af929606c06bf2b4e45b359b9affcef6349b192e89916d810e09b10e80b0b08b716aa3ec87b2b7a9b6c56314da501759002098f75fd97ce1fcafdf620c0a800d -1019926436d2eab2859c8c4458960525d798872a1340b5e50fcb56cbfcdc00712e11673b164ec2922dc932e2acbeb680d384ed0fca04d0929bb7a4c6f2e300d0 -c3d62e0d6bcdc6423d71adb72c00ade7d408510e1f48aa9aec2e8092618c645deb96bc948672c882d7be10d0ae0924ab55aeefb00e35a4519974e6c02ed4b618 -5095ac3e5954f84e17c393f513f13086715a459f0784175b47aa638dd2ec7124283abe003fddc4df32a1910648750104145e4f4eea6977b84e8f4e804e470dbe -601bc8386ea90fa0f9027462192f3ca299501740f421c7840eec259809bd0508b7a6f171fef491b9fc1620e98be000540fc2d0118c9f0234b5fe1ba0cb3cdc0b -c8bf05689261bcd491c3981e5cea381eff12200069220a1cbe03ddc7ea6314c12e63ef00929eaff9a69c3ab2a676a70d6c4cdc417af6b637bed25e6f00aa623f -74538e9358106d17ac6c51c07dca4b67e268eb26801a10ea0514408581d516b583f9d289de8c41ad70054e4bcd05eed359da471d8ecf5def0112930176a8b6b2 -379b6f20d4e5323f4103f5e454dfe0645d1a8af5a4a1f80d26d4e556a3fdec79f48a773e7e0875b9595d23f48be23b599f2ed7e35b557eaec3e7bbaa4f7f109e -f1896f429d2ce8bc98667413ea6341656b1dbe3edbe11b1cd5ef679f331b0aee64c6bfacc69369f2424459000aed6496f9412165948267f22d1f910da0c04ee6 -90e51a4b4680e29a9047a67d28e56016456680a23a598e17539443321519028ae96439ea5951161650640a28a29365ed0e45b680029a50d60f529425ba145903 -0ae76459054f51169a54640f289893652d5745592e599107a0504e9615c915b9008a6442392b82a29c78449113a0384ee655e2208c09b9d5808842c80d501427 -f3ab2212c4841ccbacc420e4082886937916ea0961429e804298906ba9a70826e45b0b2b00215f406dc4a2eb312872aea6763e56711479979bc30474add9c906 -aa097820f783c304742a2efe5147aa2a7920e7cb7c19abece6819c0fae420252e452e2f73fe40e68ea3583fd873400a0b11b42fe806abad8956a9b1862583903 -82bccc5f890bc425a05371d9be8a09e852792f762d9a2ce2acf6d0105201d5ad88e5343d4cadd3f6e16125e99ba22ec5a19b412a209e3fa5ae80f64d1699fca2 -cdf5f4474914faf3db0da4019209531e36b70d995fe58d6f974f1bb919740b5095796468fe98360bd8ae547b9bb4888a00f30e0ab9779bc6117e18bbe162e248 -6c3020b380ad9316c92c60b2e019c2a8ffabe25da31adab79a6e04e9661bcd5e16b3e1370bab66443c25162e3384dd50043e1a2069cbf139af80ca3a0fda364b -58eb1984a67bdffd0d8090c3cd23a0edd9168ed6b9d326b19f9b2128041f3d4803cdb7571f63d03abba5dc47b550c4d35e522cba77771e21424f3aa0d61df174 -155bfef9d219b85cc56abb86dd0b41310c2893383579010ae2609927ad2a872228f20114c6c172b48faa1c50a7280129ca41bd8a1c00058ad0538e9b5795a529 -1499038ae56059fd4555165852640c289a83650d335559265051025294a54a1559028a17a1a7ac06ac2a0b6e2bb20314d2c1b2a6bdaa9c36429115a0a00ee633 -334b05fe1d1f1eb21c461db0e131f95101e49c2cdce73726a06dbd7062564bbd22d1809f962252d7ad1962e18c1279014c0f792566b201f4308b269d39d43da0 -d9a428b106c4a6dad6fc32a461bf9c71c30b5eb38e6526803842afe9d4282eb6015ab36501714b82a4256d425916b319d9fba109a0765a75cb1edeb21ba74740 -589f01212e0bca27fd4a0b5affed4288dc048a64ec4971134ae52717039ea1bd6d49521b27f9b705d696dd6f290340bb2690ac4a561f85dc960e0b92385b6570 -5ddb624b0289cbd0f6207ea305e1cbba44ecba8d6241368f650f4a3cc6eda5afef30d3e701e1c5d6e1eb39220fd3f0fe38a0a77b8c1b26001ecd9d537d1cd0d3 -a986bb27fb34a0175318c736eec91c503413fa30a0037b0966429f0574642e0968a72318bf07084e6f210ff7ff1ea0f9338e4ffa381eff2020ba5138dc7ff8ea -6097b14e805618b5f0a843de7df6f20e5f69a72e411a80fb6be69b4959a39177402519a6b53371b47563407c7f59b8c34b448335df28c830907a000229935490 -0071f7b1408ae54b27ea7199a7a1acabfd94dd677e03a12e1644255c5ae760c59d6b05bb601daa4b0caa1275400c6847e50b4ca8d7ad86fceaf07281884fe8c3 -77f3f19dccbc3f289a3e0d28bc0959f7498793f5cf3ee1f47940c19dccf897d578324d5e88280b40a19dcc323f28a48c52f04cbee523b20114d8c93cd28043c9 -08505c13f2c8b40fa51ccca2c80c505427cbf1628a7248a6224340319d2c473d2bcac2028a4c014574b2acdda1c816504013cafa418ab24497226b40e19c2cab -e029ca42938aec010573b2ace5aa28cb252bf20014cac9b222b9221740914c2867455094138f28720214c7c9726e1f45397d96223740519ccc0d501413f20314 -849023a0184ee60828860979020a61429e804298902ba008847c0189930d8dc917d02443fd7d8fe15ace80885002bad2ec6437e7867692fbc161023a155541c6 -5a12d0b9508a7eb81e8322e783e3e9ec13d09508d1c8973177405cddd6fb102e3400a0877228c3690840232b01294a408a1290a204a4e81fc58b1dc957af367c0000000049454e44ae426082}}{\nonshppict{\pict\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0 -\picw7618\pich7618\picwgoal4319\pichgoal4319\wmetafile8\bliptag20157325\blipupi96{\*\blipuid 0133938d128710dcf6f1c1423399dfb5}0100090000031ea400000000faa3000000000400000003010800050000000b0200000000050000000c022001200105000000070104000000faa30000430f2000 -cc00000020012001000000002001200100000000280000002001000020010000010008000000000000440100c40e0000c40e0000ec000000ec00000000000000 -4000000080000000a0000000c0000000ff000000000040004000400080004000a0004000c0004000ff004000000080004000800080008000a0008000c0008000 -ff0080000000a0004000a0008000a000a000a000c000a000ff00a0000000c0004000c0008000c000a000c000c000c000ff00c0000000ff004000ff008000ff00 -a000ff00c000ff00ff00ff00101010002020200030303000004000004040000080400000a0400000c0400000ff400000004040004040400080404000a0404000 -c0404000ff404000004080004040800080408000a0408000c0408000ff4080000040a0004040a0008040a000a040a000c040a000ff40a0000040c0004040c000 -8040c000a040c000c040c000ff40c0000040ff004040ff008040ff00a040ff00c040ff00ff40ff00505050006060600070707000787878000080000040800000 -80800000a0800000c0800000ff800000008040004080400080804000a0804000c0804000ff804000008080004080800080808000a0808000c0808000ff808000 -0080a0004080a0008080a000a080a000c080a000ff80a0000080c0004080c0008080c000a080c000c080c000ff80c0000080ff004080ff008080ff00a080ff00 -c080ff00ff80ff0088888800909090009898980000a0000040a0000080a00000a0a00000c0a00000ffa0000000a0400040a0400080a04000a0a04000c0a04000 -ffa0400000a0800040a0800080a08000a0a08000c0a08000ffa0800000a0a00040a0a00080a0a000a0a0a000c0a0a000ffa0a00000a0c00040a0c00080a0c000 -a0a0c000c0a0c000ffa0c00000a0ff0040a0ff0080a0ff00a0a0ff00c0a0ff00ffa0ff00a8a8a800b0b0b000b8b8b80000c0000040c0000080c00000a0c00000 -c0c00000ffc0000000c0400040c0400080c04000a0c04000c0c04000ffc0400000c0800040c0800080c08000a0c08000c0c08000ffc0800000c0a00040c0a000 -80c0a000a0c0a000c0c0a000ffc0a00000c0c00040c0c00080c0c000a0c0c000c0c0c000ffc0c00000c0ff0040c0ff0080c0ff00a0c0ff00c0c0ff00ffc0ff00 -c8c8c800d0d0d000d8d8d800e0e0e000e8e8e800f0f0f000f8f8f80000ff000040ff000080ff0000a0ff0000c0ff0000ffff000000ff400040ff400080ff4000 -a0ff4000c0ff4000ffff400000ff800040ff800080ff8000a0ff8000c0ff8000ffff800000ffa00040ffa00080ffa000a0ffa000c0ffa000ffffa00000ffc000 -40ffc00080ffc000a0ffc000c0ffc000ffffc00000ffff0040ffff0080ffff00a0ffff00c0ffff00ffffff00ebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebc1ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb73004eebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebeb9c2e000073ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebc12e00000000ebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebeb73000000000000ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebc1002e4e739c000000ebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebeb73eb0000ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb9c9ceb0000ebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebeb73ebeb734eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4eebebeb4e73ebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebeb9cc1ebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb73ebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb9cc1ebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb9cc1ebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebeb9cc1ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb73ebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb9cc1ebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb73ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -c19cebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb9c -c1ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb73ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4eeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb9cc1ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4eebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb9cc1ebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebeb73ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4eebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebeb9cc1ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4eebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebeb9cc1ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4eebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebeb73ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebc19cebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb73ebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebeb9c9cebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb73ebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb9cc1ebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebeb73ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebc19cebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb73ebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebeb9c9cebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb73ebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb9cc1ebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebeb73ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4eebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebc19cebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb73ebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebeb9c9cebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebeb4e734eebc14e734ec1ebebebebebebebebebebebebebeb73ebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb9c734e73eb00002e4e734e00ebebc1eb -ebebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebeb2ec1ebeb4e2eebebebebebeb9c73004ec1ebebebebebebebeb9cc1ebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb2e002e00730000002e4e7373734e00ebeb00 -ebebebebebebebeb73ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebeb2e2e0000000000007326734e73002e7300734e734e7373eb4eebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb2e004e732e0000002e4e73734e734e73 -4e73eb0000004ec1ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebeb262e734e734eebeb9c73262e734e734e00002e0026eb739c73ebebeb4e734e739cebeb9c73ebebeb4e734e739cebeb9c -73ebebeb4e734e739cebeb9c73ebebeb4e734e739cebeb9c73ebebeb4e734e739cebeb9c73ebebeb4e734e739cebeb9c73ebebeb4e734e739cebebc14eebebeb -4e734e739cebeb9c73ebebeb4e734e739cebeb9c73ebebeb4e734e739cebeb9c73ebebeb4e734e739cebeb9c73ebebeb4e734e739cebeb9c73ebebeb4e734e73 -9cebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4e73ebeb4eebebebebebebebc1004e0000 -734eebebebeb4eebebebebebebebebebebebebebebebebebebebebebebeb73ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebeb734eeb73ebebebebebebebebebebebebebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebc19ceb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb00eb4eebebebebebebebebebebebebebeb -ebebebebebebebc19cebebebebebebebebebebebebebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebeb262e73ebebebebebebebebebebebebebebebebebebebebebebeb73ebebebebebebebebebebebebebebebebebebebeb73ebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebeb4eebebebebebebebebebebebebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebc19cebebebebebebebebebebebebebebebebebeb73ebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebeb4eebebebebebebebebebebebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb73ebebebebebebebebebebebebebebebeb9cc1ebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebeb4eebebebebebebebebebebebebebebebeb73ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4eebebebebebebebebebebebebebebc19cebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebc19cebebebebebebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb2e00 -000073ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb73ebebebebebebebebebebebebeb73ebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4e004e732600c1ebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebeb4eebebebebebebebebebebeb4eebebebebeb734ec1ebebebc14e73ebebebebebebebeb7373eb739cebebc14e73ebebebeb73 -73eb004eeb9c73ebebebeb4e739cebebebeb73739cebebeb9c734eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebc19cebebebebebebebebeb9cc1ebebebeb26 -000000c1ebc100000026ebebebebebeb260000000073ebc100000000ebeb260000000073eb4e00ebebeb2e00000073ebeb2600000073eb73004e73009cebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebeb4eebebebebebebebebc19cebebebebc100c1eb2600eb2e2eebc100c1ebebebeb73009cebc1004eeb2e2eebeb739cc1009c -ebc1004eeb7300ebebc1009cebc14eebc1009cebc14eeb4ec1ebc10073ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb73ebebebebebeb9cc1ebebebebeb4e00 -ebeb7300eb004eebeb004eebebebeb4e00ebebeb0073eb002e734e73c14e00ebebeb0073eb4e00ebeb4e004e734e73eb4e004e734e73ebc14e0000009cebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebeb9cc1ebebebc14ec1ebebebebebeb730026730026eb0073ebeb0073ebebebeb7300ebebeb004eeb00267373004e7300eb -ebeb004eeb7300ebeb730073732e00eb730073732e00eb0000264eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4e734e739cebebebebebebebeb4e00 -2e002ec1eb004eebeb004eebebebebeb002673260073eb2e00732600ebeb002e732e0073eb4e002e739c0026730073eb9c0026730073eb0073ebc100c1ebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebeb4eebebebebebebebebebebeb7300ebeb9c73eb0073ebeb0073ebebebebebc1000073004eebeb2600009cebeb9c00 -004e004eeb73002600ebc1000026ebebebc1000026ebeb9c0000004eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb73ebebebebebebebebebebebeb00 -2673002eeb4e00732600ebebebebebebebebebeb0073ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebeb4eebebebebebebebebebebebc12e0026c1ebeb2e00009cebebebebebebebebebeb004eebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebc19cebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4eebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebc19cebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb73ebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebc19cebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb73ebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4eebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebc19cebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb73ebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebc19cebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4eeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebc19cebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb73 -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -73ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebc19cebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebc19cebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebeb73ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebc1260000009ceb7300ebebc100002e004eebc100000073ebebebebebebeb730073ebebeb004eebeb2e00002ec1ebeb0000ebeb0000 -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb002ec1eb2600c14e00ebeb002eeb2e0073eb002eeb -c1009cebebebebebeb000000ebebeb0073eb4e009ceb262eeb9c0000c19c0000c1ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebc19cebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebeb73009cebebeb00734e00eb7300ebebeb004e7300ebebebebebebebebebeb9c0000009cebeb004eeb0073ebebebebeb73000073730000 -73ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb9c73ebebebc100737300eb4e00ebebeb00734e000000 -000073ebebebebeb7300eb0073ebeb0073eb000000000000eb2e2e262e2e2e262eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebc173000026eb4e00eb7300ebebeb004e7300ebebeb004eebebebebeb0026eb2e00ebeb004eeb004eebeb7300eb004e7300004e73 -00ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb73ebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4e004e73ebebeb7300ebeb002eeb2e0073eb002eeb -2e00ebebebebeb9c0073eb4e00c1eb0073eb7300c1c10073eb00739c0000c14e00ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebeb0073ebeb9c73eb4e00ebeb9c00002e004eeb9c0000009cebebebebeb7300ebebeb0073eb004eebeb26000026eb4e00ebeb0000ebeb -004eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebc19cebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb004eebeb2e00ebebebebebebebebeb0073ebebebeb -ebebebebebebeb002eebebeb2600ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebeb73ebebebebeb9cebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebeb73007326009cebc14eebebebebebeb004eebebebebebebebebebebc1004eebebeb73009c739cebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4eebebebc14eebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb9c734ec1ebeb9c73ebebebebebeb4ec1ebebebeb -ebebebebebeb9c73ebebebebeb4ec14ec1ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebc19cebeb7373ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4eebeb2e26ebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebeb73eb0000ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb9c73ebebeb9c730000ebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebeb4e00000073000000ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb2e0000000000ebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebeb9c26000000c1ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebc100004eebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebeb4e73ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb73004eebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebeb9c2e000073ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebc12e00000000ebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebeb73000000000000ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebc1002e4e739c000000ebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebeb73eb0000ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb9c9ceb0000ebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebeb73ebeb734eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4eebebeb4e73ebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebeb9cc1ebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb73ebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb9cc1ebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb9cc1ebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb73ebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebc19cebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebeb73ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb9c9cebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebeb73ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -9cc1ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb73ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebc1 -9cebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb73eb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb9c9cebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb73ebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb9cc1ebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebeb73ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4eebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebeb9cc1ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4eebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebeb9cc1ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4eebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebeb73ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebc19cebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb73ebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebeb9c9cebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb73ebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb9cc1ebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebeb73ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebc19cebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb73ebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebeb9c9cebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb73ebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebeb734e734e734ec1ebebebebebebebebebebebebebebebebebebebebebebeb9cc1ebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4e000000004e739cebebebebebebebebeb -ebebebebebebebebebebebebeb73ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebeb4e73eb00c1ebebebebebebebebebebebebebebebebebebebebebebebeb4eebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb73004ec12eebebebebebebebebebebebeb -ebebebebebebebebebebeb9cc1ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebeb4e73ebeb9c2eebebebebebebebebebebebebebebebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4ec1ebebebebeb734eebebeb4e73ebebebebebebebebebeb -ebebebebebebebebebeb9cc1ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebeb739cc1ebebebeb734ec1ebebeb4e73ebebebebebebebebebebebebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4eeb4eebebebeb4ec12e4e734e732e73ebebebebebebebeb -ebebebebebebebebeb73ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebeb73ebeb73ebebeb73eb2e73734e73262e73c1ebebebebebebebebebebebebebebc19cebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb2e004e734e732e2673267326734e732e26732e4ec1ebebeb -ebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebeb2e2e0000000000007373eb4eebebeb734eebebeb2e000073739cebebebebeb73ebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebc1002e4e734e730000004e4eeb2e4e734e0000734e734e2e9ceb -4e7326734e73c19cebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebeb9c26734e734e73260000c173eb2e734e73002e734e737300739c2e734e2e732673c14eebebeb4e734e739cebeb9c73ebebeb4e734e739cebeb9c -73ebebeb4e734e739cebeb9c73ebebeb4e734e739cebeb9c73ebebeb4e734e739cebeb9c73ebebeb4e734e739cebebc14eebebeb4e734e739cebeb9c73ebebeb -4e734e739cebeb9c73ebebeb4e734e739cebebc14eebebeb4e734e739cebebc14eebebeb4e734e739cebebc14eebebeb4e734e739cebebc14eebebeb4e734e73 -9cebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb73000000007300732e2e9ceb4eebebeb004eebebeb2600002e -4e739cebebeb4eebebebebebebebebebebebebebebebebebebebebebebeb73ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebeb2e2e734e734e734e2e734e2e73734e002eeb7326c1ebebebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebc19ceb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4eebeb4eebebeb4e730000002e4e732e4e739cebebebebeb -ebebebebebebebc19cebebebebebebebebebebebebebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebeb73eb4eebebebeb4e7326734e734e2e73ebebebebebebebebebebebebebebebeb73ebebebebebebebebebebebebebebebebebebebeb73ebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4ec19cebebebeb732eebebebebc126ebebebebebebebebeb -ebebebebebebebebeb4eebebebebebebebebebebebebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebeb4ec1ebebebebeb4e00ebebebc14ec1ebebebebebebebebebebebebebebebebebebc19cebebebebebebebebebebebebebebebebebeb73ebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb7300ebebeb2e9cebebebebebebebebebeb -ebebebebebebebebebeb4eebebebebebebebebebebebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebeb4e2eebeb2ec1ebebebebebebebebebebebebebebebebebebebebebeb73ebebebebebebebebebebebebebebebeb9cc1ebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb732e732e26ebebebebebebebebebebebeb -ebebebebebebebebebebeb4eebebebebebebebebebebebebebebebeb73ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebeb4e2e4e00734e73ebebebebebebebebebebebebebebebebebebebebebeb73ebebebebebebebebebebebebebebc19cebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb734e734e734e739cebebebebebebebebeb -ebebebebebebebebebebebeb9cc1ebebebebebebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebc173 -4e73ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4eebebebebebebebebebebebebeb73ebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb9c0000000000ebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebeb73ebebebebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebc14eeb -ebc1004eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb9c9cebebebebebebebebeb9cc1ebebebeb9c -00002eebebeb260000c1ebebebebebeb9c0000730073ebeb2e00004eebebc10000730073eb4e00ebebebc100002ec1ebebc1000026c1ebc12e000073ebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebeb73ebebebebebebebebc19cebebebebeb002e4e0026eb7300732e00ebebebebebc10026732e004eeb4e004e7300c1eb0026 -7326004eeb7300ebebeb0026732e26ebeb0026732e2eeb2e26ebeb0073ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4eebebebebebeb9cc1ebebebebeb7300 -ebeb7300eb004eebeb0073ebebebeb7300ebebeb0073eb0073ebebebeb4e00ebebeb0073eb4e00ebeb4e00ebebebebeb7300ebebebebebebeb7326004eebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebc19cebebebc14ec1ebebebebebeb4e00c1eb2e00eb0073ebeb004eebebebeb4e00ebebeb004eeb00000000004e7300eb -ebeb004eeb7300ebeb730000000000eb4e0000000000eb2e00000073ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4e734e739cebebebebebebebeb7300 -0000004eeb004eebeb0073ebebebebc100c1eb9c0073eb0026ebc100c19c00c1ebc10073eb4e00c1eb4e00c1eb262eeb7300c1eb262eeb002ec1eb4ec1ebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebeb73ebebebebebebebebebebeb4e009c4ec1ebeb0073ebeb004eebebebebeb2e000000004eebc10000002eebeb2e00 -0000004eeb73000000eb2e000000c1ebeb2e000000c1eb2e26732e00ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4eebebebebebebebebebebebc100 -c1eb2e00eb262eebc100c1ebebebebebeb4e73eb0073ebeb9c734eebebebeb4e73eb4ec1eb9c739c73ebeb4e739cebebebeb4e739cebebeb4e734eebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebeb73ebebebebebebebebebebeb2e0000004eebc10000002eebebebebebebebebebeb004eebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb9c9cebebebebebebebebebebeb -9c739cebebeb9c734eebebebebebebebebebebeb4ec1ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebeb73ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4eebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebc19cebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb73ebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebc19cebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4eebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebeb73ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4eebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebc19cebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb73ebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebc19cebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb73eb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb9cc1ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4e -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb73ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb73ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -eb9c9cebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb73ebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb9c739ceb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebeb73004eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebc19cebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4e0073eb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebeb73ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebeb4e004eebebebebeb73000026c1ebeb7300732e0026c1ebebebebebebebeb000073ebebebeb0000ebebc12e00002e9cebebeb73 -00ebeb7300ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb730073ebebebeb2e002e730000c1eb4e00002e -730000ebebebebebebeb73002e00ebebebeb0000ebeb00004e730073ebebeb0000c1eb260073ebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebc19cebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebeb4e004eebebebc10026ebebc10026eb730026ebeb2e004eebebebebebeb2e004e009cebebeb0000eb730073ebebebebebeb9c00 -4e73eb007326ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb730073ebebeb4e0073ebebeb0000eb730073eb -eb4e0073ebebebebebeb002ec10073ebebeb0000eb4e000000000000ebeb73007326c1007300ebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebeb4e004eebebeb73004eebebeb0000eb4e004eebeb73004eebebebebeb4e004eeb0000ebebeb0000eb730026734e0000ebeb004e -eb00734eeb0073ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb73ebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb730073ebebebeb0000c1eb260073eb730000eb -eb0000c1ebebebebeb7300c1eb2e00ebebeb0000ebc1002eebc1004eebc10073eb002e73eb002eebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebeb4eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebeb4e004eebebebebc1000000002eebeb4e00000000002eebebebebebeb0000ebeb4e0073ebeb0000ebeb2600000000c1eb4e00eb -eb4e00ebeb4e00ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebc19cebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb730073ebebebebebeb4e739cebebebc14ec19c -734eebebebebebeb9c002eebebc1002eebeb734eebebebc14e73ebebeb734eebebc14eebebc14ec1ebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebeb73ebebebebeb9cebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebeb4e000000000000004eebebebebebebebebebebebebebebebebebebebebeb73004eebebeb0000ebeb4e73ebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4eebebebc14eebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb730000000000000073ebebebebebebebebebebebebeb -ebebebebebebebeb0000c1ebebeb260073eb0000ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebc19cebeb7373ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb4eebeb262eebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebeb73eb0000ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebc14eebebeb9c730000ebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebeb7300000073000000ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb2e0000000000ebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebeb9c2e0000009cebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebc1000073ebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebeb734eebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb -ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb05000000070101000000030000000000}}}{ -\cf9 -\par }\pard \sa120\widctlpar\adjustright { -\par -\par FIGURE 2 RADAR COVERAGE -\par -\par The ACM radar display presents a forward looking view of radar targets. Think of it as a television monitor connected to a forward-pointing TV camera that has a very wide angle lens. -\par If any o -bjects are close enough to be radar-visible, the set will automatically lock onto the nearest threat. With radar lock acquired, your display will provide detailed information about the locked, or "primary", target's disposition. A primary target appears a -s a filled diamond (}{\cf4 {\field{\*\fldinst SYMBOL 117 \\f "Wingdings" \\s 11}{\fldrslt\f14\fs22}}}{ -) on the radar display -- the display provides information on the primary target's range and altitude, as well as it's current heading, your desired relative heading to intercept and the rate of closure of your two aircraft. -\par -\par }\pard \sa120\keepn\widctlpar\adjustright {FIGURE 3 THE ACM RADAR DISPLAY}{\cf9 -\par }\pard \sa120\nowidctlpar\adjustright {\fs20\cf9 {\*\shppict{\pict{\*\picprop\shplid1029{\sp{\sn shapeType}{\sv 75}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn pibName}{\sv \'46\'3a\'5c\'73\'6e -\'61\'70\'73\'68\'6f\'74\'5c\'61\'63\'6d\'5c\'70\'63\'5c\'68\'6c\'70\'5c\'72\'61\'64\'61\'72\'2e\'62\'6d\'70}}{\sp{\sn pibFlags}{\sv 2}}{\sp{\sn fillColor}{\sv 268435473}}{\sp{\sn fFilled}{\sv 0}}{\sp{\sn fLine}{\sv 0}}} -\picscalex90\picscaley90\piccropl0\piccropr0\piccropt0\piccropb0\picw16932\pich8465\picwgoal9599\pichgoal4799\pngblip\bliptag1580307736{\*\blipuid 5e319518b9138075836aca83dd338cc2} -89504e470d0a1a0a0000000d49484452000002800000014008030000001b133d380000000467414d410000b1889598f4a600000300504c544500000080000000 -8000808000000080800080008080c0c0c0c0dcc0a6caf0402000602000802000a02000c02000e02000004000204000404000604000804000a04000c04000e040 -00006000206000406000606000806000a06000c06000e06000008000208000408000608000808000a08000c08000e0800000a00020a00040a00060a00080a000 -a0a000c0a000e0a00000c00020c00040c00060c00080c000a0c000c0c000e0c00000e00020e00040e00060e00080e000a0e000c0e000e0e00000004020004040 -0040600040800040a00040c00040e00040002040202040402040602040802040a02040c02040e02040004040204040404040604040804040a04040c04040e040 -40006040206040406040606040806040a06040c06040e06040008040208040408040608040808040a08040c08040e0804000a04020a04040a04060a04080a040 -a0a040c0a040e0a04000c04020c04040c04060c04080c040a0c040c0c040e0c04000e04020e04040e04060e04080e040a0e040c0e040e0e04000008020008040 -0080600080800080a00080c00080e00080002080202080402080602080802080a02080c02080e02080004080204080404080604080804080a04080c04080e040 -80006080206080406080606080806080a06080c06080e06080008080208080408080608080808080a08080c08080e0808000a08020a08040a08060a08080a080 -a0a080c0a080e0a08000c08020c08040c08060c08080c080a0c080c0c080e0c08000e08020e08040e08060e08080e080a0e080c0e080e0e0800000c02000c040 -00c06000c08000c0a000c0c000c0e000c00020c02020c04020c06020c08020c0a020c0c020c0e020c00040c02040c04040c06040c08040c0a040c0c040c0e040 -c00060c02060c04060c06060c08060c0a060c0c060c0e060c00080c02080c04080c06080c08080c0a080c0c080c0e080c000a0c020a0c040a0c060a0c080a0c0 -a0a0c0c0a0c0e0a0c000c0c020c0c040c0c060c0c080c0c0a0c0c0fffbf0a0a0a4808080ff000000ff00ffff000000ffff00ff00ffffffffff58d23444000000 -097048597300000ec400000ec401952b0e1b0000170f49444154789ced9dcb96b32a1046199cb560d88f92d770ead44773ca34af07434f15145e1293983f6a99 -f8edb5ba9328e285dd05681a4c07802246fb00c0b981804015080854818040150808548180401508085481804015080854818040150808548180401508085481 -80401508085481804015080854818040150808548180401508085481804015080854818040150808548180401508085481804095e7028698714f13e517fb3ae5 -80b3734be3b28dff91774e860f26a58b8197053ab2102609ed4d3681ce287a2b19b868f32ef9c57a9fb291d3dbf62cbf8dd7021afa09cfd254796d6c29a137cb -0c6c66738cb35aaec53b2743d6d42dbfd0f9f898dca9a767e66f3c22f76c65832cb6a6e697687cd7b5adb5be0e9d936b6d61e088d75570514a224018dee6d760 -44c0745da3efc609baee36f9286d374a95b3aa9fc9b1064b4f86b4b1e960b280e34d65c3bcb43f5ed7e4732f02d6c9d7a6f592651b7b01bbcdcff29b582aa0af -0cff35d757fa1d4d75a5ab1a5a63dad01993530c02c62aadf0be31954d1f232509de98460a918bc0c4dad06bf4de54cea7941c46b665e9c9d0df423e21e3a231 -91dca98db1e9af8b12d8da78328acfac9623a623a7848613f3475bf3d6a18a2c20e718860858fefc00b350400e07d6d8aea60b4aef49a6d0d55c042d5dd75c64 -d400b236562ea575e413573bb1a6b7ae63015baafb6caa983ac72f54dea165016c77a5d4919759bfdd99be75322c494847e9021d38b91368031130d0e15a122d -b67ca2399c55dc50e433ca35bcadf91ce335fd3d9a26b5277b01e52a006669040c7c01a9cc6cae65a85e21c70813fa2ab8f66de583a4a502e57474d1e395933b -2a40a24a99d956f2a5f2a1524f25928ac76d5d344b4f26542e84c6962a980f8ede898096aa5b36b68eb44d9bab623efa4915dcd1a936396606ebab511b7054cf -83a50206ae2fa5ccb85ce81adaca3361dc0674a9e5c369ab5e409f6b326752f25c5b4b559604f46301b7be2bb4f464ac61da7901d30b2d352d6f93ea60772fe0 -35868a17e5b6a5f71070968502c6d6510369081a8e8306af0dd34e0857a4b671a94a2b11d04b0494e0d8dd4440bf7b045c7032ec65ea12df0948a792aad026a6 -ed4b3feb5e40db585f423c5f140838cb4201e90f38442933aa4773b3c9731b2f4c7bc1756e1a45d30be8f8e604b70129b9cd2da654dc7302eed3067c7d32d2b2 -e3283716900f3f8eda8014ef9df4422a772b6057d5a9d5483d11aa7e1bce243068034e5828a0ab0df5e8e48f3e5655948e23776b9b712f98ca28a4b4be0848d7 -bb2abde0722f8d5fe704dca717fcfa64f2cd24fe4361ed8ce783f3a42c77d6a7bde04a7ab4dee6adac499bf21979d6953e39caba4ad782f1e8054f58dce81a6a -0d7e0620156ab85975979670b7c9bb8745b0fd7dc0b2a3feddeb9399de34bcc960721f709c782e8302ee038ef88756bfadad6d96d795963a986d7bb350e349c8 -2c6f9ecc6396076f3c0919f32fdd4eebe7afb69f2f4879143a41e359f03c93937970064b088b05847f63d6bceff141f11d84ef3f83af63d51b6f5f5e7efecb8f -ff2b59f7ceef3797a0877f1aacfce8e16bcb10fa29b1f6b3af2f2d46e8a7c5ea0f5fbfb124a19f1eeb3ffdffbac244edabc9065f3ff9aee2847eba6cf1fda72f -2a51e8a7cd265fc0fb9a42857eea6cf30dd0ef2857e8770036fa0af217142d6adf43b0d577e08f5eb8d0ef206cf64f18872e5fe87718b6fb2fa0031731f43b0e -1bfe1bda514b19fa1d892dff0ff290058ddaf7586cfa8fb8c72b6ae87734b6fd4ff0839536f43b1e1b0f4570a802877e0764ebb1308e53e6d0ef906c3e44ef41 -ca1db5ef41d97e8ce823143cf43b2c2718a4dc43bf03730e01b50f013ce4040282230301812a9f0a18ff7e84ff56b99ce05d3e15d0688bb316a80a7480800204 -d401020a1050873d05bc5cb6b26785bd41401d7e56c00b04fc0a7614f05d253ee3f2f7dede20a00ebbb601df53e2232e10f03bf85901dfdd1b04d4e167054cbc -b10104d4e12b04fcb7eddedb0a02ea00010508a8c357dc88beecb00f08a883828097436e01017580800204d4e12b04dc631f105007082840401d20a0000175f8 -8a5ef01e40401d20a000017580800204d401020a105007082840401d20a000017580800204d401020a105007082840401d20a000017580800204d401020a1050 -07082840401d20a000017580800204d401020a105007082840401d20a000017580800204d401020a105007082840401d20a000017580800204d401020a105007 -082840401d20a000017580800204d401020a105007082840401d5611b08c48bfef5434eb0201755829028a7f3b4f07b726105087b5042cbf2e5a027d0a04d461 -b5087819047c778e1865f2e142401d56eb845c1001c13f00010508a8c33abde0fc834e08781bdc861120a00eb8112d40401d20a000017580800204d401020a10 -5007082840401d20a000017580800204d401020a105007082840401d20a000017580800204d401020a105007082840401d20a000017580800204d401020a1050 -0708283cbc102166dcb3cb10deb9662186275b593bfa10d36f17dfc9fe25ebe6f6211050782aa0a19f678e85ea1d0383c9a95b3bb7368efc883985addfc8fd35 -f648064240e1e9853012fe4236270c6ff36b516a086ae324dd645d0825756def32eb2602863a2fcc028e763e7b107711959796359304f55b017b5b20a0b04040 -5f19e3a9f8aef43b9aea4a1e85d6983674c6e414ae368d8f9d6d1be36455928754ab636d6a4ae44d15b380de989852d2566955ac0c2524016d95231fbb48d9d0 -a629ebcae78fbe26e3afc6720ebc9dacb2f432c86b6b3a441b691f694dd9b737dd34c86a030185d7025a0a1c968abdf65da0f7c193473515656c3b2721923e3a -92c0927e5deb29493b08d8842e7dcc1b761cdf6c4829696df00d69e7e8876afce25f97a4a16c6a328e9685365216f9237b45ab7883b28ab3a9fb962a1f694cc7 -921334f447d304f2b75bbd4aff0808282c8880a48d6301490f1f53bdeb2a4b9852a9baaa4babb880d322fad50b6853c173bbcf0d55705acb0929aa719ef43ed6 -258ea52c2a0e8d35594e3ba257fe686b59c53baf6d5955b77654b572cecee44cd20e7cd7f0219892f1418080c2ec85a052cb67c90206ae4445402e4bb6abf24c -1130e914635ff8bce18d80b51dcabf0868dbaaaa4540ae88db36ef35b9c3692955acf39ee4635ed5f2222babc8b1caf8deacb180b63115c56d96d741c083f25a -c0d85275398a808e2320af0da544d3cb8b0818ef2220d5901cf7b28031c46bc8bd932102b2807224930898fe2cfa551ca05b5f0e7d24a0e31d20021e9cb90b51 -fccb027290892220b5d7721bd0b33b7dbfb6f11414b380b90dd8a4e62137ea44c0511bb0179052388a807d1b907f97047da38fdb713eb5e35c2d02fa26a40391 -55d4000dfe5a3abc2301393b8ad5b4c8b9066dc0833273217affb280dcd98c3ee6bb27b14a9d59eeea36b4b29156624bd5a20828bde0d4ed1d2220779fa5174c -6f634a79a584d4904cbd6097baa83e57c2e35e30f764b982f555ee05a7769d3139dbb4cae5170988e32a98d279ce2356d483efd00b3e24f71762f0af30545cd6 -958a6c7c872db09abe2fdde93db89ba5e3fcfa45b737f2eabb54dccfb0ed6d5e933d5defce4456f0b62eb5088e530343c0c2dd85b8f76f04753e6d739fa0a62e -c15b0f455e10ef9e9578eaf256b34f500aeee1dad850a739e249c831b9b910fea97f5488d4fdbc5f1aa2f74f9f19bfcb9d2abc87a7fe3d430efa48fe41c0c2f4 -42bcf20fac050414261702faed060414c61702feed070414461702feed080414fa0b81e6dfae4040a15c08f8b72f1050900b01fd7606020af942c0bfbdf92601 -2f5b669e2e04fcdb9d2f1270db4920f842c0bffdf91e01379e81cea0fba1c2d70878b96c6ba0817f2a7c8b8097cbc606423f1dbe45c0ad2320fc53e26b04dcb6 -0de83dc686d1e17b04dcb0174ccd3f0c4ea4c40a02ae1d9a2eb7edbdc9bbf5abe20bf98719d3b538720414cd866988b7098114fefe303c9b164716f04f26219e -fc5a9dec1f0454e2d0024e83dfa6fe4140258e2de0df5c4370558a7f105089830bb831bef70f022a716a0147fe414025ce2ce0483f9d31a29fd18f0b1d6c57f6 -3d0c7db5ea3f1fab72620127fe698c11fd947e00a1d6c958bea331a543f3c6ee8ecd79059cfab7ff18d173c3ba8cf65004b4be0c269d5f7282230d2ff4196715 -d0dff8b7f718d1b1323caa9aa157fe1ac474b4e7322216c383faf1c8d195e331a5439387dc72071a60ed334e2ae09d7f3b8f119dc62de551d678f43f7b3bdab3 -8c0bcda468595bf22f8d29cd6314b2927970ca5fe09c02dee9f74840f996d6ea6344872a0d62c46353f2686b37a33dcbb8d029cbb4799d0e8003616d9fcd31f2 -859c52c019ff1608b8ea18d196a74c282340df8cf65c0682eeb3ac6b8eb469187c3a86260dd7fa2b8dc0330a38e7dfde634407aec66d8a80d1df8ef62c034133 -39025ac78b58c0d0b96b1a00181150b6df5d9f8f99f56fe731a2d93c6ed3199fdb80d3d19e655c6846da805d6cd28b4ffbebd0061cb6df5b9f4fb9ef7e64761e -23da563cad114f78c4b382dc8cf63cee05b7b917ccfd9b48bde0b674973f2cb7c37036011ff9b7ff18d172fff0d17dc07e4fa3a318f687fb80fdf6fbfaf3298f -f4bb17f0f97f69ae3446f4926722ed4c123c0919b6df539f8f79ec9fce18d14b9e0a8799fde059f0b0fd8efa7ccc13ffeec688fef0ba80859c4740ffb0f997c0 -18d13a9c4ac067ab3146b40ee711f005c385c020317b0201058c11ad0304148631a23fbda4e01d20a08031a275808002c688d601020a79885ef8b737105030f0 -4f851f16300fa59087d27a3da29641f5abc2af0b98eceb3f3dc1c03f157e57c01cf2cacfcb4946e09f0ebf2ba0c877e987d7ba3c498ae69f16bf2f605ff95e1e -a7f418235a8b9f17f0af37eff230217f4d0102ea701201cbdb59d2d76420a00e3f2fe0ebdb3018235a935f167009fdd75421a00e10106344abf2bb025ec64f42 -fe2655f065e6be3404d4e1670594fb2ff224a47f2092d7cd3c1781803afcae807fe3eeafbc9475331d1208a8c3cf0b385303cf3e1786803afcae807d153c7ae9 -d75deed243401d7e56c0f23dacbfb92a186dc0c3f0bb020e3d8fcbbd80e8051f855504bc0c2dadada55acca8f177b97d127299490f0175582902962f7f1ec8c0 -3781803aac2560f975d112e85320a00eab45c0cbe8db272b4f69be31f97021a00eab75422e478b80c3a3b8d18bac9a490e0175f859019fde079c490f017558a7 -17fc576e6d1ca7eabdfc3d791437931e02eaf0bbb761fe20e037f0b337a22f7f130151051f94930878f77dc03b20a00ebf2be06def03021e929f15707affe5f6 -eb58f7ad5508a8c3ef0af826105087730b381a381f02ea7076017b0321a00ee71670642004d4e1e4020eb53004d4e1f40296200801758080622004d40102fe61 -78364d202083012ad58080090cd1ab05041460a00e10503008822a4040c1f41325859871cfce3bbc718d9ea6bddd8d73b38b9730dac6d1b93cd9ed90d2457943 -a9e383d49bf28302de0d0cb868ab61ae3816d0d0cf336f42b5dcc0f8b4606b3bcdb809738b1731daa68ad6d54f0ea917d04a2a3ec8f80ffbfc98df13f06e60c0 -6506a60bd1d7c2464a28641dc2f036bf0653042c29cadafba58380d344f953b226f43a6709c274f164cf93fd85f1dfc1b00d1f9eed05bc4d3bce9552f50719ea -77e2fa4afca0807f8fff19e409d30b9105f49531a4647da5dfd154572ad6d01ad386ce989cc2d5c6d48ee2565a1a7dcb9f7869c52a7b639a10531ea3dc629d12 -4986648de4c9a4c86a2be359269ff22e1fa3afaa71cebc4a5e843eab408747bbcda7249ba4cd09db36c6514a5adcf84802a6e3cb07e91542e0ef09f827d14f6a -e0bf7f17d05244b0c67635b5a7e87df0ec0b57556de724447299fb86236768c8114a1c29a4546c42ec2255a7be0dde4bac91dcd2d2aecfd0963c53227a71954b -39f176b6229b4ac621949c65956d58fafea087ace8f0f8887961daa48969f3b4075a25295d15d31171ea749056a11bf68b028e07aa79af0a1e4e2bf94565e258 -198e4631556caeb28409a50aa6dfc1d754ba36d5635c80958b2da52111793b2af552058f72a38a4f32a48f25cf4e72c8b9d82e2dae6db2224540762be75c5655 -93beca90d5a80a4e2ff4ab889a3e73ca2e9d947ccc07f9acd9b815bf23e0e5d28f84953e969f85bd901901035796a24c63932fb6e2791d7c2fa06dabaaae53ca -c6e552acc99094a8342445c0716e54ec9261c71ae53c4b5ac925989617db78ed7a4524e7b2aab38da9872ece90d548c0249e33fd9f8118975ee2ad800a8f837e -47c042f91fa4bf52f7feb380b1a5da6a14011d47405e1b4a2784eab7902addd0b96bdd474009362902c652f4e3dc24023a898039cf94681c01d31f41aa95f963 -1250729655b4db60fbeed028abb9083815309d0022e0164c47045c3c4ed28c80dcb28b4599cae5269b0fa9392502523a4711d0a7a55de4d69bb40169e3d8a6d6 -9e5833c9ad1e32b4254f4e641bce3437fa7c13522a923cb50163d7e72cabb899c712bbfed6cde8f044c0be0d3815b06b3c85f391807c9068032a322320f71f23 -4589747b235655945e3055b65d93ebd72b753ab9cdd5a6ee68f4a926a652a54e65905e30b5f35307639c1b17bb64285dd72657d7e35e70e03eaee50d2b5f6294 -e45c56d10bf9d58d7a44392b163054f98fa4f4826f04a494ed2802a683442f5891d90b31dc17b3aedcfc1bdd1a1c3ef537d366ee03dedecebbcd709462b80f38 -2c76bc64b8d932771fd08eba22a33b8337f7fda667c6b9fad12d72aece711f5091171782fb9ccdab1aeaf9338f451986e67689aba2f5cf1b67fff20cada6eecd -cde39cb33c09b9ecbcc5e87f2f9ff0ea4258ffba82b2ef94e0830cdddd4360e7fdd3c782ff4688dedfecea2ccf822f2f53acbbc53a02826d388180cb0c84803a -9c41c0450642401d20a000017538472f7881811050875d05dc6328dfd97d40c0c3b27304dc6346a5b97dbc361002eab0b780e5d7e559aacf98db07043c2abb47 -c0cbf602ceede3a581105087dd3b213372accecc3e20e041398b802f0d84803aecdb0bfedb7e46a547fb8080c7e41cb76198170642401dce71239a818087e43c -02be301002eaf0b180df83f74f57af7239c1bbfca4800f8e15c35f1d9033fde143c00372260161e00181804095530908038f070404aa9c4b40187838202050e5 -6402c2c0a30101812a671310061e0c080854399d80e0584040a00a0404aa4040a00a0404aa4040a00a0404aa4040a0cac904743234f7dda8dff66e6cf065f9d9 -e14dbc9d41d52acc7af0759c4bc058471b4753bb0cfca380fd5c954de8a78b1966236fff29cf73712a015d9a18c35622cbfda4cff70be6269e194df95c04e419 -4244c051d61a330f7d1ba71250660672c912d7a459af78ca699f5679dfa489af62656299e832cd88e578f6679ea9cd9b321357c51f1b539727cb3cc7106de3eb -40d959c933cdfc069e732a019b3e22912c75ec42ebbb965e483216b04e330ee6f9a2653e745ad290809e270aa6a4690a4097a648b75dc3533e6701d33493c671 -0e3cd5a0e4394cc5051e722a01eb9180696653673adfa4be020b18f3c4bad73c0b665a9d2684e60929a9b225b588ca5d3dbd5cdb9097a6ecd294aaa64e353c07 -c246fa1ff5bfb52ccfc4a9042c5530b701d334912451b856a67523015322a9826dcb956d9ac7397a0a840cc5b9fc9a97a674e9c5344970da54f21c1b0f1e702a -01739b2c501d3b44409e6bdab7e308e8fb08982684ae5c8e8057992cb3f3d794d97d0474dcbd4902e63c110117702a017996666af8b59336e03569340848ad3d -ea6de42a98540d2c604c6f5bcfd344a7e660a0661e6d1c6a6903b2cd5cf7faf42279a20db8807309187c652a1f26bde026cd2a3d0848fd8caaef0557b90abee6 -6eaf4fd352e759a3732ff85a7ac1b9679dba33d40bce79e6c0089e722e01bbc9eccdf7f70119379e493a25e78a7ab2c5cda4d5dd74a6e061566bdc077ccde904 -7c89adac6d27a1cb2db848cd4c651b10005f0301efb0b7134487053339bb99608767c10b808040150808548180401508085481804015080854818040150808548180401508085481804015080854818040150808548180401508085481804015080854f91f5e58367c03b4acd40000000049454e44ae426082} -}{\nonshppict{\pict\picscalex90\picscaley90\piccropl0\piccropr0\piccropt0\piccropb0\picw16932\pich8465\picwgoal9599\pichgoal4799\wmetafile8\bliptag1580307736\blipupi96{\*\blipuid 5e319518b9138075836aca83dd338cc2} -0100090000033a92010000001692010000000400000003010800050000000b0200000000050000000c02400180020500000007010400000016920100430f2000 -cc00000040018002000000004001800200000000280000008002000040010000010008000000000000200300c40e0000c40e0000fa000000fa00000000000000 -4000000080000000c0000000ff0000004000200080002000c00020004000400080004000c00040004000600080006000c0006000000080004000800080008000 -c00080004000a0008000a000c000a0004000c0008000c000c000c0004000e0008000e000c000e0000000ff00ff00ff004020000080200000c020000040202000 -80202000c0202000002040004020400080204000c0204000002060004020600080206000c0206000002080004020800080208000c02080000020a0004020a000 -8020a000c020a0000020c0004020c0008020c000c020c0000020e0004020e0008020e000c020e000004000004040000080400000c04000000040200040402000 -80402000c0402000004040004040400080404000c0404000004060004040600080406000c0406000004080004040800080408000c04080000040a0004040a000 -8040a000c040a0000040c0004040c0008040c000c040c0000040e0004040e0008040e000c040e000006000004060000080600000c06000000060200040602000 -80602000c0602000006040004060400080604000c0604000006060004060600080606000c0606000006080004060800080608000c06080000060a0004060a000 -8060a000c060a0000060c0004060c0008060c000c060c0000060e0004060e0008060e000c060e000008000004080000080800000c08000000080200040802000 -80802000c0802000008040004080400080804000c0804000008060004080600080806000c0806000008080004080800080808000c08080000080a0004080a000 -8080a000c080a0000080c0004080c0008080c000c080c0000080e0004080e0008080e000c080e00000a0000040a0000080a00000c0a0000000a0200040a02000 -80a02000c0a0200000a0400040a0400080a04000c0a0400000a0600040a0600080a06000c0a0600000a0800040a0800080a08000c0a0800000a0a00040a0a000 -80a0a000a4a0a000c0a0a00000a0c00040a0c00080a0c000c0a0c00000a0e00040a0e00080a0e000c0a0e00000c0000040c0000080c00000c0c0000000c02000 -40c0200080c02000c0c0200000c0400040c0400080c04000c0c0400000c0600040c0600080c06000c0c0600000c0800040c0800080c08000c0c0800000c0a000 -40c0a00080c0a000c0c0a00000c0c00040c0c00080c0c000c0c0c00000c0e00040c0e00080c0e000f0caa600c0dcc00000e0000040e0000080e0000000e02000 -40e0200080e0200000e0400040e0400080e0400000e0600040e0600080e0600000e0800040e0800080e0800000e0a00040e0a00080e0a00000e0c00040e0c000 -80e0c00000e0e00040e0e00080e0e000f0fbff0000ff0000ffff000000ffff00ffffff00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9d78d8db2f5f9f9f9f9f9 -f9f9f9f9f9f9f9f9b2f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9dcd7f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9d7 -f5f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9d720d7d76969f9f9f9f9f9 -f9f9f9f9f9f9f9dc00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f968f5f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f5 -69f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f5f9f9f9f9f9f9f9f9f9f9f5f5f9f9f9f9f9f5f9f9f9f9f9f9f9f9f9f9f9f9f9f9dcdcf9f9f900f5f9f9f9f9 -f9f9f9f9f9f9f9dc00f9f5f9f9f9f9f9f9f5f5f9f9f9f9f9f9f9f5f9f9f9f9f9f5f9f9f9f9f9f9f9f9f9b2b2f9f9f9f9f9f9f9f9f9f9f5f9f9f9f9f5f9f9f9f9 -8dd7f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f58d2000208df5f9f900dcf9dc6800008df5f9dc68000068f5f98db2f98db2f9f9dc00f9f9d74420b200dcf9f9f9f9 -f9b2200020b2f9dc00b10020b2f9f9f58d000044dcf9f9d74400008df9f9f5680044b18df9f9f9f9f9f944dcf9f900dcf9f544d7f98d00d7dc68000068f5f9f9 -d769f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9688df5f9f56969f9f900dcf944b2f9f5698df969b1f9f9b28df98db2f98db2f9f9dc00f9dc20d7f58d00dcf9f9f9f9 -dc20dcf9f520dcdc00b2f9dc20dcf9698df5f9d720f5dc20d7f9f569b2f9698df9f5448df9f9f9f9f9dc20f9f9f900dcf98d8df9f900dcf969b1f9f9b28df9f9 -f500f5f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9d768f9f9f9f9f520dcf900dcdc20f9f9f9dc00f9f9f5f9dc8d69f98db2f98db2f9f9dc00f9b28df9f9f500dcf9f9f9f9 -f5f5f9f5d720dcdc00f5f9f9b2b1f500f9f9f9f9f5f98db1f9f9f9f9f9f500f9f9f9b28df9f9f9f9f9d769f9f9f900dcd720f5f9f900dcf9f5f5f9dc8d69f9f9 -f944dcf9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98db2f9f9f9f9f9dcf9f900dcd744f9f9f9f900f5f5b1200069dcf98db2f98db2f9f9dc00f98db2f9f9f900dcf9f9f9f9 -f9d7690020b2f9dc00f9f9f9b28ddc008d8d8d8d8ddc8d448d8d8d8d8ddc00f9f9f9b28df9f9f9f9f9b28df9f9f9006844d7f9f9f900dcf9f5b1200069dcf9f9 -f944d7f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f944d7f9f9f9f9f9f9f9f900dcdc20f9f9f9dc00f98d68d7f5f9f9f98db2f98db2f9f9dc00f9b2b1f9f9f900dcf9f9f9f9 -dc00b2dcf9f9f9dc00f5f9f9b28df500d7d7d7d720dcb18dd7d7d7b169f500f5f9f9b28df9f9f9f9f9d769f9f9f9004420f5f9f9f900dcf98d68d7f5f9f9f9f9 -f944dcf9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f968d7f9f9f9f9f9f9f9f900dcf944b2f9f5698df969b2f9f544d7f98db2f98d44f9f9b244f9dc20dcf9b200dcf9f9f9f9 -dc44f9f9b268f9dc008df9dc20d7f969b2f5f9d744f9dc44dcf9f568d7f968b2f9dc208df9f9f9f9f9dc44f9f9f900dc8d44f5f9f500d7f969b2f9f544d7f9f9 -f500f5f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98db2f9f9f9f9f9dcf9f900dcf9dc6800008df5f9dc4400008df9f98db2f98d8d680020d7f9f9b22000b200dcf9f9f9f9 -f9b2000044d7f9dc00b20000b2f9f9f58d000068dcf9f9d7440020b2f9f9f56800448d8df9f9f9f9f9f944f5f9f900dcf98d44f5440000d7dc4400008df9f9f9 -d768f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9dc20f9f9f9f9d720f5f900dcf9f9f9f5f9f9f9f9f9f9f5f9f9f9f9f9f9f9f9f9f9f5f9f9f9f9f9f5f5f9f9f9f9f9f9f9 -f9f9f5f5f9f9f9f9f9f9f5f5f9f9f9f9f9f5f5f9f9f9f9f9f9f5f9f9f9f9f9f9f5f9b28df9f9f9f9f9f9b2b2f9f900dcf9f9f9f9f900dcf9f9f9f5f5f9f9f9f9 -8dd7f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9b244b2d7b220d7f9f900dcf9f9f9f9f9f9f9f9f9f9f9f9f9f9f9d7dcf9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9b28df9f9f9f9f9f9f968f5f900dcf9f9f9f9f944dcf9f9f9f9f9f9f9f9dc -69f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9dcb28d8ddcf9f9f9b2f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9d7dcf9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9dcd7f9f9f9f9f9f9f9dcd7f9b2f5f9f9f9f9f9f5f5f9f9f9f9f9f9f9f9d7 -f5f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f90000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f90000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000008d8d0000000000000000000000000000000000000000000000000000000000f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b8d8d3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b8d8d3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbcbcbcbcbc3b3b3bbcbcbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbcbcbcbcbc3b3b3bbcbcbc3b -3b3b3b3b3b3b3b3b3b3b3b3b3b8d8d3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc3b3b3bbc3b3bbcbc3bbcbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc3b3b3bbc3b3bbcbc3bbcbc -3b3b3b3b3b3b3b3b3b3b3b3b8d8d3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc3b3bbc3b3b3bbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc3b3bbc3b3b3bbc -3b3b3b3b3b3b3b3b3b3b3b3b8d8d3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc3b3bbc3b3b3bbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc3b3bbc3b3b3bbc -3b3b3b3b3b3b3b3b3b3b3b8d8d3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbcbcbc3b3bbc3b3b3bbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbcbcbc3b3bbc3b3b3bbc -3b3b3b3b3b3b3b3b3b3b3b8d8d3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc3b3b3b3bbc3b3b3bbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc3b3b3b3bbc3b3b3bbc -3b3b3b3b3b3b3b3b3b3b8d8d3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbcbc3b3b3bbcbc3bbcbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbcbc3b3b3bbcbc3bbcbc -3b3b3b3b3b3b3b3b3b3b8d8d3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbcbcbcbcbc3b3b3bbcbcbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbcbcbcbcbc3b3b3bbcbcbc3b -3b3b3b3b3b3b3b3b3b8d8d3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b8d8d3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3bbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc3b3b3b3b3b -3b3b3b3b3b3b3b3b8d8d3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3bbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc3b3b3b3b3b -3b3b3b3b3b3b3b3b8d8d3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3bbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc3b3b3b3b3b -3b3b3b3b3b3b3b8d8d3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3bbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc3b3b3b3b3b -3b3b3b3b3b3b8d8d3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3bbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc3b3b3b3b3b -3b3b3b3b3b3b8d8d3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9d78d8dd7f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9d7d7f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9d78d8dd7f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9dcdcf9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9dc8d8db2f5f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f5b28d8ddcf9f9f9f9f9f9f9f9f9f9f9f9f9f9b2f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9d744d7d7688df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9b2b2f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9d744d7d7688df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f568f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9dc20b2d78d44f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9b2f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9448dd7b220f5f9f9f9f9f9f9f9f9f9f9f9f9f9b2d7f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f5f9f9f9f9f9f9f9f9f9d7dcf9f9f500f5f9f9f9f5f9f9f9f9f9f9f5f9f9f9f9f9f9f9f5f9f9f9f9f9f9f9f5f9f9f9b2b2f9f5f9f9f9f9f9f9f5f9f9f9f9f9 -f9f9f5f9f9f9f9f5f5f9f9f9f9f9f9f5f9f9f9f9f9f9f9f9f9f9f9f9d7dcf9f9f500f5f9f9f9f9f9f9f5f9f9f9f9f9f9f9f9f9b2d7f9f9f9f9f9f9f9f9f9f9f9 -f9f5f9f9f9dcd7f9f9f944dcf9f9f9f9f9f9f9f9f5f9f9f9f9f9f9f5f9f9f9f9f9f9f5f9f9f9f9f9d7dcf9f9f9f9f9f9f9f9f9f9f5f9f9f9f9f9f9f9f9f9f9f5 -f9f9f9f9f9f9f9f5f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f5d7f9f9f98db2f9f9f9f9f9f9f9f9f9f9f9f5f9f544f5f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f900dcf9f9f9dc -440020b28db2f944d7f9f9f9b22020b200f5f9f569000068dcf9f96800dcf9f9f9f9b1000069d700f5f569000044dcf9b28d440068dcf9f9d74400008df5f9f9 -8d000068f5f9d70069f9f9f9f9dc440020b28db2f944d7f9f9d744f9f9b22020b200f5f944d7f9f569000068dcf9f9f9f9f9f520f5f9f9d720008d44d7f9f58d -000044d7f9f9dc44208d44d7f9b2b2f9f9f9d74400008df5f9f58d000044d7f9f98d000020d7f9f900dcf9f9f9f9f944d7f9f569000068dcf9f500f5f9f52000 -f5f9f9f9f9dc4400208df9f9b2b2f9f9f9f9f9f9d744f9f9f944d7f9f56900698db2f9d744f9f9f944d7f9d70069f9f98dd7f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbcbcbcbcbc3b3bbcbcbcbc -bc3b3bbcbcbcbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f900dcf9f9f98d -8df9f5b200d7f944d7f9f9d720dcf58d00f5f9448df5f9b244f5f500f5f9f9f9f9f500dcf9dc4444f98d8df5f9b244f9b220dcf9b244f9f520d7f9f58d8df9b2 -69f5f98d69f9b28df9f9f9f9f98d8df9f5b200d7f944d7f9f9d744f9d720dcf58d00f9f944d7f9448df5f9b244f5f9f9f9f9d768f9f9f500d7f9b200d7f98d68 -f5f9d720dcf520d7f5b200d7f9b2b2f9f9f520d7f9f58d8df98d68f5f9d720dcd744f5f9dc00f5f9dcf5f9f9f9f9f944d7f9448df5f9b244f5f500f5f9d744f9 -f9f9f9f9f520d7f9f568b2f9b2b2f9f9f9f9f9f9d744f9f9f944d7f9688df5d720b2f9d744f9f9f944d7f9b28df9f9f9d78df9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbcbc3b3b3b3b3bbc3b3b3b -bc3b3b3b3b3bbcbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f900dcf9f9f9b2 -69dcf9f900d7f944d7f9f98db2f9f9dc00f5dc20f9f9f9f9f5f9f500f5f9f9f9f9f520d7f5f9b244f9f5f5f9dcb144f9b28df9f9f920dcb28df9f9f9f9f9f944 -d7f9f9f5b2f9b2b2f9f9f9f9f9b269dcf9f900d7f944d7f9f9d744f98db2f9f9dc00f5f944d7dc20f9f9f9f9f5f9f9f9f9f9b28df9f9b28df9f9f920d7f920dc -f9f9f9f5f9d769f9f9f920d7f9b2b2f9f9b28df9f9f9f9f9f920dcf9f9f9f5f9f5f5f9f5d700f5f9f9f9f9f9f9f9f944d7dc20f9f9f9f9f5f9f500f5f9d744f9 -f9f9f9f9d744f9f9f9d744f9b2b2f9f9f9f9f9f9d744f9f9f944d7f500f5f9f98db2f9d744f9f9f944d7f9b2b2f9f9f9dc44f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbcbcbcbcbcbcbc3b3bbcbc3b3b3b3bbc3b3b3b -bc3b3b3bbcbcbcbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f900dcf9f9f9f5 -b244004400d7f944d7f9f968d7f9f9f500f9d7208d8d8d8d8df5f500f9f9f9f9f9f9d76920204444f9f5b2440068dcf9b2b2f9f9f944d7b2448d8d8d8d8df900 -dcf9f9f9f9f9b2b2f9f9f9f9f9f5b244004400d7f944d7f9f9d744f968d7f9f9f500f5f944d7d7208d8d8d8d8df5f9f9f9f9b2b2f9f9b2b2f9f9f944d7f50069 -8d8d8d8dd7b2b1f9f9f944d7f9b2b2f9f9b2448d8d8d8d8df500698d8d8d8dd7f9d7680044b2f9f9f9f9f9f9f9f9f944d7d7208d8d8d8d8df5f500f5f9d744f9 -f9f9f9f9b28df9f9f9dc00f9b2b2f9f9f9f9f9f9d744f9f9f944d7d744f9f9f9b2b2f9d744f9f9f944d7f9b2b2f9f9f9dc00f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbcbc3b3b3bbcbc3bbc -bc3b3bbcbc3bbcbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f900dcf9f9f9f9 -f5f9f9dc00d7f944d7f9f98db2f9f9f900f5dc20d7d7d7d700f5f900f5f9f9f9f9f9f5f9f9f58d44f9b244d7f5f9f9f9b28df9f9f920dcb269d7d7d7b244f944 -d7f9f9f5f5f9b2b2f9f9f9f9f9f9f5f9f9dc00d7f944d7f9f9d744f98db2f9f9f900f5f944d7dc20d7d7d7d700f5f9f9f9f9b28df9f9b28df9f9f920d7f920d7 -d7d7d744d7d78df9f9f944d7f9b28df9f9b269d7d7d7b244f920d7d7d7d744d7d720b2dcf9f9f9f9f9f9f9f9f9f9f944d7dc20d7d7d7d700f5f900f5f9d744f9 -f9f9f9f9d744f9f9f9d744f9b28df9f9f9f9f9f9d744f9f9f944d7dc20f9f9f98db2f9d744f9f9f944d7f9b2b2f9f9f9dc44f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbcbc3b3bbcbcbcbc -3b3b3bbc3b3b3bbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f900dcf9f9f9d7 -44f5f9d700d7f9448df9f5d744f5f58d00f5f944b2f9f9b269f9dc00dcf9f9f9f9f944d7f9f58d68f98d8df9f568d7f9b200d7f9b244f9f520d7f9f569b2f9b2 -68f5f98d69f58d8df5f9f9f9f9d744f5f9d700d7f94468f5f98d69f9d744f5f58d00f5f944d7f944b2f9f9b269f9f9f9f9f9d769f9f9dc20dcf9b200d7f98d8d -f5f9d720f5f500d7f9b200d7f9b244f5f5f520d7f9f569b2f98d8df5f9d720f5d768f5f9b28df9f9f9f9f9f9f9f9f944d7f944b2f9f9b269f9dc00dcf9d744f5 -f9f9f9f9f520d7f9f568b2f9b244f5f5f9f9f9f9d700dcf5f944d7f944b2f9dc20b2f9d700d7f9dc00dcf58d8df5f9f9d78df9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc3b3b3bbc3b3bbc3b3b3b -bc3b3bbc3b3b3bbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f900dcf9f9f9f9 -8d2000008df9f944b1008df9b20020b100f5f9f569000069f5f9000000dcf9f9f9f9dc44000044dcf9f568000069f5f9b28d690044dcf9f9dc4400208df9f9f9 -8d000068f5b200008df9f9f9f9f98d2000008df9f944b2440044dcf9f9b20020b100f5f944d7f9f569000069f5f9f9f9f9f9f520f5f9f9d720008d44d7f9f98d -000044dcf9f9d720008d44d7f9b28d2020f9dc4400208df9f9f98d000044dcf9f98d000044dcf9f9f9f9f9f9f9f9f944d7f9f569000069f5f5000000b2000000 -f9f9f9f9f9dc4400208df9f9b28d2020f9f9f9f9d7696800dc44d7f9dc4400688db2f9d744b200008df9b200008df9f98dd7f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbcbc3bbcbc3b3bbcbc3b3b -bc3b3bbcbc3bbcbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f98d8df9f9f9f9f9f9f900dcf9f9f9f9 -f9f9f5f5f9f9f9f9f9f5f9f9f9f5f5f9f9f9f9f9f9f5f5f9f9f9f500f5f9f9f9f9f9f9f9f5f5f9f9f9f9f9f5f5f9f9f9f9f9f9f5f9f9f9f9f9f9f5f5f9f9f9f9 -f9f5f5f9f9f9b2b2f9f9f9f9f9f9f9f9f5f5f9f9f9f9f9f9f5f9f9f9f9f9f5f5f9f9f9f944d7f9f9f9f5f5f9f9f9f9f9f9f9f9b2d7f9f9f9f9f5f944d7f9f9f9 -f5f5f9f9f9f9f9f9f5f9f9f9f9f9f9f5f5f9f9f9f5f5f9f9f9f9f9f5f5f9f9f9f9f9f5f5f9f9f9f9f9f9f9f9f9f9f944d7f9f9f9f5f5f9f9f9f500f5f9d744f9 -f9f9f9f9f9f9f9f5f5f9f9f9f9f9f5f5f9f9f9f9f9f9f9f5f9f9f9f9f9f9f5f9f9f9f9d744f9f5f5f9f9f9b2b2f9f9f544f5f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbcbcbc3b3b3b3bbcbcbc -bc3b3b3bbcbcbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f98d8d8df9f9f9f5b2b2b200b2b2b2f5f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f520f5f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9b2b2f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f944d7f9f9f9f9f9f9f9f9f9f9f9f9f9f568f5f9f9f9f9f944d7f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f944d7f9f9f9f9f9f9f9f9f920b2d7dc44f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9b2dcf9f9f9f9f9f9f9f9d744f9f9f9f9f9f9b2b2f9f9b2d7f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f98d8d8df9f9f9f9f9f5b2b2b2b2b2b2b2dcf9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f5f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f5f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9b2dcf9f9f9f9f9f9f9f9f9f9f9f9f9f9dcdcf9f9f9f9f9b2dcf9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9b2dcf9f9f9f9f9f9f9f9f9dc8d8df9f5f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9b2dcf9f9f9f9f9f9f9f9dcb2f9f9f9f9f9f9f9f5f9f9b2f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b008d8d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b8d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b8d8d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b8d8d8d00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b8d8d3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b8d8d8d3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b8d8d8d3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b8d8d3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b8d8d8d3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b8d8d8d3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b8d8d3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbcbcbc -3b3b3b3bbcbcbc3b3b3bbcbcbcbc3b3b3b3b3b3b3b3b3b3bbcbcbcbcbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbcbc3bbc -bc3b3bbcbc3bbcbc3b3b3b3b3bbcbc3b3b3b3b3b3b3b3b3bbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc3b3b3b -bc3b3bbc3b3b3bbc3b3b3bbcbcbcbc3b3b3b3b3b3b3b3b3bbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc3b3b3b -bc3b3bbc3b3b3bbc3b3bbcbc3bbcbc3b3b3b3b3b3b3b3b3bbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3bbcbcbcbcbc3b3b3bbcbcbc3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc3b3b3b -bc3b3bbc3b3b3bbc3b3bbc3b3b3bbc3b3b3b3b3b3b3b3b3bbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3bbc3b3b3bbc3b3bbcbc3bbcbc3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc3b3b3b -bc3b3bbc3b3b3bbc3b3bbc3b3b3bbc3b3b3b3b3b3b3b3b3bbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3bbc3b3bbc3b3b3bbc3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbcbc3bbc -bc3b3bbcbc3bbcbc3b3bbcbc3bbcbc3b3b3b3b3b3b3b3b3bbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3bbc3b3bbc3b3b3bbc3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbcbcbc -3b3b3b3bbcbcbc3b3b3b3bbcbcbc3b3b3b3b3b3b3b3b3b3bbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3bbcbcbc3b3bbc3b3b3bbc3b3b3bbcbcbcbcbc3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbcbcbcbcbc3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3bbc3b3b3b3bbc3b3b3bbc3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3bbcbc3b3b3bbcbc3bbcbc3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3bbcbcbcbcbc3b3b3bbcbcbc3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbcbcbcbc -3b3b3bbcbcbcbcbc3b3bbcbcbcbcbc3b3b3b3b3b3b3b3b3bbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc -bc3b3bbc3b3b3bbc3b3bbc3b3b3bbc3b3b3b3b3b3b3b3b3bbc3b3bbcbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbcbcbc -bc3b3bbc3b3b3bbc3b3bbc3b3b3bbc3b3b3b3b3b3b3b3b3bbc3bbcbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbcbc3bbc -bc3b3bbcbc3bbcbc3b3bbcbc3bbcbc3b3b3b3b3b3b3b3b3bbcbcbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc3b3b3b -bc3b3bbcbcbcbc3b3b3bbcbcbcbc3b3b3b3b3b3b3b3b3b3bbcbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc3b3b3b -bc3b3bbc3b3b3bbc3b3bbc3b3b3bbc3b3b3b3b3b3b3b3b3bbcbcbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbcbc3bbc -bc3b3bbcbc3b3bbc3b3bbcbc3b3bbc3b3b3b3b3b3b3b3b3bbc3bbcbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbcbcbc -3b3b3b3bbcbcbcbc3b3b3bbcbcbcbc3b3b3b3b3b3b3b3b3bbc3b3bbcbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b8d8d8d3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b8d8d8d8d3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc -3b3b3bbcbcbcbcbc3b3bbcbcbcbcbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b8d8d3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc -3b3b3bbc3b3b3bbc3b3bbc3b3b3bbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b8d8d3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc -3b3b3bbc3b3b3bbc3b3b3b3b3b3bbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b8d8d3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc -3b3b3bbcbc3bbcbc3b3b3b3b3b3bbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b8d8d8d00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc -3b3b3bbcbcbcbc3b3b3b3b3bbcbcbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b8d8d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbcbcbc -3b3b3bbc3b3b3bbc3b3b3b3bbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b8d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbcbc -3b3b3bbcbc3b3bbc3b3b3b3bbcbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b008d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbcbc -3b3b3b3bbcbcbcbc3b3bbcbcbcbcbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f98d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f98d8d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f98d8d8df9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f98d8df9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f98d8df9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f98d8df9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f98d8d8df9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f98d8d8df9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b8d8d8d3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f98d8df9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b8d8d8d8d3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f98d8df9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b8d8d3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f98d8df9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b8d8d3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8d8df9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9d78d8dd7f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f5b28d8ddcf9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f5b2f5f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f5d7f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9d7dcf9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b8d8d3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8d8df9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9d744d7d7688df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9448dd7b220f5f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f500f5f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f969f5f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f568f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b8d8d8d3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8d -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f5f9f9f9f9f9f9f9f9f9d7dcf9f9f500f5f9f9f9f5f9f9f9f9f9f9f5f9f9f9f9f5d7f9f9f98db2f9f9f9f9f9f9f9f9f5 -f5f9f9f9f9f9f9f5f9f9f9f9f9f9f9f9f9f9f9f9f9f5f5f9f9f9f9f9f9f5f9f9f9f500f9f5f5f9f9f9f9f9f9f5f9f9f9f9f9f9f5f9f9f9f9f9f9f5f9f9f9f9f9 -f9f9f9f9d78df9f9f9f9f9f9f9f9f9f9f5f9f9f9f9f5f9f9f9f9b2b2f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b8d8d8d3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d -8df9f9f9f9f9f9f9f900dcf9f9f9dc440020b28db2f944d7f9f9f9b22020b200f5f9f569000068dcf9f96800dcf9f9f9f9f56900698db2f9d744f9f9f9f56900 -0069f5f9f98d0020b244d7f944d7f9f9d744f9f9b20020b200f5f9d7200020b2f9f500b10020b2f9f9f58d000044d7f9f9d74400008df5f9f5690044b244f9f9 -f9f9f9f969d7f9f944d7f9f944b2f9b200b2f569000044dcf9f9dc44f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b8d8d3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -8d8df9f9f9f9f9f9f900dcf9f9f98d8df9f5b200d7f944d7f9f9d720dcf58d00f5f9448df5f9b244f5f500f5f9f9f9f9f9688df5d720b2f9d744f9f9f9698df5 -f58d68f9dc00dcf9d720d7f944d7f9f9d744f9d744f5f58d00f5f500dcf9f544d7f5008df5f544d7f98d68f5f9d720dcf520d7f9f58d8df98d69f5f54444f9f9 -f9f9f9f500f5f9f944d7f9b268f9f944d7f98d8df5f9b244f9f9f920dcf9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b8d8d3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f98d8df9f9f9f9f9f900dcf9f9f9b269dcf9f900d7f944d7f9f98db2f9f9dc00f5dc20f9f9f9f9f5f9f500f5f9f9f9f9f500f5f9f98db2f9d744f9f9f900f5f9 -f9f500f5d744f9f9f944d7f944d7f9f9d744f969b2f9f9dc00f5f9f5f9f5d744d7f900dcf9f9b28df920dcf9f9f9f5f9b28df9f9f9f9f9f920dcf9f9d744f9f9 -f9f9f9dc44f9f9f944d7dc20dcf9f944d7f9f5f5f9dcb144f9f9f969d7f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b8d8d3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f98d8df9f9f9f9f900dcf9f9f9f5b244004400d7f944d7f9f968d7f9f9f500f9d7208d8d8d8d8df5f500f9f9f9f9f9d744f9f9f9b2b2f9d744f9f9dc00f9f9 -f9f900dcd744f9f9f944d7f944d7f9f9d744f944d7f9f9f900f5f9d78d00208df9f500f9f9f9d744f500698d8d8d8dd7b2448d8d8d8d8df500f5f9f9d744f9f9 -f9f9f9d744f9f9f9444444b2f9f9f944d7f9f5b2440068dcf9f9f98db2f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b8d8d3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f98d8df9f9f9f9f900dcf9f9f9f9f5f9f9dc00d7f944d7f9f98db2f9f9f900f5dc20d7d7d7d700f5f900f5f9f9f9f9dc20f9f9f98db2f9d744f9f9f500f5f9 -f9f500f5d744f9f9f944d7f944d7f9f9d744f969d7f9f9dc00f5f5208ddcf9f9f9f500dcf9f9d769f920d7d7d7d744d7b269d7d7d7b244f920dcf9f9b244f9f9 -f9f9f9dc44f9f9f9444400dcf9f9f944d7f9b244d7f5f9f9f9f9f969d7f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b8d8d8d3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f900dcf9f9f9d744f5f9d700d7f9448df9f5d744f5f58d00f5f944b2f9f9b269f9dc00dcf9f9f9f9f944b2f9dc20b2f9d700dcf5f9698df5 -f98d69f9d744f9f9f944d7f94468f5f98d69f9d744f5f58d00f9f500f9f9d744f9f50069f5f544d7f98d8df5f9d720f5f520d7f9f569b2f98d8df5f54444f9f9 -f9f9f9f500f5f9f944d7b220dcf9f544d7f58d8df9f568d7f9f9f920dcf9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b8d8d8d3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f900dcf9f9f9f98d2000008df9f944b1008df9b20020b100f5f9f569000069f5f9000000dcf9f9f9f9dc4400688db2f9d7696800dcf56900 -0069f5f9d744f9f9f944d7f944b2440044dcf9f98d0020b200f5f9b2200020d7f9f500b220008df9f9f98d000044dcf9f9dc4400208df9f9f5690044b244f9f9 -f9f9f9f968d7f9f944d7f9b220dc8d0000b2f568000069f5f9f9dc44f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b8d8d3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f900dcf9f9f9f9f9f9f5f5f9f9f9f9f9f5f9f9f9f5f5f9f9f9f9f9f9f5f5f9f9f9f500f5f9f9f9f9f9f9f9f5f9f9f9f9f9f9f9f5f9f9f9f5 -f5f9f9f9f9f9f9f9f9f9f9f9f9f9f9f5f9f9f9f9f9f5f5f500f5f9f9f9f5f9f9f9f9f9f9f5f5f9f9f9f9f9f5f5f9f9f9f9f9f9f5f5f9f9f9f9f9f5f9d744f9f9 -f9f9f9f9d78df9f944d7f9f9f9f9f944d7f9f9f9f5f5f9f9f9f9b2b2f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b8d8d3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f5b2b2b200b2b2b2f5f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f520f5f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f500f5f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9d744f9f9 -f9f9f9f9f969dcf944d7f9f9f9f9f969d7f9f9f9f9f9f9f9f9f568f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b8d8d3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f5b2b2b2b2b2b2b2dcf9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f5f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f5b2f5f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9dcb2f9f9 -f9f9f9f9f9f5d7f9b2dcf9f9f9f9f9f9f5f9f9f9f9f9f9f9f9d7dcf9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b8d8d8d3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b8d8d8d3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3bbcbcbc3b3b3b3b3b3b3bbcbcbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b8d8d3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3bbcbc3bbcbc3b3b3b3b3bbcbc3bbcbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b8d8d3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -bcbc3b3b3bbcbc3b3b3bbcbc3b3b3bbcbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b8d8d3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc -bc3b3b3b3b3bbcbc3bbcbc3b3b3b3b3bbcbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b8d8d3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3bbcbcbcbcbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbcbcbcbcbcbcbcbcbcbc -3b3b3b3b3b3b3bbcbcbc3b3b3b3b3b3b3bbcbcbcbcbcbcbcbcbcbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc8d8d8dbc3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3bbcbcbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b8d8d8d3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3bbcbcbcbcbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b8d8d00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3bbcbcbcbcbcbcbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b8d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3bbcbcbcbcbcbcbcbcbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b8d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3bbcbcbcbcbcbcbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b008d8d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3bbcbcbcbcbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f98d8d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3bbcbcbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f98d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f98d8df9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f98d8df9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f98d8df9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f98d8d8df9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f98d8d8df9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f98d8df9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f98d8df9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f98d8df9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f98d8d8df9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8d8df9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9d78d8dd7f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f5b28d8ddcf9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9b2f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f5b28d8dd7f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9d78d8dd7f9f9f9b2f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8df9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9d744d7d7688df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9448dd7b220f5f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9b2d7f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d69d7d720d7f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9dcd7f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9b268d7d744b2f9f9d7b2f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8d -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f5f9f9f9f9f9f9f9f9f9d7dcf9f9f500f5f9f9f9f5f9f9f9f9f9f9f5f9f9f9f9f5d7f9f9f98db2f9f9f9f9f9f9f9f9f5 -f5f9f9f9f9f9f9f5f9f9f9f9f9f9f9f9f9f9f9f9f9f5f5f9f9f9f9f9f9f9f9f9f5f9f9f9f9f9f9f9f5f9f9f9f9f9f9f9f9f5f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f544f9f9f9f9f5f9f9f9f9f9f9f9f9f5f9f9f9d7f5f9f9d769f9f9f9f9f9f9f9f9f5f9f9f9f9f9f9f9f9f5f9f9f9f9f9f9f5f9f9f9f9b1f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f5f5f9f9f9f9d7f5f9f9dc44f9f9f944f5f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d -8df9f9f9f9f9f9f9f900dcf9f9f9dc440020b28db2f944d7f9f9f9b22020b200f5f9f569000068dcf9f96800dcf9f9f9f9f56900698db2f9d744f9f9f9f56900 -0069f5f9f98d0020b244d7f944d7f9f9d744f9f9b20020b200f5f9f9f9f9f9b200b2d744f9f9f9b1000069d700f5f9b2200044dcf9b2b2f9f98d69f9f9f9f9f9 -b2b2f9f9f5690044b244f9f9d74400008df5f9f98d20448d44f9f500f5f9f9f58d000044d7f9f9d74400008df5f9dc4400008df5f9b28df9f9f9f9f9d744f9f9 -dc00f9f9f500f5f98d00008db244f9f9b22044b100f9f9f9b2b2f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -8d8df9f9f9f9f9f9f900dcf9f9f98d8df9f5b200d7f944d7f9f9d720dcf58d00f5f9448df5f9b244f5f500f5f9f9f9f9f9688df5d720b2f9d744f9f9f9698df5 -f58d68f9dc00dcf9d720d7f944d7f9f9d744f9d744f5f58d00f5f9f9f9f9f944d7f9d744f9f9f500dcf9dc4444f9d720dcf9d720f5b2b2f9d720f5f9f9f9f9f9 -44d7f9f98d69f5f54444f9f520d7f9f58d8df9b268f5dc4444f9f500f5f9f98d68f5f9d720dcf520d7f9f58d8df944b2f9f98db1f9f5f5f9f9f9f9f9d744f9f9 -dc00f9f9f500f5d720f5f9d7208df9d744dcdc6800f9f9f9d744f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f98d8df9f9f9f9f9f900dcf9f9f9b269dcf9f900d7f944d7f9f98db2f9f9dc00f5dc20f9f9f9f9f5f9f500f5f9f9f9f9f500f5f9f98db2f9d744f9f9f900f5f9 -f9f500f5d744f9f9f944d7f944d7f9f9d744f969b2f9f9dc00f5f9f9f9f9f944d7f9d744f9f9f520d7f5f9b244f98db2f9f9f9b2f5b2b1f544d7f9f9f9f9f9f9 -00f5f9f920dcf9f9d744f9b28df9f9f9f9f9f920dcf9f9d744f9f500f5f9f920dcf9f9f9f5f9b28df9f9f9f9f9f9f5f9f9dc698df9f9f9f9f9f9f9f9d744f9f9 -dc00f9f9f500f5dc20d7f5f98d8df968d7f9f9d700f9f9f9f900f5f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f98d8df9f9f9f9f9f900dcf9f9f9f5b244004400d7f944d7f9f968d7f9f9f500f9d7208d8d8d8d8df5f500f9f9f9f9f9d744f9f9f9b2b2f9d744f9f9dc00f9f9 -f9f900dcd744f9f9f944d7f944d7f9f9d744f944d7f9f9f900f5f9f9f9f9f944d7f9d744f9f9f9d76920204444f98db2f9f9f9f9f9b2206969f9f9f9f9f9f9f5 -00f9f9f500f5f9f9d744f9b2448d8d8d8d8df500f5f9f9d744f9f500f5f9f500698d8d8d8dd7b2448d8d8d8d8df9f58d20008df5f9f9f9f9f9f9f9f9d744f9f9 -dc00f9f9f500f9f9d7680020448df920dcf9f9dc00f9f9f9f500f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f900dcf9f9f9f9f5f9f9dc00d7f944d7f9f98db2f9f9f900f5dc20d7d7d7d700f5f900f5f9f9f9f9dc20f9f9f98db2f9d744f9f9f500f5f9 -f9f500f5d744f9f9f944d7f944d7f9f9d744f969d7f9f9dc00f5f9f9f9f9f944d7f9d744f9f9f9f5f9f9f58d44f98db2f9f9f9f5f9b24420b2f9f9f9f9f9f9f5 -00f5f9f920dcf9f9b244f9b269d7d7d7b244f920dcf9f9d744f9f900f9f9f920d7d7d7d744d7b269d7d7d7b244f94469d7f5f9f9f9f9f9f9f9f9f9f9d744f9f9 -dc00f9f9f900f5f9f5f9f9f58d8df968d7f9f9d700f9f9f9f500f5f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f900dcf9f9f9d744f5f9d700d7f9448df9f5d744f5f58d00f5f944b2f9f9b269f9dc00dcf9f9f9f9f944b2f9dc20b2f9d700dcf5f9698df5 -f98d69f9d744f9f9f944d7f94468f5f98d69f9d744f5f58d00f9f9f9f9f9f544d7f5d700dcf9f944d7f9f98d68f9d720dcf9d720f5b2b2d720d7f9f9f9f9f9f9 -44dcf9f98d8df9f54444f9f520d7f9f569b2f98d69f9f54444f9f500b2f9f98d8df9f9d720f5f520d7f9f569b2f944d7f9f544dcf9f9f9f9f9f9f9f9d700d7f9 -b220b2f9d700f5f520d7f9f9688df9b268f9f56900f9f9f9d744f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f900dcf9f9f9f98d2000008df9f944b1008df9b20020b100f5f9f569000069f5f9000000dcf9f9f9f9dc4400688db2f9d7696800dcf56900 -0069f5f9d744f9f9f944d7f944b2440044dcf9f98d0020b200f5f9f9f9f98d0000b2d7696800dcdc44000044dcf9f9b2200044d7f9b2b2f9d720d7f9f9f9f9f9 -b2b2f9f9f5690044b244f9f9dc4400208df9f9f56900448d44f9f500b100d7f98d000044dcf9f9dc4400208df9f9d7440020b2f9f9f9f9f9f9f9f9f9d744b200 -20d7b20000b2f9f9d744000044dcf9f98d00208d00f9f9f9b2b2f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f900dcf9f9f9f9f9f9f5f5f9f9f9f9f9f5f9f9f9f5f5f9f9f9f9f9f9f5f5f9f9f9f500f5f9f9f9f9f9f9f9f5f9f9f9f9f9f9f9f5f9f9f9f5 -f5f9f9f9f9f9f9f9f9f9f9f9f9f9f9f5f9f9f9f9f9f5f5f500f5f9f9f9f9f944d7f9f9f9f9f5f9f9f9f5f5f9f9f9f9f9f9f5f9f9f9b2b2f9f9f9f9f9f9f9f9f9 -f544f9f9f9f9f5f9d744f9f9f9f9f5f5f9f9f9f9f9f5f9f9f9f9f9f9f9f5f9f9f9f5f5f9f9f9f9f9f9f5f5f9f9f9f9f9f5f9f9f9f9f9f9f9f9f9f9f9f9f9f9f5 -f5f9f9f5f5f9f9f9f9f9f5f5f9f9f9f9f9f5f9f9f9f9f9f944f5f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f5b2b2b200b2b2b2f5f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f520f5f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f500f5f9f9f9f9f969d7f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9b2b2f9f9f9f9f9f9f9f9f9 -f9b2d7f9f9f9f9f9d744f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9d7b2f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f5b2b2b2b2b2b2b2dcf9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f5f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f5b2f5f9f9f9f9f9f9f5f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9d7d7f9f9f9f9f9f9f9f9f9 -f9f9b2f9f9f9f9f9dcb2f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9b2f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3bbcbcbcbcbc3b3b3bbcbcbc3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3bbc3b3b3bbc3b3bbcbc3bbcbc3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3bbc3b3bbc3b3b3bbc3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3bbc3b3bbc3b3b3bbc3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3bbcbcbc3b3bbc3b3b3bbc3b3b3bbcbcbcbcbc3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbcbcbcbcbc3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3bbc3b3b3b3bbc3b3b3bbc3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3bbcbc3b3b3bbcbc3bbcbc3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3bbcbcbcbcbc3b3b3bbcbcbc3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3bbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3bbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3bbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3bbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3bbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbcbcbcbcbc -bc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc3b3bbc3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbcbc3bbc3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3bbcbcbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbc3bbc3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbcbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbcbcbc3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbcbc3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bbcbc3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9003b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b00f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9b23b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b -3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b02f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f98d8d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f98d8d8d8d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f98d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f98d8d8d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f98d8d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f98d8d8d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f98d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f98d8d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f98d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f98d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8d8d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -8d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8d8d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d -8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8d8d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8d -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8df9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8df9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8d8d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8df9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8d8d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8df9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8d8d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8df9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8df9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8df9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8d8d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8df9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8d8d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8df9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8d8d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8df9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8df9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8df9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8d8d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8df9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8d8d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8df9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9d78d8dd7f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98d8df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9d78d8db2f5f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9dcd7f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9b2f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9d78d8dd7f9f9f9f9f9f9f9f9f98d8df9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f5d7f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9b2f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9d744d7d7688df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9d720d7d76969f9f9f9f9f9f9f9f9f9f9f9f9f9f9f968f5f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9b2d7f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9d744d7d7688df9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f98dd7f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9d7b2f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f5f9f9f9f9f9f9f9f9f9d7dcf9f9f900f5f9f9f9f9f5f9f9f9f9f9f5f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f5f9f9f9f9f9f9f9 -f9f9f9f9f9dcdcf9f9f500f5f9f9f9f5f9f9f9f9f9f9f9f9f9b2b2f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f544f5f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f5f9f9f9f9f9f9f9f9f9d7dcf9f9f900f5f9f9f9f9f5f9f9f9f9f9f5f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f5f9f9f9f9f9f9f9f9f9f9f5f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f5f9f9f9f9f9f9f9f9dc68f9f9f9f9f9f9f9f5f5f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f5f9f9f9f9f9f9f9f9f9f9f9f9f9f944f5f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f900dcf9f9f9dc440020b28db2f944d7f9f9f9b22020b200f9f9f569000068dcf9f96800dcf9f9f9f9b2b2f9f9f9f9d720f5f5440020b28d8df98db2 -f9f9dc00f9f9d74420b200dcf9f58d000044dcf9f9f9f9f9f944dcf9f900dcf9f9b28df9b28df9f9d744f9f9dc00f9f9f98dd7f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f900dcf9f9f9dc440020b28db2f944d7f9f9f9b22020b200f9f9f569000068dcf9f96800dcf9f9f9b28df9f9f9f9f9 -dc20f900dcf9d7008ddc00f9f98d00d7f98d0020d700dcf9d744008d69b2f9f9b2200020b2f9f9f9f9f9f98dd7f9f9b28df9f9d7008df9f9f9f9d744f9f98d20 -f5f9b28df9f9dc69000020b2f9f9dc00000000008df9f9b2b2f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f900dcf9f9f98d8df9f9b200d7f944d7f9f9d720dcf58d00f5f9448df5f9b244f5f500f5f9f9f9f9f9b2b2f9f9f9f944b2f9b269f5f9b200b2f98db2 -f9f9dc00f9dc20d7f98d00dcf9698df5f9d720f5f9f9f9f9dc20f9f9f900dcf9f9b28df9b28df9f9d744f9f9dc00f9f9f9d78df9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f900dcf9f9f98d8df9f9b200d7f944d7f9f9d720dcf58d00f5f9448df5f9b244f5f500f5f9f9f9f9dc20f5f9f9f9f9 -8db2f900dcf98db2f9dc00f9f900dcf9d720f5f9b200dcf520d7f9d700b2f9b244dcf9dc44d7f9f9f9f9f920dcf9f9b28df9f98db2f9f9f9f9f9d744f9f92044 -d7f9b28df9f520b2f5f9dc68b2f9dc00f5f5f9f5f5f9f9d744f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f900dcf9f9f9b269dcf5f900d7f944d7f9f98db2f9f9dc00f5dc20f9f9f9f9f5f9f500f5f9f9f9f9f9b2b2f9f9f9b244f9f9d768dcf9f944b2f98db2 -f9f9dc00f9b28df9f9f500dcf500f9f9f9f9f5f9f9f9f9f9d769f9f9f900dcf9f9b28df9b28df9f9d744f9f9dc00f9f9f9dc44f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f900dcf9f9f9b269dcf5f900d7f944d7f9f98db2f9f9dc00f5dc20f9f9f9f9f5f9f500f5f9f9f9f9f968d7f9f9f9f9 -20f5f900dcf98db2f9dc00f9f900dcf9b28df9f9f900dcd744f9f9f968b2f944d7f9f9f9f5f9f9f9f9f9f500f9f9f9b28df9f98db2f9f9f9f9f9d744f9d768d7 -8df9b28df9b269f9f9f9f9d768f9dc00f9f9f9f9f9f9f9f500f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f900dcf9f9f9f5b244004400d7f944d7f9f968d7f9f9f500f5d7208d8d8d8d8df5f500f5f9f9f9f9f9b2b2f9f9dc44dcf9f9f9b244004420b2f98db2 -f9f9dc00f98db2f9f9f900dcdc008d8d8d8d8ddcf9f9f9f9b28df9f9f900dcf9f9b28df9b28df9f9d744f9f9dc00f9f9f9dc00f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f900dcf9f9f9f5b244004400d7f944d7f9f968d7f9f9f500f5d7208d8d8d8d8df5f500f5f9f9f9f9f9d70000000000 -69f9f900dcf98db2f9dc00f9f900dcf9b28df9f9f900dcb28df9f9f98db2f900698d8d8d8dd7f9f9f9f9dc00f9f9f9b28df9f98db2f9f9f9f9f9d744f9b1b2f5 -20f9b28df9f5f5f9f9f9f58d8df9dc00f9f9f9f9f9f9f9f500f5f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f900dcf9f9f9f9f5f9f9dc00d7f944d7f9f98db2f9f9f500f5dc20d7d7d7d700f9f500f9f9f9f9f9f9b2448d69208df9f9f9f9f5f9f9dc44b2f98db2 -f9f9dc00f9b2b1f9f9f500dcf500d7d7d7d720dcf9f9f9f9d769f9f9f900dcf9f9b28df9b269f9f9d744f9f9dc00f9f9f9dc44f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f900dcf9f9f9f9f5f9f9dc00d7f944d7f9f98db2f9f9f500f5dc20d7d7d7d700f9f500f9f9f9f9f9f9f520dcf5f568 -d7f9f900dcf98db2f9dc00f9f900dcf9b28df9f9f900dcd768f9f9f944b2f944b2d7d7d769b2f9f9f9f9f500f9f9f9b28df9f98db2f9f9f9f9f9d744f920dcf9 -68d7b28df9f9f9f5d78d2044f5f9dc00f9f9f9f9f9f9f9f500f5f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f900dcf9f9f9d744f5f9d700d7f9448df9f5d744f5f58d00f5f944b2f9f9b269f9dc00dcf9f9f9f9f9b28dd7d7d7b220dcf9d744f5f9dc20d7f98d44 -f5f9b244f9dc20dcf9b200dcf969b2f5f9d744f9f9f9f9f9dc44f9f9f90069f5f5698df9b200d7f9b120d7f9b244f9f9f9d78df9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f900dcf9f9f9d744f5f9d700d7f9448df9f5d744f5f58d00f5f944b2f9f9b269f9dc00dcf9f9f9f9f9f9b2b2f9f544 -f9f9f900dcf569b2f5dc00f9f900d7f9b28df9f9f900dcf520d7f9d700b2f9b269f5f9dc20f9f9f9f9f9f920f5f9f5b269f9f569b2f5f9f9f9f9d744dc44f9f9 -b2b1b28df9f9b20068b2dcf9f9f9dc00f9f9f9f9f9f9f9d744f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f900dcf9f9f9f98d2000008df9f944b1008df9b20020b100f9f9f569000069f5f9000000dcf9f9f9f9b2b2f9f9f9f9b28df9f9b220000069f5f98d8d -680020d7f9f9b22000b200dcf9f98d000068dcf9f9f9f9f9f944f5f9f900b2440044f5f9b28d8d0020dc8d0020d7f9f9f98dd7f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f900dcf9f9f9f98d2000008df9f944b1008df9b20020b100f9f9f569000069f5f9000000dcf9f9f9f9f9f944f9b2b2 -f9f9f900dcb20000b2dc00f9440000d7b28df9f9f900dcf9d744008d69b2f9f9b2200044d7f9f9f9f9f9f98dd7f9b2000000b20000b2f9f9f9f9d744b2b2f9f9 -f520b28df9f500dcf9f9f9f5f5f9dc00f9f9f9f9f9f9f9b2b2f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f900dcf9f9f9f9f9f9f5f9f9f9f9f9f9f9f9f9f9f5f9f9f9f9f9f9f9f5f9f9f9f9f500f5f9f9f9f9f9b2b2f9f9f9f9b28df9f9f9f9f5f9f9f9f9f9f9 -f9f9f9f9f9f9f9f5f9f9f9f9f9f9f9f5f9f9f9f9f9f9f9f9f9b2b2f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f5f9f9f9f9f544f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f900dcf9f9f9f9f9f9f5f9f9f9f9f9f9f9f9f9f9f5f9f9f9f9f9f9f9f5f9f9f9f9f500f5f9f9f9f9f9f9f969d744f9 -f9f9f900dcf98db2f9f9f9f9f900dcf9f9f9f9f9f9f9f9f9f9f9f9f98db2f9f9f9f9f9f9f9f9f9f9f9f9f9dc68f9f9b28df9f98db2f9f9f9f9f9d74444dcf9f9 -f968698df9f900f9f9f9f969b2f9dc00f9f9f9f9f9f9f944f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f5b2b2b200b2b2b2f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f520f5f9f9f9f9f9b269b2b2b28d00dcf9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f968f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9b2d7f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f5b2b2b200b2b2b2f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f520f5f9f9f9f9f9f9f9d74469f9 -f9f9f900dcf98db2f9f5b2f9f944dcf9f9f9f9f9f9f9f9f9f9f9f9f98db2f9f9f9f9f9f9f9f9f9f9f9f9f9f98dd7f9d720d7f58db2f9f9f9f9f9d70044f9f9f9 -f9b2008df9f96969d7d78d44f5f9dc00f9f9f9f9f9f9d7b2f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9b2b2b2b2b2b2b2dcf9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9d7b2b2b2b2b2dcf9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9dcd7f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9b2f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9b2b2b2b2b2b2b2dcf9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9b2dcf9 -f9f9f9b2f9f9f9f5f9f9b2f9f9f5f9f9f9f9f9f9f9f9f9f9f9f9f9f9d7dcf9f9f9f9f9f9f9f9f9f9f9f9f9f9f9d7f9f9b28dd7f9f9f9f9f9f9f9dcb2d7f9f9f9 -f9f9b2d7f9f9f9d78d8db2f5f9f9f9b2f9f9f9f9f9f9b2f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 -f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f905000000070101000000030000000000}}}{\cf9 -\par }\pard \sa120\widctlpar\adjustright { -\par The radar set's ability to establish a positive lock on a target extends for a shorter range than the radar's maximum detection range -- radar lock is limited to about 60 nm on the F-16 and 30 nm on the MiG-29. -\par If multiple targets are plotted on your radar display, you can lock onto other targets by pressing the target reject key (Q). -\par The radar on/standby key (R) can be used to toggle your radar set between its normal operating mode and a standby state. When your radar is in standby mode, your aircraft emits no radar energy and can be more difficult to detect. -\par }\pard\plain \s1\sb240\sa60\keepn\widctlpar\outlinelevel0\adjustright \f1\fs36\cf9\kerning28 {\page {\*\bkmkstart _Toc431273867}Electronic Countermeasures{\*\bkmkend _Toc431273867} -\par }\pard\plain \s2\sb240\sa60\keepn\widctlpar\outlinelevel1\adjustright \b\i\f1 {{\*\bkmkstart _Toc431273868}Radar Warning Receiver{\*\bkmkend _Toc431273868} -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid { -Each aircraft is equipped with a special device called a Radar Warning Receiver (RWR). It's display is the round "CRT" to the left of the radar display. It works much like a radar detector that you can buy for your car. The rece -iver can detect radar emissions from other aircraft and will plot a box on the RWR display representing the relative direction of that radar threat. Opposing team\rquote -s radar emissions appear as filled boxes. Friendly aircraft appear as open boxes. This recei -ver cannot detect aircraft that have their radar emissions directed away from your aircraft, nor is it capable of detecting aircraft that have their radar sets turned completely off. -\par -\par }\pard\plain \s1\sb240\sa60\keepn\widctlpar\outlinelevel0\adjustright \f1\fs36\cf9\kerning28 {\page {\*\bkmkstart _Toc431273869}Weapon Systems{\*\bkmkend _Toc431273869} -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid {Your aircraft is equipped wi -th heat-seeking missiles and a 20-millimeter cannon. Weapon information is displayed in the lower left-hand corner of your HUD. Different weapons may be selected by pressing mouse button 3. The currently selected weapon is fired by pressing mouse button 2 -. -\par }\pard\plain \s2\sb240\sa60\keepn\widctlpar\outlinelevel1\adjustright \b\i\f1 {{\*\bkmkstart _Toc431273870}Air-to-Air Missiles{\*\bkmkend _Toc431273870} -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid { -\par The missiles are patterned after U.S. AIM-9M Sidewinders. They can detect infrared (IR) targets at any aspect (not just from the rear). Their range varies dramatically with the altitude and closure rate. Th -e missile subsystem couples with your radar set to provide time-to-impact information. -\par -\par FIGURE 4 MISSILE DISCRETES -\par -\par -\par -\par This missile has a solid rocket motor that burns for about 8 seconds. After burn-out, it will still track towa -rds its intended target but may lose speed too rapidly to catch it. Your heat seeking missiles don't arm themselves until three seconds after launch. Because of that, you should not fire at a target that is closer than three seconds of flight time away. - -\par Missile status discretes and their meanings: -\par -\par }\pard\plain \s17\fi-1440\li1440\sa120\widctlpar\tx1440\adjustright \f1\fs18 {ARM \tab A missile is armed, but its seeker has not yet acquired a target in its field of view. -\par -\par LOCKED \tab A missile is armed and its seeker has locked onto a heat source. The missile is ready to fire. -\par -\par ---- \tab The missile's seeker has acquired a target, but it is out of range based on current time-to-target information. -\par }\pard\plain \s2\sb240\sa60\keepn\widctlpar\outlinelevel1\adjustright \b\i\f1 {{\*\bkmkstart _Toc431273871}Cannon{\*\bkmkend _Toc431273871} -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid { -\par Cannon can be used to engage targets at closer range. Your cannon is modeled after the U.S. M61-A1 Vulcan. Aircra -ft typically begin a mission with 500 rounds of ammunition; the cannon fires at 3000 rounds per minute so you only have enough ammunition for a ten-second continuous burst -- use it carefully. -\par -\par FIGURE 5 CANNON DISCRETES -\par -\par -\par -\par When cannons -are selected, the HUD is in Lead Computing Optical Sight (LCOS) mode. On the HUD, a circular aiming reticle is displayed. The HUD couples with the radar set to provide a visible cue of the target's current range. The aiming reticle is surrounded by 12 tic -k -s. An inner arc represents the current range to the target: each arc tick represents 1000 feet of distance. The aiming reticle moves across the HUD to show a good aiming point based on the target's range and your aircraft's pitch and turn rate. If the ran -ge is large and or your pitch and turn rates are fast, you may see no reticle at all: the aiming point is simply out of the HUD's field of view. -\par An unmoving cross (a "+") will be displayed on the HUD in LCOS mode. This marker denotes the boresight of the cannon -- the direction that the cannon's barrel is actually pointing. -\par -\par FIGURE 6 A HARD-TURNING SHOT -\par -\par -\par -\par -\par -\par Figure 6 shows another example of what you might see in a dogfight. All planes are turning hard to the left at a relatively lo -w speed. You are in LCOS mode and see that the reticle is positioned ahead of the intended target. To get the kill, simply relax the turn long enough to get into position and then take the shot. -\par }\pard\plain \s1\sb240\sa60\keepn\widctlpar\outlinelevel0\adjustright \f1\fs36\cf9\kerning28 {\page {\*\bkmkstart _Toc431273872}The HSI{\*\bkmkend _Toc431273872} -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid {The Horizontal Situation -Indicator, or HSI, is a nifty device to aid in instrument flying. In ACM, the HSI shares space with the radar display. Use the (R) key to change radar modes until the HSI is displayed. Use the (9) and (0) keys to select the desired NAVAID frequency. U -se the (7) and (8) keys to orient the Selected Course Pointer (SCP). -\par -\par }\pard \sa120\nowidctlpar\adjustright {\cf9 -\par }{\fs20\cf9 {\*\shppict{\pict{\*\picprop\shplid1030{\sp{\sn shapeType}{\sv 75}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn pibName}{\sv \'46\'3a\'5c\'73\'6e\'61\'70\'73\'68\'6f\'74\'5c\'61\'63\'6d\'5c\'70\'63\'5c\'68\'6c\'70 -\'5c\'48\'53\'49\'2e\'62\'6d\'70}}{\sp{\sn pibFlags}{\sv 2}}{\sp{\sn fillColor}{\sv 268435473}}{\sp{\sn fFilled}{\sv 0}}{\sp{\sn fLine}{\sv 0}}}\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0 -\picw11084\pich6800\picwgoal6284\pichgoal3855\pngblip\bliptag761123879{\*\blipuid 2d5dd4279f98e59cdb2c60f687096e8e}89504e470d0a1a0a0000000d49484452000001a30000010108020000005a235d460000000467414d410000b1889598f4a6000000097048597300000ec400000e -c401952b0e1b0000165f49444154789ced9dcb8edcba1186a9e02c328f14201bfbc1c78b0079a5c94e59c847e6f0a6e2bd487d1f0ca3a79b97925afcbb584551 -870118c5799eb34d8097f28fd90600007407a50380fd41e900607f503a00d81f940e00f6e72ffb0f5263d083e338669b006fe72fe7ef8f9f5c94d092af4f7e3e -613ecc5e01607f503a00d81f77f60a30122784978e141fc7d135949c68ffb673562cdb8f75ce3d57cb81d2c134fcd1d87c7c3669d06e64a282649d2b74d081d9 -2b400a4714cef32495bc22281d28c2d694e36f8225839f3a6f5e2fec32895aad8c0cbe762c91189f45c28cbbebacd3e297591d66af300ddb3f4a4ccdd293dcfb -b5ffe6d57eb01dbf56c1a8ce9ad526eccc6d2ad70ca717c96929304339281dccc41e57a65dbcbfa09dded3d2a049b98a5656b7ecacee247306a583867c7d1a63 -ccc7cf92ba41d72651be78965750ab2d314ff6d1b67ed2a3e1b4f406a583365c3297454df670a29f523fad0bce1027fa509bb96f41503aa8c5d6b832872e4d5a -59d291a9b2366d1251ad321adad69ccd627336281d14e23871051ae787c66c072796ac887d9a98155e7f3ed692d8195b71226f30cb78096575d3a7653f503ac8 -a65ee36eb266af8ecae45691d79297196646eea7c149716ca6fc68f006a07420a5a1c0010c06a58367d038581d940ea22070b00d281d0440e36033503af846ef -2523005340e9c0189c38d81d942ec5d7e7b9fd8335d038780328dd4b41e0e055a074af038d831782d2bd05040ede0c4ab73f681c004ab7332c1901b840e93604 -270ec001a5db0a340e20c8db9f0df6f519d89de67ef35a4ce79709d69ac8d7e7ef7f171f3f7fff03808b77f9749d56025fc237658d716f27eeebd7dfa2ff63f3 -15d4b037ef523ad34dec06cbdcc859eac78fe3ebd789e4c1d2ecac74bea809f5e8b198a49d4e8ede9448dcad6e481e2ccace4a379db632a761c90892078bb28f -d205a7a58f73d57eb34ea7e562174f673ad596bcb9960048d82af7eaa4445ba95893c9acbcd88d9d4e3586742a4039fbf874cb6daf14f3f2743a71004bb3b0d2 -49b2a8c5f2e72ca9337d1c466f86eb7c5adf030018b3b4d2999e3b657efc3c9cc66392276f30f6ce66027745ee4853802a168ed34d5aa9db72ed88138933e634 -6693003f990a50c5324a17f3a4bade98d5af71ffe6ad4be3968b36fa0457a200cce5dbb83a4fbd8f4d9872c755b0d31a4b1213559dcfacf8fa7506e7a1b684c5 -26aa7699c31cc698f344f8600ecbc4e9f4a8c015c2cbad950ec669db32208644e09c025795739759392cca324a27c1d78b52cfeb8f7b756f6712cb48a45d3c79 -b621b8ec39d1f248b204cee534c771fc56bae3f73b0083d1ab7465b339bb4a8da394dea9499287cdcaa8c68e548fcc55e6527fcf5ed13b98c434a593382c8f62 -e7af7a6b426c4548d0667b32eba89ba95b3232711f816f66345c2f729da7c3fa1fbd83214ccbbdc636b91416f8fa3c8332179c5ab6e2e3e721f719d3376fd9f6 -17a347e6aec3911e91bd96e670b262005d98b9caa446ec2ed1496fcad4550222fe9d68bfdf328d73a4445114cfb204bd039d4c5e4f676b59d02ff0e5ccc7a9e8 -bfe8448dca38bee1a3a98eaee99439c997e582dec110e66724ae3857f16a327ff0c726b60d6998eb10c62b8d4a99bb28d82ccb85f81d7466bed299fef9841e14 -af5ff1eb66c95c71d70b80de41375428dd5a544e8a73d7c104754d9b5be75065187a071d981ca7ab4f41de31be46168988adf22da8582c0a6a65ae0dc4efa029 -937dbaca20dd850607a732c838ac6273caee8d93e2fb7726eae21dc79f7362df607b1cc7f5e7fdc2a925bf1bd7eec2ee25ab91cabee4d585552a8d2fe8a8c7e9 -7a64feecb555460266d1fd2bb0f52e8233788263a97274f96df61eb18f4724aceb63b7365e740a7aac3fd52a766d7a5c58a787f45d6259a0d1799cd1edfbfc61 -709ea7e313adce7e473498f93eddc542c3be61acad9edeeb69d6253d51bd54c3f7d16275855d041bb9faf57bcced2ed18b73685777cec1da854d642e29373e68 -52e23063fe69f024a40d4edb19337282d231385ba12140b922f620f7df3491b992ed55c58653ac115f561ebb93d82fa9eb178e2982dcf8c7be822f8407f268b0 -e4b5cf04a563643601990b12cb4b04c99d12a65d4249c54edc5a109cc8d7375e5ff2f154d7c70dd315b5cc5e1765626c118d0be24f70e4c8ab34c921d6c4ddb2 -ea2e17e0eb61304a97416caf81f196400fe4d3c001ddb5aa1b0c6f69a693c1285d1e9a75edb501507fd6366c8d58930625ddc5cadcefa7e3f146bdcc0517f134 -6c7f90d26d1954d2b62c66b3d39b8513064a0b473066f49870f06bc9b3167e525298df08f625a91bec3a9681296856483a3c17ecf1d1e0323b07299dbdc5c84e -0372a7631940d7a5b6b19683a1ee98965576212c23e9aee0d39819fe19782c29fc74589b8f6996c7ef6edccae17bf3b2e0e25b6dfe1100ec84eb8dcf7252f4bb -7b5fbf024ff2d36cb012be3e9f277d7b33e5364f705071379859e486b07b4bf78f9f071b6c8010644e039373afcea305ebf7351949cb876635456d12f68a25e3 -e3c078fa2adde390fbfe08c13f2fb40dd15550ab710073e9ab7492f1768b9de6c1693fc45e339acfe1056e1d4c615a9cee7ea0d7edc1690fd259735555c2a7fc -bc016860e693adfd75270b0d5ab5413afd2436b700e8c4fcbbc1f44fb8546107311f239b63c276feef13df296863bed2410d694d19a0387e8c55e29813ad83c1 -f4523ae7725ffa475e55544e210d9e6c0dd0995e4ab7d985ae2a1db1503433016e1d8c84d96b0913d3114bfc842c6124bc0a2d7783c10b21090bc3c0a77b60fa -5cb512e77ebbe6edf77db2354023da2bdd7e3724a90ad2c919f645d4b44fb40ec6d05ee9b611b818abac19defe8b0090439c0ec6110cc911ad8301a074301414 -0da680d2a558282ab70431f70db70e7a43eef58145d3113efb658a00e4a07479ac928ef0512270b1642b4958e84a4ba5db694f0b67cb90750f4421881a8ca7a5 -d2210750030a08fd20231165e9a89c724841c06094c6e97adfc324649b748442821e1c6e1d7442a9d219954f805d341da1367e8aaec130f42a5d4ce394b87b0b -b1d65942fea007cde274f783be1e8b495abb07677094de8fda81d52160076368e6d325a4c75137e112567983b92d0b21483706df89c3ad83e68cc8bd3a0e9afd -fcc3fad6829ff688ee2d1aa4db9ec3c279df7911fc34b70bbb62275734d65d560bcdad5a9d4171ba6bbfc6560234dddd83b614bb754e8160f94ac7d06fb3abb3 -39b8bbf7302e23316073dabb8b02297ce0345f26a3227a9a4bc18c35764b19ba003e4373af63c42eab403093fbf5eb7465edd861f6aadcb175c4ae2c5ae717b6 -5bb8a675bed314ab2bec22d8c8d5afdf634d77c1bae90673bbdb95664a275cb4356b8ca545f6250f43e871f263e74da198de92e7c4da1c6d726add6a65e26211 -6bc4eed17951d05dbae560838fddbd8711b95725c49457a2711b3874fd083ed9baac29db8fb3530a8f43d416afc7c276e342abec5ee47a51a62c92eeec806641 -172f245be9727fc383be9eb6dd41b246a6c23960d0fe826065f323fadf2fd7811256cccd1e3aea9085bc8aef4615d0bcbb7483e4612fb295ae6c30d83b20699b -27ba913bc1d2b93b95ac47ec9c3da6d2e6e9315b426fb7252bbdabad3b3f0a99d5dd7be89e917046dd1211b18f1fc79d690d0adf5a6b597adff79af842fff9c3 -7c7d3ec7b97c249e889f69adf7b6daea42bac19aee8221b91a63b6a77d46c21f458eba2d217609d26b59661d5d42cebaca6e8fc6e5413727e29655d87f331611 -736ac9d3087eeeb5a6bb605dbb8b82a37b0f833212cea7aa5c9e02724360bd7725b0ef0c59fddc26c66d90d8000ec6ecd3d1fde22e84652abb8b7de41fa9c4b0 -b7c14e9c2d29be93b755ef63fcb87e3832c7288556e8ddb5690af577f2e74e69d984ea0675837ee0d3b9f4dbc224b1b6e3e51ae7b087e4ad6eff66e0d33d60e7 -61abdaa9d895205d5d8eced4f0c51eea066a197d3718383c66724dbb4da8d47e23c81cf4e6457783a9a5fdce2b4be1c81caa073d204ef7076d1b0baf9e489580 -aec11888d37d43db8eea1b6b9c09c91cc2079d40e9526cb08509f1530083d299ef5a104bb3e66e16a207b546e2d0c1485a2a9de6450c097ee7377f9dc699bd9a -250f67091035184c4ba55b5d11b405e97625b1c539da079d20f71a6583209d42503498024a07e340e66016281d0c25f1fc2a1410fad12bf7bad6161d7b47e5f4 -648ad03298457ba5d333aeb2d8381dd1fb8ba85cb28743070368af74f2ab5cb3dfe7a723fc652860421b1dbfe15e5d588e392b8717f5fbcc93bbf74e1dacf912 -71e8600ca3954ea1c609e7aa1f3f8ec792e820804eb81bcc187190ee51aad24af728940da5d099420efe5d113e0917870e86315ae9da6e2dd98962c549571ce9 -128e94365fd7f438ec0017dd579924b6d2f5abec3d42167209e5dc4f2e1fdf35809c5e4a57a659db8b5d1a3d2e6116655f19535718c9e4389def0b0c16bb5596 -ced98b3962fe728d4b48b604f666a6d2394bb1ee013c58ec5659336c9f137bcef86713f60a9770f0d418870e063348e9626e88337ac7189346a777e39f9cc4d3 -b24de8842f3a3506684277a54ba7265e1e982b43f2f3907b563b664b0e739af3307fdac7a183f17457bac4900b4ec140c8e07467a54b785e1b381feeebfbe302 -2ec534f344f336a0cc8ce3388455e4255b7554d9a342266724e60adc2516eeb3237ece31a6003d3f0f091dfcfa3c8fe338d362f6781c5e6d7b284e1c96ce7330 -b2cc4817b65b1b7f74053d2a17c7b7df23b1eeade9bee57a84cfe79abd9ee7199eba661aee0caaabd9e9c34c891910849d38bfa1592c12dcab4fd612eb3f9c4f -ff1e1bf8ee5b5dd8eff8afaf17f69f4eadd89b429cbabe0dce3b7ee158dde0d149ec8c950cbe93e8f1d1e0b49d69233bf15ea55b5514227cfc3cf4df69372017 -7179551792916f87a59c5a594dd59b6117beacf24f54acd9fb7d795ffe6106eb0acf8c6370daceb4859d18377b55b88b891e4b5ab1df11752538ea3a0dc57b6e -eb8ff6fa1ee52d244a3e0a657ddc70e2d47e9cd2291f849a5da19dd019c6b207b933112e6e33abeeac395d31cb19fcf68c848d722d8604f5d3a26026b7a64d79 -dde37b1eb9b8c7612c67b0d170379899213178705368e5d03973c07a997b6c41d245acccfdfe637256b96af8c62b37d8669ad24d5f18b18d07a730003a80d87c -33f8be240295ae159327bbd947331e7b7f8cdf67352b247d72d2672666700f3b2b99f91c89578dcc7ebcf634c6869030cf20490ba44769c1a78e1afaaf8313e7 -d86bc9a7c3da7c3c9f73256f8ed269b83522fd8e5af8910028e0a5ebe9825b834cb12417fd8be60014b276eef59d21aa7b670425475df9646b8001ccf7e92aef -615afe46a822f47876f76cfafe37db2280002a7cbacae15130ec276a442b5f4c8fa6e8b10420c67ca58bedd019fba8538f23d133f1047809f367afc69b7b66c9 -9cf250dd7568f6d1d5dba97faaaedc3c7821f3952ef8dc9cb41c383b15eb1c57b61ef9875360f32d9ada8e9a8c04e867b2d215c89c5340eda04a44e8fdc7a1f9 -04e5e36e508fd8d996e87736e1b5cc543a5fd7b29277fec4702d1e2d4f17d02976a45f4127df2ecaf31c17297fcf5affe2fc837022ff58662ed77324aed74a6e -818417322df72a199c238771dba441a21779e39215c29a350e400ff333126982b1fce6533667e675b7dfb6a382d6980c023441b5d2c552963d06ff9f67dd7768 -9cc7da02cc65fecae15c068845db2eb25a635131400f54fb740e5df38ce39398b11e35a45301366325a5339def0f1bbf6c25b6686e9801002f6125a5eb2a01b1 -85befdb40f450318c67a713a1b3fcc5f1cf84fc85957492230073080b595ceb4db3d38768756b10c49240c8d0318c34ab3579faecb4d7ab44fb601600a6b2b5d -19c3d20ec15e103b80f1eca6748e171613b54767adf2f6fb5817a45601a6b09bd2f9a02c00b0b9d28d943936a49c82fffcf9c777628fac7f2c76bf737c27619b -b024f46673a513523f57cd2a066d492bc8711ce779e6aacc63add342588c4dab26b2fc2a9302767d10cfde5c6a12148b4b6be43a122c9fd542a501309e372a5d -13d0b57e6c3fcbbb1dc64b1c833b95deca6e17bb0b38af9deab643eab7e997f45fefc7b43d879760d11b1882378ac4ee27f14b0adb14564fec399cab68c171e8 -0b4142119c619ffb51b08b600bc10374b42961ad238292928fb5e4d5b78438dd4ba97cb89abcba3dda85e1f93342ae911a88d92f3c9c9a09b5e4d3dbf5db5be6 -0c4ab71ff2e5caf663c60ada94578fd156d1fcccc03d866f61b50bc40679ba560f2a33b324762510a7db8da09f55f920b19aeab6008df71acae6cb95b3ec5c2a -4fcbdebe582bf0e9601f6c550d4ec71cbfcfcf994a6af9b49afaf9bd6489acbc70fa246c093e1d6cc5a32ab5c2118be276823eaf9d39b53ff50f4dee32cf75ae -a7834ff75eaed968f194b6b27a2b822e58f0fd607961a2c06953185894db104c59040fcd2f1c7c27f67adddc4e2528dd4bb1436fc1f528c5d50114c27a3ae84b -623d1d48e81a444bdc79b219c4e90054d35586dea07117cc5e01607f503a00d81f940e00f607a50380fd09efb500d01072af309de3bffff9ef6c1be02dfcebdf -ff9a6d02bc94bf3e7f7dceb601de024a07b3609d308c83d92bcc62ff3d0c0000c8bd02c0fea07400b03f281d00ec0f4a0700fb83d201c0fea07400b03f281d00 -ec0f4a0700fb83d201c0fea07400b03f281d00ec0f4a0700fb83d201c0fea07400b03f281d00ec0f4a0700fbf397f3f7fd709320d7b69d5799565b78265aabec -a8ad9d4d9098e47f0576f93107d5b597fac6ed16147ecb3ec7719ce7997ba9a7af04e39d07e527612ef874b51cc791fe79c86d4df866dbaedb1ec58af43b0365 -1a94752518636e258520ae4f37de7de8c77296079f1678bd798f963107b5d0a9536e6a99fa48ae845845e5276416f874ea70ae542edc75a9f41572af047b3a0f -0eae4f97857d4ed32186b641bd60b3f755e5bff02bfa2dc85bb60bdcef38d774dbc34f1b133cdea05531c3e44d094d3239872ca9fef851cc54df0ce11948140e -9a8dafad9c729fceb908ec3f7d5969f23b2369b672b2207f272b7626b4ea1e753d7e966b0c6b787e845d242ea774cbe976b2ce4093ebad4c9b8aaf04a4304695 -4f17fce9f3430c926febb14cac593f3011fcb2133e4241cb7695e04f7ac21b4a7337188cd4044b665ddc41c324694153747eb2a8bf9c9cc2413b8567a0f27a4b -d829ffd9135e09c12e903c8772a54b9f4ae7daba7e9deacfbedf6c965517c14ba749cba642e3fc16ec0bbdeda92b30acd5f991b45fd07bb070fdcf4fefa316f6 -def64a7827553e5d82265e77f3495c5920a9a6971aec0bbdc9ef448f49f15a68380305977af32be185f4523a8514cc026a7ab93bca8a858dd1df7726e9563903 -f86e3de8a574dabea7313277a3edf06fd41a360ccec03be9b59ece4f8135f9fd4ca4e424b5d24b2e0b5a9677fd482cdd566c4c568e32abb5f1ae5056ef7781e3 -6f1edb6cd26f2b9a5f09607af8747ecee87e7f7ab3c18872c3962b938f693b9b742df9d40fe4f7f84285c47a97174ea4dd7dee33507fd48f991309653910fc56 -9f2e3e9d7fa29b9cfa4ecd56b69c5e73708d19231ea8414b120b4d6afeb40d93a73e63eff443b8aae3b170ee196872d4c5f9f7ac2ba1b2bb37401e07a017e373 -0b64336270df2b402f06677891b904281d404706eb0e321703a503e84b93d4c423ac284ec3d90180fdc1a70380fd41e900607f503a00d81f940e00f607a50380 -fd41e900607f503a00d81f940e00f607a50380fd41e900607f503a00d81f940e00f607a50380fd41e900607f503a00d81f940e00f607a50380fd41e900607f503a00d81f940e00f607a50380fd41e900607f503a00d81f940ea03dc7710c789a35c841e900607ffe0fd0d0dcaac85d2f2e0000000049454e44ae426082} -}{\nonshppict{\pict\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0\picw11084\pich6800\picwgoal6284\pichgoal3855\wmetafile8\bliptag761123879\blipupi96{\*\blipuid 2d5dd4279f98e59cdb2c60f687096e8e} -010009000003bc78020000009878020000000400000003010800050000000b0200000000050000000c020101a3010500000007010400000098780200430f2000 -cc0000000101a301000000000101a3010000000028000000a3010000010100000100180000000000ecf00400c40e0000c40e00000000000000000000ffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 -0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff00 -0000000000ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff000000000000ffffffffffffffffffffffff0000000000 -00000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff -000000000000ffffffffffffffffffffffff000000000000000000000000000000ffffffffffffffffffffffff000000000000ffffffffffffffffffffffff00 -0000000000ffffff000000000000000000000000000000000000000000000000000000ffffffffffffffffff000000000000000000000000000000ffffffffff -ffffffffffffff000000000000ffffffffffffffffffffffff000000000000ffffffffffffffffff000000000000000000ffffffffffff000000000000000000 -000000ffffffffffff000000000000ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000 -0000000000ffffffffffffffffffffffffffffff000000000000ffffffffffffffffff000000000000000000ffffffffffff000000000000000000000000ffff -ff000000000000ffffffffffffffffff000000000000000000000000ffffffffffff000000000000ffffffffffff000000000000000000ffffff000000000000 -ffffffffffffffffffffffff000000000000000000000000000000ffffffffffffffffffffffff000000000000ffffffffffffffffffffffff000000000000ff -ffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff000000000000ffffffffffffffffffffffff000000000000ffff -ffffffffffffffffffff000000000000000000000000ffffff000000000000ffffffffffff000000000000ffffffffffffffffffffffff000000000000000000 -000000ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff000000000000ffffffffffff000000000000000000ffffffffffffff -ffff000000000000000000000000000000ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff000000000000ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff -000000000000000000000000000000ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff000000000000ffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff -ffffff000000000000ffffffffffffffffffffffff000000000000ffffffffffffffffff000000000000000000000000000000000000000000ffffffffffffff -ffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff0000000000 -00000000000000000000000000000000ffffffffffffffffff000000000000ffffffffffffffffffffffff000000000000ffffff000000000000000000000000 -000000000000000000000000000000ffffffffffff000000000000000000000000000000000000000000ffffffffffffffffff000000000000ffffffffffffff -ffffffffff000000000000ffffffffffff000000000000000000000000ffffff000000000000000000000000000000000000000000000000ffffffffffff0000 -00000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000ffffffffffffffffff -000000000000ffffffffffff000000000000000000000000ffffff000000000000000000000000000000000000000000000000ffffffffffff00000000000000 -0000000000000000000000000000000000ffffffffffff000000000000000000000000ffffff000000000000ffffffffffffffffff0000000000000000000000 -00000000000000000000ffffffffffffffffff000000000000ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff -ffffff000000000000ffffffffffffffffff000000000000ffffffffffffffffffffffff000000000000ffffffffffffffffff00000000000000000000000000 -0000000000000000000000ffffffffffff000000000000ffffffffffffffffff000000000000000000000000000000000000ffffffffffffffffff0000000000 -00000000000000000000000000000000000000ffffffffffff000000000000000000000000ffffffffffff000000000000000000000000000000000000000000 -ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff00000000 -0000ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff0000000000000000000000000000000000000000000000000000 -00ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffff -ffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffff -ff000000000000ffffffffffff000000000000000000ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff000000 -000000ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff000000000000000000ffffffffffffffffff000000000000000000ff -ffffffffff000000000000ffffffffffffffffffffffff000000000000ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff0000 -00000000000000ffffffffffffffffff000000000000000000ffffffffffff000000000000ffffffffffffffffffffffff000000000000ffffffffffff000000 -000000ffffffffffffffffff000000000000ffffffffffffffffff000000000000000000ffffffffffff000000000000ffffffffffffffffffffffffffffffff -ffffffffffffffff000000000000000000ffffffffffffffffffffffff000000000000000000ffffffffffff000000000000ffffffffffff000000000000ffff -ffffffffffffff000000000000ffffffffffffffffff000000000000000000ffffffffffff000000000000ffffffffffffffffff000000000000000000ffffff -ffffff000000000000ffffffffffffffffff000000000000ffffffffffff000000000000000000ffffffffffffffffff000000000000000000ffffffffffff00 -0000000000ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff0000 -00000000ffffffffffffffffffffffff000000000000ffffffffffff000000000000000000ffffffffffffffffff000000000000000000ffffffffffff000000 -000000ffffffffffff000000000000000000ffffffffffff000000000000000000ffffffffffff000000000000ffffffffffffffffff000000000000000000ff -ffffffffff000000000000ffffffffffffffffff000000000000000000ffffffffffffffffff000000000000000000ffffffffffff000000000000ffffffffff -ffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff -ffffff000000000000ffffffffffffffffff000000000000000000ffffffffffffffffffffffff000000000000000000ffffffffffffffffff000000000000ff -ffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff -ffffff000000000000ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff000000000000ffffffffffff000000000000ff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffff -ffffffff000000000000ffffffffffff000000000000ffffffffffffffffffffffffffffff000000000000ffffffffffff000000000000ffffffffffffffffff -ffffff000000000000ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff00 -0000000000ffffffffffff000000000000ffffffffffffffffffffffff000000000000ffffffffffff000000000000ffffffffffffffffff000000000000ffff -ffffffffffffffffffff000000000000ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff -ffffffffffffffffffffffff000000000000ffffffffffff000000000000ffffffffffff000000000000ffffffffffffffffff000000000000ffffffffffffff -ffffffffff000000000000ffffffffffff000000000000ffffffffffffffffffffffff000000000000ffffffffffff000000000000ffffffffffffffffff0000 -00000000ffffffffffff000000000000ffffffffffffffffffffffffffffff000000000000ffffffffffff000000000000ffffffffffffffffffffffff000000 -000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff000000000000ffffffffffffffffffffffff00000000 -0000ffffffffffff000000000000ffffffffffffffffffffffffffffff000000000000ffffffffffff000000000000ffffffffffff000000000000ffffffffff -ffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff000000000000ffffffffffff000000000000ffffffffffffffffff -000000000000ffffffffffffffffffffffffffffff000000000000ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffff -ffff000000000000ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff0000000000 -00ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff000000000000ffffffffffffffffffffffffffffff000000000000 -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffff -ffffffffffffff000000000000ffffffffffffffffffffffff000000000000ffffffffffff000000000000000000000000000000000000000000000000000000 -ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff00000000 -0000ffffffffffffffffffffffffffffff000000000000ffffffffffff000000000000ffffffffffffffffffffffff000000000000ffffffffffffffffff0000 -00000000000000ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff000000000000ffffffffffff000000000000ffffff -ffffffffffffffffff000000000000ffffffffffff000000000000ffffffffffffffffff000000000000000000000000ffffffffffff000000000000ffffffff -ffff000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000ffff -ffffffff000000000000ffffffffffff000000000000ffffffffffffffffff000000000000ffffffffffffffffffffffff000000000000ffffffffffff000000 -000000000000000000ffffffffffff000000000000ffffffffffff000000000000ffffffffffffffffff000000000000ffffffffffff000000000000ffffffff -ffffffffffffffffffffff000000000000ffffffffffff000000000000ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffff -ffffffffffffff000000000000ffffffffffffffffff000000000000ffffffffffffffffffffffff000000000000ffffffffffff000000000000ffffffffffff -ffffffffffffffffff000000000000ffffffffffff000000000000ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff00 -0000000000000000000000ffffffffffff000000000000ffffffffffff000000000000ffffffffffffffffff000000000000ffffffffffffffffffffffffffff -ff000000000000ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff -000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffff -ffff000000000000ffffffffffffffffff000000000000ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 -ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffff -ffffffffff000000000000ffffffffffff000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffff -ff000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff000000000000ffffffffffffffffffffffffffffff000000 -000000ffffffffffff000000000000ffffffffffffffffffffffff000000000000ffffffffffffffffffffffff000000000000000000000000ffffffffffffff -ffff000000000000ffffffffffffffffffffffffffffff000000000000ffffffffffff000000000000ffffffffffffffffffffffff000000000000ffffffffff -ff000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000ffffffffffff000000000000ffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff000000000000ffffffffffff00000000 -0000ffffffffffffffffff000000000000ffffffffffffffffffffffff000000000000ffffffffffffffffff0000000000000000000000000000000000000000 -00ffffffffffff000000000000ffffffffffffffffff000000000000ffffffffffff000000000000ffffffffffffffffffffffffffffff000000000000ffffff -ffffff000000000000ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffff -ffff000000000000ffffffffffffffffffffffff000000000000ffffffffffff000000000000ffffffffffffffffffffffffffffff000000000000ffffffffff -ff000000000000ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000 -000000ffffffffffff000000000000ffffffffffffffffff000000000000ffffffffffffffffffffffffffffff000000000000ffffffffffff000000000000ff -ffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffff -ffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff000000 -000000ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffff -ffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff000000000000ffffffffffff000000 -000000ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000 -0000000000000000000000000000ffffffffffff000000000000ffffffffffffffffffffffffffffff000000000000ffffffffffff000000000000ffffffffff -ffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff000000000000ffffffffffffffffffffffff -ffffff000000000000ffffffffffff000000000000ffffffffffffffffffffffff000000000000ffffffffffff000000000000ffffffffffffffffffffffffff -ffffffffffffffff000000000000000000000000ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffff000000000000000000000000ffffffffffffffffff000000000000ffffffffffff000000000000ffffffffffffffffff000000000000ffffff -ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff000000000000ffffffffffffff -ffff000000000000ffffffffffff000000000000ffffffffffffffffffffffffffffff000000000000ffffffffffff000000000000ffffffffffffffffffffff -ff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff000000000000ffffffffffffffffffffffff -000000000000ffffffffffff000000000000ffffffffffffffffffffffffffffff000000000000ffffffffffff000000000000ffffffffffff000000000000ff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff000000000000ffffffffff -ffffffff000000000000ffffffffffffffffffffffffffffff000000000000ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff -ffffffffffff000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff -ffffffffffffffffffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff0000 -00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffff -ffffffffffffffffffffff000000000000000000ffffffffffffffffff000000000000ffffffffffff000000000000000000ffffffffffffffffff0000000000 -00ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000ffffffffffff -000000000000000000ffffffffffffffffff000000000000000000ffffffffffff000000000000000000ffffffffffffffffff000000000000ffffffffffffff -ffffffffffffffffffffffffffff000000000000000000ffffff000000000000000000ffffffffffffffffff000000000000000000ffffffffffff0000000000 -00000000ffffffffffffffffff000000000000ffffffffffff000000000000ffffffffffffffffff000000000000ffffffffffffffffffffffff000000000000 -ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffffffffffff -ffffffffffffffff000000000000ffffffffffff000000000000ffffffffffffffffff000000000000ffffffffffffffffffffffff000000000000ffffffffff -ff000000000000ffffffffffffffffffffffff000000000000ffffffffffff000000000000ffffffffffffffffff000000000000ffffffffffff000000000000 -000000ffffffffffffffffff000000000000000000ffffffffffff000000000000000000ffffffffffffffffff000000000000ffffffffffffffffffffffffff -ffffffffffffffffffffff000000000000ffffffffffffffffff000000000000000000ffffffffffffffffff000000000000ffffffffffff0000000000000000 -00ffffffffffffffffff000000000000000000ffffffffffff000000000000ffffffffffff000000000000000000ffffffffffff000000000000000000ffffff -ffffff000000000000ffffffffffffffffffffffff000000000000ffffffffffff000000000000ffffffffffffffffff000000000000000000ffffffffffffff -ffff000000000000000000ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffff -ffffffff000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffff000000000000000000000000 -000000ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff000000000000000000 -000000000000000000000000000000ffffffffffffffffff000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffff -ffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff0000000000000000000000000000000000 -00000000ffffffffffffffffff000000000000000000000000000000ffffff000000000000ffffffffffff000000000000000000000000000000000000000000 -000000ffffffffffff000000000000000000000000000000000000000000ffffffffffffffffff000000000000000000000000000000000000000000000000ff -ffff000000000000000000000000000000ffffff000000000000000000000000000000000000000000000000ffffffffffff000000000000ffffffffffffffff -ffffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff000000 -000000000000000000000000ffffff000000000000ffffffffffffffffffffffff000000000000ffffffffffff00000000000000000000000000000000000000 -0000000000ffffff000000000000000000000000000000ffffff000000000000ffffffffffffffffff000000000000000000000000000000000000000000ffff -ffffffffffffff000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff -ffffffffffff000000000000000000000000000000000000000000000000ffffffffffffffffff000000000000000000000000000000000000000000000000ff -ffffffffff000000000000ffffffffffffffffff000000000000000000000000000000000000ffffffffffffffffff0000000000000000000000000000000000 -00000000000000ffffff000000000000000000000000000000ffffffffffff000000000000000000000000000000000000000000ffffffffffffffffff000000 -000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff000000000000ffffffffffffffffffff -ffffffffffffffffffffff000000000000ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff -ff000000000000ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffff -ffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff000000000000ffffff000000000000000000000000ffffffffffffffff -ffffffffffffff000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff -ffffffffffffffffffffffff000000000000ffffffffffffffffffffffff000000000000000000000000000000ffffffffffffffffffffffff000000000000ff -ffff000000000000ffffff000000000000ffffffffffff000000000000000000000000000000000000000000000000ffffffffffffffffff0000000000000000 -00000000000000ffffffffffffffffffffffff000000000000ffffff000000000000000000000000ffffffffffff000000000000000000000000000000ffffff -ffffffffffff000000000000000000000000000000ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff00000000 -0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff000000000000000000000000000000ffffff0000000000 -00ffffffffffffffffffffffff000000000000ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff000000000000000000000000 -000000ffffff000000000000ffffffffffffffffffffffff000000000000000000000000000000ffffffffffffffffffffffff000000000000ffffff00000000 -0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff000000000000ffffff0000000000 -00000000000000ffffffffffffffffffffffffffffff000000000000000000000000ffffff000000000000ffffffffffff000000000000ffffffffffffffffff -ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffffffffff00000000000000000000 -0000000000ffffffffffffffffff000000000000000000000000000000ffffffffffffffffffffffff000000000000ffffff000000000000ffffffffffffffff -ffffffffffffffffffffffffff000000000000ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000ffffff -ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff00 -0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff -ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff -000000000000ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ff -ffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff000000000000ffffffffffffffff -ffffffffffffffffffff000000000000ffffffffffffffffff000000000000ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff0000000000 -00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff -ffffffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffffffff -ffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000 -00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 -000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff000000000000ffffffffffff -ffffffffffffffffffffffffffffff000000000000ffffffffffffffffff000000000000000000ffffffffffffffffffffffff000000000000000000ffffffff -ffffffffff000000000000ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff -ffffff000000000000000000000000000000000000000000000000000000000000ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffff -ffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff -ffffff000000000000000000000000000000000000000000000000ffffffffffffffffff000000000000ffffffffffff000000000000ffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000 -00ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff000000000000ffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 -000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff0000000000 -00ffffffffffffffffffffffff000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000ffffffffffffffffff -000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff0000000000000000000000000000000000 -00000000000000000000000000ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff00000000 -0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000 -00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000 -00000000ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffff000000ffffff000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff00000000 -0000000000000000000000000000ffffffffffffffffffffffffffffff000000000000ffffffffffff000000ffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000084828484828484828484828484828484828484828484828484828484 -82848482848482848482848482848482848482848482848482848482848482848482848482848482848482848482848482848482848482848482848482848482 -84848284848284848284848284848284848284848284848284848284848284848284848284848284848284848284848284848284848284848284848284848284 -84828484828484828484828484828484828484828484828484828484828484828484828484828484828484828484828484828484828484828484828484828484 -82848482848482848482848482848482848482848482848482848482848482848482848482848482848482848482848482848482848482848482848482848482 -84848284848284848284848284848284848284848284848284848284848284848284848284848284848284848284848284848284848284848284848284848284 -84828484828484828484828484828484828484828484828484828484828484828484828484828484828484828484828484828484828484828484828484828484 -82848482848482848482848482848482848482848482848482848482848482848482848482848482848482848482848482848482848482848482848482848482 -84848284848284848284848284848284848284848284848284848284848284848284848284848284848284848284848284848284848284848284848284848284 -84828484828484828484828484828484828484828484828484828484828484828484828484828484828484828484828484828484828484828484828484828484 -8284848284848284848284848284848284ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffff000000c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6 -c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6 -c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3 -c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6 -c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6 -c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3 -c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6 -c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6 -c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3 -c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6c6c3c6ffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000 -0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff0041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff0000000000000000 -00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 -000000000000000000000000ffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff0041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff00410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff00000000 -0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff000000000000000000000000000000ffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff00 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108ffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108ffffff004108004108004108004108004108004108ffffff004108004108004108004108ffffffffffffffffff004108004108004108004108 -004108ffffff004108004108004108004108004108004108004108ffffff004108004108004108004108ffffffffffffffffff00410800410800410800410800 -4108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff00410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff00410800410800410800 -4108004108004108ffffff004108004108004108ffffffffffff004108ffffffffffff0041080041080041080041080041080041080041080041080041080041 -08004108004108ffffff004108004108004108ffffffffffff004108ffffffffffff004108004108004108004108004108004108004108004108004108ffffff -000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 -00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffff000000000000000000000000000000ffffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108ffffff004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108ffffff004108004108004108004108004108004108ffffff004108004108004108 -ffffff004108004108004108ffffff004108004108004108004108004108004108004108004108004108004108004108004108ffffff004108004108004108ff -ffff004108004108004108ffffff004108004108004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffff000000ffffffffffffffffffffffffffffff000000ffffff000000ffffffffffffffffffffffffffffffffffffffffff000000ffffffff -ffffffffffffffff000000ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff000000ffffff000000ffffffffffff0000 -00000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff000000 -ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff000000000000ffffff000000ffffffffffffffffff00000000000000000000 -0000ffffffffffffffffff000000000000000000ffffffffffffffffff000000ffffffffffffffffff000000ffffffffffffffffff000000000000000000ffff -ffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000 -ffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108ffffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108ffffff004108004108004108004108004108004108ffffff004108004108004108ffffff004108004108004108ffffff0041080041 -08004108004108004108004108004108004108004108004108004108004108ffffff004108004108004108ffffff004108004108004108ffffff004108004108 -004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffff -ffffffff000000000000ffffff000000ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff000000ffffffffffffffffff -ffffff000000ffffffffffffffffffffffffffffffffffffffffff000000ffffff000000ffffffffffff000000ffffffffffffffffffffffff000000ffffffff -ffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff000000ffffffffffffffff -ff000000ffffffffffff000000ffffffffffff000000000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff -000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffff000000ffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff0041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff004108004108 -004108004108004108004108ffffff004108004108004108ffffff004108004108004108ffffff00410800410800410800410800410800410800410800410800 -4108004108004108004108ffffff004108004108004108ffffff004108004108004108ffffff0041080041080041080041080041080041080041080041080041 -08ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff000000ffffff000000ffffffffffff000000ff -ffffffffffffffffffffffffffff000000ffffffffffffffffffffffff000000ffffff000000ffffffffffffffffffffffff000000ffffffffffffffffffffff -ffffffff000000ffffffffffff000000ffffffffffff000000ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff000000 -ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffffffff -ffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffffffffff -ff000000ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff000000ffffff000000ffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffff000000000000000000000000000000ffffff00410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff0041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108ffffffffffffffffff004108004108004108004108ffffffffffffffffff0041080041 -08004108ffffff004108004108004108ffffff004108004108004108004108004108004108004108004108004108004108ffffffffffffffffff004108004108 -004108ffffff004108004108004108ffffff00410800410800410800410800410800410800410800410800410800000000000000000000000000000000000000 -0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffff000000ffffffffffffffffff000000ffffff000000ffffffffffff000000000000000000000000000000000000000000ffffff -ffffffffffffffffff000000ffffff000000ffffffffffffffffffffffff000000000000000000000000000000000000000000ffffffffffff000000ffffffff -ffff000000ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffff -ff000000ffffffffffffffffff000000000000000000000000000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffff -ffffff000000ffffffffffff000000000000000000000000000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffff -ffffffffffffffffffffffffffff000000ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000 -00000000ffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108ffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108ffffffffffff004108004108004108004108004108ffffffffffff004108004108004108ffffffffffff004108ffffffffffff00 -4108004108004108004108004108004108004108004108004108004108004108ffffffffffff004108004108004108ffffffffffff004108ffffffffffff0041 -08004108004108004108004108004108004108004108004108000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffff -ffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffff000000ffffffffffffffffff0000 -00ffffffffffffffffffffffff000000ffffffffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffffffffffffffff -000000ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff000000ffffffff -ffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffff -ffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff000000ffffff -000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff00410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08ffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffff0041 -08004108004108004108004108ffffffffffff004108004108004108004108ffffffffffffffffff004108004108004108004108004108004108004108004108 -004108004108004108004108ffffffffffff004108004108004108004108ffffffffffffffffff00410800410800410800410800410800410800410800410800 -4108004108ffffff000000000000000000ffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffff000000ffffffffffff -ffffff000000ffffffffffffffffff000000ffffffffffffffffffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffff000000ffffffff -ffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffff -ff000000000000000000000000000000ffffffffffffffffff000000000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffff -ffffff000000000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000000000ff -ffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffff000000000000000000000000000000ffffff004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108ffffff004108004108004108004108004108ffffff004108004108004108004108ffffff00410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff000000000000000000ffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000ff -ffffffffffffffffffffffffffffffffff000000ffffff000000ffffffffffffffffff000000ffffffffffffffffffffffff000000ffffff000000ffffffffff -ffffffffffffff000000ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff000000ffffff000000ffffffffffffffffffffffff000000 -ffffffffffff000000ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffff -ffffffffff000000ffffff000000ffffffffffff000000000000000000ffffffffffffffffffffffff000000000000ffffff000000ffffffffffff000000ffff -ffffffffffffff000000ffffffffffffffffff000000000000000000ffffffffffffffffff000000ffffff000000000000ffffffffffffffffffffffff000000 -000000000000ffffffffffffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000 -0000000000000000ffffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08ffffff004108004108004108004108004108ffffff004108004108004108004108ffffff004108004108004108004108004108ffffff004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff000000 -ffffff000000ffffffffffffffffff000000ffffffffffffffffffffffff000000ffffff000000ffffffffffffffffffffffff000000ffffffffffffffffffff -ffffffffff000000ffffffffffffffffffffffff000000ffffff000000ffffffffffffffffffffffff000000ffffffffffff000000ffffffffffffffffffffff -ffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108ffffff004108004108004108004108004108ffffff004108004108004108004108004108ff -ffff004108004108004108004108ffffff004108004108004108004108004108ffffff004108004108004108004108004108ffffffffffff0041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff000000ffff -ffffffffffffffffffff000000ffffff000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff -000000ffffff000000ffffffffffffffffffffffff000000ffffffffffff000000ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffff -ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff0041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108ffffff004108004108004108004108004108004108004108004108004108004108004108ffffff004108004108004108004108004108004108 -004108004108004108004108ffffff004108004108004108004108004108ffffff00410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff0000000000000000 -00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff000000ffffffff -ffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff000000ffffffffffffffffffffffffffff -ff000000ffffffffffff000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000 -000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 -000000000000000000000000ffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108ffffff004108004108004108004108004108004108ffffff00410800410800410800 -4108004108004108004108004108004108004108004108ffffff004108004108004108004108004108004108004108004108004108004108ffffff0041080041 -08004108004108004108004108004108004108004108004108004108ffffff004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff0041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108ffffffffffff004108004108004108004108004108ffffff004108004108004108004108004108004108004108004108004108004108 -004108ffffff004108004108004108004108004108004108004108004108004108004108ffffff00410800410800410800410800410800410800410800410800 -4108004108004108ffffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff00410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff00410800410800410800410800410800410800410800 -4108004108004108004108ffffffffffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffff004108004108004108 -004108004108ffffffffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff00000000 -0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff000000000000000000000000000000ffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108ffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108ffffff004108004108004108004108004108004108ffffff0041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff00 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff004108004108004108004108004108ff -ffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08ffffff004108004108004108ffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108ffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108ffffffffffff004108004108004108004108ffffffffffff004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffffffffffffffff004108004108004108ffffffffffff00 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108ffffffffffff004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff -000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffff000000000000000000000000000000ffffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108ffffff004108004108004108ffffffffffffffffff004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108ffffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000 -ffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108ffffff004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffff -ffffffffffffffff004108004108004108ffffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffff004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff0041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108ffffffffffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffff004108004108004108004108004108004108ffffff -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108ffffff004108004108004108004108004108004108ffffffffffff0041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffff000000000000000000000000000000ffffff00410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108ffffff004108004108004108004108004108004108004108ffffff0041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108ffffff00410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000 -00000000ffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffff0041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff -004108004108004108004108ffffff004108004108ffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108ffffffffffffffffffffffff0041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff00410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -ffffff004108004108004108004108004108004108ffffffffffff00410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffff004108004108ffffffffffff0041080041 -08ffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108ffffff004108004108ffffffffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffff000000000000000000000000000000ffffff004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffff0041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108ffffffffffffffffffffffff00410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff004108004108004108ffff -ff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffff004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff000000000000000000ffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000 -0000000000000000ffffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffff004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108ffffff00410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108ffffffffffff004108004108004108004108004108004108004108004108004108004108ffffffffff -ff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108ffffffffffff0041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108ffffffffffffffffffffffffffffff004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108ffffff004108004108004108004108004108004108ffffffffffffffffff004108004108004108004108004108004108004108004108 -ffffffffffff004108004108004108004108004108004108004108004108004108004108ffffffffffff00410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffffffffff004108004108004108 -004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff0041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108ffffffffffff004108004108004108ffffffffffff00410800410800410800410800410800410800410800410800 -4108004108004108004108ffffff004108004108004108ffffff0041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff00410800410800 -4108004108004108004108ffffff004108ffffff004108004108004108004108004108004108004108004108ffffff0041080041080041080041080041080041 -08004108004108004108004108ffffffffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108ffffffffffff004108ffffffffffffffffff004108004108004108004108ffffff0000000000000000 -00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 -000000000000000000000000ffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08ffffffffffff004108004108004108ffffffffffff004108004108004108004108004108004108004108004108004108004108ffffffffffff004108004108 -ffffffffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108ffffffffffffffffffffffff004108004108004108004108004108ffffffffffff004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffffffffff004108ffffffffffff00410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -ffffffffffff004108004108004108004108ffffff004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff0041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffff004108004108004108ff -ffffffffff004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffff0041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108ffffffffffffffffff004108004108004108004108ffffff0041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108ffffffffffff004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff004108004108004108004108004108ffff -ffffffff004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff00410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffff004108004108004108004108 -004108004108004108004108004108004108004108ffffff004108004108004108ffffff00410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108ffffffffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108ffffff004108004108004108004108004108ffffff004108004108004108004108ffffff00000000 -0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff000000000000000000000000000000ffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108ffffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08ffffff004108004108004108ffffff004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffffffffff -ffffffffffffffffffffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff0041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108ffffff004108004108004108004108004108ffffff004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff00 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffff004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff004108ffffffffffffffffff00410800 -4108004108004108004108004108004108004108004108004108004108004108004108ffffff004108004108004108004108004108ffffff0041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffff0041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffff00410800410800410800 -4108ffffff004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108ffffffffffffffffff004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108ffffff004108004108004108004108004108ffffff00410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108ffffffffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108ffffffffffffffffffffffffffffffffffff004108004108004108004108ffffff -000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffff000000000000000000000000000000ffffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff0041 -08004108004108004108004108ffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffff -ff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000 -ffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffff004108004108004108004108ffffffffffff00 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffff00410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff0041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108ffffffffffff00410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108ffffff004108004108004108004108004108ffffff004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffff000000000000000000000000000000ffffff00410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108ffffffffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108ffffff004108004108004108004108004108ffffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108ffffffffffffffffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffff000000000000000000ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff000000000000000000000000 -ffffffffffff000000ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffffff -ffffffffffffffff000000000000000000000000000000ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff000000ffff -ffffffffffffff000000ffffffffffffffffff000000000000ffffff000000ffffffffffff000000000000ffffffffffff000000ffffffffffffffffff000000 -000000000000ffffffffffffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffffff000000ffffffff -ffffffffff000000ffffffffffffffffff000000000000000000000000ffffffffffff000000ffffffffffffffffff000000000000000000ffffffffffffffff -ffffffff000000000000ffffff000000ffffffffffff000000000000ffffffffffffffffff000000000000000000ffffffffffffffffff000000ffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000 -00000000ffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffffffffff00410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffff004108004108004108004108 -ffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff000000ff -ffffffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff0000 -00ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff -ffffff000000ffffffffffffffffff000000ffffffffffffffffff000000ffffffffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ff -ffffffffff000000000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffff -ffffffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffff -ffffffffffff000000ffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffff000000000000ffffffff -ffff000000ffffffffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff00410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108ffffff004108004108004108004108ffffff0041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff -000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff00 -0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff000000ffffffffffff000000ffff -ffffffffffffffffffffffffffffffff000000ffffff000000ffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000 -ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffffffffffff -ffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffff -ffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffff -ffffffffffff000000ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffff000000000000000000000000000000ffffff004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108ffffff004108004108004108004108ffffffffffff00410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff000000000000000000000000 -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffff -ff000000ffffffffffff000000ffffffffffffffffffffffff000000000000000000ffffffffffffffffff000000000000000000000000000000ffffffffffff -ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff000000ffffffffffff000000000000000000000000000000ffffffffffff000000ff -ffff000000ffffffffffff000000ffffffffffffffffff000000000000000000000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff0000 -00ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffffff000000 -ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffff000000ffffffffffffffffffffffffff -ffffffffffffffff000000000000000000000000ffffffffffff000000ffffffffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000 -0000000000000000ffffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffffffffff004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff0041080041080041 -08004108004108ffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108ffffff000000000000000000000000000000ffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff -ffffffffffffffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffff -ffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffff -ffffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffff000000ffffffffffff000000ffffffffffff -ffffffffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff00 -0000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff0000 -00ffffffffffffffffff000000ffffffffffff000000ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 -ffffffffffff000000ffffffffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108ffffffffffff004108004108004108004108ffffff00410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffff00410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108ffffff000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff -ffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000000000ffffffffffff000000ffffffffffffffffff000000ffffff -ffffff000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff000000ffffffffffff00 -0000ffffffffffffffffff000000ffffff000000ffffffffffffffffff000000ffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffff -ff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000000000ffffffffffff000000ffffffffffff -ffffffffffffffffffffffff000000ffffffffffff000000000000ffffffffffff000000ffffffffffff000000ffffffffffff000000000000ffffffffffff00 -0000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff0000 -00ffffffffffffffffff000000ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff0041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108ffffff004108004108004108004108ffffff004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108ffffffffffffffffff004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff0000000000000000 -00ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff000000ffffffff -ffffffffff000000ffffffffffff000000ffffff000000ffffffffffff000000000000000000ffffffffffffffffffffffff000000000000000000ffffffffff -ffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff000000ffffffffffffffffff000000000000000000ffffffffffff000000 -ffffffffffffffffff000000ffffff000000ffffffffffffffffff000000000000000000ffffffffffff000000000000000000ffffffffffff000000ffffffff -ffffffffff000000000000000000ffffffffffffffffff000000ffffff000000000000ffffffffffffffffffffffffffffffffffffffffff000000ffffffffff -ff000000ffffff000000000000ffffffffffffffffffffffff000000000000ffffff000000ffffffffffff000000ffffffffffffffffff000000000000000000 -ffffffffffffffffffffffff000000000000000000ffffffffffff000000000000000000ffffffffffffffffff000000000000000000ffffffffffffffffff00 -0000ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 -000000000000000000000000ffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff00 -4108004108004108004108ffffffffffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108ffffffffffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108ffffff000000000000000000ffffff000000000000ffffffffffffffffffff -ffffffffffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffffffffffffffffffffffffffffffff000000ffffffffffffffff -ffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ff -ffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff0041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffffffffffffffffffffffffffffffffff004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108ffffff004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108ffffff000000ff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ff -ff00ffff00ffff00ffff00ffff00ffff00ffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff000000ffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff00410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108ffffffffffffffffff004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108ff00ff004108004108004108004108ff00ff0041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108ffffffffffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108ff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff000000000000000000000000000000ffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffffffffff004108004108004108004108004108004108ff -ffffffffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108ff00ff004108004108004108004108ff00ff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -ffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ff000000000000ffffffffffff000000000000ffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff00 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108ffffffffffffffffff004108004108004108004108ffffff004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ff00ff004108004108004108004108ff00 -ff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108ffffff004108004108ffffffffffff0041080041080041080041080041 -08004108004108ffffffffffffffffff004108004108004108004108004108004108004108004108004108004108004108004108004108ff00ffff00ffff00ff -ff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ff00410800410800410800 -4108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108ffffffffffff004108004108004108ffffffffffffffffffffffff0041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108ff00ff004108004108004108004108ff00ffff00ff00410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108ffffff004108004108004108ffffff004108ffffffffffffffffff00410800410800410800410800410800410800410800410800410800410800410800 -4108004108ff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff -000000000000000000ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffff000000000000000000000000000000ffffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108ffffffffffffffffffffffffffffffffffffffffff00410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108ff00ffff00ff004108004108004108004108ff00ff004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffff004108004108ffffffffff -ffffffff004108004108004108004108004108ff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ff -ff00ffff00ffff00ffff00ffff00ff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffffffff -ff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000 -ffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffff -ffffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ff00ff00410800410800 -4108004108ff00ff0041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108ff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ff0041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff0041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffffffffff -004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff00410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108ff00ff004108004108004108004108ff00ff004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ff004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108ffffffffffffffffffffffffffffffffffff0041080041080041080041 -08ffffff000000000000000000ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffff000000000000000000000000000000ffffff00410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08ffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108ff00ff004108004108004108004108ff00ff0041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ff00ffff00ffff00ff -ff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ff00410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108ffffffffffff004108004108004108004108ffffff004108004108004108004108ffffff000000000000000000ffffffffffffff -ffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000 -00000000ffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffffffffff00410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ff00ff004108 -004108004108004108ff00ffff00ff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108ff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108ffffffffffffffffffffffffffffff00410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff0041080041 -08004108004108004108ffffffffffff004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffff000000000000ffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff00410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108ffffffffffffffffff004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108ff00ffff00ff004108004108004108004108ff00ff0041080041 -08004108004108004108004108004108ff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ff -ff00ffff00ffff00ffff00ffff00ff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108ffffff004108004108004108004108004108ffffff00410800410800 -4108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffff000000000000000000000000000000ffffff004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108ffffffffffffffffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108ff00ff004108004108004108004108ff00ff004108004108004108004108004108004108ff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ff0041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108ffffff004108004108004108004108004108ffffff004108004108004108004108ffffff000000000000000000ffffff -ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000 -0000000000000000ffffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffffffffff -ffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08ff00ff004108004108004108004108ff00ff004108004108004108004108004108004108ff00ffff00ff004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffff -ffff004108004108004108004108ffffff004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff0000 -00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffffff -ffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ff00ff004108004108004108004108ff00ffff -00ff0041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffffffffffffffffffffffffffff004108 -004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff0041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffffffffffffffff004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108ff00ffff00ff004108004108004108004108ff00ff004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffffffffff -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff0000000000000000 -00ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 -000000000000000000000000ffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108ff00ff004108004108004108004108ff00ff0041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108ffffff000000000000000000000000ffffffffffffffffffffffffffffffff -ffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff0041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ff00ff004108004108004108 -004108ff00ff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108ffffff000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff00410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108ff00ff004108004108004108004108ff00ff0041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff00000000 -0000000000ffffff000000000000ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff000000000000000000000000000000ffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108ff00ff004108004108004108004108ff00ffff00ff00410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffff000000000000ffffff -ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff00 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffff -ffffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ff00ffff00ff0041 -08004108004108004108ff00ff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffff000000000000ffffffffffffffffffffffffffffff0000000000 -00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108ffffffffffffffffffffffffffffffffffffffffffffffffff00ff004108004108ff -ffffffffffffffffffffffffffffffffffffffffffffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff -000000000000000000ffffffffffffffffffffffff000000000000ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffff000000000000000000000000000000ffffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108ff00ff004108004108004108ffffffff00ff004108004108ffffff004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffffffffffffffffffffffffffff004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffffffff -ffffffff000000000000ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000 -ffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ff -00ff004108004108004108ffffffff00ffff00ff004108ffffff0041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffff -ffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff0041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108ff00ffff00ff004108004108ffffff004108ff00ff -004108ffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffff -ffffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08ffffff000000000000000000ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff000000000000ffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffff000000000000000000000000000000ffffff00410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108ff00ff004108004108ffffff004108ff00ff004108ffffff0041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffffffffffffffff00410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffff -ffffffffffffffffffffffffffff000000000000ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000 -00000000ffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -ffffffffffffffffffffffffffffffffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108ff00ff004108004108ffffff004108ff00ff004108ffffff00410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffff -ff004108004108004108004108004108004108ffffff004108004108ffffff004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 -000000ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff00410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ff00ff004108004108ffffff0041 -08ff00ff004108ffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffffffffffffffff004108004108004108004108004108ff -ffffffffffffffffffffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108ffffffffffffffffff004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff000000000000ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffff000000000000000000000000000000ffffff004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108ff00ff004108004108ffffff004108ff00ffff00ffffffff00410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffffffff -ff004108004108004108004108004108ffffff004108004108ffffff004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff000000000000000000ffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000 -0000000000000000ffffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108ff00ffff00ff004108ffffff004108004108ff00ffffffff004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108ffffff004108ffffff004108004108004108004108004108ffffffff -ffffffffffffffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffff000000000000ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ff00ff004108ff -ffff004108004108ff00ffffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffff0041 -08004108004108004108004108ffffffffffff004108ffffff004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff00 -0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff0041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108ff00ff004108ffffff004108004108ff00ffffffff004108004108 -004108004108004108004108004108004108004108004108004108004108004108ffffffffffffffffff004108004108004108004108004108ffffffffffffff -ffffffffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108ffffffffffff004108004108ffffff004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff0000000000000000 -00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff000000000000ffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 -000000000000000000000000ffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108ffffffffffffffffff004108004108004108004108004108004108004108ffffff004108004108004108004108ffffff0041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108ff00ff004108ffffff004108004108ff00ffffffff004108004108004108004108004108ffffffffffff0041080041 -08004108004108004108004108ffffff004108ffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108ffffffffffffffffffffffffffffff004108ffffff0041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffff000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff000000000000000000000000ffffffffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000000000000000000000ffffffffffff -ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffffffffffffffff000000ff -ffffffffffffffff000000000000000000ffffffffffffffffff000000ffffff000000000000ffffffffffffffffffffffff000000000000000000ffffffffff -ffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffffffffffffffffffffff000000000000000000ffffffffffffffffff -ffffff000000000000ffffff000000ffffffffffff000000ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff0041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108ffffffffffff004108004108004108ffffffffffff00410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ff00ff -004108ffffff004108004108ff00ffffffff004108004108004108004108ffffffffffffffffffffffff004108004108004108004108004108ffffffffffffff -ffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff004108004108004108ffffff -004108ffffffffffff004108004108ffffffffffffffffffffffffffffffffffff00410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffffffffffffffffffffffffffffffff -ffffffff004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff000000ffffffff -ffffffffff000000ffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffff -ffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffff000000ffffffffffffffffff000000 -ffffffffffff000000000000ffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff000000ff -ffffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffff000000000000ffffffffff -ff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff00410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffff0041 -08004108004108ffffffffffffffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108ff00ffff00ffffffff004108004108004108ffffff0041 -08004108004108004108ffffff004108ffffffffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108ffffff004108004108004108ffffff004108ffffffffffff0041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108ffffff004108004108004108004108004108004108ffffff00410800410800000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffff -ffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffff000000ffffff -ffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffff -ffffffffffffffffffffff000000ffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff0000 -00ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff000000ffffff -ffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffff000000ffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff000000000000000000000000000000ffffff004108004108004108004108004108004108004108004108004108004108004108ffffffffffffffffffffffff -ffffffffffffffffffffffff004108004108004108004108004108004108004108004108ffffffffffffffffffffffffffffffffffff004108ffffff00410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108ffffffffffffffffff004108004108004108ff00ffffffff004108004108004108ffffff004108004108004108004108ffffffffffffffffff00 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108ffffffffffffffffffffffffffffffffffffffffff004108004108004108004108004108004108004108004108004108ffffffffffffff -ffffffffffffffffffffffffffffffffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108ffffff004108004108004108004108004108004108ffffff004108004108000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff00 -0000ffffffffffffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffff -ffffffff000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff -000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff00000000000000000000000000 -0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffffffffffffffffffff -ffffffffffffff000000000000000000000000ffffffffffff000000ffffffffffff000000000000000000000000000000ffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff00 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff004108ffffff0041080041 -08004108ff00ffffffff004108004108004108ffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff00410800410800410800410800 -4108004108ffffff004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff000000000000ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff000000000000000000 -000000ffffffffffff000000ffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffff -ff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffff000000000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ff -ffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffffffffffffffffffffffffffff00410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108ffffffffffff004108004108004108004108004108ffffffffffff004108ffffff004108004108004108ff00ffffffff004108004108004108ff -ffffff00ff0041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108ffffffffffffffffffffffffffffffffffffffffffffffff004108004108004108ffffff -000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff000000000000ff -ffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff0000 -00ffffffffffff000000ffffffffffff000000000000ffffffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff -000000000000000000ffffffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000000000ffffffff -ffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff -ffffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffff000000ffffff -ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffff000000000000000000000000000000ffffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffffffffff0041080041080041 -08004108004108ffffffffffffffffffffffff004108004108004108ff00ffffffff004108004108004108ffffffff00ff004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffffffffff004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff -ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000000000ffffff00 -0000ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffff -ffffffff000000ffffffffffffffffff000000000000000000ffffffffffffffffff000000ffffff000000000000ffffffffffffffffffffffff000000000000 -000000ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000ff -ffffffffffffffffffffff000000000000000000ffffffffffffffffff000000ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000 -ffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108ffffffffffff0041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108ffffffffffff004108004108004108004108004108004108ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffff004108004108004108ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 -0000000000ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffff -ffffffff000000ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffff000000ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff0041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108ffffffffffffffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffffffffffffffff0041080041080041 -08004108004108ffffffffffffffffff004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff004108004108 -004108ffffffff00ff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff000000000000 -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff000000ffffffffffffffffff000000ffffffff -ffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff000000ffffffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffff -ffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffff000000000000000000000000000000ffffff00410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffff004108ffffff0041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -ffffffffffff004108004108004108004108004108004108ffffff004108ffffffffffff00410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108ffffff004108004108004108ffffffff00ff0041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffff -ffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff000000ffffffffffff000000ffffffffffffffffffffffffffffff -ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ff -ffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000 -00000000ffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108ffffffffffffffffffffffffffffffffffffffffffffffff00410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffffffffffffffff0041080041080041080041 -08004108ffffffffffffffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108ffffff004108004108004108ffffffff00ffff00ff00410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 -000000ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff00410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffffffffff0041080041080041080041 -08004108004108004108004108004108004108ffffff004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff -ffffff004108004108004108004108004108004108ffffff004108004108ffffff00410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffff00 -ff004108004108ffffff004108ff00ff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff000000000000ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffff000000000000000000000000000000ffffff004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffffffffffffffff0041080041080041080041080041 -08ffffffffffffffffffffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffff00ff004108004108ffffff004108ff00ff00410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff000000000000000000ffffff -ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000 -0000000000000000ffffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108ffffff004108004108ffffff00410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108ffffffff00ff004108004108ffffff004108ff00ff004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108ffffffffffffffffffffffffffffffffffff004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffff0000000000 -00ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffff -ffffffffffffffffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ff -ffffff00ff004108004108ffffff004108ff00ffff00ff0041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff000000000000ff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff0041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffff00ffff00ff004108ffffff004108004108 -ff00ff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff0000000000000000 -00ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 -000000000000000000000000ffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108ffffff004108ff00ff004108ffffff004108004108ff00ff0041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffff000000000000ffffffff -ffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff0041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffffffffff -ffffffffffffffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108ffffff004108ff00ff004108ffffff004108004108ff00ff00410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108ffffff000000000000000000ffffffffffffffffff000000000000ffffffffffffffffffffffffffffff000000000000ffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff00410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ff00ff0041080041080041 -08004108ff00ff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff00000000 -0000000000ffffffffffff000000000000ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff000000000000000000000000000000ffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108ff00ff004108004108004108004108ff00ffff00ff00410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffffffffff00410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108ffffff000000000000000000ffffff000000000000ffffffffffff -ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff00 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108ff00ffff00ff004108004108004108004108ff00ff004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108ffffff000000000000000000ffffff000000000000ffffffffffffffffffffffffffffffffffff000000000000ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ff00ff00 -4108004108004108004108ff00ff0041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff -000000000000000000000000000000ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffff000000000000000000000000000000ffffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108ff00ff004108004108004108004108ff00ff004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff000000000000000000000000ffffffffffffffff -ffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000 -ffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108ff00ff004108004108004108004108ff00ff0041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff0041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffffffffff004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -ff00ff004108004108004108004108ff00ffff00ff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffff -ffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffff000000000000000000000000000000ffffff00410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ff00ffff00ff004108004108004108004108ff00 -ff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffffffffffffffff0041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108ffffffffffffffffffffffffffffffffffff004108004108004108004108ffffff000000000000000000ffffffffffffff -ffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000 -00000000ffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108ff00ff004108004108004108004108ff00ff00410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff0041080041 -08004108004108004108ffffff004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffff000000000000ffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff00410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108ff00ff004108004108004108004108ff00ff004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108ffffff004108004108004108004108004108ffffff00410800410800 -4108004108ffffff000000000000000000ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffff000000000000000000000000000000ffffff004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ff00ff00410800410800410800 -4108ff00ffff00ff0041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -ffffffffffffffffffffffffffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108ffffff004108004108004108004108004108ffffffffffff004108004108004108ffffff000000000000000000ffffff -ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000 -0000000000000000ffffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108ffffffffffffffffffffffffffffff004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108ff00ffff00ff004108004108004108004108ff00ff004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff004108004108004108ffffff0041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff00 -4108004108004108004108004108ffffffffffff004108004108004108ffffff000000000000000000ffffffffffffffffffffffff000000000000ffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108ff00ff004108004108004108004108ff00ff0041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108ffffff004108004108004108ffffff00410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffff004108004108004108004108ffffff004108 -004108004108004108ffffff000000000000000000ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff0041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ff00ff004108 -004108004108004108ff00ff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108ffffff004108004108004108ffffffffffffffffffffffff004108004108004108004108004108004108004108ffffffffffffffffff004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108ffffffffffffffffffffffffffffffffffff004108004108004108004108ffffff0000000000000000 -00ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 -000000000000000000000000ffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08ffffffffffffffffffffffffffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108ff00ff004108004108004108004108ff00ff0041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108ffffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffff000000000000ffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff0041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffffffffffffffff004108ffffffffffff00410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108ff00ff004108004108004108004108ff00ffff00ff00410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108ffffff000000000000000000ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff00410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108ffffffffffff004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ff00 -ffff00ff004108004108004108004108ff00ff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff00000000 -0000000000ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff000000000000000000000000000000ffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108ffffffffffffffffff00410800410800410800410800410800410800410800 -4108004108ffffffffffffffffffffffffffffffffffffffffff0041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ff00ff004108004108004108004108ff00ff00 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108ffffffffffffffffff00410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108ffffff000000000000000000ffffff000000000000ffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff00 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffffffffffffffff004108ffffff -ffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108ff00ff004108004108004108004108ff00ff004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108ffffffffffffffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108ffffff000000000000000000ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffff0041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108ff00ff004108004108004108004108ff00ffff00ff0041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff -000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffff000000000000000000000000000000ffffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108ffffffffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ff00ffffffffffffffffffffffffff -ffffffffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff000000000000000000000000000000ffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000 -ffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108ffffffffffff004108004108004108004108004108ffffffffffff0041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108ffffff004108004108004108004108ffffff0041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff0041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108ffffffffffffffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108ffffff004108004108004108004108ffffff00410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffff000000000000000000000000000000ffffff00410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffff0041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff0041080041 -08004108004108ffffffffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff000000ffffffffffff000000ffffffffffff -ffffff000000000000000000000000ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff00000000000000 -0000000000000000ffffffffffffffffff000000ffffffffffffffffff000000000000000000ffffffffffffffffff000000ffffff000000000000ffffffffff -ffffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffffffffffffffffffffff -ffffff000000000000000000ffffffffffffffffffffffff000000ffffffffffffffffff000000ffffffffffffffffff000000000000ffffff000000ffffffff -ffff000000000000ffffffffffff000000ffffffffffffffffff000000000000000000ffffffffffffffffff000000ffffffffffffffffff000000ffffffffff -ffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffffffffff000000000000000000000000ffffffffffff -000000ffffffffffffffffff000000000000000000ffffffffffffffffffffffff000000000000ffffff000000ffffffffffff000000000000ffffffffffffff -ffff000000000000000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000 -00000000ffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108ffffff004108004108004108004108004108ffffff00410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108ffffffffffffffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 -0000ffffffffffffffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffff -ff000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff000000ffffffffffff000000 -ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000000000ffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ff -ffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff000000ffffffffffffffffff000000ffffffffffffffffff000000ffffffffff -ffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffff000000000000ffffffffffff000000ffffffffffffffffff000000ffffff -ffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffff -ffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffff000000ffffffffffffffff -ff000000ffffffffffff000000ffffffffffff000000000000ffffffffffff000000ffffffffffffffffff000000ffffffffffffffffff000000ffffffffffff -000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff00410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108ffffffffffff004108004108004108004108ffffff004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff000000 -ffffffffffff000000ffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffff000000ffffffffffffffffff0000 -00ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 -ffffffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffff000000ffffffffffff000000ff -ffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffff -ffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffff -ffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffffffff -ffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffff000000000000000000000000000000ffffff004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ff -ffff004108004108004108004108ffffffffffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff000000000000000000ffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffff000000ffff -ffffffff000000ffffffffffffffffff000000ffffffffffff000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffff000000ffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff00 -0000ffffffffffff000000000000000000000000000000ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff000000ffff -ffffffff000000000000000000000000000000ffffffffffff000000ffffff000000ffffffffffff000000ffffffffffffffffff000000000000000000000000 -ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ff -ffffffffffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffff -ffffffff000000ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff000000ffffffffffff -ffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000 -0000000000000000ffffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff004108004108004108004108004108ffffff -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffff0041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -000000ffffffffffffffffff000000000000000000000000ffffffffffff000000ffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ff -ffffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffff -ff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff -000000ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ff -ffffffffff000000ffffff000000ffffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff0000 -00ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff000000 -ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffff000000ffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffffffffff000000ffff -ffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108ffffffffffffffffff0041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108ffffff004108004108004108004108004108ffffff0041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffff00410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffff -ffffffffffffffffffff000000ffffffffffff000000ffffffffffff000000ffffffffffff000000000000ffffffffffff000000ffffffffffffffffff000000 -ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffffff -ffff000000ffffffffffff000000000000ffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffff -ff000000ffffffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffff000000ffffffffffffffffff000000ffffff -000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff00 -0000ffffffffffff000000000000ffffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffffff000000000000ffffffffffff0000 -00ffffffffffff000000ffffffffffff000000000000ffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffff -ffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffffffffff000000ffffffffffff000000000000ffffffffffffffffffff -ffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff0041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108ffffff004108004108004108004108004108ffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108ffffffffffffffffff004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff0000000000000000 -00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff00 -0000ffffffffffffffffff000000000000ffffff000000ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff0000 -00ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff000000000000000000ffffffffffffffffff000000ffffff000000 -000000ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff00 -0000ffffffffffffffffff000000000000000000ffffffffffff000000ffffffffffffffffff000000ffffff000000ffffffffffffffffff0000000000000000 -00ffffffffffff000000000000000000ffffffffffff000000ffffffffffffffffff000000000000000000ffffffffffffffffff000000ffffff000000000000 -ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff000000ffffff000000000000ffffffffffffffffffffffff000000000000ffffff00 -0000ffffffffffff000000ffffffffffffffffff000000000000000000ffffffffffffffffffffffff000000000000000000ffffffffffff0000000000000000 -00ffffffffffffffffff000000000000000000ffffffffffffffffff000000ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 -000000000000000000000000ffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108ffffffffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffff0041080041080041080041 -08ffffffffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff -000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff000000ff -ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff0041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffff00410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108ffffff004108004108004108004108004108ffffff00410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108ffffff0041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffff00ffff00ffff00ffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffff -ffff000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffff000000ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff00410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108ffffffffffff004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108ffffffffffffffffff00410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108ffffff004108004108004108004108004108ffffff004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108ffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108ffffffffffffffffffffffffffffffffffff004108004108004108004108ffffff00000000 -0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff00 -ffff00ffff00ffff00ffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff000000ffffff -ffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffff000000000000000000000000000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000 -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffff000000ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff000000000000000000000000000000ffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108ffffffffffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108ffffff004108ffffffffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff00410800410800 -4108004108004108ffffffffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffff -ffffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108ffffff004108004108004108004108004108ffffff004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff00ffff00ffff00ffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff00 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff00410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108ffffffffffff004108004108004108004108ffffff004108004108004108 -004108004108004108004108004108004108004108004108004108004108ffffff004108004108004108ffffffffffffffffff00410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffff0041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff00410800410800410800410800 -4108ffffff004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffff00ffff00ffff00ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108ffffff004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108ffffff004108004108004108004108ffffff0041080041080041080041080041080041080041080041080041080041 -08004108004108004108ffffffffffff004108004108ffffff004108ffffff004108004108004108004108004108004108004108004108004108004108ffffff -ffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108ffffff004108004108004108004108004108ffffffffffff004108004108004108ffffff -000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff00ffff00ffff00ffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffff000000000000000000000000000000ffffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108ffffffffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108ffffff004108004108ffffffffffffffffffffffff0041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff -ffffff004108004108004108ffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffff00 -4108ffffff004108ffffffffffff004108004108004108004108004108004108004108004108004108004108ffffffffffff004108004108004108ffffffffff -ff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108ffffff004108004108004108004108004108ffffffffffff004108004108004108ffffff000000000000000000ffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffff00ffff00ffff00ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000 -ffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffff004108ffff -ffffffffffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffffffffffffffff -004108ffffffffffff004108004108ffffffffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff004108004108004108ffffff0041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff004108ffffff004108004108ffffffffffff004108 -004108004108004108004108004108004108004108004108004108ffffffffffff004108004108004108ffffffffffff00410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffff004108004108 -004108004108ffffff004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffff00ffff00ffff -00ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff0041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108ffffffffffff004108004108004108004108004108004108004108004108004108ff -ffffffffff004108004108004108004108004108004108004108004108004108ffffff004108004108004108004108ffffff004108004108004108004108ffff -ff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108ffffffffffff004108004108ffffff00410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108ffffffffffffffffff0041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108ffffffffffff004108004108004108ffffffffffff004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108ffffffffffff004108ffffffffffffffffff0041080041080041080041 -08ffffff000000000000000000ffffffffffffffffffffffffffffffffffffff00ffff00ffff00ffff00ffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffff000000000000000000000000000000ffffff00410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108ffffffffffff004108004108004108004108004108004108004108004108004108ffffffffffff004108004108004108004108004108004108 -004108ffffffffffffffffffffffff004108004108004108ffffffffffff004108004108004108ffffffffffff00410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108ffffffffffff004108ffffff00410800410800ffff00ffff00ffff00ffff004108004108004108004108004108004108004108004108004108 -004108ffffffffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108ffffffffffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108ffffffffffffffffff004108004108004108004108004108004108ffffff000000000000000000ffffffffffffff -ffffffffffff00ffff00ffff00ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000 -00000000ffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffff00410800410800410800 -4108004108004108004108004108004108ffffffffffff004108004108004108004108004108004108004108004108004108004108ffffffffffffffffff0041 -08004108ffffff004108004108004108004108ffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffff004108004108004108004108ffffff004108ffffff00 -410800410800ffff00ffff00ffff00ffff00ffff00ffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffff004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108ff00ff0041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffff00ffff00ffff00ffff00ffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff00410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff004108004108004108004108ff -ffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffffffff -ffffffff004108004108ffffffffffffffffffffffffffffff004108004108004108ffffffffffffffffff00410800410800410800410800410800410800ffff -00ffff00ffff00ffff00ffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ff -ffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108ff00ffff00ffff00ff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108ffffff000000000000000000ff00ffff00ffff00ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffff000000000000000000000000000000ffffff004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108ffffffffffffffffffffffffffffffffffff004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108ffffff004108004108ffffff004108004108ffffff00410800410800 -4108ffffffffffff004108004108004108ffffffffffff00410800410800410800410800410800410800410800410800ffff00ffff00ffff00ffff00ffff0041 -08004108004108004108004108004108004108004108ffffff004108004108004108004108004108004108ffffffffffff004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ff00ff004108ff00ffff00ffff00ffff00 -ff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff000000ff00ffff00ffff00ff -ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000 -0000000000000000ffffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108ffffffffffff004108004108004108004108004108004108ffffff004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800ffff00ffff00ffff00ffff00ffff00410800410800410800410800 -4108ffffffffffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108ff00ff004108004108004108004108ff00ffff00ffff00ffff00ff00410800410800410800 -4108004108004108004108004108004108004108004108004108004108ff00ffff00ffff00ffff00ffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108ffffffffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108ffffffffffff004108004108004108004108004108ffffffffffff0041080041080041080041080041080041080041080041080041080041080041 -0800410800410800410800410800410800410800410800ffff00ffff00ffff00ffff00ffff004108004108004108004108ffffff004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108ff00ff004108004108004108004108004108004108004108ff00ffff00ffff00ffff00ff004108004108004108004108004108004108004108 -004108ff00ffff00ffff00ffff00ff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff0041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff00 -4108004108004108004108004108004108ffffffffffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffff004108004108004108004108 -004108ffffffffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -410800410800410800410800ffff00ffff00ffff00ffff004108004108ffffffffffff0041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ff00ff00410800410800410800 -4108004108004108004108004108004108004108ff00ff004108004108004108004108004108004108ff00ffff00ffff00ffff00ffffffff0000000000000000 -00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 -000000000000000000000000ffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108ffffff004108004108004108004108004108004108ffffffffffff0041080041080041080041 -0800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800ffff -00ffff00ffff00ffff00ffffffffffffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108ff00ff004108004108004108004108004108004108004108004108004108004108 -ff00ff004108004108004108004108004108ff00ffff00ffff00ff004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff0041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffff0041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108ffffff004108004108004108004108004108004108004108ffffffffffff00410800410800410800410800410800410800410800410800410800 -410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800ffff00ffff00ffff00ffff00ffff0041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108ff00ff004108004108004108004108004108004108004108004108004108004108ff00ff004108004108004108004108004108ff00 -ffff00ff004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff00410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108ffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffffffffff0041080041080041 -08ffffffffffffffffffffffffffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -ffffff004108004108004108004108004108ffffff00410800410800410800410800410800ffff00ffff00ffff00ffff00ffff00410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ff00ff004108004108 -004108004108004108004108004108004108004108004108ff00ff004108004108004108004108004108004108004108004108004108004108ffffff00000000 -0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff000000000000000000000000000000ffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108ffffff004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff004108004108004108004108004108ffff -ffffffff00410800410800410800410800410800410800ffff00ffff00ffff00ffff00ffff004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108ff00ff0041080041080041080041080041080041080041080041080041 -08004108ff00ff004108004108004108004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff00 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffffffffff00 -4108004108004108004108004108ffffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108ffffff00410800410800410800410800410800410800410800410800410800410800410800410800 -410800410800410800410800ffff00ffff00ffff00ffff00ffff0041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108ff00ff004108004108004108004108004108004108004108004108004108004108ff00ff00410800410800410800410800 -4108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108ffffff004108004108004108004108004108ffffffffffff004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ff -ffff004108004108004108004108004108004108004108004108004108004108ffffff0041080041080041080041080041080041080041080041080041080041 -08004108ffffffffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800ffff -00ffff00ffff00ffff00ffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ff00ff0041 -08004108004108004108004108004108004108004108004108004108ff00ff004108004108004108004108004108004108004108004108004108004108ffffff -000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffff000000000000000000000000000000ffffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108ffffff0041080041080041080041080041080041080041080041080041 -08004108004108ffffff004108004108004108004108004108004108004108004108004108004108004108ffffff004108004108004108004108004108004108 -004108004108004108004108ffffff004108004108004108004108004108004108ffffff00410800410800410800410800410800410800410800410800410800 -410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800ffff00ffff00ffff00ffff0041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108ff00ff004108004108004108004108004108004108004108ff -00ffff00ffff00ffff00ff004108004108004108004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000 -ffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108ffffff004108004108004108004108004108004108004108004108004108004108004108ffffff00410800410800410800 -4108004108004108004108004108004108004108004108ffffff004108004108004108004108004108004108004108004108004108004108ffffff0041080041 -08004108004108004108004108ffffffffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800ffff00ffff00ffff00ffff00ffff00410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108ff00ff004108004108004108004108ff00ffff00ffff00ffff00ff004108004108004108004108004108004108 -004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff0041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108ffffffffffff004108004108004108004108ffffff004108004108004108004108004108004108ffffff004108004108004108 -004108ffffff004108004108004108004108004108ffffff004108004108004108004108ffffff00410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -0800410800410800410800410800410800410800410800ffff00ffff00ffff00ffff00ffff004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ff -00ff004108ff00ffff00ffff00ffff00ff0041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffff000000000000000000000000000000ffffff00410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff00410800 -4108004108004108004108ffffff004108004108004108004108004108004108ffffff004108004108004108004108ffffff0041080041080041080041080041 -08ffffff004108004108004108004108ffffffffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -410800410800410800410800ffff00ffff00ffff00ffff00ffff0041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108ff00ffff00ffff00ff004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000 -00000000ffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff004108004108 -004108004108004108004108ffffff004108004108004108004108ffffff004108004108004108004108004108ffffff00410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -0800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800ffff -00ffff00ffff00ffff00ffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff00410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08ffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800ffff00ffff00ffff00ffff00ff -ff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffff000000000000000000000000000000ffffff004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff00410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800ffff00ffff00ffff00ffff00ffff00410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff000000000000000000ffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000 -0000000000000000ffffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108ffffff004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -0800410800410800410800410800410800410800410800410800ffff00ffff00ffff00ffff004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108ffffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -410800410800410800410800ffff00ffff00ffff00ffff00ffff0041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff0041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -0800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800ffff -00ffff00ffff00ffff00ffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff0000000000000000 -00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 -000000000000000000000000ffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108ffffff0041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800ffff00ffff00ffff00ffff00ff -ff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff0041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108ffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800ffff00ffff00ffff00ffff00ffff00410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff00410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff0041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -0800410800410800410800410800410800410800410800410800ffff00ffff00ffff00ffff00ffff004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff00000000 -0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff000000000000000000000000000000ffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -410800410800410800410800ffff00ffff00ffff00ffff00ffff0041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff00 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00ffff00ffff00ffff00ffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800ffff00ffff00ffff00ffff00ff -ff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff -000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffff000000000000000000000000000000ffffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800ffff00ffff00ffff00ffff00ffff00410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000 -ffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -0800410800410800410800410800410800410800410800410800ffff00ffff00ffff00ffff00ffff004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff0041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -410800410800410800410800ffff00ffff00ffff00ffff00ffff0041080041080041080041080041080041080041080041080041080041080041080041080041 -08ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffff000000000000000000000000000000ffffff00410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00ffff00ffff00ffff00ffff00ffff004108004108004108004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000 -00000000ffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800ffff00ffff00ffff00ffff00ff -ff004108004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffff000000000000000000 -000000000000ffffffffffffffffffffffff000000000000000000ffffffffffffffffff000000ffffffffffffffffff000000000000000000ffffffffffffff -ffffffffff000000000000000000ffffffffffffffffff000000000000ffffffffffffffffff000000000000000000ffffffffffffffffffffffff0000000000 -00000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff000000000000000000 -ffffffffffffffffffffffff000000000000000000000000ffffffffffff000000ffffffffffffffffffffffff000000000000000000ffffffffffffffffffff -ffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 -00000000000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000000000ffffffffffffffffff000000 -000000000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff00410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800ffff00ffff00ffff00ffff00410800410800410800410800 -4108004108ffffff000000000000000000ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff000000ffffffffffff000000ffff -ffffffffffffff000000ffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffff -ffffff000000ffffffffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffffff -ffffffffffffffff000000ffffffffffffffffff000000ffffffffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffff -ff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff -ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ff -ffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffff000000000000000000000000000000ffffff004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -0800410800410800410800410800410800410800410800410800ffff00ffff00ffff004108004108004108004108004108ffffff000000000000000000ffffff -ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffffffffffffffffffffffffffff000000ff -ffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff000000ffff -ffffffffffffffffffffffffffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff -ffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffff -ffffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff -ffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffff000000ffffffffffffffffff000000 -ffffffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000 -0000000000000000ffffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -410800410800410800ffff00ffff004108004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff000000ffffffffffff000000000000000000000000000000ffffffffffff000000ffffffffffff000000000000000000000000000000 -ffffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff000000000000000000000000000000ffffffffffff000000ff -ffffffffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff -ffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffffffffff000000000000000000ffffffffffff -ffffff000000000000000000000000000000ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff00 -0000ffffffffffffffffff000000ffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff0000 -00000000000000000000000000ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff00 -0000ffffffffffffffffff000000ffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffffffff -ffffffffffffff000000ffffffffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffffffffff -ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffff -ffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff000000ffff -ffffffffffffffffffffffffffffffff000000000000000000000000000000000000ffffffffffffffffff000000ffffffffffffffffff000000ffffffffffff -000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffffffffff000000ffffffffffff00 -0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff0041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff0000000000000000 -00ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff000000ffffffffffffffffff000000ffffffffffff -000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff00 -0000ffffffffffffffffff000000ffffffffffff000000ffffffffffff000000000000ffffffffffffffffffffffffffffffffffff000000ffffffffffffffff -ffffffffffffffffffffffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000000000 -ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff000000ff -ffffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffffff000000000000ffffffffff -ff000000ffffffffffff000000ffffffffffffffffff000000ffffffffffffffffff000000ffffffffffff000000000000ffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 -000000000000000000000000ffffff00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffff000000ff -ffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff000000ffffffffffffffffff0000000000000000 -00ffffffffffffffffffffffff000000000000000000ffffffffffff000000000000000000ffffffffffffffffff000000000000000000ffffffffffffffffff -ffffff000000000000ffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff00 -0000000000000000ffffffffffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffff000000ffffffffffff000000000000000000ffff -ffffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff000000ffffff -ffffffffffff000000000000000000ffffffffffffffffff000000ffffffffffff000000ffffff000000000000ffffffffffff000000000000000000ffffffff -ffffffffff000000000000000000ffffffffffffffffff000000ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff0041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff000000ffffff -ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff -ffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff00410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff00000000 -0000000000ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffff -ffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff000000ff -ffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -000000ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff000000000000000000000000000000ffffff004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffff -ffffff000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff00 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000ffffff004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff -000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffff000000000000000000000000000000ffffff0041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -41080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041080041 -08004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108004108 -00410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800410800 -4108004108004108004108004108004108004108004108004108004108004108004108004108004108ffffff000000000000000000ffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000 -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000005000000070101000000030000000000}}}{\cf9 - -\par }\pard\plain \s1\sb240\sa60\keepn\widctlpar\outlinelevel0\adjustright \f1\fs36\cf9\kerning28 {\page {\*\bkmkstart _Toc431273873}Drones{\*\bkmkend _Toc431273873} -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid {Drones are automated opponent aircraft. They are created by pressing the \ldblquote L\rdblquote key. -\par Drones aggressiveness setting controls how hard a drone aircraft will attempt to maneuver to attack other planes. -\par }{\cgrid0 A setting of zero means the drone will leave the stick and rudder untouched \endash it will probably impact with the ground in just a minute or less. A -setting of five will usually make for an interesting opponent. A maximum setting of ten will probably make even skilled pilots sweat a bit.}{ -\par }\pard\plain \s1\sb240\sa60\keepn\widctlpar\outlinelevel0\adjustright \f1\fs36\cf9\kerning28 {\page {\*\bkmkstart _Toc431273874}Stealth Mode{\*\bkmkend _Toc431273874} -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid {ACM\rquote s stealth mode allows users to monitor out-the-window views for any aircraft active in an exercise. -\par -\par }\pard\plain \s18\li720\sa120\widctlpar\adjustright \b\f2\fs16 {$ acm \endash stealth -\par -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid {In stealth mode, the radar display is used to display DIS entity id\rquote -s of aircraft participating in the exercise. To select and aircraft to follow, use the mouse to click on one of these identifiers. The entity id of the aircraft you are following will be highlighted in magenta.\line -\par }\pard\plain \s31\li1440\ri4320\sa120\widctlpar\brdrt\brdrsh\brdrs\brdrw10\brsp20 \brdrl\brdrsh\brdrs\brdrw10\brsp80 \brdrb\brdrsh\brdrs\brdrw10\brsp20 \brdrr\brdrsh\brdrs\brdrw10\brsp80 \adjustright \f1\fs22\cgrid {\f2 DIS Entity ID\line 50,1,1\line - 50,1,2\line * 50,6,1\line \line \line -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid { -\par If there is a large number of entities in an exercise, use the PAGE UP and PAGE DOWN keys to scroll through the list. -\par }\pard\plain \s2\sb240\sa60\keepn\widctlpar\outlinelevel1\adjustright \b\i\f1 {Transfer of Control -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid {ACM supports an experimental DIS 2.1.4++ control request protocol. It permits it to \ldblquote take over\rdblquote aircraft of similarly enabled }{\cgrid0 -applications. For ACM to take over an aircraft, it must have model}{ information in the \ldblquote inventory\rdblquote file describing the character -istics of that aircraft type. Those aircraft entities will be marked with an asterisk (*) in the left margin of the stealth browser display. Double click an aircraft entity id to take control. -\par }\pard\plain \s1\sb240\sa60\keepn\widctlpar\outlinelevel0\adjustright \f1\fs36\cf9\kerning28 {\page The Transfer Control Protocol -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid { -\par }\pard\plain \s38\qc\sa240\sl360\slmult0\keepn\widctlpar\adjustright \b\f1\cgrid {{\*\bkmkstart _Toc350663191}{\*\bkmkstart _Toc350739298}{\*\bkmkstart _Toc380399871}Transfer Control Request PDU{\*\bkmkend _Toc350663191}{\*\bkmkend _Toc350739298} -{\*\bkmkend _Toc380399871} -\par }\trowd \trqc\trgaph120\trleft-397\trkeep \clvertalt\clbrdrt\brdrs\brdrw30 \clbrdrl\brdrs\brdrw30 \clbrdrr\brdrs\brdrw30 \cltxlrtb \cellx666\clvertalt\clbrdrt\brdrs\brdrw30 \clbrdrr\brdrs\brdrw30 \cltxlrtb \cellx6886\pard\plain -\s36\qc\keepn\widctlpar\intbl\adjustright \b\f1\fs18\cgrid {Field Size -\par (bits)\cell }\pard\plain \s37\qc\sb120\keepn\widctlpar\intbl\adjustright \b\f1\fs18\cgrid {Transfer Control Request PDU fields\cell }\pard\plain \widctlpar\intbl\adjustright \f1\fs22\cgrid {\row }\trowd \trqc\trgaph120\trleft-397\trkeep \clvertalt\clbrdrt -\brdrs\brdrw30 \clbrdrl\brdrs\brdrw30 \cltxlrtb \cellx666\clvertalt\clbrdrt\brdrs\brdrw30 \clbrdrl\brdrs\brdrw15 \cltxlrtb \cellx3067\clvertalt\clbrdrt\brdrs\brdrw30 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw30 \cltxlrtb \cellx6884 -\pard\plain \s39\qc\widctlpar\intbl\adjustright \f1\fs18\cgrid {\cell }\pard\plain \s40\widctlpar\intbl\adjustright \f1\fs18\cgrid {\cell Protocol Version\emdash 8-bit enumeration\cell }\pard\plain \widctlpar\intbl\adjustright \f1\fs22\cgrid {\row -}\trowd \trqc\trgaph120\trleft-397\trkeep \clvertalt\clbrdrl\brdrs\brdrw30 \cltxlrtb \cellx666\clvertalt\clbrdrl\brdrs\brdrw15 \cltxlrtb \cellx3067\clvertalt\clbrdrl\brdrs\brdrw15 \clbrdrr\brdrs\brdrw30 \cltxlrtb \cellx6884\pard\plain -\s39\qc\widctlpar\intbl\adjustright \f1\fs18\cgrid {\cell }\pard\plain \s40\widctlpar\intbl\adjustright \f1\fs18\cgrid {\cell Exercise ID\emdash 8-bit unsigned integer\cell }\pard\plain \widctlpar\intbl\adjustright \f1\fs22\cgrid {\row }\trowd -\trqc\trgaph120\trleft-397\trkeep \clvertalt\clbrdrl\brdrs\brdrw30 \cltxlrtb \cellx666\clvertalt\clbrdrl\brdrs\brdrw15 \cltxlrtb \cellx3067\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrr\brdrs\brdrw30 \cltxlrtb \cellx6884\pard\plain -\s39\qc\widctlpar\intbl\adjustright \f1\fs18\cgrid {\cell }\pard\plain \s40\widctlpar\intbl\adjustright \f1\fs18\cgrid {\cell PDU Type \emdash 8-bit unsigned integer\cell }\pard\plain \widctlpar\intbl\adjustright \f1\fs22\cgrid {\row }\pard\plain -\s39\qc\widctlpar\intbl\adjustright \f1\fs18\cgrid {96\cell }\pard\plain \s40\widctlpar\intbl\adjustright \f1\fs18\cgrid {PDU Header\cell Protocol Family\emdash 8-bit enumeration\cell }\pard\plain \widctlpar\intbl\adjustright \f1\fs22\cgrid {\row -}\pard\plain \s39\qc\widctlpar\intbl\adjustright \f1\fs18\cgrid {\cell }\pard\plain \s40\widctlpar\intbl\adjustright \f1\fs18\cgrid {\cell Timestamp\emdash 32-bit unsigned integer\cell }\pard\plain \widctlpar\intbl\adjustright \f1\fs22\cgrid {\row -}\pard\plain \s39\qc\widctlpar\intbl\adjustright \f1\fs18\cgrid {\cell }\pard\plain \s40\widctlpar\intbl\adjustright \f1\fs18\cgrid {\cell Length\emdash 16-bit unsigned integer\cell }\pard\plain \widctlpar\intbl\adjustright \f1\fs22\cgrid {\row }\trowd -\trqc\trgaph120\trleft-397\trkeep \clvertalt\clbrdrl\brdrs\brdrw30 \clbrdrb\brdrs\brdrw15 \cltxlrtb \cellx666\clvertalt\clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \cltxlrtb \cellx3067\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb -\brdrs\brdrw15 \clbrdrr\brdrs\brdrw30 \cltxlrtb \cellx6884\pard\plain \s39\qc\widctlpar\intbl\adjustright \f1\fs18\cgrid {\cell }\pard\plain \s40\widctlpar\intbl\adjustright \f1\fs18\cgrid {\cell Padding\emdash 16-bits unused\cell }\pard\plain -\widctlpar\intbl\adjustright \f1\fs22\cgrid {\row }\trowd \trqc\trgaph120\trleft-397\trkeep \clvertalt\clbrdrl\brdrs\brdrw30 \cltxlrtb \cellx666\clvertalt\clbrdrl\brdrs\brdrw15 \cltxlrtb \cellx3067\clvertalt\clbrdrl\brdrs\brdrw15 \clbrdrr\brdrs\brdrw30 -\cltxlrtb \cellx6884\pard\plain \s39\qc\widctlpar\intbl\adjustright \f1\fs18\cgrid {\cell }\pard\plain \s40\widctlpar\intbl\adjustright \f1\fs18\cgrid {\cell Site\emdash 16-bit unsigned integer\cell }\pard\plain \widctlpar\intbl\adjustright -\f1\fs22\cgrid {\row }\trowd \trqc\trgaph120\trleft-397\trkeep \clvertalt\clbrdrl\brdrs\brdrw30 \cltxlrtb \cellx666\clvertalt\clbrdrl\brdrs\brdrw15 \cltxlrtb \cellx3067\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrr\brdrs\brdrw30 -\cltxlrtb \cellx6884\pard\plain \s39\qc\widctlpar\intbl\adjustright \f1\fs18\cgrid {48\cell }\pard\plain \s40\widctlpar\intbl\adjustright \f1\fs18\cgrid {Originating Entity ID\cell Application\emdash 16-bit unsigned integer\cell }\pard\plain -\widctlpar\intbl\adjustright \f1\fs22\cgrid {\row }\trowd \trqc\trgaph120\trleft-397\trkeep \clvertalt\clbrdrl\brdrs\brdrw30 \clbrdrb\brdrs\brdrw15 \cltxlrtb \cellx666\clvertalt\clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \cltxlrtb \cellx3067\clvertalt -\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw30 \cltxlrtb \cellx6884\pard\plain \s39\qc\widctlpar\intbl\adjustright \f1\fs18\cgrid {\cell }\pard\plain \s40\widctlpar\intbl\adjustright \f1\fs18\cgrid {\cell -Entity\emdash 16-bit unsigned integer\cell }\pard\plain \widctlpar\intbl\adjustright \f1\fs22\cgrid {\row }\trowd \trqc\trgaph120\trleft-397\trkeep \clvertalt\clbrdrl\brdrs\brdrw30 \cltxlrtb \cellx666\clvertalt\clbrdrl\brdrs\brdrw15 \cltxlrtb \cellx3067 -\clvertalt\clbrdrl\brdrs\brdrw15 \clbrdrr\brdrs\brdrw30 \cltxlrtb \cellx6884\pard\plain \s39\qc\widctlpar\intbl\adjustright \f1\fs18\cgrid {\cell }\pard\plain \s40\widctlpar\intbl\adjustright \f1\fs18\cgrid {\cell Site\emdash 16-bit unsigned integer\cell -}\pard\plain \widctlpar\intbl\adjustright \f1\fs22\cgrid {\row }\trowd \trqc\trgaph120\trleft-397\trkeep \clvertalt\clbrdrl\brdrs\brdrw30 \cltxlrtb \cellx666\clvertalt\clbrdrl\brdrs\brdrw15 \cltxlrtb \cellx3067\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl -\brdrs\brdrw15 \clbrdrr\brdrs\brdrw30 \cltxlrtb \cellx6884\pard\plain \s39\qc\widctlpar\intbl\adjustright \f1\fs18\cgrid {48\cell }\pard\plain \s40\widctlpar\intbl\adjustright \f1\fs18\cgrid {Receiving Entity ID\cell Application\emdash -16-bit unsigned integer\cell }\pard\plain \widctlpar\intbl\adjustright \f1\fs22\cgrid {\row }\pard\plain \s39\qc\widctlpar\intbl\adjustright \f1\fs18\cgrid {\cell }\pard\plain \s40\widctlpar\intbl\adjustright \f1\fs18\cgrid {\cell Entity\emdash -16-bit unsigned integer\cell }\pard\plain \widctlpar\intbl\adjustright \f1\fs22\cgrid {\row }\trowd \trqc\trgaph120\trleft-397\trkeep \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw30 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx666 -\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3067\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw30 \cltxlrtb \cellx6884 -\pard\plain \s39\qc\widctlpar\intbl\adjustright \f1\fs18\cgrid {32\cell }\pard\plain \s40\widctlpar\intbl\adjustright \f1\fs18\cgrid {Request ID\cell 32-bit unsigned integer\cell }\pard\plain \widctlpar\intbl\adjustright \f1\fs22\cgrid {\row }\pard\plain -\s39\qc\widctlpar\intbl\adjustright \f1\fs18\cgrid {8\cell }\pard\plain \s40\widctlpar\intbl\adjustright \f1\fs18\cgrid {Required Reliability Service\cell 8-bit enumeration\cell }\pard\plain \widctlpar\intbl\adjustright \f1\fs22\cgrid {\row }\pard\plain -\s39\qc\widctlpar\intbl\adjustright \f1\fs18\cgrid {8\cell }\pard\plain \s40\widctlpar\intbl\adjustright \f1\fs18\cgrid {Transfer Type\cell 8-bit enumeration\cell }\pard\plain \widctlpar\intbl\adjustright \f1\fs22\cgrid {\row }\trowd -\trqc\trgaph120\trleft-397\trkeep \clvertalt\clbrdrl\brdrs\brdrw30 \cltxlrtb \cellx666\clvertalt\clbrdrl\brdrs\brdrw15 \cltxlrtb \cellx3067\clvertalt\clbrdrl\brdrs\brdrw15 \clbrdrr\brdrs\brdrw30 \cltxlrtb \cellx6884\pard\plain -\s39\qc\widctlpar\intbl\adjustright \f1\fs18\cgrid {\cell }\pard\plain \s40\widctlpar\intbl\adjustright \f1\fs18\cgrid {\cell Site\emdash 16-bit unsigned integer\cell }\pard\plain \widctlpar\intbl\adjustright \f1\fs22\cgrid {\row }\trowd -\trqc\trgaph120\trleft-397\trkeep \clvertalt\clbrdrl\brdrs\brdrw30 \cltxlrtb \cellx666\clvertalt\clbrdrl\brdrs\brdrw15 \cltxlrtb \cellx3067\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrr\brdrs\brdrw30 \cltxlrtb \cellx6884\pard\plain -\s39\qc\widctlpar\intbl\adjustright \f1\fs18\cgrid {48\cell }\pard\plain \s40\widctlpar\intbl\adjustright \f1\fs18\cgrid {Entity ID to be Transferred\cell Application\emdash 16-bit unsigned integer\cell }\pard\plain \widctlpar\intbl\adjustright -\f1\fs22\cgrid {\row }\pard\plain \s39\qc\widctlpar\intbl\adjustright \f1\fs18\cgrid {\cell }\pard\plain \s40\widctlpar\intbl\adjustright \f1\fs18\cgrid {\cell Entity\emdash 16-bit unsigned integer\cell }\pard\plain \widctlpar\intbl\adjustright -\f1\fs22\cgrid {\row }\trowd \trqc\trgaph120\trleft-397\trkeep \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw30 \cltxlrtb \cellx666\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \cltxlrtb \cellx3067\clvertalt\clbrdrt -\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw30 \cltxlrtb \cellx6884\pard\plain \s39\qc\widctlpar\intbl\adjustright \f1\fs18\cgrid {32\cell }\pard\plain \s40\widctlpar\intbl\adjustright \f1\fs18\cgrid { -Number of Record Sets (R)\cell 32-bit unsigned integer\cell }\pard\plain \widctlpar\intbl\adjustright \f1\fs22\cgrid {\row }\trowd \trqc\trgaph120\trleft-397\trkeep \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw30 \cltxlrtb \cellx666\clvertalt -\clbrdrl\brdrs\brdrw15 \cltxlrtb \cellx3067\clvertalt\clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw30 \cltxlrtb \cellx6884\pard\plain \s39\qc\widctlpar\intbl\adjustright \f1\fs18\cgrid {\cell }\pard\plain -\s40\widctlpar\intbl\adjustright \f1\fs18\cgrid {\cell Datum ID\emdash 32-bit enumeration\cell }\pard\plain \widctlpar\intbl\adjustright \f1\fs22\cgrid {\row }\trowd \trqc\trgaph120\trleft-397\trkeep \clvertalt\clbrdrl\brdrs\brdrw30 \cltxlrtb \cellx666 -\clvertalt\clbrdrl\brdrs\brdrw15 \cltxlrtb \cellx3067\clvertalt\clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw30 \clbrdrr\brdrs\brdrw30 \cltxlrtb \cellx6884\pard\plain \s39\qc\widctlpar\intbl\adjustright \f1\fs18\cgrid {\cell }\pard\plain -\s40\widctlpar\intbl\adjustright \f1\fs18\cgrid {\cell Record Set Serial Number\emdash 32-bit unsigned integer\cell }\pard\plain \widctlpar\intbl\adjustright \f1\fs22\cgrid {\row }\trowd \trqc\trgaph120\trleft-397\trkeep \clvertalt\clbrdrl\brdrs\brdrw30 -\cltxlrtb \cellx666\clvertalt\clbrdrl\brdrs\brdrw15 \cltxlrtb \cellx3067\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw30 \clbrdrr\brdrs\brdrw30 \cltxlrtb \cellx6884\pard\plain \s39\qc\widctlpar\intbl\adjustright -\f1\fs18\cgrid {96 + (L}{\sub 1 }{x Q}{\sub 1}{) + P}{\sub 1}{\cell }\pard\plain \s40\widctlpar\intbl\adjustright \f1\fs18\cgrid { Record Set #1\cell Record Length\emdash 16-bit unsigned integer (L}{\sub 1}{)\cell }\pard\plain -\widctlpar\intbl\adjustright \f1\fs22\cgrid {\row }\pard\plain \s39\qc\widctlpar\intbl\adjustright \f1\fs18\cgrid {\cell }\pard\plain \s40\widctlpar\intbl\adjustright \f1\fs18\cgrid {\cell Record Count\emdash 16-bit unsigned integer (Q}{\sub 1}{)\cell -}\pard\plain \widctlpar\intbl\adjustright \f1\fs22\cgrid {\row }\trowd \trqc\trgaph120\trleft-397\trkeep \clvertalt\clbrdrl\brdrs\brdrw30 \cltxlrtb \cellx666\clvertalt\clbrdrl\brdrs\brdrw15 \cltxlrtb \cellx3067\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl -\brdrs\brdrw15 \clbrdrr\brdrs\brdrw30 \cltxlrtb \cellx6884\pard\plain \s39\qc\widctlpar\intbl\adjustright \f1\fs18\cgrid {\cell }\pard\plain \s40\widctlpar\intbl\adjustright \f1\fs18\cgrid {\cell Record Values\emdash (L}{\sub 1}{ x Q}{\sub 1}{) bits\cell -}\pard\plain \widctlpar\intbl\adjustright \f1\fs22\cgrid {\row }\trowd \trqc\trgaph120\trleft-397\trkeep \clvertalt\clbrdrl\brdrs\brdrw30 \clbrdrb\brdrs\brdrw30 \cltxlrtb \cellx666\clvertalt\clbrdrl\brdrs\brdrw15 \cltxlrtb \cellx3067\clvertalt\clbrdrt -\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrr\brdrs\brdrw30 \cltxlrtb \cellx6884\pard\plain \s39\qc\widctlpar\intbl\adjustright \f1\fs18\cgrid {\cell }\pard\plain \s40\widctlpar\intbl\adjustright \f1\fs18\cgrid {\cell Padding\emdash P}{\sub 1}{ bits -\cell }\pard\plain \widctlpar\intbl\adjustright \f1\fs22\cgrid {\row }\trowd \trqc\trgaph120\trleft-397\trkeep \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw30 \clbrdrb\brdrs\brdrw30 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx6884\pard\plain -\s41\qc\sb60\sl-120\slmult1\widctlpar\intbl\adjustright \f1\fs18\cgrid {{\field{\*\fldinst SYMBOL 183 \\f "Symbol" \\s 9}{\fldrslt\f3\fs18}}}{ -\par }\pard \s41\qc\sl-120\slmult1\widctlpar\intbl\adjustright {{\field{\*\fldinst SYMBOL 183 \\f "Symbol" \\s 9}{\fldrslt\f3\fs18}}}{ -\par }\pard\plain \s40\qc\widctlpar\intbl\adjustright \f1\fs18\cgrid {{\field{\*\fldinst SYMBOL 183 \\f "Symbol" \\s 9}{\fldrslt\f3\fs18}}}{\cell }\pard\plain \widctlpar\intbl\adjustright \f1\fs22\cgrid {\row }\trowd \trqc\trgaph120\trleft-397\trkeep -\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw30 \cltxlrtb \cellx666\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \cltxlrtb \cellx3067\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw30 \clbrdrr\brdrs\brdrw30 -\cltxlrtb \cellx6884\pard\plain \s39\qc\widctlpar\intbl\adjustright \f1\fs18\cgrid {\cell }\pard\plain \s40\widctlpar\intbl\adjustright \f1\fs18\cgrid {\cell Datum ID\emdash 32-bit enumeration\cell }\pard\plain \widctlpar\intbl\adjustright \f1\fs22\cgrid -{\row }\trowd \trqc\trgaph120\trleft-397\trkeep \clvertalt\clbrdrl\brdrs\brdrw30 \cltxlrtb \cellx666\clvertalt\clbrdrl\brdrs\brdrw15 \cltxlrtb \cellx3067\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw30 \clbrdrr\brdrs\brdrw30 -\cltxlrtb \cellx6884\pard\plain \s39\qc\widctlpar\intbl\adjustright \f1\fs18\cgrid {\cell }\pard\plain \s40\widctlpar\intbl\adjustright \f1\fs18\cgrid {\cell Record Set Serial Number\emdash 32-bit unsigned integer\cell }\pard\plain -\widctlpar\intbl\adjustright \f1\fs22\cgrid {\row }\pard\plain \s39\qc\widctlpar\intbl\adjustright \f1\fs18\cgrid {96 + (L}{\sub R}{ x Q}{\sub R)}{ + P}{\sub R}{\cell }\pard\plain \s40\widctlpar\intbl\adjustright \f1\fs18\cgrid { Record Set #R\cell -Record Length\emdash 16-bit unsigned integer (L}{\sub R}{)\cell }\pard\plain \widctlpar\intbl\adjustright \f1\fs22\cgrid {\row }\pard\plain \s39\qc\widctlpar\intbl\adjustright \f1\fs18\cgrid {\cell }\pard\plain \s40\widctlpar\intbl\adjustright -\f1\fs18\cgrid {\cell Record Count\emdash 16-bit unsigned integer (Q}{\sub R}{)\cell }\pard\plain \widctlpar\intbl\adjustright \f1\fs22\cgrid {\row }\pard\plain \s39\qc\widctlpar\intbl\adjustright \f1\fs18\cgrid {\cell }\pard\plain -\s40\widctlpar\intbl\adjustright \f1\fs18\cgrid {\cell Record Values\emdash (L}{\sub R}{ x Q}{\sub R}{) bits\cell }\pard\plain \widctlpar\intbl\adjustright \f1\fs22\cgrid {\row }\trowd \trqc\trgaph120\trleft-397\trkeep \clvertalt\clbrdrl\brdrs\brdrw30 -\cltxlrtb \cellx666\clvertalt\clbrdrl\brdrs\brdrw15 \cltxlrtb \cellx3067\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrr\brdrs\brdrw30 \cltxlrtb \cellx6884\pard\plain \s39\qc\widctlpar\intbl\adjustright \f1\fs18\cgrid {\cell }\pard\plain -\s40\widctlpar\intbl\adjustright \f1\fs18\cgrid {\cell Padding\emdash P}{\sub R}{ bits\cell }\pard\plain \widctlpar\intbl\adjustright \f1\fs22\cgrid {\row }\trowd \trqc\trgaph120\trleft-398\trkeep \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw30 -\clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx6884\pard\plain \s40\widctlpar\intbl\adjustright \f1\fs18\cgrid { R -\par Total Transfer Control Request PDU size = 320 + }{\fs24 {\field{\*\fldinst SYMBOL 229 \\f "Symbol" \\s 12}{\fldrslt\f3\fs24}}}{(96 + (L}{\sub i }{x Q}{\sub i}{) + P}{\sub i}{) bits -\par i = 1 -\par -\par where -\par -\par R is the number of Record Sets\cell }\pard\plain \widctlpar\intbl\adjustright \f1\fs22\cgrid {\row }\pard \sa120\widctlpar\adjustright { -\par ACM currently ignores record sets in a transfer control PDU. -\par -\par -\par -\par -\par }{\b Transfer Type}{ -\par This section specifies the 8-bit enumeration for the Transfer Type field of the Transfer Control PDU. -\par -\par }\trowd \trgaph108\trleft-108\trbrdrt\brdrs\brdrw30 \trbrdrl\brdrs\brdrw30 \trbrdrb\brdrs\brdrw30 \trbrdrr\brdrs\brdrw30 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw30 \clbrdrl\brdrs\brdrw30 \clbrdrb\brdrs\brdrw15 \clbrdrr -\brdrs\brdrw15 \cltxlrtb \cellx2340\clvertalt\clbrdrt\brdrs\brdrw30 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw30 \cltxlrtb \cellx8748\pard \qc\sa120\widctlpar\intbl\adjustright {\ul Field Value}{\cell }{\ul Nature}{\cell }\pard -\widctlpar\intbl\adjustright {\row }\trowd \trgaph108\trleft-108\trbrdrt\brdrs\brdrw30 \trbrdrl\brdrs\brdrw30 \trbrdrb\brdrs\brdrw30 \trbrdrr\brdrs\brdrw30 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl -\brdrs\brdrw30 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx2340\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw30 \cltxlrtb \cellx8748\pard \qc\sa120\widctlpar\intbl\adjustright {0\cell -}\pard \sa120\widctlpar\intbl\adjustright {Other\cell }\pard \widctlpar\intbl\adjustright {\row }\pard \qc\sa120\widctlpar\intbl\adjustright {1\cell }\pard \sa120\widctlpar\intbl\adjustright {Controlling application requests transfer of an entity\cell -}\pard \widctlpar\intbl\adjustright {\row }\pard \qc\sa120\widctlpar\intbl\adjustright {2\cell }\pard \sa120\widctlpar\intbl\adjustright {Application desiring control requests transfer of an entity\cell }\pard \widctlpar\intbl\adjustright {\row }\pard -\qc\sa120\widctlpar\intbl\adjustright {3\cell }\pard \sa120\widctlpar\intbl\adjustright {Mutual exchange / swap of an entity\cell }\pard \widctlpar\intbl\adjustright {\row }\pard \qc\sa120\widctlpar\intbl\adjustright {4\cell }\pard -\sa120\widctlpar\intbl\adjustright {Controlling application requests transfer of an environmental process\cell }\pard \widctlpar\intbl\adjustright {\row }\pard \qc\sa120\widctlpar\intbl\adjustright {5\cell }\pard \sa120\widctlpar\intbl\adjustright { -Application desiring controls request transfer of an environmental process\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trgaph108\trleft-108\trbrdrt\brdrs\brdrw30 \trbrdrl\brdrs\brdrw30 \trbrdrb\brdrs\brdrw30 \trbrdrr\brdrs\brdrw30 \trbrdrh -\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw30 \clbrdrb\brdrs\brdrw30 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx2340\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw30 \clbrdrr -\brdrs\brdrw30 \cltxlrtb \cellx8748\pard \qc\sa120\widctlpar\intbl\adjustright {6\cell }\pard \sa120\widctlpar\intbl\adjustright {Mutual exchange of an environmental\cell }\pard \widctlpar\intbl\adjustright {\row }\pard \sa120\widctlpar\adjustright { - -\par -\par -\par }\pard\plain \s2\sb240\sa60\keepn\widctlpar\outlinelevel1\adjustright \b\i\f1 {Assuming Ownership -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid {\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid {\object\objemb\objw7201\objh5746{\*\objclass Visio.Drawing.5}{\*\objdata 010500000200000010000000566973696f2e44726177696e672e350000000000 -0000000000340000 -d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff0900060000000000000000000000010000000100000000000000001000000200000001000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffdffffff04000000feffffff17000000feffffff060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f00000010000000110000001200000013000000140000001500000016000000feffffff18000000feffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffff02000000121a020000000000c000000000000046000000000000000000000000a0e3 -4a3b3434be0103000000400400000000000001004f006c00650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000201ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000 -0000000000000000000000001400000000000000010043006f006d0070004f0062006a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000120002010100000004000000ffffffff0000000000000000000000000000000000000000000000000000 -0000000000000000000001000000690000000000000003004f0062006a0049006e0066006f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012000201ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 -000000000000000000000000030000000400000000000000feffffff02000000fefffffffefffffffeffffff06000000070000000800000009000000feffffff0b0000000c0000000d0000000e0000000f00000010000000feffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff010000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100feff030a0000ffffffff121a020000000000c0000000000000461000 -0000564953494f20352044726177696e670011000000564953494f20352e30205368617065730010000000566973696f2e44726177696e672e3500f439b271000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000feff0000040002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000feff000004000200000000000000000000000000000000000100 -0000e0859ff2f94f6810ab9108002b27b3d930000000d40000000700000004000000400000000600000050000000050000005c0000000300000068000000070000007400000002000000c000000001000000cc0000001e0000000600000072696c65790000001e00000001000000000000001e0000000100000000000000 -1e00000001000000000000001e00000041000000463a5c50726f6772616d2046696c65735c56697356006900730069006f0044006f00630075006d0065006e00740000000000000000000000000000000000000000000000000000000000000000000000000000001c0002000300000006000000ffffffff000000000000 -00000000000000000000000000000000000000000000000000000000000005000000f72200000000000056006900730069006f0049006e0066006f0072006d006100740069006f006e00000000000000000000000000000000000000000000000000000000000000000022000200ffffffffffffffffffffffff00000000 -0000000000000000000000000000000000000000000000000000000000000000040000001c000000000000000500530075006d006d0061007200790049006e0066006f0072006d006100740069006f006e000000000000000000000000000000000000000000000000000000280002010500000007000000ffffffff0000 -00000000000000000000000000000000000000000000000000000000000000000000050000000401000000000000050044006f00630075006d0065006e007400530075006d006d0061007200790049006e0066006f0072006d006100740069006f006e000000000000000000000038000200ffffffffffffffffffffffff -0000000000000000000000000000000000000000000000000000000000000000000000000a000000a201000000000000566973696f2028544d292044726177696e670d0a0000000000000500f722000000840100140052005cf57d3bab2100004c01000000000000ed64eaf10318e9f2ffffff8300fff6f2fff3fbf00701 -f8f1008980eaf116048016002000190080ff00c0c0c000e6e6e6ff00cdcdcd00b3b3b3ef009a9a9a2100800066ff6666004d4d4d00337f3333001a1a1a0000000000000004000000000000000400ff1800ffff00d6d6007130dcff080fe1fad60019ebf0df015400000aebf064007f0020417269616c2900f5012d021433 -031254696dff6573204e65772052af6f6d616e2900022d06e4570000223a05032d020e33027f025257696e676487000373003554ebf046e8f3d03ff2ff0406daeaf120e8f359401a06000019012d00310f0000ff1a00ffff00d62b00b914dcffebf02b004aebf0012f54040020e9f2ff1c0ae0fbf7040068ebf002540000 -ebcc02e8f3014a00000800bf0200620100fe4f0001f25304025301ebf0307b14aeff47e17a843f0001401ce6f5430101000e50006a065603c9005d0784000375065601046255025502059604069604079601a08001d2034f0a97084f0003960404045304bb023fe6f50a1f1c16d2018401541c16a10101361a02361a0336 -1708fa0dfaff8001004e0397039507970350f5079703bb0f9703089604099604550a96040b96040c96040d9604550e96040f9604109604119604a512960413761f8e1007500061ab00fe432001472302472303aa472304472305472306472307f04720d21fe4137f1e2600fdff48a623821b4f01609714c02402c024bd03 -c0213e02fdffba27a7ff009602a3005e0284ff004d02a400ec01a0ff0034018700c40086ff008a0085002100933e37000900a4026981003e017d78dffc10270030552e3203c53f8e1084011603ac049d1faf181684000521e8f3f09002c30284007d072d36fe0067009437009f01006d006a50003e01a4d8e5f61c1fb136 -3033c432f3bf4130bb362616301f421fa8050fa3002d21c4343f13a10104cc366632e81e47c0025400958f329c006bcb00033d021cb02dcc02090025888f32110d00d200543b351c055503474003dffc023906dcd736084c0f5e0f700100750c4f358c13d604005232b13f075f8005e53ff73f5a1fb41bd7870058013046 -0536040009c895301433509f3f945fc33fb85654d703c302003e43470d000211000901754f874e0139063a01a64fb84f50ca4fdc4fee4d7259036f504a4740c8e25f7c1f066990136f256f0019df00321cc771db60ac3f40da6fec662e15ec663352067a02067a750306778707340200840d00049030e35401eb5f9d6f3f -007506d606c044352c659025d4086b623c753400d7c9000511000003300000a9228100407106474007370008aabf7009d1700a42200bbe600caa0d300de1700ee5700fe97010aaed7011830012f57013f97014aa6b4015018016058017f5f018aa0d801911801a15801b19801caad7601dedf01e25801f4d4020aa2d8021 -3180223580231500242a073025c970260d0006497f5b7f206d7f7f7f917ed20db2794a4220588f406a8f7c8f8e8f927d9031d60604be8d0108cf8fe18ff38f059f917ee050d50704b500c08b09479f599f6b9f7d9f917e148060d50703be8d0abf9fd19fe39f50f59f917ece80d50707be8d0b37af4049af5baf6daf917e -c070d50705be8d010cafafc1afd3afe5af917e5680d5070506be8d0d27bf39bf4bbf5dbf917e050ed3090ebe8df8b0a1bfb3bfc5bf14d7bf937c0fd3090fbe8d70c019cf842bcf07685c8717d80f97786a0601d07407ee432768fd020405360200054e0d00108fcfa1cf3bcf4dcf917e0511d30911be8d7cd025df37dfb5 -cf28c7cfd9cf6d0402f3cf02b4040ddf020d00129bdfaddf47df59df917e36a00ad5070abe8d132fef41ef53ef65ef28917e9eb0d5070dbe8d14a7efb9efa0cbefddef917ebe90d50709be8d15801fff31ff43ff55ff917e26b0d5070c02be8d1697ffa9ffbbffcdff917e46900ad50708be8d170f0f210f330f450f2891 -7eaea0a5770bbe8d18870f990fa0ab0fbd0f917ea6e0a57713be8d1980ff0f111f231f351f917e96f0a5771502be8d1a771f891f9b1fad1f917e86000aa57717be8d1bef1f012f056fd1dffee3df4f1be8b4814e6b033f00f2cd3931c026463919e214d7055c63201c672f792f8b2f9d2faf2f403b66ca2fdc203b65e72f -f92a1d073ff0193f2b3f3d3f4f3fb81e85eb0751b89e683fda220145873ff92a011ea73fb93fcb3fdd3fef3fc12fd32f44e52ff72c1f474f594f6b4a70794f148b4f9d4a03ffdf0224a1ba4fcc4faa407164632020e74003e5520314f14f035803a9666005572b2c5235c03463ec6ff15fa67419e23a775400c9695750ae -613c05564e6100005f1027003272f252c1fd60420171073f66c661ab9279d0942792a731006ac060ae615005563fec766f2e6530339a62f3bf30549166c25b06d36295279247632001218f5fa15fb35fc55fd75ff25f2e7e12565404ae7118696a2564746f717f48986faa67575306f932c065696d64402c6f3e6aa8954b -6b307064654a418000cc6fde6ff06f027f147f2f7f387f4a7f00206fca7fdc7fee7f686f777f807f927f04b06fc26523078f198f2b8f3d8f4f8f006a8ffb5f0d6f978a202607e23a6f26504cec4179d0f03fca8c636437e38f20fe8f079f199f2b9fc56224439f559f00679f799f8b9fa69f738f858fd39fe59f00f79f09 -af1baf2daf76bf51af63afbd6a012583af95afa7afb9afcbafe6afefaf0001bf5b7f7abf83bf95bfa37fb57c20bf3832bf44bf56bb4a0026c3bfd5bf42e7ba2cf5bf07cf79d05c210181500818bfae8726c3bc476680d56152dfc40300405abf60cfc1df84cfa2bfbc69fd32ebf0080011001c00ff010077696e73706fff -6f6c005c5c524947ff454c5c4850004e650730313adcfeff4600ffff00d602008520ebf002eff0fcf3dcfff8f1687eebf001540000e001e8f36d41e8f310402a0dc03f3c05dbbf49e8f3f03f4e0604005108f6f1660f780f0023020ef9f02a2a06fe910001950a023c069e01fd034506fe0800020662bb0400c801076200 -cf02087b6208cf02096220009e01e9044e069e0105ed070a00035b0506ebf0090005100409138f00101040e6f51c1f2e1604c1042a0428062c1f8a02c90000620510cf02016d11ad015416ba027d1a85047d1a057d17c90ace009100085442169e0109c51a0a7d1a0b7d17ff00b700f3009200044ef9f0d301658b001e01 -14e7f457060048e9f283ff10010e1075fce9f220f3f00000eee9f2ffff00010090888fffef82f88e77080b827701ff78888808877777f8fff877778088000888fd872301700787ff08f7fb008823010789ff07f7fd0823010f8aff060887fff8f8707f8aff05f0c24d018b530f650f770f890fff06ac8d02510006704405 -073a0408b9f7b702320109f700220370f78800830b0c8e8801f80f8fff01f8fd41ebf052656374616eff676c6520776974687f20766172696162f9f0ff636f726e65722072ff6f756e64696e672efb0066090473206f6e200d72f3f52e00006d62e3f8e8bfe8f3e03ff4f4fe0304e0bf36d069039def36e8bf381502e03f -3c6a15033f1403e0fbf404c0340b0df8fbf4f8bfff4800ffff00d605005522ebf006ebf0fffef21ef9f05d26e1fa01000515006813015f540000f001e8f341e7f4ad402c0df83f2c04f04605e8ee4605e03f510b0a000e0055022b07fe710001750a023e06fa7e01034706fe340003036efaf109010615000105faf1a907 -b202bd0102bc0203bc020428bc02f8f1a90002b30204b902f9f000c100f9f0c700f9f0cd00f9f0d300f9f2fd060413021200020475b70260205a0505fe111005d3750317197100066206fe08af00020762401308471409704711630b5f1843100a6201591abc1500431002804c405a10fd4ffffdfffe97100a0b418000ff -6039436f70797269ff67687420a9203139ff393720566973696fff20436f72706f7261ff74696f6e2e202041f76c6c20b41273207265ff7365727665642e00fbfe177200600f536861ff70652e686c702123ef393031355911a3006aff0184005401a00033fb019bd2000400da016caab401554300020f06077200619c59 -112c04f63f400e071110007f7202000a00c072f8f18fc004fe1a80004710271062f7020006522481020a402ffe1c0003c4020ad0027c2115087b22097b2010cc007e22f9f0f48c202b05f83c25c03f4002ffd4d4b2b5bea23f01ab0016912201972203972206c44e205a20001510151064270381b702094022110172c320 -014e512403fe158e00522320b32301d22010bd20e0008020e000cf20e000428620029020b200cf20b200077b20142a064506ecba200b4926ec2380210451262907f64607b2282a33c920b20071057b205032c321c0fe0f8000ac2710f12304fe5030024c210205c03127c046074624cf21f6265030865e34fe0a91228620 -2a072b05ec20813cf9f09930f9f0363000a830d621024c2304a7367a21b43f2d05aa254e3400dd32e9334442c1393d26b22850322341c07544f2224a4f382d9d38ac480000ff8b009e028c005e02b78b0032f340db01f04001d78c0049ff401603507c00758a7000899522ca0271720042200124250b5706d435151b0ca9 -3382781005c14757064425445f612100045b592a06e0ba205250d6218d52ed2100271b3a3fa4595a51b45f5e5fa451745ffee85f9900d20099009eaa37606a37603637600417000c030164cc0020016515a927e6f518141c6c6f7e68010024a95465206127670900c04710e82181037120012ebe28f2217822f202c664e0 -009336e300690033a960ac5409a256ff00a01e00600b636fff6e74726f6c732e78fd31ab55807e40a338003993ea6716000da225fa6fe054fe13710700936100909075fe3960041500f700705171a22100c45a4d004d7878022500fd49ff250043100464204211057811e24310064711d321c436745160168e507452bc70 -06855a8d084010d09b084010902307171e4c106016bf41646a757374c6116eff657220526f756e64d7696e675912aa5172b9007da8ebf025002d0002e9f2ffa02e9f001200ffffeae2f901f5f001dcff000700ff4600c6008c2d7d3b5f45080000f4ebf0232900ff04407d3b39090000f58eebf00a3b012b7d3bc7ba4300 -3f470244006c4f0006e90a0e01670f2b2900d42e7dab3b07630033ebf0482b003cef3f7d3b3a63000f04000100010023000000d52ce9f201ebf003e8f31440bbabaa0200ea0f40ebf023eee9f20b001c110018000207001e00fd1ce1fa010040004200ffbc267d3bc70e00000126dcf03128dcff000fe9f22400fd1ce1fa -010045004200ff84277d3b040f0000010adcf0f97adcffe1fa010005001eff005300dc2c7d3b49ef0e000078ebf0c90044bf006c267d3bc11b0006beebf03f0052002c2700edaa1b0017ebf04433004c27000e010f3c03510f630500000000000000000000000000000000000004000000000000000400bdd8ebf0fc04a9 -03defd02ef001d0008ebf03c0184bf00cf01640202ebf00170dcff2c0f3e0febf0cbff04420ffc680fe9f2463a5c50726fff6772616d2046696cff65735c566973696fff5c536f6c7574696fff6e735c426c6f636bef2044696186015c4261ff7369632053686170bf65732e767373ebf02a1b00141900ce00ff1500ffff -00d71400f144ebf0f0f0fcff00f0bf74ffd145175df403408b7f2ebae8a20b0040feffeee6f5140046ebf00154038b0020ebf002eff04c032a0f00af000300684701540e00027ae8f34936044049abaa85006fea0f4041e8f3c03f8c05edbf7a04f03f9e06030008584601b60fc80f0001eaf10e49004a7a06fee1000183 -06ee01028c06faee01039506fe080002067762030018110762001f12f70862081f1209622000d2ee01049e06ee01053d17220077030505ebf009000a5a12950d5a12105a12125a125510041c591f6b1900101021069c1f21061b04048c040000c216ae1fdc002e19100062101f1201ed11fd012821060a12fd1a04fd1a05 -fd17191291041f143620e10008c216ee01098a452a0afd1a0bfd17d31f2005f0893f8c2d812850d10be101fd1a01e0fd1afc1544130a2544100a0003be730001000104123a1075ab0260b30605f62103fb22054e01300575030739e10006b026b4201b2613092511009bf820b7bf0023019200046700df530265db006e01 -74d50648e9f291027732f7207732045f30803307cb0047ebf022e81098311a00e50b973232e00098314a0013ae9732420083bb323abd3032aabd302abd3022bd301abd3012eabd300abd30047e104a00c9a449006e011aca0fe3f848fc2154210276104801f8f14c01036700163082d10a02db006a06dc028a298403fda6 -524509409e278403f99d2750ff182d4454fb21f9bffad90321fe00750c60750aff6004e46202000775ef0d60750b9844038011c4ed020a28161a109f44934480124740fe11490096409340039a410506d34101a2409f40de44f721fd2006fe2ee03f1133fa421c3c0e513d3ffe4f33303096fc62c92f27a63f00d0277301 -01e0024656e5fe4a4d0b64459326d03f01130016f745f94306fa429351a552289c5e15539d5901945001c45fbf28e24413017756da2f0a25d03ffe7f00009d002801854000dd9b5f32de016c67315500eb0094d505019530020061bb01fe49600161004f61020454609e2f017010d640063acd2b5c4fd2706df00f50cd2b -8baf208a00171c00895f3284773036404300a0144bfa41264dac516a0504434a80565145aa0d6445ee9425d494252dde9425c43fb02580b92d1a7028f9582370f819eee72ad4f523364120fe4f113395721b5f2e3a802d5f4e35fcd00b191002804c40fe046ad360df5530044900f600366501504344db0049625562536f -656f063a02013001213b267d4c8fb461628f267f00868f988db4613c8dbc8f5e8fe08f828ffc049f0d338b00fc008b00d5c457908c579054c9660600f934eb52ea3d4f74686572ff204170706c6963610f74696f6e7730ac50114f234fdc354f8026780f4053479663c7069baf624ae793754929b10f650bdc2b874f994f -ab4fbd4f00cf4fe14f6ca09b7fb77fd77f4f33f72112ac52041331ac5205465f585f6a570980db967e5570db908a575978fa0380fd5f0db3156caa51ac53ac52bfa3060094515abfd651ac5285b365b7c9a38bba00246f366f486f388f2a9f7e6fe6b0e79e08be8fb66fc86d04d96feb6ffd6f7e2801c0db95237f357f47 -7fbf27a4c0667f00787f8a7480af92afc97fa8afbaa362c010c3a469d27b11f27f402360088f1a8f002c8feabffcbf429f748f2ecfeadffcdf00f48f20ef189f44efe6df68ef0aef8cefe84c9f5e9f709518e3f841434d2a899c054100079d920995307b11a9064b04d00b07c198c87c2bf6aa9425c89425f89425d89425 -e8ea64f751d10b144900740260710745020b54a1f0017403a7fe9103b9f93ec1a1f002a5f312027471e1a1afee7bfa738400a995d485ba9dd618a7d85cfdda016efdc0ff3f4002d4d4b2b5be81a291536efd90515cfd7ef05b0710206606580078f546068126d08d0f7d2a61c07907a30681205b070b00fc15ae3b0a8b00 -d5e7e0b8e1e0a1aae7e084e1e06de7e050e1e039eae7e01cc96007cd620a00ec0b00287194300e31fa3f70f40d659c34f334f30500708530c8913cb0d20da6e6c21ff94000fe39f4aa9e61c10031006497d1c99044e0891fd5e40836ea1f083600009e0ec1123c00711ff0c89152717f280287f6d8691080fd7f2f6af14e -2675f65c602887f8000099ebe099aee05799002c8b20188b20041ff0d568e2c006c792290508456eff7469747920537461ff7465205044550e65feb92373312e61312e6515311df006999807a59fb79f0971f8a29159ff6bf114daba581fe3340664482a333b0850a27a1fa2ddf858c112af24af36af0048af5aaf6caff4 -43db20987f0f54c732f8b67f4cdf3f557b14ae47e1e37a84d8ab20f0fd7106620502ed70f2a6ed7ef630389253c732c6330106c732a952614fc051774ed5528d4f80a1fd0ac1b5fdd9fbd34accfa0ac1002f019d0022b3b8f2bfbfd1bf00c1dfb3ef07cf8f612a3e48ef40cfc86b414747f165c09be1a297561f0057b028 -c49528053f5404ee9480ed963036007ef663f8d4c59af4e3c7f950836802607afec9067b3ad83ffe2266d04e48f1010406c1127a620229415084645251d03c7060037462057a6224a24062c0038662b96301e93f3fd9f00142fe3fec71b8b101000f011165bd91c9900525061df0d8e21872e70a0083247298d11200c928 -7194adb0c830239f20471100bb5f08cf5fdf5ff15f05046f166f286f3a6f808c74536f6568926fc66fd86fea6f00c86f6247706cd009c1125282020aa471b25e8202a4614c82055282012a5282035e82015e8203fe6fd5e4850918740a1874277f3977ad810902999808e82ffa2f0c3f1e3f303f423f00543f663f783f8a -3f9c3fae3f7daf0d8f20f83f5cdad5806cd4fd9205134f254e10af0e474f5191a1f408bd4f5da7d9f80072adccf15eaa7341fd92aaa3fc936bb200abaf9f41fd92d6a3b6a706a3dcaaaeb100095f1b5f2d5f3f5f515f635f755f875f10995f54cb5e8023f6083f1030ff42ff0054ff66ff78ff8aff9cf95ea6b1f83bcd00 -96aa7babe7fff9ff99f5130f250beebe00440f560c4d276f0f810ff2cda30fb50f00f2cdd70fe90ff2cd0b1f1d1f2f1f411c10c1b1e6df661fc7b30a7f1f911fa31f00b51fc71fd91f75effd1f0f2f212f332f00452f572f692f7b2f8d2f9f2fb12fc32f82d521470010497fe9df6d7f7f7e0031ff12c4907711c580f5ad -7fbf7f80436ab7f0e178de74656c6ef04f800c0c54e22f02020d78423b02916fa3622a2902052f02012f02033b026e03a0c56f218fe49ffb6f8de70c18740d28207fc08ed4010cdc280be28ff48ffc069ed2f7cc3f40ee964c079915a59176e1e04b13d3f64590ffd19a1129e83408c000509f629f749f869f989faa9fbc -9fce9f009a0ff298fc0000a424220caf1eaf371524c1fee0e7b00cd0b5440b64cc6ea140852de0418526c544f441852055c42201c5052073412422d1232323bca2d22f009f412422fd23dd272d23033a055f11bf0023bf35bf7bbf59bf5e304b1e7fbf91bf08a3bd3b00b6b60bd300c3bfd5bfe7bfe0f9bf0bcf1dcf2fc9 -852018f405077d415f44c8852658c8992f83223f77c41d7147dc80cf92cf00a4cfb6cf98dfdacf54dffecf10df155f0034df46df4b5f6adf7cdf8edfa0dfb2df40c4dfd6dae8310d6ff9dfee330d12ef0024ef36ef48ef5aef6cef9c6f90efa2ef00b4efc6efd8efeaeffcef0eff20ff32fafd1cf538526571756573ff74 -20436f6e74726f096c57f16bf00e6fff81ff93ffa5ff0300e2b9ffcbffddffefffcd74080fc81a0c88702c00117b6249820212a0b2a25582460f580243820549820102498203558288837a0f8c0f0b2fb00f4ab46711cd0412d50fe70c24ed82050ffd0813091f1b1f2d1e1c4a6ebefc6494f54850a27aa2ddf80758c1bf -771f891f9b1fad1fbf1f00d11fe31ff51fb48f1928169027243ea240332f452f695e384674ba34c413ae2c004bc19fa69348b3ad5fc19faace213ea200eba33da3e322ecaffa213ea217b3f7a70047a31dba263f383f4a3f5c3fa23f803fa078b0659ea63fb83fca3d10db381300f3b0ea3ffc3f0e4f204f324f444f5649 -e09fa66b487ccdd7aabcab74d14507175d74a74fb94fcb4fdd4fbf5f00015f7b5f255f375f2fdf5b5f6d5f65df00915fa35fb55fc75fd95feb5ffd5a02c10827ef206f08c310396f4b6f5d6f6f6f00816f936fb6efb76fc96fdb6fed6fff6fa0117f237f357f477f597a180fc841ff636b6e6f776c64654b67658172484e -80fe070e239ff8359f2d1fed7840ef2c893de3c3975119edf363197988b6074d0464751fa19fb39fc59fd79f00e99ffb9f0dafc2cf172a9ef041a4c602484daf5faf572ed4692f7b270e862f162611abaa3f11ea94472716b628002710c42bc6027313c503e322741ffa2100c6029f137f17cf03a51a40bf52bf64bf0076 -bfbcbf9abf0020edfec0bfd2bfca3d045580dd360e119004cf16cf28cf3acf004ccf5ecf56492710654e27167f48271d004b14a14fcdcfdfcff1cf03df15df27df0039df4bdf5ddf6fdf81df93dfa5dfabef00c9dfdbdfeddfffdf11ef8922af4f3aef0290231253ef65ef77ef89ef9befadef003e5fd1efe3eff5ef07ff -19ff2bff3dffe84fff61ff597a299728456e74ff6974792053746174f696f20e65156373312e612f312e6531857013897f9b7f0cad7fbf7f00f783aeda26bf28f87f200a8f7d6322888aa0308f02376041a0010fcf835082f4b00175608f7282f2620105f86217b0858104723773948fa68f28ad0fca8f56570fe78410ef -8f019c012323e0010000000000e530e9f203f1f4ebf01440abddaa0200ea0f40e9f22300dd24e9f20b0020150018000f02002200fd1ce1fa010040004200ff84df7c3b651d00000127dcf03128dcff000fe9f22400fd1ce1fa010045004200ffb4fb7c3ba31d0000010adcf0fd4ee3f8010004001500ffc700bc1b803b09 -10ff0000560d0000c900ff440014df7c3b5f1df7000006ebf03f005600554413008c170017ebf0441f0035641300ad27040000ff0c0100005c5c52493f47454c5c4850dcffeaf1ff010401039c007000cf034a01001c010c04000feaebf0021f0202ebf04c657407746572000f4f0f610f730fe6f5372000ff90002303e8 -f39001be9c031500060012ebf003048f0098030523049c07c90f9c03eaf10d18e9f21027ec01ea017c05ff00030000ffff0000ff0100506167652d31f7000006f5f0426c6163ff6b2066696c6c00007d12f5f057686974650904f504010275180401005265fd640904010047726565756e09042df5f04379614004ff0100 -59656c6c6f77ea090347f5f04df9f06e7461f633086179280531302520fc780914036c696e650000f583f5f033850c4c6f6e671f206461736831009a032204976461720805a04905cd08ad043906cd07c06508cd072e030c195804aecd08010035850c37850c391e850c3170786c9903a2006d18bd396d18486169727113 -01bf0053686f7274b80a01ff00417269616c2063fe6b0065726564000090fc9910b013746f70206c659f667400009cc119f5f0542f696d6573b518bc9910e413f4de19ca17e1c11620387074feb517bc010200526f75fb6e6431007265637461e76e676c7411302e2e3138ff0001330050023300553a5d20215d20105d20 -015d2055f05920e15920cd5920bc592055a759209c592090592084592055785920685920585920475920d53459202459200e5920f900573300e5ad20d3ad20c0ad2055adad20a0ad2090ad2083ad205572ad2064ad2055ad2047ad20553cad202dad201dad200dad203f0400250067029d74e9f2220003f5f0e9f2147740 -abaa0200ea0f40ebf0f7010002f5f004000500ff0600070008000900ff0a000b000c000d00ff0e000f0010001100ff1200130014001500ff1600170018001900ff1a001b001c001d007f1e001f00200021f3f05ce8f30c010b005e1f00180d00036800056ce1fa06dcff0e0f200f320fe5f6ff40004200fcfa7c3b1f3e20 -0000713c003128dcff000fe9f22400056ce1fa06dcff0e0f200f320fe5f6ff450042005c687d3b1fcf2000000a3c000000000000000000000000007f0e020000030002f1f0ff2400ffff205a7a3b630904dcff130fe4f7ffff1e0f00430f550f670f790f8b0f9d0faf0fc10f22eaf101c60fea0fe7f405f20f161ff00112 -010f3f1fd4031a000d0057110008ebf0122d1023f7f07f1b001f00200021f3f01f0b001300072906811f921dfee8f311000a0017000cff0018001400150016ff00190022001c001eeb001dd7000ef1f00f00060f000900107510921fe51fec1303130073c401e6f5eff3010003fff2c7090067f6f5100fdefd2847fff7fc -170fa7e14028cf564a94733802340e745ae77a3b01f7f00b08e0617dfd3be8f31400160056005f6cce7c3b38ebf054ebf0ff17004400f4bf7c3b558cebf0088304147b00948f04ff1800d60004c07e3bf59cebf062ebf0260046005fa4cf7c3bfeebf021ebf07d1aa700647b7d3b1feff0fffb060000ff006000bbd42d6c -0500001cb70038af1217001a92002bebf01dfe7700842a7d3b250f00ab0048ebf024810084bb006daaff000cebf020870094bb0079f4ff0092012187001cde7c3bf5811f1429b7009ca87e3b5589ff0080ebf02777002c2b105fc41d000045ebf01bb700ffc8401700091e0000f575ebf032b700ac78803bd57e5f10c0ef -f03f4711ff7cd73baf2014110087005600f5646b00d97f143d0050009f6cf27d3bf97f101211cabeb70014767e3b05c200a600210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000696f5c536f6c7574696f6e735c426c6f636b204469616772616d5c4261736963204469616772616d2e767374000000001e0000000100000000000000 -02000000e4040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000feff000004000200000000000000000000000000000000000200000002d5cdd59c2e1b10939708002b2cf9ae4400000005d5cdd59c2e1b109397 -08002b2cf9ae1a010000d6000000070000000e000000400000000f0000004c00000002000000580000000c000000640000000d0000009c00000001000000c600000000000080ce0000001e00000001000000000000001e00000001000000000000001e00000001000000000000000c100000040000001e00000006000000 -50616765730003000000010000001e000000080000004d61737465727300030000000100000000001e1000000200000008000000506167652d31000012000000526f756e6465642072656374616e676c650002000000e4040000130000000904000088000000050000000000000030000000020000006400000003000000 -70000000010000007800000000000080800000000200000003000000100000005f565049445f5052455649455753000002000000100000005f5049445f4c494e4b424153450000004100000004000000000000000c1000000000000002000000e40400001300000009040000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001050000050000000d0000004d45544146494c4550494354009c3100006ad8ffff382b000008009c3196270000 -0100090000039815000008003a0e000000003a0e000026060f006a1c574d46430100000000000100e8560000000001000000481c000000000000481c00000100000084000000ba00000017000000220500006a04000000000000000000009c3100009527000020454d4600000100481c000015010000050000000f000000 -640000000000000060090000060c0000cb0000000501000000000000000000000000000056004900530049004f000000440072006100770069006e0067000000000000000a0000001000000000000000000000000900000010000000dc050000ad040000260000001c00000001000000000000000d000000000000000000 -0000250000000c00000001000000120000000c000000020000000d000000100000000000000000000000190000000c000000ffffff0027000000180000000200000000000000ffffff0000000000250000000c00000002000000250000000c00000005000080280000000c00000002000000250000000c00000005000080 -250000000c00000001000000120000000c000000010000005700000024000000240100008e000000340100006a040000020000002c0196002c016204250000000c00000007000080250000000c00000008000080280000000c00000001000000120000000c00000001000000160000000c00000018000000180000000c00 -000000000000520000004c01000001000000ceffffff16000000000000000000000090010000000000000000002041007200690061006c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -e82eed770108214cdcf31200480000000108214c88af160000000000390000002e0000000b0000000700000002000000160000005900000090010000000000002c0100002c010000200002fb1f0020000000002f0001010101010101000000001eff1f209049ed77054aed77464aed770000214c88af1600304aed770108 -214cc8a27b3b01000000390000002e0000000b0000000700000002000000160000005900000090010000000000002c01000000000000000000000000000000000000000000000000000001010101010101010101b654250000000c00000001000000540000006c000000f700000017000000740100004f00000001000000 -555507412aac0741f700000045000000050000004c000000000000000000000000000000ffffffffffffffff580000004f0074006800650072000000270000000e0000001c0000001c000000110000005400000090000000ba00000053000000b10100008b00000001000000555507412aac0741ba000000810000000b00 -00004c000000000000000000000000000000ffffffffffffffff640000004100700070006c00690063006100740069006f006e000000210000001c0000001c0000000c0000000c000000190000001c0000000e0000000c0000001c0000001c000000250000000c0000000d000080260000001c0000000200000000000000 -0d0000000000000000000000250000000c00000002000000120000000c000000020000000d000000100000000000000000000000190000000c000000ffffff0027000000180000000300000000000000ffffff0000000000250000000c00000003000000250000000c00000005000080280000000c000000030000002500 -00000c00000005000080250000000c00000002000000120000000c000000010000005700000024000000930400008e000000a50400006a040000020000009d0496009b046204250000000c00000007000080250000000c00000008000080280000000c00000002000000250000000c00000001000000250000000c000000 -0d000080120000000c00000001000000160000000c00000018000000180000000c00000000000000250000000c0000000100000054000000600000007004000017000000dd0400004f00000001000000555507412aac07417004000045000000030000004c000000000000000000000000000000ffffffffffffffff5400 -0000410043004d00000021000000240000002900000054000000900000002b04000053000000220500008b00000001000000555507412aac07412b040000810000000b0000004c000000000000000000000000000000ffffffffffffffff640000004100700070006c00690063006100740069006f006e00000021000000 -1c0000001c0000000c0000000c000000190000001c0000000e0000000c0000001c0000001c000000250000000c0000000d000080260000001c0000000200000000000000030000000000000000000000250000000c00000002000000120000000c000000020000000d000000100000000000000000000000190000000c00 -0000ffffff0027000000180000000300000000000000ffffff0000000000250000000c00000003000000250000000c00000005000080280000000c00000003000000250000000c00000005000080250000000c00000002000000120000000c0000000100000057000000240000004f010000b50000007904000029010000 -020000005201b80076042601250000000c00000007000080250000000c00000008000080280000000c00000002000000250000000c00000008000080120000000c000000020000000d000000100000000000000000000000190000000c000000ffffff002700000018000000020000000000000000000000000000002500 -00000c0000000200000056000000340000006e040000180100008b04000033010000060000008b0429016e04330172042a0173042101720418018b042901250000000c00000005000080280000000c00000002000000250000000c00000008000080260000001c0000000200000000000000010000000000000000000000 -250000000c00000002000000120000000c000000020000000d000000100000000000000000000000190000000c000000ffffff0027000000180000000300000000000000ffffff0000000000250000000c0000000300000056000000800000000d020000b8000000cf0300002901000019000000aa032901b5032701c003 -2201c8031901cd030f01cf030301cf03de00cd03d200c803c800c003c000b503ba00aa03b8003302b8002702ba001c02c0001402c8000f02d2000d02de000d0203010f020f01140219011c0222012702270133022901aa032901250000000c00000005000080280000000c00000003000000250000000c00000008000080 -280000000c00000002000000120000000c00000001000000160000000c00000018000000180000000c00000000000000520000004c01000002000000dfffffff0f000000000000000000000090010000000000000000002241007200690061006c0000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000e82eed770108214c9cf41200480000000108214c30fd160000000000260000001f0000000700000005000000010000000f0000003b00000090010000000000002c0100002c010000200002fb1f0020000000002f -0001010101010101000000001eff1f209049ed77054aed77464aed770000214c30fd1600304aed770108214c84a77e3b01000000260000001f0000000700000005000000010000000f0000003b00000090010000000000002c01000000000000000000000000000000000000000000000000000001010101010101010101 -b654250000000c0000000200000054000000ac00000075020000c800000066030000ed00000001000000555507412aac074175020000e7000000100000004c000000000000000000000000000000ffffffffffffffff6c00000045006e007400690074007900200053007400610074006500200050004400550016000000 -120000000900000007000000090000000f0000000900000016000000090000001100000009000000110000000900000016000000180000001800000054000000a800000087020000f0000000550300001501000001000000555507412aac0741870200000f0100000f0000004c000000000000000000000000000000ffff -ffffffffffff6c00000065006e0074006900740079002000730031002e00610031002e0065003100000011000000120000000900000007000000090000000f000000090000001100000012000000090000001100000012000000090000001100000012000000250000000c0000000d000080260000001c00000003000000 -00000000030000000000000000000000250000000c00000003000000120000000c000000020000000d000000100000000000000000000000190000000c000000ffffff0027000000180000000400000000000000ffffff0000000000250000000c00000004000000250000000c00000005000080280000000c0000000400 -0000250000000c00000005000080250000000c00000003000000120000000c0000000100000057000000240000004f0100004b01000079040000bf0100000200000052014e017604bc01250000000c00000007000080250000000c00000008000080280000000c00000003000000250000000c0000000800008012000000 -0c000000020000000d000000100000000000000000000000190000000c000000ffffff00270000001800000003000000000000000000000000000000250000000c0000000300000056000000340000006e040000ae0100008b040000c9010000060000008b04bf016e04c9017204c0017304b7017204ae018b04bf012500 -00000c00000005000080280000000c00000003000000250000000c00000008000080260000001c0000000300000000000000010000000000000000000000250000000c00000003000000120000000c000000020000000d000000100000000000000000000000190000000c000000ffffff00270000001800000004000000 -00000000ffffff0000000000250000000c0000000400000056000000800000000d0200004e010000cf030000bf01000019000000aa03bf01b503bd01c003b801c803af01cd03a501cf039901cf037401cd036801c8035e01c0035601b5035001aa034e0133024e01270250011c02560114025e010f0268010d0274010d02 -99010f02a5011402af011c02b8012702bd013302bf01aa03bf01250000000c00000005000080280000000c00000004000000250000000c00000008000080280000000c00000003000000120000000c00000001000000160000000c00000018000000180000000c00000000000000250000000c0000000200000054000000 -ac000000750200005e010000660300008301000001000000555507412aac0741750200007d010000100000004c000000000000000000000000000000ffffffffffffffff6c00000045006e007400690074007900200053007400610074006500200050004400550016000000120000000900000007000000090000000f00 -00000900000016000000090000001100000009000000110000000900000016000000180000001800000054000000a8000000870200008601000055030000ab01000001000000555507412aac074187020000a50100000f0000004c000000000000000000000000000000ffffffffffffffff6c00000065006e0074006900 -740079002000730031002e00610031002e0065003100000011000000120000000900000007000000090000000f000000090000001100000012000000090000001100000012000000090000001100000012000000250000000c0000000d000080260000001c00000003000000000000000300000000000000000000002500 -00000c00000003000000120000000c000000020000000d000000100000000000000000000000190000000c000000ffffff0027000000180000000400000000000000ffffff0000000000250000000c00000004000000250000000c00000005000080280000000c00000004000000250000000c0000000500008025000000 -0c00000003000000120000000c0000000100000057000000240000006c0100002c020000840400008e0200000200000081042f026f018b02250000000c00000007000080250000000c00000008000080280000000c00000003000000250000000c00000008000080120000000c000000020000000d000000100000000000 -000000000000190000000c000000ffffff00270000001800000003000000000000000000000000000000250000000c0000000300000056000000340000005b0100007d0200007701000097020000060000005b018d0274017d027201860273018f02770197025b018d02250000000c00000005000080280000000c000000 -03000000250000000c00000008000080260000001c0000000300000000000000010000000000000000000000250000000c00000003000000120000000c000000020000000d000000100000000000000000000000190000000c000000ffffff0027000000180000000400000000000000ffffff0000000000250000000c00 -0000040000005600000080000000160200002f020000d8030000a002000019000000b303a002be039e02c9039902d1039002d7038602d8037a02d8035502d7034902d1033f02c9033702be033102b3032f023c022f0230023102260237021e023f02180249021602550216027a02180286021e0290022602990230029e02 -3c02a002b303a002250000000c00000005000080280000000c00000004000000250000000c00000008000080280000000c00000003000000120000000c00000001000000160000000c00000018000000180000000c00000000000000250000000c0000000200000054000000c00000005c02000053020000920300007802 -000001000000555507412aac07415c02000072020000130000004c000000000000000000000000000000ffffffffffffffff740000005200650071007500650073007400200043006f006e00740072006f006c00200050004400550000001800000011000000120000001200000011000000110000000900000009000000 -180000001100000012000000090000000b000000110000000700000009000000160000001800000018000000250000000c0000000d000080260000001c0000000300000000000000030000000000000000000000250000000c00000003000000120000000c000000020000000d0000001000000000000000000000001900 -00000c000000ffffff0027000000180000000400000000000000ffffff0000000000250000000c00000004000000250000000c00000005000080280000000c00000004000000250000000c00000005000080250000000c00000003000000120000000c0000000100000057000000240000006c010000dc03000084040000 -2b040000020000008104df036f012804250000000c00000007000080250000000c00000008000080280000000c00000003000000250000000c00000008000080120000000c000000020000000d000000100000000000000000000000190000000c000000ffffff0027000000180000000300000000000000000000000000 -0000250000000c0000000300000056000000340000005b0100001a0400007701000035040000060000005b012a0475011a047301230473012c04770135045b012a04250000000c00000005000080280000000c00000003000000250000000c00000008000080260000001c00000003000000000000000100000000000000 -00000000250000000c00000003000000120000000c000000020000000d000000100000000000000000000000190000000c000000ffffff0027000000180000000400000000000000ffffff0000000000250000000c00000004000000560000008000000016020000cc030000d80300003c04000019000000b3033c04be03 -3b04c9033504d1032d04d7032204d8031704d803f103d703e603d103db03c903d303be03ce03b303cc033c02cc033002ce032602d3031e02db031802e6031602f10316021704180222041e022d042602350430023b043c023c04b3033c04250000000c00000005000080280000000c00000004000000250000000c000000 -08000080280000000c00000003000000120000000c00000001000000160000000c00000018000000180000000c00000000000000250000000c0000000200000054000000ac0000007f020000db030000700300000004000001000000555507412aac07417f020000fa030000100000004c00000000000000000000000000 -0000ffffffffffffffff6c00000045006e007400690074007900200053007400610074006500200050004400550016000000120000000900000007000000090000000f0000000900000016000000090000001100000009000000110000000900000016000000180000001800000054000000a80000009002000003040000 -5e0300002804000001000000555507412aac074190020000220400000f0000004c000000000000000000000000000000ffffffffffffffff6c00000065006e0074006900740079002000730031002e00610031002e0065003100000011000000120000000900000007000000090000000f00000009000000110000001200 -0000090000001100000012000000090000001100000012000000250000000c0000000d000080260000001c0000000300000000000000030000000000000000000000250000000c00000003000000120000000c000000020000000d000000100000000000000000000000190000000c000000ffffff002700000018000000 -0400000000000000ffffff0000000000250000000c00000004000000250000000c00000005000080280000000c00000004000000250000000c00000005000080250000000c00000003000000120000000c0000000100000057000000240000004f010000c20200007904000036030000020000005201c502760433032500 -00000c00000007000080250000000c00000008000080280000000c00000003000000250000000c00000008000080120000000c000000020000000d000000100000000000000000000000190000000c000000ffffff00270000001800000003000000000000000000000000000000250000000c0000000300000056000000 -340000006e040000250300008b04000040030000060000008b0436036e0440037204370373042e03720425038b043603250000000c00000005000080280000000c00000003000000250000000c00000008000080260000001c0000000300000000000000010000000000000000000000250000000c000000030000001200 -00000c000000020000000d000000100000000000000000000000190000000c000000ffffff0027000000180000000400000000000000ffffff0000000000250000000c0000000400000056000000800000000d020000c5020000cf0300003603000019000000aa033603b5033403c0032f03c8032603cd031c03cf031003 -cf03eb02cd03df02c803d502c003cd02b503c702aa03c5023302c5022702c7021c02cd021402d5020f02df020d02eb020d0210030f021c03140226031c022f032702340333023603aa033603250000000c00000005000080280000000c00000004000000250000000c00000008000080280000000c000000030000001200 -00000c00000001000000160000000c00000018000000180000000c00000000000000250000000c0000000200000054000000a800000068020000e9020000740300000e03000001000000555507412aac074168020000080300000f0000004c000000000000000000000000000000ffffffffffffffff6c00000041006300 -6b006e006f0077006c00640065006700650020005000440055000000160000001100000010000000120000001100000017000000070000001200000011000000120000001100000009000000160000001800000018000000250000000c0000000d0000800e00000014000000000000001000000014000000040000000301 -0800050000000b0200000000050000000c02ab04dd0508000000fa0200000d00000000000000040000002d0100000400000002010200050000000102ffffff0007000000fc020000ffffff000000040000002d01010007000000fc020100000000000000040000002d01020004000000f0010100040000002d0102000400 -00002d010000040000000201010008000000250302002c0196002c01620408000000fa0200000000000000000000040000002d01010008000000fa02050000000000ffffff00040000002d01030004000000f00100000400000002010100040000002e011800050000000902000000001c000000fb02ceff160000000000 -90010000000000000020417269616c000000000000000000000000000000000000000000000000000000040000002d0100000f000000320a4500f700050000004f746865720027000e001c001c00110018000000320a8100ba000b0000004170706c69636174696f6e3121001c001c000c000c0019001c000e000c001c00 -1c001c000000fb021000070000000000bc02000000000102022253797374656d0000000000000000000000000000000000000000000000000000040000002d01040008000000fa0200000d00000000000000040000002d0105000400000002010200050000000102ffffff0007000000fc020000ffffff00000004000000 -2d010600040000002d01020004000000f0010600040000002d010200040000002d010500040000000201010008000000250302009d0496009b046204040000002d010100040000002d01030004000000f0010500040000002d010000040000002d0104000400000002010100040000002e01180005000000090200000000 -040000002d0100000c000000320a450070040300000041434d0021002400290018000000320a81002b040b0000004170706c69636174696f6e2021001c001c000c000c0019001c000e000c001c001c00040000002d01040008000000fa0200000300000000000000040000002d0105000400000002010200050000000102 -ffffff0007000000fc020000ffffff000000040000002d010600040000002d01020004000000f0010600040000002d010200040000002d010500040000000201010008000000250302005201b80076042601040000002d010100040000002d01030004000000f0010500040000002d010300040000000201020005000000 -0102ffffff0007000000fc020000000000000000040000002d01050010000000240306008b0429016e04330172042a0173042101720418018b042901040000002d01020004000000f0010500040000002d01030008000000fa0200000100000000000000040000002d0105000400000002010200050000000102ffffff00 -07000000fc020000ffffff000000040000002d0106003600000024031900aa032901b5032701c0032201c8031901cd030f01cf030301cf03de00cd03d200c803c800c003c000b503ba00aa03b8003302b8002702ba001c02c0001402c8000f02d2000d02de000d0203010f020f01140219011c0222012702270133022901 -aa032901040000002d01020004000000f0010600040000002d01030004000000f00105000400000002010100040000002e011800050000000902000000001c000000fb02dfff0f000000000090010000000000000022417269616c000000000000000000000000000000000000000000000000000000040000002d010500 -1f000000320ae700750210000000456e7469747920537461746520504455160012000900070009000f0009001600090011000900110009001600180018001e000000320a0f0187020f000000656e746974792073312e61312e653100110012000900070009000f0009001100120009001100120009001100120004000000 -2d01040008000000fa0200000300000000000000040000002d0106000400000002010200050000000102ffffff0007000000fc020000ffffff000000040000002d010700040000002d01020004000000f0010700040000002d010200040000002d0106000400000002010100080000002503020052014e017604bc010400 -00002d010100040000002d01030004000000f0010600040000002d0103000400000002010200050000000102ffffff0007000000fc020000000000000000040000002d01060010000000240306008b04bf016e04c9017204c0017304b7017204ae018b04bf01040000002d01020004000000f0010600040000002d010300 -08000000fa0200000100000000000000040000002d0106000400000002010200050000000102ffffff0007000000fc020000ffffff000000040000002d0107003600000024031900aa03bf01b503bd01c003b801c803af01cd03a501cf039901cf037401cd036801c8035e01c0035601b5035001aa034e0133024e012702 -50011c02560114025e010f0268010d0274010d0299010f02a5011402af011c02b8012702bd013302bf01aa03bf01040000002d01020004000000f0010700040000002d01030004000000f00106000400000002010100040000002e01180005000000090200000000040000002d0105001f000000320a7d01750210000000 -456e7469747920537461746520504455160012000900070009000f0009001600090011000900110009001600180018001e000000320aa50187020f000000656e746974792073312e61312e653155110012000900070009000f00090011001200090011001200090011001200040000002d01040008000000fa0200000300 -000000000000040000002d0106000400000002010200050000000102ffffff0007000000fc020000ffffff000000040000002d010700040000002d01020004000000f0010700040000002d010200040000002d0106000400000002010100080000002503020081042f026f018b02040000002d010100040000002d010300 -04000000f0010600040000002d0103000400000002010200050000000102ffffff0007000000fc020000000000000000040000002d01060010000000240306005b018d0274017d027201860273018f02770197025b018d02040000002d01020004000000f0010600040000002d01030008000000fa020000010000000000 -0000040000002d0106000400000002010200050000000102ffffff0007000000fc020000ffffff000000040000002d0107003600000024031900b303a002be039e02c9039902d1039002d7038602d8037a02d8035502d7034902d1033f02c9033702be033102b3032f023c022f0230023102260237021e023f0218024902 -1602550216027a02180286021e0290022602990230029e023c02a002b303a002040000002d01020004000000f0010700040000002d01030004000000f00106000400000002010100040000002e01180005000000090200000000040000002d01050024000000320a72025c02130000005265717565737420436f6e74726f -6c20504455001800110012001200110011000900090018001100120009000b00110007000900160018001800040000002d01040008000000fa0200000300000000000000040000002d0106000400000002010200050000000102ffffff0007000000fc020000ffffff000000040000002d010700040000002d0102000400 -0000f0010700040000002d010200040000002d010600040000000201010008000000250302008104df036f012804040000002d010100040000002d01030004000000f0010600040000002d0103000400000002010200050000000102ffffff0007000000fc020000000000000000040000002d0106001000000024030600 -5b012a0475011a047301230473012c04770135045b012a04040000002d01020004000000f0010600040000002d01030008000000fa0200000100000000000000040000002d0106000400000002010200050000000102ffffff0007000000fc020000ffffff000000040000002d0107003600000024031900b3033c04be03 -3b04c9033504d1032d04d7032204d8031704d803f103d703e603d103db03c903d303be03ce03b303cc033c02cc033002ce032602d3031e02db031802e6031602f10316021704180222041e022d042602350430023b043c023c04b3033c04040000002d01020004000000f0010700040000002d01030004000000f0010600 -0400000002010100040000002e01180005000000090200000000040000002d0105001f000000320afa037f0210000000456e7469747920537461746520504455160012000900070009000f0009001600090011000900110009001600180018001e000000320a220490020f000000656e746974792073312e61312e653155 -110012000900070009000f00090011001200090011001200090011001200040000002d01040008000000fa0200000300000000000000040000002d0106000400000002010200050000000102ffffff0007000000fc020000ffffff000000040000002d010700040000002d01020004000000f0010700040000002d010200 -040000002d010600040000000201010008000000250302005201c50276043303040000002d010100040000002d01030004000000f0010600040000002d0103000400000002010200050000000102ffffff0007000000fc020000000000000000040000002d01060010000000240306008b0436036e044003720437037304 -2e03720425038b043603040000002d01020004000000f0010600040000002d01030008000000fa0200000100000000000000040000002d0106000400000002010200050000000102ffffff0007000000fc020000ffffff000000040000002d0107003600000024031900aa033603b5033403c0032f03c8032603cd031c03 -cf031003cf03eb02cd03df02c803d502c003cd02b503c702aa03c5023302c5022702c7021c02cd021402d5020f02df020d02eb020d0210030f021c03140226031c022f032702340333023603aa033603040000002d01020004000000f0010700040000002d01030004000000f00106000400000002010100040000002e01 -180005000000090200000000040000002d0105001e000000320a080368020f00000041636b6e6f776c646567652050445500160011001000120011001700070012001100120011000900160018001800040000002d010400030000000000}{\result {\fs20 -{\pict{\*\picprop\shplid1031{\sp{\sn shapeType}{\sv 75}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn pictureGray}{\sv 0}}{\sp{\sn pictureBiLevel}{\sv 0}}{\sp{\sn pictureActive}{\sv 0}}{\sp{\sn fillColor}{\sv 268435473}} -{\sp{\sn fFilled}{\sv 0}}{\sp{\sn fHitTestFill}{\sv 1}}{\sp{\sn fillShape}{\sv 1}}{\sp{\sn fillUseRect}{\sv 0}}{\sp{\sn fNoFillHitTest}{\sv 0}}{\sp{\sn fLine}{\sv 0}}}\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0 -\picw12700\pich10134\picwgoal7200\pichgoal5745\wmetafile8\bliptag-605548371\blipupi-222{\*\blipuid dbe810ad730623613eb913d75ba9ad55} -0100090000039815000008003a0e000000003a0e000026060f006a1c574d46430100000000000100e8560000000001000000481c000000000000481c00000100 -000084000000ba00000017000000220500006a04000000000000000000009c3100009527000020454d4600000100481c000015010000050000000f0000006400 -00000000000060090000060c0000cb0000000501000000000000000000000000000056004900530049004f000000440072006100770069006e00670000000000 -00000a0000001000000000000000000000000900000010000000dc050000ad040000260000001c00000001000000000000000d00000000000000000000002500 -00000c00000001000000120000000c000000020000000d000000100000000000000000000000190000000c000000ffffff002700000018000000020000000000 -0000ffffff0000000000250000000c00000002000000250000000c00000005000080280000000c00000002000000250000000c00000005000080250000000c00 -000001000000120000000c000000010000005700000024000000240100008e000000340100006a040000020000002c0196002c016204250000000c0000000700 -0080250000000c00000008000080280000000c00000001000000120000000c00000001000000160000000c00000018000000180000000c000000000000005200 -00004c01000001000000ceffffff16000000000000000000000090010000000000000000002041007200690061006c0000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e82eed770108214cdcf3 -1200480000000108214c88af160000000000390000002e0000000b0000000700000002000000160000005900000090010000000000002c0100002c0100002000 -02fb1f0020000000002f0001010101010101000000001eff1f209049ed77054aed77464aed770000214c88af1600304aed770108214cc8a27b3b010000003900 -00002e0000000b0000000700000002000000160000005900000090010000000000002c0100000000000000000000000000000000000000000000000000000101 -0101010101010101b654250000000c00000001000000540000006c000000f700000017000000740100004f00000001000000555507412aac0741f70000004500 -0000050000004c000000000000000000000000000000ffffffffffffffff580000004f0074006800650072000000270000000e0000001c0000001c0000001100 -00005400000090000000ba00000053000000b10100008b00000001000000555507412aac0741ba000000810000000b0000004c00000000000000000000000000 -0000ffffffffffffffff640000004100700070006c00690063006100740069006f006e000000210000001c0000001c0000000c0000000c000000190000001c00 -00000e0000000c0000001c0000001c000000250000000c0000000d000080260000001c00000002000000000000000d0000000000000000000000250000000c00 -000002000000120000000c000000020000000d000000100000000000000000000000190000000c000000ffffff0027000000180000000300000000000000ffff -ff0000000000250000000c00000003000000250000000c00000005000080280000000c00000003000000250000000c00000005000080250000000c0000000200 -0000120000000c000000010000005700000024000000930400008e000000a50400006a040000020000009d0496009b046204250000000c000000070000802500 -00000c00000008000080280000000c00000002000000250000000c00000001000000250000000c0000000d000080120000000c00000001000000160000000c00 -000018000000180000000c00000000000000250000000c0000000100000054000000600000007004000017000000dd0400004f00000001000000555507412aac -07417004000045000000030000004c000000000000000000000000000000ffffffffffffffff54000000410043004d0000002100000024000000290000005400 -0000900000002b04000053000000220500008b00000001000000555507412aac07412b040000810000000b0000004c000000000000000000000000000000ffff -ffffffffffff640000004100700070006c00690063006100740069006f006e000000210000001c0000001c0000000c0000000c000000190000001c0000000e00 -00000c0000001c0000001c000000250000000c0000000d000080260000001c0000000200000000000000030000000000000000000000250000000c0000000200 -0000120000000c000000020000000d000000100000000000000000000000190000000c000000ffffff0027000000180000000300000000000000ffffff000000 -0000250000000c00000003000000250000000c00000005000080280000000c00000003000000250000000c00000005000080250000000c000000020000001200 -00000c0000000100000057000000240000004f010000b50000007904000029010000020000005201b80076042601250000000c00000007000080250000000c00 -000008000080280000000c00000002000000250000000c00000008000080120000000c000000020000000d000000100000000000000000000000190000000c00 -0000ffffff00270000001800000002000000000000000000000000000000250000000c0000000200000056000000340000006e040000180100008b0400003301 -0000060000008b0429016e04330172042a0173042101720418018b042901250000000c00000005000080280000000c00000002000000250000000c0000000800 -0080260000001c0000000200000000000000010000000000000000000000250000000c00000002000000120000000c000000020000000d000000100000000000 -000000000000190000000c000000ffffff0027000000180000000300000000000000ffffff0000000000250000000c0000000300000056000000800000000d02 -0000b8000000cf0300002901000019000000aa032901b5032701c0032201c8031901cd030f01cf030301cf03de00cd03d200c803c800c003c000b503ba00aa03 -b8003302b8002702ba001c02c0001402c8000f02d2000d02de000d0203010f020f01140219011c0222012702270133022901aa032901250000000c0000000500 -0080280000000c00000003000000250000000c00000008000080280000000c00000002000000120000000c00000001000000160000000c000000180000001800 -00000c00000000000000520000004c01000002000000dfffffff0f000000000000000000000090010000000000000000002241007200690061006c0000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -0000e82eed770108214c9cf41200480000000108214c30fd160000000000260000001f0000000700000005000000010000000f0000003b000000900100000000 -00002c0100002c010000200002fb1f0020000000002f0001010101010101000000001eff1f209049ed77054aed77464aed770000214c30fd1600304aed770108 -214c84a77e3b01000000260000001f0000000700000005000000010000000f0000003b00000090010000000000002c0100000000000000000000000000000000 -0000000000000000000001010101010101010101b654250000000c0000000200000054000000ac00000075020000c800000066030000ed000000010000005555 -07412aac074175020000e7000000100000004c000000000000000000000000000000ffffffffffffffff6c00000045006e007400690074007900200053007400 -610074006500200050004400550016000000120000000900000007000000090000000f0000000900000016000000090000001100000009000000110000000900 -000016000000180000001800000054000000a800000087020000f0000000550300001501000001000000555507412aac0741870200000f0100000f0000004c00 -0000000000000000000000000000ffffffffffffffff6c00000065006e0074006900740079002000730031002e00610031002e00650031000000110000001200 -00000900000007000000090000000f000000090000001100000012000000090000001100000012000000090000001100000012000000250000000c0000000d00 -0080260000001c0000000300000000000000030000000000000000000000250000000c00000003000000120000000c000000020000000d000000100000000000 -000000000000190000000c000000ffffff0027000000180000000400000000000000ffffff0000000000250000000c00000004000000250000000c0000000500 -0080280000000c00000004000000250000000c00000005000080250000000c00000003000000120000000c0000000100000057000000240000004f0100004b01 -000079040000bf0100000200000052014e017604bc01250000000c00000007000080250000000c00000008000080280000000c00000003000000250000000c00 -000008000080120000000c000000020000000d000000100000000000000000000000190000000c000000ffffff00270000001800000003000000000000000000 -000000000000250000000c0000000300000056000000340000006e040000ae0100008b040000c9010000060000008b04bf016e04c9017204c0017304b7017204 -ae018b04bf01250000000c00000005000080280000000c00000003000000250000000c00000008000080260000001c0000000300000000000000010000000000 -000000000000250000000c00000003000000120000000c000000020000000d000000100000000000000000000000190000000c000000ffffff00270000001800 -00000400000000000000ffffff0000000000250000000c0000000400000056000000800000000d0200004e010000cf030000bf01000019000000aa03bf01b503 -bd01c003b801c803af01cd03a501cf039901cf037401cd036801c8035e01c0035601b5035001aa034e0133024e01270250011c02560114025e010f0268010d02 -74010d0299010f02a5011402af011c02b8012702bd013302bf01aa03bf01250000000c00000005000080280000000c00000004000000250000000c0000000800 -0080280000000c00000003000000120000000c00000001000000160000000c00000018000000180000000c00000000000000250000000c000000020000005400 -0000ac000000750200005e010000660300008301000001000000555507412aac0741750200007d010000100000004c000000000000000000000000000000ffff -ffffffffffff6c00000045006e007400690074007900200053007400610074006500200050004400550016000000120000000900000007000000090000000f00 -00000900000016000000090000001100000009000000110000000900000016000000180000001800000054000000a8000000870200008601000055030000ab01 -000001000000555507412aac074187020000a50100000f0000004c000000000000000000000000000000ffffffffffffffff6c00000065006e00740069007400 -79002000730031002e00610031002e0065003100000011000000120000000900000007000000090000000f000000090000001100000012000000090000001100 -000012000000090000001100000012000000250000000c0000000d000080260000001c0000000300000000000000030000000000000000000000250000000c00 -000003000000120000000c000000020000000d000000100000000000000000000000190000000c000000ffffff0027000000180000000400000000000000ffff -ff0000000000250000000c00000004000000250000000c00000005000080280000000c00000004000000250000000c00000005000080250000000c0000000300 -0000120000000c0000000100000057000000240000006c0100002c020000840400008e0200000200000081042f026f018b02250000000c000000070000802500 -00000c00000008000080280000000c00000003000000250000000c00000008000080120000000c000000020000000d0000001000000000000000000000001900 -00000c000000ffffff00270000001800000003000000000000000000000000000000250000000c0000000300000056000000340000005b0100007d0200007701 -000097020000060000005b018d0274017d027201860273018f02770197025b018d02250000000c00000005000080280000000c00000003000000250000000c00 -000008000080260000001c0000000300000000000000010000000000000000000000250000000c00000003000000120000000c000000020000000d0000001000 -00000000000000000000190000000c000000ffffff0027000000180000000400000000000000ffffff0000000000250000000c00000004000000560000008000 -0000160200002f020000d8030000a002000019000000b303a002be039e02c9039902d1039002d7038602d8037a02d8035502d7034902d1033f02c9033702be03 -3102b3032f023c022f0230023102260237021e023f02180249021602550216027a02180286021e0290022602990230029e023c02a002b303a002250000000c00 -000005000080280000000c00000004000000250000000c00000008000080280000000c00000003000000120000000c00000001000000160000000c0000001800 -0000180000000c00000000000000250000000c0000000200000054000000c00000005c02000053020000920300007802000001000000555507412aac07415c02 -000072020000130000004c000000000000000000000000000000ffffffffffffffff740000005200650071007500650073007400200043006f006e0074007200 -6f006c00200050004400550000001800000011000000120000001200000011000000110000000900000009000000180000001100000012000000090000000b00 -0000110000000700000009000000160000001800000018000000250000000c0000000d000080260000001c000000030000000000000003000000000000000000 -0000250000000c00000003000000120000000c000000020000000d000000100000000000000000000000190000000c000000ffffff0027000000180000000400 -000000000000ffffff0000000000250000000c00000004000000250000000c00000005000080280000000c00000004000000250000000c000000050000802500 -00000c00000003000000120000000c0000000100000057000000240000006c010000dc030000840400002b040000020000008104df036f012804250000000c00 -000007000080250000000c00000008000080280000000c00000003000000250000000c00000008000080120000000c000000020000000d000000100000000000 -000000000000190000000c000000ffffff00270000001800000003000000000000000000000000000000250000000c0000000300000056000000340000005b01 -00001a0400007701000035040000060000005b012a0475011a047301230473012c04770135045b012a04250000000c00000005000080280000000c0000000300 -0000250000000c00000008000080260000001c0000000300000000000000010000000000000000000000250000000c00000003000000120000000c0000000200 -00000d000000100000000000000000000000190000000c000000ffffff0027000000180000000400000000000000ffffff0000000000250000000c0000000400 -0000560000008000000016020000cc030000d80300003c04000019000000b3033c04be033b04c9033504d1032d04d7032204d8031704d803f103d703e603d103 -db03c903d303be03ce03b303cc033c02cc033002ce032602d3031e02db031802e6031602f10316021704180222041e022d042602350430023b043c023c04b303 -3c04250000000c00000005000080280000000c00000004000000250000000c00000008000080280000000c00000003000000120000000c000000010000001600 -00000c00000018000000180000000c00000000000000250000000c0000000200000054000000ac0000007f020000db0300007003000000040000010000005555 -07412aac07417f020000fa030000100000004c000000000000000000000000000000ffffffffffffffff6c00000045006e007400690074007900200053007400 -610074006500200050004400550016000000120000000900000007000000090000000f0000000900000016000000090000001100000009000000110000000900 -000016000000180000001800000054000000a800000090020000030400005e0300002804000001000000555507412aac074190020000220400000f0000004c00 -0000000000000000000000000000ffffffffffffffff6c00000065006e0074006900740079002000730031002e00610031002e00650031000000110000001200 -00000900000007000000090000000f000000090000001100000012000000090000001100000012000000090000001100000012000000250000000c0000000d00 -0080260000001c0000000300000000000000030000000000000000000000250000000c00000003000000120000000c000000020000000d000000100000000000 -000000000000190000000c000000ffffff0027000000180000000400000000000000ffffff0000000000250000000c00000004000000250000000c0000000500 -0080280000000c00000004000000250000000c00000005000080250000000c00000003000000120000000c0000000100000057000000240000004f010000c202 -00007904000036030000020000005201c50276043303250000000c00000007000080250000000c00000008000080280000000c00000003000000250000000c00 -000008000080120000000c000000020000000d000000100000000000000000000000190000000c000000ffffff00270000001800000003000000000000000000 -000000000000250000000c0000000300000056000000340000006e040000250300008b04000040030000060000008b0436036e0440037204370373042e037204 -25038b043603250000000c00000005000080280000000c00000003000000250000000c00000008000080260000001c0000000300000000000000010000000000 -000000000000250000000c00000003000000120000000c000000020000000d000000100000000000000000000000190000000c000000ffffff00270000001800 -00000400000000000000ffffff0000000000250000000c0000000400000056000000800000000d020000c5020000cf0300003603000019000000aa033603b503 -3403c0032f03c8032603cd031c03cf031003cf03eb02cd03df02c803d502c003cd02b503c702aa03c5023302c5022702c7021c02cd021402d5020f02df020d02 -eb020d0210030f021c03140226031c022f032702340333023603aa033603250000000c00000005000080280000000c00000004000000250000000c0000000800 -0080280000000c00000003000000120000000c00000001000000160000000c00000018000000180000000c00000000000000250000000c000000020000005400 -0000a800000068020000e9020000740300000e03000001000000555507412aac074168020000080300000f0000004c000000000000000000000000000000ffff -ffffffffffff6c000000410063006b006e006f0077006c0064006500670065002000500044005500000016000000110000001000000012000000110000001700 -0000070000001200000011000000120000001100000009000000160000001800000018000000250000000c0000000d0000800e00000014000000000000001000 -0000140000000400000003010800050000000b0200000000050000000c02ab04dd0508000000fa0200000d00000000000000040000002d010000040000000201 -0200050000000102ffffff0007000000fc020000ffffff000000040000002d01010007000000fc020100000000000000040000002d01020004000000f0010100 -040000002d010200040000002d010000040000000201010008000000250302002c0196002c01620408000000fa0200000000000000000000040000002d010100 -08000000fa02050000000000ffffff00040000002d01030004000000f00100000400000002010100040000002e011800050000000902000000001c000000fb02 -ceff16000000000090010000000000000020417269616c000000000000000000000000000000000000000000000000000000040000002d0100000f000000320a -4500f700050000004f746865720027000e001c001c00110018000000320a8100ba000b0000004170706c69636174696f6e3121001c001c000c000c0019001c00 -0e000c001c001c001c000000fb021000070000000000bc02000000000102022253797374656d0000000000000000000000000000000000000000000000000000 -040000002d01040008000000fa0200000d00000000000000040000002d0105000400000002010200050000000102ffffff0007000000fc020000ffffff000000 -040000002d010600040000002d01020004000000f0010600040000002d010200040000002d010500040000000201010008000000250302009d0496009b046204 -040000002d010100040000002d01030004000000f0010500040000002d010000040000002d0104000400000002010100040000002e0118000500000009020000 -0000040000002d0100000c000000320a450070040300000041434d0021002400290018000000320a81002b040b0000004170706c69636174696f6e2021001c00 -1c000c000c0019001c000e000c001c001c00040000002d01040008000000fa0200000300000000000000040000002d0105000400000002010200050000000102 -ffffff0007000000fc020000ffffff000000040000002d010600040000002d01020004000000f0010600040000002d010200040000002d010500040000000201 -010008000000250302005201b80076042601040000002d010100040000002d01030004000000f0010500040000002d0103000400000002010200050000000102 -ffffff0007000000fc020000000000000000040000002d01050010000000240306008b0429016e04330172042a0173042101720418018b042901040000002d01 -020004000000f0010500040000002d01030008000000fa0200000100000000000000040000002d0105000400000002010200050000000102ffffff0007000000 -fc020000ffffff000000040000002d0106003600000024031900aa032901b5032701c0032201c8031901cd030f01cf030301cf03de00cd03d200c803c800c003 -c000b503ba00aa03b8003302b8002702ba001c02c0001402c8000f02d2000d02de000d0203010f020f01140219011c0222012702270133022901aa0329010400 -00002d01020004000000f0010600040000002d01030004000000f00105000400000002010100040000002e011800050000000902000000001c000000fb02dfff -0f000000000090010000000000000022417269616c000000000000000000000000000000000000000000000000000000040000002d0105001f000000320ae700 -750210000000456e7469747920537461746520504455160012000900070009000f0009001600090011000900110009001600180018001e000000320a0f018702 -0f000000656e746974792073312e61312e653100110012000900070009000f00090011001200090011001200090011001200040000002d01040008000000fa02 -00000300000000000000040000002d0106000400000002010200050000000102ffffff0007000000fc020000ffffff000000040000002d010700040000002d01 -020004000000f0010700040000002d010200040000002d0106000400000002010100080000002503020052014e017604bc01040000002d010100040000002d01 -030004000000f0010600040000002d0103000400000002010200050000000102ffffff0007000000fc020000000000000000040000002d010600100000002403 -06008b04bf016e04c9017204c0017304b7017204ae018b04bf01040000002d01020004000000f0010600040000002d01030008000000fa020000010000000000 -0000040000002d0106000400000002010200050000000102ffffff0007000000fc020000ffffff000000040000002d0107003600000024031900aa03bf01b503 -bd01c003b801c803af01cd03a501cf039901cf037401cd036801c8035e01c0035601b5035001aa034e0133024e01270250011c02560114025e010f0268010d02 -74010d0299010f02a5011402af011c02b8012702bd013302bf01aa03bf01040000002d01020004000000f0010700040000002d01030004000000f00106000400 -000002010100040000002e01180005000000090200000000040000002d0105001f000000320a7d01750210000000456e74697479205374617465205044551600 -12000900070009000f0009001600090011000900110009001600180018001e000000320aa50187020f000000656e746974792073312e61312e65315511001200 -0900070009000f00090011001200090011001200090011001200040000002d01040008000000fa0200000300000000000000040000002d010600040000000201 -0200050000000102ffffff0007000000fc020000ffffff000000040000002d010700040000002d01020004000000f0010700040000002d010200040000002d01 -06000400000002010100080000002503020081042f026f018b02040000002d010100040000002d01030004000000f0010600040000002d010300040000000201 -0200050000000102ffffff0007000000fc020000000000000000040000002d01060010000000240306005b018d0274017d027201860273018f02770197025b01 -8d02040000002d01020004000000f0010600040000002d01030008000000fa0200000100000000000000040000002d0106000400000002010200050000000102 -ffffff0007000000fc020000ffffff000000040000002d0107003600000024031900b303a002be039e02c9039902d1039002d7038602d8037a02d8035502d703 -4902d1033f02c9033702be033102b3032f023c022f0230023102260237021e023f02180249021602550216027a02180286021e0290022602990230029e023c02 -a002b303a002040000002d01020004000000f0010700040000002d01030004000000f00106000400000002010100040000002e01180005000000090200000000 -040000002d01050024000000320a72025c02130000005265717565737420436f6e74726f6c205044550018001100120012001100110009000900180011001200 -09000b00110007000900160018001800040000002d01040008000000fa0200000300000000000000040000002d0106000400000002010200050000000102ffff -ff0007000000fc020000ffffff000000040000002d010700040000002d01020004000000f0010700040000002d010200040000002d0106000400000002010100 -08000000250302008104df036f012804040000002d010100040000002d01030004000000f0010600040000002d0103000400000002010200050000000102ffff -ff0007000000fc020000000000000000040000002d01060010000000240306005b012a0475011a047301230473012c04770135045b012a04040000002d010200 -04000000f0010600040000002d01030008000000fa0200000100000000000000040000002d0106000400000002010200050000000102ffffff0007000000fc02 -0000ffffff000000040000002d0107003600000024031900b3033c04be033b04c9033504d1032d04d7032204d8031704d803f103d703e603d103db03c903d303 -be03ce03b303cc033c02cc033002ce032602d3031e02db031802e6031602f10316021704180222041e022d042602350430023b043c023c04b3033c0404000000 -2d01020004000000f0010700040000002d01030004000000f00106000400000002010100040000002e01180005000000090200000000040000002d0105001f00 -0000320afa037f0210000000456e7469747920537461746520504455160012000900070009000f0009001600090011000900110009001600180018001e000000 -320a220490020f000000656e746974792073312e61312e653155110012000900070009000f00090011001200090011001200090011001200040000002d010400 -08000000fa0200000300000000000000040000002d0106000400000002010200050000000102ffffff0007000000fc020000ffffff000000040000002d010700 -040000002d01020004000000f0010700040000002d010200040000002d010600040000000201010008000000250302005201c50276043303040000002d010100 -040000002d01030004000000f0010600040000002d0103000400000002010200050000000102ffffff0007000000fc020000000000000000040000002d010600 -10000000240306008b0436036e0440037204370373042e03720425038b043603040000002d01020004000000f0010600040000002d01030008000000fa020000 -0100000000000000040000002d0106000400000002010200050000000102ffffff0007000000fc020000ffffff000000040000002d0107003600000024031900 -aa033603b5033403c0032f03c8032603cd031c03cf031003cf03eb02cd03df02c803d502c003cd02b503c702aa03c5023302c5022702c7021c02cd021402d502 -0f02df020d02eb020d0210030f021c03140226031c022f032702340333023603aa033603040000002d01020004000000f0010700040000002d01030004000000 -f00106000400000002010100040000002e01180005000000090200000000040000002d0105001e000000320a080368020f00000041636b6e6f776c646567652050445500160011001000120011001700070012001100120011000900160018001800040000002d0104000300000000000000}}}}}{ -\par -\par }\pard\plain \s2\sb240\sa60\keepn\widctlpar\outlinelevel1\adjustright \b\i\f1 {Accepting Ownership by Request -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid {Another feature of ACM\rquote s transfer control protocol support is that other applications may request that ACM take control of an aircraft that the other application controls.\page -The Source Code (ACM for Windows only) -\par This section contains some information to help you navigate through the ACM for Windows sources. -\par -\par Here\rquote s a summary of the contents of each of the directories in the source code tree: -\par }{\f2 -\par source\\acm\tab \tab \tab Toplevel directory for ACM for Windows -\par source\\acm\\pc The MFC-based front-end to the simulator -\par This directory holds the main \lquote acm.dsw\rquote -\par VC++ 5.0 project workspace. -\par source\\acm\\pc\\hlp\tab \tab Help files associated with the project -\par source\\acm\\pc\\res\tab \tab Windows resources (bitmaps, icons, \'85) -\par source\\acm\\src\tab \tab C-based flight simulator code -\par source\\acm\\V\\lib\tab \tab The 3D graphics library -\par source\\acm\\V\\test -\par source\\acm\\dis\\lib\tab \tab The DIS/x IEEE 1278 library -\par source\\acm\\dis\\test -\par source\\acm\\dis\\disgen\tab IEEE 1278 protocol compiler -\par source\\acm\\tools\tab \tab Various infrequently used tool sources -\par source\\include\tab \tab Supplemental system header files -\par source\\oncrpc\tab \tab A Windows port of Sun\rquote s ONC RPC libraries -\par source\\rpcgen\tab \tab A Windows port of Sun\rquote s RPCGEN command -\par }\pard\plain \s1\sb240\sa60\keepn\widctlpar\outlinelevel0\adjustright \f1\fs36\cf9\kerning28 {\page {\*\bkmkstart _Toc431273875}Developer Studio Setup }{\fs20 (ACM for Windows only)}{{\*\bkmkend _Toc431273875} -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid {\f2 -\par {\pntext\pard\plain\f1\fs22\cgrid \hich\af1\dbch\af0\loch\f1 1.\tab}}\pard \fi-360\li360\sa120\widctlpar{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec\pnstart1\pnindent360\pnhang{\pntxta .}}\ls2\adjustright { -Install this software (if you are reading this, then you have already done that). -\par {\pntext\pard\plain\f1\fs22\cgrid \hich\af1\dbch\af0\loch\f1 2.\tab}}\pard \fi-360\li360\sa120\widctlpar{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec\pnstart1\pnindent360\pnhang{\pntxta .}}\ls2\adjustright {Ensure Visual C++ 5.0 has been installed -\par {\pntext\pard\plain\f1\fs22\cgrid \hich\af1\dbch\af0\loch\f1 3.\tab}}\pard \fi-360\li360\sa120\widctlpar{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec\pnstart1\pnindent360\pnhang{\pntxta .}}\ls2\adjustright {Install the DirectX Software Development Kit. -\par {\pntext\pard\plain\f1\fs22\cgrid \hich\af1\dbch\af0\loch\f1 4.\tab}}\pard \fi-360\li360\sa120\widctlpar{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec\pnstart1\pnindent360\pnhang{\pntxta .}}\ls2\adjustright { -Several directories included in the source release must be added to the default search directories. From the }{\b Tools>Options\'85}{ menu in Developer Studio select the }{\b Directories}{ tab. Select }{\b Include files}{ in the }{\b -Show Directories for:}{ box. Double click the empty entry at the }{\b\i bottom}{ of the current list and add the }{\b\f2 c:\\sources\\include}{ directory \endash - adjust the directory name to suit the correct ACM for Windows source installation location on your system. -\par {\pntext\pard\plain\f1\fs22\cgrid \hich\af1\dbch\af0\loch\f1 5.\tab}}\pard \fi-360\li360\sa120\widctlpar{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec\pnstart1\pnindent360\pnhang{\pntxta .}}\ls2\adjustright {From the }{\b Tools>Options\'85}{ - menu in Developer Studio select the }{\b Directories}{ tab. Select }{\b Executable files}{ in the }{\b Show Directories for:}{ box. Double click the empty entry at the }{\b\i bottom}{ of the current list and add the }{\b\f2 c:\\bin}{ directory \endash - adjust the directory name to suit the correct ACM for Windows source installation location on your system. -\par {\pntext\pard\plain\f1\fs22\cgrid \hich\af1\dbch\af0\loch\f1 6.\tab}}\pard \fi-360\li360\sa120\widctlpar{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec\pnstart1\pnindent360\pnhang{\pntxta .}}\ls2\adjustright {Double click the empty entry at the }{\b\i bottom}{ - of the current list and add the }{\b\f2 c:\\DXSDK\\sdk\\inc}{ directory \endash adjust the directory name to suit the correct DirectX Software Development Kit installation location on your system. }{\i\ul -Use the arrow keys to move this item to the top of the directory list}{. If you do not do this, Visual C++ will incorrectly use the DirectX version 2 include files that shipped with VC++ 5.0. -\par {\pntext\pard\plain\f1\fs22\cgrid \hich\af1\dbch\af0\loch\f1 7.\tab}}\pard \fi-360\li360\sa120\widctlpar{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec\pnstart1\pnindent360\pnhang{\pntxta .}}\ls2\adjustright {From the }{\b Tools>Options\'85}{ - menu in Developer Studio select the }{\b Directories}{ tab. Select }{\b Library files}{ in the }{\b Show Directories for:}{ box. Double click the empty entry at the }{\b\i bottom}{ of the current list and add the }{\b\f2 c:\\DXSDK\\sdk\\lib }{ -directory \endash adjust the directory name to suit the correct DirectX Software Development Kit installation location on your system. }{\i\ul Use the arrow keys to move this item to the top of the directory list}{ -. If you do not do this, Visual C++ will incorrectly use the DirectX version 2 library files that shipped with VC++ 5.0. -\par {\pntext\pard\plain\f1\fs22\cgrid \hich\af1\dbch\af0\loch\f1 8.\tab}}\pard \fi-360\li360\sa120\widctlpar{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec\pnstart1\pnindent360\pnhang{\pntxta .}}\ls2\adjustright { -Open the main ACM for Windows VC++ workspace. It is named }{\b\f2 \\source\\acm\\pc\\acm.dsw}{ -\par }\pard \sa120\widctlpar\adjustright { -\par The basic workspace includes five projects: -\par -\par acm\tab \\source\\acm\\pc\\acm.dsp\tab \tab \tab The main program -\par fsim\tab \\source\\acm\\src\\fsim.dsp\tab \tab \tab the flight simulation library -\par vlib\tab \\source\\acm\\V\\lib\\vlib.dsp\tab \tab \tab the 3D graphics library -\par dis\tab \\source\\acm\\dis\\lib\\dis.dsp\tab \tab the IEEE 1278 DIS library -\par disgen\tab \\source\\acm\\dis\\disgen\\disgen.dsp\tab \tab a DIS header file generator -\par }\pard\plain \s1\sb240\sa60\keepn\widctlpar\outlinelevel0\adjustright \f1\fs36\cf9\kerning28 { -\par {\*\bkmkstart _Toc431273876}Building ACM on UNIX Systems{\*\bkmkend _Toc431273876} -\par }\pard\plain \s20\widctlpar\adjustright \f2\fs20\cgrid { -\par ACM can be downloaded from the Web Simulations site (}{\field{\*\fldinst { HYPERLINK http://www.websimulations.com }{{\*\datafield -00d0c9ea79f9bace118c8200aa004ba90b0200000017000000170000007700770077002e00770065006200730069006d0075006c006100740069006f006e0073002e0063006f006d000000e0c9ea79f9bace118c8200aa004ba90b3e00000068007400740070003a002f002f007700770077002e0077006500620073006900 -6d0075006c006100740069006f006e0073002e0063006f006d002f0000000000000000}}}{\fldrslt {\cs21\ul\cf2 www.websimulations.com}}}{) as a gzipped tar archive. Upack the source tree: -\par -\par }\pard \s20\li720\widctlpar\adjustright {$ zcat acm-5.0.tar.gz | tar xvf \endash -\par }\pard \s20\widctlpar\adjustright { -\par To build ACM, type: -\par -\par }\pard \s20\li720\widctlpar\adjustright {$ cd acm-5.0 -\par }\pard \s20\widctlpar\adjustright {\tab $ ./configure -\par \tab $ make -\par -\par On systems where X11 is installed in an unusual location, configure may have trouble locating the X include files and libraries (you'll know that because the compiler will complain that it can't find files like "X11/X.h"). -If this problem crops up, you can help configure to set up the Makefiles by telling it where to find X11: -\par -\par \tab $ x_includes=/usr/myX11/include; export x_includes -\par \tab $ x_libraries=/usr/myX11/lib; export x_libraries -\par \tab $ ./configure -\par \tab $ make -\par -\par By default, configure will compile ACM using gcc if gcc is found in your PATH environment variable. Some combinations of gcc and OS platforms have problems with ACM (gcc 2.2.2 seems to have problems on SunOS and HP-UX, for example). You can override conf -igure's selection of gcc: -\par -\par \tab $ CC=cc; export CC -\par \tab $ ./configure -\par \tab $ make -\par }\pard\plain \s1\sb240\sa60\keepn\widctlpar\outlinelevel0\adjustright \f1\fs36\cf9\kerning28 {\page {\*\bkmkstart _Toc431273877}Defining New Scenes{\*\bkmkend _Toc431273877} -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid {The scene file defines the visible ACM \ldblquote world\rdblquote . It should be stored as a UNIX format ASCII text file. Records are delimited by line termin -ators (ASCII linefeeds). Fields in a record are separated by one or more spaces or tab characters. -\par }{\b NOTE:}{ This document describes the elements of the scene file format that are currently used by ACM. Some elements may be seen in distributed scene files th -at are not processed by the current version of ACM. In effect, ACM treats those undocumented elements as comments. -\par On startup, ACM uses the \lquote }{\f2 default-scene\rquote }{ file from the \lquote }{\f2 objects/}{\rquote directory. With ACM for UNIX, you can override this default by specifying the \lquote -s scene-file-pathname\rquote option. -\par The general format of the file follows this layout: -\par -\par }\pard \li720\sa120\widctlpar\adjustright { -\par -\par -\par -\par }\pard\plain \s5\li720\sa120\keepn\widctlpar\outlinelevel4\adjustright \b\f2\fs22\cgrid {FEATURES -\par }\pard\plain \li720\sa120\widctlpar\adjustright \f1\fs22\cgrid { -\par }\pard\plain \s2\sb240\sa60\keepn\widctlpar\outlinelevel1\adjustright \b\i\f1 {{\*\bkmkstart _Toc431273878}Team Locations{\*\bkmkend _Toc431273878} -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid { -ACM groups participants (players) into two teams. The scene file defines the initial location for each team. Typically, this location will be positioned and oriented at the end of a runway at the player\rquote s \ldblquote home\rdblquote airport. - -\par }\pard\plain \s3\sa120\keepn\widctlpar\outlinelevel2\adjustright \b\f1\fs22\cgrid {Example -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid {\b\f2 32-58-18.798N 096-50-16.604W 644.0 154 -\par }\pard\plain \s3\sa120\keepn\widctlpar\outlinelevel2\adjustright \b\f1\fs22\cgrid {Fields -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid {Latitude -\par Longitude -\par Altitude (ft, MSL) -\par Initial Heading (degrees, true) -\par }\pard\plain \s2\sb240\sa60\keepn\widctlpar\outlinelevel1\adjustright \b\i\f1 {{\*\bkmkstart _Toc431273879}Ground Color{\*\bkmkend _Toc431273879} -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid {An X11-style }{\b\f2 (#RRGGBB)}{\f2 }{color specification defining the color of the ground. Red, green and blue color components are hexadecimal value from 00 to FF. -\par }\pard\plain \s2\sb240\sa60\keepn\widctlpar\outlinelevel1\adjustright \b\i\f1 {{\*\bkmkstart _Toc431273880}Runway record{\*\bkmkend _Toc431273880} -\par }\pard\plain \s18\sa120\widctlpar\adjustright \b\f2\fs16 {RWY ADM 17/35 762 6879 150 34-18-43.074N 097-01-24.530W 34-17-35.031N 097-01-25.130W 495 830 -\par }\pard\plain \s3\sa120\keepn\widctlpar\outlinelevel2\adjustright \b\f1\fs22\cgrid {Fields}{\f2\fs12 -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid {Record Identifier: \lquote RWY\rquote -\par Three/Four letter airport code -\par Runway identifier -\par Runway Altitude (ft, MSL) -\par Near End Latitude -\par Near End Longitude -\par Reciprocal End Latitude -\par Reciprocal End Longitude -\par Near End displaced threshold -\par Reciprocal End displaced Threshold -\par }{\f2\fs12 -\par }\pard\plain \s2\sb240\sa60\keepn\widctlpar\outlinelevel1\adjustright \b\i\f1 {{\*\bkmkstart _Toc431273881}TACAN Record}{\f2\fs12 {\*\bkmkend _Toc431273881} -\par }\pard\plain \s18\sa120\widctlpar\adjustright \b\f2\fs16 {NAV NBE TACAN 32-44-05.152N 096-58-00.211W 463 08E 108.3 020X -\par }\pard\plain \s3\sa120\keepn\widctlpar\outlinelevel2\adjustright \b\f1\fs22\cgrid {Fields -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid {Record Identifier: \lquote NAV\rquote -\par Three/Four Letter identifier -\par NAVAID Type: \lquote TACAN\rquote -\par Latitude -\par Transmitter Longitude -\par Transmitter Altitude (ft, MSL) -\par Magnetic variation at station (degrees east or west) -\par VHF Frequency (MHz) -\par TACAN channel number}{\fs12 -\par }\pard\plain \s2\sb240\sa60\keepn\widctlpar\outlinelevel1\adjustright \b\i\f1 {{\*\bkmkstart _Toc431273882}ILS Record{\*\bkmkend _Toc431273882} -\par }\pard\plain \s18\sa120\widctlpar\adjustright \b\f2\fs16 {ILS 30 ILS IAIW 108.9 34-18-47.161N 097-01-38.280W 34-17-59.533N 097-00-35.018W 729.2 06E 4.92 309 3.00 -\par }\pard\plain \s3\sa120\keepn\widctlpar\outlinelevel2\adjustright \b\f1\fs22\cgrid {Fields -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid {Record Identifier: \lquote ILS\rquote -\par Runway Identifier: -\par ILS Type: either \lquote ILS\rquote , \lquote ILS/DME\rquote , \lquote LOCALIZER\rquote , or \lquote LOC/DME\rquote -\par Four letter Identifier -\par VHF Frequency (MHz) -\par Localizer Transmitter Latitude -\par Localizer Transmitter Longitude -\par Glide Slope Transmitter Latitude (\lquote -\lquote for Localizer-only approaches) -\par Glide Slope Transmitter Longitude (\lquote -\lquote for Localizer-only approaches) -\par Glide Slope transmitter altitude (ft, MSL) (\lquote -\lquote for Localizer-only approaches) -\par Magnetic variation at localizer station (degrees, east or west) -\par Localizer width (degrees) -\par Localizer bearing (degrees, magnetic) -\par Glide slope angle (degrees) (\lquote -\lquote for Localizer-only approaches) -\par -\par }\pard\plain \s2\sb240\sa60\keepn\widctlpar\outlinelevel1\adjustright \b\i\f1 {{\*\bkmkstart _Toc431273883}Features{\*\bkmkend _Toc431273883} -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid {Use feature records to place objects in an ACM scene. -\par }\pard\plain \s2\sb240\sa60\keepn\widctlpar\outlinelevel1\adjustright \b\i\f1 {{\*\bkmkstart _Toc431273884}Feature Record{\*\bkmkend _Toc431273884} -\par }\pard\plain \s18\sa120\widctlpar\adjustright \b\f2\fs16 {\fs22 tower.obv 32-58-04.800N 096-50-16.800W 644 0 -\par }\pard\plain \s3\sa120\keepn\widctlpar\outlinelevel2\adjustright \b\f1\fs22\cgrid {Fields -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid {Object filename -\par Latitude -\par Longitude -\par Altitude (ft, MSL) -\par Orientation angle (degrees, true) -\par }\pard\plain \s1\sb240\sa60\keepn\widctlpar\outlinelevel0\adjustright \f1\fs36\cf9\kerning28 {\page {\*\bkmkstart _Toc431273885}Defining New Aircraft{\*\bkmkend _Toc431273885} -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid { -\par The stout-of-heart may be interested in creating new aircraft t -ypes. Some of this information must be generated by hand, but I did create a program to help me generate aircraft objects: GEDIT. GEDIT is a rudimentary Motif program that allows you to create 3-dimensional objects. It is available from me. -\par -\par The syntax of this file is not complex. -\par -\par }\pard\plain \s18\sa120\widctlpar\adjustright \b\f2\fs16 {# Aircraft Inventory for ACM 5.0 -\par # See ACM-Bibliography for further information about the sources of this -\par # information. -\par # MiG-29 Fulcrum -\par # MiG-29M information was derived from two sources: [Spick87] and [AirI Aug92]. -\par -\par aircraft "MiG-29" \{ -\par Object "mig29.obj" -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid { -\par The visual description of an ACM aircraft is stored separately in V-library format. This file describes a set of polygons that roughly approximates the shape of the actual air plane. I used GEDIT to create most of the ACM aircraft objects. -\par -\par }\pard\plain \s18\sa120\widctlpar\adjustright \b\f2\fs16 { WingArea 400.0 # (wingS) Wing surface area (ft^2) -\par WingHalfSpan 18.87 # (wings) Wing half-span (ft) -\par Chord 9.61 # (c) Mean geometric chord of wing (ft) -\par AspectRatio 3.56 # (aspectRatio) aspect ratio -\par EmptyWeight 22500.0 #(emptyWeight) Empty weight (lb) -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid { -\par These values are usually quoted with an aircraft's performance figures. -\par -\par }\pard\plain \s18\sa120\widctlpar\adjustright \b\f2\fs16 { # (I(x,y,z)) Moments of inertia -\par Ixx 10000.0 -\par Iyy 75000.0 -\par Izz 80000.0 -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid { -\par These are hard values to simple guess. I have grabbed values where they were available and simply guessed sometimes, too. -\par Moments of inertia in an actual aircraft are not constant. Most notably, as an aircraft burns fuel, it's weight distribution, center-of-gravity, and moments of inertia change. In ACM, however, moments of inertia and CG do not change. -\par -\par }\pard\plain \s18\sa120\widctlpar\adjustright \b\f2\fs16 { # (cFlap) Lift due to flaps (yields Clift of 1.0 at max extension) -\par CFlap 0.64279 -\par CLNegStall 17.0 # (deg) -\par CLPosStall 30.0 # (deg) -\par BetaStall 15.0 # (deg) -\par CFlapDrag 0.0467 # (cFlapDrag) Drag due to Flaps -\par CGearDrag 0.03 # (cGearDrag) Drag due to Gear -\par CSpeedBrake 0.03 # (cSpeedBrake) Drag due to Speed Brake -\par # at 90 degrees -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid { -\par }\pard\plain \s18\sa120\widctlpar\adjustright \b\f2\fs16 { # (CDb) Drag Characteristic equation [Wave+body] -\par # independent variable is mach number -\par -\par CDb \{ # (CDb) Drag Characteristic equation [Wave+body] -\par # independent variable is mach number -\par 0.0, 0.020, -\par 0.2, 0.020, -\par 0.95, 0.015, -\par 1.05, 0.045, -\par 2.00, 0.030, -\par 10.0, 0.030 -\par \} -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid { -\par In ACM, wave/body d -rag coefficient is a function of the airspeed expressed as a Mach number. Less drag makes for a faster aircraft. This function generally has a maximum near Mach 1.0. You probably should not change this table unless you really know what you're doing. - -\par -\par }\pard\plain \s18\sa120\widctlpar\adjustright \b\f2\fs16 { CLift \{ # (CLift) Lift-slope curve (vs alpha) -\par -3.0, 0.0, -\par -1.05, 0.0, -\par -0.576, -2.199, -\par -0.556, -2.23, -\par -0.524, -2.199, -\par 0.524, 2.199, -\par 0.556, 2.23, -\par 0.576, 2.199, -\par 1.05, 0.0, -\par 2.0, 0.0 -\par \} -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid { -\par -\par Lift is defined by the equation : -\par -\par -\par -\par -\par Where r is the air density, S is the wing reference area (ft^2), and V is the airspeed (ft/ sec), and CL is the coefficient of lift. -\par -\par In ACM, the coefficient of lift is purely a function of angle of attack (alpha). -\par -\par -\par FIGURE 10 LIFT COEFFICIENT TABLE -\par -\par -\par -\par }\pard\plain \s18\sa120\widctlpar\adjustright \b\f2\fs16 { CnBeta \{ # (CnBeta) Yaw due to sideslip equation -\par 0, -0.08125, -\par 0.523540, -0.078125, -\par 0.785340, -0.0609375, -\par 1.047198, 0.125, -\par 1.58, 0.0 -\par \} -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid { -\par In ACM negative yaw due to sideslip means that the aircraft is "weathercock stable", that is, the plane tends to yaw in a way that reduces the sideslip component. -\par -\par -\par ClBeta \{ # (ClBeta) Roll due to sideslip equation -\par 0, -0.0125, -\par 0.43633, -0.015, -\par 0.78540, 0.125, -\par 1.58, 0.0, -\par 3.142, 0.125, -\par -\par -\par -\par \} -\par -\par -\par -\par A negative value means that the aircraft will roll in the opposite direction of the sideslip component, tending to make the aircraft more stable. -\par -\par }\pard\plain \s18\sa120\widctlpar\adjustright \b\f2\fs16 { CDBOrigin 0 # (CDBOrigin, CDBFactor) Drag due to sideslip -\par CDBFactor 0.5 -\par CDBPhase 0 # (CDBPhase) sideslip drag phase (deg) -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid { -\par CDB values define the body drag added by sideslip on the aircraft. -\par -\par }\pard\plain \s18\sa120\widctlpar\adjustright \b\f2\fs16 { CYBeta -0.85 # (CYbeta) Side-force from side-slip [dCY/dBeta] -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid { -\par CYBeta is the "lift" due to sideslip. This is the factor that allows to roll 90 degrees from level, kick the rudder a lot, and still stay level. Not all simulators take this into account. -\par -\par -\par -\par }\pard\plain \s18\sa120\widctlpar\adjustright \b\f2\fs16 { EffElevator 0.60 # (effElevator) Elevator effectiveness -\par EffRudder 0.35 # (effRudder) Rudder effectiveness -\par MaxRudder 20 # (maxRudder) max Rudder (deg) -\par SeTrimTakeoff 0 # (SeTrimTakeoff) Elevator trim at takeoff (deg) -\par MaxAileron 20 # (maxAileron) max Aileron (deg) -\par MaxFlap 20 # (maxFlap) max flap setting (deg) -\par -\par # (flapRate) flap extension rate (about 2 secs to fully extend flaps) -\par -\par FlapRate 10 # (deg/sec) -\par -\par # (gearRate) gear extension rate (about 3 secs to fully extend gear) -\par -\par GearRate 30 # (deg/sec) -\par MaxSpeedBrake 80 # (maxSpeedBrake) max Speed Brake setting (deg) -\par -\par # (speedBrakeRate) rate of speed brake extension (2 secs to full ext) -\par -\par SpeedBrakeRate 40 # (deg/sec) -\par -\par # (speedBrakeIncr) speed Brake increment per keystroke -\par -\par SpeedBrakeIncr 80 # (deg) -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid { -\par These values determine the charact -eristics of the aircraft's speed brakes (speed brakes are used in the air, wheel brakes are used on the ground). MaxSpeedBrake deter mines the maximum extension of the speed brake panels. SpeedBrakeIncr deter mines how far one press of the (S) key will in -crease the speed brake extension. It does not need to be an even increment of MaxSpeedBrake. SpeedBrakeRate deter mines how fast the brakes will deploy or retract. -\par -\par }\pard\plain \s18\sa120\widctlpar\adjustright \b\f2\fs16 { Clda 0.048 # (Clda) roll moment from aileron offset -\par Cldr 0.004 # (Cldr) roll moment from rudder offset -\par Clp -0.27 # (Clp) roll damping -\par Cmq -8.0 # (Cmq) pitch damping factor -\par Cnr -2.0 # (Cnr) yaw damping factor -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid { -\par These factors characterize some of the roll, pit -ch and yaw characteristics of the aircraft. They are in the NACA form. Damping factors determine how quickly an aircraft returns to a steady state after some change in control input. Larger negative damping factors make for a more stable aircraft. -\par }\pard\plain \s18\sa120\widctlpar\adjustright \b\f2\fs16 { -\par CmAlpha -0.30 # (cmSlope) CmAlpha curve slope -\par CmFactor -0.20 # (cmFactor) CmAlpha factor when stalled -\par MaxFuel 9750 # (maxFuel) maximum internal fuel (lb) -\par -\par # engine lag factor (how fast does it respond to throttle changes -\par -\par EngineLag -3.0 -\par -\par # Engine data based on updated RD-33K engines cited in [AirI Aug89]. -\par # (maxThrust) max static thrust, military power (lb) -\par -\par MaxThrust 27000 -\par -\par # (maxABThrust) max static thrust, afterburner on (lb) -\par -\par MaxABThrust 44000 -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid { -\par Maximum static military and afterburner thrust values can usually be found in documents that describe aircraft performance. -\par -\par }\pard\plain \s18\sa120\widctlpar\adjustright \b\f2\fs16 { Thrust \{ # (Thrust) Mach Number vs. thrust -\par 0, 1, -\par 1.7, 1.5, -\par 2.0, 0.84, -\par 5, 0.5 -\par \} -\par ABThrust \{ # (ABThrust) afterburner thrust table -\par 0, 1, -\par 0.5, 1, -\par 1, 1.21, -\par 1.7, 1.7, -\par 5, 1.64 -\par \} -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid { -\par The Thrust and ABThrust corrects the static thrust value for the aircraft's Mach number. Unless you have hard information about this, leave these fields alone. -\par -\par }\pard\plain \s18\sa120\widctlpar\adjustright \b\f2\fs16 { # (spFuelConsump) specific fuel consump(lb fuel/lb T x hr) -\par -\par SpFuelConsump 0.68 -\par -\par # (spABFuelConsump) AB specific fuel consump(lb fuel/lb T x hr) -\par -\par SpABFuelConsump 2.55 -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid { -\par These fields define the specific fuel consumption (fuel consumed per pound of thrust per hour). Unless you have hard information about this, leave these fields alone. -\par -\par }\pard\plain \s18\sa120\widctlpar\adjustright \b\f2\fs16 { # (groundingPoint) hypothetical single point of contact w/ground -\par -\par GroundingPoint \{ 0, 0, 4.222 \} -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid { -\par GroundingPoint is best calculated using too -ls/balance.c. It defines a good initial guess of the "rest" Z position for a newly created aircraft. To be more accurate, I should make this a singe Z value and then add an initial rest pitch, as well. Since I don't, this is why you see an aircraft pitch -a bit just after it is created. -\par -\par }\pard\plain \s18\sa120\widctlpar\adjustright \b\f2\fs16 { # (viewPoint) pilot's viewing location wrt CG -\par -\par ViewPoint \{ 14.75, 0, -5.375 \} -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid { -\par -\par This is the XYZ location relative to the aircraft center of gravity that locates the pilot's eye view outside of the cockpit. -\par -\par }\pard\plain \s18\sa120\widctlpar\adjustright \b\f2\fs16 { # Landing Gear control parameters -\par -\par MuStatic 0.08 # (muStatic) static coeff of friction no-brakes -\par MuKinetic 0.05 # (muKinetic) moving coeff of friction no-brakes -\par MuBStatic 0.7 # (muBStatic) static brakes-on -\par MuBKinetic 0.6 # (muBKinetic) moving brakes-on -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid { -\par These four values characterize the amount of friction that the wheels generate when in contact with the ground. The maximum theoretical value of any of these is 1.0. -\par -\par }\pard\plain \s18\sa120\widctlpar\adjustright \b\f2\fs16 { MaxNWDef 72 # (maxNWDef) maximum nosewheel deflection (deg) -\par NWIncr 0.0397 # (NWIncr) deflection for each unit (1.27/32) -\par MaxNWS 85 # (maxNWS) maximum NWS velocity (fps) -\par -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid {You can probably just leave these three nose-wheel steering parameters alone. -\par -\par }\pard\plain \s18\sa120\widctlpar\adjustright \b\f2\fs16 { # (rm) location of main gear attachments -\par -\par Rm \{ -2.206000, 0.000000, 1.702 \} -\par -\par # (rn) location of nose gear attachments -\par -\par Rn \{ 9.395000, 0.000000, 1.807 \} -\par -\par Dm 10000 # main oleo damping factor (lbs-ft/sec) -\par Dn 80 # nose oleo damping factor (lbs-ft/sec) -\par -\par Km 18220.7 # main oleo spring factor -\par Kn 4278.34 # nose oleo spring factor -\par -\par Gm 1.5 # main strut length with tire (ft) -\par Gn 1.5 # nose strut length with tire (ft) -\par -\par CmMax 1.0 # (cmMax) main max oleo extension distance (ft) -\par CnMax 1.5 # (cnMax) nose max oleo extension distance (ft) -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid { -\par Landing gear parameters are difficult to estimate. GEDIT can be used to determine cor rect landing gear locations. I then use the program tools/balance.c to generate the appropriate values for these factors for each new aircraft type that I - create. Note that neither GEDIT nor balance.c currently calculate oleo damping factors. -\par -\par }\pard\plain \s18\sa120\widctlpar\adjustright \b\f2\fs16 { # (tailExtent) as we rotate, this part may drag -\par -\par TailExtent \{ -18.165, 0.0, 1.191 \} -\par -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid {This defines where the aft-most lower part of the aircr -aft is located. This is the part of the plane that may scrape the ground as we rotate. This value is not currently used. Instead we simply limit up-pitch on the ground to 20 degrees. -\par -\par }\pard\plain \s18\sa120\widctlpar\adjustright \b\f2\fs16 { StructurePoints 15 # (structurePts) maximum structural damage -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid { -\par This value characterizes how much damage can be absorbed by the plane before it sim ply explodes. -\par -\par }\pard\plain \s18\sa120\widctlpar\adjustright \b\f2\fs16 { # Radar data based on N-019 Pulse Doppler radar cited in [AirI Aug89]. -\par -\par RadarOutput 15000 # (radarOutput) radar output (watts) -\par RadarTRange 38 # (radarTRange) tracking radar range (nm) -\par RadarDRange 55 # (radarDRange) detection radar range (nm) -\par TEWSThreshold 0 # Radar Warning Receiver threshold (watts) -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid { -\par If you have any information about the radar capabilities of the aircraft, here's the place for them. The detection range is the maximum range that a target can be seen on radar. No attempt is made to take i -nto account the radar cross section of the target. The track ing range is the range required to get a lock onto the target. -\par -\par }\pard\plain \s18\sa120\widctlpar\adjustright \b\f2\fs16 { # Weapons -\par -\par WeaponCount 9 -\par HardPoint0 \{ 7.0, -4.0, 0.0 \} -\par HardPoint1 \{ 0.357, 15.6, 0.0 \} -\par HardPoint2 \{ 0.357, -15.6, 0.0 \} -\par HardPoint3 \{ 1.5, 9.0, 2.0 \} -\par HardPoint4 \{ 1.5, -9.0, 2.0 \} -\par HardPoint5 \{ 1.5, 8.0, 1.5 \} -\par HardPoint6 \{ 1.5, -8.0, 1.5 \} -\par HardPoint7 \{ 1.5, 10.0, 1.5 \} -\par HardPoint8 \{ 1.5, -10.0, 1.5 \} -\par -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid {These are the XYZ locations relative to the aircraft CG of each weapon. By defining these, each missile or cannon fires from its appropriate location on the aircraft. -\par -\par }\pard\plain \s18\sa120\widctlpar\adjustright \b\f2\fs16 { WeaponStation 0 "m61a1" 500 0 0 -\par WeaponStation 1 "aim9m" 0 0 0 -\par WeaponStation 2 "aim9m" 0 0 0 -\par WeaponStation 3 "aim9m" 0 0 0 -\par WeaponStation 4 "aim9m" 0 0 0 -\par WeaponStation 5 "aim9m" 0 0 0 -\par WeaponStation 6 "aim9m" 0 0 0 -\par WeaponStation 7 "aim9m" 0 0 0 -\par WeaponStation 8 "aim9m" 0 0 0 -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid { -\par The WeaponStation directive defines the type of weapon located at each hard point. The only currently defined weapon types are "m61a1" for Vulcan cannons and "aim9m" for Sidewinder missiles. Three extra weapon-defined intege -r fields are provided. These fields have no meaning for "aim9m" missiles. The first field defines the initial number of rounds supplied to "m61a1" cannons. -\par -\par }\pard\plain \s1\sb240\sa60\keepn\widctlpar\outlinelevel0\adjustright \f1\fs36\cf9\kerning28 {\page {\*\bkmkstart _Toc431273886}Starting ACM for Windows{\*\bkmkend _Toc431273886} -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid {\fs20\cf9 {\*\shppict{\pict{\*\picprop\shplid1032{\sp{\sn shapeType}{\sv 75}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn pibName}{\sv \'46\'3a\'5c\'73\'6e -\'61\'70\'73\'68\'6f\'74\'5c\'61\'63\'6d\'5c\'70\'63\'5c\'68\'6c\'70\'5c\'73\'65\'73\'73\'69\'6f\'6e\'33\'2e\'62\'6d\'70}}{\sp{\sn pibFlags}{\sv 2}}{\sp{\sn fillColor}{\sv 268435473}}{\sp{\sn fFilled}{\sv 0}}{\sp{\sn fLine}{\sv 0}}} -\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0\picw13545\pich10158\picwgoal7679\pichgoal5759\pngblip\bliptag309629549{\*\blipuid 1274926df34e41bf2cdce34a85182d48} -89504e470d0a1a0a0000000d4948445200000200000001800403000000290ec78c0000000467414d410000b1889598f4a600000030504c544500000080000000 -8000808000000080800080008080808080c0c0c0ff000000ff00ffff000000ffff00ff00ffffffffff7b1fb1c4000000097048597300000ec400000ec401952b -0e1b00000b9b49444154789ced9dbb969cba12861538a86c5e69071d9c8c5771e6f028f05aa3ccaf3a016b6d676cd5452068a081e1de7f4ddbdd0821541fa542 -c54572e186e2abe9e2feccc87c15f93923affb73f4e1da40e601f8fdb89bfc0f00de1340612afd785b00ea003e1700a8e4d348d52eb88c29553bed8cf23d00ad -924ad6395b7c3c6539a314c153fc2c00505465bba4ab02082efe2d04501555b4f3475516fc29585f5ee4359501906c9cd6e175168900bca325002afee3c35e94 -a278b280b858a605711395a469aef309fb00b7c807d40058c97832493a47f51f390035893303586a015506a0fea906d1b2004d3b3180653e202a589475131803 -509d1cc0c2b34002201e4e9bc0439da0f2683bc1330358dc0fb88700c02f95b705f08f53795b00b500002e8901000000000000000000000000000000000000c0 -3400249f9610d90a112f1f5be37d18914e418e7a12539903dbe43946f7d52bab0278aeafefadae6f7e506785b71d645fcf5bf754c0f6b50f00ff0c7a35005a5a -ebeb796b3a1800abeb5dac0339bec122bf89ef3490772469c1b968cdde938fcb9e0d5b5249b70a9e7fb0bdf36ade9cff12002fe568aa2c5856d9488ae594582a -39c9652b799731957f0c805b11801c57928f28147f10eb47c224fef4fae1f64fa44b9a413e720cf9ff98ec343199822329b92e3d6881719752042779b580a6b4 -607b120bb01fbb02e0bb6c862229c8ba39a78a13ff946c7d001899333db4685e94a454347fc7c2ccf2b9d8068073ba322400b2e3bd01e831cb15940a851a40b0 -13433f0029c1d7455368ca0df506be3ef01d0bb0dd6400e6a8ff3d003e3bee75136800f8068056dad9564f00ea26e07555d3043a00a80160a5a5727200bb3401 -76537adc5d6a02e604a54aea04154a7282816cab109213140dc4336a4be7a4c609fa4e13d08cce9b3985da094a125bbe68bf83131c91b19dcfaad8843dad52de -ba0046fdcf2cdff452dc4a40110b00c05a0048bc5ce72c44a115220d6ce9b5ffa319bc6b3ab41a19d8a9ddabefed6edbee006b1c464461a22c8b057ad5d0d3b9 -6f169fabda2f7a0e4d9b52762a4f0074c1f7783e29354bf3e9243dac725bce03806a00610c405fa959ea3e0052b042ed10c791f557a47f2affcb3a096752a0c2 -ff4b37417b07bca43d875a25e9dbcbdaa67f645d2159e470c84230dd88bfa4b721f8b9b948efe3a9b9ac0740096bffade9e06a1f50fa22d6290bba4e3b3916a8 -784afd48eb27f601a0d491ccdc82371f907520adf7a45d2beb04da6ead465b01883108f7d17a01b029b816003200294232001222d90510df5c51203ddc9c53ed -23b700b579a9401343f501e0d878529770a905041ab3803004c0aea6901d7a9fce13be71110640d5f60300c87cceb8054c91c54d200168421c039054ef07e033 -00ad265057b8134bd5009c9d05f218aa01e0c92e2f24005989ab03b060c500d4214e72821a8ef8cc09ea61d335c95151e604b51f60a6a30d3e39416f00587feb -07387570e67a130009a45ce3042de0da06404b463153e77bca368b64e6558046be0d601c33cd4a5e2e7e71898805006001009f4296692d6f71fbdc43965f134c -a7ea97bba04d15f8ae2cbd3142e2781c00d85d1e3973079f07472e58bce27cba13643781ea98e80cb2f4de2005edf686fc1237e55d630a8a41ae8b676beabb46 -47aaddc87a00b86fe7da00345e61001298680cc9618ec54467904500ea5b5d2d00da716f5b40a0640121c530c9775e18008917f06d00ce9a401d1c51a863a6be -267075004d3fc01c5c7282757044c1e215efedea8c053029cc390781f57b82b4718d5796d5014c8a414f24880500000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000006055009fbf16c8ff57d8f180ec0fc02d900d4d6f7f001f33f698040056d8f1 -8000c06200943f15ebe53dddfaf5e611f9fcf872aefafaba19007d0bba7788838e440055f551dd0040eb8177d2a4be210e3a721f00f2ce407a3b88820eea662f -7f3b37f84e9002884dc0c51f53fdc13901f8fa8d083beef5100763ef04251ff0c57ee05e0064b8ab90bdca3f04402c2062b819806c88834900aaea2600eceda0 -34e4074d0610ddc0d43d9f1640f676105913907ec0c86b7199139c6c0027053026c37da1bc27785b007e64fc960cc0e41670390063729f5860a100c0928dee04 -60d90cf62bec78407051140000000000000000000000000000000000600f008b1e90582e7fcf0760c903128b854e0860c915a1d992f43e2500bf83fcd51aff7b -4a003f769852fdaf2afe794a00bfb707f0cfa901fc281f8fb228ba95aeaaf67261ff1e925d5717157f4a49abaa5257f6c86e16d07a20429e117939d157b40051 -a00ba0e853a60660abcb47291f63300860370b68dd014b03e6bf02f0231ec65e00cf2289adec0c40124601440b8887c26d0f80ef8bce06f09b15884da07c54d1 -b44bb6e92a597c51946cee25ffe22fd6d4b2f700606b889b579cbb2a32166c013c8ce91e00c8a5493f1c3f1523330bc8bd627ade9902f8514629a24aa225eb51 -898d9bdaacac7c04079bbe647f48938f69152f8b0f10000241b76b59800c62b935009d4dcd46c76ce68c78f17cc06fd5a83400ac51645088ab5300ac9b1cf4e2 -d100882b4ab1780360165036db757c00ed07807fb80e80216fc816205a260b50c7f6c80188960d004b2b93532c8bc70b007b9d05584baa8796ed58c080b005a8 -465cef47f5a801b0bd57fa65708a1c40deee1380223581aac702760040369b876f01b0e93e069b40ea0748b32e1fda04629b8e5f95aa5c090f750a753f40db7d -59f703d820ca5297ab832c4001d8a41f36e0b8b5871127f83b3f610d9cfbbf29c7f604c7c74c6ec702d553dd8bfe33fb3c393416f0f402c02ed1a05d0f39652c -30638f8be5ebc41744562863869c0fc0b2274416cbf9009c4d00000000000000000000000000000000000000000000000000606b00184768c9d36e777a6d6ed6 -6571dbc6bf2d00bb84fcf37d0158252f03c08dbc366ec26388342307f0782277023061c2511e40211b3b637c381d00b04a5e0a80ceaaebc6c6118a00622bf872 -0a207ec78ffbe8690c7f02dfe0bc1600793ac02665ee13f301fa1100f2fdd13bacd21f7df2f25a00628d790c9511006601ce2980f81d990c0090274dae0520d8 -54f42f0188be62016c044300b8988b01f093007ce54d60048054f24a00828e28f4ca0744fd5b4ef02e005ecbbd7b821304000060c61eedeac9fb02b8e5059125 -1bdd090006523a9900000000000000000000000000000000000000000000c0f6003eb77eea69a61cf4901497a44f53f03024af1fabd84e0eba28ca25912c13bd -78dd7c6339078003e55800240330e8084cc1d9b315438f566c23070270ce00b0e29486a3199ea2691b398305e8202c81bc737e647e9a6de45400d210242bec66 -b21c0cc0939d05b226f04e00587f121f20f3d6391b916685dd4c9603019c430eba39fac600ece6e80a25ad238806010000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0e8da6e2000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000047d7760301 -000000000000806b0070538424eb247534eb85007c4ca8e2976af57742719f9af54a0026e4f949f2050013b20280660580eb0270ee796abe6700be3da36b93ff -f200bccc5048edc467009d294def06a03b335f1f80ee5626f700409d3cfd007426579bcd30c93b0190995cd37c9649ee01605a1390995c793a53fe91e41e00a6 -38c1501f7b7f3f1ff0fa3448a136fe9b3501ed07744ca0bf1fa09319dfcd09f6ca5bf504fb040048be0060425600d0ac5702f0ebb5dc1ac08c8ba2ff4e60f54b -b3de13c08cac1702b08d00000000000000000000000000000000c06b009f5382ac8bc92c00b794390066e4bda500c0d115385a00e0e80a1c2d007074058e160038ba02470b001c5d81a305008eaec0d102004757e0680180a32b70b4bc3d80ff0005da814a40510a190000000049454e44ae426082}}{\nonshppict -{\pict\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0\picw13545\pich10158\picwgoal7679\pichgoal5759\wmetafile8\bliptag309629549\blipupi96{\*\blipuid 1274926df34e41bf2cdce34a85182d48} -01000900000366c00000000042c0000000000400000003010800050000000b0200000000050000000c02800100020500000007010400000042c00000430f2000 -cc00000080010002000000008001000200000000280000000002000080010000010004000000000000800100c40e0000c40e0000100000001000000000000000 -80000000ff00000000008000800080000000ff00ff00ff0000800000808000000080800080808000c0c0c00000ff0000ffff000000ffff00ffffff00ffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb000000000000 -000000000000000000000000000000000000000000000000000000000000000bbbbbbbbbbb000000000000000000000000000000000000000000000000000000 -000000000000000000000bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb000000000000 -000000000000000000000000000000000000000000000000000000000000000bbbbbbbbbbbfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaa0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0faaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa00bbbbbbbbbbbfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0fbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba00bbbbbbbbbbbfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0fbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba00bbbbbbbbbbbfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0fbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba00bbbbbbbbbbbfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0fbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba00bbbbbbbbbbbfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0fbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba00bbbbbbbbbbbfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0fbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbb0000bbb0bbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbba00bbbbbbbbbbbfbbbbbbbbbbbbbbbbbbbbbb0000bbb0000b0bbb0bb000bbb000bb0 -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0fbbbbbbbbbb -bbbbbbbbbbbbbbbbbbb0bbbb0bb0bbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbba00bbbbbbbbbbbfbbbbbbbbbbbbbbbbbbbbb0bbbb0b0bbb0b0bbb0b0bbb0b0bbb0b0 -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0fbbbbbbbbbb -bbbbbbbbbbbbbbbbbbb0bbbb0bb0bb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbba00bbbbbbbbbbbfbbbbbbbbbbbbbbbbbbbbb0bbbbbb0bbb0b0bbb0b0bbbbb0bbbbb0 -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0fbbbbbbbbbb -bbbbbbbbbbbbbbbbbbb0bbbb0bb0b0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbba00bbbbbbbbbbbfbbbbbbbbbbbbbbbbbbbbb0bbbbbbb0000b0bbb0b0bbbbb00000b0 -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0fbbbbbbbbbb -bbbbbbbbbbbbbbbbbbb0bbbb0bb00bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba00bbbbbbbbbbbfbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbb0b00bb0b0bbb0b0bbb0b0 -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0fbbbbbbbbbb -bbbbbbbbbbbbbbbbbbb0bbbb0bb00bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba00bbbbbbbbbbbfbbbbbbbbbbbbbbbbbbbbb0bbbbbbb000bb0b00bbb000bbb000bb0 -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0fbbbbbbbbbb -bbbbbbbbbbbbbbbbbbb0bbbb0bb0b0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbba00bbbbbbbbbbbfbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0 -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0fbbbbbbbbbb -bbbbbbbbbbbbbbbbbbb0bbbb0bb0bb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbba00bbbbbbbbbbbfbbbbbbbbbbbbbbbbbbbbb0bbbb0bbbbbbbbbbbbbbbbbbbbbbbbb0 -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0fbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbb0000bbb0bbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbba00bbbbbbbbbbbfbbbbbbbbbbbbbbbbbbbbbb0000bbbbbbbbbbbbbbbbbbbbbbbbbb0 -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0fbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba00bbbbbbbbbbbfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0fbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba00bbbbbbbbbbbfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0fbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba00bbbbbbbbbbbfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0fbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba00bbbbbbbbbbbfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0fffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00bbbbbbbbbbbfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb000000000000 -000000000000000000000000000000000000000000000000000000000000000bbbbbbbbbbbffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bfffffffffffffbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -babbbbbbbbbbbfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0fffffffffbfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0fffffffffbfbbbbbb0bbbbbb00b0b0b0bbbbb000bbbb000bb0bbb000bbb000bb0bbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0fffffffffbfbbbbbb0bbbbb0bb00b0b0bbbb0bbb0bb0bbb0b0bb0bbb0b0bbb0b0bbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0fffffffffbfbbbbbb0bbbbb0bbb0b0b0bbbbbbbb0bb0bbbbb0bb0bbbbb0bbbbb0bbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0fffffffffbfbbbbbb0bbbbb0bbb0b0b0bbbbbbbb0bb0bbbbb0bb00000b00000b0bbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0fffffffffbfbbbbbb0000bb0bbb0b0b0bbbbb000bbb0bbb0b0bb0bbb0b0bbb0b00bb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0fffffffffbfbbbbbb0bbbbb0bbb0b0b0bbbb0bbbbbbb000bb00bb000bbb000bb0b00bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0fffffffffbfbbbbbb0bbbbbbbbbbb0b0bbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0fffffffffbfbbbbbb0bbbbbbbbbbb0b0bbbb0bbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0000000000bfbbbbbb00000bbbbbbb0b0bbbbb000bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -baaaaaaaaaaaafbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -babbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbfbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000bfbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbaaaaaaaaaaaaaa0bfbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbbbbbbba0bfbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbbbbbbba0bfbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbbbbbbba0bfbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbb000bbb0000b0bb0bb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0ff0000fff0ff00f0ff000fffffff0fffff000fff0000f0ff0ff0fffffffffffffffffffffffffffffffffffbfbbbbbbbbbbbba0bfbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbb0bbb0b0bbb0b0bb0bb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0ff0fff0ff0f0ff00f0fff0ffffff0ffff0fff0f0fff0f0ff0ff0fffffffffffffffffffffffffffffffffffbfbbbbbbbbbbbba0bfbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbb0bbbbb0bbb0b0bb0bb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0ff0fff0ff0f0fff0f0ffffffffff0ffff0fffff0fff0f0ff0ff0fffffffffffffffffffffffffffffffffffbfbbbbb0bbbbbba0bfbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbb00000bb0000b0bb0bb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0ff0fff0ff0f0fff0f00000ffffff0ffff00000ff0000f0ff0ff0fffffffffffffffffffffffffffffffffffbfbbbb000bbbbba0bfbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbb0bbb0bbbbb0b0bb0bb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0ff0000fff0f0fff0f0fff0ffffff0ffff0fff0fffff0f0ff0ff0fffffffffffffffffffffffffffffffffffbfbbb00000bbbba0bfbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbb000bbb000bb000b00bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0ff0fff0ff0f0fff0ff000fffffff0fffff000fff000ff000f00ffffffffffffffffffffffffffffffffffffbfbb0000000bbba0bfbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0ff0fff0ff0ffffffffffffffffff0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbbbbbbba0bfbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0ff0fff0ff0ffffffffffffffffff0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbbbbbbba0bfbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb00000bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0ff0000fff0ffffffffffffffff00000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbbbbbbba0bfbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbbbbbbba0bfbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffffffffffa0bfbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbbbbbbbbbbbbbbb0bfbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bfbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -baaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -babbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000bfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb00bbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0fb0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0 -b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0fbaaaaaaaaaaaaaa0bfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0f011111111111111111111111ff11111111111111111111111111111111111ff1111111111111111111111111111111111111111111111111111111111111 -111111111111111111111111111111111111111111111111111111111111111111111111111bfbfbbbbbbbbbbbba0bfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbb0bbbbb0b0b0bbb000bb0bbb0000b0bbb0bbbbbb0bbbbb0bbb0000bbb000bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0fb1111111111111111111111111f111111111111111111111111111111111111f111111111111111111111111111111111111111111111111111111111111 -1111111111111111111111111111111111111111111111111111111111111111111111111110fbfbbbbbbbbbbbba0bfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbb0bbbbb0b0b0bb0bbb0b0bb0bbb0b0bb0bbbbbbb0bbbbb00bb0bbb0b0bbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0f01f11111f11f1f111f11fff111f1111ffff1f111f11111fff1f111ff1f1f111f1111fff1111f111f11fff11f111f1111f11111f11f11fff1f11111fffff1 -1fff11f11111f11111f111111ff1f1f11fff11f111ff1f1f11f11f111111111111111111111bfbfbbbbbbbbbbbba0bfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbb00000bb0b0bb0bbbbb0bb0bbb0b0bb0bbbbbbb0bbbb0bb0b0bbb0b0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0fb1f11f11f11f1f11f11f111f11ff11f111f1f111f1111f111ff11f11ff1f111ff11f111f111f111f1f111f1f111f1111f11f11f11f1f111ff11111f11111 -f111f1f11f11f11111f11111f11ff1f1f111f1f11f11ff1f11f11f1111111111111111111110fbfbbbbbbbbbbbba0bfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbb0bbb0bb0b0bb0bbbbb0bbb0000b0bb0bbbbbbb0bbbb0bb0b0bbb0b00000bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0f01f11f11f11f1f1f111f111f1f11f1f111f1f111f1111f1111f11f111f1f11f11f1f111111f1f11f1f11111f111f1111f11f11f11f1f1111f111111f1111 -1111f1f11f11f11111f11111f111f1f1f11111f11f111f1f11f11f111111111111111111111bfbfbbbbbbbbbbbba0bfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbb0bbb0bb0b0bb0bbb0b0bbbbbb0b0bb0bbbbbbb0bbbb0bb0b0bbb0b0bbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0fb1f1f1f1f11f1ff1111f111f1f11f11ffff1f111f1ff1f1111f11f111f1f11f11f1fffff11f1f11f1f11111f111f1111f1f1f1f11f1f1111f11ff111f111 -1111f1f1f1f1f11111f11111f111f1f1f11111f11f111f1f11f11f1111111111111111111110fbfbbbbb0bbbbbba0bfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbb0b0bbb0b00bb000bb00bb000bb00b00bbbbbb0bbbb0bb0b0000bbb000bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0f01f1f1f1f11f1f1f111f111f1f11f11111f1ff11f1111f11fff11f111f1f11f11f1f111f1f111f1f1f111f1ff11f1111f1f1f1f11f1f11fff11111111f11 -1ffff1f1f1f1f11111ffff11f111f1f1f111f1f11f111f1f11f11f111111111111111111111bfbfbbbb000bbbbba0bfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbb0b0bbbbbbbbbbbbbbbbbbbbbbb0bb0bbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0fb1ff111ff11f1f11f111fff11f11f11fff11f1ff11111f1111111f111f1ff1f11f11fff11f111f1f11fff11f1ff11111ff111ff11f1f11111111111111f1 -f111f1ff111ff11111f11111f111f1f11fff11ff1f111f1fff1ff11111111111111111111110fbfbbb00000bbbba0bfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbb0bb0bbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0f01ff111ff1111f1111111111111111111111111111111f11111111111111111111111111111111111111111f11111111ff111ff1111f11111111111111f1 -f111f1ff111ff11111f11111111111f11111111111111111111111111111111111111111111bfbfbb0000000bbba0bfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbb0bbbbbbbbbbbbbbbbbbbb0bbbbbbb00000bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0fb1f11111f1111f1111111111111111111111111111111f1111f111111111111111111111111111111111111f11111111f11111f1111f1111f11111f111f1 -f111f1f11111f11111f11111111111f111111111111111111111111111111111111111111110fbfbbbbbbbbbbbba0bfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0f01f11111f11f1f11111111111111111111111111111111ffff11111111111111111111111111111f1111111f11111111f11111f11f11ffff1111111fff11 -1fff11f11111f11111fffff1111111f11111111111111111111111111111111111111111111bfbfbbbbbbbbbbbba0bfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0fb111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -1111111111111111111111111111111111111111111111111111111111111111111111111110fbfbbbbbbbbbbbba0bfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0f0111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -111111111111111111111111111111111111111111111111111111111111111111111111111bfbfbbbbbbbbbbbba0bfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0fb0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0 -b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0fbfffffffffffffa0bfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbbbbbbbbbbbbbbb0bfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -baaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -babbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbfbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0000bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0fffffffffffffffffffff0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbb0bbbbb000bbb00b0b0bbbbbb0000bbb0000b0b0bbbbb000bbb0bb0000b0bbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0ff0ffff0ff0f0ff000fff0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbb0bbbb0bbb0b0bb00b0bbbbb0bbbb0b0bbb0b0b0bbbb0bbb0bb0b0bbb0b0bbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0ff0ffff0ff0f0f0fff0ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbb0bbbb0bbb0b0bbb0b0bbbbb0bbbbbb0bbb0b0b0bbbbbbbb0bb0b0bbb0b0bbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0ff0ffff0ff0f0f0fffff0ff0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbb0bbbb0bbb0b0bbb0b0bbbbb0bbbbbbb0000b0b0bbbbbbbb0bb0b0bbb0b0bbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0ff0ffff0ff0f0f00000f0ff0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbb0bbbb0bbb0b0bbb0b0bbbbb0bbbbbbbbbb0b0b0bbbbb000bbb0b0bbb0b00bb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0ff00000fff0f0f0fff0f0ff0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbb0b0bbbb000bb0bbb0b00bbbb0bbbbbbb000bb0b0bbbb0bbbbbb0bb0000b0b00bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0ff0ffff0ff0f0ff000ff0ff0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbb0bbb0bbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbb0b0bbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0ff0ffff0ffff0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbb0bbbbb0bbbbbbbbbbbbbbbbbbb0bbbb0bbbbbbb0b0bbbb0bbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0ff0ffff0ffff0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbb0bbbbb0bbbbbbbbbbbbbbbbbbbb0000bbbbbbbb0b0bbbbb000bbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0ff00000fff0f0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -ba00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bfbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -baaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb00bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbb0bbbbb0bb0000bb0bbbbb0bbbbbb0bb000bbbbbb00b0bb00bbb000bbbbbb0bbbb000bbb00b0b0bbbbbb000bb0bbb0bb0b0b0bbb000bbbbbb00bbb000bb -0bbb000bbb000bb0bbb0b0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbb0bbbbb0b0bbbb0b0bb0bb0bbbbb0bb0bbb0bbbb0bb00b0bb0b0bbb0bbbbb00bb0bbb0b0bb00b0bbbbb0bbb0b0bbb0b0bb0b0bb0bbb0bbbb0bb0b0bbb0b -0bb0bbb0b0bbb0b0bbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbb00000bb0bbbbbb0bb0bb0bbbbb0bb0bbb0bbbb0bbb0bbb0bb0bbbbbbbb0bb0b0bbb0b0bbb0b0bbbbb0bbbbb0bbb0b0bb0b0bb0bbbbbbbbbb0bb0bbbbb -0bb0bbbbb0bbbbb0bbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbb0bbb0bb0bbbbbb0b0b0b0bbbbb0bb0bbb0bbbb0bbb0bb0bbb00000bbbb0bb0b0bbb0b0bbb0b0bbbbb00000b0bbb0b0bb0b0bb00000bbbbb0bbb0bbbbb -0bb00000b00000b0bbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbb0bbb0bb0bbbbbb0b0b0b0bbbbb0bb0bbb0bbbb0bbb0b0bb0b0bbb0bbbb0bb0b0bbb0b0bbb0b0bbbbb0bbb0b00bb0b0bb0b0bb0bbb0bbbb0bb0b0bbb0b -0bb0bbb0b0bbb0b00bb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbb0b0bbb0bbbbbb00bbb00bbbbb00bb000bbbbb0bbb0bb00bbb000bbbbb0bb0bb000bb0bbb0b00bbbbb000bb0b00bb00b0b00bb000bbbbbb00bbb000bb -00bb000bbb000bb0b00bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbb0b0bbb0bbbbbb00bbb00bbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbb0bbbb0bbbb0b0bbbbb0bbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbb0bbbbb0000bb0bbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb00bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb00bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbb -bbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbb0bb000bbb0000b0bb0bb0bbbbb0bbbb000bbb00b0bbbb0000bbbb0b0b0bbb0bb000bbbbbb0bb000bbbbb0bb000bb0b0bbb0bb0bbbbb0b0bbb0bb000b -b0bbb0bbbb0000bb0bbb000bbb00bbb00bbbbbbbb0000bbb0bbbb0bbb0bbbbbbbbb0000bb0bbb0bb000bbb000bb0bbb0bbbbbbbbb0bbbbbb00b0b0b0bbbbb000 -bbbb000bb0bbb000bbb000bb0bbb0bbbbbbbbb0b0bbbbbb0bbbb000bbb00b0bbbb0000bbbb0b0b0bbb0bb000bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbb0bb0bbb0b0bbb0b0bb0bb0bbbbb00bb0bbb0b0bb00bbb0bbb0bbbb0b0b0bb0bb0bbb0bbbb0bb0bbb0bbbb0b0bbb0b0b0bbb0bbbbbbb0bb0bbb0b0bbb0 -b0bbb0bbbb0bbb0b0bb0bbb0b0bb0b0bb0bbbbbb0bbbb0bb0bbb0bbbbbbbbbbbbb0bbbb0b0bbb0b0bbb0b0bbb0b0bb0bbbbbbbbbb0bbbbb0bb00b0b0bbbb0bbb -0bb0bbb0b0bb0bbb0b0bbb0b0bbb0bbbbbbbbb0b0bbbbbb00bb0bbb0b0bb00bbb0bbb0bbbb0b0b0bb0bb0bbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbb0bb0bbbbb0bbb0b0bb0bb0bbbb0bb0b0bbb0b0bbb0bbb0bbb0bbbb0b0b0b0bbb0bbbbbbbb0bb0bbb0bbbb0b0bbb0b0b0bbb0bbbbbbb0bb0bbb0b0bbbb -b0bbb0bbbb0bbb0b0bb0bbbbbbb0bbbb0bbbbbbb0bbbb0bb0bb0bbbbbbbbbbbbbb0bbbbbb0bbb0b0bbbbb0bbbbb0b0bbbbbbbbbbb0bbbbb0bbb0b0b0bbbbbbbb -0bb0bbbbb0bb0bbbbb0bbbbb0bbb0bbbbbbbbb0b0bbbbb0bb0b0bbb0b0bbb0bbb0bbb0bbbb0b0b0b0bbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbb0bb00000bb0000b0bb0bb0bbbb0bb0b0bbb0b0bbb0bbb0bbb0bbbb0b0b00bbbb00000bbbb0bb0bbb0bbbb0b0bbb0b0b0bbb0bbbbbbb0bb0bbb0b00000 -b0bbb0bbbb0bbb0b0bb00000bb0bbbb0bbbbbbbb0bbbb0bb0b0bbbbbbbbbbbbbbb0bbbbbb0bbb0b00000b0bbbbb00bbbbbbbbbbbb0bbbbb0bbb0b0b0bbbbbbbb -0bb0bbbbb0bb00000b00000b0bbb0bbbbbbbbb0b0bbbbb0bb0b0bbb0b0bbb0bbb0bbb0bbbb0b0b00bbbb00000bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbb0bb0bbb0bbbbb0b0bb0bb0bbbb0bb0b0bbb0b0bbb0bbb0bbb0bbbb0b0b0b0bbb0bbb0bbbb0bb0bbb0bbbb0b0bbb0b0b00bb0bbbbbbb0bb00bb0b0bbb0 -b00bb0bbbb0bbb0b0bb0bbb0b0bb0b0bb0bbbbbb0bbbb0bb00bbbbbbbbbbbbbbbb0bbbbbb00bb0b0bbb0b0bbb0b0b0bbbbbbbbbbb0000bb0bbb0b0b0bbbbb000 -bbb0bbb0b0bb0bbb0b0bbb0b00bb0bbbbbbbbb0b0bbbbb0bb0b0bbb0b0bbb0bbb0bbb0bbbb0b0b0b0bbb0bbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbb00bb000bbb000bb000b00bbbbb0bb0bb000bb0bbb0bbbb0000bbbb0b0b0bb0bbb000bbbbb00bb000bbbbb0bb000bb0b0b00bbbbbbbb00b0b00bbb000b -b0b00bbbbb0000bb00bb000bbb00bbb00bbbbbbb0bbbb0bb00bbbbbbbbbbbbbbbb0bbbbbb0b00bbb000bbb000bb0bb0bbbbbbbbbb0bbbbb0bbb0b0b0bbbb0bbb -bbbb000bb00bb000bbb000bb0b00bbbbbbbbbb0b00bbbb0bb0bb000bb0bbb0bbbb0000bbbb0b0b0bb0bbb000bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbb0bbbb0bbb0bbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bb0bbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0b0bbbb0bb0b0bbbb0bbbbbbbbbb0bbbbbb0bbbbbbbbbbbbbbbbb0bbbbbbbb0bb0b0bbbbbbbbbbb0b0bbbb0bbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bb0bbbbbb0bbbbbbbbbbbbbbbbbbbbbb0bbbbb0bbbb0bbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbb0bbbb0bbb0bbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bb0bbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0b0bbbb0bb0bb0bbb0bbbbbbbbbb0bbbb0b0bbbbbbbbbbbbbbbbb0bbbbbbbb0bb0b0bbbbbbbbbbb0b0bbbb0bbb -0bbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bb0bbbbbb0bbbbbbbbbbbbbbbbbbbbbb0bbbbb0bbbb0bbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbb0bbbb0b0b0bbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbb0bbbbbbbbbbbbbbbb0bbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bb0000bbb0bbb0bb0bbbbbbbbbbb0000bb0bbbbbbbbbbbbbbbbb0bbbbbbbb0bb0b00000bbbbbbb0b0bbbbb000 -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bb0bbbb0bb0bbbbbbbbbbbbbbbbbbbbb0bbbbb0bbbb0b0b0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0000bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb00bbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbb00bbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbb0bbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbb0bbbbb000bbb00b0b0bbbbbb000bbb0000b0b0bbbbb00bb0bb0000b0bbb0bbbb0bb0000bb000bb0bbb0bb0b0b0bb0bb000bbb00bbbbbb0bbbb000bb -b00b0bbbbb0bb000bbbbbb000bbb0b0bbb0bb000bb0bbb00bb0bbbbbbbbb000bbbb000bb0bb000bbb000bbb0bbbbb0000b0bbb0bbbbb0000b0b0bbb000bb0bbb -0000b0bbb0bbbbb0bb0bbb0000bbb000bbbbbb0000b0bbb0bb0000bbbbb0b0bbb0bb000bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbb0bbbb0bbb0b0bb00b0bbbbb0bbb0b0bbb0b0b0bbbb0bb0b0b0bbb0b0bbb0bbbb0b0bbb0b0bbb0b0bbb0b0bb0b0bb0b0bbb0b0bb0bbbbb00bb0bbb0b -0bb00bbbb0bb0bbb0bbbb0bbb0b0bb0bbb0b0bbb0b0bb0bb0bbbbbbbbbb0bbb0bb0bbb0b0b0bbb0b0bbb0b0bbbbb0bbb0b0bbb0bbbb0bbb0b0b0bb0bbb0b0bb0 -bbb0b0bb0bbbbb0bbb00bb0bbb0b0bbb0bbbb0bbb0b0bbb0b0bbb0bbbb0bb0bbb0b0bbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbb0bbbb0bbb0b0bbb0b0bbbbb0bbbbb0bbb0b0b0bbbbbb0bb0b0bbb0b0bbb0bbbb0b0bbb0b0bbbbb0bbb0b0bb0b0bb0b0bbbbbbb0bbbbb0bb0b0bbb0b -0bbb0bbbb0bb0bbb0bbbb0bbb0b0bb0bbb0b0bbbbb0bbbb0bbbbbbbbbbbbbbb0bb0bbbbb0b0bbbbb0bbbbb0bbbbb0bbb0b0bbb0bbbb0bbb0b0b0bb0bbbbb0bb0 -bbb0b0bb0bbbbb0bb0bb0b0bbb0b0bbbbbbbb0bbb0b0bbb0b0bbb0bbbb0bb0bbb0b0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbb0bbbb0bbb0b0bbb0b0bbbbb0bbbbbb0000b0b0bbbbb0bbb0b0bbb0b0bbb0bbbb0b0bbb0b00000b0bbb0b0bb0b0bb0b00000bb0bbbbbb0bb0b0bbb0b -0bbb0bbbb0bb0bbb0bbbb0bbb0b0bb0bbb0b00000b0bbb0bbbbbbbbbbbbbbbb0bb00000b0b00000b0bbbbb0bbbbbb0000b0bbb0bbbbb0000b0b0bb0bbbbb0bbb -0000b0bb0bbbbb0bb0bb0b0bbb0b00000bbbbb0000b0bbb0b0bbb0bbbb0bb0bbb0b00000bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbb0bbbb0bbb0b0bbb0b0bbbbb0bbb0bbbbb0b0b0bbbb0bb0b0b0bbb0b00bb0bbbb0b0bbb0b0bbb0b00bb0b0bb0b0bb0b0bbb0b0bb0bbbb0bb0b0bbb0b -0bbb0bbbb0bb0bbb0bbbb0bbb0b0bb00bb0b0bbb0b0bb0bb0bbbbbbbbbbb000bbb0bbb0b0b0bbb0b0bbb0b0bbbbbbbbb0b00bb0bbbbbbbb0b0b0bb0bbb0b0bbb -bbb0b0bb0bbbbb0bb0bb0b0bbb0b0bbb0bbbbbbbb0b00bb0b0bbb0bbbb0bb00bb0b0bbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbb0b0bbbb000bb0bbb0b00bbbbb000bbb000bb0b0bbbbb00bb0bb0000b0b00bbbbb0bb0000bb000bb0b00bb00b0b00b0bb000bbb00bbbbb0bb0bb000bb -0bbb0bbbb00bb000bbbbbb000bb00b0b00bbb000bb00bb00bbbbbbbbbbb0bbbbbbb000bb0bb000bbb000bb00bbbbb000bb0b00bbbbbb000bb0b00bb000bb00bb -000bb00b00bbbb00b0bb0b0000bbb000bbbbbb000bb0b00bbb0000bbbb00b0b00bbb000bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbb0bbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0b0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbb0bbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbb0bbbbbbbbbbbbbbbbb0bb0bbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbb0bbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbb0bb0bbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbb0bb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbb0bbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0b0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbb0bbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbb0bbbbbbbbbbbbbbbbb0bb0bbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbb0bbbbbbbb0bbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbb0bb0bbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbb0bb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbb0bbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0b0bbbbbbbbb0bbbbbbbbbbbbbbbb0bbbbb0bbbbbbbbbbbbbbbb0bb0b0bbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbb000bbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbb -bbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfb11111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -1111111111111111111111111111111ba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfb11111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -1111111111111111111111111111111ba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfb11111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -1111111111111000000000000000011ba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfb11111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -1111111111111faaaaaaaaaaaaaa011ba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfb11111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -1111111111111fbbbbbbbbbbbbba011ba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfb11ff1 -111ff1ff1ff111ffff11ff111fffff1ff111ff111111fffff1ff11ff11fffff1111111ff11111ffff111fffff1ff1ff1ff111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -1111111111111fbbbbbbbbbbbbba011ba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfb11ff1 -111ff1ff1ff11ff11ff1ff11ff11ff1ff11ff111111ff11ff1ff11ff1ff11ff1111111ff1111ff11ff1ff11ff1ff1ff1ff111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -1111111111111fbbb00bbbb00bba011ba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfb111ff -ffff11ff1ff11ff11111ff11ff11ff1ff11ff111111ff11ff1ff11ff1ff11ff1111111ff1111ff11111ff11ff1ff1ff1ff111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -1111111111111fbbbb00bb00bbba011ba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfb111ff -11ff11ff1ff11ff11111ff111fffff1ff11ff1111111fffff1ff11ff1ff11ff1111111ff1111ffffff11fffff1ff1ff1ff111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -1111111111111fbbbbb0000bbbba011ba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfb111ff -11ff11ff1ff11ff11ff1ff111111ff1ff11ff1111111111ff1fff1ff1ff11ff1111111ff1111ff11ff11111ff1ff1ff1ff111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -1111111111111fbbbbbb00bbbbba011ba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfb1111f -fff111ff1fff11ffff11fff11ffff11fff1fff111111ffff11fffff111fffff1111111ff11111ffff111ffff11fffffff1111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -1111111111111fbbbbb0000bbbba011ba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfb1111f -fff1111111111111111111111111111ff11ff111111111111111111111111ff1111111ff11111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -1111111111111fbbbb00bb00bbba011ba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfb11111 -ff11111111111111111111111111111ff11ff111111111111111111111111ff1111111ff11111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -1111111111111fbbb00bbbb00bba011ba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfb11111 -ff1111ff111111111111111111111111ff111111111111111111111111111ff11111ffffff111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -1111111111111fbbbbbbbbbbbbba011ba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfb11111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -1111111111111fbbbbbbbbbbbbba011ba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfb11111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -1111111111111fffffffffffffff011ba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfb11111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -1111111111111111111111111111111ba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfb11111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -1111111111111111111111111111111ba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffa0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff05000000070101000000030000000000}}}{\cf9 -\par }{ -\par }\pard\plain \s17\fi-1440\li1440\sa120\widctlpar\tx1440\adjustright \f1\fs18 {Call Sign\tab Although this is not completely implemented, yet, you may register your aircraft\rquote s call sign \endash which will used to identify you to other players. - -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid { -\par Aircraft Type\tab You may select either a MiG-29M or F-16C Falcon. -\par -\par }\pard\plain \s17\fi-1440\li1440\sa120\widctlpar\tx1440\adjustright \f1\fs18 {Team\tab Team lo -cations are defined in the scene file. In the scene file shipped with ACM, team one is based at Addison airport in Dallas, Texas. Team two is based a Sheppard Air Force Base, Wicita Falls, Texas. -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid { -\par }\pard\plain \s17\fi-1440\li1440\sa120\widctlpar\tx1440\adjustright \f1\fs18 {Full Screen\tab If you select full-screen mode, ACM will occupy the full screen (surprise). Currently, the full screen layout is 800x600 and 256 colors. -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid { -\par }\pard\plain \s1\sb240\sa60\keepn\widctlpar\outlinelevel0\adjustright \f1\fs36\cf9\kerning28 {\page {\*\bkmkstart _Toc431273887}Setting up an ACM session }{\fs20 (ACM for Windows only)}{{\*\bkmkend _Toc431273887} -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid {\cf9 -\par }{\fs20\cf9 {\*\shppict{\pict{\*\picprop\shplid1033{\sp{\sn shapeType}{\sv 75}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn pibName}{\sv \'46\'3a\'5c\'73\'6e\'61\'70\'73\'68\'6f\'74\'5c\'61\'63\'6d\'5c\'70\'63\'5c\'68\'6c\'70 -\'5c\'73\'65\'73\'73\'69\'6f\'6e\'31\'2e\'62\'6d\'70}}{\sp{\sn pibFlags}{\sv 2}}{\sp{\sn fillColor}{\sv 268435473}}{\sp{\sn fFilled}{\sv 0}}{\sp{\sn fLine}{\sv 0}}}\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0 -\picw13545\pich10158\picwgoal7679\pichgoal5759\pngblip\bliptag1005181000{\*\blipuid 3be9d848c1a099e03dbfce93af8497e6}89504e470d0a1a0a0000000d4948445200000200000001800403000000290ec78c0000000467414d410000b1889598f4a600000030504c544500000080000000 -8000808000000080800080008080808080c0c0c0ff000000ff00ffff000000ffff00ff00ffffffffff7b1fb1c4000000097048597300000ec400000ec401952b -0e1b00000d7949444154789ced9d3fb7abac1287296e31ddf94ab738c5edf657399d76a1b86b4997affa1667add8f9323380e09f44a389dbecdf1c8f51184678 -8411c29618f78162bbe562ae2b94cf227f56e89aebd1b7eb05b20ec0ff7f7f9afc0f007e2680af50a4fffc5800ea009af500bebabf9999bff397f8def23c80ce -fffb00f97296fcf614808f105f038cfff724006e06b27dfdf587de9f1c5d9cf5e2015843cffa00df0cbefe86cd1f76277405ec03cc533ee03717bf134fd0fd56 -007fcf09e0c91af03bb8415f682ef989013ced03ba6113382780679f02ec03064ef09c009eed077c880040a5f26301fcd7a8fc58004900005f89010000000000 -00000000000000000000000000000000000000000000000000000000c00200943e8ce13dcd5dc3da2d394c894bfbb3575b297b00f05924ba9325da0460ce689e -87242b4ad369dacd00fcede5f219fe8b83b9bcbe0f40bbdc40a369b700b05ce61280f5a1dc1efcb121bf898af13a1220671e873f721a439c40edf09facf09e0c -fff98e8d7b97a249e359d11f1a13921c09806f2de90d26a200806473c2c5aa8a00b0d9996e12241cd50ec9de68fade90d51a44219e37dbeb1c0ac0dd05c0ce51 -5512003706c0e2120063427a2b07fe34a4e27301e07a00a2733800631480d4f212405ee4850028dde4b0c536466e0c80e66b80d69951a1f3909d00587dca5100 -e08c6630963714599a77bc97e200bc639020ad417913186c4300f40d01a47e80ecd84f496da6be09c8950d05758992ce81a104407ca7ee49dc1f252798350175 -826cd0a8979c0120645e0d602476f2a2c32b2f7a26d228bfcb2403a05e243e5674cb0dbe008073a3c7d23878bebb90a99b7ebf4e0280d0b6b44e9abc41f5f21a -00474b09805b4f78ac84e74ba6fad9008c090092afa4e0a492ec082099dda7cbfbc88a5c6ee4ff55daa422f79b868f954c75f71a60970398ce7c0c9fb342f967 -0030b49401b0f28849ae3038419b4626e7056043139fb2f4d69e601aaf103f68a4f3a39d1c63d338280d71fa210cf770399ac4cfab1e9f8aaa741e34591cef50 -dcc7a14f0070fc60c8a5110933b0dac90be39b340ecafb777dff2d1b0bd998c8c570eb8a966bd23edc76056042433f10406c5e44a937e71280d809cc7bf81900 -8e36525bfabd09e103002463a2dc87c9c08bbec16028653174683300c5ad9c00e012afb44fe16300217df40e11c09db1c0fb01502a8b99029037013b680291da -4c13a00c9be6b95029e5562d97cd00d290459a803c73b86d164d200d71b2210c97448731ea045df88ac848f8d809c62f9942bbef014c0c86cc0ad90c20548355 -3250bff3dca4d5b69f936d00568f57283f29476763cd3bb1fbc9878d05d60b00ec0180caea6a4753411c6b9f18debf415e02203937ca3ee93d6d7aadbc0fc09b -9cda5ad9f6a5687842531c68eaa490956e0dbb7819ddc4299e8f0490f585b32901fdaa5fbf0f4e9db69dbe2ed95bb600d03ef92400926fa54a00744c091fc88b -000437f0d900e277cf56016493423a1c183681ef291b01e834903841972685b40288fbcb9d201d50bcc7b2634f90de93e39d653f00dfb3a3f750301600000000 -000000000000000000000000000000000000000000801500aaea903cef2a5b0054c60881aaaaeb75575da92e49ea90b2599ff69e6c00d018e70cff59d6a5eb2e -ebaeaa86e68a3208d7925ff41217d7dcff4bb0b57cb60020a77f9776916dbdcc1565101e4abe14c08abf9463d900e00fefae9ac34bedc93795ab2bfe68fc99bf -6f157f344d534b94c4f8ad6635afe7955447363e68c25e6344990db2b9ca0390808b58e096d05f458c3462c835a2bcc237ed01a092ecb5aeeeeaeaeab3d6d5b7 -a6f539bdf24773ab6f8ea32efed67475ed5b8b3ff67a5ea9139d4e367f50c77d1792a8c1cbade3e4975a53b3325bcfae72952412d1a8f2f26ab04b0de85a0170 -f11c384b5c6af96c6eb7c6e72844f14df5fb0befbd5ee36eade8a4ad6b6e55c5fbb6719ce4aa062f5c4e9fa492d49a24bf8a93e4976448f4de0bc0b904c00d00 -786913007f03fd01ef59af6e0600984127075cb5c5b3b0620470615f3b05a029015c56f9e4bd9c60531700daeacaf96aebb6ce0084023901e05bfb1840db4808 -7b144f68004002c4ac584f57c901540ca57e13009703e8b8865f13006e8555cd39e70c6b143701dda4257838ac7393adad8494ee6bc6e993a8412ea03fb84880 -3841b69e5f855379007cc489e55a6f00e03ad9a4195ce5e9d3b5573ef1fb96b370ed1c9fb74c89a3f8f57ec74eb0bb72782709bba6e38d95bd62d88bddae0d06 -5b39b84a402746d87a7e958ecf6e6ca5e5c4ed8a3efba6ae70d7a5da50977eb79acb42358a9186b03cc3b9f5d2d65a2b2a7b0d86baf2f43a97996b378a6957fd -997f6e7d709543019c560000000000000000000000000000000000005603c0cc90ce0c85b7e1a97c97fbd12b4283789a5452c3d38928a6daf432d2a699211fc4 -63f00820e6d4967925f7586ca9658b434a46466f8b6f972d007e755dfb9301fce9fef9d55d3573f28a982c806064291159044dde1d8caba8c8a293d9aa2826be -4ea32b459286bab8a44a5c8052df3d8b464c5a7185349824b15db23ed72b00181300d8e003f4e530abfbb8a28a642e7bab2c2c7f92d68a3012191692ec975489 -cbabb87c158d7c99160996c47643cdd815809125bb22005d0e837409090a4dc4a495576cf9522585f523c3922a61394ad591440a20aeb8e25c7a61cfc497f4de -0f203581bc06b8128075b1ece12894790280a6b5d90a2ba906c474299a7a00ee2800bd134c0062d17b0036d6debe09dc01d0a71a00c86b40d1040e05c0f3020a -203a4117de921677a66f0d1a5d4b853227189a407282f17666a928aec81a9da02ec862d38a2b149de08100d2ccd04142bb58d96966e808a15dac603004000000 -00000000000000000000000000000000000000ab00606ef0d1dce0fc57751a43d97ea46d177ce93352a0495377e47573834ba4ccff6032ed0900b6c802cd2bf6 -f2bab9c1255266eb6c0024e99db94199dd0bbfb230333318560fd71f98cb6713c31ae3c6285d991034213afc24837ea59e1d16538ce117192886cc2ef5b60f80 -c9b9412bb396e15eccce0c8609be7236315f655ed6652c56edb759eab9294667a299f833433b02d0d5e9eb3180726ed0869515efcf0c1a1317e6cc6613f31f5a -b061e9460110270cadd60fad73a69c604a59503314e7165d532eafdf3e0de02267ed4c0d7023000f6606dd00808d3fd69000384a35a09f3b8bd6c2613ec3e622 -00974238f05a94e6b601807e3c9a1b2c00dc9b192c010c9a804e82954dc04d35810c40aa01f1871ba69a40b31dc0a3b941435913989c198c4ed085a599d36c62 -ef04a53b41e1c73983137476ca09ba5099821354f5d0a2269e4cdb013c981b5c3b5f49fb98592c3b00b83f37b82ee7733fd5b0e18f5f1ec81e004e2d000000f2 -01000000000000000000005b00acf885bb7552ef6db07d0d803f6b7ee36ed5efe1ed6def5500569838545a000000000000000000000000000000000000000000 -000000000000000000005861000000000000000000000000000000000000000000000000000000000000000000000000e06539de590000000000000000000000 -00000000000000000000000000000000000000000000561800000000000000000000000000000000000000000000000000000000000000000000000078598e77 -1600000000000000000000000000000000d81540edce222f02b0f6462c96767783af017052010000900f00000000000000580960efdf423d489e07b022c97796 -e7017c9400000000000000000000000000c03300aaea903cef2a5b0054c60801b263bb24ffad1e646177252858670c5963f843cd180df151868df2d17cf275b2 -0140637c108f28ee00a0390056b6426c0f803456ce0ddbf0474442d44a34e586a6ec2f962d007e85c9961900d6ee022055260a55ca0e0d4dd95f2c1b0048d2ab -e6ce58ceb371c495932b2e29002d8b846bedf5d9f795d992e5ea21959a6bbc546a4b140e1601e026c2b6d88a6e4702905a405c4ece85367d7f6a4366399c921e -97dfba542456d2a3a46594973101800d9e2000101fe0352920a6b81d0f40aa3ce73b00905cf9b28428ebc5474bbe7b008ec4ddc9793c286b805a4b3520066400 -dc370260430d60c7cd5ea0bf4502c086b69101b0a1de84428c00d85007be1980de094e02b0d10d6600b4560c0098d404a83f28005006203d058e6f028deb3a97 -03103f44da040cefac56056d02567d2369139022485b36d1093ad59ae807485d72837e80e1ab194d728c13749d6c4709ed63665357b83bb0fcdf02c027080000 -00000000000000000000000000007c7b006689106b2e2a8e689e0ac0af0579fc478ad53eb0c4d288e6b9002cd0f943bc0780059aa704601fc9a703a0472af4e1 -004ae1e993e104db2480f8e56a21a70440f9e9789e70ae0650f111e494000a1100c319d60f0740f9a900a05265b606f0e44bf95705a70450c81480391f20004a -dd5302a0fc74aa09ccfb00339c3a3b258042a69ce0bc0ff80c00949f86bf152854eefa8022f5390194224d7b5005e6fa0156e692733925007aa4f2b37a8253f2 -e100e891caa7d7801f3f1a7c2c9f0d60c1cb801f0d60f997a2b7252f4e8ae6870258ae792a002f1100000000000000000000000000000000780ca0d9b66ecdb7 -9455003e52d60058a1fb9102004767e0680180a33370b400c0d119385a00e0e80c1c2d007074068e1600383a03470b001c9d81a305008ecec0d1f2e301fc0bb4c40c02f544e6b30000000049454e44ae426082}}{\nonshppict{\pict\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0 -\picw13545\pich10158\picwgoal7679\pichgoal5759\wmetafile8\bliptag1005181000\blipupi96{\*\blipuid 3be9d848c1a099e03dbfce93af8497e6} -01000900000366c00000000042c0000000000400000003010800050000000b0200000000050000000c02800100020500000007010400000042c00000430f2000 -cc00000080010002000000008001000200000000280000000002000080010000010004000000000000800100c40e0000c40e0000100000001000000000000000 -80000000ff00000000008000800080000000ff00ff00ff0000800000808000000080800080808000c0c0c00000ff0000ffff000000ffff00ffffff00ffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0000000000 -00000000000000000000000000000000000000000000000000000000000000000bbbbbbbbb000000000000000000000000000000000000000000000000000000 -000000000000000000000bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0000000000 -00000000000000000000000000000000000000000000000000000000000000000bbbbbbbbbfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaa0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0faaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa00bbbbbbbbbfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0fbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba00bbbbbbbbbfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0fbbb0b0b0 -b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0bba00bbbbbbbbbfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0fbb0bbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0ba00bbbbbbbbbfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0fbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba00bbbbbbbbbfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0fbb0bbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0ba00bbbbbbbbbfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0fbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbb0000bbb0bbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbba00bbbbbbbbbfbbbbbbbbbbbbbbbbbbbbbbbbbbbbb00000bb0bb0b0bb0bbbbbbbb -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0fbb0bbbbb -bbbbbbbbbbbbbbbbbbbbb0bbbb0bb0bbb0bbbbbbbbbbbbbbbbbbbbbbbbbb0ba00bbbbbbbbbfbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbb0bb0b0b0bbbbbbbbb -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0fbbbbbbbb -bbbbbbbbbbbbbbbbbbbbb0bbbb0bb0bb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbba00bbbbbbbbbfbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbb00bb0b0bbbbbbbbb -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0fbb0bbbbb -bbbbbbbbbbbbbbbbbbbbb0bbbb0bb0b0bbbbbbbbbbbbbbbbbbbbbbbbbbbb0ba00bbbbbbbbbfbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbb00bb0b0bbbbbbbbb -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0fbbbbbbbb -bbbbbbbbbbbbbbbbbbbbb0bbbb0bb00bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba00bbbbbbbbbfbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0000bbb0bb0b0b0bbbbbbbbb -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0fbb0bbbbb -bbbbbbbbbbbbbbbbbbbbb0bbbb0bb00bbbbbbbbbbbbbbbbbbbbbbbbbbbbb0ba00bbbbbbbbbfbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbb0bb0b0b00bbbbbbbb -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0fbbbbbbbb -bbbbbbbbbbbbbbbbbbbbb0bbbb0bb0b0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbba00bbbbbbbbbfbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbb0bbbbbbbbb -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0fbb0bbbbb -bbbbbbbbbbbbbbbbbbbbb0bbbb0bb0bb0bbbbbbbbbbbbbbbbbbbbbbbbbbb0ba00bbbbbbbbbfbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbb0bbbbbbbbb -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0fbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbb0000bbb0bbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbba00bbbbbbbbbfbbbbbbbbbbbbbbbbbbbbbbbbbbbbb00000bbbbbbb0bbbbbbbbbbb -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0fbb0bbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0ba00bbbbbbbbbfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0fbbb0b0b0 -b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0bba00bbbbbbbbbfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0fbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba00bbbbbbbbbfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0fbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba00bbbbbbbbbfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0fffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00bbbbbbbbbfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0000000000 -00000000000000000000000000000000000000000000000000000000000000000bbbbbbbbbffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbffffbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbffbbbbffbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbabbffffbbfbbbbbbb0bbbb0bb0bb0bbbbb000bb0bbb0bbbbb0000bbbb000000bbbbb0b0bbbb0bbbbbb0000b0bbb0bb0000bbbbb0bbb -0bbb0000b0bbb0bb0bbbbb0bb000bbbbbb00b0bb00bbb000bbbbbb0b0bbb0bb000bbbbb0bb00000bb00000bb00000bbbbbbb0bbb00000bb0bbbbb000bbbbb000 -0bbbb0bbb000bbbbbb0000bb0bbb000bbb0bb000bbb000bbb000bb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbba0ffffffbfbbbbbbb0bbbb0bb0bb0bbbb0bbb0b0bbb0bbbb0bbb0bbbb0bbbb0bbbbb0b0bbb00bbbbb0bbb0b0bbb0b0bbb0bbbbb0bbb -0bb0bbb0b0bbb0b0bbbbb0bb0bbb0bbbb0bb00b0bb0b0bbb0bbbb0bb0bbb0b0bbb0bbbb0bb0bbbbbb0bbbbbb0bbbbbbbbbbb0bbb0bbbbbb0bbbb0bbb0bbbb0bb -b0bbb0bb0bbb0bbbbb0bbb0b0bb0bbb0b0bb0bbb0b0bbb0b0bbb0b0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbba0ffffffffbfbbbbbb0bbbb0bb0bb0bbbb0bbb0b0bbb0bbbb0bbb0bbbb0bbbbb00000bb0bbb00bbbbb0bbb0b0bbb0b0bbb0bbbb0b0b0 -b0b0bbb0b0bbb0b0bbbbb0bb0bbb0bbbb0bbb0bbb0bb0bbbbbbbb0bb0bbb0b0bbbbbbbb0bb0bbbbbb0bbbbbb0bbbbbbbbbbb0bbbb0bbbbb0bbbb0bbb0bbbb0bb -bb0bb0bbbbbb0bbbbb0bbb0b0bb0bbb0b0bb0bbb0b0bbbbb0bbb0b0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbba0ffffffffbfbbbbbb0bbbb0bb0bb0bbbb0bbb0b0bbb0bbbbb0000bbbb0bbbbb0bbb0bb0bb0b0bbbbbb0000b0bbb0b0bbb0bbbb0b0b0 -b0bb0000b0bbb0b0bbbbb0bb0bbb0bbbb0bbb0bb0bbb00000bbbb0bb0bbb0b00000bbbb0bb0bbbbbb0bbbbbb0bbbbbbbbbbb0bbbbb0bbbbb0bbb0bbb0bbbb0bb -bb0bb0bbbbbb0bbbbb0bbb0b0bb0bbb0b0bb0bbb0b0bbbbb0bbb0b0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbba0ffffffffbfbbbbbb0bbbb0bb0bb0bbbb0bbb0b00bb0bbbbbbbb0bbbb0bbbbb0bbb0bb0b0bb0bbbbbbbbb0b00bb0b0bbb0bbbb0bb0b -b0bbbbb0b00bb0b0bbbbb0bb0bbb0bbbb0bbb0b0bb0b0bbb0bbbb0bb00bb0b0bbb0bbbb0bb0000bbb0000bbb0000bbbbbbbb0bbbbbb0bbbb0bbbb000bbbbb0bb -bb0bb0bbb000bbbbbb0bbb0b0bb0bbb0b0bb0bbb0b0bbb0b0bbb0b0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbba0ffffffffbfbbbbbb0bbbb000b00bbbbbb000bb0b00bbbbbb000bbbbb0bbbbbb0b0bbb0b0bb0bbbbbb000bb0b00bbb0000bbbb0bb0b -b0bb000bb0b00bb00bbbb00bb000bbbbb0bbb0bb00bbb000bbbbb00b0b00bbb000bbbbb0bb0bbbbbb0bbbbbb0bbbbbbbbbbb0bbbbbbb0bbbb0bb0bbb0bbbb0bb -bb0bb0bb0bbbbbbbbb0000bb00bb000bb00bb000bbb000bbb000bb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbba0ffffffbfbbbbbbb0bb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbb0b0bbb00bbb0bbbbbbbbbbbbbbbbbbbbb0bbbbbbbbb -bbbbbbbbbbbbbbb0bbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bb0bbbbbbbbbbbbbb0bb0bbbbbb0bbbbbb0bbbbbbbbbbb0bbbbbbb0bbbb0bb0bbb0bbbb0bb -bb0bb0bb0bbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbba00ffff00fbbbbbbb0bb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbb0bbbb00bbb0bbbbbbbbbbbbbbbbbbbbb0bbbbbbbbb -bbbbbbbbbbbbbbb0bbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bb0bbbbbbbbbbbbbb0bb0bbbbbb0bbbbbb0bbbbbbbbb000bbb0bbb0bbbbb0b0bbb0bbbb0bb -b0bbb0bb0bbb0bbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbaa0000aabbbbbbbb0bb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbb0bbbb0bbbb0bbbbbbbbbbbbbbbbbbbbb0bbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbb0bb00000bb00000bb00000bbbbbbb0bbbb000bb00000bb000bbbbb000 -0bbbb0bbb000bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbbabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbba0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bfbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbbbffffbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0000bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb00bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbbffbbbbffbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbbabbffffbbfbbbbbbb0bbbbb0000bbbb0b0b0bbb0bb000bbbbbb0bb000bbbbb0bb000bb0b0bbb0bbbbb0000bbbbb00bbb000bbb000bb -0bbb0bb0000b0bb0bb000bbbbb0000bbb000bb0b0bbb0bb0000bbbb0bbb0bb000bbb00bbb0bb000bbb0000bbbb0000bbb0bbbbbbb00bbb000bb0bb0bb0bb000b -bb000bb0bbb0bb000bbbbbb000bb0bb00bbb000bbbbbb000bb0bbb0bbbbb0b0bbb0bb000bbbbb0bb0bbb0bb0bb000bb0bb0bbb0bb000bbb0bbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbafbbbbbbbbbbbbba0ffffffbfbbbbbbb0bbbb0bbb0bbbb0b0b0bb0bb0bbb0bbbb0bb0bbb0bbbb0b0bbb0b0b0bbb0bbbb0bbb0bbbb0bb0b0bbb0b0bbb0b -0bbb0b0bbb0b0bb0b0bbb0bbbb0bbb0b0bbb0b0b0bbb0b0bbb0bbbb0bbb0b0bbb0b0bb0b0bb0bbb0b0bbb0bbbb0bbb0bb00bbbbb0bb0b0bbb0b0bb0bb0b0bbb0 -b0bbb0b0bbb0b0bbb0bbbb0bbb0b0b0bb0b0bbb0bbbb0bbb0b0bbb0bbbb0bb0bbb0b0bbb0bbbb0bb0bbb0b0bb0bbb0b0bb0bbb0b0bbb0b0bbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbaffffffffffffba0ffffffffbfbbbbbb0bbbb0bbb0bbbb0b0b0b0bbb0bbbbbbbb0bb0bbb0bbbb0b0bbb0b0b0bbb0bbbb0bbb0bbbbbb0bb0bbbbb0bbbbb -0bbb0b0bbb0b0bb0b0bbb0bbbb0bbb0b0bbbbb0b0bbb0b0bbb0bbbb0bbb0b0bbb0bbb0bb0bb0bbbbb0bbb0bbbb0bbb0b0bb0bbbbbb0bb0bbb0b0bb0bb0b0bbbb -b0bbb0b0bbb0b0bbbbbbbb0bbbbb0bbb0bb0bbbbbbbb0bbb0b0bbb0bbbb0bb0bbb0b0bbbbbbbb0bb0bbb0b0bb0bbbbb0bb0bbb0b0bbbbb0bbbbbbbbfffffffff -fffffffffffffffffffafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbaaaaaaaaaaaaaba0ffffffffbfbbbbbb0bbbb0bbb0bbbb0b0b00bbbb00000bbbb0bb0bbb0bbbb0b0bbb0b0b0bbb0bbbbb0000bbbbb0bbb0bbbbb00000b -0bbb0bb0000b0bb0b0bbb0bbbb0bbb0b00000b0b0bbb0b0bbb0bbbb0bbb0b0bbb0bb0bbb0bb00000b0bbb0bbbb0bbb0b0bb0bbbbb0bbb0bbb0b0bb0bb0b00000 -b0bbb0b0bbb0b00000bbbb00000b0bb0bbb00000bbbb0bbb0b0bbb0bbbb0bb0bbb0b00000bbbb0bb0bbb0b0bb00000b0bb0bbb0b00000b0bbbbbbbbaaaaaaaaa -aaaaaaaaaaaaaaaaaaaafbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbba0ffffffffbfbbbbbb0bbbb0bbb0bbbb0b0b0b0bbb0bbb0bbbb0bb0bbb0bbbb0b0bbb0b0b00bb0bbbbbbbb0bbbb0bb0b0bbb0b0bbb0b -00bb0bbbbb0b0bb0b0bbb0bbbb0bbb0b0bbb0b0b00bb0b0bbb0bbbb00bb0b0bbb0b0bb0b0bb0bbb0b0bbb0bbbb0bbb0b0bb0bbbb0bb0b0bbb0b0bb0bb0b0bbb0 -b0bbb0b00bb0b0bbb0bbbb0bbb0b0b0bb0b0bbb0bbbb0bbb0b00bb0bbbb0bb00bb0b0bbb0bbbb0bb00bb0b0bb0bbb0b0bb00bb0b0bbb0b0bbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbba0ffffffffbfbbbbbb0bbbbb0000bbbb0b0b0bb0bbb000bbbbb00bb000bbbbb0bb000bb0b0b00bbbbbb000bbbbbb00bbb000bbb000bb -0b00bbb000bb00b0bb000bbbbb0000bbb000bb0b0b00bbb0000bbbb0b00bbb000bbb00bb00bb000bbb0000bbbb0000bb0bb0bbbbb00bbb000bb000b00bbb000b -bb000bb0b00bbb000bbbbbb000bb0bb00bbb000bbbbbb000bb0b00bbbbb00b0b00bbb000bbbbb0bb0b00bb00bb000bb00b0b00bbb000bb00bbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbba0ffffffbfbbbbbbb0bb0bbbbb0bbbb0bbb0bbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbb0bbbbbbbbbbbb0bbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bb0bbbbbbbbbbbbbb0bbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbba00ffff00fbbbbbbb0bb0bbbbb0bbbb0bbb0bbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbb0bbbbbbbbbbbb0bbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bb0bbbbbbbbbbbbbb0bbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbaa0000aabbbbbbbb0bb0bbbbb0bbbb0b0b0bbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbb0bbbbbbbbbb0bbbbbbbbbbb0bbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbffffbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbffbbbbffbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbabbffffbbfbbbbbbb0bbbbb0000bbbb0b0b0bbb0bb000bbbbbb0bb000bbbbb0bbb0bb000bbb00bbb0bbbbb0000bbbbb00bbb000bbb0 -00bb0bbb0bb0000b0bb0bb000bbbbbb000bb0bbb0bbbbb0b0bbb0bb000bbbbb0bbb0bb000bbb0bbbbb0000b0bbb0bb0000bbbb0bb000bbb0bbbbb000bbb0b0bb -b0bb000bb0bbb00bbbbb0bb000bb0b0bbb0bbbb0b0bbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbba0ffffffbfbbbbbbb0bbbb0bbb0bbbb0b0b0bb0bb0bbb0bbbb0bb0bbb0bbbb0bbb0b0bbb0b0bb0b0bbbbb0bbb0bbbb0bb0b0bbb0b0b -bb0b0bbb0b0bbb0b0bb0b0bbb0bbbb0bbb0b0bbb0bbbb0bb0bbb0b0bbb0bbbb0bbb0b0bbb0b0bbbbb0bbb0b0bbb0b0bbb0bbbb0b0bbb0b0bbbbb0bbb0b0bb0bb -b0b0bbb0b0bb0bb0bbbb0b0bbb0b0b0bbb0bbbb0b0bbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbba0fff00fffbfbbbbbb0bbbb0bbb0bbbb0b0b0b0bbb0bbbbbbbb0bb0bbb0bbbb0bbb0b0bbb0bbb0bb0bbbbb0bbb0bbbbbb0bb0bbbbb0b -bbbb0bbb0b0bbb0b0bb0b0bbb0bbbb0bbb0b0bbb0bbbb0bb0bbb0b0bbbbbbbb0bbb0b0bbbbb0bbbbb0bbb0b0bbb0b0bbb0bbbb0b0bbbbb0bbbbb0bbb0b0bb0bb -b0b0bbbbb0bbbb0bbbbb0b0bbb0b0b0bbb0bbbb0b0bbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbba0ff0000ffbfbbbbbb0bbbb0bbb0bbbb0b0b00bbbb00000bbbb0bb0bbb0bbbb0bbb0b0bbb0bb0bbb0bbbbbb0000bbbbb0bbb0bbbbb00 -000b0bbb0bb0000b0bb0b0bbb0bbbb0bbb0b0bbb0bbbb0bb0bbb0b00000bbbb0bbb0b00000b0bbbbbb0000b0bbb0b0bbb0bbbb0b00000b0bbbbb0bbb0b0bb0bb -b0b00000b0bbb0bbbbbb0b0bbb0b0b0bbb0b00b0b0bbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbba0ff0000ffbfbbbbbb0bbbb0bbb0bbbb0b0b0b0bbb0bbb0bbbb0bb0bbb0bbbb00bb0b0bbb0b0bb0b0bbbbbbbbb0bbbb0bb0b0bbb0b0b -bb0b00bb0bbbbb0b0bb0b0bbb0bbbb0bbb0b00bb0bbbb0bb00bb0b0bbb0bbbb00bb0b0bbb0b0bbbbbbbbb0b00bb0b0bbb0bbbb0b0bbb0b0bbbbb0bbb0b0bb00b -b0b0bbb0b0bb0bb0bbbb0b0bbb0b0b00bb0bbbb0b00bb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbba0fff00fffbfbbbbbb0bbbbb0000bbbb0b0b0bb0bbb000bbbbb00bb000bbbbb0b00bbb000bbb00bb00bbbbb000bbbbbb00bbb000bbb0 -00bb0b00bbb000bb00b0bb000bbbbbb000bb0b00bbbbb00b0b00bbb000bbbbb0b00bbb000bb00bbbbb000bb0b00bbb0000bbbb0bb000bb00bbbbb000bb00b0b0 -0bbb000bb00bb00bbbbb0bb000bb0b0b00bbbbb0b0b00bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbba0ffffffbfbbbbbbb0bb0bbbbb0bbbb0bbb0bbbbbbbbbbbbbb0bbbbbbbbbbb0bbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bb0bbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbb0bbbb0bbbbbbb0bbbbbbbbbbb0bb0bb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbba00ffff00fbbbbbbb0bb0bbbbb0bbbb0bbb0bbbbbbbbbbbbbb0bbbbbbbbbbb0bbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bb0bbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbb0bbbb0bbbbbbb0bbbbbbbbbbb0bb0bb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbaa0000aabbbbbbbb0bb0bbbbb0bbbb0b0b0bbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbb0bbbbbbbbbbbbbbbbbbbbbb0bb -bbbbbbbbbbbbbbbbbbbb0bbbbbbb0bbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbffbbbbbbbbbbbbbbbbbbbbbbbbbbbbbffbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbf -fffbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbfbbbbbfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbffbbbbbbbbbbbbbbffbbbbbbbbbbbbbbbbbbbbbbbbbbbfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbffffbbbbbbbbbbbbbbbbbaabfbbbbbbbbbbbbbbbbbbbbbbbbbbbaabfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaa -aabfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbafbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbaabfbbbbbbbbbbbbaabfbbbbbbbbbbbbbbbbbbbbbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbffbbbbffbbbbbbbbbfbbbbbfbafbbbbbbbfffbbfbbbfbbbbfbbfbbfbafbbbbbbbfffbbbfbbbfbbfbbbfbbbbbfffbbfbbbbbbffffbb -ffafbbffffbfbfbbbfbbffbbbfbbbbbfffbaffffbaffffbbbfffbbfbbbfbbfffbbfbbbfbbfbbffbbbbbbfffbbbfffbbfbbbfbbfbfbbbfffbbfbfbbfffbbbffff -bbbbffffbbafbbbbbbfbbfbbfbafbbbbbbbfffbbbfffbbfbbfbbfaffffbbbffbfbbfbbfffbbfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbabbbbbbbbfbbbbbbbafbbbbafbaffbbbbbaaabfafbbafbbbafbafbafbaffbbbbbaaabfbafbbafbafbbafbbbbaaabfafbbbbbaaaafba -aaafbaaaafafafbbafbaabfbabbbbbaaabfaaaabfaaaabfbaaabfafbbafbaaabfafbbafbabbaabfbbbbaaabfbaaabfafbbafbabafbbaaabfafafbaaabfbaaaaf -bbbaaaabfbaffbbbbafbafbafbaffbbbbbaaabfbaaabfafbafbafaaaabfbaabafbabbaaabfafbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbba0bbbbbbbfbbbbbbbafbbbbafbaabfbbbafbbafafbbafbbbafbafbafbaabfbbbafbbafbabfbabfafbbafbbbafbbafafbbbbafbbafaf -bbafafbbafafafbbafabbabafbbbbafbbafafbbafafbbafafbbafafbbafafbbabafbbafafbabbabbbbafbbabafbbafafbbafafbafbafbbafafafafbbabafbbaf -bbbafbbafbaabfbbbafbafbafbaabfbbbafbbabafbbafafbafbafafbbafafbaafafbafbbabafbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbba0bbbbbbbbbfbbbbbbafbbbbafafbafbbbafbbafafbbafbbbafbafbafafbafbbbafbbafafafafafafbbafbbbafbbafafbbbbabffafaf -bbafabffafafafbbafbbabbafbbbbafbbafafbbafafbbafafbbafafbbafafffffafbbafafbbbabbbbbafbbbbafbbafafbbafafbafbafbbafafafafffffafbbaf -bbbafbbafafbafbbbafbafbafafbafbbbafbbbbafbbafafbafbafafbbafafbbafafbafffffafbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbba0bbbbbbbbbfbbbbbbaffffbafafbafbbbafbbafaffbafbbbafbafbafafbafbbbafbbafafababafaffbafbbbafbbafafbbbbbaaaafaf -bbafbaaaafafaffbafbabbfafbbbbafbbafafbbafafbbafafbbafaffbafaaaaafaffbafafbbabbfbbbafbbbfafbbafaffbafafbafbafbbafafafaaaaafafbbaf -bbbafbbafafbafbbbafbafbafafbafbbbafbbbfafbbafafbafbafafbbafafbbafafbaaaaafafbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbba0bbbbbbbbbfbbbbbbaaaabbafafbafbbbabffabaabfabbbbaffabfabafbafbbbabffabafbafbafaabfabbbbabffabaffbbbbbffabab -ffafbbffabafaabfababfabaffbbbabffabafffabafffababffabaabfababffabaabfabaffabfabbbbabffababffabaabfabaffaffabffabafafabffababffaf -bbbafffabafbafbbbaffabfabafbafbbbabffababffabaffabfabafffabafbbafaffabffabaffbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbba0bbbbbbbbbfbbbbbbafbbbbafabbabbbbbaaabbabaabbbbbaaabaabbabbabbbbbaaabbabbabbababaabbbbbbaaabbaabbbbbaaabbba -aaabbaaabbababaabbbaabbaabbbbbaaabbaaaabbaaaabbbaaabbabaabbbaaabbabaabbaabbaabbbbbbaaabbbaaabbabaabbaabaabbaaabbafafbaaabbbaaaaf -bbbaaaabbabbabbbbaaabaabbabbabbbbbaaabbbaaabbaaabaabbaaaabbabbbabaabbaaabbaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbba0bbbbbbbfbbbbbbbafbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbafbbbbbbbbbbafafbbbbbbbbbbaf -bbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbba00bbbb00fbbbbbbbafffffafbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbfbbbbbbbbbbbabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbabbbbbbbbbbbbbbbbbbbbbbbbbbbbabbbbbbbbbbbafafbbbbbbbbbbaf -bbbafbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbaa0000aabbbbbbbbaaaaababbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbababbbbbbbbbbbab -bbbabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb00bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbb0bbb0bbb000bbb00b0b0bb0000bbbbb0bbbb000bbb00b0bbbb0b0b0bbb0bb000bbbbbb0bb000bbbbbb0000bb000bbbb0bbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbb0bbb0bb0bbb0b0bb00b0b0bbb0bbbbb00bb0bbb0b0bb00bbbb0b0b0bb0bb0bbb0bbbb0bb0bbb0bbbb0bbb0b0bbb0bbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbb0b0b0b0b0bbb0b0bbb0b0b0bbb0bbbb0bb0b0bbb0b0bbb0bbbb0b0b0b0bbb0bbbbbbbb0bb0bbb0bbbb0bbb0b0bbb0bbb0bbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbb0b0b0b0b0bbb0b0bbb0b0b0bbb0bbbb0bb0b0bbb0b0bbb0bbbb0b0b00bbbb00000bbbb0bb0bbb0bbbb0bbb0b0bbb0bbb0bbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbb0bb0bb0b0bbb0b0bbb0b0b0bbb0bbbb0bb0b0bbb0b0bbb0bbbb0b0b0b0bbb0bbb0bbbb0bb0bbb0bbbb0bbb0b0bbb0bbbb0bbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbb0bb0bb0bb000bb0bbb0b0bb0000bbbb0bb0bb000bb0bbb0bbbb0b0b0bb0bbb000bbbbb00bb000bbbbbb0000bb000bbbbbb0bbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbb0bbbbbbbbbbbbbbbbbbbbbbbb0bbb0bbbbbbbbbbbbbb0bbbbbbbbbbbbbbb0bbbbbbbbbbb0bbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbb0bbbbbbbbbbbbbbbbbbbbbbbb0bbb0bbbbbbbbbbbbbb0bbbbbbbbbbbbbbb0bbbbbbb0bbb0bbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbb0bbbbbbbbbbbbbbbbbbbbbbbb0b0b0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbb000bbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbb0000bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbb -bbbbbbbbbbbbbbbbbbbbbbb0000bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbb -bbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbb0000bb0000bb0000b0b0bbb0bb00bbb0bbbb0bbb0bb00b0b0bb0bb0bb0000b0bbb0bbbbb000bb0bbbbbb000bbb000bb0bb0bb0b0000 -bbb00b0bb0bb000bb0bbbbbb0000bb000bb0bbb0bb000bb0bbb0000bb0bb000bbb0000bbbbb000bb0000bb0000bbb000bb0bbb0bb000bb0bbb0bb0bb00bb0bbb -bbbbbbb0bbb0bbbb0bbb0bb0000bb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb00000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbb0bbb0b0bbb0b0bbb0b0b0bbb0b0bb0b0bbbbb0bbb0b0bb00b0bb0bb0b0bbb0b0bbb0bbbb0bbb0b0bbbbb0bbb0b0bbb0b0bb0bb0b0bbb -0b0bb00b0bb0bbb0b0bbbbb0bbb0b0bbb0b0bbb0b0bbb0b0bb0bbb0b0bb0bbb0b0bbb0bbbb0bbb0b0bbb0b0bbb0b0bbb0b0bbb0b0bbb0b0bbb0b0bb0bb0bbbbb -bbbbbbb0bbb0bbbb0bbb0b0bbb0b0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaa0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbb0bbb0b0bbb0b0bbb0b0b0bbb0bbb0bb0bbbbb0bbb0b0bbb0b0bb0bb0b0bbb0b0bbb0bbbb0bbb0b0bbbbb0bbbbb0bbb0b0bb0bb0b0bbb -0b0bbb0b0bb0bbbbb0bbbbb0bbb0b0bbbbb0bbb0b0bbbbb0bb0bbb0b0bb0bbbbb0bbb0bbbb0bbb0b0bbb0b0bbb0b0bbb0b0bbb0b0bbbbb0bbb0b0bbbb0bbbbbb -bbbbbb0b0b0b0bbb0bbb0b0bbb0b0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbb0000b0bbb0bb0000b0b0bbb0bb0bbb0bbbbb0bbb0b0bbb0b0bb0bb0bb0000b0bbb0bbbb0bbb0b0bbbbb0bbbbb0bbb0b0bb0bb0b0bbb -0b0bbb0b0bb00000b0bb00b0bbb0b00000b0bbb0b00000b0bbb0000b0bb00000b0bbb0bbbb0bbb0b0bbb0b0bbb0b0bbb0b0bbb0b00000b0bbb0b0bbb0bbbbbbb -bbbbbb0b0b0b0bbb0bbb0bb0000b0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbb0b0bbb0bbbbb0b0b00bb0b0bb0b0bbbbb00bb0b0bbb0b0bb0bb0bbbbb0b00bb0bbbb0bbb0b0bbbbb0bbb0b0bbb0b0bb0bb0b0bbb -0b0bbb0b0bb0bbb0b0bbbbb0bbb0b0bbb0b00bb0b0bbb0b0bbbbbb0b0bb0bbb0b0bbb0bbbb0bbb0b0bbb0b0bbb0b0bbb0b00bb0b0bbb0b00bb0b0bb0bb0bbbbb -bbbbb0bbb0bbb0bb00bb0bbbbb0b0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbb000bbb0000bb000bb0b0b00bbb00bb00bbbb0b00bb0bbb0b000b00bbb000bb0b00bbbbbb000bb00bbbbb000bbb000bb000b00bb0000 -bb0bbb0b00bb000bb00bbbbb0000bb000bb0b00bbb000bb00bb000bb00bb000bbb0000bbbbb000bb0000bb0000bbb000bb0b00bbb000bb0b00bb00bb00bbbbbb -bbbbb0bbb0bbb0bb0b00bbb000bb00bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbb -bbbbb0bbb0bbb0bb0bbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbb -bbbb0bbbbbbbbb0b0bbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbfbbbbbbbbbbbbb0bbbbb0bb0000bbb0bbbb0000b0bbb0bb000bbb000bbb0000bbbb0 -bb0bb0bbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbb0bbbbbbbbb0b0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbfbbbbbbbbbbbbb0bbbbb0b0bbb0bbb0bbb0bbb0b0bbb0b0bbb0b0bbb0b0bbb0bbbbb -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbfbbbbbbbbbbbbbb00000bb0bbb0bb0b0bb0bbb0b0bbb0b0bbbbb0bbbbb0bbb0bbbbb -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbfbbbbbbbbbbbbbb0bbb0bb0bbb0bb0b0bbb0000b0bbb0b0bbbbb00000b0bbb0bbbbb -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb00bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb00bbbbbbbbbbbbbbbbbbbb -b00bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0000bbbbbbbb0000bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbfbbbbbbbbbbbbbb0bbb0bb0bbb0b0bbb0bbbbb0b00bb0b0bbb0b0bbb0b0bbb0bbbbb -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbb -bbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbfbbbbbbbbbbbbbbb0b0bbbb0000b0bbb0bb000bb0b00bbb000bbb000bbb0000bbbbb -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbb0bb0bbb0bbb0bbbbb0bb0000bb0bbbbb0bbb0bbbbb0bbbb000bbb00b0bbbbb000bbb0000b0bbb0bbbb0bb0bb0bbbbbbb000bb0bbb0bb -bbb0bbbb000bbb00b0b0bbbbbb000bbb0bbb0bb0bbb0bbbbb000bb0bbbbbb000bb0bbb0bb0000bb0000bb0000bb000bbbbb0b0bbb0bbbbb0000b0b0bbbbbb000 -bbb000bb0bb0bb0b0000bbb0000bb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbfbbbbbbbbbbbbbbb0b0bbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbb -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbb0bb0bbb0bbb0bbbbb0b0bbbb0b0bb0bb0bbbbbbbbb00bb0bbb0b0bb00bbbb0bbb0b0bbb0b0bbb0bbbb0bb0bb00bbbbb0bbb0b0bbb0bb -bbb00bb0bbb0b0bb00b0bbbbb0bbb0bb0bbb0bb0bbb0bbbb0bbb0b0bbbbb0bbb0b0bbb0b0bbb0b0bbb0b0bbb0b0bbb0bbbb0b0bbb0bbbb0bbb0b0b0bbbbb0bbb -0b0bbb0b0bb0bb0b0bbb0b0bbb0b0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbfbbbbbbbbbbbbbbbb0bbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbb -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbb0bb0bbb0bbbb00000bb0bbbbbb0bb0bb0bbbbbbbb0bb0b0bbb0b0bbb0bbbb0bbbbb0bbb0b0bbb0bbbb0bb0b0bb0bbbb0bbb0b0bbb0bb -bb0bb0b0bbb0b0bbb0b0bbbbb0bbb0b0b0b0b0b0bbb0bbbb0bbb0b0bbbbb0bbbbb0bbb0b0bbb0b0bbb0b0bbb0b0bbbbbbbb0b0bbb0bbbb0bbb0b0b0bbbbb0bbb -bb0bbb0b0bb0bb0b0bbb0b0bbb0b0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbfbbbbbbbbbbbbbbbb0bbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbb -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbb0bb0bbb0bbbb0bbb0bb0bbbbbb0b0b0b0bbbbbbbb0bb0b0bbb0b0bbb0bbbb0bbbbbb0000b0bbb0bbbb0bb0b0bb0bbbb0bbb0b0bbb0bb -bb0bb0b0bbb0b0bbb0b0bbbbb0bbb0b0b0b0b0b0bbb0bbbb0bbb0b0bbbbb00000b0bbb0b0bbb0bb0000b0bbb0b00000bbbb0b0bbb0bbbbb0000b0b0bbbbb0bbb -bb0bbb0b0bb0bb0b0bbb0bb0000b0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbb0bb00bb0bbbb0bbb0bb0bbbbbb0b0b0b0bbbbbbbb0bb0b0bbb0b0bbb0bbbb0bbb0bbbbb0b00bb0bbbb0bb0b0bb0bbbb0bbb0b00bb0bb -bb0bb0b0bbb0b0bbb0b0bbbbb0bbb0b0bb0bb0b00bb0bbbb0bbb0b0bbbbb0bbb0b00bb0b0bbb0bbbbb0b0bbb0b0bbb0bbbb0b00bb0bbbbbbbb0b0b0bbbbb0bbb -0b0bbb0b0bb0bb0b0bbb0bbbbb0b0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbb0bb0b00bbbbbb0b0bbb0bbbbbb00bbb00bbbbbbbb0bb0bb000bb0bbb0bbbbb000bbb000bb0b00bbbbb00b0b0bb0bbbbb000bb0b00bbb -bb0bb0bb000bb0bbb0b00bbbbb000bb0bb0bb0b0b00bbbbbb000bb00bbbbb000bb0b00bbb0000bb000bbb0000bb000bbbbb0b0b00bbbbbb000bb0b00bbbbb000 -bbb000bb000b00bb0000bbb000bb00bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbb0b0bbb0bbbbbb00bbb00bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bb0bbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbb0bbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbba0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbb0bbbb0bbbb0b0bbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bb0bbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbb0bbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffff0bbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbb0bbbbb0000bb0bbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0b0bbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbb0bbbbbbbbbbb -bbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfb11111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -1111111111111111111111111111111ba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfb11111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -1111111111111111111111111111111ba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfb11111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -1111111111111000000000000000011ba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfb11111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -1111111111111faaaaaaaaaaaaaa011ba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfb11111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -1111111111111fbbbbbbbbbbbbba011ba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfb1111f -fff1111ffff111fff111fff11ff11ffff11ff11ff111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -1111111111111fbbbbbbbbbbbbba011ba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfb111ff -11ff11ff11ff1ff1ff1ff1ff1ff1ff11ff1ff11ff111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -1111111111111fbbb00bbbb00bba011ba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfb11111 -11ff11ff1111111ff1111ff11ff1ff11ff1ff11ff111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -1111111111111fbbbb00bb00bbba011ba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfb11111 -11ff11ffffff11ff1111ff111ff1ff11ff1ff11ff111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -1111111111111fbbbbb0000bbbba011ba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfb1111f -fff111ff11ff1ff1ff1ff1ff1ff1ff11ff1fff1ff111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -1111111111111fbbbbbb00bbbbba011ba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfb111ff -1111111ffff111fff111fff11ff11ffff11fffff1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -1111111111111fbbbbb0000bbbba011ba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfb111ff -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -1111111111111fbbbb00bb00bbba011ba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfb111ff -11ff1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -1111111111111fbbb00bbbb00bba011ba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfb1111f -fff1111111111111111111111ff11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -1111111111111fbbbbbbbbbbbbba011ba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfb11111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -1111111111111fbbbbbbbbbbbbba011ba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfb11111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -1111111111111fffffffffffffff011ba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfb11111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -1111111111111111111111111111111ba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfb11111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -1111111111111111111111111111111ba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffa0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff05000000070101000000030000000000}}}{\cf9 -\par }{ -\par }\pard\plain \s17\fi-1440\li1440\sa120\widctlpar\tx1440\adjustright \f1\fs18 {Advanced\tab Use this button to select a different DirectPlay service provider (modem, TCP/IP, direct connect serial, or IPX) or to set IEEE 1278 DIS parameters. -\par }\pard\plain \sa120\widctlpar\adjustright \f1\fs22\cgrid { -\par }} \ No newline at end of file diff -Nru acm-5.0/acm.tcl acm-6.0+20200416/acm.tcl --- acm-5.0/acm.tcl 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/acm.tcl 2017-10-29 05:26:03.000000000 +0000 @@ -0,0 +1,1253 @@ +#!/usr/bin/wish +# Simple interface to start the ACM program. +# +# Requires the tk/tcl interpreter from http://www.tcl.tk/ +# Under Windows, the recommended implementation I suggest is that by Magicsplat +# at http://www.magicsplat.com/tcl-installer/index.html +# +# Author: Umberto Salsi (salsi@icosaedro.it) +# Version: $Date: 2017/10/29 05:21:15 $ + +set padx 10 +set pady 10 + +set butw 10 + +set font_norm "Helvetica 10" +set font_em "Helvetica 10 bold" +set font_but "Helvetica 10 bold" +set font_mono "Courier 9" + + +# Creates a button. +# path: tk path of the button. +# name: label. +# cmd: associated command. +# +proc StdButt { path name cmd } { + global font_but + button $path -text $name -width 10 -command $cmd -font $font_but + #pack $path +} + + +# Text entry box. +# w: tk path. +# label: description before entry field. +# varname: bound variable. +# width: width of the text entry field (roughly a char). +# unit: description past the entry box, typically the unit of measurement. +# +proc StdEntry { w label varname width unit } { + global font_norm + frame $w + #pack $w + + label $w.l -text $label -font $font_norm -width 18 -anchor w + pack $w.l -side left + + if { [string length $unit] >= 1 } { + label $w.u -text $unit -font $font_norm + pack $w.u -side right + } + + entry $w.v -textvariable $varname -background white -width $width + pack $w.v -side right +} + + +# Button press feedback and associated command invocation. +# +proc Press { button } { + $button configure -relief sunken + update ;# update window + after 500 ;# wait 0.5 s + $button configure -relief raised ;# release button + $button invoke ;# execute command bound to the button +} + + +# Returns the absolute path of the file using the current working directory for +# resolution. Returns the path itself if not relative. +# +proc abspath { file } { + if { ! [file exists $file] } { + return $file + } + if { [file pathtype $file] == "relative" } { + set file [file join [pwd] $file] + } + return $file +} + + +# Tries to figure out where the objects directory is and return the best guess. +# +proc GuessObjectsDir { } { + global program objects + if { [string length $objects] > 0 } { + return + } + if { [string length $program] == 0 } { + return + } + set d [file dirname [file dirname $program]] + set d "$d/objects" + if { [file exists $d] } { + set objects $d + } +} + + +# Parse int number. Returns 0 on error. +proc parseInt { x } { + if { [scan $x "%d" y] == 1 } { + return $y + } else { + return 0 + } +} + +# Par floating point number. Returns zero on error. +proc parseFloat { x } { + if { [scan $x "%f" y] == 1 } { + return $y + } else { + return 0.0 + } +} + + +set PI 3.141592653589793 +set FEETtoMETERS 0.30480060960 +set EARTH_MAJOR 6378137.0 + + +# Parse latitude. +# lat_string: latitude as "DD-PP-SS.SSSH". +# Returns: RAD. +proc parseLatitude {lat_string} { + global PI + if { [scan $lat_string "%d-%d-%f%c" d p s e] != 4 } { + error "Failed to parse latitude $lat_string." + return 0 + } + set lat [expr $d/180.0*$PI + ($p/60.0/180.0*$PI) + $s/3600.0/180.0*$PI] + if { [string compare $e "S"] == 0 } { + set lat [expr - $lat] + } + return $lat +} + + +# Parse longitude. +# s: latitude as "DD-PP-SS.SSSH". +# Returns: RAD. +proc parseLongitude {lon_string} { + global PI + if { [scan $lon_string "%d-%d-%f%c" d p s e] != 4 } { + error "Failed to parse longitude $lon_string." + return 0 + } + set lon [expr $d/180.0*$PI + ($p/60.0/180*$PI) + $s/3600.0/180*$PI] + if { [string compare $e "W"] == 0 } { + set lat [expr - $lon] + } + return $lon +} + + +proc formatLatitude {lat} { + global PI + set e "N" + if { $lat < 0 } { + set lat [expr - $lat] + set e "S" + } + set lat [expr $lat / $PI * 180.0] + set d [expr floor($lat)] + set lat [expr 60.0*($lat - $d)] + set p [expr floor($lat)] + set lat [expr 60.0*($lat - $p)] + set s $lat + return [format "%02.0f-%02.0f-%02.3f%s" $d $p $s $e] +} + + +proc formatLongitude {lon} { + global PI + set e "E" + if { $lon < 0 } { + set lon [expr - $lon] + set e "W" + } + set lon [expr $lon / $PI * 180.0] + set d [expr floor($lon)] + set lon [expr 60.0*($lon - $d)] + set p [expr floor($lon)] + set lon [expr 60.0*($lon - $p)] + set s $lon + return [format "%03.0f-%02.0f-%02.3f%s" $d $p $s $e] +} + + +# Returns runway ends gedetic coordinates given it center, length and bearing. +# Used to convert the RWY2 records. +# Return: list of lat1, lon1, lat2 and lon2. +proc computeRunwayEnds { center_lat_field center_lon_field len_field heading_field } { + global PI FEETtoMETERS EARTH_MAJOR + set center_lat [parseLatitude $center_lat_field] + set center_lon [parseLongitude $center_lon_field] + set half_len [expr 0.5 * [parseFloat $len_field] * $FEETtoMETERS] + set heading [expr [parseFloat $heading_field] / 180.0 * $PI] + # Normalize heading range to [0,180[ so runway ends can be listed in + # the correct order. + if { $heading >= $PI } { + set heading [expr $heading - $PI] + } + set delta_lat [expr $half_len * cos($heading) / $EARTH_MAJOR] + set delta_lon [expr $half_len * sin($heading) / ($EARTH_MAJOR * cos($center_lat))] + return [list \ + [formatLatitude [expr $center_lat - $delta_lat]] \ + [formatLongitude [expr $center_lon - $delta_lon]] \ + [formatLatitude [expr $center_lat + $delta_lat]] \ + [formatLongitude [expr $center_lon + $delta_lon]] ] +} + + +set displayLongMessageCount 0 + + +proc DisplayLongMessage { title content } { + global displayLongMessageCount + set displayLongMessageCount [expr $displayLongMessageCount + 1] + set w .displayLongMessage_$displayLongMessageCount + toplevel $w + wm title $w $title + wm minsize $w 400 300 + frame $w.f + text $w.f.t -width 50 -height 10 -yscrollcommand "$w.f.sbar set" + scrollbar $w.f.sbar -orient vertical -command "$w.f.t yview" + $w.f.t insert 1.0 $content + $w.f.t see end + pack $w.f.t -side left -fill y -expand true -fill both + pack $w.f.sbar -side left -fill y + pack $w.f -expand true -fill both + button $w.ok -text " OK " -command "destroy $w" + pack $w.ok -side bottom -pady 5 + wm withdraw $w + update + wm deiconify $w +} + + +proc RunACM {} { + global \ + env \ + mouse_mode \ + airspeed \ + altitude \ + debug \ + dis_force \ + dis_protocol \ + dis_relay_name \ + dis_relay_port \ + dis_appl \ + dis_exercise \ + dis_site \ + drone_mode \ + drone_aggressiveness \ + framerate \ + fuel \ + payload \ + hud_mode \ + geometry_w geometry_h geometry_x geometry_y \ + heading \ + joystick \ + dept_descr \ + dept_time_usenow \ + dept_time \ + latitude \ + longitude \ + objects \ + plane \ + program \ + eye_to_screen_cm \ + downward_view_angle_deg \ + sound \ + visibility \ + clouds_base \ + clouds_top \ + wind_d \ + wind_v \ + gust \ + ground_mode \ + + + if { [file exists $program] } { + set program [abspath $program] + } + + if { [file exists $objects] } { + set objects [abspath $objects] + } + + set user "guest" + if { [info exists env("USER")] } { + # Typically available on *nix. + set user $env("USER") + } elseif { [info exists env("USERNAME")] } { + # Available on Cygwin. + set user $env("USERNAME") + } + + set opt "-name \"$user\" -mouse-mode $mouse_mode -da 0.$drone_aggressiveness" + + if { [string compare $drone_mode "hunting" ] == 0 } { + set opt "$opt -drone-mode HUNTING" + } else { + set opt "$opt -drone-mode DOG_FIGHT" + } + + if { [string length $geometry_w] >= 1 && [string length $geometry_h] >=1 } { + set geometry_w [parseInt $geometry_w] + set geometry_h [parseInt $geometry_h] + set opt "$opt -geometry ${geometry_w}x$geometry_h" + if { [string length $geometry_x] >= 1 && [string length $geometry_y] >= 1 } { + set geometry_x [parseInt $geometry_x] + set geometry_y [parseInt $geometry_y] + set opt "$opt+$geometry_x+$geometry_y" + } + } + + if { [string length $objects] >= 1 } { + set opt "$opt -objects $objects" + } + + if { [string length $eye_to_screen_cm] >= 1 } { + set eye_to_screen_cm [expr floor(10.0 * [parseFloat $eye_to_screen_cm]) / 10] + if { $eye_to_screen_cm < 5 } { + set eye_to_screen_cm 5 + } + if { $eye_to_screen_cm > 500 } { + set eye_to_screen_cm 500 + } + set opt "$opt -eye_to_screen_cm $eye_to_screen_cm" + } + + if { [string length $downward_view_angle_deg] >= 1 } { + set downward_view_angle_deg [expr floor(10.0 * [parseFloat $downward_view_angle_deg]) / 10] + if { $downward_view_angle_deg < 0.0 } { + set downward_view_angle_deg 0.0 + } + if { $downward_view_angle_deg > 45.0 } { + set downward_view_angle_deg 45.0 + } + set opt "$opt -downward_view_angle_deg $downward_view_angle_deg" + } + + if { $dis_protocol } { + set opt "$opt -force $dis_force -dis-relay-name \"$dis_relay_name\" -dis-relay-port $dis_relay_port -dis-site \"$dis_site\" -dis-exercise \"$dis_exercise\" -dis-appl \"$dis_appl\"" + } + + if { ! $sound } { + set opt "$opt -no-sound" + } + + if { [string length $framerate] >= 1 } { + set framerate [parseInt $framerate] + set opt "$opt -frame-rate $framerate" + } + + if { [string length $visibility] >= 1 } { + set visibility [parseFloat $visibility] + set opt "$opt -visibility $visibility" + } + + set clouds_base [parseFloat $clouds_base] + set clouds_top [parseFloat $clouds_top] + if { $clouds_base <= $clouds_top } { + set opt "$opt -clouds-range $clouds_base $clouds_top" + } + + if { [string length $clouds_base] >= 1 && [string length $clouds_top] >= 1 } { + set clouds_base [parseFloat $clouds_base] + set clouds_top [parseFloat $clouds_top] + } + + if { [string length $wind_d] >= 1 && [string length $wind_v] >= 1 } { + set wind_d [parseInt $wind_d] + set wind_v [parseInt $wind_v] + set opt "$opt -wind $wind_d/$wind_v" + } + + if { [string length $gust] >= 1 } { + set gust [parseFloat $gust] + set opt "$opt -gust $gust" + } + + set opt "$opt -ground-mode $ground_mode" + + set opt "$opt -plane \"$plane\"" + + if { [string length $fuel] > 0 } { + set fuel [parseInt $fuel] + set opt "$opt -fuel $fuel" + } + + if { [string length $payload] > 0 } { + set payload [parseInt $payload] + set opt "$opt -payload $payload" + } + + if { $hud_mode } { + set opt "$opt -hud-mode" + } + + if { ! $dept_time_usenow && [string length $dept_time] > 0 } { + #set opt "$opt -departure-time \"$dept_time\"" + set opt "$opt -departure-time $dept_time" + } + + if { [string length $latitude] >= 1 } { + set opt "$opt -latitude $latitude" + } + + if { [string length $longitude] >= 1 } { + # FIXME: missing validation + #scan $longitude "%d-%d-%f%s" d p s e + #set lon [expr $d + ($p/60.0) + $s/3600.0] + #if { [string compare $e "W"] == 0 } { + # set lon [expr - $lon] + #} + set opt "$opt -longitude $longitude" + } + + if { [string length $altitude] >= 1 } { + set altitude [parseInt $altitude] + set opt "$opt -altitude $altitude" + } + + if { [string length $heading] >= 1 } { + set heading [parseInt $heading] + set opt "$opt -heading $heading" + } + + if { [string length $airspeed] >= 1 } { + set airspeed [parseInt $airspeed] + set opt "$opt -airspeed-kt $airspeed" + } + + #if { [string length $joystick] >= 1 } { + # set opt "$opt -js $joystick" + #} + + if { $debug } { + set cmd "xterm -e gdb --args $program $opt" + #puts "$cmd" + } else { + set cmd "$program $opt" + } + + wm iconify . + # Notes about the behavior of the tcl "exec" command. + # $out collects both stdout and stderr. + # If the invoked program sends anything to stderr, "exec" will + # report error code 1 anyway, disregarding the actual exit status. + # If the exit status of the program is error but no output sent to stderr, + # tcl adds the line "child process exited abnormally" to $out. + set status [catch {eval exec $cmd} out] + wm deiconify . + if { $status == 0 } { + if { [string length $out] > 0 } { + DisplayLongMessage "ACM message for you" $out + } + } else { + DisplayLongMessage "ACM Error Report" \ + "ACM ERROR REPORT\n\nCommand\n--------------------\n$cmd\n\nOutput\n--------------------\n$out\n\nExit code\n--------------------\n$status" + } +} + + +proc SetDefault { } { + global \ + rcfile \ + mouse_mode \ + airspeed \ + altitude \ + debug \ + dis_force \ + dis_protocol \ + dis_relay_name \ + dis_relay_port \ + dis_appl \ + dis_exercise \ + dis_site \ + drone_mode \ + drone_aggressiveness \ + framerate \ + fuel \ + payload \ + hud_mode \ + geometry_w geometry_h geometry_x geometry_y \ + heading \ + joystick \ + dept_descr \ + dept_time_usenow \ + dept_time \ + latitude \ + longitude \ + objects \ + plane \ + program \ + eye_to_screen_cm \ + downward_view_angle_deg \ + sound \ + visibility \ + clouds_base \ + clouds_top \ + wind_d \ + wind_v \ + gust \ + ground_mode \ + + set mouse_mode "normal" + set airspeed "" + set altitude "" + set debug 0 + set dis_force "Other" + set dis_protocol 0 + set dis_relay_name "" + set dis_relay_port 3000 + set dis_appl -1 + set dis_exercise 1 + set dis_site -1 + set drone_mode "dog fight" + set drone_aggressiveness 50 + set framerate 20 + set fuel "" + set payload 150 + set hud_mode 0 + set geometry_w "800" + set geometry_h "600" + set geometry_x "0" + set geometry_y "0" + set heading "" + set joystick "" + set dept_descr "" + set dept_time_usenow "1" + set dept_time "" + set latitude "" + set longitude "" + set objects "" + if { [file exists "objects"] } { + set objects "objects" + } else { + # keep curr value + } + set plane "C-172" + if { [file exists "acm.exe"] } { + set program "acm.exe" + } elseif { [file exists "src/acm/acm.exe"] } { + set program "src/acm/acm.exe" + } else { + # keep curr value + } + set eye_to_screen_cm 50.0 + set downward_view_angle_deg 10.0 + set sound 0 + set visibility 20 + set clouds_base 0 + set clouds_top 0 + set wind_d "0" + set wind_v "0" + set gust 0 + set ground_mode flat +} + + +proc Save { } { + global \ + rcfile \ + mouse_mode \ + airspeed \ + altitude \ + debug \ + dis_force \ + dis_protocol \ + dis_relay_name \ + dis_relay_port \ + dis_appl \ + dis_exercise \ + dis_site \ + display \ + drone_mode \ + drone_aggressiveness \ + framerate \ + fuel \ + payload \ + hud_mode \ + geometry_w geometry_h geometry_x geometry_y \ + heading \ + joystick \ + dept_descr \ + dept_time_usenow \ + dept_time \ + latitude \ + longitude \ + objects \ + plane \ + program \ + eye_to_screen_cm \ + downward_view_angle_deg \ + sound \ + visibility \ + clouds_base \ + clouds_top \ + wind_d \ + wind_v \ + gust \ + ground_mode \ + + set fid [open $rcfile w] + puts $fid "set mouse_mode \"$mouse_mode\"" + puts $fid "set airspeed \"$airspeed\"" + puts $fid "set altitude \"$altitude\"" + puts $fid "set debug \"$debug\"" + puts $fid "set dis_protocol \"$dis_protocol\"" + puts $fid "set dis_relay_name \"$dis_relay_name\"" + puts $fid "set dis_relay_port $dis_relay_port" + puts $fid "set dis_appl $dis_appl" + puts $fid "set dis_exercise $dis_exercise" + puts $fid "set dis_site $dis_site" + puts $fid "set drone_mode \"$drone_mode\"" + puts $fid "set drone_aggressiveness $drone_aggressiveness" + puts $fid "set framerate \"$framerate\"" + puts $fid "set fuel \"$fuel\"" + puts $fid "set payload \"$payload\"" + puts $fid "set hud_mode $hud_mode" + puts $fid "set geometry_w \"$geometry_w\"" + puts $fid "set geometry_h \"$geometry_h\"" + puts $fid "set geometry_x \"$geometry_x\"" + puts $fid "set geometry_y \"$geometry_y\"" + puts $fid "set heading \"$heading\"" + puts $fid "set joystick \"$joystick\"" + puts $fid "set dept_descr \"$dept_descr\"" + puts $fid "set dept_time_usenow \"$dept_time_usenow\"" + puts $fid "set dept_time \"$dept_time\"" + puts $fid "set latitude \"$latitude\"" + puts $fid "set longitude \"$longitude\"" + puts $fid "set objects \"$objects\"" + puts $fid "set plane \"$plane\"" + puts $fid "set program \"$program\"" + puts $fid "set eye_to_screen_cm \"$eye_to_screen_cm\"" + puts $fid "set downward_view_angle_deg \"$downward_view_angle_deg\"" + puts $fid "set sound \"$sound\"" + puts $fid "set dis_force $dis_force" + puts $fid "set visibility \"$visibility\"" + puts $fid "set clouds_base \"$clouds_base\"" + puts $fid "set clouds_top \"$clouds_top\"" + puts $fid "set wind_d \"$wind_d\"" + puts $fid "set wind_v \"$wind_v\"" + puts $fid "set gust \"$gust\"" + puts $fid "set ground_mode \"$ground_mode\"" + close $fid +} + + +proc readPlanesList { } { + global program objects + + if { ! [file exists "$program"] } { + return ERROR_missing_program + } + + if { ! [file exists "$objects"] } { + return ERROR_missing_objects_dir + } + + catch {exec $program -objects $objects -plane xxx} err + set planes [split $err "\n"] + set planes [lrange $planes 1 [expr [llength $planes] - 2]] + set planes [lsort $planes] + return $planes +} + + +proc updatePlanesMenu { } { +# Populates the planes menu + global planes_menu + + set planes [readPlanesList] + $planes_menu delete 0 9999 + foreach p $planes { + $planes_menu add command -label $p -command "set plane \"$p\"" + } +} + + +proc show_panel { panel } { + # Raise all the tab button: + .tab.plane configure -relief raised + .tab.departure configure -relief raised + .tab.environment configure -relief raised + .tab.drones configure -relief raised + .tab.configure configure -relief raised + .tab.dis configure -relief raised + + # Hide all the panels: + pack forget .plane .departure .environment .drones .configure .dis + + # Sunk selected button and show selected panel: + .tab.$panel configure -relief sunken + pack .$panel -anchor nw -expand 1 -fill both -padx 30 -pady 15 +} + + +SetDefault + + +# +# Load saved preferences: +# + +set home $env(HOME) +set rcfile "$home/.acmtk.rc" +if { [file exists $rcfile] } { + source $rcfile +} + + + +wm title . "Air Combat Maneuvering" + +# +# Layout: +# + +# Tab buttons: +pack [frame .tab] -side top -anchor nw + +# Buttons: +pack [frame .buttons] -side bottom -anchor se +pack [frame .space -width 20] -side bottom + +# Panels: +pack \ + [frame .plane] \ + [frame .departure] \ + [frame .environment] \ + [frame .drones] \ + [frame .configure] \ + [frame .dis] \ + -anchor nw + + +# +# Tab buttons: +# + +set f .tab +button $f.plane -text Plane -command {show_panel plane} +button $f.departure -text Departure -command {show_panel departure} +button $f.environment -text Environment -command {show_panel environment} +button $f.drones -text Drones -command {show_panel drones} +button $f.dis -text DIS -command {show_panel dis} +button $f.configure -text Configure -command {show_panel configure} +pack $f.plane $f.departure $f.environment $f.drones $f.dis $f.configure -side left + + +# +# "Plane" panel: +# + +set f .plane.model +pack [frame $f] -anchor nw +pack [label $f.l -text "Model:" -font $font_norm] -side left +set planes_menu [tk_optionMenu $f.v plane ???] +pack $f.v -side left + +set f .plane +StdEntry $f.payload "Payload:" payload 8 "lb" +StdEntry $f.fuel "Fuel:" fuel 8 "lb" +pack $f.payload $f.fuel -anchor nw + +set g $f.hud_mode +pack [frame $g] -anchor nw + +set g $f.panel +pack [frame $g] -anchor nw +pack [label $g.l -text "Panel:" -font $font_norm] -side left +pack [radiobutton $g.classic -text "Classic" \ + -variable hud_mode -value 0 -font $font_norm] -side left +pack [radiobutton $g.hud -text "HUD" \ + -variable hud_mode -value 1 -font $font_norm] -side left + +StdEntry $f.eye_to_screen_cm "Eye dist. from screen:" \ + eye_to_screen_cm 5 "cm" +pack $f.eye_to_screen_cm -anchor nw + +StdEntry $f.downward_view_angle_deg "Downward view angle:" \ + downward_view_angle_deg 5 "DEG" +pack $f.downward_view_angle_deg -anchor nw + + +# +# "Departure" panel: +# + + +proc error {msg} { + tk_messageBox -type ok -icon error -message $msg -parent . -title Error +} + + +# Trim and split the string at spaces. Return list of fields. +# Empy lines and lines beginning with '#' contains zero fields. +proc mysplit {s} { + set res {} + set s [string trim $s] + if { [string length $s] == 0 + || [string compare [string index $s 0] "#"] == 0 } { + return $res + } + set l [split $s] + foreach e $l { + set x [string trim $e] + if {[string length $x] > 0} { + lappend res $x + } + } + return $res +} + + +# Zone selected from zones menu. Parses the scenery file and collects runways, +# then populates the runways list box. +# zones_path: path of the zones file needed for relative path resolution. +# zone: path of the scenery; if relative, join directory of zones file. +proc selectZone {zones_path zone} { + global curr_zone runways_listbox + $runways_listbox delete 0 end + set curr_zone $zone + set zone_path $zone + if {[file pathtype $zone_path] == "relative"} { + set zones_dir [file dirname $zones_path] + set zone_path "$zones_dir/$zone_path" + } + if [catch {open $zone_path r} f] { + error "Failed opening $zone_path." + return + } + set entries {} + while {[gets $f line] >= 0} { + set args [mysplit $line] + if {[llength $args] == 10 && [lindex $args 0] == "RWY"} { + set lat1 [lindex $args 6] + set lon1 [lindex $args 7] + set lat2 [lindex $args 8] + set lon2 [lindex $args 9] + + } elseif {[llength $args] == 9 && [lindex $args 0] == "RWY2"} { + set ends [computeRunwayEnds [lindex $args 6] [lindex $args 7] \ + [lindex $args 4] [lindex $args 8]] + set lat1 [lindex $ends 0] + set lon1 [lindex $ends 1] + set lat2 [lindex $ends 2] + set lon2 [lindex $ends 3] + + } else { + continue + } + set ends [split [lindex $args 2] "/"] + lappend entries [format " %-4s %-3s %s %s" [lindex $args 1] [lindex $ends 0] $lat1 $lon1] + lappend entries [format " %-4s %-3s %s %s" [lindex $args 1] [lindex $ends 1] $lat2 $lon2] + } + set entries [lsort -dictionary $entries] + foreach e $entries { + $runways_listbox insert end $e + } + close $f +} + + +# Populates the zones menu reading the specified zones file. +# +proc updateZonesMenu {zones_path} { + global curr_zone zones_menu + set curr_zone "" + if [catch {open $zones_path r} f] { + error "Failed opening $zones_path." + return + } + $zones_menu delete 0 end + set curr_zone "" + while {[gets $f line] >= 0} { + set args [mysplit $line] + if {[llength $args] != 5} { + continue + } + set zone [lindex $args 4] + if {[string length $curr_zone] == 0} { + set curr_zone $zone + } + $zones_menu add command -label $zone -command "selectZone {$zones_path} {$zone}" + } + close $f +} + + +# Runway selection callback bind to the <> event. +# Retrieve the runway just selected, parse its content and set the +# departure fields accordingly: description, lat, lon, heading. +# +proc selectRunway {} { + global runways_listbox curr_zone dept_descr latitude longitude heading altitude airspeed + set i [lindex [$runways_listbox curselection] 0] + if { [string length $i] == 0 } { + return + } + set l [mysplit [$runways_listbox get $i]] + if { [llength $l] != 4 } { + return + } + set airport [lindex $l 0] + set rwyend [lindex $l 1] + set latitude [lindex $l 2] + set longitude [lindex $l 3] + set dept_descr "[file tail $curr_zone] $airport $rwyend" + set heading [expr [scan $rwyend "%d"] * 10] + set altitude "" + set airspeed "" +} + + +# Load available zones and initialize zones menu and runways list box. +# +proc readZonesFile {} { + global objects curr_zone + set zones_path "$objects/zones.txt" + if { [file exists $zones_path] } { + updateZonesMenu $zones_path + if {[string length $curr_zone] > 0} { + selectZone $zones_path $curr_zone + } + } else { + error "Zones file $zones_path not found." + } +} + +set f .departure + +# Zones menu from the zones file: +set curr_zone "" +set g $f.zones +pack [frame $g] -anchor nw +pack [label $g.l -text "Zone:"] -side left +set zones_menu [tk_optionMenu $g.zones_menu curr_zone ???] +pack $g.zones_menu -side left + +# Runways from the selected zone: +set g $f.runways_listbox +pack [frame $g] -expand 1 -fill both -anchor nw -pady $pady +pack [label $g.l -text "Runway:"] -anchor nw +pack [listbox $g.lb -height 6 -yscrollcommand [list $g.sb set] -font $font_mono] -expand 1 -fill both -side left +pack [scrollbar $g.sb -orient vertical -command [list $g.lb yview] ] -fill y -side left +set runways_listbox $g.lb +# Invoke selectRunway on selection from this listbox: +bind $runways_listbox <> selectRunway +readZonesFile + +# Departure the user may choose from the widgets above or edit by hand: +StdEntry $f.dept_descr "Description:" dept_descr 30 "" +StdEntry $f.latitude "Latitude:" latitude 20 "" +StdEntry $f.longitude "Longitude:" longitude 20 "" +StdEntry $f.altitude "Altitude:" altitude 8 "ft" +StdEntry $f.heading "Magnetic Heading:" heading 4 "DEG" +StdEntry $f.airspeed "True Air Speed (TAS):" airspeed 4 "kt" +pack $f.dept_descr $f.latitude $f.longitude $f.altitude $f.heading $f.airspeed \ + -anchor nw + +set g $f.dept_time +pack [frame $g] -anchor nw +pack [label $g.l -text "Time:" -font $font_norm] -side left +set dept_time_entry $g.t +pack [entry $dept_time_entry -textvariable dept_time -width 30 -font $font_mono] -side left +# If using "now time", this proc disables the time entry box. +proc onUseNowCheck {} { + global dept_time_entry dept_time_usenow + if { $dept_time_usenow } { + $dept_time_entry configure -state disable + } else { + $dept_time_entry configure -state normal + } +} +pack [checkbutton $g.usenow -text "now" -variable dept_time_usenow \ + -font $font_norm -command onUseNowCheck ] -side left +onUseNowCheck + + +# +# "Environment" panel: +# + +set f .environment.environment +pack [frame $f] -anchor nw + +# Terrain rendering mode: +set g $f.ground +pack [frame $g] -anchor nw +pack [label $g.l -text "Terrain: " -font $font_norm] -side left +pack [radiobutton $g.flat -text "flat" \ + -variable ground_mode -value flat -font $font_norm] -side left +pack [radiobutton $g.tiled -text "tiled" \ + -variable ground_mode -value tiled -font $font_norm] -side left + +set slider_len 10 + +# Visibility: +scale $f.visibility -from 0 -to 20 -length 300 -variable visibility \ + -orient horizontal -label "Visibility (NM):" \ + -tickinterval 5 -showvalue false -sliderlength $slider_len \ + -font $font_norm -width 10 +pack $f.visibility + +# Clouds layer: +set g $f.clouds +pack [frame $g] -anchor nw +pack [label $g.l1 -text "Clouds base: " -font $font_norm] -side left +pack [entry $g.base -textvariable clouds_base -background white -width 6] -side left +pack [label $g.l2, -text "ft, top: " -font $font_norm] -side left +pack [entry $g.top -textvariable clouds_top -background white -width 6] -side left +pack [label $g.l3 -text "ft" -font $font_norm] -side left +pack [label $f.clouds_hint -text "(set both to zero for no clouds)" -font $font_norm] -anchor nw + +# Wind: +scale $f.wind_d -from 0 -to 360 -length 300 -variable wind_d \ + -orient horizontal -label "Wind direction (DEG):" \ + -tickinterval 45 -showvalue false -sliderlength $slider_len \ + -font $font_norm -width 10 +pack $f.wind_d + +scale $f.wind_v -from 0 -to 50 -length 300 -variable wind_v \ + -orient horizontal -label "Wind velocity (kt):" \ + -tickinterval 10 -showvalue false -sliderlength $slider_len \ + -font $font_norm -width 10 +pack $f.wind_v + +scale $f.gust -from 0 -to 20 -length 300 -variable gust \ + -orient horizontal -label "Wind gust max intensity (ft/s):" \ + -tickinterval 5 -showvalue false -sliderlength $slider_len \ + -font $font_norm -width 10 +pack $f.gust + + +# +# "Drone" panel +# + +set g .drones.drone_mode +frame $g -pady 20 +label $g.l -text "Mode:" -font $font_norm -width 20 -anchor w +tk_optionMenu $g.v drone_mode "dog fight" "hunting" +pack $g.l $g.v -side left +pack $g -anchor nw + +set g .drones.drone_aggressiveness +frame $g -pady 20 +label $g.note -text "Max allowed vertical load over structural limits:" +label $g.l -text "Aggressiveness:" -font $font_norm -width 20 -anchor w +tk_optionMenu $g.v drone_aggressiveness 30 40 50 60 70 80 90 +label $g.u -text "%" -font $font_em +pack $g.note -anchor nw +pack $g.l $g.v $g.u -side left +pack $g -anchor nw + + +# +# "Configure" panel +# + +set f .configure.program +frame $f -pady $pady +pack $f -side top -anchor nw +label $f.l -text "Program:" -font $font_norm +pack $f.l -side left -anchor nw +entry $f.v -textvariable program -background white -width 30 +pack $f.v -side left +button $f.program_sel -text "..." -command { + global program + set new $program + set new [tk_getOpenFile \ + -initialfile $program \ + -initialdir [file dirname "$program"] \ + -parent . \ + -filetypes { + {{ACM Program} {.exe}} + {{All Files} *} \ + } \ + -title "Select the ACM program" ] + if { [string length $new] > 0 } { + set program $new + updatePlanesMenu + } +} +pack $f.program_sel -side right + +set f .configure.objects +frame $f -pady $pady +pack $f -side top -anchor nw +label $f.l -text "Objects directory:" -font $font_norm +pack $f.l -side left -anchor nw +entry $f.v -textvariable objects -background white -width 30 +pack $f.v -side left +button $f.objects_sel -text "..." -command { + global program + set new $program + set new [tk_chooseDirectory \ + -initialdir $objects \ + -parent . \ + -title "Select the ACM objects directory" ] + if { [string length $new] > 0 } { + set objects $new + readZonesFile + } +} +pack $f.objects_sel -side top -anchor nw + +set f .configure + +StdEntry $f.framerate "Frame rate:" framerate 3 "Hz" +pack $f.framerate -side top -anchor nw + +set g $f.mouse_mode +frame $g +label $g.l -text "Mouse mode:" -font $font_norm -width 20 -anchor w +tk_optionMenu $g.v mouse_mode fast normal precise +pack $g.l $g.v -side left +pack $g -anchor nw + +#StdEntry $f.joystick "Joystick serial port:" joystick 15 "" +#pack $f.joystick -anchor nw + +set g $f.geometry_size +frame $g -pady $pady +label $g.l -text "Window size and position:" -font $font_norm -anchor w +pack $g.l -anchor nw + +entry $g.geometry_w -textvariable geometry_w -background white -width 4 +pack $g.geometry_w -side left + +label $g.x -text "x" -font $font_norm +pack $g.x -side left + +entry $g.geometry_h -textvariable geometry_h -background white -width 4 +pack $g.geometry_h -side left + +label $g.p1 -text "+" -font $font_norm +pack $g.p1 -side left + +entry $g.geometry_x -textvariable geometry_x -background white -width 4 +pack $g.geometry_x -side left + +label $g.p2 -text "+" -font $font_norm +pack $g.p2 -side left + +entry $g.geometry_y -textvariable geometry_y -background white -width 4 +pack $g.geometry_y -side left + +pack $g -anchor nw + + +checkbutton $f.sound -text "Enable sound effects" -variable sound -font $font_norm +pack $f.sound -anchor nw + +checkbutton $f.debug -text "Debug through GDB" -variable debug -font $font_norm +pack $f.debug -anchor nw + + +# +# "DIS" panel +# + +set f ".dis" + +# Set parameters panel visibility. +proc setDisParamsVisibility {} { + global dis_protocol + if { $dis_protocol } { + pack .dis.panel -anchor nw + } else { + pack forget .dis.panel + } +} + +checkbutton $f.enable -text "DIS protocol" \ + -variable dis_protocol \ + -command setDisParamsVisibility \ + -font $font_norm +pack $f.enable -anchor nw + +# Create the DIS parameters panel: +set f $f.panel +pack [frame $f] -anchor nw +setDisParamsVisibility + +set g $f.force +pack [frame $g] -anchor nw +pack [label $g.l -text "Force:" -font $font_norm] -side left +tk_optionMenu $g.v dis_force Other Friendly Opposing Neutral +pack $g.v -side left + +label $f.relay_l -text "Empty relay server for broadcast:" -font $font_norm +pack $f.relay_l -anchor nw +StdEntry $f.relay_name "Relay server:" dis_relay_name 25 "" +pack $f.relay_name -anchor nw +label $f.relay_l1 -text "Shared broadcast port or relay port:" -font $font_norm +pack $f.relay_l1 -anchor nw +StdEntry $f.relay_port "Port:" dis_relay_port 5 " (3000 std.)" +pack $f.relay_port -anchor nw + +frame $f.vspace2 -height 10 +pack $f.vspace2 -anchor nw +label $f.relay_l3 -text "DIS connection parameters. Site ID and appl. ID" \ + -font $font_norm +label $f.relay_l4 -text "should be set to -1 for automatic assignment." \ + -font $font_norm +pack $f.relay_l3 $f.relay_l4 -anchor nw +StdEntry $f.exercise "Exercise ID:" dis_exercise 3 " \[0,255\]" +pack $f.exercise -anchor nw +StdEntry $f.site "Site ID:" dis_site 5 " \[-1,65535\]" +pack $f.site -anchor nw +StdEntry $f.appl "Application ID:" dis_appl 5 " \[-1,65535\]" +pack $f.appl -anchor nw + +# +# Buttons: +# +set padx 10 +set pady 10 + +set f ".buttons" + +StdButt $f.run Run RunACM +pack $f.run -padx $padx -pady $pady -side right + +StdButt $f.default Default SetDefault +pack $f.default -padx $padx -pady $pady -side right + +pack [frame $f.space -width 30] -side right + +StdButt $f.quit Quit { Save; exit } +pack $f.quit -padx $padx -pady $pady -side left + +$f.run configure -default active +bind . "Press $f.run" +bind . "Press $f.run" +bind . "Press $f.quit" + +GuessObjectsDir +updatePlanesMenu +show_panel plane + +# THE END! diff -Nru acm-5.0/CHANGES.txt acm-6.0+20200416/CHANGES.txt --- acm-5.0/CHANGES.txt 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/CHANGES.txt 2020-04-16 12:05:35.000000000 +0000 @@ -0,0 +1,1358 @@ +acm-6.0_20200416 Umberto Salsi +=================================================== +Maintenance release: ++ World Magnetic Model library: updated source code and coefficients to the + latest version available WMM-2020. ++ Fix: charts updated; NDB frequency unit fixed to "KHz" (was "MHz"); + magnetic variation sign was reversed. ++ Fix: src/dis/test/decoy.exe did not compile under MinGW/Windows. ++ Fix: damage calculation: munitions were mostly ineffective due to a bug + (introduced by me :-). + + +acm-6.0_20180725 Umberto Salsi +=================================================== + ++ Fixes misleading indentation in source formatting of src/util/zulu.c which is + detected by newer GCC 6 and 7 as a "warning" and then failing to compile. + ++ Fixed PRNG test program, so now src/util/prng.c passes all FIPS 140-1 tests. + + +acm-6.0_20180402 Umberto Salsi +=================================================== + ++ Added new zones from the ourairports.com data base: France zone, Germany zone, + Spain zone, United Kingdom zone. + ++ New tools/ourairports_com program that generates sceneries from the + ourairports.com data base. + ++ New tools/create-ils program that generate ILS scenery record for each RWY + record found in the given scenery. Used to complete the sceneries created from + the ourairports.com data base, where all the ILS antennas are missing. + + +acm-6.0_20171030 Umberto Salsi +=================================================== + + ABSTRACT + Sceneries are loaded dynamically; flying between sceneries is now possible. + Departure airport, runway, date and time can now be set. + By setting a specific date and time, the corresponding Sun position, + environment lighting and Earth magnetic field are calculated. + A new tool (faaairports.exe) allows to generate the scenery for any chosen + area covered by the FAA airports data base, which covers the whole U.S. + territory. A new tool (chart.exe) allows to generate detailed navigation + charts in PDF format from any given ACM scenery. + +Changes to the configuration files: + ++ A new objects/zones.txt file has been added. This zones file lists all the + known scenery files and the range of latitude and longitude each scenery + covers. The program now dynamically loads and un-loads sceneries based on the + current position of the player. The limitation to a single scenery file per + program run has then been removed. + ++ File objects/inventory.txt renamed objects/aircraft.txt. + +Changes to the src/acm.exe program: + ++ Fixed crash when too many remote entities enter the simulation. The maximum + number of local and remote aircraft at any given time is 32; the maximum + number of local or remote munitions and explosions at any given time is 32. + The program warns when it runs out of free space in its entities tables. + ++ A new -departure-time TIMEDATE allows to set the departure date and time. + Sun position, scene lighting and Earth magnetic field are calculated based + on this value. The default is the current time retrieved from the internal + clock. The old "-lighting" (sic) option is not needed anymore -- removed. + ++ A new rendering command line parameter allows to choose among flat terrain + rendering (faster) or tiled terrain rendering (for some speed and altitude + feedback): + + -ground-mode MODE + + where MODE can be either "flat" (default) or "tiled". On computers with very + slow screen access time the first mode might be preferred. + ++ The clouds layer can now be set with the new command line parameter; + + -clouds-range BASE TOP + + where BASE and TOP are the base and top altitude of the clouds (ft). + If equal (or top is less than base) no clouds. Clouds are opaque to both + visible and infra-red light, which implies aircraft can hides inside clouds + and IR seekers of the missiles cannot lock the target and fly ballistically. + A clouds layer was already present in the last release of the program, but + its altitude range was not adjustable. The default now is no clouds. + ++ New -force [Other, Friendly, Opposing, Neutral} option to set the force the + layer belongs to. Old -team {1, 2} option removed. If the player belongs to + Friendly, its drones are created Opposing and attack any other force; If the + player belongs to any other force, its drones are created Friendly and attack + any other force (including the player itself). Drones created by player + belonging to the Friendly force are Opposing and using MiG-29; drones created + by player belonging to any other force are Friendly and using F-16. + ++ The -scene FILE command line option has been removed; scenery files are + automatically loaded based on the current position of the player. + Providing the starting position with the -latitude and -longitude command + line options is now pretty mandatory: the default start position is 0N 0E :-) + ++ Supports ILS types LDA and SDF as synonym of LOCATOR. + ++ Maximum tunable NDB frequecncy increased from 499 to 529 KHz. + ++ The flight state data page (SHIFT-D) now displays current or simulated time. + ++ Finer zoom by steps of about 1.2 factor rather than 2. + +New programs and tools: + ++ src/chart: a new program that reads an ACM scenery and generates the navigation + chart. Currently generates PostScript on output, which can be easily translated + to PDF -- see the readme file for more. + ++ tools/faaairports: a new program to parse the US FAA airports data base and + to generate the corresponding ACM scenery for any given range of latitude and + longitude. Also added shell scripts that automate the generation of the + "dallas" scenery and the new "newyork" scenery. + ++ The objects/dallas.txt is completely generated with the faaairports tool + based on the FAA airports data base; now it covers the latitude range + [30N,35N] and the longitude range [95W,100W] and includes 291 runways (+177%), + 34 ILS (+91%) and 76 NAVAIDs (+15) and it is supposedly more actual. + A new objects/newyork.txt has been also generated that covers the latitude + range [40N,45N] and longitude range [70W,75W]. Other regions covered by the + FAA data base can also be generated. + +Changes to the scenery file format: + ++ ILS record: added types LDA and SDF; see the reference manual for further + details about these new types and recommendations about the elevation field. + For short: LDA and SDF are just like LOCALIZER for the ACM program, but the + automatic navigation charts generator program is advised a runway end may + not be available so no error should be emitted. + ++ NAV record: field 7 (channel number) is now mandatory and '-' should be + indicated if not available/unknown; the ACM program does not use it anyway. + Change made only to simplify parsing programs so that each record has a + fixed number of fields. + +Changes to the acm.tcl launch program: + ++ The "You" panel renamed "Plane"; options related to the plane moved here; + the "Instruments" panel removed. + ++ A new "Departure" panel allows to choose the starting position as airport and + runway, along with altitude and airspeed. Departure date and time can be set. + ++ The "Environment" panel allows to chose among flat terrain rendering (faster) + and tiled terrain rendering (better feedback). + ++ The "Environment" panel allows to set the base and top altitude of a tick + layer of clouds. + + +acm-5.0-ico-20170914 Umberto Salsi +======================================================= + + Abstract. + Sounds support restored. The type of engine can now be specified and a specific + dynamics is applied. The anemometer now displays Mach's number too. Several + bugs fixed. + ++ Fix modulo bias in random number generation. Now the pseudo-random numbers + generators has its built-in implementation compliant with the C99, C11 + suggestion in the ISO/IEC 9899. + ++ Fix: under Windows, acm.tcl did not displayed the reason for the termination + of the program. This has been fixed by forcing the creation of a console + window to capture and preserve the standard output and standard error streams. + ++ Fix: C preprocessor macro "WINNT" replaces "WIN32" to support compilation + under both 32 and 64-bits Windows systems using MinGW. + ++ Each aircraft model now has its specific type of engine. Added the "EngineType" + field to the "aircraft" inventory record that may specify one among these: + + EngineType "NoEngine" + EngineType "GenericPistonEngine" + EngineType "GenericJetEngine" + EngineType "GenericRocketEngine" + + This allows to simulate the proper dynamics and to generate the proper sound + for each specific type of engine. Default is "NoEngine". + ++ Sounds now supported under Windows and under Linux with ALSA drivers. Sounds + are enabled by default, but can be disabled with the -no-sound command line + option. At runtime, CTRL-M mute/unmutes sounds. The following sounds are + currently supported: engine, gear up and down, stall warning, tire "screetch" + on touchdown, radar lock, TEWS warning, cannon and missile firing, warning, crash. + The sampled engine sounds (see the objects/sounds directory) are assumed to + represent 100% RPM; lower RPM are rendered by resampling those sounds at a + lower frequency. + ++ Classic instruments: the anemometer now also displays the Mach number. + ++ Engine idle setting is now 20% RPM (not 25%). Reason: too much thrust for + idle piston engines now that the RPM vs. thrust law is proportional, you had + to apply brakes very quickly once started! + ++ The following aural and textual messages are generated to help the pilot + landing and flying at low altitude: + + "Warning: gear down!" + Radar altitude available and descending rate leaves less than 120 seconds to + extend the gear, but the gear is not fully extended and locked yet. + + "Warning: pull up!" + Radar altitude available, descending rate too high, no time time left to + safely extend the landing gear which is not fully extended and locked yet. Or: + Radar altitude available, descending rate too high to recover within 1.2 G + vertical acceleration limit before impact. + ++ acm.tcl: the Configure panel now has a "Enable sound effects" check box to + enable audio. Sounds can be enabled or muted at runtime with CTRL-M. + ++ Several text files (CHANGES, COPYING, INSTALL, README and TODO) now have their + ".txt" file name extension. + + +acm-5.0-ico-20170822 Umberto Salsi +======================================================= + + Abstract. + The current magnetic field of the Earth is now calculated based on the + World Magnetic Model from NOAA. The rendering of the terrain, that was boring + flat, is now tiled giving some distance and speed feedback; also introducing + a thick layer of clouds with zero visibility inside. More colors and shades. + Minor corrections. + ++ Fix: under Windows, did not recognized semicolon as directory separator, so + multiple directories in objects parameter did not worked. + ++ Fix: the state of the instruments panel was not updated with the window in + minimized or iconified state. + ++ The magnetic field on the Earth is now calculated using the World Magnetic + Model library from NOAA (https://www.ngdc.noaa.gov/geomag/WMM/soft.shtml) + and it is used to display the current magnetic heading of the aircraft, to + rotate the magnetic compass, and to calculate the magnetic bearing at each + VOR station. Therefore, the format of the scenery is now a bit simpler as + reported below. The file of the coefficients objects/WMM.COF provided along + the package is valid for dates in the range from year 2015 up to year 2019 + included; beyond this range, a warning is displayed and a new updated file + should be installed. + + It is important to note that the components of the Earth's magnetic field + are calculated respect to the current date, so updated navigation charts + may be needed. The navigation charts provided along this package are + outdated, so magnetic bearings there indicated may differ more or less + from the calculated values. + + (In the previous versions of the program, the local magnetic variation was + calculated based on the nearest radio station for which a magnetic variation + was available in the scenery; the magnetic inclination needed to simulate the + behavior of the magnetic compass was calculated with a quite raw world-wide + approximation. In both the cases, the resulting values were not aligned with + the current date.) + ++ Scenery format changes: + . The magnetic deviation at the radio stations is now removed. + . The bearing of the localizer must now be reported as geographic (not magnetic). + ++ Colors and colors handling completely revised for better rendering. + Now uses a 17*17*17=4913 colors table rather than only 5*5*5=125. Non-linear + mapping of the colors look-up table gives higher resolution on darker colors. + The quite obscure concept (for the user point of view) of "depth cueing steps" + removed, and then removed the -depth_steps parameter from the application and + from the launcher interface acm.tcl. There is no more limit to the number of + colors the program may request (although they are still approximated with those + available in the colors look-up table). + ++ Improved rendering: + . Introducing terrain tiling effect for motion feeling and depth cue rendering. + . Introducing clouds layer with zero visibility in the range 5000-12000 ft. + + +acm-5.0-ico-20170723 Umberto Salsi +======================================================= + + Abstract. + ACM now runs natively also under Windows. Others minor fixes and improvements. + +Specific of the acm.exe simulator program: ++ Compiles under Windows with the MinGW system development kit generating a true + native executable that runs "out of the box". Previous compatibility with + Cygwin + X-Window emulator has then been dropped. ++ Introducing the GUI abstraction module (src/util/gui) with implementations for + both X-Windows and Windows. Removed any other dependency from a specific GUI + all around the sources. ++ Rate control, whenever enabled, now working also with "weight on the wheels" + for smoother rotation maneuver at liftoff. ++ Fix infinite loop in random number generator on systems whose random source + provides only 15 bits. ++ Fix: killing with missile was nearly impossible, especially over the net. Now + the relative position of the explosion in the explosion DIS PDU is set and then + properly used. ++ Audio disabled if no proper lib available (which practically means, no audio :-). ++ The update rate of the dynamic models is now internally tuned to its optimal + value around 60 Hz and kept tuned around this value independently from the chosen + frame rate and from the actual resulting frame rate. This improves the numerical + stability and makes simpler for the user to configure the program. ++ The following command line options have been removed from acm.exe: + -update-rate (internally tuned). + -watch-frame-rate (actual frame rate is periodically displayed by default). + -bw and -cmap (superseded by the abstraction GUI module). + +Specific of the acm.tcl launcher interface: ++ Gets iconified while the program runs, avoiding a boring gray dead window. ++ Removed audio and joystick options (still not working, anyway). ++ Removed update rate option (now internally determined). + + +acm-5.0-ico-20170527 Umberto Salsi +======================================================= ++ Removed any dependency from the RCP library and XDR library; now ACM has its + own built-in encoding/decoding routines, fully supporting 32-bits and 64-bits + processors and with memory leaks detector. + ++ Fix memory leaks when decoding of incoming DIS packets fails, which may happen + on an heterogenous network of applications speaking the DIS protocol. + ++ Fix memory leaks releasing DIS packets. + ++ Passes incoming random packets stress-test to resist in an hostile network; + safety and security issues start to be seriously addressed. + ++ Automatically generated site ID, once validated in the validation period, does + not change anymore and no further site IDs collision tests are performed. + ++ Fix declarations for DIS protocol IEEE 1278.1-1995 compliance: + fix articulation parameter data structure (not used by ACM anyway, for now); + fix comment PDU (not used by ACM anyway, for now). + + +acm-5.0-ico-20170514 Umberto Salsi +======================================================= + + Abstract. + Currently compiles under Linux and Cygwin/Windows at 32 and 64 bits. + Support for the DIS protocol has been restored and multiplayer + mode works again; clients connect each other either in multicast + mode or in relay mode through a specific relay program; + DIS protocol parameters (site ID and application ID) can now be + assigned automatically (no more need for a SIM/x server). + IAS (indicated airspeed) and then rate control mode stick have been + introduced. + +Changes to the general layout of the package +-------------------------------------------- ++ Removed original configure script, now replaced by several Makefile(s) + automatically generated using the script make-makefile available from + http://cvs.icosaedro.it:8080/viewvc/public/tools/ + ++ Fix to support 64 bits architecture (DIS protocol encoding, acm, gedit). + ++ All the sources are under src/ and the test programs under test/. + ++ The simxd server has been removed and replaced by new site ID random + generation and validation algorithm; entities db query not used anyway and + so the ndbs data base has been removed as well. + Any dependency from the RPC portmapper services has been removed and + its configuration is not needed anymore. + ++ Most of the source code has been "modularized": each implementation source + file .c has its own corresponding interface declaration file .h. The only + exceptions are the programs, where an interface file is not necessary their + only programming interface being the main() function. + ++ The src/dis/server/dis_relay.exe program implements a DIS relay to support + multiplayer interaction through Internet. + ++ The objects/inventory.txt file got the extension '.txt'. The "include" + statement has been introduced for a more structured inventory. + +DIS relay server +---------------- ++ The DIS relay program src/dis/server/dis_relay.exe allows several players to + interact though Internet; it can be started with the command: + + ./dis_relay --port 3000 --debug + + being 3000 the default port. The --debug option displays packets received and + forwarded. Clients silent from too much time (currently 60 s) are + automatically removed from the dispatching list. + +Changes specific of the src/acm/acm.exe program +----------------------------------------------- ++ Fix crash if the GROUND_COLOR record is missing from scenario. ++ Fix: sometimes the scale of the magnetic compass did not shown. ++ Fix: gravity bombs now work as expected over the DIS protocol. ++ Fix: radar beam sweep angle in the DIS packets is half the angular aperture, + not the full aperture; units are RAD, not DEG. Added heuristic to continue + supporting old bugged versions of the program. ++ Fix: radar in standby does not emits energy anymore. ++ Fix: did not set ACM 20x30 radar mode (for what it worth; see TODO). ++ Fix: TEWS did not accounted for emissions from remote entities, so remote + aircraft were not displayed. ++ Fix: in TEWS, enemies are now drawn as 3 concentric circles to distinguish + from friends. ++ Fix: drones were fighting against all; funny, but silly. Now they belongs to + the enemy team and they select properly their target (that is, you!). ++ The program now works as a DIS application, either in broadcast mode or + in relay mode. To support this latter, two more options have been added: + -dis-relay-name HOST + -dis-relay-port PORT + where HOST and PORT are the DIS relay host and its UDP port. If the HOST is + not set or it is set to the empty string, use packets broadcasting instead. + Previous DIS_RELAY envar not supported anymore. ++ Site ID default value is now -1, which triggers site ID automatic assignment. + A temporary randomly generated site ID is calculated, then the program enters + a validation period where it listen for incoming packets; if a collision is + detected, another value is generated. ++ Application ID default value is now -1 which assign the process ID. ++ Option -no-dis removed; now DIS protocol enabled by any -dis-* option. ++ Drones always working, no need to "enable DIS" anymore. ++ Periodically displays DIS protocol state and network performances: total + number of tracked remote entities; processed DIS packets per second. ++ Periodically displays actual frame rate and update rate. ++ The separator character in directories list is colon under Linux and semicolon + under Windows to support the -objects option on both platforms. ++ The ground color has now a default flat light green. ++ New rate control mode enabled/disabled with SHIFT-E allows to control the + roll ratio and pitch ratio. ++ Brakes are now engaged/disengaged smoothly within 1 s. ++ Computes the indicated air speed with compressibility correction as: + IAS = TAS * sqrt(rho/rho0) * (1.0 + 1.0/8*(1.0 - delta)*M^2) + being TAS the airspeed along x, rho the air density at the current altitude, + rho0 the air density at sea level, delta the ratio P/P0 between the current + air pressure and the pressure at sea level, and M the Mach number. ++ Vne and Vfe are now IAS (not TAS). ++ "Hints" periodically shown to the user are now read from objects/hints.txt. ++ The scenery may include the terrain surface as a FEATURE record; its name must + start with '#' so it is drawn on the background (quite an hac, but it works!). ++ Mouse buttons meaning changed: left button to fire, right button to change + weapon. Center button currently not used. ++ Landing gear dynamics: the dumper is now single effect, as it dissipates + energy only on compression and has no effect on release. ++ Drones now set a proper combat aircraft configuration with gear up, flaps up, + speed brakes off, APS off. ++ Auto-Pilot: + + Internal architecture completely redesigned, with pitch rate and roll rate + control functions as common basic of all the other functions. + + Pitch and roll rate control law added (SHIFT-E): mouse controls rate. + + Auto-throttle target speed is now IAS (not TAS). ++ HUD: + + Radar altimeter removed (it is already available in the instruments panel + below). + + Added "Rate" display when rate control law enabled. + + Changed display of the auto-pilot's currently active mode: + "AP" --> "VS/ALT" + "AN" --> "NAV" + "AT" --> "THR" + "AW" --> "Turn" + "AC" --> "Coord" + "AL" --> "Land" + + When auto-throttle is engaged, target speed is IAS (left ladder still + displays TAS). + + Added air temperature, pressure, density and speed of sound to the + displayed data (SHIFT-D). ++ Classic instruments panel: + + Added "Rate" display when rate control law enabled. + + Changed display of the auto-pilot's currently active mode: + "AP" --> "VS/ALT" + "AN" --> "NAV" + "AT" --> "THR" + "AW" --> "Turn" + "AC" --> "Coord" + "AL" --> "Land" + + Airpeed indicator now displays IAS. + + Altitude indicator now has a thousands needle. + +Inventory file objects/inventory +-------------------------------- ++ Improved structured inventory by adding the + + include "filepath" + + statement; relative filepath is resolved against the directory of the current + file, so that the referred included file can be in a different directory. + Same feature enabled for the + + Object "path/model.obv" + + statement inside the aircraft{} record, now allowing a relative path which is + resolved against the directory of the current file. ++ P51A now has a machine gun. ++ Added UFO aircraft intended to replace remote entities for which a model is + not available. Also useful to quickly explore maps because of its exceptional + performances :-) + +Changes specific of the acm.tcl launch interface +------------------------------------------------ ++ The old "acm.tk" program changed extension becoming now "acm.tcl". ++ Add a "DIS" panel for all DIS related configurations: relay host and port, + exercise, application and site. ++ Allows for wind speed up to 40 kt (was 20 kt). ++ The update rate can now be set. + + + +acm-5.0-ico-20100109 Umberto Salsi ++ HUD: pitch scale ladder now rendered in perspective projection, so that it + matches exactly the pitch as indicated by the FPM (fix). ++ Stall warning: panel light + HUD display + audible alarm. ++ Player whose aircraft is damaged fall down and crashes. ++ More accurate CCIP HUD symbology (use circle rather than cross). ++ Mark 82 bomb blast may damage aircraft. ++ CCIP: corrected position of the CCIP accounting for the pilot's head position. ++ Added keypad button 0 to look down. + +acm-5.0-ico-20090215 Umberto Salsi ++ Added Mark 82 drop bombs with CCIP calculator. ++ Added down view (keypad 0). ++ Inventory: Su-30 now armed with 4 MK82, 2 AIM9M and M61A1 for bombing + practice with CCIP. + +acm-5.0-ico-20090208 Umberto Salsi ++ FIX: the runway numbers are now rendered in the proper order. ++ FIX: properly evaluates max lateral mouse range. ++ FIX: corrected elevator non-linear response curve. ++ Introduced wind gust model. ++ Anemometer: now displays speed limits arcs. ++ Attitude indicator: increased gyro rigidity. ++ Removed keyboard command 'u'. ++ Auto-Pilot System: + + Now implemented using the proportional-integrative algo. + + AC: smooth release. + + AW: smooth release. + + AL: performs flare maneuver at lower altitude. ++ Weapons: + + Enabled radar guided "AMRAAM" missile AIM-120 (previously was disabled). + + Drone algorithm now uses AIM-120 first, then AIM-9M. ++ Inventory file: + + Removed unused parameters CLNegStall, CLPosStall, SeTrimTakeoff, CmFactor. + + Added parameters MTOW, Vs0, Vs1, Vfe, Vno, Vne. + + Weapons have new canonical names M61A1, AIM-9M, AIM-120, MK82. + + C-172 has lower pitch. + + F-16 and MiG-29 now mount 2 AIM-120. + + MD-80 now has the thrust reverser. ++ Updated manual. + +acm-5.0-ico-20080420 Umberto Salsi ++ FIX: HUD, turn indicator: now shows actual yaw rate. ++ FIX: classic turn&slip indicator: now show turn rate around aircraft z axis. ++ FIX: rendering: show correct downward view at higher zoom factors. ++ Added Thrust Reverser device (currently available only on B-747): + * Inventory: added parameter HasThrustReverser. + * Enable/disable thrust reverser with SHIFT-!. To enable, engine setting + must be idle (<= 25% RPM). + * Panel: new "THR REV" lights, blinking while the device is moving. ++ AutoLanding, flare maneuver: with tricycle, thrust reverser, lower nose, + brakes; with bicycle, thrust reverser, raise nose, no brakes. ++ Render: darker night. ++ ADF: added rotatable heading needle for pilot's convenience (7 and 8 to + move). ++ Manual updated with the new features listed above, and AutoLanding + procedure fully described. + +acm-5.0-ico-20080328 Umberto Salsi ++ BUG FIXED: now works also with 8-bit and 16-bit color depth (please choose + accordingly the "Color depth steps" parameter now available in acm.tk). ++ BUG FIXED in magnetic compass scale labels. ++ Now compiles under GCC 4. ++ Aerodynamic forces fully implemented also on the ground. ++ Landing gear model rewritten, now it deals with the roll moment, wheels + skidding, detect max lateral load on all the landing gears, steering + effectiveness reduced at high speed. ++ Bicycle landing gear now supported. ++ Added P-51A "Mustang" to the inventory (first bicycle gear available). ++ Starting airborne, set pitch 3 DEG and gear retracted. ++ The parameter -heading now sets MH (not TH). ++ Auto-Pilot System: introduced max bank limiter from 5 to 25 DEG. ++ New option -drone_mode [DOG_FIGHT | HUNTING]. ++ New panel light "G-LOAD" blinks above 75% max wings load. ++ Inventory file: + * GroundingPoint parameter removed since now it is calculated at run-time + along a proper rest pitch, so that the aircraft can be deployed gently over + the runway. + * MaxNWS parameter removed since now steering effectiveness gets reduced as + far as the velocity increases, reproducing some "resistance" feedback to + lateral acceleration. + * NWIncr parameter removed as the keyboard cannot be used to steer. + * If Object parameter undefined do not display aircraft chase view + rather than simply crash the program. ++ Source changes: + * Vlib and Alib reorganized as "C modules", extensively introduced the + concept of "Rect", old Win32 code moved into a sub-dir. + * The number of polygons that may be rendered is now unlimited. + * New module src/vpath_gallery that implements common drawings. + * Removed all the bitmaps images, now implemented with vpath. All the + graphics routines now based on Vlib, no more X Window calls spread. + * Module src/vlist properly renamed as "viewer". + * HUD ladder and HSI compass scale now generated at run-time, so removed + tools/horizon.c and tools/hsi_header.c. + +acm-5.0-ico-20080209 Umberto Salsi ++ New: cockpit view now rendered in accurate scale based on + screen resolution (pixel/meter) and on the distance of the eye from the + screen. The downward angle of view can also be specified. The command + line parameters -eye_to_screen_cm and -downward_view_angle_deg were also + added. The -scale parameter then removed. ++ New: zoom with +/- keys, ranging from x0.125 up to x4. ++ HUD now rendered more realistically with smaller dimension + and moved downward 3 DEG (or, nose pointer move up 3 DEG) so that the + center of the HUD is very close to the point toward we are flying to or + we are aiming to. ++ New: SHIFT-$ enable combat in drone mode. ++ Smarther drones do not crash to the ground (almost :-) anymore. ++ Splash screeen removed; copyright info displayed with -copyright switch. ++ acm.tk: support for new parameters "eye distance from screen" and + "downward angle of view". + +acm-5.0-ico-20071002 Umberto Salsi ++ AL: now performs flare maneuver, touch-down and braking, + faster recovery of misalignment from LOCATOR ++ AP: new algorithm that improves stability and responsiveness ++ AN: smoother maneuvering at small deviation angles ++ NEW: radar altimeter now available in the instruments panel ++ Automatic fuel resupply now disabled -- restart the program to fill the tank ++ Enlarged HUD + +acm-5.0-ico-20070905 Umberto Salsi ++ BUG fixed that prevented compilation under gcc 4. ++ NEW: VOR/DME radio signal can no more be received above the horizon of sight + (see the manual for details). + +acm-5.0-ico-20070831 Umberto Salsi ++ BUG: crash trying to set altimeter offset or pitch offset in HUD mode: fixed. ++ NEW: magnetic compass. ++ NEW: RNAV calculator. ++ NEW: support for NDB stations. ++ NEW: ADF receiver. ++ NEW: option -hud-mode. ++ Dallas scene: restored existing NDBs, updated nav. charts. ++ Italy scene: added known NDB, updated nav. charts. ++ Now starts in classic instruments mode rather than HUD mode (but see also + the new -hud-mode option). ++ Now starts in MH mode rather than TH mode. ++ Now starts with HSI enabled. + +acm-5.0-ico-20070725 Umberto Salsi ++ BUG: crash when at rest on the runway: fixed ++ BUG: turn indicator of the classic instrument panel now displays the + actual turn rate around the vertical axis of the aircraft (not the turn + rate around the zenith) ++ NEW: you can set the altimeter offset in the range 28-31 inHg ++ NEW: aircraft description: added MaxLoadZPositive and MaxLoadZNegative ++ Drone aggressiveness (option -da) now sets the fraction of the max load + at which drones will maneuver. Drones now behave more realistically + maneuvering within their structural limits. ++ acm.tk: now manages the -da option ++ Removed AutoCoord, AutoThr and AutoPilot warning lights from the panel: + classic instruments mode and HUD mode already provide these alarms ++ B-747: increased elevator effectiveness + +acm-5.0-ico-20070715 Umberto Salsi ++ NEW: classic instruments panel: attitude indicator, anemometer, + altimeter, turn&slip indicator, vertical speed indicator. Press SHIFT-H + to toggle between the HUD mode and the classic instruments panel. + Read the manual for details about the classic instruments characteristics, + their limitations and usage. ++ NEW: flight by night option -lighting daylight|night ++ NEW: mouse mode option -mouse-mode fast|normal|precise ++ NEW: SHIFT-Z to engage the AP in hold-altitude mode + +acm-5.0-ico-20070709 Umberto Salsi ++ acm.tk: the Mig-29 wasn't displayed, now it is (BUG FIX) ++ auto-navigation with VOR (AN) ++ auto-pilot: + max vertical acceleration: +/- 0.1 g + hold-altitude mode, max vertical speed: +100 fpm + hold-altitude mode, min vertical speed: -1000 fpm + disengaging the AP, smooth release of the elevator within 3 s ++ C-172RG: engine power and drag coeff. tuning. + +acm-5.0-ico-20070621 Umberto Salsi ++ nose wheel now can attain the specified angle of steering (BUG FIX) ++ corrected TAS indication with wind (BUG FIX) ++ conflicting NAV on the same freq.: now only nearest gets received (BUG FIX) ++ the payload can now be specified (see option -payload WEIGHT) ++ new airplanes: AMX, MD-81 ++ the '7' key rotates OBS of 10 DEG (not 20 DEG) ++ acm.tk: now it gathers the planes from the inventory file (no hard-coded) + +acm-5.0-ico-20061022 Umberto Salsi ++ acm/tk: now you can choose your team ++ auto-turn feature (keys ,.<>/|) ++ AP: smoother release ++ AL: now bank angle limited to 25 DEG (no more limits on turn rate) ++ removed unused open socket that sometimes saturated the CPU ++ manual updated accordingly ++ C-172RG: reduced engine power to closely match performances of the real + plane (max climb rate, max speed) + +acm-5.0-ico-20060529 Umberto Salsi ++ auto-landing system (AL) ++ auto-pilot: now uses a faster dynamic model of the elevator ++ now 'Home' resets ailerons/elevator trim and disable AP/AT/AL ++ (rough) estimation of the ground effect ++ inventory file: new parameter "WingHeight" ++ if no NETAUDIO nor HPAUDIO, try sending audio data directly to /dev/dsp ++ audio module completely reworked ++ chaser module removed (not used) ++ mouse control: no fuzz zone ++ updated Unix man page ++ manual updated accordingly ++ Unix "man page" updated ++ acm.tk: displays on stdout the resulting command used to start ACM + +acm-5.0-ico-20060507 Umberto Salsi ++ AC: response time reduced ++ AT: out-of-range alarm now raised properly ++ HUD: now indicate the effective total airspeed ++ B-747: increased rudder effectiveness to attain 3DEG/s at 185 kts + +acm-5.0-ico-20060505 Umberto Salsi ++ autothrottle controlling the TAS ++ manual updated accordingly ++ italy.acmscene, Genova-Sestri airport: fixed up ILS + +acm-5.0-ico-20060502 Umberto Salsi ++ 'd' detach commands from the window ++ handle properly window focus in/out (you can leave ACM in background) ++ double HSI receiver - press 'SPACE' to switch NAV1/NAV2 ++ source reorganized - every *.c module now has its *.h ++ improved rendering of the engine gouge and gear handle ++ afterburner disabled on aircraft lacking this device ++ to exit from the program press SHIFT-Q twice + +acm-5.0-ico-20060427 Umberto Salsi ++ optional true heading (TH) or magnetic heading (MH) indication (SHIFT-M) ++ HSI: displays the current selected TH/MH mode ++ HSI: digital display of the OBS ++ HUD, heading scale: displays TH or MH ++ some source clan-up based on the gcc -Wall complains :-) ++ manual: updated with the changes above ++ manual: now explains the terrain model and the "step line" problem ++ Italy scene: 8 more airports, 25 more NAVAIDS, more navigation charts. ++ bug fix: "Color Segment pool overflow" and crash + +acm-5.0-ico-20060416 Umberto Salsi ++ BUG FIX (the autocoordinator was always engaged) + +acm-5.0-ico-20060415 Umberto Salsi ++ autocoordinator controlling the rudder ++ HUD: now displays a bank indicator + +acm-5.0-ico-20060409 Umberto Salsi ++ HUD: now displays a radar altimeter ++ fixed up bug in flight calculations (calcAlphaBetaVT()) + +acm-5.0-ico-20060402 Umberto Salsi ++ HUD, pitch ladder: added -1, -2 and -3 degrees markers ++ navigation charts now include average magnetic variation ++ dallas.acmscene: improved ILS alignment to their runways ++ italy.acmscene: improved ILS alignment to their runways + +acm-5.0-ico-20060326 Umberto Salsi ++ autopilot controlling the elevator ++ acmscene file format: new RWY2 record type ++ acmscene file format: DME only NAVAIDs now allowed ++ scene rendering: displays runway numbers ++ objects/inventory, Boeing 747: speed brakes, elevator effectiveness ++ objects/dallas.scene: minimal updates and corrections ++ objects/italy.acmscene: +Firenze-Peretola, +Napoli-Capodichino ++ improved navigation charts ++ undocumented SHIFT-D feature displaying debugging infos + +acm-5.0-ico-20060319 Umberto Salsi ++ new italy.acmscene (only north Italy, by now) ++ dallas.scene: minimal updates and corrections ++ better navigation charts + +acm-5.0-ico-20060314 Umberto Salsi ++ range of ILS stations now limited to 18 nm ++ range of terminal VOR now limited to 40 nm ++ range of en-route VOR now limited to 200 nm ++ the HSI now looses/acquires the tuning accordingly to the previous changes ++ manual updated accordingly - see section "The HSI" for details ++ "acmscene" file format, RWY record: fields 10 and 11 removed (not used) ++ improved navigation charts + +acm-5.0-ico-20060307 Umberto Salsi ++ HSI: always display the CDI of the ILS locator ++ magnetic variation for NAV and ILS can be fractional (ex.: "1.3E") ++ gedit compile properly under Linux ++ added chart BB.pdf + +acm-5.0-ico-20060301 Umberto Salsi ++ manual: now explain the landing gear parameters in more detail ++ twoOrder() in src/pm.c sometimes generates NAN and crashes the program: + rewritten + +acm-5.0-ico-20060215 Umberto Salsi ++ acm.tk: new radio button "Debug" to debug through GDB ++ lateral accel. indicator: every tick now is 0.25 g ++ fix that prevent pm.c/twoOrder() from generating NAN values as result ++ fuel level: better precision for low fuel level (required for the C-172) + +acm-5.0-ico-20060202 Umberto Salsi ++ HUD: now displays the TAS along the x-axis of the plane (see "-wind" opt.) ++ HUD: now displays a turn and slip indicator ++ HUD: now displays a timer -- press 't' for start/stop/reset ++ HSI: now displays the NAVAID 4-char ID ++ HSI: rendering enlarged and improved ++ HSI, ILS: does not display CDI if we are outside of the station beam ++ HSI, ILS: every dot now is 0.4 degrees regardless to the station ++ new option "-wind WD/WV" that sets the wind direction (DEG) and speed (kt) ++ new option -scale FACTOR that sets the scale of the rendering ++ new option -no-splash that disable the initial splash-screen ++ new option -no-dis that disable the DIS protocol ++ SHIFT-P generates screen shoot into /tmp/acm-dump-* ++ fixed up minor bugs that prevented the compilation under GNU/Linux ++ upper-case letters are now reserved for future extensions of the program ++ displays flaps (fix) ++ displays the engine settings at the start of the program (fix) ++ moved the manual into doc/manual/ ++ added flying charts about the default scene (see doc/charts/) ++ added Boeing 747 to objects/inventory ++ added objects/man.obv ++ new option -objects path1:path2:... for objects directories ++ new option -help and -version ++ new option -no-sound ++ new option -fuel FUEL-LB; use MaxFuel if this opt is not specified ++ added program acm.tk to the distributed package ++ on abnormal termination (crash, damage, etc.) displays an explanatory message ++ the opts -latitude and -longitude now support the format DD-PP-SS.SSSQ ++ fuel resupply rate: +10% every 30 seconds ++ if no weapons available for the plane, disable weapons display/select/fire + +2006-01-05 ++ starting playing around the source of the original version acm-5.0 from + www.websimulations.com. + + + +From here on: changes list made to ACM-5.0 by Riley Rainey (circa dec 1998). +============================================================================ + + +What's different with revision 5.0: +----------------------------------- + +Current ACM documentation may be found in the file "acmdoc.rtf". + + + --------------------- UPDATE ------------------------ + The reference manual is now in HTML format under the + doc/manual directory, with the new features described. + U.S. 2017-04-03 + ----------------------------------------------------- + +ACM now dynamically maps DIS entity identifiers to rendered objects. The +mapping is defined in the file "objects/object-map.txt". + +ACM now has a more flexible scheme for determining aircraft damage. See the +file "objects/munition-map.txt". + +ACM now supports reading DXF object description files. This support isn't +exhaustive, but it works with many popular 3D CAD programs capable of +exporting DXF files. + +The V library object description file suffix was changed from ".obj" to +".obv" to avoid conflicting with Microsoft object file names. + +A bug in the new scene reader code was preventing 'FEATURES' (special +ground based features) from being rendered. The default.acmscene file now +contains an example of a ground feature reference -- the tower at Addison +airport. + +Support for the GNU --srcdir option to 'configure'. Michael Deutschmann +(ldeutsch@mail.netshop.net) suggested changes to support this as well +as numerous autoconfig enhancements. + + + --------------------- UPDATE ------------------------ + I removed the configure script, now replaced by seve- + ral Makefile automatically generated with + make-makefile. + U.S. 2017-04-03 + ----------------------------------------------------- + +Several changes have been made to allow ACM to compile and link +cleanly on Linux systems. ACM's configure now looks for a /usr/lib/games +directory and installs ACM's object files there if it is present. + +Mats Lofkvist fixed several bugs relating to DIS processing. + +The DIS/x library now supports more DIS dead reckoning methods. +All static and world-based methods are now supported. Body +frame methods remain unsupported. + +Missiles will no longer fire while weight is on the landing gear. + +Mark Cianfaglione (markcia@nortel.ca) suggested changes to landing gear +handling. Now the gear will not come up until weight is off the wheels. +At Mark's suggestion, the low fuel light now comes on when there is +fifteen percent fuel remaining -- it used to be hard coded to come on +any time there was less than 1000 lbs of fule on-board. + +Misha Stephanov pointed out two one-line, +but significant bugs in update.c and damage.c. Misha also suggest +a changes to landing gear handling to detect when someone is unlucky +enough to attempt a gear-up landing. + +ACM now has a basic DIS Stealth capability. + +ACM supports numerous new command line options, all of which are +documented in the acmdoc.rtf file. + + +What's different with revision 4.8: +----------------------------------- + +The world is now round -- er, spheroidal. When you enter the ACM world, you +are placed on runway 15 at Addison airport in Dallas, Texas [my aircraft's +home base ;-) ]. The scene databases now include realistic radio navigation +aid information as well as runway location information. With this info +integrated into ACM, you can fly more real instrument approaches. +If you'd like to try, you should get a copy of the current +National Ocean Service [NOS] terminal procedures [approach plates] +South Central Volume 2. I will try to get permission to scan and distribute a +few with the release of ACM. + +Only the Dallas scene database is currently available. + +Use your PC joystick with ACM! Support for the Colorado Spectrum +Workstation Gameport(tm) has been added to ACM. This gameport adapter +allows you to connect a PC joystick to a serial line on your UNIX +workstation. The Workstation Gameport can be ordered from Colorado +Spectrum by phone: +1 (970) 225-6929; it currently lists for $100. +The Workstation Gameport is a different design than the Notebook +Gameport that you will find in your local PC retail store. The Notebook +Gameport will not work with ACM. + +WARNING: This support is currently incomplete. The joystick driver has been +temporarily hard-wired to interface to two-axis joysticks. To enable joystick +operation, type: + + $ acm -js /dev/cua1 + +The name of the serial port connected to the gameport is supplied as the +second argument. The device name will vary from one system to the next +(/dev/cua1 corresponds to the direct-connect port "B" on my Sparc IPX). + +Mats Lofkvist has integrated ACM with the U.S. Navy Postgraduate School's +Distributed Interactive Simulation software (called NPSNET). As the name +implies, DIS is a simulation information interchange protocol that allows +distributed servers (ACM servers, in this case) to work cooperatively. + +I have replaced Mats' use of NPSNET with a DIS library that I created. This +library implementation should be more portable. + +Using DIS means that if you are using ACM in a multiplayer environment, you'll +see much better overall performance. + +The DIS protocol relies on broadcast UDP datagrams. Therefore, all ACM +players must currently run on the same subnet (UDP broadcasts are not +propagated beyond a subnet). There are DIS bridges available that +would potentially relax this restriction, but none have been tested with +ACM yet. + +The ACM server (acms) has been eliminated. Invoke acm by simply +typing 'acm'. Check the acm man page for information about new +command-line arguments and switches. + +A font problem that manifested itself on AIX/Windows has been fixed. + +Fixes for Linux compatibility problems in ACM 4.7 were submitted by +Jeremie Petit (petit@aurora.unice.fr). + + +What's different with revision 4.7: +----------------------------------- + +A problem with V library 3-D to 2-D mapping has been fixed. + +A problem with the V library could cause this esoteric error message on some +X servers: + + BadPixmap (invalid Pixmap parameter) + +The fix to this problem was identified by Brent Holland. + + +What's different with revision 4.6: +----------------------------------- + +Sound support has been added for many HP platforms. Philippe-Andre Prindeville +made the changes required for ACM to function with the HP-UX audio API. +Configure no longer assumes that the NCD netaudio library is the only only one +named "libaudio.a". + +Cloud layers can now be used to affect combat conditions. A single cloud +top/base can be set. This solid cloud layer is opaque to IR emissions, so +you will have a hard time shooting down an opponent who is on the other side +of the clouds. The default cloud base is 2800 feet, tops at 9000 feet. +It is not currently possible to "turn-off" clouds. + +Portability problems with ACM's usage of the random number generators rand() +and random() have been fixed. + +A problem with architectures where a "long" is not the size of an "int" (DEC +Alphas) has been fixed. + + +What's different with revision 4.5: +----------------------------------- + +The HUD compass and HSI were pointing to true north rather than to magnetic +north. This has been fixed. The magnetic variation has been set to +eight degrees east (it can be changed in navaid.c). This means that the +18-36 runways at both team's airfields are actually 17-35 runways; the runway +heading for the ILS 17 approach at team one's airfield is 172 degrees; the +runway heading for the ILS 36 approach at team two's airfield is 352 degrees. + +A field has been added to the navaid description structure to account for +the fact that ILS localizers have a variable beam width (three to six degrees +according to the FAA Airman's Information Manual). The two ILS approaches +have been adjusted so that their beam widths are 700 feet wide at the runway +threshold (per the standard). + +Porting problems with Solaris 2.3 and DEC Alpha OSF/1 have been fixed. +Thanks to Bill Davidson, Peter Asenstorfer, and S.Y. Ni. + +A problem in the VOR TO/FROM logic was pointed out by Jeff Westbrook and has +been fixed. + +A problem with monochrome support was fixed by Jeff Westbrook. + +ACM's configuration facility was rebuilt using autoconf 1.9. + + +What's different with revision 4.4: +----------------------------------- + +Simple visual depth cueing has been added to ACM. Depth cueing is only +activated on color or grey-scale screens that have at least 8 bit planes. +Visibility can be set using the "-visibility" switch on the acms command +line. It produces interesting, if slow, results when used with any of the +Hawaiian Island scenes. I intend to improve the performance and visual +fidelity of this feature. + +A bug in the depth cueing color blending code has been fixed. + +Fixes to src/makefile.in and V/lib/Makefile.in have been applied. A +"make depend" target has been added. + + +What's different with revision 4.3: +----------------------------------- + +Drones will now maneuver and attempt to attack you with missiles. +The original inspiration and code changes were supplied by +Jason Nyberg (nyberg@ctron.com). The drone tracking method was modified +and the missile launch logic was created by Riley Rainey. + +A bug in the AIM-9 time-to-target HUD calculation was fixed. + +Support for NCD's netaudio software has been added. The NCD netaudio software +is free and available in source form via anonymous ftp from ftp.x.org. + +Netaudio 1.1 does not allow the user to switch the audio output port on +a Sun IPX (an IPX has both an internal speaker and an external jack for +headphones or separate speakers). You can switch ports by using the SunOS +/usr/demo/SOUND/x_soundtool before executing acms. + +The scene file format has been modified slightly. The third line is +now the color to be used for the "ground". + +The kauai-scene, oahu-scene and maui-scene files display environments +around those Hawaiian islands. Terrain elevation data was extracted from +USGS one degree Digital Elevation Model (DEM) data files. Because of the +complexity of these scenes, rendering speed is unacceptably slow on all but +the fastest contemporary workstations. + +A bug in the V library backface clipping code was fixed by Tim Love. + +A bug in the V library was resulting in oddly colored instrument panels at +seemingly random times. This has been fixed. + +A problem with the landing gear parameters on the F-16 has been fixed. + +Acms 4.2 core dumped on AIX systems. This has been fixed. Tom McConnell +supplied the changes. + + +What's different with revision 4.2: +----------------------------------- + +Several nits reported by CodeCenter have been repaired by Brad Bass. + +Makefiles now use the $(MFLAGS) macro, where needed. + + +What's different with revision 4.1: +----------------------------------- + +Ultrix and HP-UX make(1) was having problems with the $(MAKEFLAGS) directive in +V/Makefile.in. It has been removed. It's removal should not affect the +build process. + +The Ultrix 4.3 shell was having problems with "./configure". The problem +has been fixed. + +A problem in "./Makefile" that would cause a mis-identification of the +default target has been fixed. + +ClipPoly.c was unused in ACM 4, but has been updated so that it compiles. + +A problem in inventory.c that was causing the nose-wheel steering mode to +stay enabled at all times has been fixed. This problem was pointed-out by + _ +Mats Lofkvist (d87-mal@nada.kth.se). + + +What's different with revision 4.0: +----------------------------------- + +Combat Simulation +----------------- + +Mig-29's are now the default team two plane. + +The HUD display has been improved. + +A bug in the missile tracking algorithm that would induce misses when the +target was moving at a high speed has been fixed. + +ACM now supports situation recording and playback. The "{" key will start +recording, the "}" key ends it. The positions of all aircraft existing +during the recording period will be saved in the file "./back_box_output". +That file can be played back by moving it to the file "./black_box_input". +Activate the playback by pressing the "[" key while you're in ACM. + +DME, VOR's, Localizers, and Glide Slopes have been added. An HSI has been +added to provide VOR and ILS readouts. + +To activate the HSI, press the 'R' key. Each press of the 'R' key cycles +through RADAR -> HSI -> RADAR STANDBY. The Omni Bearing Selector is moved +20 degrees with the '7' key, and one degree with the '8' key. The '9' key +increases the NAV frequency by 1 MHz, the '0' key increases it by 0.05 MHz. +The selected frequency is displayed at the lower right-hand section of the HSI. + +If you want to shoot an ILS approach, I suggest the following settings: + +LEVEL FLIGHT: + power 45 %RPM + flaps 20 + gear up + speed brake deployed as needed + speed ~ 150 kts + +ON GLIDE SLOPE: + power 35 %RPM + flaps 20 + gear down + speed brake retracted + speed 140-150 kts + AOA 10-11 degrees + +When you shoot the ILS 17 approach, don't forget to set the OBS dial to +the runway heading (172 degrees). Otherwise, you'll get a very +confusing picture of which way to fly. +This approach configuration gives you a good opportunity to practice +soft landings. + + +Flight Simulation +----------------- + +Engine response is no longer instantaneous. Engine RPM (power) will +increase and decrease gradually to a newly selected setting. + +The aircraft simulation model has been changed substantially. Tim Tessin +uncovered a bug in pm.c that was substantially degrading the performance +of all aircraft in high angle of attack situations. It's been fixed. + +Several problems with the lift-curve determination have been fixed. +The lift coefficient is now determined by interpolation. The lift contribution +of flaps has been modified to be more consistent with reality. + +Aircraft control surface effectiveness has been increased substantially. +I believe that this increase in consistent with a more realistic simulation. + +ACM now models aircraft motion on the ground more accurately. ACM actually +models the spring and motion damping effects of the landing gear struts, as +well as the contribution of ground friction by the wheels. + +A problem with the roll dynamics of the flight simulation model pointed out +by Tim Tessin has been fixed. The roll model (no pun intended) has been +substantially re-worked to be able to use standard NACA stability +derivatives to describe aircraft roll performance. + +The pitch and yaw dynamics have been modified to use NACA derivatives. + +The outside view has been modified. + +The F-16 flight model has been modified to be more well behaved; lateral +and longitudinal motion damping coefficients have been increased. + + +The Graphics +------------ + +The graphics have been re-vamped to be much faster on color workstations. +Monochrome graphics are slower. + +Object clipping has been improved in the V library to improve rendering +performance. + + +The Guts of ACM +--------------- + +ACM now participates in the X11 WM_CLOSEDOWN and WM_DELETE_WINDOW protocols. + +The directory structure has been modified to get the object description +files out of the source directory. Object files now all have a '.obj' +extension. The 'make install' target has been improved. + +Aircraft descriptions are now defined in the file "objects/inventory". + +Terrain layout is now described using a "scene" file. Acms accepts a +"-s scene-file-name" command line option. The file "default.acmscene" describes +the default layout. + +A periodic alarm facility has been added in the guts of ACM. See alarm.[hc] +for details. An example of its use can be found in navaid.c; it is used +to periodically update DME readouts on all aircraft. It is designed to be +compatible with variants of ACM that modify deltaT on the fly. + +The radar display has been modified to be more closely coupled to the V +library. This code was borrowed from the ACM 4.0 version. + +If no geometry specification is supplied, the ACM server now computes a +reasonable window geometry based on the screen's width. + +Keypad view selection has been added for Sun systems with some help from +Keith Fredericks (keith@cray.com). + + + +What's different with revision 2.4: +----------------------------------- + +Missiles now use a more realistic target tracking method, known as proportional +navigation guidance. + +Sustained aircraft load factors at high speeds are now limited to a range of +about +10.0 to -4.0 gees. + +More math portability problems have been worked-around. src/manifest.h +contains the definition NEEDS_COPYSIGN. You may comment this out if your +system supports the IEEE copysign function. + +This revision has been tested with X11R5. + + +What's different with revision 2.3: +----------------------------------- + +This revision repairs several portability problems uncovered in revision 2.2. + +A problem with IEEE math in interpolate.c has been worked-around. Invalid +interpolation requests (which shouldn't happen in ACM) will now result in +messages being printed to standard error. + +Several debugging code fragments are now only conditionally compiled. See +manifest.h for more information. + +A problem controlling aircraft resupply could generate unexpected errors +from a system's sqrt function ("sqrt: domain error", for example). It has been +fixed. + + +What's different with revision 2.2: +----------------------------------- + +Explosions now appear in the skies of ACM. Explosions will appear when an +aircraft is struck by a missile or cannon shell. Players go out with a +bang, too. + +The flight simulation model has been tweaked to allow for spins. I don't +think you can really spin an F-16, but if you'd like to try it in ACM, do +this: build up some airspeed in level flight and then go vertical (pitch +up to ninety degrees, or thereabouts). Cut the throttle and afterburner +and keep the nose pointed vertically. Eventually, the F-16 will begin to +fall back to earth -- and typically enter a spin. The only recovery +procedure that I've tried that works is to apply full forward (down) +elevator to break the stall; then re-apply power. + +Elevator trim has been added. The (J) key sets to the elevator trim to +be equal to the current elevator setting. The (U) key resets it to the +normal takeoff setting. Typically, you'll get the aircraft into the +pitch configuration that you want (e.g. level flight) and then press the +(J) key -- then move the elevator control to the neutral position +(the center of the HUD). + +Aircraft now have functioning landing gear. The (G) key acts as the landing +gear handle. A landing gear handle and status lights are located to the right +of the radar set. + +Each aircraft now carries a limited number of air-to-air missiles (eight, to +be precise). + +Aircraft can now be re-armed and re-fueled on the ground. +To do this, a player must land successfully at the team's home airfield +and come to a complete stop. After an interval of not greater than 30 +seconds, the aircraft will be completely re-armed and refueled. Aircraft +damage is repaired, as well. + +Acm's reaction to the resizing of its window has been improved substantially. + +The code handling the HUD altitude, airspeed, and heading ladders has been +improved. + +A problem with acms dumping core when it cannot access the graphics +description files has been fixed. Thanks go to Mark Moraes. + +Acm now makes an effort to select an appropriate X Visual to run in. These +changes are based on code supplied by Mark Hall. + +A problem with unwanted NoExpose events on monochrome displays was fixed +by Georges Lauri. + +Acm's usage of the X DISPLAY environment variable has been improved with the +help of some code from Michael Pall. Now systems where the ACM server is +running on the same system as the X server can get "unix:*" and "local:*" +connections. + + +GENERAL NOTES +------------- + +This software is divided into three major parts: the 3-D graphics routines, +the DIS library and the flight simulator itself. The 3-D stuff is contained +in the V directory. V/lib holds the library itself. V/test contains a +program that can be used to test your port of the V library. The dis +directory holds the Distributed Interactive Simulation library. + +`src' contains the remainder of the flight simulator. + +Comments and suggestions to improve this software are welcome. + +Several "features" in this revision of the software: + + * flaps and landing gear can be lowered at rediculously high speeds. + + * you can fly through mountains. + + * engines do not flame-out. + +README: patchlevel-4.8 diff -Nru acm-5.0/configure acm-6.0+20200416/configure --- acm-5.0/configure 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/configure 1970-01-01 00:00:00.000000000 +0000 @@ -1,2783 +0,0 @@ -#! /bin/sh - -# Guess values for system-dependent variables and create Makefiles. -# Generated automatically using autoconf version 2.13 -# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. -# -# This configure script is free software; the Free Software Foundation -# gives unlimited permission to copy, distribute and modify it. - -# Defaults: -ac_help= -ac_default_prefix=/usr/local -# Any additions from configure.in: -ac_help="$ac_help - --with-x use the X Window System" -ac_help="$ac_help - --enable-dis broadcast IEEE 1278 DIS packets" -ac_help="$ac_help - --enable-dis-debug compile-in DIS debugging messages" -ac_help="$ac_help - --enable-request-control use experimental DIS request control protocol" - -# Initialize some variables set by options. -# The variables have the same names as the options, with -# dashes changed to underlines. -build=NONE -cache_file=./config.cache -exec_prefix=NONE -host=NONE -no_create= -nonopt=NONE -no_recursion= -prefix=NONE -program_prefix=NONE -program_suffix=NONE -program_transform_name=s,x,x, -silent= -site= -srcdir= -target=NONE -verbose= -x_includes=NONE -x_libraries=NONE -bindir='${exec_prefix}/bin' -sbindir='${exec_prefix}/sbin' -libexecdir='${exec_prefix}/libexec' -datadir='${prefix}/share' -sysconfdir='${prefix}/etc' -sharedstatedir='${prefix}/com' -localstatedir='${prefix}/var' -libdir='${exec_prefix}/lib' -includedir='${prefix}/include' -oldincludedir='/usr/include' -infodir='${prefix}/info' -mandir='${prefix}/man' - -# Initialize some other variables. -subdirs= -MFLAGS= MAKEFLAGS= -SHELL=${CONFIG_SHELL-/bin/sh} -# Maximum number of lines to put in a shell here document. -ac_max_here_lines=12 - -ac_prev= -for ac_option -do - - # If the previous option needs an argument, assign it. - if test -n "$ac_prev"; then - eval "$ac_prev=\$ac_option" - ac_prev= - continue - fi - - case "$ac_option" in - -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; - *) ac_optarg= ;; - esac - - # Accept the important Cygnus configure options, so we can diagnose typos. - - case "$ac_option" in - - -bindir | --bindir | --bindi | --bind | --bin | --bi) - ac_prev=bindir ;; - -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) - bindir="$ac_optarg" ;; - - -build | --build | --buil | --bui | --bu) - ac_prev=build ;; - -build=* | --build=* | --buil=* | --bui=* | --bu=*) - build="$ac_optarg" ;; - - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - cache_file="$ac_optarg" ;; - - -datadir | --datadir | --datadi | --datad | --data | --dat | --da) - ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ - | --da=*) - datadir="$ac_optarg" ;; - - -disable-* | --disable-*) - ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then - { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } - fi - ac_feature=`echo $ac_feature| sed 's/-/_/g'` - eval "enable_${ac_feature}=no" ;; - - -enable-* | --enable-*) - ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then - { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } - fi - ac_feature=`echo $ac_feature| sed 's/-/_/g'` - case "$ac_option" in - *=*) ;; - *) ac_optarg=yes ;; - esac - eval "enable_${ac_feature}='$ac_optarg'" ;; - - -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ - | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ - | --exec | --exe | --ex) - ac_prev=exec_prefix ;; - -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ - | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ - | --exec=* | --exe=* | --ex=*) - exec_prefix="$ac_optarg" ;; - - -gas | --gas | --ga | --g) - # Obsolete; use --with-gas. - with_gas=yes ;; - - -help | --help | --hel | --he) - # Omit some internal or obsolete options to make the list less imposing. - # This message is too long to be a string in the A/UX 3.1 sh. - cat << EOF -Usage: configure [options] [host] -Options: [defaults in brackets after descriptions] -Configuration: - --cache-file=FILE cache test results in FILE - --help print this message - --no-create do not create output files - --quiet, --silent do not print \`checking...' messages - --version print the version of autoconf that created configure -Directory and file names: - --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] - --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - [same as prefix] - --bindir=DIR user executables in DIR [EPREFIX/bin] - --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] - --libexecdir=DIR program executables in DIR [EPREFIX/libexec] - --datadir=DIR read-only architecture-independent data in DIR - [PREFIX/share] - --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] - --sharedstatedir=DIR modifiable architecture-independent data in DIR - [PREFIX/com] - --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] - --libdir=DIR object code libraries in DIR [EPREFIX/lib] - --includedir=DIR C header files in DIR [PREFIX/include] - --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] - --infodir=DIR info documentation in DIR [PREFIX/info] - --mandir=DIR man documentation in DIR [PREFIX/man] - --srcdir=DIR find the sources in DIR [configure dir or ..] - --program-prefix=PREFIX prepend PREFIX to installed program names - --program-suffix=SUFFIX append SUFFIX to installed program names - --program-transform-name=PROGRAM - run sed PROGRAM on installed program names -EOF - cat << EOF -Host type: - --build=BUILD configure for building on BUILD [BUILD=HOST] - --host=HOST configure for HOST [guessed] - --target=TARGET configure for TARGET [TARGET=HOST] -Features and packages: - --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) - --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] - --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --x-includes=DIR X include files are in DIR - --x-libraries=DIR X library files are in DIR -EOF - if test -n "$ac_help"; then - echo "--enable and --with options recognized:$ac_help" - fi - exit 0 ;; - - -host | --host | --hos | --ho) - ac_prev=host ;; - -host=* | --host=* | --hos=* | --ho=*) - host="$ac_optarg" ;; - - -includedir | --includedir | --includedi | --included | --include \ - | --includ | --inclu | --incl | --inc) - ac_prev=includedir ;; - -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ - | --includ=* | --inclu=* | --incl=* | --inc=*) - includedir="$ac_optarg" ;; - - -infodir | --infodir | --infodi | --infod | --info | --inf) - ac_prev=infodir ;; - -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) - infodir="$ac_optarg" ;; - - -libdir | --libdir | --libdi | --libd) - ac_prev=libdir ;; - -libdir=* | --libdir=* | --libdi=* | --libd=*) - libdir="$ac_optarg" ;; - - -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ - | --libexe | --libex | --libe) - ac_prev=libexecdir ;; - -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ - | --libexe=* | --libex=* | --libe=*) - libexecdir="$ac_optarg" ;; - - -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst \ - | --locals | --local | --loca | --loc | --lo) - ac_prev=localstatedir ;; - -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* \ - | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) - localstatedir="$ac_optarg" ;; - - -mandir | --mandir | --mandi | --mand | --man | --ma | --m) - ac_prev=mandir ;; - -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) - mandir="$ac_optarg" ;; - - -nfp | --nfp | --nf) - # Obsolete; use --without-fp. - with_fp=no ;; - - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c) - no_create=yes ;; - - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) - no_recursion=yes ;; - - -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ - | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ - | --oldin | --oldi | --old | --ol | --o) - ac_prev=oldincludedir ;; - -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ - | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ - | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) - oldincludedir="$ac_optarg" ;; - - -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) - ac_prev=prefix ;; - -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix="$ac_optarg" ;; - - -program-prefix | --program-prefix | --program-prefi | --program-pref \ - | --program-pre | --program-pr | --program-p) - ac_prev=program_prefix ;; - -program-prefix=* | --program-prefix=* | --program-prefi=* \ - | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) - program_prefix="$ac_optarg" ;; - - -program-suffix | --program-suffix | --program-suffi | --program-suff \ - | --program-suf | --program-su | --program-s) - ac_prev=program_suffix ;; - -program-suffix=* | --program-suffix=* | --program-suffi=* \ - | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) - program_suffix="$ac_optarg" ;; - - -program-transform-name | --program-transform-name \ - | --program-transform-nam | --program-transform-na \ - | --program-transform-n | --program-transform- \ - | --program-transform | --program-transfor \ - | --program-transfo | --program-transf \ - | --program-trans | --program-tran \ - | --progr-tra | --program-tr | --program-t) - ac_prev=program_transform_name ;; - -program-transform-name=* | --program-transform-name=* \ - | --program-transform-nam=* | --program-transform-na=* \ - | --program-transform-n=* | --program-transform-=* \ - | --program-transform=* | --program-transfor=* \ - | --program-transfo=* | --program-transf=* \ - | --program-trans=* | --program-tran=* \ - | --progr-tra=* | --program-tr=* | --program-t=*) - program_transform_name="$ac_optarg" ;; - - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - silent=yes ;; - - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) - ac_prev=sbindir ;; - -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ - | --sbi=* | --sb=*) - sbindir="$ac_optarg" ;; - - -sharedstatedir | --sharedstatedir | --sharedstatedi \ - | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ - | --sharedst | --shareds | --shared | --share | --shar \ - | --sha | --sh) - ac_prev=sharedstatedir ;; - -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ - | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ - | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ - | --sha=* | --sh=*) - sharedstatedir="$ac_optarg" ;; - - -site | --site | --sit) - ac_prev=site ;; - -site=* | --site=* | --sit=*) - site="$ac_optarg" ;; - - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - srcdir="$ac_optarg" ;; - - -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ - | --syscon | --sysco | --sysc | --sys | --sy) - ac_prev=sysconfdir ;; - -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ - | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) - sysconfdir="$ac_optarg" ;; - - -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target ;; - -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target="$ac_optarg" ;; - - -v | -verbose | --verbose | --verbos | --verbo | --verb) - verbose=yes ;; - - -version | --version | --versio | --versi | --vers) - echo "configure generated by autoconf version 2.13" - exit 0 ;; - - -with-* | --with-*) - ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then - { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } - fi - ac_package=`echo $ac_package| sed 's/-/_/g'` - case "$ac_option" in - *=*) ;; - *) ac_optarg=yes ;; - esac - eval "with_${ac_package}='$ac_optarg'" ;; - - -without-* | --without-*) - ac_package=`echo $ac_option|sed -e 's/-*without-//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then - { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } - fi - ac_package=`echo $ac_package| sed 's/-/_/g'` - eval "with_${ac_package}=no" ;; - - --x) - # Obsolete; use --with-x. - with_x=yes ;; - - -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ - | --x-incl | --x-inc | --x-in | --x-i) - ac_prev=x_includes ;; - -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ - | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) - x_includes="$ac_optarg" ;; - - -x-libraries | --x-libraries | --x-librarie | --x-librari \ - | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) - ac_prev=x_libraries ;; - -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ - | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries="$ac_optarg" ;; - - -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } - ;; - - *) - if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then - echo "configure: warning: $ac_option: invalid host type" 1>&2 - fi - if test "x$nonopt" != xNONE; then - { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } - fi - nonopt="$ac_option" - ;; - - esac -done - -if test -n "$ac_prev"; then - { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } -fi - -trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 - -# File descriptor usage: -# 0 standard input -# 1 file creation -# 2 errors and warnings -# 3 some systems may open it to /dev/tty -# 4 used on the Kubota Titan -# 6 checking for... messages and results -# 5 compiler messages saved in config.log -if test "$silent" = yes; then - exec 6>/dev/null -else - exec 6>&1 -fi -exec 5>./config.log - -echo "\ -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. -" 1>&5 - -# Strip out --no-create and --no-recursion so they do not pile up. -# Also quote any args containing shell metacharacters. -ac_configure_args= -for ac_arg -do - case "$ac_arg" in - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c) ;; - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; - *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) - ac_configure_args="$ac_configure_args '$ac_arg'" ;; - *) ac_configure_args="$ac_configure_args $ac_arg" ;; - esac -done - -# NLS nuisances. -# Only set these to C if already set. These must not be set unconditionally -# because not all systems understand e.g. LANG=C (notably SCO). -# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! -# Non-C LC_CTYPE values break the ctype check. -if test "${LANG+set}" = set; then LANG=C; export LANG; fi -if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi -if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi -if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi - -# confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -rf conftest* confdefs.h -# AIX cpp loses on an empty file, so make sure it contains at least a newline. -echo > confdefs.h - -# A filename unique to this package, relative to the directory that -# configure is in, which we can look for to find out if srcdir is correct. -ac_unique_file=README - -# Find the source files, if location was not specified. -if test -z "$srcdir"; then - ac_srcdir_defaulted=yes - # Try the directory containing this script, then its parent. - ac_prog=$0 - ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` - test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. - srcdir=$ac_confdir - if test ! -r $srcdir/$ac_unique_file; then - srcdir=.. - fi -else - ac_srcdir_defaulted=no -fi -if test ! -r $srcdir/$ac_unique_file; then - if test "$ac_srcdir_defaulted" = yes; then - { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } - else - { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } - fi -fi -srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` - -# Prefer explicitly selected file to automatically selected ones. -if test -z "$CONFIG_SITE"; then - if test "x$prefix" != xNONE; then - CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" - else - CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" - fi -fi -for ac_site_file in $CONFIG_SITE; do - if test -r "$ac_site_file"; then - echo "loading site script $ac_site_file" - . "$ac_site_file" - fi -done - -if test -r "$cache_file"; then - echo "loading cache $cache_file" - . $cache_file -else - echo "creating cache $cache_file" - > $cache_file -fi - -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - -ac_exeext= -ac_objext=o -if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then - # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. - if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then - ac_n= ac_c=' -' ac_t=' ' - else - ac_n=-n ac_c= ac_t= - fi -else - ac_n= ac_c='\c' ac_t= -fi - - - -if test -d /usr/share/games ; then - OBVDIR="/usr/share/games/acm" -else - OBVDIR=\$\(prefix\)/games/acm -fi - - -rand=0 -random=0 - -if test "$OPENWINHOME" = "" ; then - ow=/usr/openwin -else - ow=$OPENWINHOME -fi - -# Solaris special handling ... -SOLARIS=0 -if uname -sr | grep '^SunOS 5' >/dev/null ; then - LIBS="$LIBS -R/usr/ucblib -L/usr/ucblib -lucb" - SOLARIS=1 -fi - -# Linux ? -LINUX=0 -if uname -s | grep -i linux > /dev/null ; then - LINUX=1 -fi - -if uname -s | grep -i "GNU/kFreeBSD" > /dev/null ; then - LINUX=1 -fi - -# Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:566: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_CC="gcc" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:596: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_prog_rejected=no - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - break - fi - done - IFS="$ac_save_ifs" -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $# -gt 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - set dummy "$ac_dir/$ac_word" "$@" - shift - ac_cv_prog_CC="$@" - fi -fi -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - if test -z "$CC"; then - case "`uname -s`" in - *win32* | *WIN32*) - # Extract the first word of "cl", so it can be a program name with args. -set dummy cl; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:647: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_CC="cl" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - ;; - esac - fi - test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } -fi - -echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:679: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 - -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - -cat > conftest.$ac_ext << EOF - -#line 690 "configure" -#include "confdefs.h" - -main(){return(0);} -EOF -if { (eval echo configure:695: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - ac_cv_prog_cc_works=yes - # If we can't run a trivial program, we are probably using a cross compiler. - if (./conftest; exit) 2>/dev/null; then - ac_cv_prog_cc_cross=no - else - ac_cv_prog_cc_cross=yes - fi -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - ac_cv_prog_cc_works=no -fi -rm -fr conftest* -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - -echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 -if test $ac_cv_prog_cc_works = no; then - { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } -fi -echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 -echo "configure:721: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 -echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 -cross_compiling=$ac_cv_prog_cc_cross - -echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 -echo "configure:726: checking whether we are using GNU C" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then - ac_cv_prog_gcc=yes -else - ac_cv_prog_gcc=no -fi -fi - -echo "$ac_t""$ac_cv_prog_gcc" 1>&6 - -if test $ac_cv_prog_gcc = yes; then - GCC=yes -else - GCC= -fi - -ac_test_CFLAGS="${CFLAGS+set}" -ac_save_CFLAGS="$CFLAGS" -CFLAGS= -echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 -echo "configure:754: checking whether ${CC-cc} accepts -g" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - echo 'void f(){}' > conftest.c -if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then - ac_cv_prog_cc_g=yes -else - ac_cv_prog_cc_g=no -fi -rm -f conftest* - -fi - -echo "$ac_t""$ac_cv_prog_cc_g" 1>&6 -if test "$ac_test_CFLAGS" = set; then - CFLAGS="$ac_save_CFLAGS" -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" - else - CFLAGS= - fi -fi - - -echo $ac_n "checking for xdr_free in -lnsl""... $ac_c" 1>&6 -echo "configure:787: checking for xdr_free in -lnsl" >&5 -ac_lib_var=`echo nsl'_'xdr_free | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="$LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - LIBS="$LIBS" -else - echo "$ac_t""no" 1>&6 -fi - - -if test "$LINUX" = "0" ; then - echo $ac_n "checking for elf_end in -lelf""... $ac_c" 1>&6 -echo "configure:829: checking for elf_end in -lelf" >&5 -ac_lib_var=`echo elf'_'elf_end | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-lelf $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - LIBS="$LIBS -lelf" -else - echo "$ac_t""no" 1>&6 -fi - -fi - - - - - -ac_aux_dir= -for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do - if test -f $ac_dir/install-sh; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f $ac_dir/install.sh; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - fi -done -if test -z "$ac_aux_dir"; then - { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; } -fi -ac_config_guess=$ac_aux_dir/config.guess -ac_config_sub=$ac_aux_dir/config.sub -ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. - -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# ./install, which can be erroneously created by make from ./install.sh. -echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 -echo "configure:905: checking for a BSD compatible install" >&5 -if test -z "$INSTALL"; then -if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":" - for ac_dir in $PATH; do - # Account for people who put trailing slashes in PATH elements. - case "$ac_dir/" in - /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - # Don't use installbsd from OSF since it installs stuff as root - # by default. - for ac_prog in ginstall scoinst install; do - if test -f $ac_dir/$ac_prog; then - if test $ac_prog = install && - grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - else - ac_cv_path_install="$ac_dir/$ac_prog -c" - break 2 - fi - fi - done - ;; - esac - done - IFS="$ac_save_IFS" - -fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL="$ac_cv_path_install" - else - # As a last resort, use the slow shell script. We don't cache a - # path for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the path is relative. - INSTALL="$ac_install_sh" - fi -fi -echo "$ac_t""$INSTALL" 1>&6 - -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' - -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}' - -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' - -# Extract the first word of "ranlib", so it can be a program name with args. -set dummy ranlib; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:960: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_RANLIB="ranlib" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":" -fi -fi -RANLIB="$ac_cv_prog_RANLIB" -if test -n "$RANLIB"; then - echo "$ac_t""$RANLIB" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 -echo "configure:988: checking how to run the C preprocessor" >&5 -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then -if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - # This must be in double quotes, not single quotes, because CPP may get - # substituted into the Makefile and "${CC-cc}" will confuse make. - CPP="${CC-cc} -E" - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. - cat > conftest.$ac_ext < -Syntax Error -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1009: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - : -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - CPP="${CC-cc} -E -traditional-cpp" - cat > conftest.$ac_ext < -Syntax Error -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1026: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - : -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - CPP="${CC-cc} -nologo -E" - cat > conftest.$ac_ext < -Syntax Error -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1043: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - : -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - CPP=/lib/cpp -fi -rm -f conftest* -fi -rm -f conftest* -fi -rm -f conftest* - ac_cv_prog_CPP="$CPP" -fi - CPP="$ac_cv_prog_CPP" -else - ac_cv_prog_CPP="$CPP" -fi -echo "$ac_t""$CPP" 1>&6 - -echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 -echo "configure:1068: checking for ANSI C header files" >&5 -if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -#include -#include -#include -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1081: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - rm -rf conftest* - ac_cv_header_stdc=yes -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_cv_header_stdc=no -fi -rm -f conftest* - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. -cat > conftest.$ac_ext < -EOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "memchr" >/dev/null 2>&1; then - : -else - rm -rf conftest* - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. -cat > conftest.$ac_ext < -EOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "free" >/dev/null 2>&1; then - : -else - rm -rf conftest* - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. -if test "$cross_compiling" = yes; then - : -else - cat > conftest.$ac_ext < -#define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int main () { int i; for (i = 0; i < 256; i++) -if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); -exit (0); } - -EOF -if { (eval echo configure:1148: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null -then - : -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -fr conftest* - ac_cv_header_stdc=no -fi -rm -fr conftest* -fi - -fi -fi - -echo "$ac_t""$ac_cv_header_stdc" 1>&6 -if test $ac_cv_header_stdc = yes; then - cat >> confdefs.h <<\EOF -#define STDC_HEADERS 1 -EOF - -fi - -for ac_hdr in stdlib.h malloc.h unistd.h -do -ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` -echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:1175: checking for $ac_hdr" >&5 -if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1185: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - rm -rf conftest* - eval "ac_cv_header_$ac_safe=yes" -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_header_$ac_safe=no" -fi -rm -f conftest* -fi -if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` - cat >> confdefs.h <&6 -fi -done - -if test "$LINUX" = "0" ; then - ac_safe=`echo "elf.h" | sed 'y%./+-%__p_%'` -echo $ac_n "checking for elf.h""... $ac_c" 1>&6 -echo "configure:1214: checking for elf.h" >&5 -if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1224: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - rm -rf conftest* - eval "ac_cv_header_$ac_safe=yes" -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_header_$ac_safe=no" -fi -rm -f conftest* -fi -if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then - echo "$ac_t""yes" 1>&6 - LIBS="$LIBS -lelf" -else - echo "$ac_t""no" 1>&6 -fi - -fi -echo $ac_n "checking return type of signal handlers""... $ac_c" 1>&6 -echo "configure:1250: checking return type of signal handlers" >&5 -if eval "test \"`echo '$''{'ac_cv_type_signal'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -#include -#ifdef signal -#undef signal -#endif -#ifdef __cplusplus -extern "C" void (*signal (int, void (*)(int)))(int); -#else -void (*signal ()) (); -#endif - -int main() { -int i; -; return 0; } -EOF -if { (eval echo configure:1272: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - ac_cv_type_signal=void -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_cv_type_signal=int -fi -rm -f conftest* -fi - -echo "$ac_t""$ac_cv_type_signal" 1>&6 -cat >> confdefs.h <&6 -echo "configure:1291: checking for sigaction structure" >&5 -if eval "test \"`echo '$''{'ac_cv_struct_sigaction'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -#include -int main() { - struct sigaction s; -; return 0; } -EOF -if { (eval echo configure:1304: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - ac_cv_struct_sigaction=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_cv_struct_sigaction=no -fi -rm -f conftest* - -fi - -echo "$ac_t""$ac_cv_struct_sigaction" 1>&6 - if test $ac_cv_struct_sigaction = yes; then - cat >> confdefs.h <<\EOF -#define HAVE_STRUCT_SIGACTION 1 -EOF - - fi - -echo $ac_n "checking for M_PI casted to long double""... $ac_c" 1>&6 -echo "configure:1326: checking for M_PI casted to long double" >&5 -if eval "test \"`echo '$''{'ac_cv_m_pi_long_double'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test "$cross_compiling" = yes; then - ac_cv_m_pi_long_double=no -else - cat > conftest.$ac_ext < -#ifndef M_PI -#define M_PI 3.1415926 -#endif - int main() { - exit(sizeof(double) < sizeof(M_PI)); } -EOF -if { (eval echo configure:1343: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null -then - ac_cv_m_pi_long_double=no -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -fr conftest* - ac_cv_m_pi_long_double=yes -fi -rm -fr conftest* -fi - - -fi - -echo "$ac_t""$ac_cv_m_pi_long_double" 1>&6 - if test $ac_cv_m_pi_long_double = yes; then - cat >> confdefs.h <<\EOF -#define M_PI_LONG_DOUBLE 1 -EOF - - fi - - -# If we find X, set shell vars x_includes and x_libraries to the -# paths, otherwise set no_x=yes. -# Uses ac_ vars as temps to allow command line to override cache and checks. -# --without-x overrides everything else, but does not touch the cache. -echo $ac_n "checking for X""... $ac_c" 1>&6 -echo "configure:1372: checking for X" >&5 - -# Check whether --with-x or --without-x was given. -if test "${with_x+set}" = set; then - withval="$with_x" - : -fi - -# $have_x is `yes', `no', `disabled', or empty when we do not yet know. -if test "x$with_x" = xno; then - # The user explicitly disabled X. - have_x=disabled -else - if test "x$x_includes" != xNONE && test "x$x_libraries" != xNONE; then - # Both variables are already set. - have_x=yes - else -if eval "test \"`echo '$''{'ac_cv_have_x'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - # One or both of the vars are not set, and there is no cached value. -ac_x_includes=NO ac_x_libraries=NO -rm -fr conftestdir -if mkdir conftestdir; then - cd conftestdir - # Make sure to not put "make" in the Imakefile rules, since we grep it out. - cat > Imakefile <<'EOF' -acfindx: - @echo 'ac_im_incroot="${INCROOT}"; ac_im_usrlibdir="${USRLIBDIR}"; ac_im_libdir="${LIBDIR}"' -EOF - if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then - # GNU make sometimes prints "make[1]: Entering...", which would confuse us. - eval `${MAKE-make} acfindx 2>/dev/null | grep -v make` - # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. - for ac_extension in a so sl; do - if test ! -f $ac_im_usrlibdir/libX11.$ac_extension && - test -f $ac_im_libdir/libX11.$ac_extension; then - ac_im_usrlibdir=$ac_im_libdir; break - fi - done - # Screen out bogus values from the imake configuration. They are - # bogus both because they are the default anyway, and because - # using them would break gcc on systems where it needs fixed includes. - case "$ac_im_incroot" in - /usr/include) ;; - *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes="$ac_im_incroot" ;; - esac - case "$ac_im_usrlibdir" in - /usr/lib | /lib) ;; - *) test -d "$ac_im_usrlibdir" && ac_x_libraries="$ac_im_usrlibdir" ;; - esac - fi - cd .. - rm -fr conftestdir -fi - -if test "$ac_x_includes" = NO; then - # Guess where to find include files, by looking for this one X11 .h file. - test -z "$x_direct_test_include" && x_direct_test_include=X11/Intrinsic.h - - # First, try using that file with no special directory specified. -cat > conftest.$ac_ext < -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1439: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - rm -rf conftest* - # We can compile using X headers with no special include directory. -ac_x_includes= -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - # Look for the header file in a standard set of common directories. -# Check X11 before X11Rn because it is often a symlink to the current release. - for ac_dir in \ - /usr/X11/include \ - /usr/X11R6/include \ - /usr/X11R5/include \ - /usr/X11R4/include \ - \ - /usr/include/X11 \ - /usr/include/X11R6 \ - /usr/include/X11R5 \ - /usr/include/X11R4 \ - \ - /usr/local/X11/include \ - /usr/local/X11R6/include \ - /usr/local/X11R5/include \ - /usr/local/X11R4/include \ - \ - /usr/local/include/X11 \ - /usr/local/include/X11R6 \ - /usr/local/include/X11R5 \ - /usr/local/include/X11R4 \ - \ - /usr/X386/include \ - /usr/x386/include \ - /usr/XFree86/include/X11 \ - \ - /usr/include \ - /usr/local/include \ - /usr/unsupported/include \ - /usr/athena/include \ - /usr/local/x11r5/include \ - /usr/lpp/Xamples/include \ - \ - /usr/openwin/include \ - /usr/openwin/share/include \ - ; \ - do - if test -r "$ac_dir/$x_direct_test_include"; then - ac_x_includes=$ac_dir - break - fi - done -fi -rm -f conftest* -fi # $ac_x_includes = NO - -if test "$ac_x_libraries" = NO; then - # Check for the libraries. - - test -z "$x_direct_test_library" && x_direct_test_library=Xt - test -z "$x_direct_test_function" && x_direct_test_function=XtMalloc - - # See if we find them without any special options. - # Don't add to $LIBS permanently. - ac_save_LIBS="$LIBS" - LIBS="-l$x_direct_test_library $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - LIBS="$ac_save_LIBS" -# We can link X programs with no special library path. -ac_x_libraries= -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - LIBS="$ac_save_LIBS" -# First see if replacing the include by lib works. -# Check X11 before X11Rn because it is often a symlink to the current release. -for ac_dir in `echo "$ac_x_includes" | sed s/include/lib/` \ - /usr/X11/lib \ - /usr/X11R6/lib \ - /usr/X11R5/lib \ - /usr/X11R4/lib \ - \ - /usr/lib/X11 \ - /usr/lib/X11R6 \ - /usr/lib/X11R5 \ - /usr/lib/X11R4 \ - \ - /usr/local/X11/lib \ - /usr/local/X11R6/lib \ - /usr/local/X11R5/lib \ - /usr/local/X11R4/lib \ - \ - /usr/local/lib/X11 \ - /usr/local/lib/X11R6 \ - /usr/local/lib/X11R5 \ - /usr/local/lib/X11R4 \ - \ - /usr/X386/lib \ - /usr/x386/lib \ - /usr/XFree86/lib/X11 \ - \ - /usr/lib \ - /usr/local/lib \ - /usr/unsupported/lib \ - /usr/athena/lib \ - /usr/local/x11r5/lib \ - /usr/lpp/Xamples/lib \ - /lib/usr/lib/X11 \ - \ - /usr/openwin/lib \ - /usr/openwin/share/lib \ - ; \ -do - for ac_extension in a so sl; do - if test -r $ac_dir/lib${x_direct_test_library}.$ac_extension; then - ac_x_libraries=$ac_dir - break 2 - fi - done -done -fi -rm -f conftest* -fi # $ac_x_libraries = NO - -if test "$ac_x_includes" = NO || test "$ac_x_libraries" = NO; then - # Didn't find X anywhere. Cache the known absence of X. - ac_cv_have_x="have_x=no" -else - # Record where we found X for the cache. - ac_cv_have_x="have_x=yes \ - ac_x_includes=$ac_x_includes ac_x_libraries=$ac_x_libraries" -fi -fi - fi - eval "$ac_cv_have_x" -fi # $with_x != no - -if test "$have_x" != yes; then - echo "$ac_t""$have_x" 1>&6 - no_x=yes -else - # If each of the values was on the command line, it overrides each guess. - test "x$x_includes" = xNONE && x_includes=$ac_x_includes - test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries - # Update the cache value to reflect the command line values. - ac_cv_have_x="have_x=yes \ - ac_x_includes=$x_includes ac_x_libraries=$x_libraries" - echo "$ac_t""libraries $x_libraries, headers $x_includes" 1>&6 -fi - - -test "$x_includes" != "NONE" -a "$x_includes" != "" && CFLAGS="$CFLAGS -I${x_includes}" -test "$x_libraries" != "NONE" -a "$x_libraries" != "" && LIBS="$LIBS -L${x_libraries}" - -LIBS="$LIBS -lX11" - - - -echo $ac_n "checking for XdbeSwapBuffers in -lXext""... $ac_c" 1>&6 -echo "configure:1610: checking for XdbeSwapBuffers in -lXext" >&5 -ac_lib_var=`echo Xext'_'XdbeSwapBuffers | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-lXext $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - echo "Found X11 double buffering extension"; - LIBS="$LIBS -lXext"; - VLIB_EXTRA_C_FILES="Vdbe.c"; - VLIB_EXTRA_O_FILES="Vdbe.o"; - cat >> confdefs.h <<\EOF -#define HAVE_X11_DBE 1 -EOF - -else - echo "$ac_t""no" 1>&6 -fi - - - - -echo $ac_n "checking for XInitImage in -lX11""... $ac_c" 1>&6 -echo "configure:1660: checking for XInitImage in -lX11" >&5 -ac_lib_var=`echo X11'_'XInitImage | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-lX11 $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - echo "Found X11R6 XInitImage" -else - echo "$ac_t""no" 1>&6 - SRC_EXTRA_C_FILES="ImUtil.c"; - SRC_EXTRA_O_FILES="ImUtil.o" -fi - - -echo $ac_n "checking should the IEEE 1278 DIS protocol be used...""... $ac_c" 1>&6 -echo "configure:1703: checking should the IEEE 1278 DIS protocol be used..." >&5 -# Check whether --enable-dis or --disable-dis was given. -if test "${enable_dis+set}" = set; then - enableval="$enable_dis" - if test "$enableval" = yes; then - echo "$ac_t""yes" 1>&6 - cat >> confdefs.h <<\EOF -#define HAVE_DIS 1 -EOF - -else - echo "$ac_t""no" 1>&6 -fi -else - cat >> confdefs.h <<\EOF -#define HAVE_DIS 1 -EOF - echo "$ac_t""yes" 1>&6 -fi - - -echo $ac_n "checking if DIS debugging should be compiled-in""... $ac_c" 1>&6 -echo "configure:1725: checking if DIS debugging should be compiled-in" >&5 -# Check whether --enable-dis-debug or --disable-dis-debug was given. -if test "${enable_dis_debug+set}" = set; then - enableval="$enable_dis_debug" - if test "$enableval" = yes; then - echo "$ac_t""yes" 1>&6 - cat >> confdefs.h <<\EOF -#define DIS_DEBUG 1 -EOF - -else - echo "$ac_t""no" 1>&6 -fi -else - echo "$ac_t""no" 1>&6 -fi - - -echo $ac_n "checking should DIS experimental request/grant control be used...""... $ac_c" 1>&6 -echo "configure:1744: checking should DIS experimental request/grant control be used..." >&5 -# Check whether --enable-request-control or --disable-request-control was given. -if test "${enable_request_control+set}" = set; then - enableval="$enable_request_control" - if test "$enableval" = yes; then - echo "$ac_t""yes" 1>&6 - cat >> confdefs.h <<\EOF -#define USE_REQUEST_CONTROL 1 -EOF - -else - echo "$ac_t""no" 1>&6 -fi -else - cat >> confdefs.h <<\EOF -#define USE_REQUEST_CONTROL 1 -EOF - echo "$ac_t""yes" 1>&6 -fi - - - -echo "checking checking for an ACM-compatible audio library ..." 1>&6 -echo "configure:1767: checking checking for an ACM-compatible audio library ..." >&5 -unset ac_cv_lib_audio -echo $ac_n "checking for AuCloseServer in -laudio""... $ac_c" 1>&6 -echo "configure:1770: checking for AuCloseServer in -laudio" >&5 -ac_lib_var=`echo audio'_'AuCloseServer | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-laudio -lm $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - echo "Found NCD Netaudio libraries"; - LIBS="$LIBS -laudio -lm"; cat >> confdefs.h <<\EOF -#define NETAUDIO 1 -EOF - -else - echo "$ac_t""no" 1>&6 -fi - -if test "$ac_cv_lib_audio" = "no"; then -unset ac_cv_lib_audio -echo $ac_n "checking for ACloseAudio in -laudio""... $ac_c" 1>&6 -echo "configure:1816: checking for ACloseAudio in -laudio" >&5 -ac_lib_var=`echo audio'_'ACloseAudio | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-laudio $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - echo "Found HP audio libraries"; - LIBS="$LIBS -laudio"; cat >> confdefs.h <<\EOF -#define HPAUDIO 1 -EOF - -else - echo "$ac_t""no" 1>&6 -fi - - if test "$ac_cv_lib_audio" = "no"; then - echo "configure: warning: No ACM-compatible audio library was found -- ACM will compile anyway" 1>&2 - fi -fi -unset ac_cv_lib_audio - -echo $ac_n "checking for bind in -lsocket""... $ac_c" 1>&6 -echo "configure:1866: checking for bind in -lsocket" >&5 -ac_lib_var=`echo socket'_'bind | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-lsocket $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - LIBS="$LIBS -lsocket" -else - echo "$ac_t""no" 1>&6 -fi - -echo $ac_n "checking for main in -ldnet_stub""... $ac_c" 1>&6 -echo "configure:1906: checking for main in -ldnet_stub" >&5 -ac_lib_var=`echo dnet_stub'_'main | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-ldnet_stub $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - LIBS="$LIBS -ldnet_stub" -else - echo "$ac_t""no" 1>&6 -fi - - -if uname -srv | grep '^AIX 2 3' >/dev/null ; then - : -else - echo $ac_n "checking for main in -lbsd""... $ac_c" 1>&6 -echo "configure:1946: checking for main in -lbsd" >&5 -ac_lib_var=`echo bsd'_'main | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-lbsd $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - LIBS="$LIBS -lbsd" -else - echo "$ac_t""no" 1>&6 -fi - -fi - -LIBS="$LIBS -lm" - -for ac_func in strdup -do -echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:1988: checking for $ac_func" >&5 -if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -$ac_func(); -#endif - -; return 0; } -EOF -if { (eval echo configure:2016: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func_$ac_func=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_$ac_func=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` - cat >> confdefs.h <&6 -LIBOBJS="$LIBOBJS ${ac_func}.${ac_objext}" -fi -done - - - -echo $ac_n "checking for rand""... $ac_c" 1>&6 -echo "configure:2044: checking for rand" >&5 -if eval "test \"`echo '$''{'ac_cv_func_rand'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char rand(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_rand) || defined (__stub___rand) -choke me -#else -rand(); -#endif - -; return 0; } -EOF -if { (eval echo configure:2072: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func_rand=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_rand=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'rand`\" = yes"; then - echo "$ac_t""yes" 1>&6 - cat >> confdefs.h <<\EOF -#define HAVE_RAND 1 -EOF - -else - echo "$ac_t""no" 1>&6 -echo $ac_n "checking for random""... $ac_c" 1>&6 -echo "configure:2093: checking for random" >&5 -if eval "test \"`echo '$''{'ac_cv_func_random'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char random(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_random) || defined (__stub___random) -choke me -#else -random(); -#endif - -; return 0; } -EOF -if { (eval echo configure:2121: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func_random=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_random=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'random`\" = yes"; then - echo "$ac_t""yes" 1>&6 - cat >> confdefs.h <<\EOF -#define HAVE_RANDOM 1 -EOF - -else - echo "$ac_t""no" 1>&6 -{ echo "configure: error: Hmm. Your system does not support either random() or rand()." 1>&2; exit 1; } - exit 1 -fi - -fi - - -echo $ac_n "checking for isnan""... $ac_c" 1>&6 -echo "configure:2149: checking for isnan" >&5 -if eval "test \"`echo '$''{'ac_cv_func_isnan'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char isnan(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_isnan) || defined (__stub___isnan) -choke me -#else -isnan(); -#endif - -; return 0; } -EOF -if { (eval echo configure:2177: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func_isnan=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_isnan=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'isnan`\" = yes"; then - echo "$ac_t""yes" 1>&6 - cat >> confdefs.h <<\EOF -#define HAVE_ISNAN 1 -EOF - -else - echo "$ac_t""no" 1>&6 -echo $ac_n "checking for _isnan""... $ac_c" 1>&6 -echo "configure:2198: checking for _isnan" >&5 -if eval "test \"`echo '$''{'ac_cv_func__isnan'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char _isnan(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub__isnan) || defined (__stub____isnan) -choke me -#else -_isnan(); -#endif - -; return 0; } -EOF -if { (eval echo configure:2226: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func__isnan=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func__isnan=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'_isnan`\" = yes"; then - echo "$ac_t""yes" 1>&6 - cat >> confdefs.h <<\EOF -#define HAVE_ISNAN 1 -EOF - cat >> confdefs.h <<\EOF -#define isnan _isnan -EOF - -else - echo "$ac_t""no" 1>&6 -fi - -fi - - -echo $ac_n "checking for sigvec""... $ac_c" 1>&6 -echo "configure:2255: checking for sigvec" >&5 -if eval "test \"`echo '$''{'ac_cv_func_sigvec'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char sigvec(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_sigvec) || defined (__stub___sigvec) -choke me -#else -sigvec(); -#endif - -; return 0; } -EOF -if { (eval echo configure:2283: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func_sigvec=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_sigvec=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'sigvec`\" = yes"; then - echo "$ac_t""yes" 1>&6 - cat >> confdefs.h <<\EOF -#define HAVE_SIGVEC 1 -EOF - -else - echo "$ac_t""no" 1>&6 -echo $ac_n "checking for sigvector""... $ac_c" 1>&6 -echo "configure:2304: checking for sigvector" >&5 -if eval "test \"`echo '$''{'ac_cv_func_sigvector'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char sigvector(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_sigvector) || defined (__stub___sigvector) -choke me -#else -sigvector(); -#endif - -; return 0; } -EOF -if { (eval echo configure:2332: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func_sigvector=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_sigvector=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'sigvector`\" = yes"; then - echo "$ac_t""yes" 1>&6 - cat >> confdefs.h <<\EOF -#define HAVE_SIGVECTOR 1 -EOF - -else - echo "$ac_t""no" 1>&6 -fi - -fi - - -# Solaris has the copysign function in libc but provides no -# prototype when compiling with gcc in __GCC__ mode. - -if test "$SOLARIS" = "0" ; then - echo $ac_n "checking for copysign""... $ac_c" 1>&6 -echo "configure:2362: checking for copysign" >&5 -if eval "test \"`echo '$''{'ac_cv_func_copysign'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char copysign(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_copysign) || defined (__stub___copysign) -choke me -#else -copysign(); -#endif - -; return 0; } -EOF -if { (eval echo configure:2390: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func_copysign=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_copysign=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'copysign`\" = yes"; then - echo "$ac_t""yes" 1>&6 - cat >> confdefs.h <<\EOF -#define HAVE_COPYSIGN 1 -EOF - -else - echo "$ac_t""no" 1>&6 -fi - -fi - -subdirs="dis dxf2obj gedit" - - -trap '' 1 2 15 -cat > confcache <<\EOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs. It is not useful on other systems. -# If it contains results you don't want to keep, you may remove or edit it. -# -# By default, configure uses ./config.cache as the cache file, -# creating it if it does not exist already. You can give configure -# the --cache-file=FILE option to use a different cache file; that is -# what configure does when it calls configure scripts in -# subdirectories, so they share the cache. -# Giving --cache-file=/dev/null disables caching, for debugging configure. -# config.status only pays attention to the cache file if you give it the -# --recheck option to rerun configure. -# -EOF -# The following way of writing the cache mishandles newlines in values, -# but we know of no workaround that is simple, portable, and efficient. -# So, don't put newlines in cache variables' values. -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -(set) 2>&1 | - case `(ac_space=' '; set | grep ac_space) 2>&1` in - *ac_space=\ *) - # `set' does not quote correctly, so add quotes (double-quote substitution - # turns \\\\ into \\, and sed turns \\ into \). - sed -n \ - -e "s/'/'\\\\''/g" \ - -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" - ;; - *) - # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' - ;; - esac >> confcache -if cmp -s $cache_file confcache; then - : -else - if test -w $cache_file; then - echo "updating cache $cache_file" - cat confcache > $cache_file - else - echo "not updating unwritable cache $cache_file" - fi -fi -rm -f confcache - -trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 - -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - -# Any assignment to VPATH causes Sun make to only execute -# the first set of double-colon rules, so remove it if not needed. -# If there is a colon in the path, we need to keep it. -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' -fi - -trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 - -# Transform confdefs.h into DEFS. -# Protect against shell expansion while executing Makefile rules. -# Protect against Makefile macro expansion. -cat > conftest.defs <<\EOF -s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g -s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g -s%\[%\\&%g -s%\]%\\&%g -s%\$%$$%g -EOF -DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '` -rm -f conftest.defs - - -# Without the "./", some shells look in PATH for config.status. -: ${CONFIG_STATUS=./config.status} - -echo creating $CONFIG_STATUS -rm -f $CONFIG_STATUS -cat > $CONFIG_STATUS </dev/null | sed 1q`: -# -# $0 $ac_configure_args -# -# Compiler output produced by configure, useful for debugging -# configure, is in ./config.log if it exists. - -ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" -for ac_option -do - case "\$ac_option" in - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" - exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; - -version | --version | --versio | --versi | --vers | --ver | --ve | --v) - echo "$CONFIG_STATUS generated by autoconf version 2.13" - exit 0 ;; - -help | --help | --hel | --he | --h) - echo "\$ac_cs_usage"; exit 0 ;; - *) echo "\$ac_cs_usage"; exit 1 ;; - esac -done - -ac_given_srcdir=$srcdir -ac_given_INSTALL="$INSTALL" - -trap 'rm -fr `echo "Makefile src/Makefile V/Makefile V/lib/Makefile V/test/Makefile objects/Makefile" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 -EOF -cat >> $CONFIG_STATUS < conftest.subs <<\\CEOF -$ac_vpsub -$extrasub -s%@SHELL@%$SHELL%g -s%@CFLAGS@%$CFLAGS%g -s%@CPPFLAGS@%$CPPFLAGS%g -s%@CXXFLAGS@%$CXXFLAGS%g -s%@FFLAGS@%$FFLAGS%g -s%@DEFS@%$DEFS%g -s%@LDFLAGS@%$LDFLAGS%g -s%@LIBS@%$LIBS%g -s%@exec_prefix@%$exec_prefix%g -s%@prefix@%$prefix%g -s%@program_transform_name@%$program_transform_name%g -s%@bindir@%$bindir%g -s%@sbindir@%$sbindir%g -s%@libexecdir@%$libexecdir%g -s%@datadir@%$datadir%g -s%@sysconfdir@%$sysconfdir%g -s%@sharedstatedir@%$sharedstatedir%g -s%@localstatedir@%$localstatedir%g -s%@libdir@%$libdir%g -s%@includedir@%$includedir%g -s%@oldincludedir@%$oldincludedir%g -s%@infodir@%$infodir%g -s%@mandir@%$mandir%g -s%@OBVDIR@%$OBVDIR%g -s%@CC@%$CC%g -s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g -s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g -s%@INSTALL_DATA@%$INSTALL_DATA%g -s%@RANLIB@%$RANLIB%g -s%@CPP@%$CPP%g -s%@VLIB_EXTRA_C_FILES@%$VLIB_EXTRA_C_FILES%g -s%@VLIB_EXTRA_O_FILES@%$VLIB_EXTRA_O_FILES%g -s%@SRC_EXTRA_C_FILES@%$SRC_EXTRA_C_FILES%g -s%@SRC_EXTRA_O_FILES@%$SRC_EXTRA_O_FILES%g -s%@LIBOBJS@%$LIBOBJS%g -s%@subdirs@%$subdirs%g - -CEOF -EOF - -cat >> $CONFIG_STATUS <<\EOF - -# Split the substitutions into bite-sized pieces for seds with -# small command number limits, like on Digital OSF/1 and HP-UX. -ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. -ac_file=1 # Number of current file. -ac_beg=1 # First line for current file. -ac_end=$ac_max_sed_cmds # Line after last line for current file. -ac_more_lines=: -ac_sed_cmds="" -while $ac_more_lines; do - if test $ac_beg -gt 1; then - sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file - else - sed "${ac_end}q" conftest.subs > conftest.s$ac_file - fi - if test ! -s conftest.s$ac_file; then - ac_more_lines=false - rm -f conftest.s$ac_file - else - if test -z "$ac_sed_cmds"; then - ac_sed_cmds="sed -f conftest.s$ac_file" - else - ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" - fi - ac_file=`expr $ac_file + 1` - ac_beg=$ac_end - ac_end=`expr $ac_end + $ac_max_sed_cmds` - fi -done -if test -z "$ac_sed_cmds"; then - ac_sed_cmds=cat -fi -EOF - -cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF -for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then - # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". - case "$ac_file" in - *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` - ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; - *) ac_file_in="${ac_file}.in" ;; - esac - - # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. - - # Remove last slash and all that follows it. Not all systems have dirname. - ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` - if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then - # The file is in a subdirectory. - test ! -d "$ac_dir" && mkdir "$ac_dir" - ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" - # A "../" for each directory in $ac_dir_suffix. - ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` - else - ac_dir_suffix= ac_dots= - fi - - case "$ac_given_srcdir" in - .) srcdir=. - if test -z "$ac_dots"; then top_srcdir=. - else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; - /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; - *) # Relative path. - srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" - top_srcdir="$ac_dots$ac_given_srcdir" ;; - esac - - case "$ac_given_INSTALL" in - [/$]*) INSTALL="$ac_given_INSTALL" ;; - *) INSTALL="$ac_dots$ac_given_INSTALL" ;; - esac - - echo creating "$ac_file" - rm -f "$ac_file" - configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." - case "$ac_file" in - *Makefile*) ac_comsub="1i\\ -# $configure_input" ;; - *) ac_comsub= ;; - esac - - ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` - sed -e "$ac_comsub -s%@configure_input@%$configure_input%g -s%@srcdir@%$srcdir%g -s%@top_srcdir@%$top_srcdir%g -s%@INSTALL@%$INSTALL%g -" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file -fi; done -rm -f conftest.s* - -EOF -cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF - -exit 0 -EOF -chmod +x $CONFIG_STATUS -rm -fr confdefs* $ac_clean_files -test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 - -if test "$no_recursion" != yes; then - - # Remove --cache-file and --srcdir arguments so they do not pile up. - ac_sub_configure_args= - ac_prev= - for ac_arg in $ac_configure_args; do - if test -n "$ac_prev"; then - ac_prev= - continue - fi - case "$ac_arg" in - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - ;; - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - ;; - *) ac_sub_configure_args="$ac_sub_configure_args $ac_arg" ;; - esac - done - - for ac_config_dir in dis dxf2obj gedit; do - - # Do not complain, so a configure script can configure whichever - # parts of a large source tree are present. - if test ! -d $srcdir/$ac_config_dir; then - continue - fi - - echo configuring in $ac_config_dir - - case "$srcdir" in - .) ;; - *) - if test -d ./$ac_config_dir || mkdir ./$ac_config_dir; then :; - else - { echo "configure: error: can not create `pwd`/$ac_config_dir" 1>&2; exit 1; } - fi - ;; - esac - - ac_popdir=`pwd` - cd $ac_config_dir - - # A "../" for each directory in /$ac_config_dir. - ac_dots=`echo $ac_config_dir|sed -e 's%^\./%%' -e 's%[^/]$%&/%' -e 's%[^/]*/%../%g'` - - case "$srcdir" in - .) # No --srcdir option. We are building in place. - ac_sub_srcdir=$srcdir ;; - /*) # Absolute path. - ac_sub_srcdir=$srcdir/$ac_config_dir ;; - *) # Relative path. - ac_sub_srcdir=$ac_dots$srcdir/$ac_config_dir ;; - esac - - # Check for guested configure; otherwise get Cygnus style configure. - if test -f $ac_sub_srcdir/configure; then - ac_sub_configure=$ac_sub_srcdir/configure - elif test -f $ac_sub_srcdir/configure.in; then - ac_sub_configure=$ac_configure - else - echo "configure: warning: no configuration information is in $ac_config_dir" 1>&2 - ac_sub_configure= - fi - - # The recursion is here. - if test -n "$ac_sub_configure"; then - - # Make the cache file name correct relative to the subdirectory. - case "$cache_file" in - /*) ac_sub_cache_file=$cache_file ;; - *) # Relative path. - ac_sub_cache_file="$ac_dots$cache_file" ;; - esac - case "$ac_given_INSTALL" in - [/$]*) INSTALL="$ac_given_INSTALL" ;; - *) INSTALL="$ac_dots$ac_given_INSTALL" ;; - esac - - echo "running ${CONFIG_SHELL-/bin/sh} $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_sub_srcdir" - # The eval makes quoting arguments work. - if eval ${CONFIG_SHELL-/bin/sh} $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_sub_srcdir - then : - else - { echo "configure: error: $ac_sub_configure failed for $ac_config_dir" 1>&2; exit 1; } - fi - fi - - cd $ac_popdir - done -fi - diff -Nru acm-5.0/configure.in acm-6.0+20200416/configure.in --- acm-5.0/configure.in 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/configure.in 1970-01-01 00:00:00.000000000 +0000 @@ -1,183 +0,0 @@ -AC_INIT(README) - -if test -d /usr/share/games ; then - OBVDIR="/usr/share/games/acm" -else - OBVDIR=\$\(prefix\)/games/acm -fi -AC_SUBST(OBVDIR) - -rand=0 -random=0 - -if test "$OPENWINHOME" = "" ; then - ow=/usr/openwin -else - ow=$OPENWINHOME -fi - -# Solaris special handling ... -SOLARIS=0 -if uname -sr | grep '^SunOS 5' >/dev/null ; then - LIBS="$LIBS -R/usr/ucblib -L/usr/ucblib -lucb" - SOLARIS=1 -fi - -# Linux ? -LINUX=0 -if uname -s | grep -i linux > /dev/null ; then - LINUX=1 -fi - -if uname -s | grep -i "GNU/kFreeBSD" > /dev/null ; then - LINUX=1 -fi - -AC_PROG_CC - -AC_CHECK_LIB(nsl, xdr_free, [LIBS="$LIBS"]) - -if test "$LINUX" = "0" ; then - AC_CHECK_LIB(elf, elf_end, [LIBS="$LIBS -lelf"]) -fi - -AC_DEFUN(AC_M_PI_LONG_DOUBLE, -[AC_CACHE_CHECK(for M_PI casted to long double, ac_cv_m_pi_long_double, -[AC_TRY_RUN([#include -#ifndef M_PI -#define M_PI 3.1415926 -#endif - int main() { - exit(sizeof(double) < sizeof(M_PI)); }], - ac_cv_m_pi_long_double=no, ac_cv_m_pi_long_double=yes, - ac_cv_m_pi_long_double=no) - ]) - if test $ac_cv_m_pi_long_double = yes; then - AC_DEFINE(M_PI_LONG_DOUBLE) - fi -]) - -AC_DEFUN(AC_HAVE_STRUCT_SIGACTION, -[AC_CACHE_CHECK(for sigaction structure, ac_cv_struct_sigaction, -[AC_TRY_COMPILE([#include -#include ],[ struct sigaction s; ], - ac_cv_struct_sigaction=yes, ac_cv_struct_sigaction=no) - ]) - if test $ac_cv_struct_sigaction = yes; then - AC_DEFINE(HAVE_STRUCT_SIGACTION) - fi -]) - -AC_PROG_INSTALL -AC_PROG_RANLIB -AC_HEADER_STDC -AC_CHECK_HEADERS(stdlib.h malloc.h unistd.h) -if test "$LINUX" = "0" ; then - AC_CHECK_HEADER(elf.h, LIBS="$LIBS -lelf") -fi -AC_TYPE_SIGNAL -AC_HAVE_STRUCT_SIGACTION -AC_M_PI_LONG_DOUBLE - -AC_PATH_X - -test "$x_includes" != "NONE" -a "$x_includes" != "" && CFLAGS="$CFLAGS -I${x_includes}" -test "$x_libraries" != "NONE" -a "$x_libraries" != "" && LIBS="$LIBS -L${x_libraries}" - -LIBS="$LIBS -lX11" - -AC_SUBST(VLIB_EXTRA_C_FILES) -AC_SUBST(VLIB_EXTRA_O_FILES) -AC_CHECK_LIB(Xext, XdbeSwapBuffers, - [ echo "Found X11 double buffering extension"; - LIBS="$LIBS -lXext"; - VLIB_EXTRA_C_FILES="Vdbe.c"; - VLIB_EXTRA_O_FILES="Vdbe.o"; - AC_DEFINE(HAVE_X11_DBE) ]) - -AC_SUBST(SRC_EXTRA_C_FILES) -AC_SUBST(SRC_EXTRA_O_FILES) -AC_CHECK_LIB(X11, XInitImage, - [echo "Found X11R6 XInitImage"], - [ SRC_EXTRA_C_FILES="ImUtil.c"; - SRC_EXTRA_O_FILES="ImUtil.o" ]) - -AC_MSG_CHECKING(should the IEEE 1278 DIS protocol be used...) -AC_ARG_ENABLE(dis, -[ --enable-dis broadcast IEEE 1278 DIS packets], -[if test "$enableval" = yes; then - AC_MSG_RESULT(yes) - AC_DEFINE(HAVE_DIS) -else - AC_MSG_RESULT(no) -fi], AC_DEFINE(HAVE_DIS) AC_MSG_RESULT(yes)) - -AC_MSG_CHECKING(if DIS debugging should be compiled-in) -AC_ARG_ENABLE(dis-debug, -[ --enable-dis-debug compile-in DIS debugging messages], -[if test "$enableval" = yes; then - AC_MSG_RESULT(yes) - AC_DEFINE(DIS_DEBUG) -else - AC_MSG_RESULT(no) -fi], AC_MSG_RESULT(no)) - -AC_MSG_CHECKING(should DIS experimental request/grant control be used...) -AC_ARG_ENABLE(request-control, -[ --enable-request-control use experimental DIS request control protocol], -[if test "$enableval" = yes; then - AC_MSG_RESULT(yes) - AC_DEFINE(USE_REQUEST_CONTROL) -else - AC_MSG_RESULT(no) -fi], AC_DEFINE(USE_REQUEST_CONTROL) AC_MSG_RESULT(yes)) - - -AC_CHECKING(checking for an ACM-compatible audio library ...) -unset ac_cv_lib_audio -AC_CHECK_LIB(audio, AuCloseServer, [echo "Found NCD Netaudio libraries"; - LIBS="$LIBS -laudio -lm"; AC_DEFINE(NETAUDIO)],,-lm) -if test "$ac_cv_lib_audio" = "no"; then -unset ac_cv_lib_audio -AC_CHECK_LIB(audio, ACloseAudio, [echo "Found HP audio libraries"; - LIBS="$LIBS -laudio"; AC_DEFINE(HPAUDIO)]) - if test "$ac_cv_lib_audio" = "no"; then - AC_MSG_WARN(No ACM-compatible audio library was found -- ACM will compile anyway) - fi -fi -unset ac_cv_lib_audio - -AC_CHECK_LIB(socket, bind, [LIBS="$LIBS -lsocket"]) -AC_CHECK_LIB(dnet_stub, main, [LIBS="$LIBS -ldnet_stub"]) - -if uname -srv | grep '^AIX 2 3' >/dev/null ; then - : -else - AC_CHECK_LIB(bsd, main, [LIBS="$LIBS -lbsd"]) -fi - -LIBS="$LIBS -lm" - -AC_REPLACE_FUNCS(strdup) - -AC_CHECK_FUNC(rand, AC_DEFINE(HAVE_RAND), - AC_CHECK_FUNC(random, AC_DEFINE(HAVE_RANDOM), - [AC_MSG_ERROR(Hmm. Your system does not support either random() or rand().) - exit 1])) - -AC_CHECK_FUNC(isnan, AC_DEFINE(HAVE_ISNAN), - AC_CHECK_FUNC(_isnan, [AC_DEFINE(HAVE_ISNAN) AC_DEFINE(isnan,_isnan)])) - -AC_CHECK_FUNC(sigvec, AC_DEFINE(HAVE_SIGVEC), - AC_CHECK_FUNC(sigvector, AC_DEFINE(HAVE_SIGVECTOR))) - -# Solaris has the copysign function in libc but provides no -# prototype when compiling with gcc in __GCC__ mode. - -if test "$SOLARIS" = "0" ; then - AC_CHECK_FUNC(copysign, AC_DEFINE(HAVE_COPYSIGN)) -fi - -AC_CONFIG_SUBDIRS(dis dxf2obj gedit) - -AC_OUTPUT(Makefile src/Makefile V/Makefile V/lib/Makefile V/test/Makefile objects/Makefile) diff -Nru acm-5.0/COPYING acm-6.0+20200416/COPYING --- acm-5.0/COPYING 1992-05-06 20:47:27.000000000 +0000 +++ acm-6.0+20200416/COPYING 1970-01-01 00:00:00.000000000 +0000 @@ -1,282 +0,0 @@ - - - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 675 Mass Ave, Cambridge, MA 02139, USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS diff -Nru acm-5.0/COPYING.txt acm-6.0+20200416/COPYING.txt --- acm-5.0/COPYING.txt 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/COPYING.txt 2006-01-05 13:58:54.000000000 +0000 @@ -0,0 +1,282 @@ + + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 675 Mass Ave, Cambridge, MA 02139, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS diff -Nru acm-5.0/debian/acm.desktop acm-6.0+20200416/debian/acm.desktop --- acm-5.0/debian/acm.desktop 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/debian/acm.desktop 2020-11-17 21:48:07.000000000 +0000 @@ -3,11 +3,10 @@ Type=Application Name=ACM GenericName=Multiplayer classic aerial combat simulation -Comment=turn-based space empire and galactic conquest computer game (client) -Exec=acm -TryExec=acm +Exec=acm.tcl +TryExec=acm.tcl Icon=acm StartupNotify=false Terminal=false Categories=Game;Simulation; -Keywords=aerial;comabt;simulation; +Keywords=aerial;combat;simulation; diff -Nru acm-5.0/debian/acm.dirs acm-6.0+20200416/debian/acm.dirs --- acm-5.0/debian/acm.dirs 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/debian/acm.dirs 2020-11-17 21:48:07.000000000 +0000 @@ -1,6 +1,13 @@ usr/games usr/share/applications -usr/share/games/acm +usr/share/games/acm/objects/features +usr/share/games/acm/objects/zones +usr/share/games/acm/objects/zones/usa +usr/share/games/acm/objects/zones/middleeast +usr/share/games/acm/objects/zones/europe +usr/share/games/acm/objects/missiles +usr/share/games/acm/objects/sounds +usr/share/games/acm/objects/aircraft usr/share/icons/hicolor/128x128/apps usr/share/icons/hicolor/256x256/apps usr/share/icons/hicolor/64x64/apps diff -Nru acm-5.0/debian/acmdoc.ps acm-6.0+20200416/debian/acmdoc.ps --- acm-5.0/debian/acmdoc.ps 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/debian/acmdoc.ps 1970-01-01 00:00:00.000000000 +0000 @@ -1,11823 +0,0 @@ -%!PS-Adobe-3.0 -%%BoundingBox: (atend) -%%Creator: OpenOffice.org 2.0 -%%For: pjb -%%CreationDate: Sat Jun 10 14:40:58 2006 -%%Title: acmdoc2.rtf -%%LanguageLevel: 2 -%%DocumentData: Clean7Bit -%%Pages: (atend) -%%PageOrder: Ascend -%%EndComments -%%BeginProlog -%%BeginResource: procset PSPrint-Prolog 1.0 0 -/ISO1252Encoding [ -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle -/parenleft /parenright /asterisk /plus /comma /hyphen /period /slash -/zero /one /two /three /four /five /six /seven -/eight /nine /colon /semicolon /less /equal /greater /question -/at /A /B /C /D /E /F /G -/H /I /J /K /L /M /N /O -/P /Q /R /S /T /U /V /W -/X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore -/grave /a /b /c /d /e /f /g -/h /i /j /k /l /m /n /o -/p /q /r /s /t /u /v /w -/x /y /z /braceleft /bar /braceright /asciitilde /unused -/Euro /unused /quotesinglbase /florin /quotedblbase /ellipsis /dagger /daggerdbl -/circumflex /perthousand /Scaron /guilsinglleft /OE /unused /Zcaron /unused -/unused /quoteleft /quoteright /quotedblleft /quotedblright /bullet /endash /emdash -/tilde /trademark /scaron /guilsinglright /oe /unused /zcaron /Ydieresis -/space /exclamdown /cent /sterling /currency /yen /brokenbar /section -/dieresis /copyright /ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron -/degree /plusminus /twosuperior /threesuperior /acute /mu /paragraph /periodcentered -/cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf /threequarters /questiondown -/Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla -/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis -/Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply -/Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls -/agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla -/egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis -/eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide -/oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] def - -/psp_definefont { exch dup findfont dup length dict begin { 1 index /FID ne -{ def } { pop pop } ifelse } forall /Encoding 3 -1 roll def -currentdict end exch pop definefont pop } def - -/pathdict dup 8 dict def load begin -/rcmd { { currentfile 1 string readstring pop 0 get dup 32 gt { exit } -{ pop } ifelse } loop dup 126 eq { pop exit } if 65 sub dup 16#3 and 1 -add exch dup 16#C and -2 bitshift 16#3 and 1 add exch 16#10 and 16#10 -eq 3 1 roll exch } def -/rhex { dup 1 sub exch currentfile exch string readhexstring pop dup 0 -get dup 16#80 and 16#80 eq dup 3 1 roll { 16#7f and } if 2 index 0 3 --1 roll put 3 1 roll 0 0 1 5 -1 roll { 2 index exch get add 256 mul } -for 256 div exch pop exch { neg } if } def -/xcmd { rcmd exch rhex exch rhex exch 5 -1 roll add exch 4 -1 roll add -1 index 1 index 5 -1 roll { moveto } { lineto } ifelse } def end -/readpath { 0 0 pathdict begin { xcmd } loop end pop pop } def - -systemdict /languagelevel known not { -/xshow { exch dup length 0 1 3 -1 roll 1 sub { dup 3 index exch get -exch 2 index exch get 1 string dup 0 4 -1 roll put currentpoint 3 -1 -roll show moveto 0 rmoveto } for pop pop } def -/rectangle { 4 -2 roll moveto 1 index 0 rlineto 0 exch rlineto neg 0 -rlineto closepath } def -/rectfill { rectangle fill } def -/rectstroke { rectangle stroke } def } if -/bshow { currentlinewidth 3 1 roll currentpoint 3 index show moveto -setlinewidth false charpath stroke setlinewidth } def -/bxshow { currentlinewidth 4 1 roll setlinewidth exch dup length 1 sub -0 1 3 -1 roll { 1 string 2 index 2 index get 1 index exch 0 exch put dup -currentpoint 3 -1 roll show moveto currentpoint 3 -1 roll false charpath -stroke moveto 2 index exch get 0 rmoveto } for pop pop setlinewidth } def - -/psp_lzwfilter { currentfile /ASCII85Decode filter /LZWDecode filter } def -/psp_ascii85filter { currentfile /ASCII85Decode filter } def -/psp_lzwstring { psp_lzwfilter 1024 string readstring } def -/psp_ascii85string { psp_ascii85filter 1024 string readstring } def -/psp_imagedict { -/psp_bitspercomponent { 3 eq { 1 }{ 8 } ifelse } def -/psp_decodearray { [ [0 1 0 1 0 1] [0 255] [0 1] [0 255] ] exch get } -def 7 dict dup -/ImageType 1 put dup -/Width 7 -1 roll put dup -/Height 5 index put dup -/BitsPerComponent 4 index psp_bitspercomponent put dup -/Decode 5 -1 roll psp_decodearray put dup -/ImageMatrix [1 0 0 1 0 0] dup 5 8 -1 roll put put dup -/DataSource 4 -1 roll 1 eq { psp_lzwfilter } { psp_ascii85filter } ifelse put -} def -%%EndResource -%%EndProlog -%%BeginSetup -% -(Helvetica-BoldOblique-iso1252) cvn (Helvetica-BoldOblique) cvn ISO1252Encoding psp_definefont -(Helvetica-iso1252) cvn (Helvetica) cvn ISO1252Encoding psp_definefont -(Helvetica-Bold-iso1252) cvn (Helvetica-Bold) cvn ISO1252Encoding psp_definefont -(Courier-iso1252) cvn (Courier) cvn ISO1252Encoding psp_definefont -(Courier-Oblique-iso1252) cvn (Courier-Oblique) cvn ISO1252Encoding psp_definefont -%%BeginResource: font OpenSymbolHGSet2 -%!PS-TrueTypeFont-1.0-1.45875 -%%Creator: SunTypeTools-TT 1.0 gelf -%- Font subset generated from a source font file: '/usr/share/fonts/truetype/openoffice/opens___.ttf' -%- Original font name: OpenSymbol -%- Original font family: OpenSymbol -%- Original font sub-family: Regular -11 dict begin -/FontName (OpenSymbolHGSet2) cvn def -/PaintType 0 def -/FontMatrix [1 0 0 1 0 0] def -/FontBBox [-179 -312 1083 916] def -/FontType 42 def -/Encoding 256 array def - 0 1 255 {Encoding exch /.notdef put} for -Encoding 1 /glyph1 put -/XUID [103 0 1 16#B9D52D61 2 16#82B9DB12 16#36DE2269] def -/sfnts [< -747275650006004000020020676C796687BC8C000000006C0000004868656164 -E5EB9723000000B4000000366868656182FD5707000000EC00000024686D7478 -2D00000C00000110000000086C6F63611400240000000118000000066D617870 -0B00460000000120000000200002008100000381066600030007000033112111 -25211121810300FD7F0200FE000666F99A810566000100ACFFA00738062C0003 -0000130902AC03460346FCBA02E40348FCB8FCBC000100000001B333DD1B325E -5F0F3CF50003080000000000BD48EFAD00000000000000000000FFA007380666 -000000080002000000000000000100000756FD7F000000000000000000000001 -0000000000000000000000000000000204000081080000AC0000001400240000 -0001000000020008000200000000000200000001000100000040000000000000 -00 -> -] def -/CharStrings 2 dict dup begin -/.notdef 0 def -/glyph1 1 def -end readonly def -FontName currentdict end definefont pop -%%EndResource -(Courier-Bold-iso1252) cvn (Courier-Bold) cvn ISO1252Encoding psp_definefont -(Helvetica-Oblique-iso1252) cvn (Helvetica-Oblique) cvn ISO1252Encoding psp_definefont -%%DocumentSuppliedResources: font OpenSymbolHGSet2 -%%DocumentNeededResources: font Helvetica-BoldOblique -%%+ font Helvetica -%%+ font Helvetica-Bold -%%+ font Courier -%%+ font Courier-Oblique -%%+ font Symbol -%%+ font Courier-Bold -%%+ font Helvetica-Oblique -/#copies 1 def -<< /NumCopies null /Policies << /NumCopies 1 >> >> setpagedevice -%%EndSetup -%%Page: 1 1 -%%PageBoundingBox: 0 0 595 842 -%%BeginPageSetup -% -[{ -%%BeginFeature: *InputSlot Standard -<>setpagedevice -%%EndFeature -} stopped cleartomark -[{ -%%BeginFeature: *PageSize A4 -<>setpagedevice -%%EndFeature -} stopped cleartomark -%%EndPageSetup -gsave -[0.24 0 0 -0.24 0 842] concat -gsave -376 859 moveto -0 0 0 setrgbcolor -(Helvetica-BoldOblique-iso1252) cvn findfont 270 -270 matrix scale makefont setfont -<41434D> -[168 177 0] -xshow -376 2593 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 75 -75 matrix scale makefont setfont -<61697220636F6D6261742073696D756C6174696F6E20666F7220554E495820616E642057696E64 -6F7773> -[39 18 27 19 38 41 62 41 39 22 19 39 17 61 43 18 39 23 17 42 43 19 20 43 26 19 50 - 51 16 47 19 37 42 42 19 66 17 41 42 40 54 0] -xshow -1830 2593 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 270 -270 matrix scale makefont setfont -<20> -show -376 2749 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 60 -60 matrix scale makefont setfont -<76657273696F6E20352E30> -[30 31 19 32 14 34 33 16 31 14 0] -xshow -376 3063 moveto -(Helvetica-iso1252) cvn findfont 45 -45 matrix scale makefont setfont -<5765622053696D756C6174696F6E7320496E636F72706F7261746564> -[39 22 23 11 28 8 35 23 8 24 11 8 23 23 21 11 11 23 21 23 14 22 24 12 24 10 23 0] -xshow -376 3109 moveto -(Helvetica-iso1252) cvn findfont 30 -30 matrix scale makefont setfont -<7777772E77656273696D756C6174696F6E732E636F6D> -[20 20 19 7 19 16 15 14 5 23 16 5 16 7 6 16 15 14 7 14 15 0] -xshow -grestore grestore -showpage -%%PageTrailer - -%%Page: 2 2 -%%PageBoundingBox: 0 0 595 842 -%%BeginPageSetup -% -%%EndPageSetup -gsave -[0.24 0 0 -0.24 0 842] concat -gsave -376 462 moveto -0 0 0 setrgbcolor -(Helvetica-BoldOblique-iso1252) cvn findfont 45 -45 matrix scale makefont setfont -<496E74726F64756374696F6E> -[11 26 13 15 26 25 25 23 14 10 26 0] -xshow -614 462 moveto -<5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F -5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F> -[24 25 25 25 25 25 25 25 24 25 25 25 25 25 25 25 24 25 25 25 25 25 25 25 24 25 25 - 25 25 25 25 25 25 24 25 25 25 25 25 25 25 24 25 25 25 25 25 25 25 24 25 25 25 25 - 25 25 25 24 0] -xshow -2083 462 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 37 -37 matrix scale makefont setfont -<34> -show -422 546 moveto -(Helvetica-Bold-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<41636B6E6F776C656467656D656E7473> -[28 20 20 24 22 30 10 20 24 23 20 34 21 24 11 0] -xshow -773 546 moveto -<5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F -5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F> -[22 23 22 23 23 22 23 23 22 23 22 23 23 22 23 23 22 23 23 22 23 22 23 23 22 23 23 - 22 23 23 22 23 22 23 23 22 23 23 22 23 23 22 23 22 23 23 22 23 23 22 23 23 22 23 - 22 23 23 0] -xshow -2087 546 moveto -(Helvetica-Bold-iso1252) cvn findfont 37 -37 matrix scale makefont setfont -<34> -show -376 635 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 45 -45 matrix scale makefont setfont -<416262726576696174696F6E73> -[30 25 25 15 22 23 11 24 13 11 25 25 0] -xshow -647 635 moveto -<5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F -5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F> -[24 25 25 24 25 25 25 24 25 25 25 24 25 25 25 24 25 25 25 24 25 25 24 25 25 25 24 - 25 25 25 24 25 25 25 24 25 25 24 25 25 25 24 25 25 25 24 25 25 25 24 25 25 25 24 - 25 25 24 0] -xshow -2083 635 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 37 -37 matrix scale makefont setfont -<35> -show -376 724 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 45 -45 matrix scale makefont setfont -<41434D20666F7220554E4958> -[28 30 34 12 12 26 15 12 30 30 10 0] -xshow -641 724 moveto -<5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F -5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F> -[24 25 25 25 25 24 25 25 25 25 25 24 25 25 25 25 25 24 25 25 25 25 24 25 25 25 25 - 25 24 25 25 25 25 25 24 25 25 25 25 24 25 25 25 25 25 24 25 25 25 25 25 24 25 25 - 25 25 24 0] -xshow -2083 724 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 37 -37 matrix scale makefont setfont -<35> -show -422 809 moveto -(Helvetica-Bold-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<436F6D6D616E64206C696E65206F7074696F6E73> -[28 22 33 35 20 23 23 10 11 10 23 21 11 22 24 12 10 23 23 0] -xshow -826 809 moveto -<5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F -5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F> -[22 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 - 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 - 23 0] -xshow -2087 809 moveto -(Helvetica-Bold-iso1252) cvn findfont 37 -37 matrix scale makefont setfont -<35> -show -422 893 moveto -(Helvetica-Bold-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<4F7468657220496E697469616C697A6174696F6E20506172616D6574657273> -[30 12 23 21 15 10 10 24 10 13 10 21 10 10 19 22 12 10 23 23 11 24 21 15 20 34 21 - 12 22 13 0] -xshow -963 893 moveto -<5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F -5F5F5F5F5F5F5F5F5F5F5F> -[22 22 23 22 23 22 23 22 23 22 22 23 22 23 22 23 22 23 22 23 22 22 23 22 23 22 23 - 22 23 22 23 22 22 23 22 23 22 23 22 23 22 23 22 22 23 22 23 22 23 0] -xshow -2087 893 moveto -(Helvetica-Bold-iso1252) cvn findfont 37 -37 matrix scale makefont setfont -<38> -show -376 981 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 45 -45 matrix scale makefont setfont -<4B6579626F61726420436F6D6D616E6473> -[29 22 23 25 25 23 14 26 11 30 24 37 37 23 25 25 0] -xshow -796 981 moveto -<5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F -5F5F5F5F5F5F5F5F5F5F5F5F> -[24 25 25 25 25 25 25 25 25 25 24 25 25 25 25 25 25 25 25 25 24 25 25 25 25 25 25 - 25 25 25 24 25 25 25 25 25 25 25 25 24 25 25 25 25 25 25 25 25 25 24 0] -xshow -2067 981 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 37 -37 matrix scale makefont setfont -<3131> -[18 0] -xshow -376 1070 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 45 -45 matrix scale makefont setfont -<54686520486561642D557020446973706C6179> -[25 25 23 12 30 22 23 25 14 29 25 11 31 10 23 26 10 22 0] -xshow -784 1070 moveto -<5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F -5F5F5F5F5F5F5F5F5F5F5F5F5F> -[24 25 24 25 25 24 25 25 24 25 24 25 25 24 25 25 24 25 24 25 25 24 25 25 24 25 24 - 25 25 24 25 25 24 25 24 25 25 24 25 25 24 25 24 25 25 24 25 25 24 25 24 0] -xshow -2066 1070 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 37 -37 matrix scale makefont setfont -<3133> -[18 0] -xshow -422 1155 moveto -(Helvetica-Bold-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<4C616464657273> -[23 21 23 23 21 14 0] -xshow -567 1155 moveto -<5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F -5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F> -[22 22 23 22 23 22 22 23 22 23 22 22 23 22 23 22 23 22 22 23 22 23 22 22 23 22 23 - 22 22 23 22 23 22 23 22 22 23 22 23 22 22 23 22 23 22 22 23 22 23 22 23 22 22 23 - 22 23 22 22 23 22 23 22 22 23 22 23 0] -xshow -2070 1155 moveto -(Helvetica-Bold-iso1252) cvn findfont 37 -37 matrix scale makefont setfont -<3133> -[18 0] -xshow -422 1239 moveto -(Helvetica-Bold-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<416E676C65206F662041747461636B> -[28 22 24 10 21 10 24 12 10 28 12 12 21 20 0] -xshow -696 1239 moveto -<5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F -5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F> -[22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 - 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 - 22 23 22 23 22 23 0] -xshow -2070 1239 moveto -(Helvetica-Bold-iso1252) cvn findfont 37 -37 matrix scale makefont setfont -<3133> -[18 0] -xshow -422 1323 moveto -(Helvetica-Bold-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<54686520472D4D65746572> -[23 23 21 11 29 12 32 21 12 21 0] -xshow -640 1323 moveto -<5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F -5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F> -[22 23 23 22 23 23 22 23 23 22 23 23 22 23 23 22 23 23 22 23 23 22 23 23 23 22 23 - 23 22 23 23 22 23 23 22 23 23 22 23 23 22 23 23 22 23 23 23 22 23 23 22 23 23 22 - 23 23 22 23 23 22 23 23 0] -xshow -2070 1323 moveto -(Helvetica-Bold-iso1252) cvn findfont 37 -37 matrix scale makefont setfont -<3134> -[17 0] -xshow -422 1406 moveto -(Helvetica-Bold-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<576561706F6E205374617465> -[35 21 20 23 24 22 11 26 11 22 12 0] -xshow -669 1406 moveto -<5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F -5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F> -[22 23 22 23 22 23 23 22 23 22 23 23 22 23 22 23 23 22 23 22 23 23 22 23 22 23 23 - 22 23 22 23 23 22 23 22 23 22 23 23 22 23 22 23 23 22 23 22 23 23 22 23 22 23 23 - 22 23 22 23 23 22 23 0] -xshow -2070 1406 moveto -(Helvetica-Bold-iso1252) cvn findfont 37 -37 matrix scale makefont setfont -<3134> -[17 0] -xshow -376 1495 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 45 -45 matrix scale makefont setfont -<5468652052616461722053797374656D> -[25 25 23 12 30 22 25 23 16 11 27 22 23 13 22 0] -xshow -731 1495 moveto -<5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F -5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F> -[24 25 25 24 25 25 24 25 25 24 25 25 25 24 25 25 24 25 25 24 25 25 25 24 25 25 24 - 25 25 24 25 25 25 24 25 25 24 25 25 24 25 25 25 24 25 25 24 25 25 24 25 25 24 0] -xshow -2066 1495 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 37 -37 matrix scale makefont setfont -<3135> -[18 0] -xshow -376 1584 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 45 -45 matrix scale makefont setfont -<456C656374726F6E696320436F756E7465726D65617375726573> -[29 10 23 23 14 14 26 25 11 23 12 29 25 25 26 12 23 15 37 23 23 23 25 15 23 0] -xshow -931 1584 moveto -<5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F -5F5F5F5F5F5F5F> -[24 25 24 25 25 24 25 24 25 25 24 25 25 24 25 24 25 25 24 25 25 24 25 24 25 25 24 - 25 25 24 25 24 25 25 24 25 25 24 25 24 25 25 24 25 24 0] -xshow -2066 1584 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 37 -37 matrix scale makefont setfont -<3138> -[18 0] -xshow -422 1669 moveto -(Helvetica-Bold-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<5261646172205761726E696E67205265636569766572> -[28 20 23 22 14 10 35 21 14 23 10 23 23 11 27 21 20 22 9 21 21 0] -xshow -854 1669 moveto -<5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F -5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F> -[22 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 - 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 0] -xshow -2070 1669 moveto -(Helvetica-Bold-iso1252) cvn findfont 37 -37 matrix scale makefont setfont -<3138> -[18 0] -xshow -376 1757 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 45 -45 matrix scale makefont setfont -<576561706F6E2053797374656D73> -[38 23 22 25 25 26 11 27 22 23 13 22 37 0] -xshow -711 1757 moveto -<5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F -5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F> -[24 25 24 25 24 25 25 24 25 24 25 25 24 25 24 25 25 24 25 24 25 25 24 25 24 25 24 - 25 25 24 25 24 25 25 24 25 24 25 25 24 25 24 25 25 24 25 24 25 25 24 25 24 25 24 0] -xshow -2066 1757 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 37 -37 matrix scale makefont setfont -<3139> -[18 0] -xshow -422 1842 moveto -(Helvetica-Bold-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<4169722D746F2D416972204D697373696C6573> -[28 10 13 13 12 23 13 28 10 14 10 33 9 21 21 11 10 20 0] -xshow -741 1842 moveto -<5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F -5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F> -[22 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 - 22 23 22 23 22 23 22 23 22 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 - 22 23 22 23 0] -xshow -2070 1842 moveto -(Helvetica-Bold-iso1252) cvn findfont 37 -37 matrix scale makefont setfont -<3139> -[18 0] -xshow -422 1926 moveto -(Helvetica-Bold-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<43616E6E6F6E> -[28 20 23 23 23 0] -xshow -561 1926 moveto -<5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F -5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F> -[22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 - 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 - 22 23 22 23 22 23 22 23 22 23 22 23 0] -xshow -2070 1926 moveto -(Helvetica-Bold-iso1252) cvn findfont 37 -37 matrix scale makefont setfont -<3139> -[18 0] -xshow -376 2014 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 45 -45 matrix scale makefont setfont -<54686520485349> -[25 25 23 12 29 28 0] -xshow -528 2014 moveto -<5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F -5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F> -[24 25 25 25 24 25 25 25 24 25 25 25 25 24 25 25 25 24 25 25 25 24 25 25 25 25 24 - 25 25 25 24 25 25 25 24 25 25 25 25 24 25 25 25 24 25 25 25 24 25 25 25 25 24 25 - 25 25 24 25 25 25 24 0] -xshow -2065 2014 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 37 -37 matrix scale makefont setfont -<3231> -[18 0] -xshow -376 2104 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 45 -45 matrix scale makefont setfont -<44726F6E6573> -[31 14 25 25 23 0] -xshow -516 2104 moveto -<5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F -5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F> -[24 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 24 25 25 25 25 25 25 - 25 25 25 25 25 25 25 25 25 25 25 25 25 24 25 25 25 25 25 25 25 25 25 25 25 25 25 - 25 25 25 25 25 25 24 0] -xshow -2064 2104 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 37 -37 matrix scale makefont setfont -<3232> -[19 0] -xshow -376 2193 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 45 -45 matrix scale makefont setfont -<537465616C7468204D6F6465> -[28 13 23 23 11 13 25 12 34 25 25 0] -xshow -630 2193 moveto -<5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F -5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F> -[24 25 25 24 25 25 24 25 25 25 24 25 25 24 25 25 24 25 25 25 24 25 25 24 25 25 24 - 25 25 25 24 25 25 24 25 25 24 25 25 25 24 25 25 24 25 25 24 25 25 25 24 25 25 24 - 25 25 24 0] -xshow -2064 2193 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 37 -37 matrix scale makefont setfont -<3233> -[19 0] -xshow -376 2282 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 45 -45 matrix scale makefont setfont -<446576656C6F7065722053747564696F205365747570202841434D20666F722057696E646F7773 -206F6E6C7929> -[30 22 22 23 11 25 25 23 16 12 27 13 25 26 10 26 11 28 23 12 26 25 11 13 28 30 35 - 11 12 26 16 11 40 10 25 25 24 32 23 11 25 26 10 23 0] -xshow -1316 2282 moveto -<5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F> -[24 25 25 25 25 25 25 25 25 24 25 25 25 25 25 25 25 25 25 24 25 25 25 25 25 25 25 - 25 24 0] -xshow -2064 2282 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 37 -37 matrix scale makefont setfont -<3238> -[19 0] -xshow -376 2372 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 45 -45 matrix scale makefont setfont -<4275696C64696E672041434D206F6E20554E49582053797374656D73> -[30 26 11 10 26 11 25 25 12 28 29 34 12 25 25 11 30 30 11 27 12 27 22 23 13 22 37 0] -xshow -991 2372 moveto -<5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F -5F5F5F5F> -[24 25 25 25 25 25 25 25 25 25 25 25 25 24 25 25 25 25 25 25 25 25 25 25 25 25 25 - 24 25 25 25 25 25 25 25 25 25 25 25 25 25 24 0] -xshow -2064 2372 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 37 -37 matrix scale makefont setfont -<3238> -[19 0] -xshow -376 2461 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 45 -45 matrix scale makefont setfont -<446566696E696E67204E6577205363656E6573> -[30 23 13 11 26 10 25 26 11 30 22 32 12 27 23 23 25 22 0] -xshow -789 2461 moveto -<5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F -5F5F5F5F5F5F5F5F5F5F5F5F> -[24 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 - 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 24 0] -xshow -2064 2461 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 37 -37 matrix scale makefont setfont -<3330> -[19 0] -xshow -422 2546 moveto -(Helvetica-Bold-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<5465616D204C6F636174696F6E73> -[21 20 21 34 10 23 23 21 21 13 9 23 24 0] -xshow -704 2546 moveto -<5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F -5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F> -[22 22 23 22 22 23 22 22 23 22 22 23 22 22 23 22 22 23 22 22 23 22 22 23 22 22 23 - 22 22 23 22 22 23 22 22 23 22 22 23 22 22 23 22 22 23 22 22 23 22 22 23 22 22 23 - 22 22 23 22 22 23 0] -xshow -2068 2546 moveto -(Helvetica-Bold-iso1252) cvn findfont 37 -37 matrix scale makefont setfont -<3330> -[18 0] -xshow -422 2629 moveto -(Helvetica-Bold-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<47726F756E6420436F6C6F72> -[30 14 22 24 23 23 10 27 24 9 24 0] -xshow -665 2629 moveto -<5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F -5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F> -[22 23 22 23 23 22 23 23 22 23 22 23 23 22 23 23 22 23 22 23 23 22 23 23 22 23 22 - 23 23 22 23 23 22 23 22 23 23 22 23 23 22 23 22 23 23 22 23 23 22 23 22 23 23 22 - 23 23 22 23 22 23 23 0] -xshow -2068 2629 moveto -(Helvetica-Bold-iso1252) cvn findfont 37 -37 matrix scale makefont setfont -<3330> -[18 0] -xshow -422 2713 moveto -(Helvetica-Bold-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<52756E776179207265636F7264> -[28 22 23 29 20 21 11 14 21 21 24 13 0] -xshow -691 2713 moveto -<5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F -5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F> -[22 23 22 23 22 23 22 23 22 23 23 22 23 22 23 22 23 22 23 23 22 23 22 23 22 23 22 - 23 23 22 23 22 23 22 23 22 23 23 22 23 22 23 22 23 22 23 23 22 23 22 23 22 23 22 - 23 22 23 23 22 23 0] -xshow -2068 2713 moveto -(Helvetica-Bold-iso1252) cvn findfont 37 -37 matrix scale makefont setfont -<3330> -[18 0] -xshow -422 2797 moveto -(Helvetica-Bold-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<544143414E205265636F7264> -[20 25 28 27 27 10 28 20 21 24 13 0] -xshow -687 2797 moveto -<5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F -5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F> -[22 23 22 23 23 22 23 23 22 23 23 22 23 22 23 23 22 23 23 22 23 23 22 23 22 23 23 - 22 23 23 22 23 23 22 23 22 23 23 22 23 23 22 23 23 22 23 22 23 23 22 23 23 22 23 - 23 22 23 22 23 23 0] -xshow -2069 2797 moveto -(Helvetica-Bold-iso1252) cvn findfont 37 -37 matrix scale makefont setfont -<3331> -[19 0] -xshow -422 2881 moveto -(Helvetica-Bold-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<494C53205265636F7264> -[10 23 26 10 28 21 20 24 13 0] -xshow -619 2881 moveto -<5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F -5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F> -[22 23 22 23 23 22 23 23 22 23 23 22 23 22 23 23 22 23 23 22 23 23 22 23 22 23 23 - 22 23 23 22 23 23 22 23 22 23 23 22 23 23 22 23 23 22 23 22 23 23 22 23 23 22 23 - 23 22 23 23 22 23 22 23 23 0] -xshow -2069 2881 moveto -(Helvetica-Bold-iso1252) cvn findfont 37 -37 matrix scale makefont setfont -<3331> -[19 0] -xshow -422 2964 moveto -(Helvetica-Bold-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<4665617475726573> -[23 21 21 12 23 15 20 0] -xshow -577 2964 moveto -<5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F -5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F> -[22 23 22 23 22 23 23 22 23 22 23 22 23 23 22 23 22 23 22 23 23 22 23 22 23 22 23 - 23 22 23 22 23 22 23 23 22 23 22 23 22 23 23 22 23 22 23 22 23 23 22 23 22 23 22 - 23 23 22 23 22 23 22 23 23 22 23 0] -xshow -2068 2964 moveto -(Helvetica-Bold-iso1252) cvn findfont 37 -37 matrix scale makefont setfont -<3332> -[18 0] -xshow -422 3048 moveto -(Helvetica-Bold-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<46656174757265205265636F7264> -[23 21 21 12 23 15 21 10 28 20 21 24 13 0] -xshow -696 3048 moveto -<5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F -5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F> -[22 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 22 23 22 23 22 23 22 23 22 23 22 - 23 22 23 22 23 22 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 22 23 22 23 - 22 23 22 23 22 23 0] -xshow -2068 3048 moveto -(Helvetica-Bold-iso1252) cvn findfont 37 -37 matrix scale makefont setfont -<3332> -[18 0] -xshow -376 3137 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 45 -45 matrix scale makefont setfont -<446566696E696E67204E6577204169726372616674> -[30 23 13 11 26 10 25 26 11 30 22 32 12 30 11 15 23 15 24 13 0] -xshow -791 3137 moveto -<5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F -5F5F5F5F5F5F5F5F5F5F5F5F> -[24 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 24 25 25 25 25 25 25 25 25 25 25 - 25 25 25 25 25 25 24 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 24 0] -xshow -2064 3137 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 37 -37 matrix scale makefont setfont -<3333> -[19 0] -xshow -376 3343 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<41434D20666F7220554E495820616E642057696E646F7773> -[24 27 32 10 9 22 12 11 27 28 9 26 10 21 21 21 10 37 7 21 21 20 27 0] -xshow -1266 3343 moveto -<32> -show -1962 3343 moveto -<30362F31302F3036> -[21 21 9 21 21 10 21 0] -xshow -grestore grestore -showpage -%%PageTrailer - -%%Page: 3 3 -%%PageBoundingBox: 0 0 595 842 -%%BeginPageSetup -% -%%EndPageSetup -gsave -[0.24 0 0 -0.24 0 842] concat -gsave -376 350 moveto -0 0 0 setrgbcolor -(Helvetica-BoldOblique-iso1252) cvn findfont 45 -45 matrix scale makefont setfont -<5374617274696E672041434D20666F722057696E646F7773> -[28 13 23 17 13 11 25 26 11 28 29 35 11 12 26 16 11 40 10 25 25 24 32 0] -xshow -889 350 moveto -<5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F -5F5F5F5F5F5F5F5F5F> -[24 24 25 24 25 24 25 24 25 24 25 24 25 24 25 24 25 24 25 24 25 24 25 24 25 24 25 - 24 25 24 25 24 25 24 25 24 25 24 25 24 25 24 25 24 25 24 24 0] -xshow -2066 350 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 37 -37 matrix scale makefont setfont -<3431> -[18 0] -xshow -376 439 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 45 -45 matrix scale makefont setfont -<53657474696E6720757020616E2041434D2073657373696F6E202841434D20666F722057696E64 -6F7773206F6E6C7929> -[28 23 13 14 11 25 25 12 25 25 11 23 25 11 28 30 34 12 22 23 23 23 11 25 25 12 12 - 29 30 34 12 12 26 15 12 40 9 25 26 23 33 22 12 25 25 10 24 0] -xshow -1383 439 moveto -<5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F> -[24 24 24 25 24 24 24 25 24 24 24 25 24 24 24 25 24 24 24 25 24 24 24 25 24 24 24 0] -xshow -2064 439 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 37 -37 matrix scale makefont setfont -<3432> -[19 0] -xshow -376 3343 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<41434D20666F7220554E495820616E642057696E646F7773> -[24 27 32 10 9 22 12 11 27 28 9 26 10 21 21 21 10 37 7 21 21 20 27 0] -xshow -1266 3343 moveto -<33> -show -1962 3343 moveto -<30362F31302F3036> -[21 21 9 21 21 10 21 0] -xshow -grestore grestore -showpage -%%PageTrailer - -%%Page: 4 4 -%%PageBoundingBox: 0 0 595 842 -%%BeginPageSetup -% -%%EndPageSetup -gsave -[0.24 0 0 -0.24 0 842] concat -gsave -376 422 moveto -0 0 0.50196 setrgbcolor -(Helvetica-iso1252) cvn findfont 68 -68 matrix scale makefont setfont -<496E74726F64756374696F6E> -[16 36 16 20 34 35 34 31 17 13 34 0] -xshow -376 500 moveto -0 0 0 setrgbcolor -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<41434D2069732061206469737472696275746564206D756C7469706C617965722061697220636F -6D6261742073696D756C6174696F6E20746861742072756E73206F6E20554E495820616E64205769 -6E646F77732E2020506C617965727320656E67616765> -[24 27 32 10 8 19 11 21 10 21 8 19 10 13 8 20 22 10 21 21 10 32 21 8 10 8 22 8 20 - 18 21 12 11 21 8 12 11 18 21 32 21 21 10 11 19 7 32 21 8 21 11 8 21 21 10 10 21 - 22 10 11 12 21 21 19 10 21 21 10 27 28 10 25 11 20 21 21 11 36 7 21 21 20 28 20 - 9 10 11 25 8 20 18 21 12 19 11 21 21 21 20 22 0] -xshow -376 556 moveto -<696E206169722D746F2D61697220636F6D626174207769746820696E667261726564206D697373 -696C657320616E642063616E6E6F6E2E> -[8 22 10 22 7 12 12 9 22 12 22 8 12 11 18 21 32 21 21 10 10 28 8 10 21 11 7 22 10 - 12 21 13 20 21 11 32 8 18 20 8 7 21 20 10 21 21 21 10 19 21 21 21 20 22 0] -xshow -376 638 moveto -<5468652066697273742076657273696F6E206F662041434D207761732072656C65617365642069 -6E203139393120766961207468652076656E657261626C65205573656E657420636F6D702E736F75 -726365732E756E6978206E65777367726F75702E> -[24 20 21 11 10 8 12 20 10 10 18 22 11 20 8 21 21 10 22 10 10 24 27 31 11 27 21 - 18 11 11 22 7 21 21 19 21 21 11 7 22 10 20 20 20 20 11 19 8 21 10 10 21 22 10 18 - 21 21 21 12 22 20 8 21 11 27 19 21 20 22 9 11 18 21 33 20 10 19 21 21 12 19 21 - 19 10 21 22 7 19 11 21 19 28 19 20 12 21 22 20 0] -xshow -376 695 moveto -<53696E6365207468656E2C2041434D20686173206265656E20757067726164656420746F207375 -70706F7274207468652049454545203132373820446973747269627574656420496E746572616374 -6976652053696D756C6174696F6E202844495329> -[26 8 21 18 21 11 10 21 21 21 11 10 24 27 31 11 20 22 18 11 21 21 20 21 11 21 21 - 21 11 22 21 20 21 11 10 21 10 19 21 21 21 21 14 10 10 10 21 21 11 10 25 25 25 11 - 19 20 21 20 11 27 8 19 10 13 8 20 22 9 21 21 11 10 21 10 22 11 22 19 10 8 18 21 - 11 25 8 31 22 7 22 10 8 21 21 10 12 28 10 26 0] -xshow -376 752 moveto -<70726F746F636F6C2E2020> -[21 12 21 10 21 19 21 9 9 11 0] -xshow -376 890 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 45 -45 matrix scale makefont setfont -<41636B6E6F776C656467656D656E7473> -[30 22 22 26 24 32 11 23 25 25 22 37 23 26 12 0] -xshow -376 961 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<5061727473206F662041434D207765726520646572697665642066726F6D206F7468657220736F -75726365732E2020546865204449532070726F746F636F6C20636F6D70696C657220697320626173 -6564206F6E20746563686E6F6C6F6779> -[24 21 14 10 19 11 21 10 10 24 27 32 10 27 21 12 21 10 21 21 13 8 18 21 21 10 10 - 12 21 32 10 22 9 21 22 12 10 19 21 21 12 19 21 20 9 11 10 23 21 21 10 28 9 26 10 - 21 12 21 9 22 18 22 8 10 19 20 33 21 8 8 21 12 11 8 19 10 21 21 19 21 21 10 21 - 21 10 10 22 18 21 21 21 8 21 21 0] -xshow -376 1018 moveto -<6F726967696E617465642061742053756E204D6963726F73797374656D7320696E207468656972 -207075626C696320646F6D61696E204F4E43205250432070726F647563742E202041434D92732044 -495320676C756520636F646520776173> -[21 13 8 22 7 21 21 10 21 21 11 21 10 10 25 21 21 11 32 7 19 12 21 18 19 19 10 20 - 32 19 10 8 21 11 10 21 22 7 13 10 21 22 20 9 7 20 10 21 20 32 22 7 21 11 29 27 - 27 11 27 25 27 10 21 12 21 21 21 19 12 9 10 11 23 27 33 6 19 11 28 9 26 10 21 8 - 21 21 11 18 21 21 21 11 26 21 0] -xshow -376 1075 moveto -<63726561746564206279204D617473204C6F66746B766973742E202054686520432B2B20696E74 -65726661636520746F204D6963726F736F6674927320446972656374447261772069732064657269 -7665642066726F6D2073616D706C65732063726561746564> -[19 12 21 21 10 21 21 10 21 18 11 32 21 9 19 11 21 21 11 10 19 19 8 19 11 10 10 - 10 24 20 21 11 27 22 22 10 8 21 10 22 13 9 21 19 21 11 10 21 10 33 7 19 12 21 18 - 22 11 11 6 20 11 27 8 12 21 19 10 28 11 20 28 11 7 20 10 21 21 13 8 18 21 21 10 - 10 12 21 32 10 19 21 32 21 7 22 18 11 19 12 20 22 10 20 0] -xshow -376 1131 moveto -<6279204E6967656C2054686F6D70736F6E20696E2068697320626F6F6B2C203344204772617068 -6963732050726F6772616D6D696E6720666F722057696E646F77732039352E> -[21 18 11 28 7 21 22 8 10 23 21 20 32 22 18 21 21 10 8 22 10 21 8 19 10 21 21 21 - 19 10 11 20 28 10 30 12 21 21 21 8 19 19 10 25 12 21 21 12 20 32 33 7 21 21 11 - 9 21 13 10 37 7 21 21 20 27 19 10 21 21 0] -xshow -376 1213 moveto -<4D616E79206F746865727320686176652067656E65726F75736C7920737570706C696564206275 -6720666978657320616E64206F74686572206368616E67657320746F2041434D2073696E63652069 -7420776173206F726967696E616C6C79> -[32 21 20 19 10 22 9 21 21 12 19 11 21 20 18 21 10 21 21 21 21 12 21 21 19 8 19 - 10 19 21 21 21 8 8 21 21 11 20 21 21 11 10 8 18 21 19 11 20 21 21 11 21 10 20 22 - 12 11 18 21 21 21 21 21 19 10 10 21 11 24 26 32 10 20 7 21 19 21 11 8 10 11 27 - 20 19 11 21 12 8 22 7 21 22 8 7 0] -xshow -376 1270 moveto -<72656C65617365642E2020496E20706172746963756C61722C20499264206C696B6520746F2074 -68616E6B2042726164204261737320616E642054696D2054657373696E20666F7220746865697220 -656E636F75726167656D656E7420616E64> -[12 22 7 21 22 18 21 23 9 10 10 10 22 10 21 21 14 10 8 19 21 8 21 11 10 11 11 6 - 22 10 8 8 18 22 10 10 21 10 10 21 21 22 18 11 25 12 21 21 11 25 21 18 19 11 21 - 20 21 11 23 7 32 11 19 21 19 19 7 22 10 9 22 13 10 10 21 22 8 12 11 20 21 19 21 - 22 11 21 21 21 32 21 21 10 10 21 21 0] -xshow -376 1327 moveto -<636F6E74696E75656420737570706F72742E2020436861726C69652042726967677320616E6420 -546F6D2047696572747A20686176652068656C706564206F75742061206C6F742C20746F6F2E> -[19 21 21 11 7 21 21 21 21 11 18 21 21 21 21 14 11 10 10 11 27 21 21 13 8 7 22 10 - 25 13 8 21 21 19 10 21 21 21 10 19 21 32 10 31 7 21 14 10 19 10 21 20 18 21 11 - 20 22 7 21 21 21 11 21 21 10 10 21 11 8 21 10 11 10 10 22 20 0] -xshow -376 1492 moveto -(Helvetica-Bold-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<53756767657374656420467572746865722052656164696E67> -[26 23 22 24 21 21 12 20 24 10 22 24 15 12 23 21 15 10 27 21 21 23 10 23 0] -xshow -376 1656 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<33442047726170686963732050726F6772616D6D696E6720666F722057696E646F7773203935> -[21 28 10 30 11 21 21 22 7 19 19 11 25 12 21 21 11 21 32 32 7 22 21 10 9 22 12 11 - 36 7 21 21 20 28 18 11 21 0] -xshow -376 1713 moveto -<6279204E6967656C2054686F6D70736F6E> -[21 18 11 28 7 21 22 8 10 23 21 20 32 22 18 21 0] -xshow -1276 1713 moveto -<4953424E20312D35373233312D3334352D35> -[10 25 26 27 11 21 12 20 21 20 20 21 12 21 21 22 12 0] -xshow -376 1795 moveto -<4669676874657220436F6D626174> -[24 7 21 21 10 21 13 10 27 21 31 21 22 0] -xshow -376 1852 moveto -<627920526F62657274204C2E2053686177> -[21 18 11 27 21 21 21 14 10 10 23 8 11 25 21 19 0] -xshow -1276 1852 moveto -<4953424E20302D38373032312D3035392D39> -[10 25 26 27 11 21 12 21 20 20 21 21 12 21 21 21 12 0] -xshow -376 1934 moveto -<416972637261667420436F6E74726F6C20616E642053696D756C6174696F6E> -[26 8 12 19 12 22 10 11 10 28 20 22 9 12 22 8 10 21 21 21 11 25 7 32 22 7 22 10 - 7 22 0] -xshow -376 1991 moveto -<627920427269616E204C2E2053746576656E7320616E64204672616E6B204C2E204C65776973> -[21 18 11 25 13 8 21 21 10 23 8 11 25 10 20 18 21 21 19 10 21 21 21 10 22 12 21 - 21 19 10 23 9 10 21 20 28 8 0] -xshow -1126 1991 moveto -<4953424E20302D3437312D36313339372D35> -[10 25 26 27 11 21 12 19 20 21 12 19 20 20 21 20 12 0] -xshow -376 2073 moveto -<313237382E312D313939352049454545205374616E6461726420666F7220446973747269627574 -656420496E7465726163746976652053696D756C6174696F6E2D2D4170706C69636174696F6E2050 -726F746F636F6C73204953424E20312D35353933372D> -[20 20 20 19 9 21 12 19 21 20 21 10 10 26 25 25 11 26 9 21 21 21 21 12 21 10 10 - 21 13 10 28 8 19 9 14 7 21 21 10 21 21 11 10 21 10 21 12 21 19 11 8 18 21 10 26 - 7 32 21 8 21 11 7 21 22 12 13 25 21 21 8 8 19 21 10 8 21 21 11 25 12 21 9 22 18 - 22 7 19 11 10 25 25 28 10 21 12 21 21 21 20 22 0] -xshow -376 2130 moveto -<3537322D38> -[21 20 21 12 0] -xshow -376 2211 moveto -<54686520537572766579696E672048616E64626F6F6B2C207365636F6E642065646974696F6E> -[24 20 21 11 25 21 13 18 20 20 7 21 21 11 27 21 21 20 22 20 21 19 11 10 19 21 18 - 21 21 21 11 20 22 8 10 8 21 0] -xshow -376 2268 moveto -<6564697465642062792052757373656C204272696E6B657220616E6420526F79204D696E6E6963 -6B> -[21 22 7 10 21 21 11 20 19 10 28 20 19 18 22 8 10 26 13 7 21 18 21 13 10 21 21 21 - 10 28 20 18 11 32 7 21 21 9 18 0] -xshow -1126 2268 moveto -<4953424E20302D3431322D39383531312D58> -[10 25 26 27 11 21 12 18 20 21 11 21 19 19 19 21 11 0] -xshow -376 2426 moveto -(Helvetica-Bold-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<537570706F7274> -[26 23 22 23 24 15 0] -xshow -376 2591 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<537570706F727420696E666F726D6174696F6E2063616E20626520666F756E64206174206F7572 -2077656220736974653A20687474703A2F2F7777772E77656273696D756C6174696F6E732E636F6D -2F737570706F7274> -[26 20 21 21 21 14 10 11 7 22 9 21 12 33 21 10 8 21 21 11 18 21 21 11 20 21 11 9 - 21 21 21 21 11 21 10 11 20 22 12 10 27 21 21 10 19 8 10 23 9 10 22 10 9 22 10 11 - 10 27 28 25 10 27 21 21 19 8 31 22 7 22 10 8 21 22 18 10 19 20 33 10 18 21 21 21 - 21 14 0] -xshow -376 3343 moveto -<41434D20666F7220554E495820616E642057696E646F7773> -[24 27 32 10 9 22 12 11 27 28 9 26 10 21 21 21 10 37 7 21 21 20 27 0] -xshow -1266 3343 moveto -<34> -show -1962 3343 moveto -<30362F31302F3036> -[21 21 9 21 21 10 21 0] -xshow -grestore grestore -showpage -%%PageTrailer - -%%Page: 5 5 -%%PageBoundingBox: 0 0 595 842 -%%BeginPageSetup -% -%%EndPageSetup -gsave -[0.24 0 0 -0.24 0 842] concat -gsave -376 422 moveto -0 0 0.50196 setrgbcolor -(Helvetica-iso1252) cvn findfont 68 -68 matrix scale makefont setfont -<416262726576696174696F6E73> -[42 33 35 20 32 32 12 36 17 12 35 34 0] -xshow -376 500 moveto -0 0 0 setrgbcolor -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<41434D> -[24 27 0] -xshow -526 500 moveto -<61697220636F6D626174206D616E6575766572696E67> -[22 8 12 11 18 21 32 21 21 10 10 32 21 21 20 21 18 21 13 8 21 0] -xshow -376 581 moveto -<41414D> -[25 25 0] -xshow -526 581 moveto -<6169722D746F2D616972206D697373696C65> -[22 7 12 12 10 21 13 21 8 13 10 32 7 19 19 9 7 0] -xshow -376 663 moveto -<414F4120> -[24 28 25 0] -xshow -526 663 moveto -<616E676C65206F662061747461636B> -[21 21 22 7 21 11 21 10 11 21 10 10 22 18 0] -xshow -376 745 moveto -<444953> -[28 9 0] -xshow -526 745 moveto -<446973747269627574656420696E7465726163746976652073696D756C6174696F6E> -[28 7 20 10 13 8 20 21 10 21 21 11 7 22 10 21 12 21 19 11 8 18 21 10 20 7 32 21 - 8 21 11 7 21 0] -xshow -376 827 moveto -<45434D20> -[25 27 32 0] -xshow -526 827 moveto -<656C656374726F6E696320636F756E7465726D65617375726573> -[22 7 21 20 10 12 20 22 8 19 10 19 21 21 21 9 21 13 32 21 20 19 21 12 21 0] -xshow -376 909 moveto -<48554420> -[27 28 27 0] -xshow -526 909 moveto -<686561642D757020646973706C6179> -[21 21 21 21 12 21 21 11 21 8 19 21 8 20 0] -xshow -376 991 moveto -<494153> -[10 25 0] -xshow -526 991 moveto -<696E64696361746564206169727370656564> -[8 21 22 8 18 22 9 21 21 11 21 8 12 19 21 21 21 0] -xshow -376 1073 moveto -<4952> -[10 0] -xshow -526 1073 moveto -<696E667261726564> -[8 22 10 12 21 12 21 0] -xshow -376 1155 moveto -<6B7473> -[19 10 0] -xshow -526 1155 moveto -<6E6175746963616C206D696C65732070657220686F75722E202041206E6175746963616C206D69 -6C6520697320646566696E6564206173203630373620666565742E> -[21 21 22 10 7 19 22 8 10 33 7 8 21 19 11 21 21 12 10 21 21 21 12 9 10 11 25 10 - 21 21 21 11 7 19 22 8 10 32 8 8 21 10 8 20 10 21 21 10 8 21 21 21 11 20 19 11 20 - 20 21 20 11 9 21 21 11 0] -xshow -376 1236 moveto -<4B494153> -[26 9 26 0] -xshow -526 1236 moveto -<6B6E6F747320696E64696361746564206169727370656564> -[19 21 21 10 19 10 8 21 22 8 18 22 9 21 21 11 21 8 12 19 21 21 21 0] -xshow -376 1318 moveto -<525752> -[26 36 0] -xshow -526 1318 moveto -<7261646172207761726E696E67207265636569766572> -[12 21 22 21 12 11 26 21 13 21 7 21 22 10 12 21 19 21 8 18 21 0] -xshow -376 1400 moveto -<544141> -[19 25 0] -xshow -526 1400 moveto -<7461726765742061737065637420616E676C65> -[10 22 12 21 21 10 11 21 18 21 21 19 10 11 21 21 21 8 0] -xshow -376 1482 moveto -<544153> -[19 25 0] -xshow -526 1482 moveto -<74727565206169727370656564> -[10 13 21 21 11 21 8 12 19 21 21 21 0] -xshow -376 1564 moveto -<54455753> -[23 24 37 0] -xshow -526 1564 moveto -<746872656174206561726C79207761726E696E672073797374656D2096206120666F726D206F66 -207261646172207761726E696E67207265636569766572> -[10 22 12 21 21 10 11 20 21 13 8 19 10 27 21 13 21 7 21 22 10 19 18 19 9 21 32 10 - 21 11 21 10 9 21 13 32 10 21 11 10 12 21 21 21 13 10 27 21 12 21 8 21 21 11 12 - 20 19 22 8 17 22 0] -xshow -376 1806 moveto -0 0 0.50196 setrgbcolor -(Helvetica-iso1252) cvn findfont 68 -68 matrix scale makefont setfont -<41434D20666F7220554E4958> -[39 44 52 17 15 35 21 17 44 46 15 0] -xshow -376 1939 moveto -0 0 0 setrgbcolor -(Helvetica-BoldOblique-iso1252) cvn findfont 45 -45 matrix scale makefont setfont -<436F6D6D616E64206C696E65206F7074696F6E73> -[30 24 37 37 23 25 25 11 12 10 26 23 11 25 26 13 11 25 25 0] -xshow -376 2010 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<41434D207573657320504F534958207374796C6520636F6D6D616E64206C696E6520666F726D61 -7474696E673A> -[24 27 32 10 21 19 21 18 11 25 29 26 9 26 10 19 10 19 8 21 11 18 21 31 32 21 21 - 21 10 9 7 21 22 10 9 21 13 32 21 10 11 7 22 21 0] -xshow -376 2086 moveto -(Courier-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<61636D205B202D696E697420> -[28 27 28 27 28 27 28 27 28 27 28 0] -xshow -706 2086 moveto -(Courier-Oblique-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<636F6D6D616E642D66696C652D6E616D65> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -1174 2086 moveto -(Courier-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<205D> -[27 0] -xshow -376 2136 moveto -<202020205B202D737465616C7468205D> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -376 2186 moveto -<202020205B202D7375626A6563742D656E746974792D696420> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -1064 2186 moveto -(Courier-Oblique-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<736974652D69642E6170706C2D69642E656E746974792D6964> -[27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -1751 2186 moveto -(Courier-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<205D> -[28 0] -xshow -376 2236 moveto -<202020205B202D67656F6D6574727920> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -816 2236 moveto -(Courier-Oblique-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<7831312D67656F6D657472792D73706563696669636174696F6E> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -1531 2236 moveto -(Courier-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<205D> -[28 0] -xshow -376 2287 moveto -<202020205B202D6672616D652D7261746520> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -871 2287 moveto -(Courier-Oblique-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<7461726765742D6672616D652D726174652D686572747A> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -1504 2287 moveto -(Courier-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<205D> -[27 0] -xshow -376 2337 moveto -<202020205B202D7570646174652D7261746520> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -899 2337 moveto -(Courier-Oblique-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<696E7465726E616C2D7570646174652D726174652D686572747A> -[27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -1614 2337 moveto -(Courier-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<205D> -[27 0] -xshow -376 2387 moveto -<202020205B202D706C616E65207B20462D3136207C204D69472D3239207C2053752D3330207C20 -432D313732207D205D> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -376 2437 moveto -<202020205B202D7465616D207B2031207C2032207D205D> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -376 2488 moveto -<202020205B202D6C6174697475646520> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -816 2488 moveto -(Courier-Oblique-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<6C617469747564652D64656772656573> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -1256 2488 moveto -(Courier-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<205D> -[28 0] -xshow -376 2538 moveto -<202020205B202D6C6F6E67697475646520> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -844 2538 moveto -(Courier-Oblique-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<6C6F6E6769747564652D64656772656573> -[27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -1311 2538 moveto -(Courier-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<205D> -[28 0] -xshow -376 2588 moveto -<202020205B202D616C74697475646520> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -816 2588 moveto -(Courier-Oblique-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<616C7469747564652D6D736C2D66656574> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -1284 2588 moveto -(Courier-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<205D> -[27 0] -xshow -376 2638 moveto -<202020205B202D68656164696E6720> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -789 2638 moveto -(Courier-Oblique-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<696E697469616C2D68656164696E672D646567726565732D74727565> -[27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -1559 2638 moveto -(Courier-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<205D> -[27 0] -xshow -376 2688 moveto -<202020205B202D61697273706565642D6B747320> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -926 2688 moveto -(Courier-Oblique-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<696E697469616C2D61697273706565642D6B6E6F7473> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -1531 2688 moveto -(Courier-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<205D> -[28 0] -xshow -376 2739 moveto -<202020205B202D6469732D7369746520> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -816 2739 moveto -(Courier-Oblique-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<4449532D736974652D6964> -[28 27 28 27 28 27 28 27 28 27 0] -xshow -1119 2739 moveto -(Courier-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<205D> -[27 0] -xshow -376 2789 moveto -<202020205B202D6469732D6170706C20> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -816 2789 moveto -(Courier-Oblique-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<4449532D6170706C69636174696F6E2D6964> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -1311 2789 moveto -(Courier-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<205D> -[28 0] -xshow -376 2839 moveto -<202020205B202D6469732D657865726369736520> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -926 2839 moveto -(Courier-Oblique-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<4449532D65786572636973652D6964> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -1339 2839 moveto -(Courier-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<205D> -[27 0] -xshow -376 2889 moveto -<202020205B202D7669736962696C69747920> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -871 2889 moveto -(Courier-Oblique-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<666C696768742D7669736962696C6974792D6E6D> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -1421 2889 moveto -(Courier-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<205D> -[28 0] -xshow -376 2939 moveto -<202020205B202D6A7320> -[28 27 28 27 28 27 28 27 28 0] -xshow -651 2939 moveto -(Courier-Oblique-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<6A6F79737469636B2D73657269616C2D706F72742D706174686E616D65> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 0] -xshow -1449 2939 moveto -(Courier-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<205D> -[27 0] -xshow -376 2990 moveto -<202020205B202D656E642D67616D65205D> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -376 3040 moveto -<202020205B202D7468726573686F6C642D72616E676520> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -1009 3040 moveto -(Courier-Oblique-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<7468726573686F6C642D6E6175746963616C2D6D696C6573> -[27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -1669 3040 moveto -(Courier-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<205D> -[27 0] -xshow -376 3140 moveto -<2D696E697420> -[28 27 28 27 28 0] -xshow -541 3140 moveto -(Courier-Oblique-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<636F6D6D616E642066696C652D6E616D65> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -376 3343 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<41434D20666F7220554E495820616E642057696E646F7773> -[24 27 32 10 9 22 12 11 27 28 9 26 10 21 21 21 10 37 7 21 21 20 27 0] -xshow -1266 3343 moveto -<35> -show -1962 3343 moveto -<30362F31302F3036> -[21 21 9 21 21 10 21 0] -xshow -grestore grestore -showpage -%%PageTrailer - -%%Page: 6 6 -%%PageBoundingBox: 0 0 595 842 -%%BeginPageSetup -% -%%EndPageSetup -gsave -[0.24 0 0 -0.24 0 842] concat -gsave -526 338 moveto -0 0 0 setrgbcolor -(Courier-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<54616B6520657874726120636F6D6D616E64206F7074696F6E732C20696E20636F6D6D616E6420 -6C696E6520666F726D61742C2066726F6D> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 - 28 0] -xshow -526 388 moveto -<7468652073706563696669656420746578742066696C652E2020466F72206578616D706C652C20 -7361792074686572652069732061> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -526 438 moveto -<66696C6520696E20796F757220686F6D65206469726563746F7279206E616D656420912E61636D -7263922E202049747320636F6E74656E7473> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 - 28 27 0] -xshow -526 488 moveto -<6C6F6F6B206C696B6520746869733A> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -676 639 moveto -<2D6469732D73697465203334> -[28 27 28 27 28 27 28 27 28 27 28 0] -xshow -676 689 moveto -<2D6469732D6170706C202034> -[28 27 28 27 28 27 28 27 28 27 28 0] -xshow -526 839 moveto -<4E6577206C696E6573206172652074726561746564206173206E6F726D616C2077686974652073 -706163652C20736F206665656C2066726565> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 - 28 27 0] -xshow -526 890 moveto -<746F20736570617261746520636F6D6D616E64206C696E65206F7074696F6E73206F6E746F206D -756C7469706C65206C696E65732E> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -526 965 moveto -<46726F6D2061207368656C6C2C20796F7520656E7465722074686520636F6D6D616E643A> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 0] -xshow -676 1115 moveto -<242061636D202D67656F6D657472792038303078363030202D696E6974207E2F2E61636D7263> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 0] -xshow -526 1266 moveto -<5468697320776F756C64206265206571756976616C656E7420746F3A> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -676 1416 moveto -<242061636D202D67656F6D657472792038303078363030202D6469732D73697465203334209664 -69732D6170706C2034> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -376 1566 moveto -<2D737465616C7468> -[28 27 28 27 28 27 28 0] -xshow -526 1642 moveto -<53746172742041434D20696E20737465616C7468206D6F64652E202041434D20616C6C6F777320 -757365727320746F206D6F6E69746F72> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -526 1692 moveto -<6F75742D7468652D77696E646F7720766965777320666F7220616E792061697263726166742061 -637469766520696E20616E> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -526 1742 moveto -<65786572636973652E20204164646974696F6E616C6C792C2041434D20737570706F7274732061 -6E206578706572696D656E74616C20444953> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 - 28 27 0] -xshow -526 1792 moveto -<526571756573742F4772616E7420436F6E74726F6C2070726F746F636F6C207468617420776F75 -6C64207065726D69742041434D20746F> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -526 1843 moveto -<9374616B65206F76657294206169726372616674206F662073696D696C61726C7920656E61626C -6564206170706C69636174696F6E732E> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -526 1893 moveto -<536565207468652093537465616C7468204D6F6465942073656374696F6E20666F722064657461 -696C656420696E666F726D6174696F6E> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -526 1943 moveto -<6F6E2074686973206361706162696C6974792E> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -376 2093 moveto -<2D7375626A6563742D656E746974792D69642020> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -926 2093 moveto -(Courier-Oblique-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<736974652D69642E6170706C2D69642E656E746974792D6964> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -526 2169 moveto -(Courier-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<54686973206F7074696F6E2063616E206265207573656420696E20636F6E6A756E6374696F6E20 -77697468207468652096737465616C7468> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 - 28 0] -xshow -526 2219 moveto -<666C616720746F206964656E746966792074686520696E697469616C2044495320656E74697479 -20746F206265> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -526 2269 moveto -<93737465616C74686564942E> -[28 27 28 27 28 27 28 27 28 27 28 0] -xshow -676 2419 moveto -<242061636D202D737465616C7468202D7375626A6563742D656E746974792D69642033322E312E -31> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -376 2570 moveto -<2D67656F6D657472792020> -[28 27 28 27 28 27 28 27 28 27 0] -xshow -679 2570 moveto -(Courier-Oblique-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<7831312D67656F6D657472792D73706563696669636174696F6E> -[27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -1394 2570 moveto -(Courier-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<20> -show -526 2645 moveto -<537065636966792070726563697365206C6F636174696F6E20616E642073697A65207365747469 -6E677320666F7220746865206D61696E> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -526 2695 moveto -<41434D2077696E646F772E> -[28 27 28 27 28 27 28 27 28 27 0] -xshow -376 2846 moveto -<2D6672616D652D7261746520> -[28 27 28 27 28 27 28 27 28 27 28 0] -xshow -706 2846 moveto -(Courier-Oblique-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<7461726765742D6672616D652D726174652D686572747A> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -526 2921 moveto -(Courier-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<5370656369666965732061206E6F742D746F2D6578636565642072617465206174207768696368 -2041434D2077696C6C20617474656D7074> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 - 28 0] -xshow -526 2971 moveto -<746F2072656E6465722074686520636F636B706974207363656E652E2020546865206465666175 -6C7420697320746F20757064617465> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -526 3021 moveto -<746865207363656E65206173206661737420617320706F737369626C652C207768696368207769 -6C6C2075736520616C6C> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -526 3071 moveto -<617661696C61626C65204350552074696D65206F6E20612073797374656D2E> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 0] -xshow -376 3343 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<41434D20666F7220554E495820616E642057696E646F7773> -[24 27 32 10 9 22 12 11 27 28 9 26 10 21 21 21 10 37 7 21 21 20 27 0] -xshow -1266 3343 moveto -<36> -show -1962 3343 moveto -<30362F31302F3036> -[21 21 9 21 21 10 21 0] -xshow -grestore grestore -showpage -%%PageTrailer - -%%Page: 7 7 -%%PageBoundingBox: 0 0 595 842 -%%BeginPageSetup -% -%%EndPageSetup -gsave -[0.24 0 0 -0.24 0 842] concat -gsave -376 388 moveto -0 0 0 setrgbcolor -(Courier-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<2D7570646174652D7261746520> -[28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -734 388 moveto -(Courier-Oblique-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<696E7465726E616C2D7570646174652D726174652D686572747A> -[27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -526 463 moveto -(Courier-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<5370656369666965732074686520757064617465207261746520666F722074686520696E6E6572 -20696E746567726174696F6E206C6F6F70> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 - 28 0] -xshow -526 513 moveto -<666F72207468652073696D756C6174696F6E2E20205468652064656661756C7420697320746F20 -72756E2061732066617374206173> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -526 564 moveto -<706F737369626C652E202049662074686520966672616D652D72617465206F7074696F6E206973 -207370656369666965642C20746865> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -526 614 moveto -<64656661756C74206368616E67657320746F20353020686572747A2E> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -376 764 moveto -<2D706C616E65207B20462D3136207C204D69472D3239207C2053752D3330207D20> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 0] -xshow -526 839 moveto -<416C6C6F777320746865207573657220746F2073656C6563742074686520616972637261667420 -7479706520746F20626520666C6F776E2E> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 - 28 0] -xshow -376 990 moveto -<2D7363656E6520> -[28 27 28 27 28 27 0] -xshow -569 990 moveto -(Courier-Oblique-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<7363656E652D66696C652D6E616D65> -[27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -526 1065 moveto -(Courier-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<41434D2074616B657320616972706F727420616E64204E415641494420696E666F726D6174696F -6E2066726F6D206120746578742D> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -526 1115 moveto -<6261736564207363656E652066696C652E20204E6F726D616C6C792C20612066696C65206E616D -6564209364656661756C742D7363656E6594> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 - 28 27 0] -xshow -526 1165 moveto -<697320757365642E> -[28 27 28 27 28 27 28 0] -xshow -376 1316 moveto -<2D7465616D207B2031207C2032207D20> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -526 1391 moveto -<416C6C6F777320746865207573657220746F2073656C656374207768696368207465616D207468 -6520616972637261667420697320746F> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -526 1441 moveto -<6265206173736F63696174656420776974682E20205465616D203120636F72726573706F6E6473 -20746F2074686520444953> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -526 1491 moveto -<93467269656E646C799420666F7263652C207465616D20322069732074686520934F70706F7369 -6E679420666F7263652E202045616368> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -526 1542 moveto -<7465616D2068617320616E206173736F6369617465642093686F6D6594206C6F636174696F6E20 -776869636820697320646566696E6564> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -526 1592 moveto -<696E20746865207363656E652066696C6520726561642062792041434D20617420737461727475 -702E> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -376 1742 moveto -<2D6C6174697475646520> -[28 27 28 27 28 27 28 27 28 0] -xshow -651 1742 moveto -(Courier-Oblique-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<6C617469747564652D64656772656573> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -1091 1742 moveto -(Courier-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<20> -show -376 1793 moveto -<2D6C6F6E676974756465206C6F6E6769747564652D6465677265657320> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 0] -xshow -376 1843 moveto -<2D616C74697475646520616C7469747564652D6D736C2D6665657420> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -376 1893 moveto -<2D68656164696E6720> -[28 27 28 27 28 27 28 27 0] -xshow -624 1893 moveto -(Courier-Oblique-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<696E697469616C2D68656164696E672D646567726565732D74727565> -[27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -1394 1893 moveto -(Courier-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<20> -show -376 1943 moveto -<2D61697273706565642D6B747320> -[28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -761 1943 moveto -(Courier-Oblique-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<696E697469616C2D61697273706565642D6B6E6F7473> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -1366 1943 moveto -(Courier-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<20> -show -526 2018 moveto -<5468657365206F7074696F6E73206D617920626520636F6D62696E656420746F207461696C6F72 -207468652073746172747570> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -526 2069 moveto -<6C6F636174696F6E206F66207468652041434D2061697263726166742E20204966207468652096 -616C746974756465206F7074696F6E206973> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 - 28 27 0] -xshow -526 2119 moveto -(Courier-Oblique-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<6E6F74> -[28 27 0] -xshow -609 2119 moveto -(Courier-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<20737570706C6965642C2041434D206175746F6D61746963616C6C792073657473207468652061 -69726372616674206F6E20746865> -[27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 - 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -526 2169 moveto -<67726F756E642061742074686520737065636966696564206C6F636174696F6E2E202043617265 -2073686F756C642062652074616B656E> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -526 2219 moveto -<6E6F7420746F207370656369667920616E20616C74697475646520746F6F20636C6F736520746F -207468652067726F756E642E> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -376 2370 moveto -<2D6469732D7369746520> -[28 27 28 27 28 27 28 27 28 0] -xshow -651 2370 moveto -(Courier-Oblique-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<4449532D736974652D6964> -[28 27 28 27 28 27 28 27 28 27 0] -xshow -376 2420 moveto -(Courier-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<2D6469732D6170706C20> -[28 27 28 27 28 27 28 27 28 0] -xshow -651 2420 moveto -(Courier-Oblique-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<4449532D6170706C69636174696F6E2D6964> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -376 2470 moveto -(Courier-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<2D6469732D6578657263697365> -[28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -734 2470 moveto -(Courier-Oblique-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<204449532D65786572636973652D6964> -[27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -526 2545 moveto -(Courier-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<557365207468657365206F7074696F6E7320746F2073656C656374206120737065636966696320 -494545452031323738204449532073697465> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 - 28 27 0] -xshow -526 2595 moveto -<6F72206170706C69636174696F6E206964656E7469666965722E202042792064656661756C742C -2041434D207573657320746865206C617374> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 - 28 27 0] -xshow -526 2646 moveto -<74776F206F6374657473206F662074686520686F7374206D616368696E65927320495020616464 -72657373206173207468652073697465> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -526 2696 moveto -<616E64206170706C69636174696F6E206964656E746966696572732E2020546865206465666175 -6C74206578657263697365> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -526 2746 moveto -<6964656E746966696572206973206F6E65202831292E> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -376 2896 moveto -<2D7669736962696C69747920> -[28 27 28 27 28 27 28 27 28 27 28 0] -xshow -706 2896 moveto -(Courier-Oblique-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<666C696768742D7669736962696C6974792D6E6D> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -526 2972 moveto -(Courier-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<536574732074686520666C69676874207669736962696C69747920696E207468652041434D2065 -6E7669726F6E6D656E742E20546865> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -526 3022 moveto -<64656661756C74206973203530206E6175746963616C206D696C65732E> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 0] -xshow -376 3343 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<41434D20666F7220554E495820616E642057696E646F7773> -[24 27 32 10 9 22 12 11 27 28 9 26 10 21 21 21 10 37 7 21 21 20 27 0] -xshow -1266 3343 moveto -<37> -show -1962 3343 moveto -<30362F31302F3036> -[21 21 9 21 21 10 21 0] -xshow -grestore grestore -showpage -%%PageTrailer - -%%Page: 8 8 -%%PageBoundingBox: 0 0 595 842 -%%BeginPageSetup -% -%%EndPageSetup -gsave -[0.24 0 0 -0.24 0 842] concat -gsave -376 338 moveto -0 0 0 setrgbcolor -(Courier-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<2D6A7320> -[28 27 28 0] -xshow -486 338 moveto -(Courier-Oblique-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<6A6F79737469636B2D73657269616C2D706F72742D706174686E616D65> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 0] -xshow -526 413 moveto -(Courier-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<41434D20737570706F727473204E6F6573697320616E6420436F6C6F7261646F20537065637472 -756D20286E6F7720646566756E637429> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -526 463 moveto -<73657269616C206A6F79737469636B2061646170746572732E20205468697320636F6D6D616E64 -2073706563696669657320746865> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -526 513 moveto -<6E616D65206F66207468652073657269616C20706F727420636F6E6E656374656420746F207468 -65206A6F79737469636B2061646170746572> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 - 28 27 0] -xshow -526 564 moveto -<616E6420656E61626C6573206A6F79737469636B20706F6C6C696E672E> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 0] -xshow -376 714 moveto -<2D656E642D67616D65> -[28 27 28 27 28 27 28 27 0] -xshow -526 789 moveto -<5468697320666C6167206973206F6E6C792076616C696420696E20737465616C7468206D6F6465 -2E2020486F7374696C65> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -526 839 moveto -<6169726372616674206E65617220746865207375626A6563742061697263726166742061726520 -747261636B65642E2020496620616E79> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -526 890 moveto -<6F66207468657365206169726372616674206D6F7665732077697468696E20746865207375626A -6563742061697263726166749273> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -526 940 moveto -<7261646172206C6F636B696E672072616E67652C207468656E2041434D2077696C6C2072657175 -65737420636F6E74726F6C206F66> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -526 990 moveto -<7375626A656374206169726372616674> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -966 974 moveto -(Courier-iso1252) cvn findfont 26 -26 matrix scale makefont setfont -<31> -show -376 1140 moveto -(Courier-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<2D7468726573686F6C642D72616E676520> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -844 1140 moveto -(Courier-Oblique-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<7468726573686F6C642D6E6175746963616C2D6D696C6573> -[27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -526 1216 moveto -(Courier-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<5468697320666C6167206973206F6E6C792076616C696420696E2074686520656E642D67616D65 -206D6F64652E202049662061> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -526 1266 moveto -<686F7374696C65206169726372616674206D6F7665732077697468696E20746865207370656369 -66696564207468726573686F6C64> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -526 1316 moveto -<64697374616E6365206F662074686520737465616C7468656420287375626A6563742920616972 -63726166742C2041434D2077696C6C> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -526 1366 moveto -<617474656D707420746F2074616B6520636F6E74726F6C20616E6420656E676167652074686520 -686F7374696C65207461726765742E> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -526 1416 moveto -<4966207468726573686F6C642072616E6765206973206E6F74207370656369666965642C207468 -656E20746865207375626A656374> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -526 1467 moveto -<61697263726166749273207261646172206C6F636B2072616E6765206973207573656420617320 -7468652064697374616E6365> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -526 1517 moveto -<7468726573686F6C642E> -[28 27 28 27 28 27 28 27 28 0] -xshow -376 1729 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 45 -45 matrix scale makefont setfont -<4F7468657220496E697469616C697A6174696F6E20506172616D6574657273> -[33 13 25 23 16 11 11 26 11 13 11 24 11 11 21 23 13 11 25 26 11 27 22 16 22 37 23 - 13 23 15 0] -xshow -376 1794 moveto -(Courier-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<417420737461727475702C2041434D207265616473207365766572616C20746578742D62617365 -6420646174612066696C657320746F> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -376 1844 moveto -<636F6E66696775726520746865206F7065726174696E6720656E7669726F6E6D656E742E> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 0] -xshow -376 1920 moveto -<64656661756C742D7363656E65> -[28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -526 1995 moveto -<546869732066696C6520636F6E7461696E7320746865206C6F636174696F6E73206F6620656163 -68207465616D927320686F6D65> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -526 2045 moveto -<626173652C20616972706F72742072756E77617920696E666F726D6174696F6E2C204E41564149 -4420696E666F726D6174696F6E2C206173> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 - 28 0] -xshow -526 2095 moveto -<77656C6C20617320746865206C6F636174696F6E73206F66206D616E2D6D6164652067726F756E -642066656174757265732E20205468652096> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 - 28 27 0] -xshow -526 2145 moveto -<7363656E6520636F6D6D616E64206C696E65206F7074696F6E206D617920626520757365642074 -6F206469726563742041434D20746F> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -526 2196 moveto -<7265616420616E20616C7465726E617465207363656E652066696C652E> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 0] -xshow -376 2271 moveto -<6F626A6563742D6D61702E747874> -[28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -526 2346 moveto -<546869732066696C6520646566696E65732061206D617070696E672066726F6D2044495320656E -7469747920747970657320746F203344> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -526 2396 moveto -<6F626A65637420646566696E6974696F6E2066696C65732E2020546865206F626A656374206669 -6C657320617265207573656420746F> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -526 2446 moveto -<72656E64657220616E20696D616765206F662074686520656E746974792E> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 0] -xshow -376 2522 moveto -<6D756E6974696F6E2D6D61702E747874> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -526 2597 moveto -<546869732066696C6520646566696E657320746865206578706C6F73696F6E20616E642064616D -6167652070726F647563696E67> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -526 2647 moveto -<636861726163746572697374696373206F6620444953206D756E6974696F6E20656E7469747920 -7479706520616E642077617268656164> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -526 2697 moveto -<636F6D62696E6174696F6E732E> -[28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -376 2773 moveto -<696E76656E746F7279> -[28 27 28 27 28 27 28 27 0] -xshow -526 2848 moveto -<546869732066696C6520646566696E65732074686520706572666F726D616E6365206368617261 -63746572697374696373206F6620616C6C> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 - 28 0] -xshow -526 2898 moveto -<6169726372616674207479706573206D6F64656C65642062792041434D2E2020546865206C6179 -6F7574206F6620746869732066696C65> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -526 2948 moveto -<697320646566696E656420696E207468652073656374696F6E207469746C65642093446566696E -696E67204E6577204169726372616674942E> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 - 28 27 0] -xshow -376 3156 moveto -(Courier-iso1252) cvn findfont 38 -38 matrix scale makefont setfont -<31> -show -399 3156 moveto -<20436F6E74726F6C20697320726571756573746564207573696E6720612076617269616E74206F -66207468652070726F706F7365642044495320322E312E342B2B207472616E73666572> -[22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 - 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 - 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 0] -xshow -376 3198 moveto -<636F6E74726F6C2070726F746F636F6C2073657175656E63652E> -[23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 22 23 0] -xshow -376 3343 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<41434D20666F7220554E495820616E642057696E646F7773> -[24 27 32 10 9 22 12 11 27 28 9 26 10 21 21 21 10 37 7 21 21 20 27 0] -xshow -1266 3343 moveto -<38> -show -1962 3343 moveto -<30362F31302F3036> -[21 21 9 21 21 10 21 0] -xshow -375 3112 433 3 rectfill -grestore grestore -showpage -%%PageTrailer - -%%Page: 9 9 -%%PageBoundingBox: 0 0 595 842 -%%BeginPageSetup -% -%%EndPageSetup -gsave -[0.24 0 0 -0.24 0 842] concat -gsave -376 344 moveto -0 0 0 setrgbcolor -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<4945454520313237382E3120284449532920436F6D706C69616E6365> -[10 25 26 25 10 20 20 20 19 9 20 11 11 29 9 26 12 11 27 20 32 22 8 7 22 20 19 0] -xshow -376 508 moveto -<41434D20656D69747320616E64207265636F676E697A65732074686520666F6C6C6F77696E6720 -444953205044552054797065733A> -[24 27 32 10 21 32 8 10 19 10 21 21 21 10 13 20 19 21 21 21 8 18 22 19 10 10 21 - 22 10 9 22 8 8 20 29 7 21 21 11 28 9 25 11 25 27 27 11 18 19 22 20 20 0] -xshow -526 671 moveto -<456E74697479205374617465> -[26 21 10 8 10 19 11 26 9 21 10 0] -xshow -526 753 moveto -<46697265> -[24 7 12 0] -xshow -526 835 moveto -<4465746F6E6174696F6E> -[28 21 9 21 21 21 11 7 21 0] -xshow -526 917 moveto -<456C656374726F6D61676E6574696320456D697373696F6E> -[26 8 21 19 10 12 20 32 21 21 21 21 10 8 19 11 24 33 7 19 19 8 21 0] -xshow -376 1081 moveto -<41434D207573657320746865204449532F782044495320696E74657266616365206C6962726172 -792E20204449532F7820737570706F7274732064656164207265636B6F6E696E67206F6620657874 -65726E616C20656E746974696573207573696E6720616E79> -[24 27 32 10 21 19 21 18 11 10 21 21 11 28 9 26 10 18 11 28 9 26 10 8 21 10 22 13 - 9 21 19 21 11 8 8 22 11 22 14 17 9 11 10 28 9 26 10 19 11 18 21 21 21 21 14 10 - 19 10 21 21 21 21 10 12 22 18 18 21 21 8 21 21 10 22 10 10 20 19 10 21 13 20 22 - 8 10 21 22 10 8 11 7 21 19 11 20 20 7 21 22 10 21 20 0] -xshow -376 1138 moveto -<6F66207468657365206D6574686F64733A> -[22 10 10 10 21 22 18 21 11 31 21 10 21 21 21 19 0] -xshow -526 1301 moveto -<4E616D65> -[28 20 32 0] -xshow -525 1301 moveto -<2020> -[90 0] -xshow -525 1305 102 2 rectfill -625 1301 moveto -<20202020> -[12 13 13 0] -xshow -625 1301 moveto -<2020> -[38 0] -xshow -625 1305 50 2 rectfill -675 1301 moveto -<20202020202020202020202020> -[11 12 11 12 11 12 11 12 11 12 12 11 0] -xshow -675 1301 moveto -<2020> -[138 0] -xshow -675 1305 150 2 rectfill -826 1301 moveto -<456E756D65726174696F6E2056616C7565> -[26 20 21 32 21 12 21 11 7 21 21 11 23 21 8 21 0] -xshow -825 1301 moveto -<2020> -[307 0] -xshow -825 1305 319 2 rectfill -526 1383 moveto -<537461746963> -[26 10 21 10 8 0] -xshow -976 1383 moveto -<31> -show -526 1465 moveto -<465057> -[23 25 0] -xshow -976 1465 moveto -<32> -show -526 1547 moveto -<525057> -[28 24 0] -xshow -976 1547 moveto -<33> -show -526 1629 moveto -<525657> -[26 25 0] -xshow -976 1629 moveto -<34> -show -526 1711 moveto -<465657> -[23 25 0] -xshow -976 1711 moveto -<35> -show -376 1875 moveto -<54686573652064656164207265636B6F6E696E67206D6574686F6473206172652063757272656E -746C7920> -[24 20 21 19 21 10 21 21 21 21 10 12 22 18 18 21 21 8 21 21 10 32 21 10 21 20 22 - 18 11 21 12 21 10 19 21 12 12 21 22 10 7 20 0] -xshow -1130 1875 moveto -(Helvetica-Bold-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<756E737570706F72746564> -[23 23 21 23 23 23 23 15 12 21 0] -xshow -1360 1875 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<206279204449532F783A> -[11 20 19 10 28 9 26 10 19 0] -xshow -526 2040 moveto -<4E616D65> -[28 20 32 0] -xshow -525 2040 moveto -<2020> -[90 0] -xshow -525 2044 102 2 rectfill -625 2040 moveto -<20202020> -[12 13 13 0] -xshow -625 2040 moveto -<2020> -[38 0] -xshow -625 2044 50 2 rectfill -675 2040 moveto -<20202020202020202020202020> -[11 12 11 12 11 12 11 12 11 12 12 11 0] -xshow -675 2040 moveto -<2020> -[138 0] -xshow -675 2044 150 2 rectfill -826 2040 moveto -<456E756D65726174696F6E2056616C7565> -[26 20 21 32 21 12 21 11 7 21 21 11 23 21 8 21 0] -xshow -825 2040 moveto -<2020> -[307 0] -xshow -825 2044 319 2 rectfill -526 2122 moveto -<465042> -[23 25 0] -xshow -976 2122 moveto -<36> -show -526 2204 moveto -<525042> -[28 25 0] -xshow -976 2204 moveto -<37> -show -526 2286 moveto -<525642> -[26 25 0] -xshow -976 2286 moveto -<38> -show -526 2368 moveto -<465642> -[23 25 0] -xshow -976 2368 moveto -<39> -show -526 2450 moveto -<525057> -[28 24 0] -xshow -976 2450 moveto -<3130> -[20 0] -xshow -526 2531 moveto -<525657> -[26 25 0] -xshow -976 2531 moveto -<3131> -[19 0] -xshow -376 2695 moveto -<456E746974696573206D616E616765642062792041434D20656D697420656E7469747920737461 -74652050445592732073706563696679696E6720746865205250572833292064656164207265636B -6F6E696E67206D6574686F642E20204E6F> -[26 21 10 8 11 7 22 19 10 32 20 21 21 21 21 21 10 20 19 11 24 27 31 11 20 33 7 11 - 10 21 21 10 9 10 19 10 19 10 21 10 21 11 25 27 28 6 20 10 19 21 21 19 8 10 19 8 - 21 21 11 10 21 21 10 28 24 37 11 22 12 10 21 21 21 21 10 12 22 18 18 21 21 8 21 - 21 11 31 21 10 21 20 23 9 11 10 27 0] -xshow -376 2752 moveto -<6172746963756C6174696F6E20706172616D6574657273206172652063757272656E746C792073 -656E7420627920656E746974696573206D616E616765642062792041434D2E204173207769746820 -6D6F73742063757272656E74204449532D6261736564> -[21 14 11 7 19 22 7 22 10 8 21 21 11 20 22 11 21 32 21 9 22 12 19 10 21 12 21 11 - 18 21 13 12 21 21 10 8 19 11 18 21 21 11 10 20 19 10 22 21 10 8 11 7 21 20 10 32 - 21 20 21 21 21 21 10 21 19 10 23 28 33 9 10 25 19 10 29 7 10 21 11 31 21 19 10 - 10 19 21 12 12 21 22 10 10 28 10 25 12 21 21 19 21 0] -xshow -376 2809 moveto -<73696D756C6174696F6E732C20616C746974756465732061726520657870726573736564206173 -20686569676874732061626F766520746865205747532D383420656C6C6970736F69642C206E6F74 -20617320686569676874732061626F766520746865> -[20 7 32 21 8 21 11 7 21 22 19 10 10 22 8 10 8 10 21 21 21 19 11 21 11 22 10 20 - 19 21 12 21 19 18 21 21 11 20 19 11 20 22 7 21 22 10 19 10 21 21 21 17 21 11 10 - 21 21 11 35 29 25 12 21 21 11 21 8 8 8 21 19 22 7 22 10 10 21 21 10 11 21 18 11 - 21 21 8 21 21 10 19 10 21 21 21 17 22 10 10 21 0] -xshow -376 2866 moveto -<67656F69642E202044656164207265636B6F6E696E67207468726573686F6C642076616C756573 -2061726520686172642D636F64656420696E20746869732076657273696F6E206F66207468652070 -726F647563743A> -[21 21 22 7 23 9 11 10 27 21 21 21 10 12 21 19 18 21 21 8 21 21 10 10 21 13 21 18 - 21 22 7 22 10 18 21 8 21 21 19 10 21 12 21 11 20 22 11 22 12 19 21 21 21 21 10 - 8 21 11 10 21 8 19 11 17 22 12 20 7 21 21 11 21 10 11 10 21 21 10 21 12 21 21 21 - 19 10 0] -xshow -526 3030 moveto -<4465736372697074696F6E> -[28 21 18 19 13 7 22 10 8 21 0] -xshow -525 3030 moveto -<2020> -[177 0] -xshow -525 3034 189 2 rectfill -713 3030 moveto -<202020202020202020> -[12 13 12 13 12 13 13 12 0] -xshow -713 3030 moveto -<2020> -[100 0] -xshow -713 3034 112 2 rectfill -825 3030 moveto -<20202020202020202020202020> -[11 12 11 12 11 12 11 12 11 12 12 11 0] -xshow -825 3030 moveto -<2020> -[138 0] -xshow -825 3034 150 2 rectfill -975 3030 moveto -<20202020202020202020202020> -[11 12 11 12 11 12 11 12 11 12 12 11 0] -xshow -975 3030 moveto -<2020> -[138 0] -xshow -975 3034 150 2 rectfill -1125 3030 moveto -<20202020202020202020202020> -[11 12 11 12 11 12 11 12 11 12 12 11 0] -xshow -1125 3030 moveto -<2020> -[138 0] -xshow -1125 3034 150 2 rectfill -1275 3030 moveto -<20202020202020202020202020> -[11 12 11 12 11 12 11 12 11 12 12 11 0] -xshow -1275 3030 moveto -<2020> -[138 0] -xshow -1275 3034 150 2 rectfill -1426 3030 moveto -<56616C7565> -[23 22 7 21 0] -xshow -1425 3030 moveto -<2020> -[84 0] -xshow -1425 3034 96 2 rectfill -526 3111 moveto -<4D6178696D756D2074696D65206265747765656E20456E746974792053746174652050445573> -[32 21 19 7 32 20 32 11 10 7 33 21 10 21 21 10 27 21 21 21 10 25 22 10 8 10 19 10 - 26 10 21 9 22 10 25 27 28 0] -xshow -1426 3111 moveto -<35207365636F6E6473> -[21 11 18 21 19 21 21 21 0] -xshow -526 3193 moveto -<44656164205265636B6F6E696E672043617274657369616E2064697374616E6365206572726F72> -[28 21 20 21 11 27 21 18 18 21 21 8 21 21 11 27 21 13 10 21 19 8 21 21 11 21 7 19 - 10 21 22 18 21 11 21 12 12 21 0] -xshow -1426 3193 moveto -<32206D6574657273> -[21 11 32 20 10 21 12 0] -xshow -376 3343 moveto -<41434D20666F7220554E495820616E642057696E646F7773> -[24 27 32 10 9 22 12 11 27 28 9 26 10 21 21 21 10 37 7 21 21 20 27 0] -xshow -1266 3343 moveto -<39> -show -1962 3343 moveto -<30362F31302F3036> -[21 21 9 21 21 10 21 0] -xshow -grestore grestore -showpage -%%PageTrailer - -%%Page: 10 10 -%%PageBoundingBox: 0 0 595 842 -%%BeginPageSetup -% -%%EndPageSetup -gsave -[0.24 0 0 -0.24 0 842] concat -gsave -526 344 moveto -0 0 0 setrgbcolor -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<44656164205265636B6F6E696E6720616E67756C6172206F7269656E746174696F6E206572726F -72> -[28 21 20 21 11 27 21 18 18 21 21 8 21 21 11 21 21 20 22 7 22 12 11 21 12 8 21 21 - 10 22 10 8 21 21 11 21 12 11 22 0] -xshow -1426 344 moveto -<332064656772656573> -[21 11 21 21 21 11 21 21 0] -xshow -376 508 moveto -<5768656E206F7065726174696E6720696E20494545452031323738206D6F64652C207468652064 -656661756C742055445020706F7274206E756D62657220666F7220504455207472616E736D697373 -696F6E20697320333030302E> -[36 21 21 21 10 21 21 21 12 21 11 7 21 22 10 8 21 11 10 25 25 25 11 19 20 21 20 - 10 32 21 21 21 10 10 10 22 21 10 21 22 8 22 21 8 11 10 27 27 25 11 21 21 14 10 - 10 21 20 32 21 21 12 11 9 21 13 11 25 27 27 10 11 12 21 21 18 33 7 19 20 7 21 21 - 11 8 19 10 21 21 21 21 0] -xshow -376 3343 moveto -<41434D20666F7220554E495820616E642057696E646F7773> -[24 27 32 10 9 22 12 11 27 28 9 26 10 21 21 21 10 37 7 21 21 20 27 0] -xshow -1256 3343 moveto -<3130> -[19 0] -xshow -1962 3343 moveto -<30362F31302F3036> -[21 21 9 21 21 10 21 0] -xshow -grestore grestore -showpage -%%PageTrailer - -%%Page: 11 11 -%%PageBoundingBox: 0 0 595 842 -%%BeginPageSetup -% -%%EndPageSetup -gsave -[0.24 0 0 -0.24 0 842] concat -gsave -376 422 moveto -0 0 0.50196 setrgbcolor -(Helvetica-iso1252) cvn findfont 68 -68 matrix scale makefont setfont -<4B6579626F61726420436F6D6D616E6473> -[39 33 31 34 34 35 20 34 17 45 33 52 52 34 34 34 0] -xshow -376 632 moveto -0 0 0 setrgbcolor -(Helvetica-iso1252) cvn findfont 45 -45 matrix scale makefont setfont -<47656E6572616C> -[33 22 23 23 13 23 0] -xshow -376 637 146 3 rectfill -376 814 moveto -(Helvetica-iso1252) cvn findfont 53 -53 matrix scale makefont setfont -<47> -show -526 814 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<4C616E64696E6720676561722075702F646F776E> -[21 21 21 21 8 21 21 11 21 20 22 12 10 21 22 9 22 20 27 0] -xshow -376 912 moveto -(Helvetica-iso1252) cvn findfont 53 -53 matrix scale makefont setfont -<42> -show -526 912 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<576865656C206272616B6573206F6E2F6F6666> -[36 21 21 21 8 10 22 11 21 18 21 19 11 21 21 10 22 10 0] -xshow -376 1009 moveto -(Helvetica-iso1252) cvn findfont 53 -53 matrix scale makefont setfont -<48> -show -526 1009 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<466C61707320646F776E2031302064656772656573> -[24 7 21 21 19 11 21 20 27 21 11 20 19 11 21 21 21 12 21 21 0] -xshow -376 1107 moveto -(Helvetica-iso1252) cvn findfont 53 -53 matrix scale makefont setfont -<59> -show -526 1107 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<466C6170732075702031302064656772656573> -[24 7 21 21 19 11 21 21 10 20 20 10 21 21 21 12 21 21 0] -xshow -376 1204 moveto -(Helvetica-iso1252) cvn findfont 53 -53 matrix scale makefont setfont -<53> -show -526 1204 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<4465706C6F79207370656564206272616B6573> -[28 21 21 7 21 19 10 19 21 20 21 22 10 21 12 21 18 21 0] -xshow -376 1302 moveto -(Helvetica-iso1252) cvn findfont 53 -53 matrix scale makefont setfont -<57> -show -526 1302 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<52657472616374207370656564206272616B6573> -[27 22 10 11 21 20 10 10 19 21 21 21 21 10 22 11 21 18 21 0] -xshow -376 1399 moveto -(Helvetica-iso1252) cvn findfont 53 -53 matrix scale makefont setfont -<4C> -show -526 1399 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<43726561746520612064726F6E65206F70706F6E656E742061697263726166742E> -[28 12 21 21 9 21 11 21 10 21 12 21 21 21 10 21 21 21 21 21 21 21 10 10 22 7 13 - 19 12 22 10 11 0] -xshow -376 1497 moveto -(Helvetica-iso1252) cvn findfont 53 -53 matrix scale makefont setfont -<51> -show -526 1497 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<51756974207468652073696D756C6174696F6E> -[30 21 8 10 11 10 21 21 10 20 7 32 21 8 21 11 7 22 0] -xshow -376 1676 moveto -(Helvetica-iso1252) cvn findfont 53 -53 matrix scale makefont setfont -<3F206F72204631> -[27 13 27 16 13 30 0] -xshow -676 1676 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<48656C70> -[28 21 8 0] -xshow -376 1775 moveto -(Helvetica-iso1252) cvn findfont 53 -53 matrix scale makefont setfont -<4632> -[30 0] -xshow -676 1775 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<53657420507265666572656E636573> -[25 21 10 11 25 12 22 9 21 12 21 21 18 21 0] -xshow -376 1947 moveto -(Helvetica-iso1252) cvn findfont 45 -45 matrix scale makefont setfont -<56696577732096207669657720627574746F6E7320617265206C6F6361746564206F6E20746865 -2050439273206E756D65726963206B6579706164> -[29 8 21 30 21 11 23 11 21 9 22 30 11 22 24 11 11 23 23 20 12 23 12 23 12 8 23 21 - 23 11 23 23 11 23 23 11 11 23 23 11 28 31 6 21 12 22 23 35 22 15 8 21 11 20 21 - 21 23 23 0] -xshow -376 1952 1116 3 rectfill -376 2130 moveto -(Helvetica-iso1252) cvn findfont 53 -53 matrix scale makefont setfont -<4B5038> -[32 32 0] -xshow -526 2130 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<466F72776172642076696577> -[22 22 12 28 21 12 21 10 19 8 20 0] -xshow -376 2227 moveto -(Helvetica-iso1252) cvn findfont 53 -53 matrix scale makefont setfont -<4B5032> -[32 32 0] -xshow -526 2227 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<526561722076696577> -[28 20 21 13 10 19 8 20 0] -xshow -376 2325 moveto -(Helvetica-iso1252) cvn findfont 53 -53 matrix scale makefont setfont -<4B5034> -[32 32 0] -xshow -526 2325 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<4C6F6F6B204C656674> -[21 21 21 19 10 21 22 10 0] -xshow -376 2422 moveto -(Helvetica-iso1252) cvn findfont 53 -53 matrix scale makefont setfont -<4B5036> -[32 32 0] -xshow -526 2422 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<4C6F6F6B205269676874> -[21 21 21 19 10 28 8 21 21 0] -xshow -376 2520 moveto -(Helvetica-iso1252) cvn findfont 53 -53 matrix scale makefont setfont -<4B5035> -[32 32 0] -xshow -526 2520 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<4C6F6F6B205570> -[21 21 21 19 10 28 0] -xshow -376 2617 moveto -(Helvetica-iso1252) cvn findfont 53 -53 matrix scale makefont setfont -<4E> -show -526 2617 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<436861736520706C616E652076696577202874686973207669657720627574746F6E206973206E -6F74206C6F6361746564206F6E20746865206E756D65726963206B657970616429> -[28 21 20 19 21 11 21 7 21 21 21 11 19 8 20 27 11 13 10 21 8 19 11 19 7 20 28 11 - 20 22 10 9 21 22 10 8 19 11 20 22 10 10 8 21 19 21 10 21 21 10 21 21 11 10 21 21 - 10 21 20 32 21 13 8 19 11 17 20 19 21 21 21 0] -xshow -376 2788 moveto -(Helvetica-iso1252) cvn findfont 45 -45 matrix scale makefont setfont -<4A6F79737469636B20427574746F6E73> -[21 21 21 21 11 9 20 21 11 28 23 11 10 23 23 0] -xshow -376 2793 295 3 rectfill -376 2959 moveto -(Helvetica-Bold-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<427574746F6E322028746F7029> -[28 23 12 12 23 23 21 10 13 12 23 23 0] -xshow -676 2959 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<53656C65637420776561706F6E20285369646577696E646572204952206D697373696C65206F72 -2032306D6D2063616E6E6F6E29> -[26 21 7 21 20 10 10 27 21 21 21 21 21 10 12 26 7 22 20 28 7 21 21 22 12 10 10 28 - 10 33 7 19 19 8 8 21 11 21 12 10 21 21 31 32 10 19 21 21 21 21 21 0] -xshow -376 3043 moveto -(Helvetica-Bold-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<427574746F6E31202866726F6E7429> -[28 23 12 12 23 23 21 10 13 13 13 23 24 12 0] -xshow -676 3043 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<466972652073656C656374656420776561706F6E> -[24 7 12 21 11 19 21 7 22 18 10 21 21 11 27 20 21 21 21 0] -xshow -376 3343 moveto -<41434D20666F7220554E495820616E642057696E646F7773> -[24 27 32 10 9 22 12 11 27 28 9 26 10 21 21 21 10 37 7 21 21 20 27 0] -xshow -1257 3343 moveto -<3131> -[18 0] -xshow -1962 3343 moveto -<30362F31302F3036> -[21 21 9 21 21 10 21 0] -xshow -grestore grestore -showpage -%%PageTrailer - -%%Page: 12 12 -%%PageBoundingBox: 0 0 595 842 -%%BeginPageSetup -% -%%EndPageSetup -gsave -[0.24 0 0 -0.24 0 842] concat -gsave -376 348 moveto -0 0 0 setrgbcolor -(Helvetica-iso1252) cvn findfont 45 -45 matrix scale makefont setfont -<5261646172> -[30 23 22 24 0] -xshow -376 353 112 3 rectfill -376 530 moveto -(Helvetica-iso1252) cvn findfont 53 -53 matrix scale makefont setfont -<52> -show -526 530 moveto -(Helvetica-iso1252) cvn findfont 34 -34 matrix scale makefont setfont -<546F67676C65205261646172204D6F646520285374616E6462792C204E6F726D616C2C2041434D -2032307833302C205354542C204853492D6D6F6465292028616C736F20427574746F6E33206F6E20 -4D6963726F736F6674205369646577696E646572> -[16 17 17 18 6 18 8 22 18 16 18 10 8 26 17 17 17 9 9 22 8 17 17 17 18 12 9 8 23 - 17 10 26 17 7 8 9 19 22 26 9 17 17 15 17 18 8 8 21 19 15 9 8 22 22 7 11 26 16 17 - 18 10 8 10 18 6 15 18 8 21 17 9 7 18 17 17 9 17 17 8 27 6 15 10 17 15 18 9 8 9 - 21 6 17 17 23 5 18 17 17 0] -xshow -1980 530 moveto -(Symbol) cvn findfont 38 -38 matrix scale makefont setfont - -show -526 583 moveto -(Helvetica-iso1252) cvn findfont 34 -34 matrix scale makefont setfont -<4A6F79737469636B7329> -[16 16 15 16 8 7 15 15 16 0] -xshow -376 674 moveto -(Helvetica-iso1252) cvn findfont 53 -53 matrix scale makefont setfont -<54> -show -526 674 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<427265616B204C6F636B202D2D20747261636B206120646966666572656E742074617267657420 -28616C736F20427574746F6E3429> -[26 11 22 20 19 11 21 21 18 19 11 12 13 10 10 12 22 18 19 11 21 10 21 9 11 8 22 - 12 21 21 11 10 10 22 11 21 22 10 10 12 22 8 19 21 10 25 22 10 9 21 21 22 0] -xshow -376 846 moveto -(Helvetica-iso1252) cvn findfont 45 -45 matrix scale makefont setfont -<5468726F74746C652028666F72206A6F79737469636B7320776974686F75742061207468726F74 -746C6520636F6E74726F6C29> -[25 24 12 23 11 12 8 24 11 14 10 23 14 11 9 22 20 21 11 9 20 21 20 12 30 9 10 23 - 23 23 11 12 23 11 11 23 13 23 12 11 8 24 11 20 23 24 10 13 24 8 0] -xshow -376 851 834 3 rectfill -376 1028 moveto -(Helvetica-iso1252) cvn findfont 53 -53 matrix scale makefont setfont -<34> -show -526 1028 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<46756C6C20506F776572> -[23 21 8 8 10 24 20 27 22 0] -xshow -376 1125 moveto -(Helvetica-iso1252) cvn findfont 53 -53 matrix scale makefont setfont -<33> -show -526 1125 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<496E63726561736520506F776572> -[10 22 18 12 21 21 19 21 11 23 21 27 21 0] -xshow -376 1223 moveto -(Helvetica-iso1252) cvn findfont 53 -53 matrix scale makefont setfont -<32> -show -526 1223 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<446563726561736520506F776572> -[28 21 18 12 21 21 19 21 10 24 20 27 22 0] -xshow -376 1320 moveto -(Helvetica-iso1252) cvn findfont 53 -53 matrix scale makefont setfont -<31> -show -526 1320 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<466C696768742049646C65> -[24 8 8 21 21 10 11 10 22 7 0] -xshow -376 1418 moveto -(Helvetica-iso1252) cvn findfont 53 -53 matrix scale makefont setfont -<41> -show -526 1418 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<546F67676C652041667465726275726E6572> -[19 21 22 21 8 21 10 27 10 10 21 12 20 22 12 21 22 0] -xshow -376 1589 moveto -(Helvetica-iso1252) cvn findfont 45 -45 matrix scale makefont setfont -<4E415641494420726563656976657220636F6E74726F6C> -[30 25 24 28 10 30 12 12 24 20 24 8 19 24 13 12 20 23 23 11 13 24 0] -xshow -376 1594 437 3 rectfill -376 1771 moveto -(Helvetica-iso1252) cvn findfont 53 -53 matrix scale makefont setfont -<37> -show -526 1771 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<526F74617465204853492053656C656374656420436F7572736520506F696E7465722028534350 -292032302064656772656573> -[27 22 9 21 10 21 11 27 26 9 11 25 21 8 21 19 10 21 21 10 27 21 21 12 19 21 11 24 - 21 8 21 10 21 12 11 12 25 27 26 12 10 21 21 11 21 21 20 12 21 21 0] -xshow -376 1869 moveto -(Helvetica-iso1252) cvn findfont 53 -53 matrix scale makefont setfont -<38> -show -526 1869 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<526F746174652048534920534350203120646567726565> -[27 22 9 21 10 21 11 27 26 9 11 25 27 25 10 21 11 21 21 21 11 21 0] -xshow -376 1966 moveto -(Helvetica-iso1252) cvn findfont 53 -53 matrix scale makefont setfont -<39> -show -526 1966 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<496E6372656D656E74204E415631207265636569766572206672657175656E637920627920312E -30204D487A> -[10 22 18 12 21 32 21 21 10 10 28 22 25 21 11 11 21 19 22 8 17 22 12 10 10 13 21 - 21 20 21 21 19 19 11 20 19 10 20 9 21 10 32 27 0] -xshow -376 2064 moveto -(Helvetica-iso1252) cvn findfont 53 -53 matrix scale makefont setfont -<30> -show -526 2064 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<496E6372656D656E74204E415631207265636569766572206672657175656E637920627920302E -3035204D487A> -[10 22 18 12 21 32 21 21 10 10 28 22 25 21 11 11 21 19 22 8 17 22 12 10 10 13 21 - 21 20 21 21 19 19 11 20 19 10 21 10 21 21 11 31 28 0] -xshow -376 2235 moveto -(Helvetica-iso1252) cvn findfont 45 -45 matrix scale makefont setfont -<5472696D> -[21 14 8 0] -xshow -376 2240 79 3 rectfill -376 2409 moveto -<5472696D20627574746F6E73206D6179206265207072657373656420756E74696C207468652064 -657369726564207472696D2069732061747461696E6564> -[21 14 8 36 11 22 24 11 10 23 23 21 11 35 22 20 11 23 23 11 23 13 23 21 20 23 23 - 11 23 23 11 9 9 12 11 23 23 11 23 23 21 8 13 23 23 11 12 14 8 35 11 9 21 11 24 - 11 10 24 8 23 23 0] -xshow -376 2592 moveto -(Helvetica-iso1252) cvn findfont 53 -53 matrix scale makefont setfont -<4374726C2D536866742D55704172726F77> -[36 12 17 10 16 32 28 13 13 16 35 26 33 15 15 25 0] -xshow -826 2592 moveto -(Helvetica-iso1252) cvn findfont 34 -34 matrix scale makefont setfont -<466F72776172642028646F776E29207069746368207472696D> -[18 18 10 22 18 9 18 8 10 18 16 23 17 10 9 17 7 8 15 18 8 8 11 6 0] -xshow -376 2689 moveto -(Helvetica-iso1252) cvn findfont 53 -53 matrix scale makefont setfont -<4374726C2D536866742D446F776E4172726F77> -[36 12 17 10 16 32 28 13 13 16 35 25 35 26 33 15 15 26 0] -xshow -826 2689 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<4166742028757029207069746368207472696D> -[26 11 10 11 12 21 21 12 11 21 8 10 19 21 11 10 13 7 0] -xshow -376 2787 moveto -(Helvetica-iso1252) cvn findfont 53 -53 matrix scale makefont setfont -<4374726C2D536866742D4C6566744172726F77> -[36 12 17 10 16 32 28 13 13 16 26 28 14 12 33 15 15 26 0] -xshow -826 2787 moveto -(Helvetica-iso1252) cvn findfont 34 -34 matrix scale makefont setfont -<4C65667420726F6C6C207472696D> -[17 18 9 8 9 9 18 7 6 9 8 11 6 0] -xshow -376 2884 moveto -(Helvetica-iso1252) cvn findfont 53 -53 matrix scale makefont setfont -<4374726C2D536866742D52696768744172726F77> -[36 12 17 10 16 32 28 13 13 16 36 9 27 27 12 33 15 15 26 0] -xshow -826 2884 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<526967687420726F6C6C207472696D> -[28 8 21 21 10 11 11 22 8 8 11 10 13 7 0] -xshow -376 3343 moveto -<41434D20666F7220554E495820616E642057696E646F7773> -[24 27 32 10 9 22 12 11 27 28 9 26 10 21 21 21 10 37 7 21 21 20 27 0] -xshow -1256 3343 moveto -<3132> -[19 0] -xshow -1962 3343 moveto -<30362F31302F3036> -[21 21 9 21 21 10 21 0] -xshow -grestore grestore -showpage -%%PageTrailer - -%%Page: 13 13 -%%PageBoundingBox: 0 0 595 842 -%%BeginPageSetup -% -%%EndPageSetup -gsave -[0.24 0 0 -0.24 0 842] concat -gsave -376 422 moveto -0 0 0.50196 setrgbcolor -(Helvetica-iso1252) cvn findfont 68 -68 matrix scale makefont setfont -<54686520486561642D557020446973706C6179> -[38 34 34 18 44 34 34 35 20 45 34 17 46 11 31 35 13 33 0] -xshow -376 500 moveto -0 0 0 setrgbcolor -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<54686520486561642D557020446973706C6179202848554429206973206120636F6C6C65637469 -6F6E206F6620696E64696361746F72732074686174207065726D6974732070696C6F747320746F20 -666F63757320746865697220617474656E74696F6E206F6E> -[24 20 21 11 27 21 20 22 12 27 21 10 28 8 19 21 8 20 19 10 12 27 28 28 12 10 8 19 - 11 20 11 19 21 8 8 21 19 11 7 21 21 11 22 9 11 8 21 21 8 19 21 10 21 12 19 11 10 - 21 21 10 11 21 21 12 32 8 10 19 11 21 8 7 22 10 19 11 9 21 11 9 21 19 21 19 11 - 9 22 21 8 13 10 22 10 9 21 22 10 8 21 21 11 20 0] -xshow -376 556 moveto -<77686174277320676F696E67206F6E206F757473696465206F662074686520636F636B7069742E -20546865736520696E64696361746F7273206172652070726F6A6563746564206F6E746F20612066 -6C61742070616E65206F6620676C617373206C6F6361746564> -[28 21 21 10 7 19 10 21 22 7 21 21 11 20 21 11 21 21 10 19 8 21 21 10 22 10 10 10 - 21 22 10 19 21 18 19 22 8 11 10 10 23 21 21 19 20 11 7 22 21 8 19 21 10 21 12 19 - 11 21 12 21 10 21 12 21 8 21 19 10 21 21 10 21 21 10 21 10 21 11 10 8 21 11 10 - 21 21 21 21 10 22 10 10 21 8 21 19 19 10 8 21 19 21 10 21 0] -xshow -376 613 moveto -<6E656172207468652077696E6473637265656E2E204D756368206F662074686520696E666F726D -6174696F6E20697320646973706C617965642067726170686963616C6C7920746F20676976652074 -68652070696C6F74206120717569636B6572> -[21 21 22 12 10 10 21 21 11 28 7 21 21 19 19 11 21 21 23 9 10 32 21 19 20 11 21 - 10 11 10 21 21 10 8 22 9 21 12 32 22 10 8 21 21 10 8 19 11 21 8 19 21 8 20 18 21 - 21 10 22 11 21 21 22 7 19 22 8 7 20 10 10 21 11 21 8 18 21 10 10 21 22 10 22 8 - 7 22 10 10 21 11 20 22 8 18 18 22 0] -xshow -376 670 moveto -<756E6465727374616E64696E67206F66202074686520696D6D6564696174652073697475617469 -6F6E2E20> -[21 21 21 21 12 19 10 21 21 22 7 21 22 10 21 10 11 10 10 21 22 10 7 32 32 21 21 - 8 21 10 21 10 20 8 9 22 21 10 8 21 23 9 0] -xshow -grestore -gsave -readpath -V01770316B000446E057F00B008446~ -closepath clip newpath -gsave -375 1883 translate -3.12444 3.12571 scale -/DeviceRGB setcolorspace -450 350 0 1 psp_imagedict image -J23O/W"]jL"b]2#:hXAd)[hEh@M(SI<[AN=7H774jC17kO2kcD3>@cH-^%(Id[=XK>q247Ahs1HenI(2 -c=YP)`9r%:TMHt7qAfcs8#&sq[(8[]Pte2Ul;Y7kRCc>K#/Z"W&-7C%>D]o -0aO:5.h[b/,4VVUE\SVpa5aH3*/[B4PK>*`BhYg6/sT*VZPe/5CG_O)k;-i%icdSXcmP&,r=4HJUX>_+ -Wa.BL:8cSk2(G.pX&c:P.lA5&Ef48"=6m:&*K&$KZe6oGCJD+dDRE_$[i9bAROa,Af3>dfHj71e* -N^Y7UalJVA1o=D+QV++ffo3XV24@8%F.'C8s#luMkS+pM%Z*WL;<\d`MSWf/=`"pI_dRNJN'\m&MSu7:8A&[n*/mC_EVSmP7j=,;AF`;[AcFc_#-Fo(KWa'u@,D"^LjRaZ)\ -gT=N]<:]3o]%sO`M9WchE<'@Lp\WdM"*).cE;.RO)\n1Jj0?-'AkO50aQ52QBEKiNb(2i$E*,LL'aBCZ -@Bd7`7NiG#`F;\XUg>nrN^b8@\GUM9,EYQ.0DS#5<@aA.A^^C-`aprp9kMk"I"lbhS]RdlYQY4c5la\o -e+kR.O$9F=l-tT=2PF'K;;JgVR&k,c>tn7:+(,Im/hQ"T?udY843B?8u9uc[-E'+UJe)A.^a$) -@\H8nd:OL.rGj,iZ%*tj3/*q1BsCbl8E>q:1nIPnPtL/$fdq/$ -(mn"Z;d#(9+97;EB9=(=(39tY_WYt7m2h0STMd3Q\^^VP2k!^G2*/-GYuIi*lZJZXI_B0mf^'AH'pd6[ -[99VtRr,=aEO]9@pKA:-NDI/gWE2_Ep@f!2?nPB9`YT5&QX]KPgibn*/&^@dGC.iVP5kSJTPu5V/X6Ej -18.O34>I9LL;Mos8=UkI(5YAQEEL^k3>R]IU[gtbQ:E9dasD(RCoUblQcu<_8VGf12k&#>F/eNgIlsB" -W&.*e)ML_VdV/9QD)._VW7.X6..h*X=H#d$0^o6h[ooh5/2cYYP'(<@`U,Q&"h%'<[p5q5$Ck9!GeDn: -GK]CMs+%oCY]rho)\7G0ii\N7[=3[-aMos^*1_u=."D:?9Vu#D"9=$/TeNu-1)17S6fLr+UdcjJMah1g -\@cuB*f`bO;Aga39d>kDA8lesZ;E9?9P)Ra*5YW5ND/:bH0!O84e>++'Vp=N!GXN=>5cn+"Q7-lf\O*FNjYgmSHIH6.fPXZ('[GB4WSV(0qrRPMJ&#H2=?IoH%>Vl2EEKjo -iuM+?8LSd#Ku1rLbJ4u\#TOH_b%7lOn0f[d'af[]@F0fe+sdPQ`ZjrOZuRrCNQ7hM#onCe,*PSDnu5u^ak[.K7?Pi.E;D]nQOTP9-hQ,P:6A5M<[q+G]5Pf'T3Ja/ -/p$otioPNuh:L9oKgR$Qk_qDI&;ilM -Z&$&-/KB_i@r^`AJk$oGaJ@6U4K;=2PY7inq/!o\17HF!o1?kK!Bct"Vt8PP"uen\;.?n94RR\cSl7ld -l:j;c5a0Wl[9BD%3DuMGVA4F%)Ri8>fP-S]rG&#oZWSl%qMi3:=.J*Df6Pp3j_U8bDjMDKrmQC\?#Z,: -D4]9f^>Nmq3u/nWO3-7!pP8o'PfePAi6Z^:-5?oC6Xe@:KLR7$MFCsX8/qsk)i[?t1&0g]4X#tZjO,JF -Q;]/r94a:^>fL&)QqZYk=iAa22kA6,PPOkUHUFH',JXXScB&$b;X)^->_\qKVUB#J(_pJE>,bN&FmA?L -@9fL,XHEB;JraZ2=mEFFrD'=p[Ti1MH^2n:H*cA,='?=T"bFNfVDdbZ_\$mmg2U0:bnhU]a]%X%](>t' -!eIYFCoAj6#6]ZGi:+fe.M2r@`8FK@1gV1@N5m.TkhLVK+HaM_nnC4\;_"'U-*lc__IG?hbpKaL']MJ@ -P"t0rao)!f4e^4NPU\7/O%Q0G.5]aa3hoNNe*==j[8KL/S\o5aqXd_f@?FW#d/+PubmCdIC_?Pe,0OZ% ->-8YL*N&"D\(`R&X6aTqJ\Y5===VT?Z&5UB0f[q54!T[*A+I0(^.n[OAMToT8/rBVb(%:eOP"Y=+VBQ! -ifR?M?83=W7%hr[9R73mO@\F&=VR;r-^@;8P)4:`?S.X=k#5EAhJ"s=:1od$o]gujT[2h$=s*m/18Fmm -e@A:7"]1$Z8k%Si\pje^n>X;//f$)KYjF%aDS`3.+aQ(5bQ@;4-ER4WBI&A.gm:Q:!$_8gMiQA?K2fQqM$Hq39HE -.f`=W'<.MqD*FH8V]Z&@ZX*".Mr![qH,&5j -([MVF#DU'(0Y!W:.iXGfipo(qQ9gdVbN9oXp_42E"bT,"&=?EL)$XY-fhhI&67!A(7H/oNF[9Pte('l'2Tu7]B=e<3$a; -c!Ie`Y#jp#gD,ajA[>P,(77gB[r&QXlk^%P`p%QV>d"rJc//,A^0g>R)tjX?K>V,;(edsP(Q"7-Z5FXJ -:FTenjmeE:>:Gg=JjA7uLcd-r%"uN,E9N6I-P)*QU1[C/#J18>]:[Du,GcVc9\HWqD7oC:@HNf;nTP`B)%6ZIA1691>;u -Cpi$"]2S0rX/UW^u96WCec07@E.?4q$`9Um>AgCZFPbn.?r#,5p1,K6lm'I -L-f=Q\9(1`'8OP9;.ub32&VED,LO%!G!R@88RsT%,^o\CQ:RjWBk4qV1QtNZ'3W91#r.^j=],t^T2;6ik]e6P?lrI=RIa_nj9.dUkVep -S5?,*3R&J#-BHI91eMU+SOf\YWV&lC!_HLXeS93Kh,:jcYgi#>lQo`@BXHKqG0=a6hf-*\Y'$3kNpgPl -?)Z<\okMTk^J_6p9AUT[Lr/.jom@c,q]il8np%7;M]ime5N#54>:Kp`K#-DBQt.B]$\uW/&NH"U,8Z5, -,12e=DESo"7q=@M'FIP^K?<%j=]Dh8/WiY:;]-k3*AEsW,]gNGp2`Hi:aa`&I27f4Uf(o+\n*dj:SH9O -V[6.LU*=aW/OIt'T9r*0j*4?3?!q!,P!8TP!^OXae^bL ->b5.?J]aBZ$"V%_%t`&'Fdh,q]3;C;+Os!t -.W5Q]5qDX*'lqiA\(E;klA_7uG.ZTa2lk3Kqf';TYOkIuD[Cr]eaW>b%PniZ`T+6a%%][6P07DZ%&R5Y -"U'Cm@1[Z_)Arj9_VrlZKMEU(M++/$Ggp=c(lq/HchS98$R:g)A.[u^MGkpi6R?[HCjo_IRn[N/8^uU@ -3LS*)'H.\rM++1:knKRd/n7#A:T>)^Ps2*COATZ]\tkWp'tX@$_dg#UD&,cET%@\b>OC#]D9h*^ -\Qr^QMhNde>.i:dfGhfe$$N1SnJIcs0,['l@;pJhQ:EBcb@L25#$WOA!eN\qY_YCk%1Ip-@;tFh673;$ -`1kXM]P95BLVMm>M%"8j*KeI>ZABj,:Fh,hht#HZZ=bVT9W#.Q]]s>rSBkhhl4!fM5GHN'e4MkR8M?si -WV$UX8uGXgeZ/;"c"a:NY0nim]*3MuA?jgha/" -!L1`<^n?cK/0YT3K0pe9fN^H^&;eo8nF0rFK/b$O2'h?q39`Q&=PiH1E#Q=#s4d+kL1=a(4f&O -;Q1AAFZ,peWDi)))PpcB1S*+_Q.kn[_-sTNm$:j5T$_#K>@I\T1*N('Ca^jt1>;ePt!+iI(:adS!$ODC%T[:bR2AZjZ`$00qX@b&YMoMMHaM`B`+-+Df -E[`Po:F)/rV)$.t\lCGMb[pApXL\?jREh\Y\YT(K5b:fMoK!EoO%,qmBlo5D.[s84e=]`tX]ho1XOaFp -b3aMi@'J:bFip7ESS5@`XObQh[b#E,gb*dIXig$-WnoCQHgT8[I)"UD3(sMq#D^1:/==Y!4!0R*fPt%f -:0S@cH-^%(Id[=X6s"B\\VGeA. -Y&,tac"@^#eFmrJSkpfa)C5lQ6DRIm1jW,%?VdV"C/matFhRCc>K#/Z"W&-7C -%>D]o0aO:5.h[b/,4VVUE\SVpa5aE@r/sJqONJg]WB@=^/=4PW1>/27Bel.&-M+4DnoHsbc_rZ-*<(j_ -KLmULWa.BL:8cSk2(G.pX&c:N..sSdDN.o)f;pja*J2CBZJ$l'X#733D2hG1pFCC7f6+X[Y;_BqhYVW6 -?SD*k`Y/`7_rRiOjNko4G)#TCm-^Mkd+:P,O.Kos+_-mn"<#QV\L;Mos(`WH'&r4Hcd?oT)0cZ0C -A.eVOH:]9CaQ1d;7'9<;PtRs:q38m50Ukbuo3'$"FZl8@jY9@B%Z*WL;<\d`_dRNJN'\m&MSu7:8A&[n*/mC_EVSmP7j=,;AF`;[RStc&bGA,D -CbbrHRa%`$M9P7/4J'lsoEl$7LHCo$V=]%m,*tp!dV8?rKfYu.WR\"KMQLKo>-?I-ot(ZZ`F,t(XL=$5 -Wm>IfgF`-bNOJ"VU0XqrMp:P]6+U=(([MV6#CjVKYh2W5.hdl[A$L:VDF5e7b2dU=8-:<*bCMr%E*,LL -'aBCZ@Bd7`7NiG#`F;\XUg>nrN5+E#q#lF@,EbW/dWn6X<@aA.A?j4o`]#Z?9]jf,`6rceS^(l3q=Or= -6_I:)<*D^3Pt%WKBsbHo7\NbYeS8*!V-^Q4Y#[('])?fgA$K0Q2L?aEbt+1*D:\T<`oS_Yh/-5?:$1hh -]O('Yg]d9QJ&1&^R!^e>$]Dr50j*4c5:)?4?LE)d_u]l>J\`J5BKRIP$AHA?bbeSo*ta;sU9R8%:,/%C)n@R8>Xb6[$lCuTh_Q: -.WoKk@]NY4euQ4$rF-^TZ.U\:CH\E@$*RCs[`a)NiGQ0]/pD)rip1m%hQOE3rU0i;_-esACb?q=MSnHD -1)j7],Eg11/9osa1'#L/18%H7*#9+kKgDDoQu"Aq&Vrj6nQ;#Z.2Rt5A!)T>DEf/'8E'T9u+1!%:Z2]n($,]Y=bL/0(Z8Yn2a>e3ohQHWq3.BLs91Ru^f;i0<+ -HU+0!Vsqb*)NRFbd]%?2D*":cW77hi9!(".=J45YFfOhL^K[qoXB#]LR`fBM>-.G09sWYo\D(nF$`2#3 -Ge;h8f?;G4McRXOY]rho)Pqr%hm%CJ6t-`fHr_O/ -MFHQ&R,h^>)ir$M&igYl6RS$h,gr)kY$ENE94fsTPh'OdJ'M\*\`EI45G1hd<&u<@NCTd@-M'9/g7(a5 -<,*./I9*1FW`A@bRcS"l>HcXp(-<7s_e68Y/Cp;%Y2*j&>Ac@rQ.G1VUu$#k]B/bb7_@IF=)8o_$&?E- -E4EPM1DPnjA+EagVFN/#bJ0!'+KZ5U+lqD4t@8(73_9#b]5EZNQ:(b#ongjs-(SO -19"Na>:u8d-8R*@dVCb-8RsWV,jo_9T?jGlg)U6O6DDmVoVsc(P>.n&W\k-S5-%S^<@[[Ac#U'qXk2mI -$QY,J@C+W=(2HXMf4(6)/iP;Odd&a!>-Bj=e`-=P^=GOd-p@n;KYl_'&I^96%9CJYn9:seO""keAY9I? -;^qqRJ\bb+GZ5S!$&6=Ud27O3*u0W$U60]MAiU]h7cX$l"HGnsONHRHM);)4/!il*'%r5XAMooNk&Zrt -l>\nX7j%@A'b6'hUJ^7iRT1u.9rCqT'T(pHIoN#ilID?*DR!HK7)0QT21u!?Ysb[UMbO-%=16`Iela<5 -]`PXu/%;"%f(FF(hf'D0(&J;g_Vjq9S45.BNPJM6)'"r<.@$f@0i/'Y.?ssd5iAl&4=UdKKYq5;k_qhU -%uS<"d7Cob1E;?DUN-(qJk%#F!$q&J3!*#,M+XV-WJnP)175uACoOLj@5jXu@WSI^iaFg?d&5=&V#H9F -T?cM^q(5(6:o`$FeOmMiZWsS5X*+:+K#_?+fPL7S7@M\A[G.fb$Z%-hFLp;2pP[;]pO'^4YP8M9$O;$f -gp$Qi9ue!)`T+56$08[e8Y"8.q,d_JQHFb6J.QrV*Y\U+_I4!8CdJ@6LI37^8=VjQ)N)KY0keLC(DVbI -A'uegQ;n`daCV[QAB%n1QqZYk=iAa22kA6,PPOkUHUFH'-raA=*gK3l;JEMLF[i''Vq#N^C8G7E=ft3N -p%noI`FH2VCtA_r+m;B1M\Qs)3H_o`hH+m0"GPOp]8Jf1gn@1S;E^,)nd8%gmqV+Y_PR3[52m_r@pLZr/OqN5m.TkhLVK+Haa@Z5Gcf;'qON-$&6L_HSa]bbh^< -]ZtRCJ'TLKl2:[96D;dTZt_`JP=h[uk7_R[3hoNNe*==j[8O23R"-]m]''2+@#.qH(0HQf1M=)4D0>'M -]#/KrZE97i[;N6q]\b4uleVR;JAL0J\/[[G&Ve6a0mN%alC!gWjYFA_]d+)qiUL$7=t(8I7UqR:oPQl6O@\G1=U^ln.$I*8'%osc!`.8&D -]\Dh_$oSn6KZ.BiGackq=[f,Qk`cE\7[X6f17<)0,RotVQhQV4J()I:3`8WLrHu:GTN5t"b -3D>,:e!PYMi(uBY((CM%6=E^#A2YG=K!Le\W0C1-'oYTA;/#$&3ua5OA.gm"Q:3-`8``j3?[QcitS -3L&*)2k!Jge!]:bI6+#sBJ]Fb)G^[5;J;<+*B'0XVGlb[)Pod&;leGa'tVq=ZX9k;/(PXcNkH"2>&@

FiduGIq1!\%BWMoe:sDW>GIYq[Itl@<"8S<]:nW`T2$l/;?oLDp1Hgn0f7h$O27#+Y]j" -1)g^V17;sWN(tZ5MoDGG=PR@G)NMl`ngO-n6R@l:V)!m4Sm*\29-s0YN7),mREam#M;7BC3L^!s1WfS* -%7?/mB_1Lh&sl@je1$Y4I86P:X4=7.>2-?L.p+#`u_e#pem5D"NZJ09+_lWS_2:BNf\_XGJMr!7e -:nW=lPP?0XPCC>W0_h^"0,';bj0CZ"SjOrib2sfTVHYMR"G+Bt&3'M>)%D?giXm#l:+6p97H4uIe4LAY -O%3^lGnb]t+d,FXd[;Yh;(Ru*AeOp(\nNmfbi[BB`9qP,SPQ/Iq@s3.!2EEU'Uh/tI1N2OiDCMA:4ZED -gC8VNA[5J*G+1@hd;-3p,Bk)lcKTJ`7P4>We`Q[E^L$C'g]e8m32K:4=I`AD=U`0l -C"ODk'.8j`Ab+1P;_=79JjA7uLcd-r%"uN,E9N6I-P)*QU@^c_pCB%17kXe7[0gJ;T2V]=.eRPt!k2F7a=EPa%>r,2QVOWi -Rmj?^CUDhJp?R^HkA\";Y.'>&lKru3hdeQ;%LWMp_VqC/r([&)HcA?j=KHC5,F"'e@!Qu!.?r#,5p1,K -6lm'IL-f=Q\9&ho'8f4fdQHEc(TTD,a+qG$56Qn/9>WO)@M8S>X.'ul* -)N;]]&a8#!4!9[,Up:k#OtZm$_rY847%.%0R*?riL]$.Q3L`_*P?I8SImTc)-o>*J)O!^gdHS$->:R)9?+T'8\_HP]-ks6s/A#1?oh,2W"+7rBYZP-W)\\%H -iUOFZFu(3oZt2#'Cqa?Ys+*GnOB==\&HcT"fhf1p1*$s_7,dZ`hLl%b]YodON8\eq(.Ct,a6BI1YLop79*Ld)B7#!S'bo64:V;cLpb)RprkWX'9C/o13kFR7k^*W1>,@"'G:WSKL+QnBOiG/$\q,Z&NG/= -,o2A,i_T@1G!-q/87YUY,aM.PPY,Lb\K#'a)N;mOo-o@q\`VZN17WjR07DS95X=)9bk'pcsSZ,Ymfb=.lKDR`ng;k%(Dm#b4(/&rT1&nYjZP0cl=pj0At2MG#+V -aX%R69X7_2J'95q.@eh%2Ohu>1TB1#HTn(HjjL.K[Y[>FdO=af1g5GbV:'(C)P'3q;PSam1+L?HX]2@R -/+tDt#/acRfr[.om -&,6hK#0LM_T[8KW-5d2H6D>%DN'8O&MFHNER'^T_)imL"&]k`97j4$ejO0GIY#-a894eh4Pe(Q`R`spC -RDeN34e5-:PSt8HM++1:knKRd/t#G1cfu1dN;BANW`A>,R^Hn8>H_+?J.!("_uQrClh65?EeS8;>&G+f -NP=Ls\m=`JS$hPOHbWp"eEdq]$&-9*l1`D%rtg4*j7/NWG"QCYZ<6Z/##d+=!eN\qY_YCk%1Ip-@;tFh -673;$`1kXM]P95BN(9X_q!%`,*""fb[JO(Dt=@=2F#)5HQYdedE+VTXM@Spg7?8WU\7O-K9j_q_8DRV^8k4*f1heuT^jo5L8K[k%oHq#IuMlB_0=R7(2-'?>Y -13m];!L1`<^n?cK/0YT3K0pe9fN^H^#671:&SQP)-if1DUCl/VE^Ln180i4i/>>]cPKMuBaaC[0/Xag0 -P:*W9j=05M=Q&>6P^Kn'Glr)I^T$_8[>4%X1FhZgS\QnPVfN$eq$*r3%Q:pW5 -1N\3+0UM\pqStq$@^,W47QVcQa^ame*2['p!+dq=:adS!$ODC%T[:bR2AZjZ`$00qX@b&YMoMMHaM`B` -+-+DfE[`Po:F)/rU!NON\mI.YbbfGQXP.SPSBe$RaeK#ub+I$o'Ik[IO$f11V)6;"3gWX>e1,SjX[]Kn -XAu;Ya[cKJ>CtJB()k_l]4\G'/U"13VVc4">HTnXS_E1M]&%?!X6oKXE1Z!lGYB_/%m$I`EEL@Q.fk+4 -jK^d>L0H$lJ23Nd\.fP\"b]2#:hXAd)?>R[iR'WL5QMLV6XqiAe93hoNQ>VX.0PZ*-'UtI;L)NE=YH+8 -A[=CMdUb;+:$5GhjQ:eNT29283W0_I7\WcE;)eG3SPQ1`C/mY[$m#W[LVmS?\@b9e'og:EnlY7Tg:N]q5TfJD*"iV`K>Jcc -W*D(s%UcQ0;$`CU-PhTZ,*Ah:DBd57ZD6t."H#htPK;i@BiLg./sa^-P:1MO?R_FcnR9$08.^b_YC:d`Sf'G9['nXJl#N^s0/orf -o)!mN_rEJq*X`>r_o1uQWk8gY#00!6GANjD.sK1u+:P\W.Kos+_-fM6<#QV[K>ZZPpeV#:'o,5P&U;f; -3>dfHj71e*N^Y7UalJVA1o=D+QV++ffo3XV24@8%F.'E#EBBdgBG8N&reEe6;+oHfaZ(_FJVkf(OO]pq09YKicgn%rqh&Z@IVp>/h[fq -`FEp*r0BDnOilbUcj!]'PlcP&i38#".Lcf>_dRNJN'\m&MSu.WLs0Tm*0/(7nd,_^7jO8>V"+-d)3l\; -9'*AcI*,_OR*B5aC!<_3'T#U5oBH`61H^[p@h]7:.[*Q";e^@=NC'O=Wmn'!9"[[q>c^liJ-tsaZXg=D -Cj'SgU=X%dg9&rLIELSl\6Z7]H`c<%HG86SpWNg;P:4<,YkX/P.SDglj0?-$`_.C8_<%b_BEKiNb(2i$ -E$tQ1'aoa_T[sNCp!El."@M2Pj?MdjimO`Bpb3SCHlTqZV_nA$T6RepBafN68P4/U#m&^?'7D>].#4 -[H@"#XOcI:g[$u3K>1c4fM"IE,r3F!0c9gh7h_*-AMRCn_uZ+FA\at#3%Q6a$A1\h0\BVk,7o^Liiso= -;D/rIa!22[gjV=-OiX?()*F'Z-Bu\"Ep6Q?7fSn$-F7F!ic@/OcR6'`r;qUXb6[$lCu -Th_Q:.WoKR^0<=Ec0I-qUl'ppY?("tX$)WnB!fCi(@,L[g]4ifY.%';Y4HhM?8$NgmK339^YnT@9KjC/ -KuN%+R&iH/,Eg111:_,D-P -PfVnuGuVL\/"''XEuCe1D)n'1k7btep45H%9#)-Doc?=d!)b4e)J)+';5Vk.'hX`lYrIqJjL(GaI_B0j -f^'AH'pd6[[99VtRr,=aELPK3QWplSnThfSn!Df%rrE(V7%sB\-6EJL_dMmF];8RN0Z`%Oq-9e()ZXHT -R8>:W%LWPp_P#8s9K![sLr+ZS8:4Se(Pji@J-aAF0d)HGjAHj8RS,&l8u2$g9X8"XR*/W.q5i:e0U^4! -F"-28HU+4MVpn%lUK"3-8Bj?%=KL)SFis)t^L4:sfIUW7P0IREg9!9V7Cq)h[bNKZ -/$6h[E2^dX<4J3>omj%"C:G`&3sRs0@Nd_4/e]=baCDM99V*0+Q%1WX9XkcL#6fcHiD=2u-6!>J6t-`f -Hr_O/MFHQ&R,h^>)ir$M&igYl6OeOfAQ!4fSWt^l9.!RTUpb+rQcc4)\`EI45G1hd<&u<@NCTYG=NmdF -17(_6;sI?IV+.LaX&a!N]"N9p<1I'&[OJnMc"47b/QR-2o%.T:J1amuA]Omo[U*hf]>a@6IDB4O'H@SZ -%>D`.YkY:p/k8.G`b$(SN\`7!Ud-$k-l`j-#(sc90W853)\.YA+Uf,B.OPsg7ADSngg3&\O%1Gc.1DA* --BZF0N2Bf/="T_2VDAOK^2#Kn9d]J2bjoa;S^6K+$69J36)2gV'P^>tN1PqK[R -YL`%tlP5#lB!U,APaG1FcY^&DXu?`Z^?]gO>plj<`Bsme9r)me)"@hsZp?otIt1_dRO"gcd2r=2rrCEpQIq-&g#Vo+2+)/X6Bh5iAl&4=UdKKYq5; -k_qhU%uS<"d7Cob1E;?DUN'B5MFSnQ8Y`S9r1[7BQHEe0ab7681muUc;0a_DEBA`sVXrLF$@+Om;5j,E -9e)K'VUMO;$B7ZN_.,7#[jSHGa9ufrS54/Z-j/U0FQSqAmH9Ek:%=nd7PB7<&<7XtqTt -!s*M\?*Lht4t@)$`6)f(gg3&iP02j*of*'Q"Ts?B?qdG%.M3#@_Vrko9F`-QMF?IO#cqJg)2^hW;>B3i -73I`6AH?@k@SGQ"hMTm\Qs&2CSfn\H+mT.ps*_[kE0u"o-OksNfs-m&FtY.t -aiW9.5k,R;Aj=^0NF\ -bbh]a][CdXSBiR(k#=AP4e5FuFD:[pMb'\mWO%s4-=I+WbGo[+a9&\IVcDpQO9KO>?*7<]+)qiUL$7=t(8C17;sWjE`m0O[s#G#rIZ<-'V$`;V=aX=YQ19As56^b&K;/c0%u[r;M$hT>0SF -n-'kk8Y/Fci!NHOThhXcl8;2)`.5b&+BsV!F(;"[3LKCb..[N6)!o&"/?L;r` -p&>&D_-lc">W*Z8[pLh/=Nk)1)]F[riu)*f>:BP[Z'eE:,Rt1fK>O;.a@nJrb%7lQ0fYCq0,BMc@r[=c -C-*Q!aJ70T%$jC1Pfb:mH#0Kd/=4-6EqlHUDZ?0H^_=i>_LEo(!%68fN>d@#'lms)L[f'DH-o)4!Oi35/mFrD0PLZ5QubXOZ1 -O2g69E9gf%05?"mfhA=Y&dJSn6/bXRA0r6'LI>S`3.+aQ(1f_j;7OP^3>[cDJ.ai[Q:!!UaM8FFA=d'@ -QcitS3L&*)2k!Jge!]:bI6+#s,LeaOp4Gf0;<_%pALVc7CG3dk&*6D;tG0K/pOc_m/!!Z@RPlu_* -@.:*g1(b"M_r7hE'FlE)LrLVNW4["(*08.91"dOu8Ks>?,k@okZ;W??bGI'%;uUPjRnMp#.FcXg5+U%J -Zl/fLMaX>ekqm-T+dG!ae1*=*SPlLhX4AdYWnh6(^0oQo(&JH'a(DS[(bB9!WnD0rgb&7NFjf;m\_XGJ -Mr!7eHG.Qt0Y!MS>87jk;).inL/0=XbN0iTVGf)N"G+Bt&9q.m)$u&7iR&Kq:*14-7A>oh -e7L]DJ&gU_)#SP9(m@O&&kQ&o="0G.jjP)`c=&Pt9kP,beCo1.Le+HY)ANa=7AE`E'Ui#SR/^BoQo+Z! -6D[\^R)tjX?%C4qI&557u -)26+?EVS=D:F2:IjlN]Or!EZ2AMVq8BLEmT%#)Tm;$^u-*tjIM,4RY:=u@.Va.opGjGH/HONAd=BhXgo -.$dK%ZO)$%70K((VXoYgl?>@^c_pCB%/k(X@*pCP>!4@!9VbU;'ad)h!CpP&R8n"@?F*n=f;hpZm=rAb -ZIpf&4&)0oBW9_O1Dt>Xj)g^FDKfm@iqG%(h='llp$2X+_;VW.N$^%cMo=X1pumCo)^M"d1)Y<=.?r#, -5p1,K6lm'IL-f=Q\9(1`'8OP9;.ub32&VED,LO%!G!R@88>#Hu7&Es7Q:kf;q1Qb!1R_$MdcE73D`M%( -f?>-*!e3M1;!?+7"X\jn!)[E/MG",3b,/.Y+q\?!]RER"A.1DM`3h=SEZg%DiK0l9X<6I_D)NdOcXk1c8 -D*FLeWRHA4C5#aj<2d$:22]X]K#VA(R8o_.U;poS=9',+229e%Z.nYi$_b5+!b%3?d:e2QA&I4"UTobXX/fbO[7,dZE"SX4D'OFh7C$ -?a//_(0_NFa_%bZXIor4WIhrr19O\OS[R9q]j:!6],&g'M=s4Z2J0T'$Ue2^OO3"*E8IUnT-BuY!Ed;K$>qD>dVDCesg1N@5 -c6m\4llJ5NSB%QAl4"Yi8>/oF<17)RRo#t]UbS=?>-D&0euNr9mjkP%`VST1@kt8J4;H0KKYu`Q(hhbR*K/"tEd4[W1F\E9170V+'G(9MJ\bbkQt-gK$\C.% -CoERr-P_S/j&'LNAigrm87W>mr0BbuP"Fb5R:N$t/!n@"o/WV<%KMqmAoe:>[X0a%:ZtaB,mK8pUJbe? -\ihs::8UtT<>k`!s&>pblICc_B"MEQ=DQJ<"cgi=ZqMt#]4JG,Dn'%i=$*80m8d"5(&*u>R:s(E?n_9p --2qek?SHI:XA1DbLW&6j3@o>C%uZ4Y!"^Ib)3k8UJ09fL<#unZK#45.Qn1-=(5#!7&NF#n&K?PFj:TKR -MF>TuZD@&Z7&jHBQceGGl'0%t2O_o:Q1]Zs,-uH]?J:G.Cp3\!t(rZYmP90K:U)'+9Q4i\Q$[c=6$S'r/-nU -\'!gj$UqXq"9='?+E/Xi<6A?$ -R*DDtH.+4,bFVM-ZhbC@M*Rh4kk&%I/sT/,e*3,)F[i?/X&Q,7>!)_o?)bbWoIB6g\RDgFD"Xi/VV,Xl ->4)%Mm_^CHa5m)FZ]R$_h>^3n$n;d.iF2;==ZB!>]0t\G -lj_tYFMZq?\;Vab%u\Bd1&1*q2^a^0>jkft""fc;JjEek7T9^-b([`A;"u"S+V'5pimClH;Df8M`ab/+ -oS,FPO@^]q=L\E4$^C]:ZIrck5qnNpk0k2iekJ5s:LZ#("U9ZJU/>URH:90G9;SBtC2.lXSt8t5lBQ+d -?EU///aJ\em=*#_Y-$=")`=A9Bsq44euOM5i@SHBR9*V+g@9O'?Z.n#joYL4_I2lc/4LEhLW*%9oB^Wj -+d9t.E`m&i!WN4PZC,O-/056+!(.n@kYsk^&r3ccEG-%a1D,U7j)O;LJiP$9aQ,*J4IT1pQ-(D9WGKFY -17(]^1Kg7%F#&Zgk4)%(no$gb:T0Ll`?L43UW"C,#[B8P:8ubn'hYPGSK+b"C@u=Y?DC/ud&7^q4egD? -[G*:Al[?XuKMAAIC#i`_9mF?X;p*(-qZ22^i)Ilg^)IZ>`8`RsFh7C$OND$RH#0Wm!5VmCTMS0!((gdZ -Z'eFuCbd"CLd^4l=Hlu<(QCmoObiXI595h@R;AiJRS,#n8nF0BFKSt&QqZX@=cD3O31EZUPI^>NDZ?D+ -A\\X1&s5)G;X'F7"Zi>AW71$3>,>Q'=fYT('tX']_-F6Hl.!N6;Q+b3Fb\dd\Qj$:>!/+0!1_nV -pW7:JQ%6U)k4f?"iq%i@h60maS@[75a^jt1>dduo!.VeWE(DMu%g[j*Tl=L>.2[_4VkPn*OtfG'MoK65 -j^Pqc+-/r<$>#sg9.,oq-$#t?h0d&*b[qM;XO;#CSB[s1"q)<65+k^81eJc,Kh.rdB_8Hl_\2!dcYbc?11j1jlZG]@'Q,%*$,IoLVmS?\@b9e'og:EnlY7U7k9eH5T*8(D]o0aO:5.h[b/,4VVUE\SVeJ0ZkZr,tR0PKG0a3F%kS,aZ\$''YA'B/Z/Q-F9,Ql?bXc -cKI(L'Fn,.U!b@Z8PLt09r-/]dMeZSWW7fRj:WkHAd;Ur=6gU05$`@BeBF -N:-_%`Sp?s$na_lM8!QbYQt(5#6]XpT^[b2.MiMJ_kHT+N$RJA3?"#NaLl+>)NMfKM6uo,73MY&Obu"Q -ThQl"bEL)fI)0-d=tSm;H#2Ja2OmF0.$E:I)OA4*YZT,LI7Bo.WmrTcWc_dQ;m+_&ot(ZZ -YnDW?/$,UP.ar1@>:oR7NOJ"h\m2DIMnSECI(\?TGO,eA#Cj;-E*-@7.gZO$ic(:ON^G1Tb2fk]8-:<, -b(2i$E*,LL'aBCZ@Bd7`7NiG#`F;\XUg>nrN^b8@\GUM9,EYD:np*Wd6S"EpA?s=)\m[Ap9k@7"";Yu< -S5#Yt\bu/B$_^DMgq/T@Z=*-;^[ifq8N/:Jtf61MgRE-%lhMe@_4u4%8`?UMDm".GGO%CLRVHYNG.?mH$ZH7Ks@kO0C-?En&ib:HCcK@"*r;)%,Mbke.C+UWMs/"0n -PaX`BT2MW<.MZ]h?E721euQ3IrGo_\Yh:RNCDESeBsZNq[`a*%j)2D4/2Z+piq%K0h_2J)rW<7S_;J+F -U=%'s@`79R7k@6Qe;?_+ZC*\\t -0`Yc?R;aQ"%LWPp_P#8s9K![sLr:KVpoI(>'T9n:n]:'C59Q'/UiK$XRSP>rb,',7i[D2eQqP^qUD2-m -ME+B@7\ip9!C36O-r`e/&N65UdV0Bq!\m0AVl>m&`I0YCYH1b=b=0*b]j7hjC\@A3q1E9edqq"T4gKWQ -[t$(hFpf1Q9tN0a=0'U&q1$3:n5p)?)[hJ=@^,X?:,J -6t'I/Ue2^FMah.f\AWD-s,]c^0rXH)8LKQkAC@GFY$EWH9.!R4SAo8%RndS%\]"&]4ePU7;sGY5MaO7; -Bb\-A2D68Q<,,DoV,j^"XB'+:]&dW#MC@*C.&,7@b@EUWN)lEO.-2-C)NdS6Q."i<]Njk17+ut^Sjk-X -fG-9[4KMWCnMlJ..87*QgbJ,BSl[)!\3L$*-+`o)"G9!J5R9J-'+0<,@-eXb.OPsg6DDl+Ui%h,NlWH. -./])m,a6?H10GPFQHGN:jjOO+b%i`$bpO0=bjosASPU]@)>so#7$g6=e2gkbRn'>MTCj\):7Y4^eZ1P' -eLmh-Wn-MoM\U9UA@'qU2JZYM_)o/05H4L;W"*336D5pkgK[Z5EM" -345$oS=g._&-<,X73%u@,>os.$\lPAJ-^6W#b+UY@e",h0h/%#.?honI"k-8Lrg@S7D,L!.[E^O1C,2\ -I)27*@P`;Zeos*AcR92;$Q53ATsCWhRO'GG9;b^''Zu\)VbsHolID?*Fh_j`RapDV$u#k4s,6?L6#9((UXu^gZ`bS,On`KtuXhpro$W.>Z.-o$@S>.@1*f5iAl&4=UdK -KYq5;k_qhU%uS<"d7Cob1E;?DUN-(qJk%#JaCOj57%.%*Q-6"&$#IU^s-h30o81]VG3grh,e(Orq3BX$3kd1W'*gInEb%!9>%2u'?W`1Iu -3k\S!>HLtB2>Whh`FH2V?hOj"Em\[1>AZ:qA\r"j\m94*Hc>.?)*T7$2r"<-qGG)f;-6LSg];gT@h)&) -(+U\p`>Xk0bd7BfC.0?I&7cu%4U?a.@*n+b5QIBV/)kPNU7#](LIP>7f]6ck[pLh"C`&*l9e);tV)$.; -"cUTkbiVhq]\7EaS^&UHWU0b:6D%+'1g1mHPfmW9WKau26D%/R<@Tk0SQ`@%XjuaFWqCDI9nuiP2JWJj -bA"<:X7,q6_Vo@?>qL1lQ.G,B\DJn4X8V2`G/.MT=A1mt'8=Eb0po%[6Q_K3AMPg;-#rtcJMNX0W$E8h -#D#5#OEbj_)%hY@),V5e-8?3k_OtlSltS>p;;OMX@@540Dk*&rThJkQH:(N/T9_Ns" -TMX$))=8?#7to@RV5e7O'On"?O[gmPaOH):UCJD$c?BBQmN1YQ&j#I10IkZ?RGhb0Nc[M,Rt1fK>O;.a@nK.%Z&%IE;6I_Pfo!) -@hG[+E^(M)a.uT>*1BMKP"MP@\P/@k0UGJ0ZUn]]B/c:),d7%1qL(Gr:o;_L*pb)jc(!MBE0Jnc]4G_2D-bOsn9YLSBf*dugUDN/L.LnX/BC#b+U[j>$jIND1^_acjld -I'-[)QV3Rd7D-o]1n.6PMfnUqGs7hGkO:_?$A1jA;J5>31FeefVUOg1)Pod&;leGa'tVq=ZX9k;/(KAQ -/X9nRfrZ%%V3Ace]d*3 -0jUsgUQsKmC.0@#p`'JG$\1Pje(BU[,oECUA$QsDo!)Pdb@P&fj^Pq,Y>["gn9@VN'b,gJf?>(b8g>"- -7:Qp#e6XuJ@ksh-#lKEK,EkZd:\dtm=Y5t3AJ5B7SnBdH:$0oj;_=7rT$Je6)?gV#7A3SWP^6=VR7O5R -l1;[o:8([beZ(Kq`GVkbX]MQgq\8m.@C'&f(->6^eSVa!m<9Llb2IER?#LNPe_^%G^0>>[$P!C,KW.s# -\7SbkO,U8PZ$;0B#8N?CjKYoh!!3*&JO&.TLdW-p%#2ZnnHb(G-PVHWU@BJf.$GR07cUc[r/*W_OHa6Q -FB#,=.#f"=a!=N>@l$OnVC*Td.2b1<:?Stjg(?67U![P0`>Y2/9;O#$MY_`jTi.j=QA^(&B!GOBee[T6 -%>)Q-Z.Z4eM^>CLC1+<7OHPBi\\ -D*"1^kL8,fnqB;b6\#f\1t%RVLW8RpWdI..,cT9BZHB:]Y6Uh$jOO#')Sopg=R=Uc7AeUN[TdV"qh;QT -MBq!F[nF-knU%n*Dcc8X7d#@l@5-:geft`H72W:b/:"3/N6,WdH!J8g'T>@*e'LWB'c<]E6BoUR@_Nor -Ld[uB"Z"JD(l_!pETkR$I)1ocjAJQ3RStMtasCj>1Fc`dQqXB`8\E>i2P!SjF6W&nGs\.MkVFPa/X8l' -;JC76SaA!.cnnCoATt$N^;oiD=c@-3j^0_BP)oPX60&MF?IO=H%P^)i[1V -nl[f49dtS7,uWE<^0raa9]hOA[,,JD71s63akZT@5G:lOPSu+`Jl/(:O]9JFkd=6c*0E]?TusNQ73a<_ -b2%6W>='[ceiPIG(o(#5<6=62^>3b;ghrGN1=:#a]\Y;CgVVco_8'H_3'9)8&VS,3nOs]S.ij_ljDpYN -[S&=T@'Q+r-mT91#_U!ed)\m=(Cl8>,&m7/%^u2GA9J.7pLr1;H7%@RB)32f!13i`"9.cBY*t^o.'G:WP.)I,uW(\rL ->)1#@8>?kmjVB]tOcc$dC,mAq+VSSS'TtqE;5pB!AFd!4/Q]^L;`UZ(9XJ$Kk;.tEepTAZYF%-b*=@Wn -UJbd,((2"F9rHI?'fqU\UK=Hr.b1!LDS95X=)9bjK.3,/ZW\pRRq8bYC:IJc2Z&cjl$'\n!#N8Tk50Y@ -?n^.P-4^Q;`*mU`4AHsDN5]=IffX.R-'l\=)/Q0L$4-fd_BA?H1bo^RKu9W>#b4(/&rT1&nYjZP0cl=p -j0At2MG#+VaX%R69F(YOPtQW>M2]ku0o+#NnL;\r=N[1$VU?@c)Mp&;ctAF9>r#n`Vpah[$Ct(qY3mVPY`6$H7=;"U%oAi=M80d;KDI_]_jtEnu,ZKYh2W(sHkJ*0!I!&bZS9N67;TUp>8FVHG=69',Ws -K[+-dR*FcWM6eXsb+;D,ZhbC@M*Rh4kk&%I/sT/,Z@EZ.ANm"lVcBa^HIZW<=Kbck&=WQ@HXa3^m$=+] -Y0h'n>Ab5RQ+H4"]%l`*S&OgaID'!kPM1fp!JS;In2QnZ?Q"j>j)Q"WQ;8rpb@U8V#Q+o6"G4I_n;%tP -'L@Gj@?B\U-7'?p7,lTr]P95BN(9X_if#KXMNUQ)AZ8(jjGGZb%T;mr.2an09]i[)/,]&RnCh6'h;Xlf&o -A[8MKqt:*sK#6Gbpe4-r'9'ojR6V1@2\hS!jg"W+""BJXJO(Dt=@=2F#)5HQYdedE+VTXM@1W.O;C**2 -`ZO`M"EHpMP"9,h3AdU1/!J.f;X%`+AMKWI-IXufeo$[Q=3F\2n];JS_&T\VUf&u\MT"NE -fT[Rs4W_\BObu"Q!>qS15N&bVo!)O-=2C-E7D(Z)%uA/4Yk>U'K,BS;@r^`!JiP$9YZNGg<16Z3Pfk@n -ku>N(0pg+]ZUqgTF#KRa,qPot.XsaW:oL`n4V!ZFV,Aaal>6M%;Q%tn[7\,!X]_`+X0p+KDSob4==_l, -23Ppi[G%akCONMIDReLTGAEK'lZp,!YID^RmfS$T?nchA/gC[[W`h-em!_;HP0)f@\SSuh!<7U8i/h%t -*XI-^&7JDV>W*`9M*m+RW2_=#)2guE&]iIF5p)4UMD@aY.SD1D(8Z&XOsn:&3D?;>Uf&sb31J3+-q)d8 -I%Gs8'P_1LZ!U"&_!+gp1=:#9W72r4.^_Q[^0oN-FfOPP]j\(rljOX;)3njAg+?@[A\Qc9[p6'P413Z0 -FM1uKGFMM[QHI!NYW+a'(D2>>@I\T4AhX7Ja5aImgpU!3!+iI(:adS!$ODC%T[:bR2AZjZ`$00qHi>Z8 -N5hW4=HmtD(kY<=E_-+s4Xc1[AFc^9ZdX`X]ho1XOYXQU().V?*Dn^2G44B\4O&2O]Ir_Y1mp)go]1$NR4G*]HXO\b2I+6IQ8U2==bXEjaoK2 -O\!]&2]7X8TbD/,RX#aFJ16V<2)G4?SlRB#&?&8S9XJ$?TCDNd;CrH;/_A2`e8dJgO@SA/kp1t7_.,6s -&ueR->qMF:-;sZ0`b@B$:1giC`:A%$AMVq<)BB0A8#&sq[(8[]Pt_6XBsg!MJcZ`)-^T%>I6E0aO:5.h[W#@<%N2DEAbta!;8]%$F+-Kp6-]Uf=3o.kO*27jLrhB/N*tVIq,O -.2`>],:Egcg3SNCU-R+`2)9GZYGTe5eHd(]BXb"llIC\bEk;N[YF%3U'nq7ZAQc,NHVLftDRE_$[i9b< -lZBboml,%4imPt\ZEO$C"q(fl_r1&ECfVYZNlC'6)'!6e-^Mkd+:P,G/d2B/_-mn"<#QV\L;Mos(kbX+ -"FnDN&P/-E0c>kgj:S@*IRbQE8`\Ke!\/BD`sXeVj$rl#)PU?9OkGu`ioO9KrU=Kd4jTPu;'R:s'`_dSYjN'\Aj?SGroGdLp=)NMgIn\tq?N67:) -Ac^5l -n+t!%_$7/Fm+'iRWmbdk>HN)GD8PIV]%h2t9?#WVI(eF@=:=O$s+8,H0_d^MP8B1tj0ACgN_:aab2oql -a9!cAI"=R+E*,LL'aBCZ@Bd7--4(;R73^,=`)\Z1NCRK@p`W*o,=P/!Z9m%><@^'RN)J,h^sn629]iZQ -[+\Q69rFnGjC4*C/![#tMY]1SO%E8%(A-=/3h]KO;jQb3%:6ACX]K;'qV?n=_-jO9jg2o`RaX)Zne%cX7cVpJ\kgafITJp!K4hSE;84C5:)?4A9,4CZiQE7AO)oM3%Q6a$A1\h0\BVk -,7oRDij!10@P\XPa!5TfS9@1?ONAbgBb[:7.?hoNZH7Ks@kO0C-?En&ib:HCcK11fm/hQ"SC$IV8b?VY -8u9uc[-E'+UJe)A,6u.a#-V12Y3UVGA]Wprmn?+-0>P(AUY4rn.X?SH4P3gEUHJ6t-`fHr_O/MFHQ&R,h^>)ir$M&igYl6RS$h,gr)kY$ENE94fq\r75^CREfDC\U>H_.F(,ATVb)3OZCt?3eZINg%>OGK8NRI0N]&"o*X4bT/ -@_Z:_7k=,Ne;?_(nMlJ..0uD=A+DV_@Z=*I;a;#=`I&"!"+n?gb=0&n)%22;+_u5l"t(.C7ADSngg3&\ -@'EbWW=4eU,a6?H10IkV=Xo`]-1`R-dUP/&c'_86<9e`jSq&4Fg)U*M5,6LS'P^>tQVOAV.CC(B8ukpl -eE\u,eRH!oY1P7j.fGCFA@'sk2HsI]fkRtN/b^cVZ -8>?m;jYSh=Oct(7icR:K-I^H?%07<@;c-N9j^Prh9Vp3PWb%p]V,XGECDA_:Tj!!+GB,S/s0eMoT=J(sJ:1-]uP_o$@S>.@1*f5iAl& -4=UdKKYq5;k_qhU%uS<"d7Cob1B3BTUX>J<@RhB#8>NPJ4K;+,PfmWYl&-(cje_:7J`F#n&CmITiVU]Fffr`h0Ksp#[\Qs*>H_'0K;`q*u0FI -i@T9bC;aZo#.;8L7,&UD3QTME+Im7\ip;O%H-FWCTG2HCn'5,8=m-WgPuN=4XF;]'XW6Zs21a -Q9-[m`j];/D0FZF]&Rb?g[;Nt$O)L3]\`*YbPh;?IDOhqQn0j7%uS870f[ron,\]d17;s[Y$M+OAMToT -8/rBW#DGI;OI0i:*>+)qiUL$7=t(8I7UqR:oHXG\O2kaN2uK7E.$;[5ZIpM;=YQ19As56^b&K;/c0&$Y -jPEg$Thss;.J##h5Fp6do\*;+R1c7DlBPP\?EmY8:#l]BsV!F(;"^tiG?&/lsuR` -fbJbF?14,LmI'q(^gQKi*%i6HL;_]e=Mp:M`K/*7N`bn8W>,D&)NdiE,Rt0?6711.W+7IsUJjPpalR!G -.i4+5,78"VhE)g?80i3:](pt*PY'sla]uDW0UAqF/7ql0D)Ig.V_cH5qKG/qcmWuc/I%8(Uea5ib"UWU -b@OX&<>qE3X&uB&WqEsJEkbqbf5,U<-&TlZZeDM3b+13eBsua`295[Lmru?Jmrp;LlMZ+Fi3517"rdf& -_W!:pXDTC-N3-E+fc7.n09C]>fhA=Y&dJSn6/bXRA0r6&J&Gen32BS,(Q:gn;7P\14WfbT%u?qgN_:X] -8nAXG4LS6BQ:p@=)5P,d1RlP/1-+&*6 -PKLjmNltt>.@,m=eWnV@!g?plb -Q,;^-]&#'+X1drmB-cC(.'*U`"baePYrGup+V[e[j71e2ROGRVb@P&d,Z0F%Ee9aB8B=1K'+9Mf'5?Z` -8g93kWM7OGo!)O@NlNBljYG5%,Eg.od[;<8I)2+AV6]o]`b@,r9\:m31FdN0S^1s_q@rd_6))`ie=&fY -O%lAL.MSn*14%)SZDuH4]k4fZY?%_>gC8VNA[5J*G+1@hd;-3qDALD!5QPf6?*>%_bPq.YSb"AJJFP -bY(t4q8j=[Z(.o8Uf&tsCUI@uLd]sCj)_aU'P_EpR67QPh_3U9rV]Es>N%9g>WsYF[pLh/\GUM;-^)X5 -Eqr6."bOa*5iAk;1aWeBK>V+ok[Zk'&W/t#^^.kR/K0U(R;AhoJj1EA8EA2J7$^b!PtP\Oq-:pF171bt -dojW/0E@Te-e$cPjo7]B;.t%hr8s,7V,M(bqIN!a;6!U\eLJO=ZWF81CR+bPL:q'#=R%_Y7AeUN[TdV" -qh<&OF1OT^LnY@8o6@rUDjU@X#5s.h@.;fR7M?Ml`Stm(i_A;SMTOt#=a["Fpkg?4TTD,a+qG$56&I?E -E[i4FJJOuB6]rk:(cb(18>KdB5p)30:l2RORSbG%.+H\a13m!*R*=\k8YVVd\"(b,;p"t%DSBN*W0B=p -,*,?k;^j75$Q54+WDmVTC9:sE>-$6?29PlD_d-gR/@Gp,T$phR1>,^OFgg1J\D8bRCRs>JGeMt;\"!?f -!IhiC0R.@ZQOADaij$"@$i_H7a^_TCr4Z>7b%3?d:e2QA&I4"UTobXX/fbO[7,dZ8p6(q-=PZd8@'LANmWAM2/2PEgD;sJKDV-^9, -Wn-JNb11[NMBpV$Ft4l1c"XK;m2!lF[ZF@rgsK1RXjFIH/KBmB/)eYMC.0@$=A0bP$A;-OYuo4R0h/%] -.?honITJ0&<\)YG-mH>uZs1Bj:mbKK'";4%@PKj,;D/fE`FEnB$O)L3O2tiE.4gWX,F$;0Ug --?Aomg1r[417;sXh"H"WT[5*.qCN&67&/201s/6JQVXL..Wm3dbQ1\AeuL[NX_rspYh6$WgARJ`BWkTU -p8`&9heTaVY#c"%g?X!p?EX%7c1:m`^tS."9J.7pLrA;XGg(%e+-=Mb&O[V1="0Gc*t^mX'G:WSKL+Qn -BOiG/$\q,Z&NG/=,o2A,i?Xd)E>9OV7q>Km*/7$4P=^Wc.9\3*0:"k];^7GR`AKYN%7m:*mX%'g:QUF? -oaZmJ7OZd9PqmVeYGY>Kobr^UBXb$C.eT7l?#IAafBbC''pcsSZ.a$<((2"FD7A9&(H[o5j*/(@0%ZTS -mb@fX?Z0%/()Hk$AMVq@S6d]`O2kdN\NGUF-'c\>)/Q0L$4-fd_BA?H1bo^RKu9W>#b2_4(5KmR;4+.o -3uj=$i6V3=P"?gX8`UM@>cM!WQcg]gl&=&'2OR;eZ^JJkHT[qGkVMK=!f'6V8SL#]>r%mEVpm1R.\0J< -;a)C]22]pr[pH5i/!_[`Nl,D6fr[/:?)$"e[bNJ.P"fELMS!1I\#[41o6e=1Y/M=!%2FT7i@>)5;99M] -`gj==Uf&urQ-*[2#,G-O#b+UU@.7]9ND0dZ-^BSaKM!I&M5cf!Gf4>Q)imHhlfJV17j=*fjO0GIY#)rB -Z'eMcN5B-`RSDpcRC)7!4.f1H'H-i>M*n%6BbX$8/X8u+dj`fcKhe7?WE#s`HIZW<=Kbckp"KY%JcN(. -XVMjUT%@\b5OK=,NO%ed]3B1i>Ku$tID0(WGT6>a!JA9uE>VAM*uBdRA+A1ZQ;8rpb@U8V#Q+o6"G4I_ -n;'af(CZ&9Ta/M5"sXe<73_88bZ6Y>N^feL#lKQC,`p,YEbS4A,!"!7OgF@P\NW3.CAqo6D0!+VlI.NZ8"hGXf7N,`I3?W@BnJ7b=0+=eS2GGXXePc#30d8>qYke -c.;W6@'EbWX8W>)K#6J#pcM:j'o9ieJ/Jc=2^aR,jKdH0!sOY+JO(DpVHYM^$A?:Td+F",,nGjN@ZboB -Ah+gZ7jCm`TE7P)O3(n[GpK+Y.>>OudeS9r=#6+9AlEE>hK:iM:++N$r:Y\/Ti#J[H6jbp8Z#DMbc-:c -V,OBoC=RXLB!kjG=)2He;$OjGYh8=F_*B=6H1QMYgEgN0l1/lu8rhXu%;fIs2(rW`=R^gSp!>XfeF -;6XOB=R:`l[?$QqZW5=d7WS2k<]V -PDSr"Im'H$kYt^oi0,[eU8`7ga#>D!+RdO0IS1V$ODC%T[:bR23\)s_r>Y! -X=c(=MoMMHQ;]B#*frnQ1.`IS74=>AAFc^9Z^tjNE2rXXO\nEHL5I\>d)e]1C?".cY0]>X`hm)]&.J:go^n#;$Q?1]3[.7X6o'LI)'*n3(tA4 -"c1%TE;6MP1EVOrh+9UhW[fNbJ0,@kQkU/<"b].un@3!e*=m]8@PK]=8JG?Z(61q\'PukP2'S0G)'"N* -,XNj,d[=@>(o(#&eB-f]^1fKoc0";&U>C/ZT$QV!e[kR/7AJ80'Y7:&P>A&0==e&a:9.?pq]9+h<+N_^L1ui49cGY@/s_U==dbt*KA-M10FFt4rKL* -5T*7m>RCc>K#/Z"W&-7C%>D]o0aO:5.h[b/,4VVUE\SVpa5aH3*/[B4PK>*`BhYg6/sT*VZPe*=s#-@l --SqaWnp48n4sGe>MH)!i:8ZMiPq%2WUK";EX#4):@_#[FfIQYFoocONUfl)GRpDcCC:@D! -pFD6AUI`!@Y8=3)CA;g<(pE*R&ZHJ'_Vt":N'\+7T#Tg\aMf'e-DjQh+:@c3Z3:A^_,]c3U>?UnKu7@2 -[CZ0d'8jaQd?qji0--$+==e&`L.Ma(+ZWj5MJ>PKMuBci`8UK*$Wii38#".Lcf>_dRNJN'\m&MSu7:8A&[n*/mC\7%"17 -'d8`2jKaV)W_G%/U5CWRKYCqQ72DObUQR%E3]Tu18>KeuKgDEZd##.&,*b_h.+Hc.13m!*WRYaKC9j7@ -\#n7tQ0Sm!DSBN3/Cn#gWmbdk>HM]W$Q54M\m4[4MnSA>!5@<-fF.ZcpOg9?0_fHZ(Dhn=ZC,O1IRbQE -b2kDS3!1UobCMr%E*,LL'aBCZ@Bd7`7Ni!:7:L62`(Dg%NCRK@ptUTe,(mYkdWms,7k9itA@^&u$eltS+eRu;D -D3k'A`nPRE>nKJn^#JL+^0^9[X9J>#J%h.^pgdDM'iuts%S3?14QV_`,*A9u]E&_*2*dgj`$0%]#_bTB -MD[4N9V,98ic/(r=tHOS/`Uj'jEa05>HaDL8Ml`/.[8+&''WZ3K#V@qVNX$=!cp5ic0)EIr:5D&T[>00 -C)%qN8Ya_%9X[q^ThhW;.WoKk@]NY4euQ4$rGKMMS:E-@.g;BjBXQO\[]=PVhcbNc0"5&M`q*OG1b-j&FH]Nsu- -45K&pJ%oB0\3'qWs+eO$0NUA+-OZ!SjDeVHaH7"+nB4n>J0!'+KZ5U+lqD4t@8(73_9# -b]5EZNQ:(b#ongq+bDr?19"Na>:u8d-8R*@dVCb1c6`e7;$M5-Skl:A$69&'6DIC+oVtV@O\Vb%l*Ukh -8ukgieLMAL=XJ>u79Ah5lQ(T!@^=]=p%"(0fS[.C-Y9?@aV83qS?E`];CNK2^L(pC7+utmKu,&KC2?M1 -4KMWEZ5EM"781'mje*!(1=?=/J\bCQFn5eP%#)T.&GVJN.1H8GiN*eN.Q&3*a(,eX'RE=oP/u_4R7+2R -/X8u*P50GRQHGXjVR(Qtk'8qY:?V6&"V-5DMh!4?)HA,P7A\J4[/-%WWDKWnTCnYT:9RfMf'F,u%>:^>D73[9G8k\IiH)V:BGKj`meM:G?gnmP((U_*_dW%)`)-aSN5agt)#T[].?Vd6o$@Ku."_SQ -5iAl&4=UdKKYq5;k_qhU%uS<"d7Cob1E;?@aY5.F.RbVEaeWs&/>?2qOVD2$oMihC!\I,YV^,,sEcR`i -O\!Um#(]*--I^IZ73*5?;c=CPj^Ps!;lNbHMIiO=ZWjP5/+oaMq1E.^=R2P*ZVZao`5JO?'WBN/^l.UPiG;eabX -Kgqn;W`--<@e_:7J`F#n&CmKE*VTWb^>:in1KtcYd\m0-^411`F=M:H4\,5:lrIVgmnCUt0 -7^7h>@klWI_.t6872W=c/A(u4MFKk(O>n^%2P,T=iCLp+RNA>%.i%SFZrSgr;_8dTaRjX?,*&eWbS_t' -9dl:LUqd:aZ;WNC0NcPuXPReRS^+.>RJcW,5+p:OFD;O7Mb0\lWD'0n.\BS:<3!>u]hYn7X]?rp\Te1h -?*W!4[OX4ucYBiA/JdYX^7bM:gb-%iS,Vcs]O!3,gMQ6YJAL#[\1BNO%oU,O0t?">-R4Ghj>*,SY$qCS -AMToT8/rBW#DGI;O=0ri+VBQ!ifR?M?83=W7cTW`oN:mG+NS)6.3tKZ.?_j8'$4+]@5"$AVNVn!c>>S3 -:?M0$eG=GTTd#=K)D)S]8Yf8Jo\*;+R7\mKC1sWL?E#)"KMAAHO;.a@nK.%Z&%I -E;6M,/JO,[),.JofA(1Y?%aTCNYNrC:dlWfW'$t/Xk"![+_X*bAFiJE4FZKLnY@,m<-%tY;aYDqY,KRi%TC, -/dDo?`*oo1b[*@GON-@$pF6A>kXg:H&O`!#&dJSn6/bXRA0r6'JJ;QJ1fR't!\HkO8>?l8jW69'OcgS% -MF`CpVkk$*8hif4QRS-@`I,sH1n.4(b=0)3HT[osB8^p(#)PgDdHOW!AKm[:S'YQ17(b4<%53nI7gP>X46GmC=Qe&?EVp2Q7Din_dp+,WPk5_XVG]^ -gFbDMQ,;^-]%]h6CXO^.I\R[_#:*0)#'.U"O\!\g13S=FVm5LI@Z=*H;^\4F`Hlh6"G+Bs8nFaR'b#f6 -@M#rYq1B?<`?N]s`,74KNCR)%AlOLT,*GOYd[;Yh;(Ru*AeOp(\nNmfbi[BB'.K6iSkl8jq@s3k5bh0/ -5RLL8R74"#l.$]+:7kOc2Eg^SC.@/,-5p1,K6js)(KYaA/fRt:l%uJ56Oa+6F.iXF;,>m#jr^@ol8#4Q=/;aBQON?MRab7B> -.%/:kPBjOtCHJ%^-WA_%re3P1:h9-s74+9mVGh3YqLqD8;lWi4#K0IDZ!+6[lda_nElDCjfPHk#25\Q4 -Zs,+_gP*B'DRs(j[l_"[nU%DOCDZ&4!sO1k?uWV<2CB)e.+U,OXF03:s7P(nHjDm[/NC]jU)&WC- -_]ah(g3Og37OZd675B-jYDgK];97abBXa)EjAJQ3RRFVl0P,:XA@c8)REOa!.BpT -.$Q25,*,?k;^jQW>rnLuA[8=Y>,>E/=KU-,5RRI)]4%tr/=%e:hbf?+T'8\_HP].^Utg%>EW@ -Q[A]."+A#D0UOCD,7f[L@kfsu?99Bnakq#^Cqa?Ys+*GnOB==\&IF.XiK2]64s55A&7SL-S5q?\NCBV) -R-\]R+co7TnlZZq8LKcqAWhmlY$WcJ9]f8V5pdm;78BbERIoos4ePX8;kf4CNf'X\i^Kk]aV83_*3*VH -;DP>4KV9&nlJd(+UJk8oalR!Gc"OH;D(9+khVE.[ghrH?HJNtb]O%d#]Ckn!I)01Z9GTE7%>_p]EL=C^ -.j9nnj76>XVI(\NAM@65-mT91#_U!ed)\m=(C4S-fhj/n:+I0>`4uu+bZ[4PON+(/3>@WP-BuV`Ef">, ->;2DfV:/!trbjc[:1ggmN:MH^T[.:n$7-%;8>FV3eB1KDQVOL/.WO^l>-D&0euNr9m -B!b_.2ToC;eSqtPD>,Q_ddM7ih60n7#!^0n/>4:W#8L;`%f7%6(l'p$GrZ?ZkU9.QB[&l4=^'G:UI -K>LJ^Lg1@r%QP_l;%o0je;?^ad?"(`Fuk:NVkaX[@Z=).;^[ifq,FY$/XEB%Mg:Q8B/Q2Rk%f,2#'iD( -cfe=H,m'&nUG,foW`:g@9rM"U<9g;LX&H'"CDFFoG-tYZ=6o4M>:Ra,ZJ"U&$Y??eDmWbdf.2R#m<-'I -03\5&uL<*kF3;f(D.@8/l),-o4$4-fd_BA?H1bo^RKu9W>#b4(/&rT1& -nYjZP0cl=pj04=:P"R-casAgB>d@QdQcpd4.@dL7MBL0A'7%gmG'[B10\\'9h4'9Xc_F?*XO8>Kh])(S$#e(=fo0h/%WWKYKD -IOc:o`oC%A7D;DDPKN#1$UqXq"Lh_l@*j]l-5d2H6D>%DK*@4VMFF8EGgp=c(lq/Hn_"&*74"&;jH>?V -VHFXF1>,S!:]b>dRnP1#)8trc4e0j]PR7!eM*n%7W>&N1*gKHs;sAECF\8?+X&WpM9%@7W=ftilef*q9 -_.9fRD&.IuFoQOE:HQ-SW:]3XkAS(6s&F?Un)2uF-f"bjg%n9CH].hR][@r`F1Q9QaZb%:.j"AoO -7SaVWq@*dbKMAACWT7NJ9hJ>3Q&>Ed7\N_[e.g(p]jeBPXk0U(Fn5gTA$K/fp1mBgf4_Rr=Nmgo`o1sL -h(JF`c._i8^#-$'$g%frK>?G"pAbCHPfmWJ1"b919-]\BA[6T+""fb[JO(Dt=@=2F#)5HQYdedE+VTXM -@Spg7?8WU\7O-URH:90G69ZTL -1tm@=Ti7pjC,L=6@]`e9L9"m"0j7T2o= -CdKW_MPc]EV^,,t+EGT^d@"_`!=5/j5a0:.)O_/5:Fd1LaE0<^&r*BOMg2=0/JsJdQL!ZAH9iX7aWtn@ -'V\5K@'Q+ta`Osu176<5'58kU;Q&%02+kPcZW4-Y/![.% -K"kcu=Y)I8*LbGj[FsrUX*(`*Ek'\mpM7J%o6Rt&0=T.'df"a4@'I,`eftic`T&\_m!_;HP0)RALnYA_ -!'rdmTMS0!((ge*6(sC-Cb?_?Ld^4l=Hlu<(QCmoObiXI595hVjAK+hSh(;e,9QR3FZB_s:K196`>Y2HVGA]Wot'O2]j\&mQA^)9R`f?O=]XkN%CY/3 -\6SH'>E.M(G@7\D=1dkjrIMaln+^-')[V;=@W@coFtXqsaBsH8>WXC$!+dpRE$utA$ODC%T[:bR2AZjZ -`$00qX@b&YMoMMHaM`B`+-+DfE[`Po:F)/rV)$.t\lCGMb[pApXO;#CSB[^fq<[s-5bQK&F@n,'O%?(p -WH?9+nJ"9ee7o^JX\u?$XOX@OMVWTj@'3V4p,`_HcXsQ;D0ChKWgc2\goXX>Fh!W2]HXO\bK]nXJ%jhp -Aq247AdfG2.VUf0c0&#njPkSLT?h0b3Y`E_8"rm0e,TY1P;d&.fi8r]8uYmm*KS9PE`kN% -="Tc]^^l6q$jm:CK#/Z"W&-7C%>D]o0aO:5.h[b/,4VVUE\SVpa5aH3*/[B4PK>'qQkZY;/XOX-1?k%? -B.c%cOcr@K_>M6+oHVLfk -[pLh+pD\h/lZBboml,%*"cUUN`\K#hr/!A*5TF@]%.Kos+_-mn"<#QV\ -L;Mos(kbX+'o>AROa,Af3>dfHj71e*N^Y7UalJVA1o=D+QV++ffo3XV24@8%F-sT=Gs.cqkS+pM%Z*WL -;<\d`MSWf/=`"pI,XlKg)82WR\"K -MQLKo>-?I-ot(ZZ`F,t(XL=$5Wm>IfgF`-bNOJ"h\m2DIMnSECI(\?TGO,eA#CjV?@(;.j.i4/aj0ACg -N_:aaaWD*_(]j.@6%MnrN^b8@\GUM9,EYQ.13k.>-:rb]&Q7kH -[Uh+[b\!&a[()k4SYE$goO;Yf!\GCS7Og.8P%mE1.>Z%C7\s!L-I^LEnhEV2X]I#ej^Ps?@^+MOC1X-r -d;$&BmFIQ6q1E[tgocuj[H?e%]O*9b(,IHAK#$=6fN^lZ'o0cfEL?ZI7iRZ5@Xo>DX9!pmAO)oM3%Q6a -"(a7@:rm`:*tjCK+q\LY?7QkP`hTf+r,P(EONAbgBb[:7.?hoNZH7Ks@kO0C-?En&ib:HCcK@"*r;)%/ -SNl>FC-Pi=#-V12Wrf7L;dUVGjK;^UK>P]MC?EsI6lfJW,D`4+\k>U'Xrcpbu0NcQ!,oV\3V,D#lMKLPD9rM%V -l"0Dn0)TQQ*'PmJdqY>WW?uVJA2@g=P`+&7= -geL'OON1mPR67oMqZ),]TQ!FQ)@m+,_P(qiCcWXLLr)rDU'spO'oU),1!%:Z2]n($,]Y=bL/0(Z8Yn2` -ll'(LJ]oH]\ZDfL1n7:<1WeGKF@h?d;,fS.$BITN;5lCp>n!JBW$7*I`7e7lQ&6?X7jLrh\oP"nO\!Y6 -1(o77Vl_E/@Z=*"\6IG)`I62%Fh?JZb=0,8rI)H=YH)g;#7H=)@PN,/DC6NbaC1GeAl_h^Q%1Pjbbu3g -#6fcHiD=2u-6!>J6t-`f?ihnmLW3g9\/Ql_b)](J0!'+KSY@$).#72VLd -`KIGle843'0h77%'2g7s,Xt#[19".`2P-54Obu"Qb%WY-.i%Z4eE1s:;_8dW$5Ec#7\\71lfJX+R7jF, -.J505;PR3!Z'eULeRl9sY1P7j.fGCFA@'sk2HEWUgM""LmP_*j.@/,fh`5)iVhsni6!%6RS2Bjrb)0;_A4VJ\bb+GZ5S!$&6=Ud27O3*u0W$U60]MAiU]h7cX$l"HGnsONHRH -L]";X/XK,m',d%[Bf2ASk7a95aS:W8cY)k7"V-5TT[DtfMDZ`K9;b[f'\\O1V,aG:.b&d`;Ro`0@Uq,gog`P#Wlpb%6b3F9n'cRNeVMBrp063M&s)8>Kep)$256.#>gqGrUqS'?S_E[VT\cjGlfI./I_Obp=Blmd'8XWdn[=TTLEMJrAMQ8^ -SmDCg4sHXr8/rBVC.0?iAJf5H'b6&8b>CWi.)cu_7\NAom!]`k671103@p:0UJjcaalR!G>qhVhAh%Ad -hJG6Ac=`?O]%qbMTMVRD3].\87&32?t=(O/?l0gp$Vj.^gQY6>Rhh^Lr3\AR(RSm+cXS'nl]4p?RGhb17<)0,Rt1fK>O;.a@nK. -%Z&%IE;6M,/JO,_UG)E/H9WO6aJS`3.+aQ'k";7;4--R3?O;Q -A$S)tP!p[[J0e*M4LRs;Q:rUR)(R/%b*u-Qo9n\-I6+#sBJ]K"(5YPTdV..174t-*W)G0FqOL*T=0#A: -[CX=t[9^"&=t/rO1O#\6NoQ4/LNqGJ%7#=1dS@pkg3On2Lgl(C>l5ic*PO7P>dAaC?u- -r16D-QcQran0?p@K*6fm@.:*g1(b"I5N-SFPYrG8M8c5ELtl;u)NRB5ngP!15ph`1#r7oP.TJ'd9;XKO -SA&bk.)@8:WRUJE>+Zds7Oe_eLh]@'..irs.[5T\VlB>-Jh]`lWi;3)`I2L3>HZRWb=0+%a^_X1/G:s4 -q1ELm>Aa*bNRHd/\_WW(Al\-lHbSDkpac%O",4SMJ/G@G1D,Ybj>"1bIS1*lA[7s;VHYMR"G+Bt&9q.m -)$u&7iR&Kq:*14-7A>ohe7L]XO%/1"f`[=(-'670P)2#m=Y#h2V@qR@^1B0g^ZQ8ueF%TFT24Yb)ANa= -7AE`CkJU4%Pt\%'C)$N03iPuVeEYSQ`GVkbX]MQgq\=-m@j')Jp59B__/6M_m?\3'`p%QV>d"r19e,jo -^>JCH)tjX?K>V,9V&EA`'o^12Mcg.F.)hB1AW9Lh;D?W&JjA7u,U.(g$ALmpMD[4V9V,98ij!a8@PFZ_ -/`X,2oR]RWO"Ju-)*Fcn.[J7(o!s^jALLrkR8[hb]ZK"PK2d*9V;Lg!!$E3R8?F2 -((Ub*_]]TT>Ws)-6C,[Hd]qpkg3HXHkq"U:hbf?+T'8\_HP]/%*go -HG&,g([KoVqgcN@YdbZ:'+ou;j"Yf<9oC-Oa^m4fCn=r58Nn>k:e2QA&I3lO@;s^q1*6TM7#jg5'NF02 -2'S0F\En6!*^V4&dQ&k@(o(#%<6=62^0NFZb\!%21=:#!SB`K\ftuQm_4XW'1cdK0O[Q$Cl#[[K)3n!r -e1+I%V-^'&W;nH6C=Qe,@B`l"p0/9#a_.rcR;Ap8]%_/6>],l9[Ee5`]O(&.gWf`nJA5K2Qom87&V\0^ -nQ=RY58TI&A?m(8[T>0`AMTZm-mT91#_U!ed)\m=(Cl8>,&m=Y8hCa8ZCg[.m!:l=ON=5<8M$<+.$VlN -E\l]'K.`NajtfT!g1<74c=Z[Im.,WfT[0Q9$6:%C8>9"\oX[aPT2)?6C39l[8ul'peu*&HF`eF+Yh,t" -$RL\RBX?=51@&C!h/J\rY"'a7MX#5p)NdS6h=gYn^EF8)llHrKN)?RZ.V/+T?]N3;ni9BiR:s'[.@,m: -'G:WSK!!YK(fW7,%>[C2;!=]E.goaiR8K@,C,mAs87S`o"I;=uPKIE6WC3mp/XT0X;YafOQHG[l-M*Yd -mX7-h:M;Q\'c)WrU!dW(W^SP29rLu?<;N.TWE6-$C:1XlEj]2W=6rrQ-&0TQZW/+@]4JG,Dn'%i=$*80 -m4OS7XDpMTB:J3;f(D.@8/l#UdPi$4-fd_BA?H1bo^RKu9W>#b4(/ -&rT1&nYjZP0cl=pj0At2FHZfj,,GpO4L.m;Q-6$\#sh#c2+:7&0J_/EjGGZfN`6Zi.2bOK;/#TD,&KJ: -Vc-HM2)Rs!SlRB,opWj7]3%u`(A8+NL?VVHGF98u<6SN4rKqRn`&ZRFLYM4eGO6'H.\rM++#.&O[O+.[*N';ed#hPs2*CW`A?7R]UJ4>ch(D -(&J_la^ML-m+.XpY0Usm>HO4gQ,`'-V@mSZKN7=5H,!\SpY5r`"aVTF0^,T5/s'8VS<68lJ]fBT73aS7 -"C\8E!eN\bLd]sC'+9L='P_<-R67QP`?N]3]P8pn=tSd>q"0/.*a>h8120.J;_43WV,I\:`_O?[18_C' -[,Q9jT$D!?aoqQn7%r#,3:]O.jdqsE5>KYl]Ppl%ru(Q?AoZ2"fg9.,W],)A6m!HEgYTUD.HXnsMVA=4llJ9/WTfVHPS=QKrD%j_\5*QoA6_g@9O'?Z.n#joXnc -@kt9UCb?eEM8j!ZfXuYl+d:#ZE]JNC!L1E15bO2u/0YT3K0pe9fK1OJb)"!q;+S?'1DPnh,E\qkJj1H? -8L-&o*1BeSQ-&-nWH>FQ176<5'58Q(njGJBrMf*Ld[sl31:F;Sr?.6.)d*n4Wof`Q&>A_RS,#lWKrHfA@btuR7gTH -jp]gZ2OmP*;q]CoGsIiQ=Nmck)N.+^;JDAQFY9:\W)W%^>)cjf=K>J-/RP -Fgg7F\QeKG)l;EYH+Ml$(X(A'!IqpmYa?C_%h4B6@ds0J<]_1.J)p0g>dduo!.VeWE(DMu%g[j*TlA(h -3Zehq,)@s%UeWEWMoML=aNSfd*g"GgEVV/C9dGqFV)$.\\lUPNbU.B[XN#08S5#n;akZ`85`Ck8<&@Sj -O$oekWDna\3h&Pd`2ZA.V-5-JX;m?l.bVtWC.0?u2EMY:aFm9cXZ!dh0h/%LghmG[@_V/P]3[,tAYS&Y -J%oAFGUr@@I)3_[E>Ycp1EVOrj0C3O1FjuBJ2*Hc(_dSf"b]2#:hXAd)[hEh@M(SI<[AN=7H7(=;_C'O -NlU3Y)'jf.,Ep5\'"LuM;_OG1-.>>,9kQ8-eFn/PS^;$!.KpgXl^%V,J^0gA3*$tasK>ZYf(q`m.'9Bg> -CcNbA;_=3W5S6DJj9c1qK#/Z"W&,'\%>U[Od24$A-uq`nU?(;Oa5bSS!YI>^P0)e+`>Y1H/X@cL -MYW4VAMfi)QA^%4mWCXac_jEYo*0t=U/@mHMHq9m8uGN'/7qmSWDfhJ.eTgLEjK&Rf;pk<*Ic1@ZWSjQ -WnStgb-p'lf*e.llZ'Pm0,JEKo(RUH?n]#/rX0*e_r1&ECfVbsNlL-7R4Ne_,F$C5TFA8-.Kos+_-mn" -<#QV\L;Mos(kbX+'nj?^&X_'c3?=/Nj:W=EN_(O\8`T!P;$L#OQ-3bPq38I)0q->Ke!\/BD`sXeVj$rl -#)PU?;!@OT74sj"UsnRn$?\h;;l`lu'iI`*[Yh6>l]rI^MSWf/=_jiOKhZ -pNjP\&;ddf#7#iM.+Hms:*Da$=6";qm"Rf"Zs2X4n-,QB9`fo3i34N=q1B$/6K,0THqGCnLrEe=(,IEr -)i[?4n`^I*7j*scUp>h>W_G%/b@P_YN/2)LI.`^B_4nc)O!jke#?=SD+:-q -WmrTl3mCj9=KU2U[L2,R^LN_Im.Q?3Wn2'qgTC2XNQUF+]%sL/`)-a1HbEc>pZr@`#Cs[!YdfWU.h.HU -j)K>1N^G1Tb2fk]8-/5p6%MnrN^b8@\GUM9,E<@V_E@_T*NXOc]PAYS%t@^+MO -elrL;I)33p/U#m&^?'7D>].!Y$Q54T^##rZqt:6kK>:nL=Bn<;'o'_;EO`Z)7i'6YZEfm7X9"R/AO)oM -3%Q6a$A1\h0\BVk,7o^Liiso=;D/rIa!22[gjV=-OiX?()*F'Z-Bu\"Ep6Q?>0;?>-F7F!ic@/OcR6'` -r;qUhf?23/iHU% -)XrWt?S=A(h>[;%_;MLc)E&TNM8dl#=OWE]`K3)jbt+XB=oaL=,*@r]1`d-[9rF[VjC4*C%uA.;b/Ja/ -0,BL9'[&qXG!@%08E3,p%h5UJe'*\of0\ -b@OXfFXj4oX]_[TlP7RmG/7Oj=0.],/WS(iZs)higJti'T9u+1!%:Z2]n($,]Y=bL/0(Z -8Yn2a>e3ohQGEk`3N=QC2k*PiF/eNgIlJjm-qL?a)@0NB*0E]?=j!7L73a9>3g9QH=KEYZC$ODt(o(#3 -/63JUZ!V+M=m\,41=:#X\6JA[9:`b6^0oeN=.A%BqgcCgYP:3&"cUUAic,g:DDNAmaQ'R/%%^ZRR"-rZ -/8,_1#6fcHiD=2u-6!>J6t-S%>:M';MT+UQR,h^>)ir$M&igYl6RS$h,gr)kY$ENE94fsTPh'P-REfEn -WPn4Q4ePS!;n)]@NCTdBBiMZT2P!XB<,,DoV(h\%+P#d8MUcm\?`hsreggoac"47b/QR4(VV,ms>]$r3 -L!o(*]Nsu-CZX^UHbWs-(d%^5"bsAsCA=T*1EDCp@raR,Q<,Mo.)6@LU5TEc"+n=H:m7%j`=+aoiJ5Tg)nqg>CUWRE>a!i&Sme*Al'<@Y7ZX]?rp])@N"0='4^2!.^gQ#*p6Aet97[cqbCh6/bAh;\6V^>L[>/+sVY -Ku)`Q3/h/c)iD[G1&3A\;^%IKjkpQE>:KdZJ\bb+GZ5S!$&6=Ud27NGrtUG\it7[.DE/_u8)t:#'TPa) -4sGeD3L9fk9No^jDqieO+sH.1A$Nc+VSSV!dPWX;djY?AFd!4McYEa)!l:2BXc,q -ZEO<3#u%^1_'%*)](pscL-jk(#[@W9&VifKYrHM&N67.#A!,uFH:Js;80ma$9TbSePfmWZ#t0Lq!gq.X -J-iUJALM+Fk26R;.YU9_d:dW:9d5ooVUDHnb'cmW<2`fsFaC0![p#rcC\>jSHGa9ufrS54/Z-j/[b7;I -$]WeAN^n1W`V:59XlASk]AE!8bPh;?IDOhqQn0j7%uS870f[rp4!Tj/ -j79`3[Sd*Q71`j'6r>97#_U!&OLTB^+Us7FiM@A*=VVd55`8LWOsn9k3Coq._bqp$-Up>^P1aR^2P-9` -Obu"M!c^5k:(tdhI.^i,;_8dW.O>sN6__lWlfJWB!DQtOV_q&b9!M-me)q,T1Fg(GYKgrB9)XLf?*W+b -9WEf@ec<3aD)Wu)f(!sjhX/n;IIbX2]/#dJ]G;:iL;Zi,F1at,'p6Gqnek,e="s\dZC+N;,Rt1fK>O;. -a@nK.%Z&%IE;6M,/JO,_UG9j.H8cq+an$mrZ4uY?-Y< -qYPC`cgXK,-5q>:`#On//6U.:M`r&A8BdMXBS:m_e%c55&d4.jWM'Z0o!)O2=2=kK#aA3mVHPS3&ZEoG -2\K>uQnfO!MErS@8L77`>6ZB,QnVXdWKbhD0Ur+iYpldB#sF^&Vc4Q[fp+[hcfm8I4XuFOR*t14qMcDI -:m\JUFO12*Q!U[qlo"YTQH -bN6&:SB>V%S'<;oC!7id4eJIHe/AJtMaX>ekqjTC-CB[g<$P,(7S<[pkg3KD>*:LcK02YhEZ!#d5:;T9Ab+1N;$?[rJjA7uLcd-r%"uN,E9N6I-P)*QU#Qj5l_I>;_=7>!('gbk_(E1%uE_aOa*C./K0R;j3cN_E^_(4aCLHZ1o8_];6!SFeN1BEZ!4>3CGktMK"YTu -=R=Th7@)D8[9IL6qd%4tEk#BBf3?5Boln++DjKBW1BNHMiG_nH-6itV`a\FK)J28MP0-]2=_!Zs'Oj'H -N_i8%./3drRZU.]r'DV?6711.YQRiU$UuPoalR!G0,K\j@<+oMR:s'ob2lNXFGKq+?SH)5=esb)2P&,@ -ZZZbq!5W/#U@^Jt`fET`;<^ogD).kWTiA"-Wc_4C7%i*][4:iaVbjAE.^]$s.@/,`g?hqaICeHU\_Jg( -/$7h"HFmN;2r!0c"+\5Fn@1#-'+]u=j"VD;?9]BjalKXF/A>Qns+*GnOB==\&IF.XiK2]64s::t,)@s5 -XAUVfN(2gsf[P4-+-B*)OpNt*:F25tj\jc*^0*.V9P0JK[*!AGSB^4qg#W-V6(^uP'KP\1-V-[(WK`io -/tYk:<9dI-N)$O5XOcBBWp.V>@^$iRFp$^&'TBCD+Xfb4HJNPLUD.HYU7"-F=5Hs8$ha)lH;cC2pcL/B -%>i#3(@1)m2]n($AF`l.NaF48@'/&--mJnSb(IQ>&?'D#*t*nBU/;2d=t:GI7\]F_b]5ohKJJs3W>q3q --BuY!Ed;K$>qD>dVDCesg1N@5c6m\4m,id[TMMLC8f\h(8>=OGoVua`8H5X-D&0euNr9m1Q8q -*t^o.'G:WSKL+QnBOiG/$\XaP;']+=/HRLn%S3?/Cul^tT++>eA;qH+PY,L87+ukd0:5FEl/cBgBf;F) -k>PA9d;M1?c_qO='_uX\@+"3qMH)R&:SlQTeLEoiN682%.eT7lDS95X=)9bk'pcsSZ.a$FX$s2ID6't1 -Co`iLkB4FCmoO;dk50M??uQrErYG`m_I;t:S7WudMoXju)*F3d,F?P<),-o4$4-fd_BA?H1bo^RKu9W> -#_W+,(5p0W0rWlJ4!'I(,VgegOuRhX&7k@"7&jHBQceGGl'0%t2O_o:Fd1U%$jC2QH6%u$UqXq"U'Cm@1[Rmh0d%n6_UaZPX[)5MaZRoedE@\)ihr`dMW1J -5:)F`Ulp"&VHG=69',WsK[+-KAMVq;H-G8j4e>I4F;a`YJO?20BbX0>*g]Hq;sDgND,-d(WE!^KHIZ30 -=g$?Aef"Yia^qe]m1u0kY1[[$>OE:HQ-Rs.71a@gMnS9KHbWmk(YfK""bjg%n9CH].hR][@r`F1Q9QaZ -b%:.j"AodJh6+5FV<[Mr\?K)ZX8W>)K#6J#pcM:j'o9ihZ+19T9-9A=jYHXF!u[?GA\d6.82MY*$\Q?* -;!;FR,nZ#&,1/B_<\YPQ7q4:KjFTN3o(dsYAM]cLB%)%Dk&ibW:M8-di[BFFU!Ta& -H8R%-9;GK8<8*$iV,"$iC:-+1B!GR@f5"COjaP0WZ$[Q?>nH- -rV$>F_-i-W*',S`MkHB@V^,,t+EGTb%u-lZ!>oQ?5bO2u.PV3u:I:b:Zso"h&;`eRb/Ja30c,eg<6I_C -H9iX7aWtm!](pt,PtGV.l"n4>17-5H//C#kD`O=_VmFMCmXm]s:agF#/L$$DUXJB`b'co8nF0rFK/b$ -R*4Vj=NMlr3(6T?PF;(2Im'H$kYrab&rqjFdbohZBuq&uW#Vg["6$3nN3$'\27hKR2P.-TX=2%+Ra#NP -Vj3/:A\-W7\#G[OH_oH^GJ.=#X*+"`N/?!+didcmU.L$ODC% -T[:bR2AZjZ`$00qX@b&UAMVq9W8qhX+HOU=dRak57jaJC-$"9IWa.0Bbbd0fK\C&tRa*:%WU/bs4J5KK -0D[7=O%?(pWH?:"3hK6Ie>dX`@IY$tX4D&$WpOiA>Hl_\;XYYrFL5?Q=sEA?kr(N`RToJ0Kgta:o6l"b[RtOJGi2*<[r^%S3?/:+D,]7*\8t -;DL6RNlU2D7+urY-Bb,BjqB2&c=WqW/a!eHbjKmBS?:De)ANm?7ANfF<,,tkRnI.oR8k/r -8uYmmr"^(TLV_thfW7Oq -*KA-M10FIG7g/k95TfJD*"iV`K>JccW*D(s%YqtH0Os)jK+s54@e$D@E\SVpa5aH3*/[B4PK>*`BhYg6 -/sT*VZPe/5CG_O)k;-i%icdSXcmP&,r=4HJUX?%qJkT(0MPjE&[46T"UK";EWl5gOD&$?[`=#][Osn:[ -ZQbE16]n>^N4.L.f*d0B2P.M9m`EL=+J0cQ0DA.cotIRbQE8`\8';_=7bQHLT')2-:B24719PBk[?GrVEk -kO[C2%Y[?EdHHgP2("_aVc'N/g5S:$s/T/c'q3Zj\QuC?lkUNTNlbk8T+OI17B4gP[p*_cbE]g)EOoHD -f:/o1nU/#WE#8Eeq[%hji:,Bh7P>:3`FH0?r0Bi%ONV2*n,uSkq#Z.5i38#".Lcf>_dRNJN'\m&MSu7- -Qm?5X)ihq5n]:o[6R7f8atQCR.TJ$O(8]%s;2Sj>73&0P,>os.3hB+0Zd^194[Pl>d>Be=,*b_q.i%^A -Kg)8/;_8dXC;jMc>clQ-lfJY.`F6%)XL=$5Wm>IfYZT,MIE(5d]%o"543cLPGeN"<\-qF+s+A,G0_fF9 -.@/,qj)LIQN^G1Tb2fk]8-:<,b(2i$E*,LL'aBCZ@Bd7`7NiG#`F;\XUg>nrN^b8@\GUM9,EYQ.0j":M -<@aA.A^^C-`aprp9kMk"`5)/*+O9/Van5jh6_Db><,*^#Pt@iN.FbqW2PF'K -cR0Cjh#;XcU!TaF)Ee^q7\nK^F&l3kPu+GZC3=9n@]39rHc@eZ.LUn.kRLAC9q+r2VVNKj)DQ` -m^F^SAcI(ih_2J)rW<7S_;R)XCd''WJNb9636ZP)+-O_,1)Xo"?3#j*T--s$*#9+kKgDDoQu"Aq&Vrj6 -nQ;#Z'`X.^it,nZIR,-4a!1"%'UC0rNln2]R<5T=/XT5o;d#(9BfMSWB9Tmul@B'`d&;c#*?'i+V,D#l -MKLKb;1_cI2*/#k[0/'$O[^h^Gnb;%*0!LbAX:YSZs"#t[.UlbDFQ&(f/p+^4KMW@Dg/8DnP$;oi,Eol --6E\K>HaDR]P]MGOiV)'q-94i.0*b\R8>:W%LWPp_P#8s9K![sLr:KVpoI(>'T9u+0Xan3Poc#Wj>':H -RRJWd^ZBLXCq<6]QV=8t#uo2S23Z;J&p_]uHU+4MVpn$?98m``oM.8/?Vo) -PCO3?Lo;"##6fcHiD=2u-6!>J6t'Vn*)RFdN(%5RGhcmk+-/pL0KC%$9.,:VV'dNcMHMQ#*2SE8;CNJ@ -S'@iEKHb7r4eL&_MD[7$MaU>k(%dr#.[`t//Je!tSP#k_X&PDNjpc4?>d%7G(-;D[`FcD0=NmgGZI`s' ->OGPXV8hhB]3]Cl]=mq2I_K1Y=iD-;lJ4rokLa$%pMJ(C[cApK]J"F=Y.XhQ&t'A -73aCmqfTd6KMAAI[sPD87]*lVDi*Rb^B9,)@5.I&1=:#t`a\JK$sMJ7_9(eZR:lZXI)1A"+E1FN*Yem6 -6!,[M<'DN/ag/4K_b$eb]N)`FH2VCt42'58HbEd) -2uD_=rIMgnm^(*V,5l8pf5\"kIObSc_WKMBK^-O>nd8%gmqV+Y_PR3[52m_r@pLZr/OqN5m.T -khLVK+Haa@Z5Gcf*_CoTd8JYFZ=>MT9I=gpXOO!HSKatqkRhQ[E^^hDFAu,[L2o-qOd+"22P3c3-I^L; -[8e'=;c]ra[.:J/@'NgMG&%GQBXbA&m8hDY]%"2r0Q))=V:tNc^"r.dX7akl`arP^QoluG%uS870f[rp -4!Tj/j79`3[Sd+A@ks]R8/rBW#DGI;OB,:3Pn/\h,#K`c?83:S`?UL'<,+K6O%?"mQi)_,,EBoWOr8AA -@4dkik#5EYhIej<:8\c9oKl8LPh5a$'LAZsW\liFW+OLW*_BR#H2A+,hJp12*bl?RYt=,)J!%,Rt1f -K>O;.a@Si)%n/lqE$Ee2jGGZ],=nSo@,u&k,:#$)'Tu"?9rFgC\Pb.OVO,M=$0>X1CH%_X-Z`iSd;M4A -:ZsW-*;sch@+$K'RU%tD:o73kof>_LN683PCDEl:Ekbh_f;r!\*Lb/bZQ-8pOMp07=WF#;/!tiBR;Af9&dJSn6/bXRA0r6'LI>S`3.+aQ(4j6\ -;7P\14WfbVA5YE5Q;&`k8n9UrK@? -.]#nB7]P#hopXu[]iqXACc2))QHK*?LGg(1e(L+)11'nYL7jaDA,a,,h -Y#<)G18XR[KZ\'eS':%OC"2-d5+^+KPUZP@K1)K^V[TG,.[J5,e1&otANHLaWRGUIWm*`0;6AD![JJuo -X^SG;/=)bgWnV@!g?plbQ,;^-]&#&>leV./I_Xep3%Q*a$\lRX:Pb_T.iF8bj>$H]G#KWNalT0#`)-^B -"G+Bt&9q.m)$u&7iR&Kq:*14&^Z,nSA7@OuMoK4gf`Z1_,*,(NOf;;X0\P>%h%C)$N03iPtF'OXpu]k4d3/O54a,Z0H7jCn\)/H\8/_8u,D*;sO -h%>N%2bOiZGNM*.M5b%7lTZMAUZ=YcGiB(EL.hI/O9:1Y*i<;lh_UC:@HNf;nTQ%>r2:ZI$pRU(*jIBsl]t[gQcihfH<`0)'/+f(XF'?E^jHrX/UNQ/HVK -C`T\mKYuiT=U]1<+-Oe.1ANm2."Zht5p1,K6lm'IL-f=Q\9(1`'8OP9;.ub32&VED,LO%!G!R>u_'GtY -4Jkh'PY3<#fn@(G;1_LS;ea/][5p;lN)SF+.-3TP)NdS52'S)QUnJH9l?,FbN)?RSQ"m=E=Kei..s9SM -D+q<@f^-%>25\c3>HaDPgO6ZlF1GRo2g_C\m(m0eYF"SBrrmtj?ng4q4r4fh`FEmIr+8;:Oh\[%fmL^= -rrRa*=Nm]o.?r#/_Vn>4Ho`J]Ktu]QBY6qZ(Q:cA&_P,t^T2;6l4_dKb$m'\E%P0[mMgFX3,?,#'4 -\_O?s)nj\Z8YBD;=53]F"+J'o0R.Cd'Vdq4,-dO#!G`fu72W=U<)LdKc3%gI\R&;ddd2BNEb -,8=m+U7"-F=2n`iW8rCaVHPS4;Fqjo;(%L.f?>+C\m$hU9P0Ip[*ESI@'Q+u\a8m86(h';oNDtJM+=C? -Bp=Kt/tYk:<9dFP;_=89XO\n%g?!dm@BWe7(-=C>d:BXfm<4t1^>3e;h!PtOQ.GJLYWqTCg\(RIJ\ba` -Qs;Nk&W+J9n7T[:#9AoHjDpYN[S&=T4sGe:-mT91#_U!ed)\m=(Cl8>,&m=Y8hCa8`hP90`-O?aNlWJd -.4g3L,a:ls1uj,o2J1Uf(o+\n*dj:T./%LnY>RX&Q-#CDFFoG-tYZ=6rs,-%aBOZe912]2c;g -Dmin&f,LR3m;fjFD`<$npA'3Oi,@7!"qM/s`*kB&HsO+C;obW<3BW$t-'l\=&O_iD$4-fd_B@qW,V9`? -LVX?q'9Xc_'T4/q;+$JF'TA'mj3e5RGmKm88Ym&A@Z=)5QV19"`I,gB1RcQfb=0)/GrqVE-hFaWq1D)1 -;/#U%9eqi+V:4\1(,IG</+tJ&P/1b8g$H/*?)l&iA[8H4)hlH#FM$>s2f$t'pO9j7 -0:49h%g.L&iNY@I?6^>F`oJ`_r16h;QHSD5&,6hK#mGrIi=MAU/f>+R6fH)(;$J<\M8`s:GgonW)32_s -dMW1J5:)F`Ulp"&VDf$NasI_a1ql`fQd)@[)4]i'/VVGW;g9ke@m$M`BbX0>*g]Hq;sDgND,-d(U68tc -KN2ct=g(llp"KY1`F:76XQZ]ZXs@2ZS<68kKuk$L\/^K!Uh/]_HG3bT84;0Y"ba^e'P_GR.h\FS/+M:$ -IRbTZ=tT?'FbPhkOCT_%13'7Bpm=rJeYo)h^5.?Bkh""Lu"9&H+4sGe:;@F0I -#_kXm2Lu-HN0fibpiK:?U*+"SEI+ -K$bug>!aXF"YC^V7OiOH'QU)kNC]jV?F*b9=)/(0g3USEYbMnICGhj3SlRB/QKrD%hPOI.m[%^khXu0* -Xk1c9p&b8F_I2lc/4LEhLL@BT=PS?e+d:#ZE]JNC!L1E15bO2u/0YT3K0pe9fN^H^&;eFQ176<5'5CB,)DQVZ1,TC#uST_QtW#!MBdf"Hbh_#_X4rY/h`SrV> -XDUBIP/h,h3F&,,!(f?uTMS0!((ge*6(sC-Cb?])J]*[J8@/f5(c`e!;7Pm>jVp2uO\!S>RS,#n8Pk8N -oX8*Z7OZd83NUUjXB3\[F/e6j9XJ$NBQP^M*fWKjYF%/XD).YZW)W$S>*W9i_.,7$3tt;Q^QV$?r3L!iq -4IXN-deFO9$V,]mkgQOH2P2h);lV]ISQ_jlWn(qXWpOiA>EY.YQ8DU-cXaE9X]C?c]%_'M`@a]^V:m>$ -]H!&'/)Bk4EkS!&8>Ki2%>D^ZYc'tDHQ/$d,8=m/Sl[>3J1DB!kS+X7"bA+gMg/2V(Cc0fiG3T-"t:=F -`T'g_jC17kO2k?RAlOd`,a1i3'"L-558"n@Ee>bqiSP?%] -.TH887]BIigXl^%V,J^0gA3*$tasK>ZYf -(q`ksj,Cq;DUp?;;]CJ75R8aU]+uK=[6mE:GjH<"[Mb58# -R67KR/=4NA1?k%?B/Z4(-BkFAmW1L_c3Z0c&h8`-U!b?rRQW-i9VrM3FVIhNWrjqRc:F]FC:K-]AROa,Af.*?,,UXBGGL.NVR8>Qr%9V,69Q:p=\)0F#01Rh*O'1p^1 -G:.mdkS+pM%Z*WL;<\d`f -MSruo6r?DY)i[?4kb?Q8ZuSSPUp>)>b"?\3,*A&QKYCqQQ_>(,l+H.tN)?RPZha0;=KeFGBU!6eR:s(+ -dqP'3NC'#A?SH6&HF74k>-?FloudMbYeag)XL`+CkGN^mU,q#lF@,EbP- -LnY7W,*A9u -]E&_*2*dgr3"cf]SqOu>8AuL9*ta;VQ&>@fjt%9( -.W7>;:8bG?r9f2$Thm.ZC+UWd8u'i!1s15-P0.@AWc_LA>-h>5ea'WCol@fVYh:QCCE9"iBXQQr[[V]N -])T=s0"5W0iq%K0h_2J)rW<7S]cRhS*%iWNT2L;[Ne(,IEj(Q1a-EN&5959,bT -UbYL]RRJWfb%1(BCpHgYA[80h3L%s12Or$)F,AuCHU+4MVpnJ6t-`fHr_O/MFHQ&R,h^>)ir$M&igYl(eK;$&Q5T=VHk^=b@VDJ -PfTU%S"cf:\/B%-E^^hD'I6PuJ9!LkOd);?.[a)/+VSSTPu=K<;5pT2WlfThYHM%Yp)><+9XJ$Wm5Bl& -[b5=uYF%6fS]^2@]3]Ba]>a@5_.,7)(b?.-%>D`/0j&g0-Q.ucA9#.BL/TC`bWm#hV@3e<"+nB-9Vu&E -)%22;+n6t&;Blp5`M5/Dgg3&\O%1Gc.1DA*-AXnJ19"Na>:u8d-8R*@dVCb1c6`e7;$M5-Skl:A$69&' -6DIC+oVtV@O\Vb%l*Ukh8ukgieLMALc#U:"X]R*^)Z>Q:A@'qU2JZ@TC,6fi -7T@Q"]S8p#P"F`_-+`o)/!e@)di!ha?T"6GVMl9H.WmkEcY+!g'`*YPU1:oLaY4WL4!VBW"i#T7BQE^^hF[<,9gX'8"7%7m:+K#M0'f[,J^ -oqKuN7OZd;l\3#7XB441f3>rRlD@`:n$i2f!saFm/_A2d4spr"`oAfK]T,'"OC5>]=_ImdK#W@-+E1FN -*Yem66=I+.F@IDeLW*_"BV\rl)2L&9CoHuX59Z1\jO,JFQ;]/r94a:^>fL&)QqZYk=iA;Z4.]5\e+s4P -KgVS3B[h>s-C$n],)A)0I6+'#WE![jHDP)Q=ftfkeZ/js_dBZOCmKDgVTik_>4'nqKsKfY\_M(hHaW#% -Hb<]==53uZ"b+alIK1I'`m:Hpp;_72R!c%1%Z^MblBT1usNK7#k,HOmpkX -7Rj/8\En>DRnlSNOu-X-9dl9!;p*(,\m[7ZbpDXdU>BfKS5,ugahlk]_4]0=<(]:lP=;=r.?p\;)3n$t -<,-PjX^\85X4HSob5HY(?*W$5Q7FP]cY@#HR>S3:?M0$eG=GTTho19Qo,`r8>T2JPaZGASPc=b$8?4p.^*!-(9;SaOsn:V3EW?F -_bqp$B=-AE&Eg]%u9/-ENYF%!l -,Rt1c@'Q+rW+7M"&;S2td7B3s-PhZ\,B7tpC-VX];FQX#8&=HFI7afIV1r/V_S^ZrsLhb?_^0E44P=pFEAo -mrQ.tY?-Yf%MKA-`8P]\N+ORZON6+42,'_p/XV&1&O`!#&dJSn6/bXRA0q^^JOC)I.&7-V -(5j/p7OZ[,3uU:$O\!S.P"-g]TbD/)<3fP`;5pE+.>iCQYFA96o9n[q9XJ$MkVNV](5Y:\YF%/8>q27< -Vc7B<3e^J.9OP,n=m]7*AZ"3t[p3ed[SncCFh?J5(VA5ko7+J^0A%6k%h4-/ -@<"8S<]:NgaCKLIRt8.(#F+.[s,'P%$9_:@F+ -#ce]',$M[.W_[HU]F5fF/N!4KMWCYo%j`1Cg9c/b/WVL.a%]a=Zdc`FBL)e64jMNlL,-)$Gsa-':cpP'L$(8BPMLV:,`u`b@5u9W&P, -bhdJ*SknNk)>+>f6_d<3oU8c4R8'SXl4k5&:8q6oQ?uW/fk@iumIo:g -cK02YhEZ!#d5:;T9Ab+1N;$?[rJjA7uLcHdg$UmEknApPL -,nPpPU9TLt7Pu/S7cVi^e:p;172Vhu.7BEqC.0?nZMAUZ@"_7PVR(QR0h/%2cY&*r@_RI^Ti!61,r3kd -8u>MN[0h=6DSBN/.b._9C9q0H=0$K?m9P=`AQ^S8>OHPBi\\D*"1^kL8,fnqB<%ctJYi2("5SUf/^Ag4__e(aR'MW2dOCX]ql. -.ok=-I`3!Lfdt4F/YXXs[G&nsUD:H'EjqYM8>KhRo6@rTOGU@;rr[d@.+HmS4rHJa=5rb[b]ZJnVHPSB -R;Ar*9XJ$>TTD,_h0d%l_Vn>4Ho`J]M8UU#-tb)F@#;98Z]6QM<1,a'T-U/*8&9-l@H>e4E!RBi5S -\ZFY)31\?mZ^La^JNfaS.!02=,)]$fd3&#GI6s],WRWK+C;")_>-6C,[8Z'5K4(rdCj'SGU<./Vg?gfA -ICeHU\_Jg(/$7h"HFmN;2r!0c"+\5Fn@1#-'+]u=j"VD;?9]BjalKb<*55;N5s?Kc:e2QA&I4"UTobXX -/fbO[7,dZ,&m=Y8X076`hROpm!:l= -ON=5<8M$<+.$,M_6lB7<=Y?)c-?Ap`b&&u)cDNJ?`;4[BT$Sm-.P1jc7&3\Z1s0)bPu+@-C%WsX;Qj$# -eZ2]-h0Q\@Y#qau3t7A!B!g(01:q!Fh/KgXXnOo:ddM@h)NdS4=[r@?7:5O^ZITg!E^^hM-S/jTq0PSA -Ed,`b&N652+VSSR&pY=h;aK@rLf/M#YD5LhnJI.OBX`mh,4V&]DD&D*0OteF%$"%.PY!0!H!I49_.,6t -'.JmcD)IhX-W>q]#X]):NCDFG2G-bPY==Q!$-'legZs%#b4(/#QR=*RWg-Hd>,tY`8>?o5j^"u1%7m:+MTKA6fhdO4or?\\7OZd<$^J`oSlRB0pRB.e -oVPeDn+[k,$O_X'/_A2d:+m?@a5aHbgn$k^P/]1`$t`EB"U'Cm@1[Z_)Arj9_VrlZKMEU(M++/$Ggp=b -b%7lRdKoc*8L'EiV%Qp)SlIA.9BC44FJ8^lRn`&ZRFLYM4eGO6'H.\rM**sGLbsEP,*bm";sAECF\8?+ -X&WpM9%@7W8,u`WQ1+r,`F5uOCR1GYY.JPY>HO4fSX/;P\m-m)/$7t.HG3bTfGj5h!JJ9tE>X(()]=LP -ipk\?\L*B%7:ie:"6(_m!eN\qY_YCk%1Ip-;+2<97NiD%U5Mhr`*DA\0h2^Npu1_lMFL/_dTJ]'#b+U_ --.:Im0h/%.c";go@_QnFSPLVjAYS%66_R@*oP."SDSBN-.Fd("8u#@a?G"phW\A(OLYlZ2"fg9.,tHjg+]<"9&H+JjEek -GXNkn$\gs.LnY;A,7o]#@Zbo*Ah=p[7cVnL"EHpQOi@A6Gheei&sZ(#&nt=b=!/W2!SX9V,=6l.b-Snl2=)0\ijat0SZ<6JE.n,cQ'-tK_W2k?dh/g)3/lu8r -hXqC-h_3'OmK+G5_;NU0UD=j2MSl%q8>Ki^,EU#YEX5(g!Bc$0^n?M&)O_0CKI<%BphW,7&;Vd$Mg2=0 -/JsJeUT8OKq1BfP87ZaT/>>]cPKMu<(,IFI0pkY3ZUqgTF#KRa-ZeP>!dR,)d-*;Y4W9MEAMVq-1:?;2X.L\D*(!Uf&u8Ge;gNQZOEg4b(9*&W/G((Cu6r.i%ilDDN;n;_8d\4K_U7!)kHb -n0fOl$Fa@r@5,2j1*7!^_d[TkUe-0XAO[nAR,!!L+HB!fni7,A:F;=JATEW:ODIRnb>P -WU/bs4J5KK1eJc,IfH4lWH?:"3hK6Ie>dX`X]ho1W#lU>)VoSI?Ei'5Fo*bJc"+07XZ"?k]%:l+!%rE[ -Qic5i]%nm'C[LuiEkgM8=*nfbK86elnMhL?`likE?L?Ar*V1Y3J,g]g3$\e)MBKao0Si[d)%VG>@F6KV -:+[3>73bZSgh&PgO%:Z%6AeR1Pen$b-P$mmW<:YH!TMK5Wq@sd&7t[%?1pg74 -Rg1NE.L.4rMPtQreIRD1;DPdhY1N#?e08`mA[C'PMD[8ogMBY9(&&Z=I`tJ*K.tuE9n>r.k-e,^_eV7D]o0aO:5.h[b/,4VVU%@#%I8#-am%$F+- -O\-n)R67KR/VjJNQ'q`3=MKD/!A(e -+:#h^"pG-\_-mn"<#QV\L;Mos(kbX+'o>AROa,ALP6-c=U[f8oN^4qQ8S&N[=/YF%4p9qp0T[Ti-C -)g0<^C1+<7=*r3OomOP]ms#fF$NYmt@_dRNH -;uS-YMT)=[Ls0Tm*0/(7nd,_^1jh_'A?pJ;U/rh1b%:.cKXtYMRE_U-M6,iW!1qK51XH:,I6=58BJ_aZ -$;F-f8gtIsFLn/9WCuN?Wl7_m>,p$9o\+^s]4.tik4X)VWmbdk>HN)GD8PIV]%h2t9?#WVI(eF@=:=O$ -s+8,H,c$r".2@]Z@e$u;IS1]GaQ3aa=91hbMLe&9E)P0q&rJ7\O[^a=as.B[)NdS3Zsk[+N^_+&\6)%3>e1*m&P=M:M=Nmdf6D%,T<9i!``E'@^&u$eltROPfmWAmC(2\`o2!Jh/6;0V;C#-^0bg1r!!B0K>M&9fR-.9'oToDa>iO<.j'qq -jRUu/_uUQ<5!Yd&3%Q6a$A1\h0\BVk,7oP/,-^jT$7Z%7&7\T$ZqUCC'KL.$7fZ\Lr(o(#?ZC*Q?Z2h((.j.YZ*#9*_=tS]0 -aBUVH%u%.;bS[-Z.i417A!)T>DEf/"YZT,K,aq@RPtGVNM0,n-/XT5o;d#(9BfMSWB9Tmu\Wk9K:hXr# -,p&%;U=/9?b#K&R;5mO[Q!1S%Z!"20l]p2sI_f,M,)A-=/X"@mZs)higJti'T9u+1!%:Z -2]n($,]Y=bL/0(VP$h1p<46-bR*2@*$(T^b3.VcV;oDZ'I0(usBI>'&MMcGM;,;qB;DO_;Vc5-fjJ6t-]c;_=7LMoDG'\C>[X+-&l9chSiP9dc/tAQ$'L[TtPR -9P.3`=n*1lRnb=%RH3da3hT8^1\qh%M+=8fB[j%N/tG_8;^t`h"]h6oW7C36RcS"l>HcXp(-<7s_e68Y -/Cp;%Y2*j&>Ac@rQ.G2D\__5BRC2Q"I_]<0=8X*E$&?E-B#P`r2&2(jc&5^UOi\;Hb%n'W\iG#6E*k_egg?m;^n$TY1N!j$QY,J@C+W):]"G'gMXLU/iP;Odd)(ghCggg -Oms,O^>JD3$m#caJ]$G$(i2r'(QQIF0tA9Q9.Q7MjPU.Si[P*7J\bb+GZ5S!$&6=Ud27O3*u0W$U60]M -AiU]h7cX$l"HGnsONHRHM);)4/!il*'%r5XAMooNk&Zrtl>[pl^usp]%1[qXTi%bQH;u;["";Wu#c`;F -#$S%W:.V,pAE@'tT++>eAVS67Z%\R5iAl&4=UdKKYq5;k_qhU%uS<"d7Cob1E;$&R;Ai"L-[#HaX$F;9E&!D -QHQ,r$&m#>1n)[do81]VA:-fWB=%F,!f'+:ctN&D72h@`V:2DD$>i8);QA7sofC?$[90Q_X0rAsMSEZ* -fdui49pXCE[T]fB$[p1RFL^.EGAGI_pNO@.Y2l#="Vl[,i3;uM7N3#"`T*km*/7$"OigHm=a0u;'O!L@ -N)3H;+pr]T,*@u>Ho`DaLER=Fkd4eON)?RLOm)(U=KdiY,][$UND-]`b2oqNFN.`?>HaDM=hNI.4.T/[ -1\p,6I5kW>R8d?Q)Nd[h;e\)bAO;qbW`896.`GGp=05P>Q25hVQHHI8/9Y5dT%(o4gMPO=KuW4q\m94* -Hc>.?HbNc.6lZ+/'nF-YYaBer-OYjN@kh*@L-HuEb%,P'4L>*?Hpp;nO>nd8%gmqV+Y_PR3[52m_r@pL -Zr/OqN5m.TkhLVK+Haa@Z5Gcf;'qON-$&6L_HSa]bbh^<]ZtRVSPCPQ!_a)SMP3lq1hn$PMb'\mWN\.; -5,*q5<8_>f[92LI0ij<7gMFL^LQ9-[m`e7'aX`iH.0h/%Mh!Rbq@_V;V]O%eNKeh%oJAGW4G\eu9 -DSBN+)qiUL$7=t(8I7UqQ];_=7VON8\F-iBQ5 -.@!NeP1ark@540Dk*&rT\G1q(c=_3tjSjQnT$Z[88ei,(8#9(^PaZGASPc=bl1J5F>,bT*7I1GBX:lZQFh:>iGH*ZmT3VhhWK0r?E.P(c1r*)_-c]!*%ha2M8Wld,ogec'opA\93Fr^aV=e1 -*0E`>*#0082'S0EW+7M"&;?ekC$;'f.#_$&UG9:,H!%82aCGo4/:gL%>KS6iR9[=-.9j!C1F]-FCH.g/ -VUNZ2p3/].Z'eQ@,n>i(UXH*jb"Xd\:8lYlFS`+3X]2@PX#8%0.@/,[fPD)q/Xk"![+_X*bAFiJE4F]+ -G=uB7'LB@fD\oJAo)F'Phlp2k*ZGKC_IBbE]M7SjOMU!5Gt_gS*LM?g:Pbq`&dJR_J0@a6A/Ya]!(#TU -fL/Ub%Z87M;$c5P0c,eiA._A>G"j9D87`E)e@&@0Q:R]j$)G9I,FZhh;jl_#EAjB7-aXd;5%d3X;/%jJ -AM0NGW)IFfqNY*78V,G).m]j%\lC_f)IQ3L3mg/1n/>R\#X[iCN"/!8!?E]tD(8B]QSpO0h`d##.' -%h"%[.+Hn>?7A"<=6&j3%$js;VHQ5#l=Hau#m5dr+R=1A"r@`'6_Z:@S3AG9Ma\iV(,IF!*KEXc1'nqL -9-TQk,k@p.Z;E6>bN6&:SB>UnAMVq7q:tOf5+g1M1b'LYMajJi.5\%:nJ"9de*5BiSP#q[X48^8C<^e. -?EI<[[MnoBb?;-$/67ZDZG17\>3XWXKpq+:]%o"4qM!5@Ge;fcf;j&JdtAk$E;1s?.iW!=j"_?c:.m+" -bN.R]!!2U(6%M;ZYX/aJ)$u'biUGKQ:*gX2`T!!S4BaN]N^r+B#kWjC,EkZp&m7o"<@sM0j`;9L-4)Lt -9rAY-eD>C0SknP!(a2A(77C'%n3YYTP]B20WQ-KJ3;@5W,:_6$]k4fV67113q[J)nUJk<3p13a!?Yd+) -/_:qNR:s(@?*:Y`e`QY9>HaDQr!if4Ku.9fGapZB&V=DqR99BI6RA#?Ab'dE;[&-^JjA7uLcd-r%"uN, -E9N6I-P)*QUQk&3;PcR8=q%/PZ:!)]\: -?j.a85a]u6FK00ZT.d3@C=J]ZlEa0Y:+K:Im;et'Y#+B5gHC;5BWTs(FurE!j^5T'mWM6_R\tKTfItjW -L$%WG[T'?<4>k_(GJIX,:cm':hRStMtasE2^"N"@^ -Qq\p6.9+`.0pPJS1RQDc=$`P*kL[9'J3)ASR1D4Y)af)+k6rID`BYdbZ:'+ou;j"YT69Of3&a^m4fCn=r58Nn>k:e2QA&I4"U -O[U*,3ZATd,)]8WXAIu80h+o8aN$@kt)bb2%6W?a3\6Q5_E9c"XOgm.T16]%M#4>9ETD[GLG!]jC/o -g\(RIJ\ba`QcL$L%uE_a0mKd3595m+jRO0^Q<,d@4sGe:-mT91#_U!e`"3&4'+BWr+qRk@;ATn&7O)ln -X?JW_Lr\J[3=M?H(QQ;j;TWa$-S(A(V@ol0AmGe.bpN$RD#.9sQdDTc\g7i%3g@pfo8+b/O\M(gV%];o -3i>c8dHQkk4U*oEYZRdR3t7A!B!g6.G)Kq3gMjXWXk-2h-3\T^?>k%GmHXXt^Yl=U8.e?$LdbbB:a4IL -)KJ7`Z8ja=b9CtW)NdS3'G:WSKL!n@[.Gsi$q;Ypd28BG.%XHiit866DDn@q/`[Nn%$"%.PV(JPjp\Cs -/=0%B'01HkAN#uMQn2iKmX%'g:hUP'r>()VU/C/SRUm\69;g6R'fk=RX]MT)CK7t-G.h7e=DV#"-'l,i -71a;OX%fbQD7Ee&RhDQJ]$E-=EI:]'no"b0o4U?2\D+ij0AXfG"Wa9`?^R[<-g20O\;K*H&T%'/Xj\VdeV,X,mU'Y -jqETb$B$F(;59A$m37rnV,SnO)LY5Y<3+O72/:ZN[pH5i/!_Rq-HTjg=`"q$9sWAg[9P;m!fRKMMS!1; -7B=u&jGG[!YR%"hpuH0Y,;An_7OoF667117%$j=!UJk`s$=mV+"U%UO(%?HA+r(G`/JdjNN'\g*MFH+^ -Fn5ep*0&!L&c!,e8Kj8H_)/(#'1H`FZ>XlunjUWkJJB>4'*5KtbrD\CPQl>A_gA@(_S>p\Vr$#BILbYa9o?r"nYtVZ^E\raAMT-V!mtn_ -JO(Dt=@=2E[pLgtOQ^LE,nZ#&,1/B_qpiRB%)%Dk&ibW -:M8/Q"U9ZJU/);UU(&0-8>T7!PknZTSPlCclIB(W;RKT.e,U6[jXS#TZ<1nn$I+UT6+'a.G2$T&iW-IC -XB01[T#kr`h(Mi6old*W_I.;l$\e/6KtLHk=?LIC(QlhuZFHE@!!*.P^s@h2$lFU#K>M'$GU,Tr#_kbk -:ahQ;*uBn:,;EluN2oT]P^(YMd*BP3D?k^!4Q;h?r0B6((ge*6(sC-@g.h6Ld[sl34)^@'TGQAEL>g94X#j,j:Y#u -:&cZ-9')5hFM;0&@H<=fbZhp"IrB -\R2UDCmGGdNmD:D>4#AF9to;"[p3g;4136$FhHQ!=52j9pOU(UaYURZ.h@KS@dt;Z<];1_a\Ku=9X60! -!(@StLn`B3%0\a9N)6H^.-1dr)NdS3S5q'SN5Z?b[.JB%*C_I,dO?H%8tK'6jYFAGZbAuKj(BUWn&\CWpOE5>d.48p.I!+cY0]>X`hm)]&.J: -gobh1+U7=Y7:#@`S)*r@cH-^%(Id[=XK>q247Ahs1HenI(2c=YP)`9nU:J^>!..O>:Y6_i%C -'Y7:&##V;J;,msn%((CR-#1IG;2Vnj73&@`,>os.A[C'l(:u=62P.B_/a1.lRd#",h:'NcII?u[^L1u; -AYS&gL;Mp>=I^ksI)3j61&2fd:G%aR5Si\J$jm:CK#/Z"2@CCf%#72YnL0>o+VopRij"(2!U>mVcKhK.[@$I -DR3TOf;pja*J2CBZJ$l'X#733D7/-$2[c1jlZ0UC0))@0->S#u?gp#@*Wl_#_W!9EWMrB*N^[Gu#K2d, --^@+9TEc`>M?O,O*2#eH;CNIkL;P1^(h+(8Sr,t2Z#jH79cK,5'?\:AL.Am$Q-3bPq-)U% -_4")qZ[('_GrVEkkO[C0"cUTu;5gjJ<@4,)Vc)dOg4`:u -_dRNJN'\m&MSu7:8A&[n*/mC_EVSmP7j=,;AF`;[RStc&bGA,DCrTg;R`UC?3Pm7g4Ij`qF8>2)LI.`N -au"E:.Zm@f,a,P"Jge!H72W&4FA^2\E]#&'Q0SU&_dp%(d##.&U=EsI.+Hi6KtTUM=5>L\>J9=eVHPS? -\,5k$#D0]Bf?>3u-P;6Uj"^>AN]SPKafnmkVum3^b(2i$E*,LL'aBCZ@Bd7`7NiG#_]SDn`+CkGN^mU, -q#lF@,EbW/dGs47K.3).V3:Xr``k6d9dWeA`85VpSk`q)\b-/X6_Db><,*^#Pt@iN.FbqW2PF'K*.VW*KDh/6;@V;glf^0^9VP)]VIMSS0]M'T0u[>HsgN*+k] -.-6FK)NdS7ZiM"Y76mN-3%Q3YRnlAEOL/JV9b<.L;p*(,=tphPa!0e[U>A*XO@Z1Q8HR^q_3E+(;TX7;)_;Fal/2e.PMT"O0)!kQn)j&2&ZFLsh;?0!H,+qb'*#9+k -KgDDoQu"Aq&Vrj6nQ;#Z.2Rt5A!)T>DEf/'8Eos.:T2bmuJ%mD1n -0rX/N4!9U*UXD^BQ:E9dasD(RCoUblQcu<_8VGf12k&#>F/eNgIlsB"W&.*e)ML_VdV/9QD)._VW7.bH -$CtA$=K5E%ot&Cg^L!$8@obEdQHs*Kfr\;5?+Sd0N>-836rhP")D,96-R;QHqgV$SYGWUC.2dlY@IZ>$ -?6'<@:Ll4`'Om%rQ@LEHMD[/7=Kd?D+Rkb/*DEhE_rHaDKR+uF:+-/s&Z8i&N73u?HR8TGX -W`_!A9P(OjK[OEhS5&*@q;h6t5G1hd<&u<@NCTdBBiMY]nJ"9e<%7JYV,"-jXAs$nHI[2L?`hsreggoa -c"47b/QR4(VV,ms>]$r3L!o(*]Nsu-CZX^UHbWs-(d%^5"bsm&nQ;;n,9;]_j)Q#"Q(X=9bJ4]XPN3&W -"+nB4n>J0!'+KZ4$8>#6.Oc-b(8DIoOsn9hO!9T]_i^o4N0;j@kt+Y)[2,BA@'qU2JZR=1&K$a-.2@b0 -it7[.DE/_u8)t:#'TPa2P=ajKR8g=l/XK,m',d%[Bf2ASk7a95mWgsf:ZrK2'b6'hUJ^7iRT1u.9rCqT -'cN?4WE$!!lP5l=DRj&V=6p\A'opCIZWZZ2RoQWED71n)[do81]VG`oF?"%$!t.Pfi*nq1o.P -"Ts?B@*j-d-5?oC6Xe@:KLR7$MFD"%Gf42O)idEudJ3p"73dseAC>`kVH#.494cQIKZ7RZRS@DCH,Sif -4.]5\e+s4PKgVS3B[h>s-C%6$;eabXKgqn;W`HV%CebEMR`FH2VCt<8?NeM5*>:Gm&D8IN< -Q.bTVLiq-_HE^apfDGgX"bXZ\muVoZk7\6Bd.+D8Hm9j[akCQ1]W;/6!eJ01Y\6-C'+0H2+gC0X66d," -`?MR#]OEZ8NQ39Kkkp$",*BtmZ=uFq;_!KO-*[2Y!`p2*7:q`4%,,V!SA_=h.J,rX3f6b4FD.d`n;Al=*GChUWqO%^#01,[5q=jLh81$p\6JAt>IBdiI]Qmb -2k+[pX,=mV0t?S!6R.c9jXAc,h512PJO&.D#W*/+"opt4Y]s\B+Td?c@Z`'\4spo#`?T@>lm=@oKh(%k -8JHn0*gB9*YdjmsRl*DTM=V>W[u_`8Yo>LPhL7DTi%dglBPP\?EmY8+d'lWnsNak -?SMP1^n>X;//f$)KYjF%aD;jsglY?7mWX*)SPHG]qP5TK32BS,(Q:gn;7P\14WfbVA5YE5Q;&`k8nCo2A@>bsQqV*j3F"Hq2N(&@2"X53@D>-qCDot*@C!Ip0^E44LB.WpTfd-S9t ->^%QLMdrC[#S[aOs+Mh[X%PC -\SSZXmM?h-cKTJ`?1/T!eaCt*^.U-/pkA_SKu7?h(n=V[)3)[HneiF5:FVRPA`qDO~> -grestore -grestore -gsave -985 2034 moveto -0 0 0 setrgbcolor -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<5448452041434D204845414420555020444953504C4159> -[22 28 25 10 24 27 31 11 27 25 25 27 11 27 25 10 28 9 26 26 21 21 0] -xshow -376 2172 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 45 -45 matrix scale makefont setfont -<4C61646465727320> -[25 24 24 25 23 15 24 0] -xshow -376 2243 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<466F757220746170652D7374796C6520226C6164646572732220646973706C6179206261736963 -20666C6967687420696E666F726D6174696F6E2E204F6E20746865206C6566742C20697320746865 -20706C616E65277320747275652061697273706565642E2045616368> -[22 21 22 12 10 10 22 20 22 12 19 10 19 8 21 10 14 7 22 21 21 21 12 19 13 11 21 - 8 19 21 8 20 19 10 21 21 20 7 19 11 10 8 8 21 22 10 10 8 22 9 21 12 32 22 10 8 - 21 22 9 11 29 21 10 10 21 22 10 7 23 10 11 10 11 8 19 10 10 22 21 10 21 8 21 21 - 21 7 19 10 10 13 21 21 11 21 8 12 19 21 21 21 22 9 11 25 21 19 0] -xshow -376 2300 moveto -<6D696E6F72207469636B206F6E20746865206169727370656564206C6164646572207265707265 -73656E7473203130206E6175746963616C206D696C65732070657220686F75722028616C736F206B -6E6F776E206173206B6E6F747320616E64> -[32 8 21 21 12 11 10 9 18 19 11 21 21 10 10 21 21 11 21 8 12 19 21 21 21 21 10 8 - 21 21 21 22 12 10 12 21 21 12 21 19 21 21 10 19 10 20 20 11 21 21 21 10 8 19 21 - 8 11 32 8 7 21 19 11 20 22 12 11 20 21 22 12 10 12 22 8 18 22 10 19 21 20 27 21 - 11 21 18 11 19 20 22 9 19 11 21 21 0] -xshow -376 2357 moveto -<616262726576696174656420226B747322292E20> -[21 21 21 12 20 19 8 21 10 21 21 11 13 19 10 19 13 14 9 0] -xshow -376 2439 moveto -<4F6E207468652072696768742069732074686520616C746974756465206C61646465722E204561 -6368207469636B20726570726573656E74732031303020666565742E20496E2041434D2C20746865 -2067726F756E6420697320636F6D706C6574656C7920666C6174> -[30 21 10 10 21 21 11 13 7 21 22 10 10 8 19 11 10 21 21 11 21 8 10 8 11 21 21 21 - 10 8 21 21 21 21 12 9 10 26 21 18 21 11 10 8 19 19 11 11 21 21 12 21 19 21 21 10 - 19 11 19 21 21 10 9 21 22 11 9 11 10 21 11 23 27 32 10 11 9 22 21 10 21 12 21 21 - 21 21 10 8 20 10 18 21 32 21 8 21 10 21 8 19 10 11 7 22 0] -xshow -376 2496 moveto -<2865786365707420666F72206120666577206D6F756E7461696E732920616E64206C6F63617465 -6420617420736561206C6576656C2E204120726174652D6F662D636C696D6220726561646F757420 -6973206C6F6361746564206A7573742062656C6F772074686973> -[12 20 19 19 21 21 10 10 9 22 13 10 21 11 9 20 28 11 31 21 21 21 10 21 8 21 19 12 - 11 21 21 21 10 8 21 19 21 10 21 21 10 21 11 10 19 21 21 10 8 20 18 22 9 9 11 25 - 10 12 22 9 22 12 22 10 12 19 8 7 33 21 10 12 21 21 21 21 21 10 11 8 19 10 8 21 - 19 21 10 21 21 10 8 21 19 11 10 21 21 8 20 28 10 10 22 8 0] -xshow -376 2553 moveto -<6C61646465723B20726174652D6F662D636C696D622069732065787072657373656420696E2066 -65657420706572206D696E7574652E20> -[8 21 21 21 21 14 9 11 11 22 10 21 12 22 10 12 20 8 7 32 21 10 8 19 11 20 19 21 - 12 20 19 19 21 21 10 8 22 10 9 21 22 10 10 21 21 13 10 33 7 21 21 10 22 9 0] -xshow -376 2634 moveto -<496E20746865206C6F7765722063656E746572206973206120686F72697A6F6E74616C20686561 -64696E67206C61646465722E2045616368207469636B20726570726573656E747320666976652064 -6567726565732E20> -[10 22 10 10 21 22 10 8 20 27 22 12 10 19 21 21 10 21 13 10 8 19 10 21 11 21 21 - 12 8 19 21 21 10 22 8 10 21 21 21 21 8 21 21 10 8 21 21 21 21 12 9 11 25 21 19 - 20 11 10 9 18 19 11 12 21 21 11 22 18 21 21 10 19 11 10 8 18 21 11 21 21 21 11 - 21 22 20 9 0] -xshow -376 2716 moveto -<496E207468652063656E74657220697320616E206174746974756465206C61646465722E204561 -6368206C696E6520636F72726573706F6E647320746F2074656E2064656772656573206F66206169 -7263726166742070697463682E20546865206C616464657220726F6C6C73> -[10 22 10 10 21 22 10 19 20 22 9 22 12 10 8 20 10 21 21 10 22 10 10 8 10 21 21 21 - 11 8 21 21 21 21 12 9 10 26 20 19 21 10 9 8 21 21 10 19 21 12 12 21 19 21 21 21 - 21 19 10 10 21 10 10 21 21 11 21 21 20 12 21 21 19 10 22 10 10 22 8 11 20 11 23 - 10 11 10 21 8 11 18 23 9 10 24 20 21 11 8 21 21 20 22 12 11 11 22 8 8 0] -xshow -376 2773 moveto -<61732074686520616972637261667420646F65732C2070726F766964696E6720616E2061727469 -66696369616C20686F72697A6F6E2E20> -[21 19 11 10 21 21 10 22 7 13 19 12 21 11 11 10 21 21 21 19 10 10 21 12 21 19 7 - 22 7 22 21 10 21 21 10 21 14 11 8 10 8 19 8 21 9 10 21 21 13 8 18 21 23 9 0] -xshow -376 2911 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 45 -45 matrix scale makefont setfont -<416E676C65206F662041747461636B20> -[30 25 26 10 23 12 25 13 12 30 13 12 24 22 23 0] -xshow -376 2982 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<5468652041434D20485544206861732074776F20696E64696361746F727320746F206769766520 -7468652070696C6F74206375657320617320746F2074686520706C616E65732063757272656E7420 -616E676C65206F662061747461636B20616E64> -[24 20 21 11 23 27 32 10 27 27 28 10 21 21 19 10 10 27 21 11 7 22 21 8 19 21 10 - 21 12 19 11 9 22 10 21 8 18 21 11 10 21 21 11 21 8 7 22 10 10 19 21 21 19 10 21 - 19 10 10 22 10 10 21 21 11 21 8 20 21 22 18 11 18 22 12 12 21 21 10 11 21 21 21 - 8 21 10 22 10 10 22 10 10 21 18 19 11 21 21 0] -xshow -376 3039 moveto -<73696465736C69702E2046697273742C2061626F76652074686520616C746974756465206C6164 -6465722C206973206120726561646F7574206F662074686520706C616E6527732063757272656E74 -20616E676C65206F662061747461636B20696E20646567726565732E> -[20 7 21 21 20 8 8 22 9 11 23 8 12 19 10 11 10 21 21 20 18 21 11 10 21 21 10 22 - 8 10 8 10 21 21 21 11 8 21 21 21 21 11 10 10 8 19 11 21 10 12 21 21 21 21 21 10 - 11 21 10 10 10 21 22 10 22 7 21 21 22 6 19 11 18 21 13 11 21 22 10 10 21 21 22 - 7 21 11 21 10 11 21 10 10 22 18 19 11 7 22 10 21 21 21 12 21 21 19 0] -xshow -376 3096 moveto -<5468652041434D20462D31362077696C6C207374616C6C206174206120706F7369746976652061 -6E676C65206F66203330206465677265657320616E642061206E6567617469766520616E676C6520 -6F66202D333020646567726565732E20> -[24 20 21 11 23 27 32 10 24 11 20 20 11 27 8 8 9 10 19 10 21 8 9 10 22 10 10 21 - 10 21 21 19 8 11 8 18 21 11 21 20 22 7 22 10 21 10 11 21 21 10 21 21 21 12 21 21 - 19 10 21 21 21 10 21 10 21 21 21 22 10 8 18 21 10 21 21 22 7 22 10 21 10 11 12 - 21 21 10 21 22 20 12 21 22 19 9 0] -xshow -376 3343 moveto -<41434D20666F7220554E495820616E642057696E646F7773> -[24 27 32 10 9 22 12 11 27 28 9 26 10 21 21 21 10 37 7 21 21 20 27 0] -xshow -1256 3343 moveto -<3133> -[19 0] -xshow -1962 3343 moveto -<30362F31302F3036> -[21 21 9 21 21 10 21 0] -xshow -grestore grestore -showpage -%%PageTrailer - -%%Page: 14 14 -%%PageBoundingBox: 0 0 595 842 -%%BeginPageSetup -% -%%EndPageSetup -gsave -[0.24 0 0 -0.24 0 842] concat -gsave -376 344 moveto -0 0 0 setrgbcolor -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<4164646974696F6E616C6C792C206120706C616E652D7368617065642022666C69676874207061 -7468206D61726B65722220696E646963617465732074686520616972637261667427732063757272 -656E7420646972656374696F6E206F662074726176656C2E204C6576656C> -[25 21 21 8 11 7 21 22 21 8 9 15 11 11 21 10 21 8 21 21 21 12 19 21 21 21 21 21 - 10 14 10 8 8 21 22 10 10 21 21 10 21 11 32 20 13 18 21 12 13 11 7 22 21 8 19 21 - 10 21 19 10 10 21 21 11 21 8 12 19 12 22 10 11 7 19 10 19 21 12 12 21 22 10 10 - 22 7 12 21 20 10 8 21 21 10 22 10 10 11 11 21 18 21 10 9 10 21 20 18 22 0] -xshow -376 401 moveto -<666C69676874206F6363757273207768656E2074686520666C696768742070617468206D61726B -657220697320616C69676E6564207769746820746865207A65726F2D206465677265652061727469 -66696369616C20686F72697A6F6E206C696E652E20> -[11 8 8 21 21 11 10 21 19 18 22 12 19 10 28 20 21 21 10 10 21 22 10 11 8 8 21 21 - 11 10 21 21 10 21 10 32 21 12 18 21 13 10 8 19 11 21 8 8 21 21 21 21 10 28 8 10 - 21 11 10 21 21 10 19 21 12 21 13 10 21 21 21 11 21 21 11 21 14 10 8 11 7 20 7 22 - 8 11 21 20 14 7 19 21 21 10 9 7 22 22 9 0] -xshow -376 538 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 45 -45 matrix scale makefont setfont -<54686520472D4D65746572> -[25 25 23 12 32 13 35 22 13 24 0] -xshow -376 610 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<4120726561646F7574206F66207468652063757272656E7420766572746963616C20472D666F72 -6365206F6E207468652070696C6F74206973206C6F63617465642061626F76652074686520616972 -7370656564206C61646465722E20> -[25 11 12 21 21 21 21 21 10 11 21 10 10 10 21 21 11 19 21 12 12 21 21 10 11 17 22 - 14 10 8 19 21 8 11 30 11 9 22 12 19 21 11 20 21 11 10 21 21 11 21 8 7 22 10 11 - 8 19 10 8 21 19 21 10 21 21 10 22 20 21 17 22 10 10 21 21 11 21 8 12 19 21 21 21 - 21 10 8 21 21 21 22 11 9 0] -xshow -376 747 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 45 -45 matrix scale makefont setfont -<576561706F6E20537461746520> -[38 23 22 25 25 26 11 28 12 24 12 24 0] -xshow -376 818 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<42656C6F7720746865207468726F74746C6520696E64696361746F722061726520646973637265 -74657320746861742073686F7720746865207374617465206F66207468652063757272656E746C79 -2073656C656374656420776561706F6E2073797374656D2E20> -[26 21 8 20 27 11 10 21 21 11 9 22 12 21 10 10 8 22 10 8 21 22 7 19 22 9 22 12 10 - 21 12 21 11 21 7 19 19 12 21 10 21 19 10 10 21 22 10 10 19 21 20 28 10 10 21 21 - 11 19 10 21 10 21 10 21 11 10 10 21 21 11 19 21 12 12 21 21 10 8 19 11 19 21 7 - 21 19 10 21 21 11 27 20 21 21 21 21 10 19 19 18 10 20 34 9 0] -xshow -376 3343 moveto -<41434D20666F7220554E495820616E642057696E646F7773> -[24 27 32 10 9 22 12 11 27 28 9 26 10 21 21 21 10 37 7 21 21 20 27 0] -xshow -1256 3343 moveto -<3134> -[19 0] -xshow -1962 3343 moveto -<30362F31302F3036> -[21 21 9 21 21 10 21 0] -xshow -grestore grestore -showpage -%%PageTrailer - -%%Page: 15 15 -%%PageBoundingBox: 0 0 595 842 -%%BeginPageSetup -% -%%EndPageSetup -gsave -[0.24 0 0 -0.24 0 842] concat -gsave -376 422 moveto -0 0 0.50196 setrgbcolor -(Helvetica-iso1252) cvn findfont 68 -68 matrix scale makefont setfont -<5468652052616461722053797374656D20> -[38 34 34 18 44 34 34 35 20 17 41 30 31 15 34 52 0] -xshow -376 581 moveto -0 0 0 setrgbcolor -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<5468652041434D2072616461722073797374656D206861732061206669656C64206F6620766965 -77207468617420657874656E6473203133302064656772656573206C61746572616C6C7920616E64 -20766572746963616C6C792066726F6D207468652066726F6E74> -[24 20 21 11 23 27 32 10 12 21 21 22 12 10 19 18 19 10 20 32 11 21 21 18 11 21 10 - 10 8 22 8 21 10 22 10 10 19 8 20 28 10 10 21 22 10 10 20 19 10 21 21 21 19 10 20 - 20 21 10 21 21 21 11 22 21 19 10 8 21 10 21 12 22 8 8 19 10 21 21 21 10 18 21 14 - 11 7 19 22 8 8 19 10 10 12 21 32 10 10 21 22 10 10 12 21 22 0] -xshow -376 638 moveto -<6F66207468652061697263726166742E2054686520462D31362072616461722073657427732072 -616E67652069732061626F7574203830206E6D2E20416C6C2061697263726166742077697468696E -20746861742072616E676520616E64206669656C64206F662076696577> -[22 10 10 10 21 22 10 21 8 12 20 11 22 11 11 10 10 23 21 21 10 23 12 20 20 10 12 - 22 20 22 12 11 18 21 11 6 19 11 12 21 21 21 21 10 8 20 10 21 21 20 22 10 11 20 - 21 11 20 34 8 11 26 8 8 10 21 8 12 19 12 22 11 10 11 28 8 9 22 7 22 10 10 21 22 - 10 10 12 21 21 22 21 10 21 21 21 10 11 7 22 8 21 10 22 10 10 20 7 20 0] -xshow -376 695 moveto -<77696C6C20617070656172206173206120626F78206F6E2074686520726164617220646973706C -617920> -[28 8 8 8 11 21 21 21 20 22 12 10 21 19 11 20 11 21 20 19 10 21 21 10 10 21 22 10 - 12 21 21 21 13 10 22 7 19 22 7 20 19 0] -xshow -grestore -gsave -readpath -V0177032FB000385E038500B008385~ -closepath clip newpath -gsave -375 1714 translate -3.125 3.125 scale -[/Indexed /DeviceRGB 255 -psp_lzwstring -J,g]g+iFZT!_gCrE$tD^$P%cK+QJ8KiYFM._8$;#.GbPYKUq(7G\eW*R=_;Dl'P(T(7Boo^^IY%mLHj^ -Y2O0+Cbu.lK"p74pe1T%s.DY%&\1TdJiJS9.M9au6>79n6`Q:4PbLSZTLEE(8E@'*1mg_*eTnN*;*'V3 -+gm-EEetX%;Bo$ur2ss*N`.-!.kG_q6GDD'dKoL!8Ka#EV,@V!\j8ZF^_^L5]'Skg9YhjP\,"kZ!/A;J -OOur"$NGUQ5QD)2i\G_:VIM-db[>E0*(OCNR-^tF3/emg=1(6R2pY_i<.7hq_#WA'bm-Bf1"6L,3* ->V>skNC0Q3piS>.?Dgl$'^15Q"YYU3TEfJSr9ec\-=DbA,Q7V0!(1..Qni7bR>!sLlaV9/#.oL?i=!.p -.N&bH^u97bA?m#~> -pop ] setcolorspace -288 288 1 1 psp_imagedict image -J2Q7]3$]7K#D>EP:q1$o*=mro@So+\<\5,H7Uo<*jE<[.O@Wn[3@'nb-^757;Rp>H>q_R=AlC^cenm@9 -:1mM9jS"!dTMT<$3[GQ$8#0$s<4ZX!SPQ1`C/m"C!!'E2 -/lZCiY20.Z>jkWB[G1e0^e[SSHl]s(LR]kI/UUS<&W`GcZ.TP]b2Ood^`)\j*"iV`K>JccW*D(s%YqtH -0dq^TD$ILgI=]khA``hnGgl`SWO#>)-W@Y>Z/sjd/0W;'^/Lu[sB(@rUhIS"&X!b7=*>49"QVLr: -WC(!E-^?u_J,rm^V,X$OkVIO=2HNYJd&E7V*KnTXPfRVpMS.@j=+X331*?],5o5SN?rrgd(/JSXi%Qr; -P]-XEO@H+7>8dLI:&5(mIcE'oPHe^^*md2$3gY)Y'3M -M@1\ja.s<0=^!U(CWBp]W9dh.)k'La':IA@hR6Fh:r;PX`?L=!+fmDm_+?)[.Uc9.;gch3N5c[,*PU*0fma -@A@>sn,NHj=P&/@TV)8c=q:pkWs*I0*#PaWK#Jl&Ls0Tm(61n[nd,_^7jO8>V"0@9Sgb&49;U(iI*-(Y -Ra%`#q./K/(fipMPR7j,LI>pY$Iei&dUPnHe#E!IN7OCpWn"-BMKJ^$>cu\ZnsZD,a(2L,CfY=GWn0PD ->:oRWN0`:?]%sO^]=mM(Fh1p5p^6-[",+PBWAn]h.[>Y*j0A1aL.`mL]]CpEL]^re"+ifGcr`[_'aoa` -@F4e&7O8_*7:OYh`+CS+NCRL+q#lF@,EbW%n]RE>.L-t!L.3BWBG>b?*hl1S1mYg-*@Zce,S`m5 -J,h*VcmP+DrIVprZ.P>(3^n2u=-uiuYcn6?0cZn)mP7Fh9':J[8`Y%frW<7S_9JqJ4#@`=;PQZ7fW8Yr -(QHOHmI5CM7KD%k5i@`+1`d58KgOa[fQ9;#&W&p8"_^6-=Tnd4b0dZ1FK?tm5uj&X#QcS#NlGVX.85a* -/JZK>K"7E*@hsqskEFTkrdd@m7NjTZ*0r_hOT6U]5QmfY8uKt6&d\EOY=KDWCJg@./p0Lc=R;>X2#bAu -[+Noo8r]G$EOf?BOP='@bt+b`0"9U.rnphn@*7!OSJi;gTj)J<%!FiY4cmgk;#IC6&HHU^TQ!FQ)@m+, -_P(qiCcWXLLr?$-8?$5j*)DAL8]XM,:/D9!):#"JjJ@Z+=dq581$I/9XZ<,!/qd's2Y["bt9@\D4"RWa+lj!0#X2 -n@FUnkCCA+Vmi^:8)KAKI_PhS! -PqJ\/Vb_%B86h=k?a)rKP6jVu"YI%5jY4eN$?]de>]*V)V:P#V(!%>Vg:VDj[F -ekqBq7UildVH5@9b.nA/G.\.e!Ypuo-"1%%=TaGt+tCZU7Oo74`Zm4:gi>ItO2rS%.3+LD)1b(]b/ct# -&Km=[VDBZkdVCb1c6D@`S3dl'JkRE=)9ieP7\eB\0_sKn'2,%>B9]Ee;QEj!`[T/X>aD'cYLkBa.R=1&K$a-.2@b0i5KBJDE/_u8)t:#'TND:P"FaJR8g=l*EF[:ZPf"QBf1oBVULs_mWg@M -cY+"2'b2HJU/C.hRH5?P9rCqNF8CScWE"gS.b1!`k -VG($P94TfWKZ7RZRS@>8_-FQg4.]5\e+pZ;!*5aiB[h>rr`MXbdqR>.KMjm/W`HV%>'8^J0 -]jn?N@WX&9Ral2^5c'VOI(n?V\lDaqX1X&MHbNHmQ`KNZ"\O=Q`HXL5MXMU;?/XAV:-&\&aA`n?-G0>[ -V'2$&(_)OP"Y=+VBQ! -'np<>YQ.]S!#kC;*+h)/O[```kp'M+,E]CQEnPQC-PMD3As6B)hJkQH8O*X(r+\55JOh#IR)Fl1.#U[T -EZ,*:G6XJbC6_u1?EjY6$Ko::m0^X;//f$)KYjF%aAT9G%>_rsECd070,TYfUN+BA1p%g\aJoa_\Oq0UTa$o-pcpD`F9-k>TLhqL9cUcmX!./K,!`UXH,`ab;(2:oMm=F%W!,Y?6M-lSZiP -7^l^.fVips*Lb;:YZ`W%a\AeiE4Er)[k"T71N0n^YB$]*qYpi6i%T?p()%3l\mdC;gbpr1=iY&.FY$Ql -03E`>Rd`9^((CM%6=E^#A2YG=LdY]L32BS,(Q:]=;4-Ef4WfbVA5YE3Yur?:8nCo2A@>>SKe!=7!F22! -1B:.C+:3_4I6XB$A[C(BXK=k3SEW)RM/.O6'r"'.[dc$J.W=9+pnk7_V/L':)E=[dK!"g+t> -Y12l@4/c(PO-EfZAb/V(,$<@-6i8V2T!3HBY -_-6>Q/4'nKK>kV<89@TQ%4_eG;2GEh!>^L6,r2H)ZMH.g>6*FZM -3%Q*`CHRnki3F4X[]+8&ioJ^kUh\/=Nb)T-EEE8Je;?(<:BR-7WYHG;:8q6PX"!\0 -X:>V=Y?1'+)\f_>=L$QH(7S=,[2c#I/f,IlcAs!P>q["`e`,I'^>A>r*#1g/*P^P&(n=Q<%rK;GneQdY -Y8`F_A9/:d]F"lHK#+,LLeK97%#2Zgi!-_q*sPar,*5?c@Q,9ea.r23%#RP!.n&Dp\O:X=I0t;m68)V%TZ@l4J>QU9Od#9rV-]oLcr*Xk>4)HTd7s -BWoOZ2J[`,drMnLm^B`-`3!1;?_t.j2,8EgW)OrSbN8a?N5jn_FG]-PFbQC7B=N0e=g%pZ6"&&a6m`WV -L-oCrpk2*_'8f4fdC93C5#-R;lW5r9mT4q+"4/@CXr:cL4*L9=_uZ7ATH16[TdUW4*AR)F/iEHQ[?^6=*D8a -DqFbY_Z>D,?a#i%7OHfD`FEo=q:so_]c8JHpT%jM8^[DBY7e1)MK[V -Ogt=@6R%Z7,dM+]-;Q+Vb9aIYI"FF6RE[(bBtU0[3h=SEZUmjeK0l9Z+u:]#,*PWk:apMOI6pq.W7-6C!FZSoA_b72cXL;j)B$Y5"c"r]hIDSQi\D8dB]62j!HAC?1GO,/6kCCD+n$l%S`smjDg$i+f -IB+*Eak$#c9YEmqXB%4:OB==\&IF.XiK2]64s:Mp7,j>2ZsGI)L6\N2f^sVY+d#=VP#rt:9du?"jc\;= -JiPKP9]hOA[!H4@SPJ@3flWs:6(q-=OX\NjO\)BFB_8lY5+s9q<,.\%ZrWYtX]FbIHHgWL@AME>UTLghrH\`Qmjr]gHV&Mr"C(3@eI@(gDs>#DU3)jT#8b0-Pm^j0C[L;Qp0%'pX[!^]YOY -#_^'gE6)iV*tX7HU2``*=t^_O`hROpln#7COFSS(8M$<+.$VlNEg:%874ahMVK5>1g/fnZ'rLTEm.u2s -PfP4o)D)kg8>*"41s0YrT2;K9Wc^q9>-D&0euNr9m -grestore -grestore -gsave -376 1948 moveto -0 0 0 setrgbcolor -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<464947555245203220524144415220434F564552414745> -[24 9 30 27 27 25 11 21 10 27 25 26 25 27 11 27 28 25 24 27 24 30 0] -xshow -376 2111 moveto -<5468652041434D20726164617220646973706C61792070726573656E7473206120666F72776172 -64206C6F6F6B696E672076696577206F6620726164617220746172676574732E205468696E6B206F -6620697420617320612074656C65766973696F6E> -[24 20 21 11 23 27 32 10 12 21 21 22 12 10 22 7 19 22 7 21 18 11 21 12 21 18 21 - 22 10 19 10 21 11 8 23 12 27 21 12 22 10 8 21 21 19 8 21 21 11 19 7 20 28 11 21 - 10 10 12 21 21 22 12 11 9 22 12 21 21 10 20 10 10 23 21 8 21 19 10 21 11 10 8 11 - 10 21 19 10 21 11 9 22 8 20 19 8 19 8 21 0] -xshow -376 2168 moveto -<6D6F6E69746F7220636F6E6E656374656420746F206120666F72776172642D706F696E74696E67 -2054562063616D65726120746861742068617320612076657279207769646520616E676C65206C65 -6E732E20> -[32 21 21 8 10 21 12 11 19 20 21 21 21 19 10 21 21 10 10 21 11 20 11 9 22 12 28 - 21 12 21 13 20 22 7 22 10 8 21 21 11 23 25 11 19 20 32 21 12 21 10 10 21 22 10 - 11 20 22 18 11 21 10 18 21 13 20 10 28 7 21 21 11 20 22 21 7 22 10 8 21 21 20 10 0] -xshow -376 2250 moveto -<496620616E79206F626A656374732061726520636C6F736520656E6F75676820746F2062652072 -616461722D76697369626C652C20746865207365742077696C6C206175746F6D61746963616C6C79 -206C6F636B206F6E746F20746865206E656172657374207468726561742E> -[11 10 11 20 21 19 10 21 21 8 21 19 10 19 11 21 12 21 10 19 8 21 19 21 10 21 21 - 21 21 21 21 10 10 21 10 21 21 11 11 22 21 20 12 12 20 7 20 8 21 8 21 10 11 9 22 - 21 11 18 21 10 11 28 8 8 8 10 21 21 10 20 32 22 10 8 18 22 8 8 19 10 8 22 18 19 - 11 21 21 9 22 10 10 21 21 11 21 21 21 11 21 19 11 10 10 21 12 21 21 11 0] -xshow -376 2307 moveto -<57697468207261646172206C6F636B2061637175697265642C20796F757220646973706C617920 -77696C6C2070726F766964652064657461696C656420696E666F726D6174696F6E2061626F757420 -746865206C6F636B65642C206F7220227072696D617279222C> -[37 8 9 22 10 12 21 21 21 13 10 8 22 18 19 10 21 19 21 21 8 12 21 21 11 10 18 21 - 21 12 11 21 8 19 21 8 20 19 10 28 8 8 8 11 21 12 20 19 8 21 21 10 21 21 10 22 8 - 8 21 21 10 8 22 9 21 12 32 22 10 7 21 22 10 21 21 21 21 10 11 9 22 21 10 8 22 18 - 18 21 22 10 10 21 12 11 13 21 13 7 32 22 13 19 13 0] -xshow -376 2379 moveto -<746172676574277320646973706F736974696F6E2E2041207072696D6172792074617267657420 -6170706561727320617320612066696C6C6564206469616D6F6E642028> -[10 22 12 21 21 11 6 19 11 21 8 18 21 21 20 8 10 8 21 23 9 10 25 11 20 14 6 33 21 - 13 19 10 10 22 12 21 21 10 11 21 20 21 21 22 12 19 10 21 19 10 21 10 11 8 8 8 21 - 22 10 21 8 20 32 21 21 21 11 0] -xshow -1468 2379 moveto -0 1 0 setrgbcolor -(OpenSymbolHGSet2) cvn findfont 46 -46 matrix scale makefont setfont -<01> -show -1514 2379 moveto -0 0 0 setrgbcolor -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<29206F6E2074686520726164617220646973706C6179202D2D2074686520646973706C6179> -[12 11 21 21 10 10 21 21 11 11 22 21 21 13 10 21 8 19 21 8 20 19 10 13 12 11 10 - 21 21 11 21 8 18 22 8 20 0] -xshow -376 2437 moveto -<70726F766964657320696E666F726D6174696F6E206F6E20746865207072696D61727920746172 -67657427732072616E676520616E6420616C7469747564652C2061732077656C6C20617320697427 -732063757272656E742068656164696E672C20796F7572> -[21 12 21 19 7 21 21 19 11 8 21 9 21 13 32 21 10 8 21 21 11 21 21 10 10 21 21 11 - 21 13 7 32 21 13 19 10 10 22 12 21 21 11 6 19 11 12 21 21 21 21 10 21 21 21 10 - 22 8 10 9 9 22 21 21 10 11 21 18 11 27 21 8 8 11 21 18 11 8 10 7 19 11 18 22 12 - 12 21 21 10 11 21 20 21 22 7 21 22 10 10 18 21 21 0] -xshow -376 2494 moveto -<646573697265642072656C61746976652068656164696E6720746F20696E746572636570742061 -6E64207468652072617465206F6620636C6F73757265206F6620796F75722074776F206169726372 -6166742E20> -[21 21 19 8 12 21 21 11 12 21 8 21 10 8 18 22 10 21 21 21 21 8 21 21 10 10 21 11 - 7 22 10 21 12 19 21 21 10 10 21 21 21 11 9 22 21 10 12 21 10 22 10 21 10 11 19 - 7 22 18 22 11 21 11 21 10 11 18 20 22 12 11 9 28 21 10 21 8 12 20 11 22 11 12 9 0] -xshow -376 3343 moveto -<41434D20666F7220554E495820616E642057696E646F7773> -[24 27 32 10 9 22 12 11 27 28 9 26 10 21 21 21 10 37 7 21 21 20 27 0] -xshow -1256 3343 moveto -<3135> -[19 0] -xshow -1962 3343 moveto -<30362F31302F3036> -[21 21 9 21 21 10 21 0] -xshow -grestore grestore -showpage -%%PageTrailer - -%%Page: 16 16 -%%PageBoundingBox: 0 0 595 842 -%%BeginPageSetup -% -%%EndPageSetup -gsave -[0.24 0 0 -0.24 0 842] concat -gsave -376 3343 moveto -0 0 0 setrgbcolor -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<41434D20666F7220554E495820616E642057696E646F7773> -[24 27 32 10 9 22 12 11 27 28 9 26 10 21 21 21 10 37 7 21 21 20 27 0] -xshow -1256 3343 moveto -<3136> -[19 0] -xshow -1962 3343 moveto -<30362F31302F3036> -[21 21 9 21 21 10 21 0] -xshow -grestore grestore -showpage -%%PageTrailer - -%%Page: 17 17 -%%PageBoundingBox: 0 0 595 842 -%%BeginPageSetup -% -%%EndPageSetup -gsave -[0.24 0 0 -0.24 0 842] concat -gsave -376 344 moveto -0 0 0 setrgbcolor -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<4649475552452033205448452041434D20524144415220444953504C4159> -[24 9 30 27 27 25 11 21 10 23 27 25 11 24 26 32 10 28 25 25 25 27 11 28 9 25 26 - 21 21 0] -xshow -grestore -gsave -readpath -V0177017EB000384E070900B008384~ -closepath clip newpath -gsave -375 1281 translate -2.8125 2.8125 scale -[/Indexed /DeviceRGB 255 -psp_lzwstring -J,g]^GRso^GCi*Y'Y7nW=#]QH"N?,p0Scie_R*umennajDA1EToCgTg5N&2bV_73lq8 -*DRPq/&?3;3@5q'7)VR]P"V;X.jW<[TEfVmh!X!M!#$`!e0K#?/&G'NPftFt$#[UF&2;TBE<@`,i)(=0 -mKVKuJ0;\,0]ELBK0`s#A_\08"oq+[;3Ae-Y8KFA;_aQmA\/f[7`/*.`,)UrKgfKe\D)0b!02f/UPS/@ -3d6U]A#m-*FufVaL83dbq-H7/O/?FQ\GLG5!.b?I6\l=\6NW-9k"pquB#TFY_!mIH-5%t!P#Q6V(_g"A -s*_N=E!5F^#6+ZhTWe,A*Y8=)_k8+~> -pop ] setcolorspace -640 320 1 1 psp_imagedict image -J3Vsg3$]7K#D>EP:q1$o*=mro@So+\<\5,H7Uo<*jE<[.O@Wn[3@'nb-^757;Rp>H>q_R=AlC^cenm@9 -:1mM9jS"!dTMT<$3[GQ$8#0$s<4ZX!SPQ1`C/mioWjnAY&^gM+`4=1jRLW!YA=M/6)*KS9PE`kN%="Tc_5TfJD*"iV`K>JccW*D(s%YqtH -0drPi.i+&_,;H.PE]Y>'a49"UXCSJ -Wa.BL:8cSk2(G.pX&c:P.lF?_Ek>Y]fISp2*KnTXZe?uhX'N$cDR\CR2_1HIlT0AUml./S+uo:K!Uk6S -0H^l?He30Q/0&R-#f]-$q!7n<"STl&huI^`rWra\6(Yl:,MbouHU5IYGZ5FF&qY\aMFYcu\Zp'V:XDaG_"!#-7F8R#kX -]tac?A-qUlZ_lY]HR67=5IA,j^^Ig"86`S)kOr\=OmJmMQK[gaTE4IY!)+dXfE!6/U];#mn+]54%g[nW -@F4e&7O8_*7:OWj!$W>W,_,k%83ogO++Lu^Z8],gm$j%_jY>uC3UBY,^#>*A0ELSI!'eV'i&fd]#ag2+ -l9sF]9-#HJj)B:fl9.am;4dEXYpP/SR)0omRH-]<(U@1[epBi_eSDTtD:\T;>.Xa/8jM;?3D)R1]"Oc" -P*IKaRt&a/:tcI&'_d/a$<@EgrCN'5blJ[71]S*e9tfE0n2X)?$AAO)0VAJam.O/Q+7F.K*WE/d`a8/u -4B<7BOi\lSBfr+g.[A*U&1CL%$jV_Ub#)6I`U'B#6&JH_;r'A3"A>POH2H;[/r@DXO8$$/mid2/j,e3_ -rdtCX&n'-;m67pOY=o:"g&e^Z5QDSVo(j1)9*ghh0"5W0iq%K0h_2J)rW6.iL"E8cP*BPWUn?-!Q,#RM -B+ge,j2sdC-30ig5N%V^p`QC,J#OSfE!-(,Xb)'(%q#AY0F&kT+HSiLDEAPa4k,T#"8iX,Jc[+d\Q!`\ -0pt_tP?G9LEB0FXUTeH?*WAs06K,1^YTT,I"+VHBBoC\(9eF`Q:rm_k73mtH!9L`W-A(uNVW"d>m:qJ4 -PeZ6sqOO>Zp&h9#,q'b=B25"(n!Df%rrI\e@.9Og2BHd!\@p$M$uH'""KB?-7$T*+0*$>^J.H;j)@Z@e -_1;b46lk\n!#18DV'IMh#QR*Kcu8t/18L#Q@F4ZmG"D@k8moGTPV+gHK?U368Z^Wa31S9lF'/&Tm1>*S -!:TKD&cQ"0^tukI9Su1=JkWu<$E[;e#+nC124/Kg]3gQ7J-if8*b,J>=K6E'CYe>KJ'-\Jq$^_@1SrDN -GK]CMs+%oCY]rho)\5!%65*a_/Im\/Na:MWMi@W7H@S6<:\VKX#59Q3JE="&g&=m%.3Qt+5QV4eJN\Mp -cicBc",/)[EOZ\=0d_T@@Zb=8,#obQ9P.3`Ut0BAS4r",<89A1!!C.&0DLd?3X@"P+jm7\%(ATR]nnH- -,o/!4P"I2YYWTS-"thgAEN9']O#MX]B/bbJ&#H2;gI130_Tk?-r?X3 -2+\gDW?KWD[FRVIO?a.KGPg2Sp4<8eC.K9HF-S";54jpoJc/Uk21qi,Y'2 -+!(O,A5aqIdVCb1c6kEIgs/J4;G#`kDu^pX;PMW,k5NPXh#\;[F$ -;2YK(o/]j:;d>__j2@EdRJun*^#7h#g^Y?'^WY`&bT7E*L;W"*336FB)ihtaVpNkR!qBO'8RM[a9ABO@ -J%_%R!!-mIs*p?M&D2(&me;RQ^uUigfVALuW>(Ed,[(*P!(2:u-lb\dUkKMW;0dgU=VQt2j=u7N3_^8c -!TN_i'b6'hUJ^7iRP`Sg*KS0sW/q!=+o_Lg!$9KX/0Y`2L-q[(fRtpj"+nAJ -05+TRme;Q.ToWZIC-Nu,ae\Ka9M.ebJO(F+W6@;*-CICL&IG7&*XF@CB2V=.P!pjpdAZ\p9e)K'VUMO; -$7Hmi#6U:APo1\aP>t>SjTW3uQ0nmYfrXbESQ;q-Z`,LafO,a^EOsu/pP[;]pB1St/bFDg,5e6`fVb&C -/^jHRV;X-_r"_1Sp;gKYGrPp*"Ts?B@*j-d-5?oC6Xe@:KLR7$MFD"%G`n1\(lh*rdJ3p"#9&^rAC>`k -VH#.494cQH4Ha,/RS@3fW8-*L4.]5\e+s3]AO3%f@M=UC)O3sm;eabVV%01tS^K!QHGsL(>Ei*fQ2(jJ -_.0cRCt5!IT%+7S>4'oK,atH\C3.Q+Oa0"bXZpYLm$%#8)m6@qhV'2$&(_)OP"Y=+VBQ! -ifR?M?83=W7cB4qoQ!5@O[Gnkq&Gu'.@!NeP1ark@5409jO6,rY"GLZcKCDEo_sD-Thss;=<-IG7\s#I -PhL7DTi%c1C/nHF?EmY8;`#"BoTgC(>EuGiGlD5m[%.chXPm)?LO68p!a:__-lbt -J-GrbM8`roR+ui>!JSX+nru7#5;<-D5bN'e//f$)KYjF%aD"cif`SWg06TC)Y5&40?#Y$^/fP=WN8r!#3#<6!t&=IcNu -0:78Si(uBY((CM%6=E^#A2Xnt#Xi-!32BS,(Q44s&\-nF4WfbV@^2SZP!paVJ0E@OA@>bsQqV*j3Mb5C -2k3WU;n:rf+Xj!OjO>(o(6'@P;JB*U4K*ODOjq;>&@FZ(<&N?&1AM2$O27#+Cb[N1)g^U -_Vt#5S/;8+MoHtrW8)DT*fnAf1+=3+9.#kF,r2H)Z%75(_*noI.)lMajJi -.5\&117M%:aWnVC!>G3q?4jrY>]A>2"Rn^mKE5(6X -fDH$ekBb&*0fZ7@1-'a!A26.rQpV=BbN9oXp_42E"bT,"&=?EL)%D?giXm#l:+6p0!!3b"e8@8eO%87D -)&/*&-'Lp^&t)^P!>_"pjqAVsc=o/*:$31XeF!PYQ-\Y.)ANa=7?L5UPaYT)R8'SXl4k/CqMeLU6FU4&f;nTQ%QM)B%e -Cpr*#pBusAa_A?BY4[]Yb4g:thllbnV;hf6_V242N(tl>N1"(XfaNm5oo7,UZMB:YrWNCU6"&&a6m`WS -!!FIlpk2*_'8f4fd]n4dM[TdV"qgF@JF1PXl[[W!5om=D[ -DpWirgBE5H=tfYu7OJq/U0qrMr.[]2N65^PfmHHn!"a^t+L#NA+qk<;_]c8JHpT%jM8^WG#Q/$e)NDc^ -Z0;+;6R%Z7,dM,HU/NP,b9aIYI)9AKRDrW3=hNa83h=SEYfOK*K0l9Z.(!_P,*PWqaC`odI6s],WPg2! -b.V8j>-6C,[HV6`WFE-c/?p\4Ia`&>gF]l"Fb\.]\_Sa$MgaUVHG/2hZ.k8i"+nABn(;G?,85s.i%UPb -IR2ZsG-\J&^N2f^sVY+d#=VP$'W5;(7c&jc\;= -^0raa9]hOAZu?$RJjG+l$/B!@6(q-=PZfmZ2)h@0l'0nE5+tiQ<9fW7Zp[TbV\ -d:p!lm?7=Y-4a@61g,K(c_;LDg.)L0F -T[9WZ8hCsA&<0EKFNSG]T2;K9Wc^q8P&g_teuLV'7=)^VYh5YVWjS;ABXHKqG0=^9Z"(;)@o5N#?t,SggoKL0*D\7@K<%uAG.h7e=DP;o`Knb]Zq2cK.qQ0FDn'%dek8`gm<>X8mT7$^pAKKNh(KU--5P-^`+!^g -]O]1hL<*nG=0-:@/XO[H+7LZu&dnnr_BCV35QDr;LVtAk.%F0c(5p0W0rWlJ4!'I%J.T72P"R-casAgB ->d@QdQcpd4.@eh%1PWsu1TB1#HTn(@jATe6&rT5SdO@#Q>r%g-TN!Bu.\0Hr6Din[+Q]q4_l1eJbo"+fFWGVC=!'otlG&f<`S74"-hjV!t\Y#uJ>"==d"Pg3u#Rn`&ZRFLYM -4eGO6'H+[fOE:HQ-SVS -U/M%'.%OBep8ZS[[7F%&#C_`k0A%[%9"RfL@A7^5e1L&qa1ps0#Q+o-p3T'_:hVs8#6ffI+Y^uZ8fn=p -7:B&,&P=hmNlRpc#n2\],a-9FnqdnX+Y8r&V=P"Pb%EQ"c)1)hbj'C7T$76JR#h:[#>u1"!!OW^>=j=X -^]^*:)=3ig-K*C2*#oMf!#F(FGPE1:>G9RscsSk+##YQWeA&&6r!g'5XHN4eR!'C-M!!!^a&,5iAU];[>+olkU-1;D*7q3'STH6>uNPFKb -aE0`b'`^`FnlY7uAM]cLB%)%Dk&ibW:M8/PfDm'^U/>URH:90G9;YX%eG=kgV,OBljg5>]!Zr4-4f$G[ -q+<43N'3cZ](&BbpJ&SA;]A\*2.$JfPA3`GP1ph6'VQfsh0S`@Y1^T*ki:CqA?B$D2KIT?P7IbY?IJbQ -!"T$[_$WG`)NdSaHPD?5pTZ%Jp.`6Xl9sD[)\2p;@aM%J*0Ubd_r?aJPY)AfQ,iq:-b1QR#67g:q:-9JO,u+k`f7.*g'$j -;X'Fm!(*AVWDr/J>.%\A=fk`jQ.kn[_-sE@.S8%aKLSm[73EWr*E#4g -KTH7u)$PW3+5hYP&hF8>J-dqXq'6OTQGK=oRI'd"5bQK&F@n,'O%?(pWH<(Z6D%)Qe>dX`X]ho1XOaFp -b3aMi@&qJMEB3LiEitmKJm]ssq(D/0E&jYrR -NR&IRJ3BLhf:W^PUplr#8shSbe>fgqog]ut>%6s_VKL-O1N-r;*F*03>,:mgOV1FS"Zit(WE!ZLcr_4aa%a<2$u -T#51pl:BQCH[!)8$[&D+H\5OZ*c'8>#?]gi`&jJs<"088J/p8LZ)2mqBoWm%fNSTTElH1_DDA9V`"e1qj5$!)Ft`l9)Ke2Msl` -'Y;h4\QuC?lkUNTNlbk==mY&HKs'*G[p/8:)jS_5Fh:rJ(RrtCq/`Ie'U5X,k=Y&J]R.6 -\$dnfPceQ_YQqN6#6]OiTMS`1+qkB;'VM\?KIdW>"/b%]BT+Du#D0!d&dZ\s.0B]?i+4=dL0#plbGFe: -N65ciR`I_p$-_[Y4J'lsoEl$7LI@laW:YsA.Y7Yf.27tZ80"E1".&3c!g8WTpE[n]2@6G>%o,jL8N'3M -QI@a=QKk:o]FMJe]%sO`Mp:C(9>9;ep^@W?#=><2C%[C_*hR88]q4lc7I)NLgYp -\DM5Vr!!B0)7eTXfR--9o`UcBn_!bo7jV6Ric<_"_uLq^J\`J50E_:f$@f#uYdf'I,8,jP,-bgo@P\p^ -a!7kQr.79[Oi\lSBeTSt.[A1'ZKZbR@ksIs-F7F!((h(48a!GEr;qU_Xhubc##ANSc](H_;R)PX0(t,9t]L@ -=Qs??)cade1:_58@K?FZ5i@`+1`QK,KgOa[fQ9;#&W&p8O]\R!0c:fsUQO4$INebi8Ds&A1nIPnPtL/$ -flXr:0pt_tP?G9LEB0R`TeZrHrdd7m;!9`>1j2GPV,HQBg3#TQ;5mO[P'QF9Z!!^Git\TeC6MZ&=R;>X -24i30RFUWsgN5K5Dn/C!?jfuknThfSn!DZAZKHe@7W;I3P`83F]3hh1gibn*Ob(hr3,rb,'.#Cq3Pshk(TXHo[Ra2)5;eoFWD7\VD\D46..cmDn -GbIK&G"H6f&=H"2F6-CRc4PDQVi9=?I=Aa+qTB -EE5\bWm;Eeg40sNls]6Pb.o+g-l`j-#(sc8DdW\$'+Tf6!9GUiC_6Uq!T9rebT6%SLe&dH.3+LD-BlRu -19"Na$31?*-8R*@dVCb1c6kEIh"#eUT?nsC73q4#/V*mGcr[S4#u,ou+Oq;C/tYn!_Q(uJeM=04WE1TM -$KM+3"p:hI;2?g,WE+AZkk?Tudd)(ghB^PG%J'CF^Yge*.>87g7Cc<(MF'i6!GRImER4Bh!0`P"]q>\9 -!!,"OJ&&i"L\rb'#Uo`]C.Go6%\#&e?I1)G(_0Gu'S,ZCPMR?YKg4(;!__;L#()ME;AZP=?3!kj,p3LN -/fcF2^Z.,L,Vg3@ON=4Qn3lC+p5?rROm45fWE$!!lP5l=DRj&V=6p\A'opCA!!FkhRoQWED7f,2:fN -#DA>7W^$\&2&:\TJ-i_:3[k2bP$k)QHeC=OP";9caCK`I&-KVf+GfYN%&Aq"iUFt-`eQsVdAZ\p9e)K' -VUMO;$B7ZU<3"B^!=I(d[p6)fX7co1MT985frXn*9nc-6ZiDSAargb,0q&.D&G[;D>98b*,p7RDC1foK -bZ'bX<6@4LHX`\XRKb3"5eG/QQUh5Wli7/Qhr&V2r/q;>!QmZO\o&G\.70]2pnSfb#`?HU749Er*uKdH -UJPWgSlI;,94cQIKZ7RZRS@DCH,Sif4.6-N'D_k:KgVS3B[h>s-C%6$;eabX16G.(!)BOlW=0[3'ECZ( -n+dq#[pO[d*l)ej9%l+/Ee'8jch0t?S!67j7GAMUf4^1%'RJO&.T=>V'2$%]&iOJktV -rt1)UifQ32&D -MuY$R>W*Z9M8`roR+ud=)i]Y[iqPLg6kKDJ!!t<$,Mi>s"2Ef5E_I#Ep4'c>?iU4D&IU1@,7qAL;)\]/ -J]^jBS5hK[J#OQ/GYB:r,*G1Io#QK?P:VOj'sj9lX8sr@`Dhs;0hPXjNi(qQ)Ec4DpQJDuJ;KO#'lms)M%YBS01P5fs=J1PpA'W//@N]j8d\$d@t8UF,W -:jUDJYEsc(i(uBY$1.A;^Yo`3"M(O8:2ZmUkH]2&QcU$1EV]LA5YE5Q;&`k8nCo2A@>bc!!FWI -3Mb5C2k3WU;n:u_I6XB$BN$c4P(tmp8Z8nNHjC3["+eX;aY?@X#CDVC[+Q\X)dJ?!lZLY3K$@r8>&@

]A>2"MbUq_ -I_Xe`pDC<`onLBD0fZ7>CAEG$j>&Sd*)aJ/bN9oXp_42E"bT,"&=?EL)%D?giXm#l:+6nX"="MGe8@8e -O%87D)&/*&-'Lp^&t&_$%&?ciAeQ&Hc=o/*:$31XeF%TFKgk*&)ANa=7AE`@1<:`PI8-VP,(7S:sZ!OnDmM?a(.`H28?1/T!ea@^"\R4h@Tn(!;K>GP]fQorkR=*%b -neiF4Wr7LlA`Z_hJA<<2JO*\*=<&M$%#2Zn?j.a:rtL@0U@F&`C,[,ma.r23%#RP#P0'NjM+jpN/=+JU -n*gHDB/H(%VXoYgl?>@Z5bUIN"Tj<>Rma+fMG5Re9W$:_^j9IPYS,eZIu>Q -MbU5'.B:tdpBuu'DdB$_i:X,^!nht8hlle`%LOY&\`'dfMS0?/GG8,I:eTXU-^;d8ZMB:YrWE3,6"&&a -6m`WVL-oCrpk2*_'8f(F&88^[2&hFhe;?dN!X0g38S$7p7&Es7Q:kf;q1Qb!1R_$Mds8moFZZ0jA<9@L -#),F=;/"@=JARRDMc/dR)#PFD5,qUteU#2H[9Ke8CXTct)T?3l=_uSirC3Vj[TdV"qh<&OF.??KpNsmA -ogH1(C3N>U#6fas@;sh6hBs%qV8;EDN,1+&9ShTqfmL^=rrRbf+L#NA+qk<;_]c8JHpT%jM8^[DBIEj( -)NDc^Z0;+;6R%Z7,dM,HU/3N\"=8&eFLGO-R)gS;#quE63h=SEZg%DiK0l9Z.(!^DAlD0?VHG/2hZo^.K"+nACA^_&FNHZ:p-U'falP:b$jI=E&:m+)OB==\&IF.XiK2]6/7B,-5b`6hZsF7VLr7(0#Q0$:+d#=VP$'W5;(7c& -jc\;=^0raa9]hOA[,,d_SO`_man5R`6(q-=ENk*sNu4ZYU9nTMH?W5c<9f`P[9g+@X]FNsfGmMS&u&Lp -Qjdq_[GLF0Y!,EbT/Eli./?SIkkVK5>1g2As@KI&B= -"Eo8[T[9WZ8hCsB8>O6Mo'&"!:HGH(Wc^q92H;'):?tg3FQ.^@Yh6%#9.cUYBVK#=%Gg(!P]m$Dc0/KZk'/,`'5N#?t,SggoKL0*D\7@K<%ud@QdQcpd4.@eh%)ZW=i1TB1#HTn(K-or%mEVpm1O3Q2W3VRLP07IDg*P9Ah6PdQ\(3(;kWOOHG.ZTa2lkd&f5SL_0K:Hqb3=;ki\+R6fJ[pPYNYBJq*n7R+-"6*KN_O&fDCD8L9QljV!t\Bh9n9J0NG[Pg3u#Rn`&Z -RFLYM4eG""'"SefM++1:kn2$POu4qce*7YdPtn;YX&\0/)GP+[?*@>j;W*6iZ":7Em1u0kY'!pP>OE:H -Pa7YH[U&>,#`&N]*E#10c[&;7 -mKf8pVXeJLd[;Hc;dbk_KW_X("@oIj)WVSDpQ/@U[B!$%f5-PoBK$GXNkipB3gTi-6M!mfe&hiR)ngAi1Nf7q9sB"GT#= -#YARTGsnN0/!`h>deSR9AM]V\"p#%;Q?,$V:$6RhTE5V!;F5mFfL+?Z8V9p72!?IB!DB?@.CEo-H -`@03f[kW#[fXRT:h*[3OPG:QJ$q<(/*B!<7U8i/h%t*YA^46K+$Y -F?Ui[M*XB-#ddnm)3%,GOkB;T5p;@]jH9Oo_C[.!`T7`#/A*)*L4B:90KD_krr[cOn+)X(rq;hpT#s;$ -jJ;O$4k"?=7+)E?T$^2Lod'Y*>FrOkO8$1WJk;r=ktc?Tj[bl8W@'K9`9Op3Zdl%^3\;D$4f$NjYWtAD -&4r>B-ae6@*0Wdni@EB7-&R=cX'6rRO?LkW!)c&>E(D-C%f[t@i,<_lr"&i24b2WAZk_q!KKY64\%G`n -"9ZSOd!/58&4qSsTb.QnO\$Yt^nA#*XP.SPSBe$RamAkR5bQDQ!=CCsO%?(pWH?:"3hK6Ie>dWLJAR:H -#Zb_@HJMJt!1lSfn2Q(F9)hdUhsXqTg/&$aaI^u9";3un;A>bni'#c^1OkQR&DNFq'*u$8T(]cA499*5 -`@X![Xs2hFJ,gY:p`ob*Uk1njUl[\;(^Gj2U(E,+8duJ]VW%T"\Omk]"2o`NQae4I-^2K"&GUnbm/hdY -AJ6I;aqZ^n76pFR.Zs0SSA4(0H2J3c6'P8]<4ZX!SPQ1`C/mO<*ae;F2N; -n,OX9%XYnJcmQ1;!)`dthsa/J*2NTd`aA1B"55R:"-R(HM(Ch7s+j%8Ou1so$E]]8AeOl$Wb42=J]i%I -F@pO$Ppmd&3@o?2pJOA0!""&d*DM+,j3T6/?;4CteEF=k*KnTXZe?uhX'N$cDRFur(Fu')lZTns0/orf -o)!mNi%H;UL"?WO_d)\U**>PFB8/e&@#6FD]`1l&TE'KEfFUW(_;F]p9F_X@,_=oMEg.mb#Zen#l:=2d -&K->>b!:25g$\lea^MApfHM"0O[rmM -_[J:<$iWXA&B\Lh&-.5G!<7YeT^Z=h+q18F5Mj_*!$2&:M8-jeO@.\l!..-KOls8Hm.QIUjKPjS8>Q9? -aCUEWbPjp@,fJ_^kIPOnUeT(ld!0@j,85sN5k<"7C,m?1'VlC&*#oGmK#qJD8SN'*8pa:,&Lj4+XYts] -Pa/bkAs",;8Y]+>F[AMBP>WP=l+(]OpT_Rfn6.Pa5o?lb,*e#g?PNjdj0ACgN_:aab2or)L]dV["+igH -d!-B-+Ua#l@F4e&7O8_*7:OYh`+CkGN^UYoLaW68!sBFTMZeJ-nlCrCJt#bp[;9,aM4TQ-3lq-ksO01p9bh1UnCVP>MFFC%b_t!kePrP#R_0 -]WT"/W(h.g4,G:hs.;S.Z[4gcB/R.t?ra88L@k\H_!p7bg]9t?It>a`$b5FLa'E.T1*Kl.lA@oZ]G$,4,])mpjT#E2/k4QPsJkOl/Ua\YTO]WRZ/K'O;hrQ.,*UZLG7\UL:1nIPn -PtL/$fN8+s0pt_tP?G9LEASM-B9V$@b'-(D;!8S3,*IdS#QQ0t\;Ym+:'9!Vo_P)N&."I$..;F%;Sc(S -4m;R<-&0f][9D\@$<=f]6+C1^G:TN[pLd*b\fK#H+d*2'3k/X0`Z^= -TQ!FQ)@m+,_P(qiCcWXLLr?$-8?>uJ(lZE6!=8%<59Q'/UiK$,_Fl;Ab+mC1>e48nPpmE2$%N(731S9l -F33eFImB[RW,ZM3erM8GdOB2TcW]3!RWn2+!ij!aPDEApN]AOrZ46@>,R",;^:cK^7?nd/J_@WXs&P/^P`*uS' -&-;eIN(.;S\E%fr+-9$(;E6"g9dc/tAQ$'L[TtPR9P..P"B'(qS3eAT\]"2i5G1eb:b!Iq,7gHn@adAL -2P!XB<,,DoV,j]@RaPtJfKAGW>Hh4G]*V'?"VPiY?A%&]AuTUAVsYE[_&CQ -%>Vl2EEK9Lp4%RGj0Df=Kc27h]taUYp`'nS#(sc90W853)\.YA+u(L9;C`N@`Zm4:gi>ItJcGib.3+LD --BlRu!sosK+>B)(jYJ?UdVCb1aX+7W'ZOW=;CNt,BG>oR7\eB\1oah:Rnfm!,W%!@Wa@rVR=1&K!is8J6`lit7[.DE/_u8)t:#'TPa2P=ajKR8g=l/XK,m',d%[1DZHS -k7a95g058[:ZrK2'b6'hUJ^7iRT1u.9qtL`eJa]JWE$!!lP5l=DH0N9=6p\A'opCIZWZ?HlU@u0D7+`_SiIX7W?C<3Zi3Z&.8$8KK\W_Q4.]5\e+s4PKgVS3B[`V?-=[)Zd\]rU[4V\]K[cYp84?to ->-$2Rn7dii%/5+jB%C^f=\0m6gMPO=KuW4q\m92g9.U]U1B\K/!!OXd&5p9dTD+:*P5QVV8:V4rS.d"F -.7jOWqtpK_s*q_HJ,fUd&H`-"J-;5R&@MQf.27k']DSJuJUen98CTHr#6[S,d'DG9;_"'U-*lc__IG?h -bpKc2]]*unS^/[il2:[96D;dO"gC+p3uNT4PAt-h0Vq<<5bmkY\Olc+,f6/FW4\:s-j0MaO)!JpTc8_e -MGU4Y*WB8oR'8jch0t?S!6R+J(b2]nA!!30#;AR(:BD`c@pOPZ' -i.(q.m]D,TJ,kBf*ZXp47K=!5Js%MeOTEQHKkcc?X\HbZcZLL>%L5_I^]boUH2eV15pm4aP\snqThss; -=u@@`8Yo>LPhL7DTi%dglBPP\?EmY8X;//f$)KYjF%aDbD;7P\14WfbVA5YE5Q;&`k8nCo2A@>bs -QqV*j3Mb4)p/2Mg"I16A*=;ob^]4],re!Qi`Y=JY>r%?=JUts3Qb5L;pRP;5lIjuSEC20ATCjZRn]*MoHtrW8)DT*fnAf1+=3+9.#kF,r2H)Z2" -X53@DI_Xep3%Q*a$\lRY0fZ7@1E2@pj>&_HSl7/*bN9oXp_42E"bT,"&=?EL)%D?giXm#l:+6p97H4uI -e8@8eO%87D)&/*&-'Lp^&t)_%=Y5t5jqAVsc=o/*:$31XeF%TFT24Yb)ANa=7AE`E'Ui#SR8'SXl4k5& -:8q6oP,(7S=,fkn3&mM?h-cKTJV5X5~> -grestore -grestore -gsave -376 1433 moveto -0 0 0 setrgbcolor -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<546865207261646172207365742773206162696C69747920746F2065737461626C697368206120 -706F736974697665206C6F636B206F6E20612074617267657420657874656E647320666F72206120 -73686F727465722072616E6765207468616E207468652072616461722773> -[24 20 21 11 11 22 21 21 12 11 18 22 10 6 19 11 21 21 8 8 9 10 19 10 10 21 11 21 - 19 9 22 21 8 8 19 21 10 21 11 21 20 20 8 10 8 18 21 11 7 22 18 20 10 21 21 10 21 - 11 10 21 12 21 21 11 10 20 19 10 21 20 22 18 11 9 22 12 11 20 11 19 20 22 13 10 - 21 13 10 12 21 21 21 21 11 10 21 21 21 10 10 21 22 10 12 21 21 21 13 6 0] -xshow -376 1489 moveto -<6D6178696D756D20646574656374696F6E2072616E6765202D2D207261646172206C6F636B2069 -73206C696D6974656420746F2061626F7574203630206E6D206F6E2074686520462D313620616E64 -203330206E6D206F6E20746865204D69472D32392E20> -[32 21 19 7 32 20 32 11 20 21 10 21 19 11 7 21 22 10 12 21 21 21 21 11 12 13 10 - 12 21 21 21 13 10 8 21 19 19 10 8 20 10 8 7 33 8 10 21 21 11 9 22 10 21 21 21 21 - 10 10 21 21 11 20 32 10 21 21 11 10 21 21 10 24 11 20 20 11 20 21 21 11 21 21 10 - 21 31 11 21 21 10 10 21 21 11 32 7 30 12 21 23 8 0] -xshow -376 1571 moveto -<4966206D756C7469706C6520746172676574732061726520706C6F74746564206F6E20796F7572 -20726164617220646973706C61792C20796F752063616E206C6F636B206F6E746F206F7468657220 -74617267657473206279207072657373696E6720746865> -[11 10 11 31 22 7 11 7 22 8 21 11 10 21 12 21 21 10 19 11 21 12 21 10 21 8 21 10 - 10 21 21 11 21 21 10 18 21 21 12 11 12 21 21 21 12 11 21 8 19 21 8 21 15 11 11 - 17 21 21 11 19 21 20 11 8 21 19 19 10 21 21 10 21 11 21 9 21 22 12 10 10 22 12 - 21 21 10 19 10 21 19 10 21 12 21 19 19 7 21 22 10 10 21 0] -xshow -376 1628 moveto -<7461726765742072656A656374206B6579202851292E20> -[10 22 12 21 21 10 11 12 21 8 21 19 10 11 17 20 19 11 12 30 14 9 0] -xshow -376 1710 moveto -<546865207261646172206F6E2F7374616E646279206B6579202852292063616E20626520757365 -6420746F20746F67676C6520796F757220726164617220736574206265747765656E20697473206E -6F726D616C206F7065726174696E67206D6F6465> -[24 20 21 11 11 22 21 21 12 11 21 21 10 19 10 21 21 20 21 19 10 18 20 19 11 11 29 - 12 10 19 21 21 10 21 21 10 21 19 21 21 10 10 21 11 9 22 20 22 7 22 10 18 21 21 - 13 10 12 21 21 21 13 10 19 21 10 10 21 21 10 27 21 21 21 10 8 10 20 10 21 21 12 - 32 22 7 11 21 20 22 11 22 10 8 21 21 11 31 21 21 0] -xshow -376 1767 moveto -<616E642061207374616E6462792073746174652E205768656E20796F7572207261646172206973 -20696E207374616E646279206D6F64652C20796F757220616972637261667420656D697473206E6F -20726164617220656E6572677920616E642063616E> -[21 21 21 11 21 10 19 10 21 21 21 20 19 10 19 10 21 10 22 9 11 36 21 20 21 11 17 - 21 22 12 11 11 21 22 21 12 10 8 20 10 8 21 11 19 10 21 21 20 21 19 10 32 20 22 - 20 11 10 18 21 21 12 11 21 8 12 19 12 22 11 10 11 20 32 8 10 19 11 21 21 10 12 - 21 21 21 13 10 21 21 21 12 21 19 10 21 21 21 11 18 21 0] -xshow -376 1824 moveto -<6265206D6F726520646966666963756C7420746F206465746563742E20> -[21 21 11 32 20 12 21 10 22 8 10 11 8 19 21 8 11 10 10 21 11 20 21 10 21 19 12 9 0] -xshow -376 3343 moveto -<41434D20666F7220554E495820616E642057696E646F7773> -[24 27 32 10 9 22 12 11 27 28 9 26 10 21 21 21 10 37 7 21 21 20 27 0] -xshow -1257 3343 moveto -<3137> -[19 0] -xshow -1962 3343 moveto -<30362F31302F3036> -[21 21 9 21 21 10 21 0] -xshow -grestore grestore -showpage -%%PageTrailer - -%%Page: 18 18 -%%PageBoundingBox: 0 0 595 842 -%%BeginPageSetup -% -%%EndPageSetup -gsave -[0.24 0 0 -0.24 0 842] concat -gsave -376 422 moveto -0 0 0.50196 setrgbcolor -(Helvetica-iso1252) cvn findfont 68 -68 matrix scale makefont setfont -<456C656374726F6E696320436F756E7465726D6561737572657320> -[43 12 34 32 16 19 35 35 12 32 17 45 33 35 34 16 34 20 52 35 34 30 35 19 35 30 0] -xshow -376 555 moveto -0 0 0 setrgbcolor -(Helvetica-BoldOblique-iso1252) cvn findfont 45 -45 matrix scale makefont setfont -<5261646172205761726E696E67205265636569766572> -[30 22 26 23 15 12 38 22 15 26 10 25 26 11 30 22 23 23 11 22 23 0] -xshow -376 626 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<456163682061697263726166742069732065717569707065642077697468206120737065636961 -6C206465766963652063616C6C65642061205261646172205761726E696E67205265636569766572 -2028525752292E204974277320646973706C6179206973> -[26 20 19 21 11 21 8 12 19 12 22 10 11 10 8 19 11 21 21 21 8 21 20 22 21 10 28 8 - 10 21 10 21 11 18 21 21 20 7 22 8 10 21 20 19 8 19 21 10 19 22 8 7 21 22 10 21 - 10 28 20 21 21 12 11 35 20 13 21 8 20 22 10 28 20 19 21 8 18 21 13 10 12 26 36 - 28 14 9 10 10 11 6 20 10 21 8 19 21 8 20 19 11 8 0] -xshow -376 683 moveto -<74686520726F756E6420224352542220746F20746865206C656674206F66207468652072616461 -7220646973706C61792E20497420776F726B73206D756368206C696B652061207261646172206465 -746563746F72207468617420796F752063616E2062757920666F72> -[10 21 22 10 12 21 21 21 21 10 13 28 26 23 13 11 10 21 10 10 22 21 10 8 22 10 11 - 11 21 10 10 10 21 22 10 12 21 21 21 13 10 22 7 19 21 8 21 17 9 11 10 11 10 27 21 - 12 19 19 10 31 21 19 21 10 9 8 18 21 11 20 11 12 21 21 21 12 11 21 21 9 21 19 10 - 21 12 11 10 21 22 10 10 18 21 21 10 19 21 21 10 21 21 19 11 9 21 0] -xshow -376 740 moveto -<796F7572206361722E20205468652072656365697665722063616E206465746563742072616461 -7220656D697373696F6E732066726F6D206F7468657220616972637261667420616E642077696C6C -20706C6F74206120626F78206F6E2074686520525752> -[18 21 22 12 10 19 21 12 9 10 11 22 22 20 11 12 21 18 22 8 18 21 12 11 19 20 21 - 11 21 21 9 21 19 10 11 12 21 21 21 13 10 20 33 7 19 19 8 21 21 19 10 10 13 20 32 - 11 21 9 22 21 12 10 22 7 13 19 12 22 10 11 10 21 21 21 10 29 7 8 9 10 21 7 22 10 - 11 21 10 21 20 19 10 21 21 11 10 21 21 10 26 36 0] -xshow -376 797 moveto -<646973706C617920726570726573656E74696E67207468652072656C6174697665206469726563 -74696F6E206F662074686174207261646172207468726561742E204F70706F73696E67207465616D -927320726164617220656D697373696F6E7320617070656172> -[22 7 19 22 7 20 19 11 12 21 21 12 21 18 21 22 10 8 21 21 10 10 21 22 10 12 21 8 - 22 10 8 18 21 11 21 8 12 21 19 10 8 21 21 11 21 10 10 10 22 21 10 11 11 22 21 21 - 12 11 10 21 12 21 21 12 9 10 30 21 20 21 20 7 21 21 11 9 21 21 33 6 19 11 12 21 - 21 21 13 10 20 33 7 19 19 8 21 21 19 10 21 21 21 21 21 0] -xshow -376 854 moveto -<61732066696C6C656420626F7865732E2020467269656E646C7920616972637261667420617070 -656172206173206F70656E20626F7865732E20546869732072656365697665722063616E6E6F7420 -64657465637420616972637261667420746861742068617665> -[21 19 11 10 8 8 8 21 22 10 21 20 18 21 20 9 11 10 22 13 7 21 21 22 7 19 11 21 8 - 12 19 12 22 10 11 10 21 21 21 21 21 13 10 21 19 10 21 21 21 21 10 21 20 18 21 20 - 9 11 23 21 8 19 10 12 21 19 21 8 18 21 13 10 19 21 20 21 22 10 10 21 21 9 21 20 - 10 10 22 7 12 20 11 22 11 10 11 10 21 21 11 10 21 20 18 0] -xshow -376 911 moveto -<746865697220726164617220656D697373696F6E7320646972656374656420617761792066726F -6D20796F75722061697263726166742C206E6F722069732069742063617061626C65206F66206465 -74656374696E6720616972637261667420746861742068617665> -[10 21 22 8 13 10 12 21 21 21 13 10 20 33 7 19 20 7 21 21 19 11 21 8 11 22 19 9 - 21 21 11 20 27 20 19 10 10 12 21 32 10 18 21 21 12 11 22 7 12 19 12 22 11 10 11 - 10 21 21 12 11 8 19 10 9 10 11 19 20 21 22 20 8 21 11 21 10 11 20 21 10 21 19 10 - 8 21 21 11 21 8 12 19 12 22 10 11 10 10 21 22 10 11 21 20 18 0] -xshow -376 968 moveto -<74686569722072616461722073657473207475726E656420636F6D706C6574656C79206F66662E -20> -[10 21 22 8 13 10 12 21 21 21 13 10 18 22 10 19 10 10 21 13 21 21 21 10 19 20 32 - 22 7 21 10 22 7 19 10 22 11 11 10 0] -xshow -376 3343 moveto -<41434D20666F7220554E495820616E642057696E646F7773> -[24 27 32 10 9 22 12 11 27 28 9 26 10 21 21 21 10 37 7 21 21 20 27 0] -xshow -1256 3343 moveto -<3138> -[19 0] -xshow -1962 3343 moveto -<30362F31302F3036> -[21 21 9 21 21 10 21 0] -xshow -grestore grestore -showpage -%%PageTrailer - -%%Page: 19 19 -%%PageBoundingBox: 0 0 595 842 -%%BeginPageSetup -% -%%EndPageSetup -gsave -[0.24 0 0 -0.24 0 842] concat -gsave -376 422 moveto -0 0 0.50196 setrgbcolor -(Helvetica-iso1252) cvn findfont 68 -68 matrix scale makefont setfont -<576561706F6E2053797374656D7320> -[58 33 34 34 34 34 18 41 30 31 15 34 52 31 0] -xshow -376 500 moveto -0 0 0 setrgbcolor -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<596F7572206169726372616674206973206571756970706564207769746820686561742D736565 -6B696E67206D697373696C657320616E6420612032302D6D696C6C696D657465722063616E6E6F6E -2E20576561706F6E20696E666F726D6174696F6E206973> -[21 21 22 12 11 21 8 12 19 12 22 10 11 10 8 20 10 21 21 22 7 21 21 21 21 10 28 8 - 10 21 10 22 20 22 10 12 19 21 21 19 8 20 22 10 33 7 19 19 8 7 22 19 10 21 21 21 - 10 21 11 20 22 12 32 8 8 8 8 32 21 9 22 12 10 19 21 21 21 21 22 9 11 35 20 21 20 - 22 21 10 7 23 9 21 12 32 21 11 7 21 21 11 8 0] -xshow -376 556 moveto -<646973706C6179656420696E20746865206C6F776572206C6566742D68616E6420636F726E6572 -206F6620796F7572204855442E20446966666572656E7420776561706F6E73206D61792062652073 -656C6563746564206279207072657373696E67> -[22 7 19 22 7 20 18 21 21 11 8 21 11 10 21 21 10 8 21 27 21 12 11 7 23 10 10 13 - 21 21 21 21 10 19 21 13 21 21 12 10 22 10 10 18 21 21 13 10 27 29 27 9 10 28 8 - 11 9 22 11 22 21 10 11 27 20 21 21 21 21 19 10 32 19 19 11 21 20 11 18 22 7 22 - 19 9 21 21 11 20 19 10 21 12 21 19 19 8 21 0] -xshow -376 613 moveto -<6D6F75736520627574746F6E20332E205468652063757272656E746C792073656C656374656420 -776561706F6E206973206669726564206279207072657373696E67206D6F75736520627574746F6E -20322E20> -[32 21 21 18 21 11 20 22 10 10 21 21 10 23 9 10 23 21 21 10 19 21 12 12 21 21 11 - 8 19 10 19 21 8 21 19 10 20 22 10 27 21 20 22 20 21 11 8 19 10 11 8 12 21 21 10 - 20 19 11 21 12 21 18 20 7 21 21 11 32 20 21 19 21 10 21 21 10 10 21 21 11 22 9 0] -xshow -376 751 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 45 -45 matrix scale makefont setfont -<4169722D746F2D416972204D697373696C657320> -[31 10 15 14 12 26 13 31 10 16 12 35 10 23 23 11 11 23 23 0] -xshow -376 904 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<546865206D697373696C657320617265207061747465726E656420616674657220552E532E2041 -494D2D394D205369646577696E646572732E20546865792063616E2064657465637420696E667261 -7265642028495229207461726765747320617420616E79> -[24 20 21 11 32 7 19 19 8 8 21 19 11 21 11 22 10 21 21 10 10 21 13 21 21 20 11 22 - 10 10 21 13 10 27 9 27 9 10 26 9 33 12 20 32 11 25 8 21 20 28 7 22 20 22 12 20 - 9 11 23 20 21 18 11 19 20 21 11 21 21 9 21 19 11 10 8 21 11 12 21 12 21 21 10 13 - 10 28 12 10 10 22 12 21 21 10 19 10 22 10 10 21 21 0] -xshow -376 961 moveto -<61737065637420286E6F74206A7573742066726F6D207468652072656172292E20546865697220 -72616E676520766172696573206472616D61746963616C6C7920776974682074686520616C746974 -75646520616E6420636C6F7375726520726174652E20546865> -[21 19 21 21 19 10 11 12 21 21 10 10 8 21 20 10 10 10 12 21 32 10 10 21 22 10 12 - 21 21 13 13 9 11 23 21 21 8 13 10 12 21 21 21 21 11 18 20 13 8 21 19 11 21 12 20 - 32 21 11 7 19 22 8 7 20 10 28 8 10 21 11 10 21 21 10 22 8 10 8 10 21 21 21 11 21 - 21 21 10 19 8 21 19 21 12 21 10 12 22 9 23 9 10 23 21 0] -xshow -376 1018 moveto -<6D697373696C652073756273797374656D20636F75706C6573207769746820796F757220726164 -61722073657420746F2070726F766964652074696D652D746F2D696D7061637420696E666F726D61 -74696F6E2E20> -[32 8 19 19 8 8 21 11 18 21 21 19 18 19 10 20 32 11 18 21 21 21 8 21 19 11 27 8 - 10 21 11 18 21 21 12 11 11 22 21 21 12 11 18 21 10 11 10 21 10 21 12 20 20 7 21 - 21 11 10 8 32 21 12 10 21 13 7 33 21 20 20 10 10 8 22 9 21 12 32 22 10 8 20 23 - 9 0] -xshow -376 1181 moveto -<4649475552452034204D495353494C4520444953435245544553> -[24 9 30 27 27 25 11 21 10 32 10 25 25 10 21 25 11 28 9 25 27 28 25 23 25 0] -xshow -376 1345 moveto -<3C506963747572653A2028466967757265293E> -[22 26 7 20 9 22 12 22 9 11 12 23 8 21 21 12 21 12 0] -xshow -376 1509 moveto -<54686973206D697373696C6520686173206120736F6C696420726F636B6574206D6F746F722074 -686174206275726E7320666F722061626F75742038207365636F6E64732E20416674657220627572 -6E2D6F75742C2069742077696C6C207374696C6C20747261636B> -[24 21 7 19 11 32 7 19 19 8 8 22 10 21 21 19 10 21 11 18 22 8 7 22 10 12 21 19 17 - 22 10 10 32 21 9 22 12 10 10 21 22 10 10 21 21 13 21 18 11 9 22 12 11 21 20 21 - 22 10 10 21 11 18 21 19 21 21 21 20 9 10 27 10 9 22 12 11 20 21 13 21 12 21 21 - 11 10 11 8 10 11 28 8 8 8 10 19 11 8 8 8 11 10 12 22 18 0] -xshow -376 1566 moveto -<746F77617264732069747320696E74656E6465642074617267657420627574206D6179206C6F73 -6520737065656420746F6F2072617069646C7920746F2063617463682069742E20596F7572206865 -6174207365656B696E67206D697373696C657320646F6E2774> -[10 20 27 22 12 20 19 11 8 10 20 10 8 21 10 21 21 21 21 21 10 10 22 12 21 21 10 - 11 20 21 11 10 32 20 18 11 8 21 19 21 10 19 21 20 22 21 10 10 21 21 10 12 21 22 - 7 22 8 19 10 10 21 11 18 22 10 18 22 10 8 12 9 11 20 22 21 13 10 21 21 21 10 11 - 18 21 21 20 7 21 21 11 32 7 19 19 8 8 21 19 11 21 21 21 7 0] -xshow -376 1623 moveto -<61726D207468656D73656C76657320756E74696C207468726565207365636F6E64732061667465 -72206C61756E63682E2042656361757365206F6620746861742C20796F752073686F756C64206E6F -7420666972652061742061207461726765742074686174206973> -[21 12 32 11 10 21 20 33 18 21 8 18 21 19 10 21 22 10 8 8 11 10 21 12 21 21 11 18 - 21 19 21 21 21 19 10 22 10 9 22 12 11 8 21 21 21 19 22 9 11 25 21 18 21 21 19 21 - 10 22 10 10 10 21 22 10 10 11 18 21 21 10 19 21 21 21 8 21 10 21 22 9 11 10 8 12 - 21 11 21 10 11 21 10 10 21 13 20 22 10 10 10 21 22 10 11 7 0] -xshow -376 1680 moveto -<636C6F736572207468616E207468726565207365636F6E6473206F6620666C696768742074696D -6520617761792E20> -[20 7 21 19 21 13 10 10 21 21 21 11 10 21 12 21 21 10 19 21 19 21 21 20 19 11 21 - 10 11 10 8 8 21 22 10 10 11 7 32 21 11 20 27 20 17 10 0] -xshow -376 1761 moveto -<4D697373696C65207374617475732064697363726574657320616E64207468656972206D65616E -696E67733A20> -[32 8 19 19 8 8 21 11 19 10 21 10 21 19 10 22 7 19 19 12 21 10 20 19 11 21 20 22 - 10 10 21 22 8 12 10 32 21 21 21 8 20 22 20 9 0] -xshow -376 1917 moveto -(Helvetica-iso1252) cvn findfont 34 -34 matrix scale makefont setfont -<41524D20> -[21 22 26 0] -xshow -676 1917 moveto -<41206D697373696C652069732061726D65642C2062757420697473207365656B65722068617320 -6E6F742079657420616371756972656420612074617267657420696E20697473206669656C64206F -6620766965772E20> -[21 9 26 6 15 16 7 6 18 8 6 16 9 17 10 26 17 17 9 8 17 17 9 8 7 8 16 9 15 17 17 - 15 17 10 9 17 17 15 9 17 17 8 9 14 18 8 8 18 15 17 17 7 10 17 17 9 17 8 8 18 10 - 17 17 9 8 6 18 9 7 7 16 9 8 7 17 7 17 9 17 8 9 16 6 16 23 7 0] -xshow -376 2061 moveto -<4C4F434B454420> -[16 24 22 21 20 23 0] -xshow -676 2061 moveto -<41206D697373696C652069732061726D656420616E6420697473207365656B657220686173206C -6F636B6564206F6E746F2061206865617420736F757263652E20546865206D697373696C65206973 -20726561647920746F20666972652E20> -[21 9 26 6 15 16 7 6 18 8 6 16 9 17 10 26 17 17 9 17 16 18 8 7 8 16 9 15 17 17 15 - 17 10 9 17 17 15 9 6 18 15 14 18 17 8 18 17 8 17 9 17 8 17 17 18 8 9 15 17 17 10 - 16 18 7 9 19 17 17 8 27 6 15 16 6 6 18 9 6 16 9 9 17 17 18 15 9 7 18 8 9 6 10 19 - 7 0] -xshow -376 2204 moveto -<2D2D2D2D20> -[11 10 10 10 0] -xshow -676 2204 moveto -<546865206D697373696C652773207365656B657220686173206163717569726564206120746172 -6765742C20627574206974206973206F7574206F662072616E6765206261736564206F6E20637572 -72656E742074696D652D746F2D746172676574> -[19 17 17 9 27 5 16 15 7 6 18 5 16 9 15 17 17 15 17 10 9 17 17 15 9 17 15 17 18 - 6 10 17 17 9 17 9 8 17 10 17 18 8 8 9 17 17 9 8 7 9 8 7 16 8 17 18 8 8 18 8 8 10 - 17 18 17 17 9 17 17 15 17 17 9 17 17 9 15 17 10 10 17 18 8 8 9 6 26 18 10 8 17 - 10 8 18 10 17 17 0] -xshow -676 2251 moveto -<696E666F726D6174696F6E2E20> -[7 18 7 17 10 26 18 8 6 18 18 8 0] -xshow -376 2386 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 45 -45 matrix scale makefont setfont -<43616E6E6F6E20> -[30 23 25 25 25 25 0] -xshow -376 2539 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<43616E6E6F6E2063616E206265207573656420746F20656E676167652074617267657473206174 -20636C6F7365722072616E67652E20596F75722063616E6E6F6E206973206D6F64656C6564206166 -7465722074686520552E532E204D36312D4131> -[28 21 20 21 21 21 10 19 21 21 11 21 20 11 21 18 21 21 11 9 22 10 21 21 21 21 21 - 21 10 10 21 13 21 21 10 19 10 21 11 10 19 8 21 19 21 12 11 12 21 21 21 22 9 11 - 21 21 22 12 10 19 21 21 21 21 21 10 8 19 11 31 21 21 21 8 21 21 10 22 10 10 21 - 13 10 10 21 22 10 27 9 27 9 11 31 20 21 12 25 0] -xshow -376 2596 moveto -<56756C63616E2E204169726372616674207479706963616C6C7920626567696E2061206D697373 -696F6E20776974682035303020726F756E6473206F6620616D6D756E6974696F6E3B207468652063 -616E6E6F6E2066697265732061742033303030> -[23 22 8 19 21 22 9 11 25 8 12 19 12 22 11 10 11 10 18 22 7 19 22 8 8 19 11 20 21 - 22 7 21 11 21 10 33 7 19 19 7 21 22 10 28 8 10 21 10 21 21 21 10 12 21 21 21 21 - 19 10 22 10 10 21 31 32 21 21 8 10 8 21 23 9 10 10 21 22 10 19 21 20 21 21 21 11 - 10 8 12 21 19 11 21 10 10 21 21 21 0] -xshow -376 2653 moveto -<726F756E647320706572206D696E75746520736F20796F75206F6E6C79206861766520656E6F75 -676820616D6D756E6974696F6E20666F7220612074656E2D7365636F6E6420636F6E74696E756F75 -73206275727374202D2D20757365206974> -[12 21 21 21 21 19 10 21 21 13 10 32 8 20 21 10 21 11 19 20 11 18 21 21 10 21 22 - 7 19 11 21 20 18 21 10 21 21 21 21 20 22 10 20 32 32 21 21 8 10 8 21 21 11 9 21 - 13 10 21 11 9 22 21 12 19 21 18 21 21 21 11 18 21 22 10 8 21 21 21 20 19 11 20 - 22 12 19 10 11 12 13 10 21 19 21 10 9 0] -xshow -376 2710 moveto -<6361726566756C6C792E20> -[19 21 12 21 10 22 8 8 18 9 0] -xshow -376 2873 moveto -<46494755524520352043414E4E4F4E20444953435245544553> -[24 9 30 27 27 25 11 21 10 27 24 27 27 30 27 10 28 10 25 27 27 25 23 25 0] -xshow -376 3037 moveto -<3C506963747572653A2028466967757265293E> -[22 26 7 20 9 22 12 22 9 11 12 23 8 21 21 12 21 12 0] -xshow -376 3343 moveto -<41434D20666F7220554E495820616E642057696E646F7773> -[24 27 32 10 9 22 12 11 27 28 9 26 10 21 21 21 10 37 7 21 21 20 27 0] -xshow -1256 3343 moveto -<3139> -[19 0] -xshow -1962 3343 moveto -<30362F31302F3036> -[21 21 9 21 21 10 21 0] -xshow -grestore grestore -showpage -%%PageTrailer - -%%Page: 20 20 -%%PageBoundingBox: 0 0 595 842 -%%BeginPageSetup -% -%%EndPageSetup -gsave -[0.24 0 0 -0.24 0 842] concat -gsave -376 344 moveto -0 0 0 setrgbcolor -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<5768656E2063616E6E6F6E73206172652073656C65637465642C20746865204855442069732069 -6E204C65616420436F6D707574696E67204F70746963616C20536967687420284C434F5329206D6F -64652E204F6E20746865204855442C2061> -[36 21 21 21 10 19 21 21 21 20 21 19 11 20 12 21 11 19 21 8 21 19 10 20 22 10 10 - 10 21 22 10 27 27 27 11 8 19 11 7 22 10 21 21 21 21 10 28 20 32 21 21 10 8 21 21 - 11 29 21 10 8 19 21 8 11 25 8 21 21 10 11 11 21 27 29 26 12 10 32 21 21 22 9 10 - 30 20 11 10 21 21 10 28 28 26 10 11 0] -xshow -376 401 moveto -<63697263756C61722061696D696E672072657469636C6520697320646973706C617965642E2054 -68652048554420636F75706C65732077697468207468652072616461722073657420746F2070726F -7669646520612076697369626C6520637565206F6620746865> -[20 7 12 19 22 7 22 12 11 21 7 33 7 21 21 11 11 22 10 8 19 8 21 11 8 19 10 22 7 - 19 22 7 20 18 21 23 9 10 23 21 21 11 27 27 27 10 19 21 21 21 8 21 19 10 28 8 10 - 21 11 9 22 21 10 12 21 21 22 12 10 19 21 10 11 10 21 10 21 12 20 19 8 21 21 10 - 22 10 19 8 19 8 21 8 21 11 18 21 21 11 21 10 11 10 21 0] -xshow -376 458 moveto -<74617267657427732063757272656E742072616E67652E205468652061696D696E672072657469 -636C6520697320737572726F756E646564206279203132207469636B732E20416E20696E6E657220 -61726320726570726573656E7473207468652063757272656E74> -[10 22 12 21 21 11 6 19 11 18 21 13 11 22 21 10 11 11 21 22 21 22 9 11 23 20 21 - 11 21 7 33 7 21 21 11 12 21 10 8 19 8 21 11 8 19 10 19 21 12 12 21 21 21 21 21 - 21 10 21 18 11 20 19 11 10 9 18 19 20 9 11 25 21 10 8 21 21 21 13 10 21 12 19 10 - 12 21 21 12 21 19 21 21 10 19 11 9 22 21 10 19 21 12 12 21 22 0] -xshow -376 515 moveto -<72616E676520746F20746865207461726765743A206561636820617263207469636B2072657072 -6573656E747320313030302066656574206F662064697374616E63652E205468652061696D696E67 -2072657469636C65206D6F766573206163726F737320746865> -[12 21 22 20 22 10 10 21 11 10 21 21 10 10 22 12 21 21 11 9 10 21 21 19 21 10 21 - 12 19 11 10 8 19 19 11 11 21 21 13 20 19 21 21 10 19 11 20 20 21 20 11 9 21 22 - 10 10 21 11 10 22 7 19 10 21 21 19 22 9 11 23 21 20 11 21 7 33 7 21 22 10 12 21 - 10 8 20 7 22 10 32 20 18 20 19 11 21 18 12 21 19 19 10 10 21 0] -xshow -376 571 moveto -<48554420746F2073686F77206120676F6F642061696D696E6720706F696E74206261736564206F -6E207468652074617267657427732072616E676520616E6420796F75722061697263726166742773 -20706974636820616E64207475726E20726174652E204966> -[27 28 27 10 10 21 11 18 21 20 28 10 21 11 21 20 21 21 11 21 7 33 7 21 21 11 21 - 21 8 21 10 11 21 21 18 21 21 11 21 21 10 10 21 21 11 10 21 12 21 22 10 6 20 10 - 12 21 21 21 21 11 21 21 20 11 18 21 21 12 11 21 8 12 19 12 22 10 11 7 19 10 22 - 8 10 18 22 10 21 21 21 10 10 21 13 21 11 11 22 10 22 9 11 10 0] -xshow -376 628 moveto -<7468652072616E6765206973206C6172676520616E64206F7220796F757220706974636820616E -64207475726E2072617465732061726520666173742C20796F75206D617920736565206E6F207265 -7469636C6520617420616C6C3A207468652061696D696E6720706F696E74> -[10 21 22 10 12 21 21 21 21 11 7 20 10 8 22 12 21 21 10 21 21 21 11 21 12 10 18 - 21 22 12 10 21 9 10 18 22 10 21 21 21 10 10 21 13 21 11 11 22 10 21 19 10 21 12 - 21 10 10 21 19 11 10 10 18 21 21 11 32 19 19 10 19 21 21 10 21 21 11 11 22 10 8 - 19 8 21 10 22 10 10 22 8 9 9 11 10 21 21 11 21 7 33 7 21 21 11 21 21 7 22 0] -xshow -376 685 moveto -<69732073696D706C79206F7574206F6620746865204855442773206669656C64206F6620766965 -772E20> -[8 19 11 19 7 32 22 7 20 10 21 21 10 11 21 10 11 9 22 21 10 27 27 28 7 19 10 10 - 8 22 7 22 10 21 11 10 19 8 20 27 9 0] -xshow -376 767 moveto -<416E20756E6D6F76696E672063726F737320286120222B22292077696C6C20626520646973706C -61796564206F6E207468652048554420696E204C434F53206D6F64652E2054686973206D61726B65 -722064656E6F74657320746865> -[26 20 11 21 20 32 20 20 7 21 21 11 18 12 21 19 19 10 12 22 10 13 23 13 12 11 28 - 8 8 8 10 21 21 11 21 8 18 22 7 21 18 21 21 10 21 21 10 10 21 22 10 27 27 28 10 - 7 22 11 20 26 30 25 10 32 20 22 22 9 10 23 21 8 19 10 32 21 12 18 21 12 11 21 21 - 20 21 10 21 19 10 10 22 0] -xshow -376 824 moveto -<626F72657369676874206F66207468652063616E6E6F6E202D2D2074686520646972656374696F -6E2074686174207468652063616E6E6F6E27732062617272656C2069732061637475616C6C792070 -6F696E74696E672E20> -[21 21 12 21 19 8 21 21 11 10 21 10 11 10 21 21 11 18 21 21 21 21 21 10 13 12 11 - 10 21 21 10 22 8 12 21 19 10 8 21 21 11 10 21 21 10 11 10 21 21 11 18 21 21 21 - 21 21 7 19 10 21 21 12 12 22 8 10 8 19 11 21 19 9 22 21 8 8 19 11 20 22 7 22 10 - 8 21 23 9 0] -xshow -376 988 moveto -<4649475552452036204120484152442D5455524E494E472053484F54> -[24 9 30 27 27 25 11 21 10 25 11 27 25 27 26 11 23 27 27 28 9 27 30 10 25 28 28 0] -xshow -376 1315 moveto -<3C506963747572653A2028466967757265293E> -[22 26 7 20 9 22 12 22 9 11 12 23 8 21 21 12 21 12 0] -xshow -376 1479 moveto -<46696775726520362073686F777320616E6F74686572206578616D706C65206F66207768617420 -796F75206D696768742073656520696E206120646F6766696768742E20416C6C20706C616E657320 -617265207475726E696E67206861726420746F20746865> -[24 7 21 21 12 21 11 20 11 18 22 19 28 19 10 21 21 21 10 21 21 12 11 19 19 21 32 - 21 8 21 10 22 10 10 27 21 22 10 10 18 21 21 10 33 7 21 21 10 11 18 21 21 11 7 22 - 10 21 11 21 21 21 10 8 21 21 12 9 10 26 8 8 10 22 7 21 21 21 19 10 22 11 21 11 - 10 21 13 21 8 21 21 10 21 21 12 21 11 9 22 10 10 21 0] -xshow -376 1536 moveto -<6C65667420617420612072656C61746976656C79206C6F772073706565642E20596F7520617265 -20696E204C434F53206D6F646520616E64207365652074686174207468652072657469636C652069 -7320706F736974696F6E6564206168656164206F6620746865> -[8 22 11 10 11 21 10 11 21 10 12 21 8 21 11 8 18 21 8 19 10 8 21 27 11 18 21 21 - 21 23 9 10 21 21 22 10 21 12 21 10 8 22 10 20 27 29 25 10 32 21 21 21 10 21 21 - 21 10 19 21 21 10 10 21 22 10 10 10 22 21 10 12 21 10 8 19 8 22 10 8 19 11 20 21 - 20 7 11 8 21 21 21 21 10 21 21 21 21 21 10 22 10 10 10 21 0] -xshow -376 1593 moveto -<696E74656E646564207461726765742E20546F2067657420746865206B696C6C2C2073696D706C -792072656C617820746865207475726E206C6F6E6720656E6F75676820746F2067657420696E746F -20706F736974696F6E20616E64207468656E2074616B6520746865> -[8 22 9 21 21 21 21 21 11 10 21 12 21 21 12 9 10 19 22 10 21 21 10 11 10 21 21 10 - 20 8 8 8 11 10 20 7 32 21 8 19 10 12 22 7 21 19 11 9 22 21 10 10 21 13 21 11 7 - 22 21 21 10 21 21 21 21 21 21 10 10 21 10 21 22 10 10 7 22 10 21 11 20 21 20 8 - 10 8 21 21 11 20 21 21 11 10 21 21 21 10 10 22 18 21 10 10 21 0] -xshow -376 1650 moveto -<73686F742E20> -[19 21 21 11 10 0] -xshow -376 3343 moveto -<41434D20666F7220554E495820616E642057696E646F7773> -[24 27 32 10 9 22 12 11 27 28 9 26 10 21 21 21 10 37 7 21 21 20 27 0] -xshow -1255 3343 moveto -<3230> -[20 0] -xshow -1962 3343 moveto -<30362F31302F3036> -[21 21 9 21 21 10 21 0] -xshow -grestore grestore -showpage -%%PageTrailer - -%%Page: 21 21 -%%PageBoundingBox: 0 0 595 842 -%%BeginPageSetup -% -%%EndPageSetup -gsave -[0.24 0 0 -0.24 0 842] concat -gsave -376 422 moveto -0 0 0.50196 setrgbcolor -(Helvetica-iso1252) cvn findfont 68 -68 matrix scale makefont setfont -<54686520485349> -[38 34 34 18 44 42 0] -xshow -376 500 moveto -0 0 0 setrgbcolor -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<54686520486F72697A6F6E74616C20536974756174696F6E20496E64696361746F722C206F7220 -4853492C2069732061206E696674792064657669636520746F2061696420696E20696E737472756D -656E7420666C79696E672E2020496E2041434D2C2074686520485349> -[24 20 21 11 27 21 13 8 18 21 21 10 22 8 10 26 8 10 21 21 11 7 21 21 11 10 21 22 - 7 19 21 10 21 11 10 10 22 12 10 27 26 10 10 11 8 19 10 21 11 21 9 10 10 19 11 21 - 20 19 8 19 21 10 10 21 11 21 8 21 10 8 21 11 8 21 19 10 12 21 32 21 21 10 11 10 - 8 19 8 21 23 9 10 10 10 22 10 24 27 32 10 10 10 21 22 10 27 26 0] -xshow -376 556 moveto -<73686172657320737061636520776974682074686520726164617220646973706C61792E202055 -73652074686520285229206B657920746F206368616E6765207261646172206D6F64657320756E74 -696C207468652048534920697320646973706C617965642E> -[19 21 21 12 21 19 10 19 21 21 18 22 10 28 8 10 21 10 10 21 22 10 12 21 21 21 13 - 10 21 8 19 21 8 21 17 9 11 10 28 18 21 11 10 21 21 10 12 28 12 11 18 20 19 10 10 - 21 11 18 21 21 21 21 21 10 12 21 21 22 12 11 31 21 21 21 18 11 21 21 10 8 9 10 - 10 21 22 10 27 26 10 10 8 19 11 21 8 18 22 8 20 18 20 22 0] -xshow -376 613 moveto -<557365207468652028392920616E6420283029206B65797320746F2073656C6563742074686520 -64657369726564204E4156414944206672657175656E63792E202055736520746865202837292061 -6E6420283829206B65797320746F206F7269656E7420746865> -[28 18 21 11 10 21 21 10 12 22 12 11 21 21 21 10 12 22 12 10 18 20 19 18 11 10 21 - 10 19 21 8 21 19 10 11 10 21 21 11 20 21 20 7 12 21 21 11 27 23 22 25 10 27 11 - 10 12 21 21 21 21 21 20 16 10 10 11 27 18 22 10 10 21 21 11 12 21 13 10 21 21 21 - 10 12 22 12 10 18 20 19 19 10 10 21 11 21 12 8 21 22 10 10 10 21 0] -xshow -376 670 moveto -<53656C656374656420436F7572736520506F696E7465722028534350292E> -[26 21 7 21 20 9 21 21 11 27 21 21 12 19 21 10 24 22 7 21 10 22 12 10 12 26 27 26 - 12 0] -xshow -grestore -gsave -readpath -V01770368B000324E051E00B008324~ -closepath clip newpath -gsave -375 1674 translate -3.12649 3.12451 scale -/DeviceRGB setcolorspace -419 257 0 1 psp_imagedict image -J,g]g3$]7K#D>EP:q1$o*=mro@So+\<\5,H7Uo<*jE<[.O@WnZVu2iT-^757;Rp>H>q_R=AlC^cenm@9 -:1mM9jS"!dTMT<$3[GQ$.?W%m<4ZX!SPQ1`C/mioWjU1$t^gM+`4=1jR;SM.1=M/6)*KS9HnG,2D="Tc_5QD?D*"iV`K>JccW*D(s%Yd4- -0drPi.i+&_,;H.PE]Y>'a49"UXCSJ -WT;?o:8cSk2(G.pX&c:P.lA/tC:dfUfISp2*KnTRK\AROa,Af3>dfHj71e* -N^Y7UalJVA1o=CTQN/?G)2u.@24I>'':IAS6g$G#_25]&B[p#pMgPrr/Fh1f>Q&c\!_dRNJN'\m&MSu7:8A&[n*/mC_EVSmP7j=,;AFK=b!`pq=8nIT#N65ci -Ra%`$M9P7/4J'lsoEl$7LI@laW:YsA.[Ni+e#Dq!D+\(_P"FrhM)AnK>-?I-ot(ZZ`F,t(XL=$5Wm>If -gF`-bNOJ"hQdk;abJ!2+Gc4uI\(V#L!IquFY1Phl-Nf.Dj0ACgN5H;ZQea8q#QP]^!.dEYE*,LL'aBCZ -@Bd7`7NiG#`F;\XUg>nrN^b8@\GUM9,EYQ.13k.>9duB#jjL,][UUtY9kKMXr8[l?Skg^iq?7'&5+the -F1O4UPshHIC"2uj5,D#QeE9eg2--h`Y#fDhqD\PS>-M.C<_GoD+c),]3[H;CP^##rZ -qt:6kK>:nL=Bn<;'o'_;EO5P5U5P2@h(75PKE;)SJUelI3'8Au$AHA?TEo'd%1n00U2akZ@P\p^`hK_o -oQ!;=O@Z1QBfr+g.[A1&Yj$PP"pQ&t-?E=cg2f6Ec0)F4o^[JuT[>/%C)n@R8>Xb6[$lCuTh_Q:.WoKk -@]NY4euQ4$rGKMZYuiQ#CFu:&C9u5oP6iL0i?l%hXjHiKdNoI;h;XcgNRBCs]1DBgMrk*T#`r;r(E<:0 -lZgl2Ug85i;'51_(*!K0nM#Qp`\G"GXdf&QlDH0c>s?j,r!dIR,->6Qsh?0Gng1PY.c-\TG8g -/=B/nEuCe1D)n'1k7btep45H%:T0Kr/Imb3Uf-FKg/U2%:T7<.PmXooY>qZ)lW)Z`I^q4daZpIH-'gP( -MV>.TLl>6`E43aQOZRYOlYjDkY7R0\b!gTdaY4O3lotf'_d[MN=Omg2H,r5@=BRO<0`Z^=TPs<&)@6\% -!$MnU<#ungLr?$-8?>uJ(lZJ0EQIK9*?^&$^r)6:P"d6db,$l87(QGQQHU[s.BLO-1n7:<1WeGKF[2PF -BCmZ*&s#DUdA^*&>rnHOVGsPf3fR%@RZ\^^=o5Ft\!e/BVCNC'F;^D2@"e2k(Q=m7k)\A9(g8VH5@6`kW\c+>DjW"G9!Jn>K#9&IsN4iNWZY8h1L3`?Pt.b]5W`NCY;")#T7a,a6=2120^^ -="]f_-'Kd*c=8]#c)3@#g^!pDT$#ten-'G_7A3U.1b(X6OZ3 ->HuZCo\2g/X_P=J.lR8VcJrQD?)\UoV1t1\[,5_EMZs+OL;W"*336FB)i(2!.T;2\:FeKLAKV):!#c"D -J\bb+GZ5S!$&6=Ud27O3*u0W$U60]MAiU]h7cX$l"HGnsONHRHM);)4/!il*&\%Z8!Ag1h-IWjFciH;% -:M+\e'b5LNU/<;fM?P&Z8u#+[FF$XkVc'J?C:*8;2Q9c\e*D-l"_,/3XOlc;b<9mb>IE2OQ9,P]k@(l" -//J+7`m\e4=`3t=((U_*_dW'PS5q9.5K?c:=W)*L?^&ZEEtA=*j8f=65iAl&4=UdKKYq5;k_qhU%uS<" -d7Cob1E;?DUN-(qJk%#JaCOj57%.%*Q-5ulp\4f"1RUraP1ZkUA,r4IVmErD$AUj?dAV.Z2$/n&RaNWa -\n'6_;PV\j'^Df0UJe8EkuI!X@`)EQ=6u2Eoo?pkZWeq\$Z0M%Ehq%L'l&0.hgE/qYP8M9$O;@!fkJp* -9YV;l`oAfK]T,'"ONHUi\VL7H!!\!?+E1FN*Yem66=I+.F@IDeLW*_"BV\rl)3.02dCB*t5n\[^^_0d4 -RSbJpb@*//0EPfAR7nsVH,Sif4.]5\e+s4PKgVS3B[h>s-C%6$;eabXKgqn;W`<\Q9#T"`/s04NQ2)GH -_dK`PCmKDgVTik_>4'nqKsKfY\_M(hHaJN/._\Mn(9*""[8t.QE7fP--P_QZ@r^0!L*$S$Xke$Lr58RD -3<2=;O>nd8%gmqV+Y_PR3[52m_r@pLZr/OqN5m.TkhLVK+Haa@Z5Gcf;'qON-$&6L_HS^D^VCLS[+9.S -R85#j8Z2]C6D2ZgZt_`JP=h\#.CAAg6DIGXeLItA]jeV'2$&(_)OP"Y=+TDF0 -ifR?5$k,,r7UpG:jF068Nl^8o8JIIf-^@9"P*p-h>qq^?jmuW>g1`L::1ocIo^72lTMXiO=q)O08>B's -PdqJ6!Doa`WYF/e?9&+G7:J..omX_cYup@Y>;`#"Bsh.3QJ6PriGl8+lZ%f)@dd@2?>l0gp$Vj.^gQY6 ->Rhh^Lr3\;2,&-^-&fghCKF2`b:s!H^n>X;//f$)KYjF%aDhT'X#8#S -#Q\;:^[)^sm:ssMJ]X^n)f<1DE4F]+G>#'lms)M%XnKA3U:5Z[?u4Ih*ZG9=_W#=^r*DH"OMg.!q(/Y3 -04KG3+7J\!(iok5_4_FM<&PC#L.!34(o0nY&r8g2J-b4Z3?!uMA5YE5Q;&`k8nCo2A@>bsQqV*j3Mb5C -2k3WU;n:u_I6Wn8W);3s?7QkfdV..A75C-&W)Mt\lD6tN;l`r7'tV'o[9'S6lrD4LL<4)7>&-qo'GB); -Jm,8l>GXqL6_[C1=1dSfrI;UjE*,4L(Cbf*:oi21A]l*:a5_1X4I0%nMo`[6_iP!.#m5dr+Rl -&fE9=Dcjp:0fZ7@1E2@pj>&_HSgt1P\)&50O8p1&"G+Bt&9q.m)$u&7iR&Kq:*14-7A>ohe7L]XO%/1" -f`[=(-%F%t179Df9.ZE%jq?@+^1@Y8J0slSr8MoWT1nG^=o@i6!2EETdX"nGR8'SXl4k5&:8q6oP,(7S;bO_plAW-9-hb(XoK?#LNPe_XGJ^0g=g$f2*pFIc2^(d(h,)'#JWXnKDn -:FVRPAb-Hr7qnAoh\1icd>QcDT.5rM8S$7p7&Es7Q:kf;q1Qb!(5P[o0Z[33FU=VaB9W/a#(&_1 -;(,CI737^`VG_-8\ogK9;l7L5OG^GHEDM0eC/rFTL9G*k=Y*S)p];CM[)6_2q^oh6F1>=];e`niom=D[ -DqFmk#6fas@;siA`7DVE`a#dX9QioLPK20-Ff5-;$on;QTTD,a+pS($_I1aS>Q,QSKgR!QBRE,s%Z/3b -n]:WS6QM<1,a'T-EY\Y?9-<`8FJ;PdP>*A[=M24L/"9<]F(g(*K0l8$BXDM;,*PWqdj_ZhI6s],WRWK+ -C;")_>-6C,[Hd^B_d]n".!B>NC3qnIg9%^IIBqgL\D8cYqCIpUC;!=0QFldddrN:\E0kAt;I>=BO@T3i&IF.XiK2]64s:Mp7,j>2ZsGI)NCMrjf^sVY+d#=VP$'W5;%%uui6ZEs -j8gp$bU-7kUu#`ERnfjp\b,TH4J>R7F;cGHNCfkmknM9>mL`0m:hhi`[0is0X\>cQ0Ea#A@B8%]F,2u. -"_Y5.XHqT]^<9]edqq$J7=O'4Y$'kJ3DKMSJ\ba`Qs;Nk&W+J9n9-D&0euNr9mV#ufZUU=juPJMe0%3@^oSo2Og4+f6*kEmSsP[#),7V?uT41-5R,H`+!^g -]OhNL5dO`LGq>fP/!J.A!5jm$$4-fd_BA?H1bo^RKtlV$kaX7S%u\E%0j*4?3?!q!,OjoTr^?pP8L2[( -L]U^3J'2F:WLS9M+e)1Qo;MT(9/rQdjg1B9YQ74gdA7PW>r%mEVpm1R.\0J<olp0U"euk]9U7rG.PM,f6a@bpNEH'WgAY1N[6s(;'n9%IJX8/_IPCkH1!^`6HJ+n&+B]3 -#m>aoi=MAU/f>+R6fJ[pPYNYBMacYKN.6`Wl8kV>c7WFp';CfaTAYKlaE8\U=X.S=RDFO"_,Mk -TY`"ZFWa[QV=:* -WV$UX8uGXgeZ/;"c"a^mY1K`J$Or!6A?smgFF-_#00?VemF07,b2[T9b:]$KL$IiJS6fh%qlTGp09aOt -nJPX,(PKe9Z1lr&2F3M=@IV[#!!3<+J\U-iGXNkn$\h#Wd.i8`,nl/)@aTG=Ai1Nf7q9sB"GT>iP"B34 -GZ5;U"bQi2+:3/,?SS!Ck0kcteoNd@:M5meh$/9oTMXk%>"&W18"rprPkn*@SPc%Xl@95L::3us6)tOm -rJ&!kQIY;eCIN-iB=1rVfH\rP$_kY?Yl[>D:eqGIuTSO8IJj!?Rr] -YF&Jl*ta@K@e#i@G!@.4a^jQ/4<;`;!!!%T0IS1V$ODC%T[:bR2AZjZ`$00qVuco8N5ZuX`hm)]&.J:gobioXkN5gY>t%6M7k[@J#HbZ1.aA6:F3eNX7U4%>*"H[iA"I4 -Fr(`qJ,g\[n,O;H"bXXb&@b[t'+]XZi_\iL67E_/7UiX4`'u$PNlY^..--C_-'UtI;L'O:>q:WIJ.jr= -dTne_`+N#:`:eUDTMT<$3[GQ$8#0$s<4ZX!SPQ1`C/mJccW*D(s -%YqtH0drPi.i+&_,;H.PE]Y>'!$jFZl=?2FdrO;<\dO%5+&CJ'dHpC3<:N6@]XRN(+NrMT)=[Lnl3o)ihpJnd,_^7jO8>V"0@9W`La;bGFe: -N65ciRa%`$30`\U$&69/oBH`&LHqS1W3hFF.ZI,tdqNphNC'O=WlErh8sNSd>clVX0ku@o^KmX;m*U_C -WkVuJ>H:g5?,kcBKA#Tig9a%f&=c37dE#$grIi&HYkX/P.i4/aj0A3&jQc2Ub1uR^=9.C^#(]&_E*,@+ -rsOQIU!T0S*[MDU6mC#<9K!%_NCG/?=SuJk,EYQ.13eb$8ICJBj`:/RY$3NGc".Q%1obOWS'P[[l/_hn -3g7r;0X(^-PtIInC"3!55$:g[<,0s0`FcM^Y#fDhqZV_nA$T6RepBi_eSDTtBb\15-B1=&:bL6JXQE`3 -]A@%>lfJEMIDSN-EU5js$\+USn^spt%jR.W:FhVZHiO0KJUej3BKRIP$AHA@YimV:+VKDq+jju!&i0TI -^u8/C]I#icOiSbFB\Y@3,aHP!Z,o+C>r%/WVK+\ug2ddh:8G5;4Q:]SU!Y(u#cJS\!2S'-<6BVMUJ7`; -.[;Kc@]rt9="?/^h0KfBZ.LV8q`U+iB!g;EG3`/FR0U1K/b_oO9':B2gi&O;mK3E?^L8fU>-.j%7E*5# -Yo0qR6U/[]B3?3d?3("V5emq5*"i\cKgOa[fQ9;#&Ve+e&K%<90c>s?ipjPNIQ7^r87Jkb1eKhWPsus\ -flRW23<2`bF"*pAD)n'1k7btep45H%:T0Kr/ImasL!jZLg-%Wf:o@9-PrcJU1!&-r2'@q#A+D'"P#!N'o&o,ZIu@'Rr'q@ -Ej&cMP\]*HeRZ/Hm^NU@@g-JR?a!Jb7M?;j\mhnNqo/iNO+73Q:ac/V%0hC#+HUhY2B;aJ`*uPN0]W6L -MoDG'\C>[X+-&l:dMX'RSG3YRH2pJ4eL$`;lV,:MaO7.TsT,W-BV*$ -e1&ob<([rXXB'+:]&e)Y=0G!M0ZtFWb>kmbD)Q/5L956W>4*0,D13]=\QrsY)msk[!4^SIGMAtraa1h\ -0c3Pq)BF=Bh_H!QNZRYT`BXD6p`'nP!/&*qE-N'D%1%X(iNVNV8g=n$_r=Olg\roKMa,"pO9CG4,Eg1p -nu4IO;_=9XVDAOK^2#Kn9d]J2bjoa;S^6K+$69J36)2gOPaEaDRms;R.J5.^2PF0Ne`o#lc#SdWO2ie0 -.ijer@ZWrep'AQp/p)o?$f2]M/pq-h3OYBVTn9,E*!iSX\9 -"9&T1JO&.tQi%m>$\:ZQd.gQq-PD5(it.TRC+TmSa.ok0r+8M8K?<.]@E8LM/="Cj')@d'Bec(#k0oa: -mVb7Z:T'EQ'aBL[UJU1H>"('/9r-8&OGEcY)c?.iZD7<('u8A5$6J&9=&(u(nlo7Obej,a6CrW`RX!$Lc59I^JWKYcSC\,8E) -'8XV8Z$9eG,929Pj73JO2A[6d8E3S#9QEEMNIcj-$%0a$17HH7o/Y%KFZ>rXa:<5pBl*.TB"Brp063M&tne%,DMJO?,.BJb#],)o0k;X)]2Kf5]%WE!\uHC\ZE"05"o -[JIjo[:-@Cm*Rm0VTW_\>:n?:lo./^Z'5=Uc&`#NQ%YI(o2=*)N[MLnL6#\5:2%MUbWfm5$]RrbpG4! -]Sm7Z!)BGU\a9HJ6D%+'1g1nZb5H4q:P%)s((0_lcYBiA/JdYX -^>!V;goe+)N'_MA^#(KPli$6kHCE'S;OeHHo/FHV0c7F=^-.+giiq(jSh^9GJO&.T=8X*O$&(ZQOJm7" -#7lI*@Sk-6;A0h"^nO[3A9'1CLW1RCkp0"m-BuO1np'X*4"ZgkAatV!C.BkCb3"o@7*9-A!tIR13\:u( -8Yf8Jo\*;+R89e]C6].65!)]DeSA1=jaO[IY?7kA4#N>OA?`p%G0W*Z9M8`roR+uj/?'!*X;//f$)KYjF%aD;r"r-Zc9Rk'oLd7OIag%2sXbTMd4\Wbj)T9W1mi2+jEC?NQ-d -J.W^eHGLhI' -BoCK;\-eco$\lRY0fZ7@1E2@pj>&R)%MITEbMQ\0O8p1&"G+Bt&9q.m)$u&7iQrtM:+6^36t-aq]P9/? -O%3^maV91o+cX7P&NNOJ;#c\OjO4ttc=&Pt9kP,beCo1.T$HNJ=J,_P7A@aLFD4GnR8'SXl4k5&:8q6o -P,(7S#Jfh7Z./ee,I#")=A;f7p`NTU%`^IDe?b$;+LID'(Yf9i]W)2Q;l -EU]Dk[[V*@Ab-H2T2DP/H7^>-8uC".i!93)Ti.de.5d!rC9:aBcD:-eh0R+NZIj!e -3#n5U$+7i+pBuu'kB+;kY4mk!lM#\:>4'Ze23Q@=_Vm3D4AHh1LrI\TPrape)jJ?RV03+E!":l=5p,T@ -6m`EHK#;#Yp`qU0$&CsC0mL';.iXF;,>m+sIPVY#6DMpV3!*)1Q-!D(a],i_1R_$Mds8moFZZ0jB@H\\ -#),F=;/"I*74+9mU!+t$#Xk7O;NXs/eN1ZMZWF81CR+bPL:q'#=R=EbKi27WZJ02]q`Vg>;39Td2g]], -ja4/Km81C<,+gTXe#A^^7OJq/`aa#@r.[]fPFpdpQYXeF$on;QTTD,a+qG$56Qn/9>S[8OM8^[Cke'5< -%unRROf7Vu59c.[,ViLBRStG\J0InE1pR'1PKbFqBggrr.u?c*F*Z:;ImT[PjHJiP-6C,[Hd^B_d]n(/@K=WU=3kbgF]l"IDW*b\]\WM9>(Q"7D7Q]\"!?f!Ihi%VDAU]^B]Y4 -@ka.YhE)[7aQ4OdH)2hf"rr.9:e2Q)&-.DNiGaTp4s9l[6D?2:ZsGI)NCMrjf^sVY+d#=VP$'W5;(7c& -jc\;=^0raQbeOeR/D^UkK21T.g!'G@5bCkdPWCZ/O[Z(nku?AJ5*o-E<2pZo[8qD_J(#oJMPYd*@'<[K -Q9-s]d:K],&m=Y8hCa8`hP90`-O?aNlWJd.4g2ls-1WU&srNR=oar6VGc*Kg2Ad7c0'/i -m.u2sT[9WZ8hCsB8>O\5FNSG]T2;K9Wc^q9>,aN`b9^&3-$E?tYLoo,9+@3-B!g8DE]D(D(#-M*YdhCh*bcDX\\,jpXER/e[8\lA[" -:Q&.#[0ia2X]MT)CK7t-G.h7e=DV#"-'legZs%V[6.LVtAk.%F0c(5p0W0rWlJ4!'I(+TMfgP"R$N -JVP?S9WhAHQcl6]fpoon17HK8o;T+fF$6)?W&+i$rej+<;(2(:9eqi+It/X5HA+t\9;beU2/:rV\QZ/g -/+tIcP/Ck'5igLrN)J1L\(iSp/"P,SG.ZTa2lkd*%;V/"/GL_R'$#^BiNYA$?66p^WRPoigm1kVQ-&-\ -"-HO4g -Q,`&+NR=gC)$J*C7)**u(`X;%$&-9*nJIcqg@65[?#FipQ:EBcb@L25!&3I7!eN\qY_YCk%1Ip-?uPN: -rZ)K)^Z*X3>\5&tNQ7el#jd:1,*L%nni9C4<>CG8V:(3*b%!8o9r;n9\,pk:SkGuf\U=g?5G1k%oSQ?m -QV=:*WV$UX8uGXgeZ/;"c"a^mY1K`J$Oq--A;Nb;Z\qPPf/L-AXg\[db2%0L`F;_9`S1'-^0PZe$iUM3 -KYZPboNNmWa\g&[Z2"fg9.,tHjg+]<"9&H+JjEekGXNkn$\h#Wd.i8`$il/R@aR^`(ifV97jE$,"F`c\ -P"9,h3AdTl&sZ&Mdb0;JAM9IqAs7MIk%d&K:FB'(bcCgENmMX^u=8AcLlN70!cke0eu!<7nkiD97XRRJ9_7qIh)FKSt&QqZX@=cD3O31EZUPI^>NJImB_.$Rmd -(6K`78a/'h>r%mHWDr/J>.%\A=fk`jQ.kn[_-sTNm$:j5T$_8[==Nn<,kcjT\6SH'=Ss(kGe7662r!Ee -5q.WEj>%\Imh(>o?h$,!]jhk`*p"9-piGA_'p3]\]i9bO,0+JAC*IGYBYTkBMU5/f*Z"/r[\L1FQ4U)J,fSeQkU/<"b]2#:hXAd)[hEh@M&kC>>,8g;%WjS!p9TMT<#\b'?d5bcZ)oX\TlSPQ1`C/mJcc -W*D(s%YqtH0drPi.i+&_,;H.P>QGn,ai.1Ce_Ckc0SOF(QY'd&'6i]!?k -0'RhBG/M;W@JXBm\%NlU"\Z74n4bEfM9?k<#H%L*+WJ0<3p4=1pRLI.^HfSi!?'oGH>EL;t' -3_dRNJN'\m&MSu7:8;mI*!05*pdCB[C7jO8=A+A5.r_NT[ -9;KuBI$.t`RS9SWBtW_>.@j4FF4o@VLI@WXj]$OX.QKeke#E!INCp*JWn""fa^g,^>`;aYp'U2A^C[O# -/G;/"MUuOM>%Lb!P\*u@\]Nb&lclm4C;+#X\-r9Cq/F)WYW."N^6r-)j!cejrBh_rTB%M)a92DF"+btF -d!.Yc'ao`4@?C833Z/3\6m>Jn"@;#E0(2`,8,Vt+]0Y0 -2Bs)p`T(pYZm%XVO@A69Bfr+g.[A1'ZKZbR@ks(`B!-h>-:$4Cf>Q,dQU0-`(HTc,kB!g;EG3`/FgMs^XY."3ZT(+mtc),Msm=oBkQq4EJ.hn$V -*/3?]poJSd++D!p,aeq0=oeR&5i;'51`?PuK>CtM\3)Yi&W&oL0aN_A-Q.e-+`Wq:1nIPn -PtL/$flXqM'q%Sm_iP#PD`4+\k>U'Xrc'T_:aaaR%&/d^UJY`i8p)bY9rM%VWXl4>@,FphHU -,'PP@#\'k*_.n!Df%rrI\c9-_kY/fmG']Z>)3N#"<[N/(jt'-+.k*<6(( -i,Cpa)@m+,_'*d=CcWXAK0s&:#cnLL(kG$uOgrVI/Kg.rUiK$XRSP>rb,'."FF"N%!tIR0.AY7)31J3j -e&fi-G67[[+qdM -4&r;uRndT0\\.WY5+YR6<#R%aN=2Gu+]OnA -(7Rdke7mGoKi4aIXAe%qq6\:i>H_'Q'mP^EbuV2PD)Q`@._/!PdOXlmA_,IWUWVgUfn=ZU+hliPn;DBp -3=#7&$oQS7W3GNCRF)\Fbe# -+cFJh19"Na>:u8d-8R*@dVBhU:*\\*a9$QKSkl:A$69&'6DIC+oQ\&!P>7+dBWt[";P-sb<\!dB[;rTZ -Xk0X2\/b@C7"<;E&ISc.$#P1H/,(P/cJs#YgZ;K5[IWX4]O1-;#i+Q<2N-O,(jMo)&Ls"'UfcDA->ea4 -jWFO.r!j#9!(#QTLb(.n",+MLE>SO:',$3lifTU]?6'rE7q/b0N&Dt#JOef7R8g=l/XK,m',d%[Bc*%' -hr%qa!d-VrcY+!g'`*YPU`i5_dW'PS5c@WMoT>u)'"r<.@&(bk3r?N!WN9)%R:S=6lm!MKu9T] -#])sP&rOXPnMn`r2&M=nUTt0dME`>IaX$Fk9SrcOKY\c#.:g/$.[3M4F#g&QF#oZ4Vt4(#hLS%f;(2'O -9bs'@Qb]Tn$0=dW<2W\C'$@mg[p6)fX7co1MT985eZ0I$9rcf][bIqY$]WJ]F*\VL4c$orl)+E1FN*Yem66=I+.F@IDeLW*_"BV\)s)ZWBr\lUDD`bEhXKO1KNWRP[JHF7@c ->HCmVA]PWm@Fo1[U!]Mlb2$BHbEd)0\JTAdmBp%,nuk=-P_QZ@r^0!L.nd8%gmqV+Y_PR3[52m_r@pLZr/OqN5m.TkhLVK+Haa@Yug]$rsjP%+L6i'%TtKI -bp8KU1tl"dS^-BHao'G*32+UUPR21>Kghh:.5MiL!i&Ym;+)qiUL$7=t(8I7UqR:Zi32iO\"PR#rJ5N.?hk!;Q1)1>qqa@k*&rThJkQH:?Rhoo_sD-Thss; -=u@@`8Yo60PgBQ%3ua5[Wg+L1:9R[!c$m32Y.s5k$A9&5s+B"jef/b?iF8b1/lqkO`pJ&a?LI?O -2*+r(VTa"$]J^iDM8`roR+ujL+d'l@0G7#ip@SCf%R:RR,Rt1fK>O;.a@nK.%Z&%IE;6M,/JO,_UG9j. -H8cq+`S]SYr/q!hP=csq,t -Y?7mWX*)SPHGPnmi -!))H1$'a"T2jqs'e#C:RI6F6!-r]s_#)PjF;J+@i"n0f7h$O205 -LEHjr/eneM_kJj;S3eY;MT-k1W3gS$*KA+81'nqL9-TQk,k@p.Z;E6>`unarSC2*VK$@nKGU2>N4.jkJ -1b'LYMajJi.5\&117M%:e1*=*SPlLhX4AEBg$Bne0X&Z4FpWSCb@Is3m5A`Z\c4k&5NMPHA^]1RZsE+/ -Mr![qH,&5j(FU#9FZ6I"nJ.R#1E2@pj>&_HSl7/*bKQUZ#S[aS!.Vi#_iP!J(CGmaiR&KY:*C=.7:QpS -e64jMNlL,-)$Gsa-':cpP'L$(=U'LMhsb?+>f6_dLj;]%%q%o&ld.Ff?% -/u;RKP,(7S=,fkn3&mM8u3;@uEn?1-=57H4&f^0foA3J>-FKtcO8(lU@# -)2lOEZ4u&`$RGt\>qRf9r!EZ3K#+,LLeK97%#2ZnnHb(G-PVHWU@F&`C,[,ma.r23$kr^fP0'M]0JMPg -.[E]gZO)$%>r7qnAoh\1icd>QcDT.5r-8u@+\o_M!Bs%K6=WjR_,B!5C@f.6O+%=6!$ -Z.Z4b80"5Q-ApO<M5NCZ./>cDtQ:kf;q1Qb!1R_$Mds8moFZZ0j -B@H\\#),F;alN"0`?m62MGks$R:SRY:9%6-eN1BEZ!4=uUsZ[M5/1@(fkct#m@)L;[9IL0BiVn!F15F, -Or?0/ECZa1DqFmk#6fas@;skH7OE2%O&@U_qlN1XEld>tfaPLn!!XFYTTD,a+qG$56N@YlF=n40LVMi2 -(q_a]&rjo+Z'bH05ou-0,][T5U.Zr!b,)DcI'-s3L;dc2BtW.i2#pE"Ze<;!K0Gl'BXDM;,*PWqdj_Zh -I6s],WRWK+C;")_>-6C,[Hd\lLLQ$-AeR6hRaX$O;Ctq-?,GK>[md,P>2O9.-SNCG$u@E8L5+HOTSOuY@V -;'hIKj\jcB^/m%U9V_*FSDI[6RSN$Eg!'G@5b1-T&,I:^I41gTW3j-Y2PEgD;sI>N[0j0)X]=\0RcT"3 -@BS8KOkS'KG6X(B>jdq_[GLG!]jC/og\(RIDme[Ip58fN^;qD>]+HQ>_8nfrI -!%2j0jO/NCT[.7m)D)kg8>O\5FNSG]T2;K9Wc^q9>-D&0euNr9mFS)H*#$30XT*,g8tOXfBcNW-%aBOZe912]2`1L>ch5u,r%\oiLVoi?W.[nl'T9r*0j*4?3>R*p+7Z<= -L.r%`kV#Vu&.[;om19&L_eZ.GG -]3_\n/2f"!P07IDg+>4`?*`4&\(iSp/"P,!=M*-tpSp+AOab!]l*q-BpBc>C9PO,-4u3Y._W3GV3V;bj -PfqD2&,5i#"U'Cm@/s`W!Yl,t_dX2PPWC6*MT"N%R)Ekq*KHColef)en^B]DAm.O'eK%4_H ->O?VO>eVdFY?@OMQpp$/HG3bTfGI>oj`&(@Um1[scCIYLA+CKWQ;8rpb@U8V#Q+o6"G4I_n;'af(CZ&9 -U%#i#8gb=05et:!"Ca5+NQ7g"#ipk-,EU"mnnCd`="'A,T[MJ'[V%(Y9;_;pbgpt^It/X4C%Ma^3h/to -[#.!rND-.s,4bLCDA,dF`b8A/rFUgiXk0US$LNS_>cUe;EuH$!-OI3!/b]X4b3*lXh6-L1c0G%N^>H-h -$k%ctJ(j,7fW"@Zbo*Ah=p[7cVnL -"EHpDJ&u5a=[[^-.$dH#19#p:'.&?+k0mJOdWIL>c=`@:oI=>qR8!YqH:8lZ/>U^nFS^\\V,OBoC=RXL -B!kjG=)6@`"bt!+Z<;"pHUXg^CR3Fddo]khj[?[Vk]IiP(0Ppoh!^U,p'0b;Q!l@K$goASMo4Rp;#*jJ -)3;pNkS)ai!WE(K^n?cK/0YT3K0pe9fGFZ7&qWOp;(.B(1E)7n,I-J1JjU`EaX"0+4JGb(Q-1JZl$U?X -17?B6ZY@'YEta-+LEHoird@&*d&=;i4VElHUsgc7l;^0?;5_bc[48jfZW"!W/![.%JrKr:f^&6GoqK?< -ZeDOibC-*BDRJ:QGADohisUWL06cW/!rIP$c/d?QhA6i_NT'E;\F(RLOiPR!F)89g!<7U8i/h%t*YA^4 -6K+$YF?Ui[M+$<1#ddnm(4h$l+:.%S4!0SUA%1LA7Cn+k\QnQh#Yj%;H&>o] -=4h*Tr<0oDDfMj**ta@@`c77>`E+-_aCOjE>`N/?!!!%T+:%f_#6KKD+V8=&rYGot_I@KjUe3-SMoML= -aNSfd*g"GgEVV/C9bN4IjH=e)ZdX` -X]ho1PuML`]$5Q9;m+b(G"O>Ib>kfN/Tf\EZJTW2go6M'Xh&@,]Zi*RMrj7$JA:$Gf=5Xh%>2IT0j)Xp -3uo_ -:El,tiR,b`L,1WLc6a4(]UDnbPfVu`.ASFF5aKZ.PF/1%@jI&_Vc"EBq]9+h<+N_]Ygq7N!8qbKu@?'=F=F&)3;g?E*1nm6S";B^]tt^1^XNk -K#/Z"W&-7C#(OPk&La/I.hIWY,;H.PE]Y>'^Z'8?"H#2cN(N&-R#G3)/!NGu;].F;7i.N4Ab1ad!cKra -:M5mubl3;QTZei!3HV]n2Q'ItPe)PqF[_DBkL?LgDQR-C<9mJoI?MccZe?q7>?kJR$\qt=pFCC7j)qog -Xte\Eo(.+@hf'Cu%MK)%Kj/NkS/*mgNPje^3=MKD/!A(e+95ik!X/^X_-mn"<#QV\L;Mos(kbX+'o>AR -Oa+M;2uo"0j:W4/!%-30I/9+%UeIbp -H.>Ag<2WXVPtE?;X\t>0C%[>EEl1JSfBeeR_dRNJN'\lkMLZo@Ls00U*0/(7nd,_^7jO,7,dLQ8 -L/fR[b2q'u"K"%-O3K$C#t.s<,b!$A&ZN.SI/fp2-ko91re3+odq1?b<0!/)W(3jf8pqb]3hk%Q<4[3A -X&?+RXS.QHWlIYj6gaCoKMLWN\D=<3H`c<%HG86SpWNg<"+.L_nCUDU.g:mMj)K>1N^G1Tb2fk]8,rVu -3IsI=E*,LL'aBCZ@Bd7`+o`2U7:OYhXA1VlN^mU,q#lF@)iI8I;HW"S4XuZ8A+I^:\kO345N]:4%,P>H -Q@L=rg'"9u0qV5)Z:Z,]O$T&ZB2`P=Nb_Fie7b%'fc8M>S;j3q.]!aROG:?:s@]`*7=SBiUHaqTG?8rccG -e;=\nEAFH=-l"e%d[s:986q_C:2eJ[cp49iuX%GU6eNdg@KI#hCjsN%JKsN_-aFV -9Kisd(rBPJ3,Ea_+-O_,1)Xnu;?6`J5i?$Ya8ueVK>M&Y\9'2D%>_p];-9W#-Q.h3UCk$.G!Q[jJ0^:\ -/.tf/PtL/$flXr,-CIOM;^jQ;D)Rd'-PMREp2`'U:T-'A,m%3sQ-Q85a[Irk8tjS12!UV1Kh\XJC=BcM -HB1k)fVl+0Kh=ikV:@/?qTZb5EOf?A[MSjj3I/8Dj>Y93L/WQ;?Z;A02@g=KJR>([>XgpuOi6>O),->t -0`W2D!73,>%LWPp_P#8s9K![sLr:KVpoI(>'T9u):\a,T59Q%XA9(6mRSP>rb,'.#CqW]lR`/4/fkhM:D4]R" -\(.9rH:8J8GeDn:GK]CMs+%oCY]lS=)FnhXiiX-B:,`uLaM>%rRSH4'O+731_jD,N#6fcHiD=2u-6!>J -6t-`fHr_O&J&Ytq8A'+++,`Z7dMX:+O:V7u88]3(uZ\BRpP;8?RY -=?IoH%>Vl2EEKkc$N3o1h==X:`N&*cahRlV@E]&as+A,&&9qG8'+TU]i3=\h;BZ6t7A=dh>ZN^'NlWG# -)#T7a,a6=2120^^="]=s,8/\"Z>2+_9d]J2KZ6M%QbpNP.NK"/7\eB\1oah:Rnfm2.Q&]H;QEj!egiVX -h/^,6YLkBa.igs5AtmMI(9-,mF)I#amIn_nHK,UL>pg@kD=[:I\Qs&2qsFOmL;Dk'\a -;_+0Wjrb30'FkEQK0eH-QrG[U%>R=1&K$a-.2@b0it7[.DDD3Q8)t9G(`78nP"DITGuUYD.$mQfo%A]A -AMok"k*(Y/k'8k;:M3WE4H=gkTMaloRM@<79;b^''ZuZOIoE;plID?BDQd?J=0%Kf,s'(,J]M@6b>k^u -D71n)[do81]VG`oF?"$q:Sj+hc_ff;J]1!!\!?+E1FN*Yem35N0uaA0rB0KZ%;==N"GF'TGU, -dJ1q;2'S2SACo%iNp)-=rm[@;e`UrKgqn;W`HV%Ceb]N)`FH2VCt -^0NF\bbh]a][CdXSBiR(l.#i^6(:1h<,):PLJ"Ak.2;&Q5+>BJe>fnp]dd/eX&UP>>2+)qiUL$7=t(8I7UqR:oPQA_OT6Yi=Y,G-.@!NeP1ark@540Dk*&rThJkQH:?Rhoo_sD- -Thss;=u@@`/<`umngOEZ5uFR[l1J5F>,_RfW*Z9M8`roQn.h^gNpM=np+K+9$I><%R:RR,Rt1fK>O;.a@nK.%Z&%IE:\P0;9/ssgoEs\YbCH.g.j'W2[qL'`ad&;%Y/K0[@Usc5ab&'23:oMmD -F\8c>Y?7mWX*)SPHC$k#cm'3>/EY2UgU%LI>RU3.t0U'oYTA;/#$&3ua5OA.gls!Y6Z.aJ?,@ -AJl$2^3i,lZ=0,G<&@-?L.p+#^S#:,GPm5D"NZJ09+gb(N9S^QhI -]>uPo9"fu$ID=G(([MRI%7S0C0QX1'o+?krA1LdKN^"2AbN5B!O8p1&"G+Bt&9q.m)$u&7iR&Kq.K:+_ -7H4u9XDU$=O%87D)&/*&-'Lp^&t)_%=Y5t5jqAVsc=o/*:$31XeF#O=T15QZq@lPW';EnimC<0C,6ig8#()!m"._OP/q2) -8OT"G/;QWC'+'W;,;bk6VXoYgl?>@^c_pCB%17kYU=#q3MG5Re9W$:N5jn_pfn83c[--=)O=91-04M3(,>e7o3me;B7'2Q/Ffme0Y[&kYCTZLqAA-kR\*O"q"+nAJ -0XmOZ@hW(c=)iKODF5;)OAfe;=f,L*3<0)Q:\ZaZ#6KQFi37H*4qeN\7,RLTN*7qIN5agSf]7K?+cf0i -&ihe7;'_Duj`6c"^0NIV7)0I=[+ZrhSPJ@3g%>8p5b$#3<([#I%7m&b`$-nfgc@S>Mb%>3poKWS.$VlNEli./?SIkkVK5>1 -g2As65j*400Gng1T?q6c.P29o6_r,/V,aTslW%]]B"M9N=DSa6rGmBuYutp%]1'0YDRNd9Ya\A8[h$"(DUrKDk3jd^ -bicJu-5JI$ONHV:W-k%<0ZQiJ3>a@q-&]o2+7LZu$ipQa66S$b1bp![Kg;?I#YZurs,+Z<&4i$`%hO^e -ic4bcDBBaZ87L!QN1s)lMbGHR.@eh%2Ohu>1TB1#,ohI:LEHp5%Y[p>\/VUR'f.WnXa/+tJ&P/1FTf^.1Y?'a/Y[bNJ/.nh;S#ch6E=.>bHpJ&?YXu+i*'+9Q4cf^M&>[CWoQcF+Z -l'=)'1!7Z^!!iE3#m:5oi351'$53l$66X_n<'hlGKuB_U(sEaS%?ABcOQcT@7h:^'UCg'c<\5#Kb9dl? -Pg3u#Rn`&ZRFKe(4eG"?_iP$+LI._4kgZ%Q/s/i(;ed$CPrbmAWmp=aR`00J?*.2/Q2;;Na^D9u/@IVt -WnD*q>4)%,RIjR^#`g0Z+l8u*;_7)CmBP@Uoe#Q+o5!.r#EOD$a+ -'a4S(iUFo^672hh`8RtWbZZ5$Ldp=mpfrP()Nr-O&LeEk8LKBcU/F!nb%EQ"c)1)hbj'C7SB7N;0JMPg -6D@h%k]kXlYXB2HFqX&mT@^=X%e/L9.cYKuCXnKql]&Rn>h-a60[6!u$ -ZX5/JqCW!L-_J_(pkb6T&VZLbnT+GC7i@3)7IehD!!3<'JjEekGRsoe$\guVOSE'A*tjAs?u\0=)CZ8W -_..Iee92EJJ&gU_3)gMb-^ID:deSR9AM]cLB$n[njsUERJ1$QFm/D])U/38f3^"7@9;PR$2#:cMSPcCd -lI@B'TM#qL^r)cmY,./L$6JUJiTug0Hb7:oVq/[48R^Y?J$Z.hu/r& -((gk(_VpTDF>=XBKg?nZBV\ZP#E$MFn[S4?5p;@]jH39.5\:jR?ihr^e`0b2j9#,]7B=R7q5@a:u,b5bQJ:<(\_\O%?(pWH?:"3hK6I -e>dX`X]C3XXOaB$MVWTn@'J:bF/ftD]0)>(D-"hS]%:l/gb*e$XiBgO]Nq^"bME$fJA0r[pae#JIqPEW -0mLo[4!0R*^[&E]Xe.,2J3Vsg3$]7K#D>EP:q1$o*=mrk^_&Q%<[RtO%R:VnghJhkO%:Z%6AeR1Pen$b.:$5HCjPkSLT?h0b3Y`E_8"rm0e='r$SP#hZA8s$);Bo8EgXl^%V,J^0gA3*$tasK;[6Of$%_b*KS9PE`kN%="Tc^^]4oo -*"iDSK7Se##YZic%#;`p0\Dm^.2%NX,4VV=E\e_qa.tHs*.CO)P=[%jWD'Tp/sXWAZO*/ECGD='-PL4< -nom9g:a`M-48oTjU/EEsWa.BL:8cSk2(G.pX&c:P.lF?_Ek>Y]fISp2*KnTXZdWU;C*a5A5IXI+pFD6O -iHDcfm^J,1lMGkAh_5l5%/u)uK3BuhXBm\%NlU393@pb#.u_Bni",SW(ifV.6(kH,<$iIgLI0thfS!!G -'o9igObgAV3?+#KU_28gIRPQG8`Xo[1oaD'QV1p'acsMP0q(i!e![<*E=ROa^_@\%$@bL>;<\d`_dRNJN'\m&MSu7:8A&[n*/mC_EVSmP7j=,; -AF`;[RStc&bGA,DCrTg;Ra!2N(]1N^G1Tb2fk[ -QimM&9fR-.9'oU(AES12D7jXAAATHIO_u]l>J\`J5BKRIP$AHA@YipI$ -,8,jP,-bgo@P\p^a!7kQr.79[Oi\lSBfr+g.[A1'ZKZbR@ksIs-F7F!ic@/OcR6'`r;qUs?j,r!dIR,-> -8E>q:1nIPnPtL/$flXr:0pt_tP?G9LEB0RbkEFTkrddA/;!=-I2'.lOV,HQBg3#TQ;5mO[Q!1S%Z!"20 -k!0:HI_fHt=R4=L'dCs<[*@u\a`Y$LA@V[`QO;R&UNi6`Y?'o6)@m+,_P(qiCcWXLKL"I8(p#VC"H,_/&]jlL7RmfM8YpIL>cM!^O@S;/ -3K2Z80:U7a&P8cn>rA$?W,rk]jpaJEd]%?2D*":cW5e#jW]`sm@]:B#&#J/&pn67_1rHl1JYEs&X)\7b:?EMj29NN#o\RVph%"tr=K7EqE5R73&%0qPPTPuka -2A$=J6_[F;UfK&RLd<6T\E%fr++hLC&iffH8LK`iUsbZAVH4Uj8EK@:N-8h=S'3$rg#VjT5G1hd<&mA/ -.4^A)TsU8![ZqT*aD$nUr??#WX2:lZ\_O3q%&;A=o;`mX^D`s"A/.Z.>0gBT`9NY5N7-T]\AYP9Mq*]q -::3hMe[XG$Z$Eua/m%kVd`IHTh=5\.AXaEq^-Ee0-l`j-!WYP10PDFQ'aof8+n4,P7Lp/i`Zm4:gi>It -O2rS%.3+LD-ABCR&a;up>7QljVD>+jVF*4t9Vp,Cbe@uuSkPg,$"WIZ/V[(N'P[4i?R21:,4TC/2CTB< -<9\AUXN%e>X\@jm$?Um)5I&lmp59B+ECR.c/!UKBC>hIaeY4s8hdB!NjJl;]d07HW(@r8odpT1i]..LamT5c3!W<2u3!LI\1=BU!gkC84q4dOT@kI?)EWZ;[_; -pmnG$D7&rFT$d'tVn.iXI:,LLapJe]Mg7jKi-4GjFnN(YDdq/!VI*LOqqdj`MX1BO#i,gogi -#$!^V:Lt3^9e(ugREm1daIPei<3"KKonq"/[p6)fWqACUih]#=fr+LI%1:-jS(]IDHX4A)8W2>2nuGdQ -K1<3&l-RTO2YV%%?80g>rPJMQ`SIW(4FS(k43#gN2lH]X"Tj1i@*gkQ)ANX4_>k.gF?UKQL.,S!#`N@O -(kb?;Oa*BW3=1d=A22agISCQB9'+FQ7']66QHSF>H,Sif4.]5\e+s4PHSq)9,]H=;C6]a/;5TO:.3/Pf:,eBs)Ga#D";@ipB>r@ -iGR:q23up8^LJnj/;+'(!eJ01YODZ='*a-,T[;nE1(b%L`+!\qXBICuNQ39Kkkp$",*BtmZ=uFU+om]s -UJf_q^/5l;b9IQiUh4T\L.eDj3E.n"3f2.\Es_IGNBr;GtWh -O_QIo_e,@iXL:`<[\[K!guA%^AZk?FLg"_?X*g5p:V'/4fIM[=#9C_+Z+0.L6R.c9jWXEBFqOfTJO&.$ -#W*S/!e\AJd$SnR(]]?0iR&L=3 -g>c8D?LO68p&>&D_-lc">W*M`1VDFUGDT%8",XNhZ.So$,3o5Y^n9Nj//e`tKYjF%a=If5%>_jZnG$6d -0*Htti_\hQE]sJ_`hO/<,_Af&++@j@JgAM^kJqD/GL:hT?ueDbg?RnVoVC-U!#jPsD.nl&7r%,+HQK1ATGjB-EeiVpkJO!d>&@2"X53@DI_Xep3%Q*a$\lRY0fZ7@1E2@pj>&_HSl7/*bN9oXp_42E"bT,"&=?EL)%D?giXm#l -:+6p97H4uIe8@8eO%87D)&/*&-'Lp^&t)_%=Y5t5jqAVsc=o/*:$31XeF%TFT24Yb)ANa=7AE`E'Ui#S -R8'SXl4k5&:8q6oP,(7S=,fkn3&mM?h-cKTJ`?1/T!eaE6]^L-II*#9%k -Ku7?h(n=V[)3)[HneiF5:FVRPAb-H@^c_pCB%17kYU=#q3MG5Re9W$:r2:ZIu>QMbU5'Cpr*#pBuu'kB+;kY4mk!lM#\?hlle`%LWMp_Vq`oN(tl>N5jn_q$`9V-\_V4 -ZM@#nrWNCU6"&&a6m`WVL-oCrpk2*_'8f4fdM8S$7p7&Es7Q:kf:?j+J\0:GUI -ds8mo>la~> -grestore -grestore -gsave -376 3343 moveto -0 0 0 setrgbcolor -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<41434D20666F7220554E495820616E642057696E646F7773> -[24 27 32 10 9 22 12 11 27 28 9 26 10 21 21 21 10 37 7 21 21 20 27 0] -xshow -1256 3343 moveto -<3231> -[20 0] -xshow -1962 3343 moveto -<30362F31302F3036> -[21 21 9 21 21 10 21 0] -xshow -grestore grestore -showpage -%%PageTrailer - -%%Page: 22 22 -%%PageBoundingBox: 0 0 595 842 -%%BeginPageSetup -% -%%EndPageSetup -gsave -[0.24 0 0 -0.24 0 842] concat -gsave -376 422 moveto -0 0 0.50196 setrgbcolor -(Helvetica-iso1252) cvn findfont 68 -68 matrix scale makefont setfont -<44726F6E6573> -[46 19 34 34 34 0] -xshow -376 500 moveto -0 0 0 setrgbcolor -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<44726F6E657320617265206175746F6D61746564206F70706F6E656E742061697263726166742E -202054686579206172652063726561746564206279207072657373696E672074686520934C94206B -65792E> -[28 11 21 21 21 19 10 22 11 21 11 21 21 9 21 32 21 10 21 21 10 21 21 21 21 20 22 - 21 10 10 22 8 11 20 11 23 10 12 9 10 11 23 21 20 19 10 21 12 21 10 19 12 21 21 - 10 21 21 10 21 19 10 21 12 21 18 20 7 21 21 11 10 21 21 11 12 17 12 10 18 21 16 0] -xshow -376 581 moveto -<44726F6E657320616767726573736976656E6573732073657474696E6720636F6E74726F6C7320 -686F77206861726420612064726F6E652061697263726166742077696C6C20617474656D70742074 -6F206D616E657576657220746F2061747461636B> -[28 11 21 21 21 19 10 21 21 21 12 21 19 19 8 18 21 21 21 18 19 11 18 22 10 10 8 - 21 21 11 18 21 22 10 11 22 8 19 10 21 20 28 10 21 21 12 21 11 21 10 21 12 21 21 - 21 10 21 8 12 20 12 21 11 10 11 28 8 8 8 11 21 10 10 20 32 22 9 11 10 21 10 32 - 21 20 21 21 18 21 13 10 10 21 11 21 10 10 21 19 0] -xshow -376 638 moveto -<6F7468657220706C616E65732E20> -[21 10 21 22 12 10 22 7 21 21 22 20 8 0] -xshow -376 720 moveto -<412073657474696E67206F66207A65726F206D65616E73207468652064726F6E652077696C6C20 -6C656176652074686520737469636B20616E642072756464657220756E746F756368656420962069 -742077696C6C2070726F6261626C7920696D706163742077697468> -[25 11 19 21 10 10 8 21 21 11 21 10 11 18 21 12 21 11 31 21 21 21 18 11 10 21 21 - 11 21 11 21 21 21 11 28 8 7 9 10 8 21 21 18 21 10 10 21 21 11 19 10 8 18 20 10 - 21 21 21 10 13 21 21 20 22 12 10 21 21 10 21 21 19 21 21 21 10 21 10 9 10 11 28 - 7 8 9 10 21 12 21 21 21 21 8 19 10 8 32 21 21 19 10 11 27 8 10 0] -xshow -376 777 moveto -<7468652067726F756E6420696E206A7573742061206D696E757465206F72206C6573732E202041 -2073657474696E67206F6620666976652077696C6C20757375616C6C79206D616B6520666F722061 -6E20696E746572657374696E67206F70706F6E656E742E202041> -[10 21 22 10 21 12 21 21 21 21 10 8 21 11 8 21 19 10 11 20 11 32 8 20 22 9 21 11 - 21 12 11 7 21 20 20 9 10 11 25 10 19 21 10 11 7 22 21 10 21 10 11 10 8 18 21 11 - 28 8 8 8 11 21 18 21 21 9 7 19 11 32 20 18 21 10 9 22 13 10 21 21 10 8 22 9 22 - 11 21 19 11 8 21 21 10 21 21 21 21 21 21 21 11 9 11 10 0] -xshow -376 834 moveto -<6D6178696D756D2073657474696E67206F662074656E2077696C6C2070726F6261626C79206D61 -6B65206576656E20736B696C6C65642070696C6F74732073776561742061206269742E20> -[32 21 19 7 32 20 32 11 18 22 10 10 8 21 21 11 21 10 10 10 21 21 11 28 7 8 9 10 - 21 12 21 21 21 21 8 19 10 32 21 17 21 11 20 18 21 21 10 19 19 9 8 7 22 21 10 22 - 8 7 22 10 19 10 18 27 21 22 10 10 21 11 21 8 12 9 0] -xshow -376 3343 moveto -<41434D20666F7220554E495820616E642057696E646F7773> -[24 27 32 10 9 22 12 11 27 28 9 26 10 21 21 21 10 37 7 21 21 20 27 0] -xshow -1255 3343 moveto -<3232> -[20 0] -xshow -1962 3343 moveto -<30362F31302F3036> -[21 21 9 21 21 10 21 0] -xshow -grestore grestore -showpage -%%PageTrailer - -%%Page: 23 23 -%%PageBoundingBox: 0 0 595 842 -%%BeginPageSetup -% -%%EndPageSetup -gsave -[0.24 0 0 -0.24 0 842] concat -gsave -0.50196 0.50196 0.50196 setrgbcolor -687 1355 519 13 rectfill -1193 1007 13 349 rectfill -376 422 moveto -0 0 0.50196 setrgbcolor -(Helvetica-iso1252) cvn findfont 68 -68 matrix scale makefont setfont -<537465616C7468204D6F6465> -[42 15 35 35 13 16 35 17 52 34 34 0] -xshow -376 500 moveto -0 0 0 setrgbcolor -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<41434D927320737465616C7468206D6F646520616C6C6F777320757365727320746F206D6F6E69 -746F72206F75742D7468652D77696E646F7720766965777320666F7220616E792061697263726166 -742061637469766520696E20616E2065786572636973652E20> -[24 27 33 6 19 11 19 9 21 22 8 9 22 10 32 21 20 21 11 21 8 8 20 28 19 10 21 19 21 - 12 19 10 10 21 11 31 21 21 8 10 21 13 10 21 21 11 12 10 21 21 13 28 7 21 21 20 - 27 11 19 8 20 27 19 11 9 21 13 10 21 20 19 11 21 8 12 19 12 22 10 11 10 21 20 10 - 8 17 22 10 8 22 10 21 21 10 20 18 21 12 20 7 20 22 9 0] -xshow -526 647 moveto -(Courier-Bold-iso1252) cvn findfont 33 -33 matrix scale makefont setfont -<242061636D2096737465616C7468> -[20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 786 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<496E20737465616C7468206D6F64652C2074686520726164617220646973706C61792069732075 -73656420746F20646973706C6179202044495320656E746974792069649273206F66206169726372 -6166742070617274696369706174696E6720696E20746865> -[10 22 10 19 10 21 21 8 10 21 11 32 20 21 21 10 11 10 21 21 10 12 22 20 22 12 11 - 21 7 19 22 7 21 19 10 8 19 11 21 18 21 21 11 9 22 10 21 8 19 21 8 20 19 10 11 28 - 9 26 10 21 21 11 8 10 19 10 8 22 6 20 10 22 10 10 22 8 11 20 11 23 10 11 10 21 - 21 14 10 8 19 8 21 22 10 7 21 22 10 8 21 11 10 21 0] -xshow -376 843 moveto -<65786572636973652E2020546F2073656C65637420616E6420616972637261667420746F20666F -6C6C6F772C2075736520746865206D6F75736520746F20636C69636B206F6E206F6E65206F662074 -68657365206964656E746966696572732E202054686520656E74697479> -[20 18 21 12 20 8 19 22 9 10 11 19 21 11 18 22 7 22 19 10 10 21 21 21 10 22 8 12 - 19 12 22 10 11 10 10 21 11 9 22 8 8 20 26 11 10 21 19 21 10 10 21 21 11 31 21 21 - 19 21 10 10 21 10 20 8 8 18 19 11 21 21 10 21 21 21 10 22 10 10 10 21 21 19 21 - 11 7 21 22 21 10 8 11 7 22 12 20 10 10 11 23 20 21 11 21 21 10 8 11 0] -xshow -376 900 moveto -<6964206F662074686520616972637261667420796F752061726520666F6C6C6F77696E67207769 -6C6C20626520686967686C69676874656420696E206D6167656E74612E> -[8 22 10 22 9 11 10 21 21 11 21 8 12 19 12 22 10 11 10 18 21 21 11 21 12 21 10 9 - 22 8 8 20 29 7 21 21 11 28 8 8 8 10 21 21 11 21 8 21 21 8 8 21 21 10 21 21 10 8 - 22 10 32 21 20 21 21 10 22 0] -xshow -693 1037 moveto -(Courier-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<44495320456E74697479204944> -[28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -693 1087 moveto -<202035302C312C31> -[28 27 28 27 28 27 28 0] -xshow -693 1137 moveto -<202035302C312C32> -[28 27 28 27 28 27 28 0] -xshow -693 1188 moveto -<2A2035302C362C31> -[28 27 28 27 28 27 28 0] -xshow -376 1518 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<49662074686572652069732061206C61726765206E756D626572206F6620656E74697469657320 -696E20616E2065786572636973652C2075736520746865205041474520555020616E642050414745 -20444F574E206B65797320746F207363726F6C6C> -[11 10 11 10 21 21 12 21 10 8 20 10 21 10 8 22 12 21 21 10 21 21 32 20 22 12 10 - 22 10 10 21 21 11 8 10 8 21 19 11 7 22 10 21 21 11 20 17 22 12 19 8 19 21 10 11 - 20 19 21 11 9 22 21 10 21 25 29 26 10 27 25 11 21 21 20 11 21 24 30 25 11 27 28 - 36 27 10 18 20 19 19 10 10 21 10 19 19 12 21 8 0] -xshow -376 1575 moveto -<7468726F75676820746865206C6973742E> -[10 22 12 21 20 21 21 11 10 21 21 11 8 7 20 10 0] -xshow -376 1713 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 45 -45 matrix scale makefont setfont -<5472616E73666572206F6620436F6E74726F6C> -[22 16 22 26 23 12 24 15 12 25 13 12 30 24 26 13 15 26 0] -xshow -376 1784 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<41434D20737570706F72747320616E206578706572696D656E74616C2044495320322E312E342B -2B20636F6E74726F6C20726571756573742070726F746F636F6C2E204974207065726D6974732069 -7420746F209374616B65206F76657294206169726372616674206F66> -[24 27 32 10 19 21 21 21 21 13 10 19 11 21 21 10 20 19 21 20 14 7 32 21 21 10 21 - 8 11 28 9 26 10 19 8 20 10 20 22 22 11 18 21 21 10 12 22 8 10 12 21 21 21 21 19 - 10 11 20 12 21 10 21 19 21 9 10 10 10 11 10 21 21 12 33 8 9 20 10 8 11 10 10 21 - 11 12 10 21 18 21 11 20 18 21 14 11 11 21 8 12 19 12 22 10 11 10 22 0] -xshow -376 1841 moveto -<73696D696C61726C7920656E61626C6564206170706C69636174696F6E732E2020466F72204143 -4D20746F2074616B65206F76657220616E2061697263726166742C206974206D7573742068617665 -206D6F64656C20696E666F726D6174696F6E20696E20746865> -[20 7 33 7 8 21 13 8 19 10 21 21 22 20 8 21 21 11 20 21 22 8 7 20 21 10 8 21 21 - 20 10 10 10 22 22 12 10 24 27 32 10 10 21 11 10 21 18 21 10 21 18 21 12 11 20 21 - 11 21 8 12 19 12 22 11 10 10 11 8 11 10 32 20 19 10 11 21 20 17 22 10 32 21 20 - 22 8 10 8 22 8 22 12 32 21 11 7 21 21 11 8 21 11 10 21 0] -xshow -376 1898 moveto -<93696E76656E746F7279942066696C652064657363726962696E67207468652063686172616374 -6572697374696373206F66207468617420616972637261667420747970652E202054686F73652061 -6972637261667420656E7469746965732077696C6C206265206D61726B6564> -[13 8 20 18 21 22 9 22 13 20 11 11 10 8 8 21 11 21 21 18 19 13 8 21 8 21 21 11 9 - 22 21 10 19 21 21 12 21 19 10 21 13 8 19 10 8 19 19 10 22 10 10 10 21 22 10 10 - 22 7 13 19 12 22 10 11 10 10 19 21 23 8 11 11 22 21 21 19 21 10 22 7 13 19 12 21 - 11 11 10 21 21 10 9 10 8 21 19 11 28 7 8 9 10 21 21 10 32 21 12 18 21 0] -xshow -376 1955 moveto -<7769746820616E20617374657269736B20282A2920696E20746865206C656674206D617267696E -206F662074686520737465616C74682062726F7773657220646973706C61792E2020446F75626C65 -20636C69636B20616E20616972637261667420656E7469747920696420746F> -[28 8 10 21 11 21 21 10 21 19 9 21 13 8 19 19 10 13 14 13 10 8 22 10 10 21 21 11 - 7 22 11 11 10 32 21 12 21 8 21 10 22 10 10 10 21 21 11 19 9 21 22 8 10 21 11 20 - 12 20 28 18 22 12 10 22 7 19 22 8 20 17 10 10 11 27 21 21 21 7 22 10 19 8 8 19 - 19 11 20 21 11 21 8 12 19 12 22 10 11 10 21 22 10 8 10 19 11 8 21 10 10 0] -xshow -376 2011 moveto -<74616B6520636F6E74726F6C2E> -[10 22 17 22 10 19 21 21 10 12 21 9 0] -xshow -376 3343 moveto -<41434D20666F7220554E495820616E642057696E646F7773> -[24 27 32 10 9 22 12 11 27 28 9 26 10 21 21 21 10 37 7 21 21 20 27 0] -xshow -1255 3343 moveto -<3233> -[20 0] -xshow -1962 3343 moveto -<30362F31302F3036> -[21 21 9 21 21 10 21 0] -xshow -675 996 1 359 rectfill -1193 996 1 359 rectfill -675 995 519 1 rectfill -675 1355 519 1 rectfill -grestore grestore -showpage -%%PageTrailer - -%%Page: 24 24 -%%PageBoundingBox: 0 0 595 842 -%%BeginPageSetup -% -%%EndPageSetup -gsave -[0.24 0 0 -0.24 0 842] concat -gsave -376 422 moveto -0 0 0.50196 setrgbcolor -(Helvetica-iso1252) cvn findfont 68 -68 matrix scale makefont setfont -<546865205472616E7366657220436F6E74726F6C2050726F746F636F6C> -[38 34 34 18 31 20 34 35 32 14 35 21 17 45 33 36 15 20 35 13 17 42 19 34 16 34 31 - 35 0] -xshow -947 597 moveto -0 0 0 setrgbcolor -(Helvetica-Bold-iso1252) cvn findfont 45 -45 matrix scale makefont setfont -<5472616E7366657220436F6E74726F6C205265717565737420504455> -[22 16 23 25 23 13 23 16 12 29 25 26 13 15 26 11 11 30 23 25 25 23 23 13 12 27 29 0] -xshow -grestore -gsave -readpath -R000265B000098E09B200B008098~ -closepath clip newpath -readpath -V02BF0297E051200A0004E851200A0084~ -gsave -0 0 0 setrgbcolor -eofill -grestore -0 0 0 setrgbcolor -1 setlinewidth -stroke -readpath -V01DF0297E00E000A0004E80E000A0084~ -gsave -eofill -grestore -stroke -readpath -V01DF0297A0064A0400A00E4A8400~ -gsave -eofill -grestore -stroke -readpath -V02BD029BA0060A0400A00E0A8400~ -gsave -eofill -grestore -stroke -readpath -V07CD0297A0064A0400A00E4A8400~ -gsave -eofill -grestore -stroke -grestore -gsave -523 703 moveto -0 0 0 setrgbcolor -(Helvetica-Bold-iso1252) cvn findfont 33 -33 matrix scale makefont setfont -<4669656C642053697A65> -[19 8 17 8 20 8 21 8 15 0] -xshow -556 751 moveto -<286269747329> -[10 19 8 10 18 0] -xshow -1087 703 moveto -<5472616E7366657220436F6E74726F6C205265717565737420504455206669656C6473> -[17 11 17 19 18 9 18 12 8 22 19 19 11 11 19 8 9 22 17 19 19 17 17 10 9 20 22 23 - 8 10 9 17 8 19 0] -xshow -grestore -gsave -readpath -R0002FBB00074CE09B200B00874C~ -closepath clip newpath -readpath -V04B302FBE031E00A0004E831E00A0084~ -gsave -0 0 0 setrgbcolor -eofill -grestore -0 0 0 setrgbcolor -1 setlinewidth -stroke -readpath -V01E002FBE00DF00A0004E80DF00A0084~ -gsave -eofill -grestore -stroke -readpath -V02BF02FBE01F400A0004E81F400A0084~ -gsave -eofill -grestore -stroke -1203 814 moveto -1997 814 lineto -stroke -1203 861 moveto -1997 861 lineto -stroke -1203 1048 moveto -1997 1048 lineto -stroke -1203 1094 moveto -1997 1094 lineto -stroke -484 1094 moveto -703 1094 lineto -stroke -703 1094 moveto -1203 1094 lineto -stroke -1203 1141 moveto -1997 1141 lineto -stroke -1203 1188 moveto -1997 1188 lineto -stroke -1203 1235 moveto -1997 1235 lineto -stroke -484 1235 moveto -703 1235 lineto -stroke -703 1235 moveto -1203 1235 lineto -stroke -1203 1282 moveto -1997 1282 lineto -stroke -1203 1375 moveto -1997 1375 lineto -stroke -484 1375 moveto -703 1375 lineto -stroke -703 1375 moveto -1203 1375 lineto -stroke -1203 1422 moveto -1997 1422 lineto -stroke -484 1422 moveto -703 1422 lineto -stroke -703 1422 moveto -1203 1422 lineto -stroke -1203 1469 moveto -1997 1469 lineto -stroke -484 1469 moveto -703 1469 lineto -stroke -703 1469 moveto -1203 1469 lineto -stroke -1203 1516 moveto -1997 1516 lineto -stroke -484 1516 moveto -703 1516 lineto -stroke -703 1516 moveto -1203 1516 lineto -stroke -1203 1563 moveto -1997 1563 lineto -stroke -1203 1656 moveto -1997 1656 lineto -stroke -484 1656 moveto -703 1656 lineto -stroke -703 1656 moveto -1203 1656 lineto -stroke -1203 1703 moveto -1997 1703 lineto -stroke -484 1703 moveto -703 1703 lineto -stroke -703 1703 moveto -1203 1703 lineto -stroke -1203 1750 moveto -1997 1750 lineto -stroke -readpath -V04B30705E031A00A0004E831A00A0084~ -gsave -eofill -grestore -stroke -readpath -V04B30775E031A00A0004E831A00A0084~ -gsave -eofill -grestore -stroke -readpath -V04B307AFE031A00A0004E831A00A0084~ -gsave -eofill -grestore -stroke -1203 2025 moveto -1997 2025 lineto -stroke -1203 2079 moveto -2001 2079 lineto -stroke -readpath -V01E4081FE00DB00A0004E80DB00A0084~ -gsave -eofill -grestore -stroke -703 2079 moveto -1203 2079 lineto -stroke -readpath -V04B308C2E031E00A0004E831E00A0084~ -gsave -eofill -grestore -stroke -readpath -V01E408C2E00DB00A0004E80DB00A0084~ -gsave -eofill -grestore -stroke -readpath -V02BF08C2E01F400A0004E81F400A0084~ -gsave -eofill -grestore -stroke -readpath -V04B308F5E031A00A0004E831A00A0084~ -gsave -eofill -grestore -stroke -readpath -V04B30928E031A00A0004E831A00A0084~ -gsave -eofill -grestore -stroke -readpath -V04B30997E031A00A0004E831A00A0084~ -gsave -eofill -grestore -stroke -readpath -V04B309D1E031A00A0004E831A00A0084~ -gsave -eofill -grestore -stroke -readpath -V04B30A0BE031A00A0004E831A00A0084~ -gsave -eofill -grestore -stroke -readpath -V01E00A0BA003AA0400A00BAA8400~ -gsave -eofill -grestore -stroke -readpath -V01E002FBA0033A0400A00B3A8400~ -gsave -eofill -grestore -stroke -readpath -V01E0032EA002FA0400A00AFA8400~ -gsave -eofill -grestore -stroke -readpath -V01E0035DA002FA0400A00AFA8400~ -gsave -eofill -grestore -stroke -readpath -V01E0038CA002EA0400A00AEA8400~ -gsave -eofill -grestore -stroke -readpath -V01E003BAA002FA0400A00AFA8400~ -gsave -eofill -grestore -stroke -readpath -V01E003E9A002FA0400A00AFA8400~ -gsave -eofill -grestore -stroke -readpath -V01E00418A002EA0400A00AEA8400~ -gsave -eofill -grestore -stroke -readpath -V01E00446A002FA0400A00AFA8400~ -gsave -eofill -grestore -stroke -readpath -V01E00475A002FA0400A00AFA8400~ -gsave -eofill -grestore -stroke -readpath -V01E004A4A002FA0400A00AFA8400~ -gsave -eofill -grestore -stroke -readpath -V01E004D3A002FA0400A00AFA8400~ -gsave -eofill -grestore -stroke -readpath -V01E00502A002FA0400A00AFA8400~ -gsave -eofill -grestore -stroke -readpath -V01E00531A002EA0400A00AEA8400~ -gsave -eofill -grestore -stroke -readpath -V01E0055FA002FA0400A00AFA8400~ -gsave -eofill -grestore -stroke -readpath -V01E0058EA002FA0400A00AFA8400~ -gsave -eofill -grestore -stroke -readpath -V01E005BDA002FA0400A00AFA8400~ -gsave -eofill -grestore -stroke -readpath -V01E005ECA002FA0400A00AFA8400~ -gsave -eofill -grestore -stroke -readpath -V01E0061BA002FA0400A00AFA8400~ -gsave -eofill -grestore -stroke -readpath -V01E0064AA002EA0400A00AEA8400~ -gsave -eofill -grestore -stroke -readpath -V01E00678A002FA0400A00AFA8400~ -gsave -eofill -grestore -stroke -readpath -V01E006A7A002FA0400A00AFA8400~ -gsave -eofill -grestore -stroke -readpath -V01E006D6A002FA0400A00AFA8400~ -gsave -eofill -grestore -stroke -readpath -V01E00705A0070A0400A00F0A8400~ -gsave -eofill -grestore -stroke -readpath -V01E00775A003AA0400A00BAA8400~ -gsave -eofill -grestore -stroke -readpath -V01E007AFA003AA0400A00BAA8400~ -gsave -eofill -grestore -stroke -readpath -V01E007E9A0036A0400A00B6A8400~ -gsave -eofill -grestore -stroke -readpath -V01E0081FB0000A3A0400B0080A3A8400~ -gsave -eofill -grestore -stroke -readpath -V01E008C2A0033A0400A00B3A8400~ -gsave -eofill -grestore -stroke -readpath -V01E008F5A0033A0400A00B3A8400~ -gsave -eofill -grestore -stroke -readpath -V01E00928A006FA0400A00EFA8400~ -gsave -eofill -grestore -stroke -readpath -V01E00997A003AA0400A00BAA8400~ -gsave -eofill -grestore -stroke -readpath -V01E009D1A003AA0400A00BAA8400~ -gsave -eofill -grestore -stroke -703 767 moveto -703 814 lineto -stroke -703 814 moveto -703 861 lineto -stroke -703 861 moveto -703 908 lineto -stroke -703 908 moveto -703 954 lineto -stroke -703 954 moveto -703 1001 lineto -stroke -703 1001 moveto -703 1048 lineto -stroke -703 1048 moveto -703 1094 lineto -stroke -703 1094 moveto -703 1141 lineto -stroke -703 1141 moveto -703 1188 lineto -stroke -703 1188 moveto -703 1235 lineto -stroke -703 1235 moveto -703 1282 lineto -stroke -703 1282 moveto -703 1329 lineto -stroke -703 1329 moveto -703 1375 lineto -stroke -703 1375 moveto -703 1422 lineto -stroke -703 1422 moveto -703 1469 lineto -stroke -703 1469 moveto -703 1516 lineto -stroke -703 1516 moveto -703 1563 lineto -stroke -703 1563 moveto -703 1610 lineto -stroke -703 1610 moveto -703 1656 lineto -stroke -703 1656 moveto -703 1703 lineto -stroke -703 1703 moveto -703 1750 lineto -stroke -703 1750 moveto -703 1797 lineto -stroke -703 1797 moveto -703 1909 lineto -stroke -703 1909 moveto -703 1967 lineto -stroke -703 1967 moveto -703 2025 lineto -stroke -703 2025 moveto -703 2083 lineto -stroke -703 2246 moveto -703 2293 lineto -stroke -703 2293 moveto -703 2344 lineto -stroke -703 2344 moveto -703 2455 lineto -stroke -703 2455 moveto -703 2513 lineto -stroke -703 2513 moveto -703 2571 lineto -stroke -703 2571 moveto -703 2629 lineto -stroke -1203 767 moveto -1203 814 lineto -stroke -1203 814 moveto -1203 861 lineto -stroke -1203 861 moveto -1203 908 lineto -stroke -1203 908 moveto -1203 954 lineto -stroke -1203 954 moveto -1203 1001 lineto -stroke -1203 1001 moveto -1203 1048 lineto -stroke -1203 1048 moveto -1203 1094 lineto -stroke -1203 1094 moveto -1203 1141 lineto -stroke -1203 1141 moveto -1203 1188 lineto -stroke -1203 1188 moveto -1203 1235 lineto -stroke -1203 1235 moveto -1203 1282 lineto -stroke -1203 1282 moveto -1203 1329 lineto -stroke -1203 1329 moveto -1203 1375 lineto -stroke -1203 1375 moveto -1203 1422 lineto -stroke -1203 1422 moveto -1203 1469 lineto -stroke -1203 1469 moveto -1203 1516 lineto -stroke -1203 1516 moveto -1203 1563 lineto -stroke -1203 1563 moveto -1203 1610 lineto -stroke -1203 1610 moveto -1203 1656 lineto -stroke -1203 1656 moveto -1203 1703 lineto -stroke -1203 1703 moveto -1203 1750 lineto -stroke -1203 1750 moveto -1203 1797 lineto -stroke -1203 1797 moveto -1203 1909 lineto -stroke -1203 1909 moveto -1203 1967 lineto -stroke -1203 1967 moveto -1203 2025 lineto -stroke -1203 2025 moveto -1203 2079 lineto -stroke -1203 2246 moveto -1203 2293 lineto -stroke -1203 2293 moveto -1203 2344 lineto -stroke -1203 2344 moveto -1203 2455 lineto -stroke -1203 2455 moveto -1203 2513 lineto -stroke -1203 2513 moveto -1203 2571 lineto -stroke -1203 2571 moveto -1203 2629 lineto -stroke -readpath -V07CD0A0BA003AA0400A00BAA8400~ -gsave -eofill -grestore -stroke -readpath -V07CD02FBA0033A0400A00B3A8400~ -gsave -eofill -grestore -stroke -readpath -V07CD032EA002FA0400A00AFA8400~ -gsave -eofill -grestore -stroke -readpath -V07CD035DA002FA0400A00AFA8400~ -gsave -eofill -grestore -stroke -readpath -V07CD038CA002EA0400A00AEA8400~ -gsave -eofill -grestore -stroke -readpath -V07CD03BAA002FA0400A00AFA8400~ -gsave -eofill -grestore -stroke -readpath -V07CD03E9A002FA0400A00AFA8400~ -gsave -eofill -grestore -stroke -readpath -V07CD0418A002EA0400A00AEA8400~ -gsave -eofill -grestore -stroke -readpath -V07CD0446A002FA0400A00AFA8400~ -gsave -eofill -grestore -stroke -readpath -V07CD0475A002FA0400A00AFA8400~ -gsave -eofill -grestore -stroke -readpath -V07CD04A4A002FA0400A00AFA8400~ -gsave -eofill -grestore -stroke -readpath -V07CD04D3A002FA0400A00AFA8400~ -gsave -eofill -grestore -stroke -readpath -V07CD0502A002FA0400A00AFA8400~ -gsave -eofill -grestore -stroke -readpath -V07CD0531A002EA0400A00AEA8400~ -gsave -eofill -grestore -stroke -readpath -V07CD055FA002FA0400A00AFA8400~ -gsave -eofill -grestore -stroke -readpath -V07CD058EA002FA0400A00AFA8400~ -gsave -eofill -grestore -stroke -readpath -V07CD05BDA002FA0400A00AFA8400~ -gsave -eofill -grestore -stroke -readpath -V07CD05ECA002FA0400A00AFA8400~ -gsave -eofill -grestore -stroke -readpath -V07CD061BA002FA0400A00AFA8400~ -gsave -eofill -grestore -stroke -readpath -V07CD064AA002EA0400A00AEA8400~ -gsave -eofill -grestore -stroke -readpath -V07CD0678A002FA0400A00AFA8400~ -gsave -eofill -grestore -stroke -readpath -V07CD06A7A002FA0400A00AFA8400~ -gsave -eofill -grestore -stroke -readpath -V07CD06D6A002FA0400A00AFA8400~ -gsave -eofill -grestore -stroke -readpath -V07CD0705A0070A0400A00F0A8400~ -gsave -eofill -grestore -stroke -readpath -V07CD0775A003AA0400A00BAA8400~ -gsave -eofill -grestore -stroke -readpath -V07CD07AFA003AA0400A00BAA8400~ -gsave -eofill -grestore -stroke -readpath -V07CD07E9A0036A0400A00B6A8400~ -gsave -eofill -grestore -stroke -1999 2079 moveto -1999 2242 lineto -stroke -readpath -V07CD08C2A0033A0400A00B3A8400~ -gsave -eofill -grestore -stroke -readpath -V07CD08F5A0033A0400A00B3A8400~ -gsave -eofill -grestore -stroke -readpath -V07CD0928A006FA0400A00EFA8400~ -gsave -eofill -grestore -stroke -readpath -V07CD0997A003AA0400A00BAA8400~ -gsave -eofill -grestore -stroke -readpath -V07CD09D1A003AA0400A00BAA8400~ -gsave -eofill -grestore -stroke -grestore -gsave -1229 803 moveto -0 0 0 setrgbcolor -(Helvetica-iso1252) cvn findfont 34 -34 matrix scale makefont setfont -<50726F746F636F6C2056657273696F6E97382D62697420656E756D65726174696F6E> -[20 10 17 8 17 15 18 7 8 18 18 10 16 6 17 17 32 17 10 17 7 8 9 17 17 16 27 17 10 - 17 9 6 17 0] -xshow -1229 850 moveto -<457865726369736520494497382D62697420756E7369676E656420696E7465676572> -[21 14 17 10 16 6 16 17 8 8 22 32 18 9 18 6 9 8 17 17 16 6 17 18 17 17 8 7 17 8 - 18 17 17 0] -xshow -1229 897 moveto -<50445520547970652097382D62697420756E7369676E656420696E7465676572> -[20 22 23 8 16 15 17 18 8 31 18 9 18 6 9 8 17 17 16 6 18 17 17 17 9 6 17 8 18 17 - 17 0] -xshow -576 944 moveto -<3936> -[17 0] -xshow -729 944 moveto -<50445520486561646572> -[20 22 23 8 22 17 17 17 18 0] -xshow -1229 944 moveto -<50726F746F636F6C2046616D696C7997382D62697420656E756D65726174696F6E> -[20 10 17 8 17 15 18 7 8 18 16 27 7 6 15 32 17 10 17 7 8 9 17 17 16 27 17 9 18 9 - 6 17 0] -xshow -1229 990 moveto -<54696D657374616D709733322D62697420756E7369676E656420696E7465676572> -[19 6 26 17 16 7 17 27 16 32 17 17 10 18 6 9 8 17 17 16 6 17 17 17 18 8 6 18 8 17 - 17 18 0] -xshow -1229 1037 moveto -<4C656E6774689731362D62697420756E7369676E656420696E7465676572> -[17 17 17 17 8 17 31 17 16 10 18 6 9 8 17 18 15 7 17 17 17 17 9 6 18 7 18 17 17 0] -xshow -1229 1084 moveto -<50616464696E679731362D6269747320756E75736564> -[19 18 16 18 6 18 16 31 17 17 9 18 7 7 16 9 17 17 17 15 17 0] -xshow -1229 1131 moveto -<536974659731362D62697420756E7369676E656420696E7465676572> -[21 6 8 16 31 17 17 10 17 7 8 9 17 17 16 6 17 17 17 18 8 6 18 8 17 17 18 0] -xshow -576 1178 moveto -<3438> -[17 0] -xshow -729 1178 moveto -<4F726967696E6174696E6720456E74697479204944> -[24 10 6 18 6 17 18 8 7 17 17 9 20 18 8 7 8 16 8 8 0] -xshow -1229 1178 moveto -<4170706C69636174696F6E9731362D62697420756E7369676E656420696E7465676572> -[20 17 18 6 7 15 18 8 6 18 16 31 17 17 10 17 7 8 9 17 17 16 6 17 17 17 17 9 6 18 - 8 17 17 18 0] -xshow -1229 1224 moveto -<456E746974799731362D62697420756E7369676E656420696E7465676572> -[20 18 8 7 8 15 31 16 17 10 18 6 9 8 17 18 15 6 18 17 17 17 9 6 17 8 17 18 17 0] -xshow -1229 1271 moveto -<536974659731362D62697420756E7369676E656420696E7465676572> -[21 6 8 16 31 17 17 10 17 7 8 9 17 17 16 6 17 17 17 18 8 6 18 8 17 17 18 0] -xshow -576 1318 moveto -<3438> -[17 0] -xshow -729 1318 moveto -<526563656976696E6720456E74697479204944> -[22 17 15 18 6 16 6 17 17 9 20 18 8 7 8 16 8 8 0] -xshow -1229 1318 moveto -<4170706C69636174696F6E9731362D62697420756E7369676E656420696E7465676572> -[20 17 18 6 7 15 18 8 6 18 16 31 17 17 10 17 7 8 9 17 17 16 6 17 17 17 17 9 6 18 - 8 17 17 18 0] -xshow -1229 1365 moveto -<456E746974799731362D62697420756E7369676E656420696E7465676572> -[20 18 8 7 8 15 31 16 17 10 18 6 9 8 17 18 15 6 18 17 17 17 9 6 17 8 17 18 17 0] -xshow -576 1412 moveto -<3332> -[17 0] -xshow -729 1412 moveto -<52657175657374204944> -[22 17 17 17 17 16 8 8 8 0] -xshow -1229 1412 moveto -<33322D62697420756E7369676E656420696E7465676572> -[17 17 10 18 6 9 8 17 18 15 6 17 18 17 17 8 7 17 8 18 17 17 0] -xshow -585 1459 moveto -<38> -show -729 1459 moveto -<52657175697265642052656C696162696C6974792053657276696365> -[22 17 17 17 7 9 17 18 8 23 17 6 7 17 18 6 7 7 8 16 8 21 17 11 16 6 15 0] -xshow -1229 1459 moveto -<382D62697420656E756D65726174696F6E> -[17 10 18 6 9 8 17 17 17 26 18 9 18 8 6 17 0] -xshow -585 1505 moveto -<38> -show -729 1505 moveto -<5472616E736665722054797065> -[15 10 17 18 16 7 17 11 8 16 15 17 0] -xshow -1229 1505 moveto -<382D62697420656E756D65726174696F6E> -[17 10 18 6 9 8 17 17 17 26 18 9 18 8 6 17 0] -xshow -1229 1552 moveto -<536974659731362D62697420756E7369676E656420696E7465676572> -[21 6 8 16 31 17 17 10 17 7 8 9 17 17 16 6 17 17 17 18 8 6 18 8 17 17 18 0] -xshow -576 1599 moveto -<3438> -[17 0] -xshow -729 1599 moveto -<456E7469747920494420746F206265205472616E73666572726564> -[20 18 8 6 9 15 9 8 23 8 8 18 8 17 17 9 16 9 17 18 16 7 18 10 10 17 0] -xshow -1229 1599 moveto -<4170706C69636174696F6E9731362D62697420756E7369676E656420696E7465676572> -[20 17 18 6 7 15 18 8 6 18 16 31 17 17 10 17 7 8 9 17 17 16 6 17 17 17 17 9 6 18 - 8 17 17 18 0] -xshow -1229 1646 moveto -<456E746974799731362D62697420756E7369676E656420696E7465676572> -[20 18 8 7 8 15 31 16 17 10 18 6 9 8 17 18 15 6 18 17 17 17 9 6 17 8 17 18 17 0] -xshow -576 1693 moveto -<3332> -[17 0] -xshow -729 1693 moveto -<4E756D626572206F66205265636F7264205365747320285229> -[22 16 27 17 17 10 8 18 8 9 22 17 15 17 10 17 9 20 18 8 15 9 9 23 0] -xshow -1229 1693 moveto -<33322D62697420756E7369676E656420696E7465676572> -[17 17 10 18 6 9 8 17 18 15 6 17 18 17 17 8 7 17 8 18 17 17 0] -xshow -1229 1740 moveto -<446174756D2049449733322D62697420656E756D65726174696F6E> -[22 18 7 17 26 9 8 22 32 17 17 10 17 7 8 9 17 17 16 27 17 10 17 9 6 17 0] -xshow -1229 1786 moveto -<5265636F7264205365742053657269616C204E756D6265729733322D62697420756E7369676E65 -6420696E7465676572> -[22 17 15 17 10 17 9 21 17 8 9 20 17 11 6 18 6 9 22 17 26 17 17 9 32 17 17 10 18 - 6 9 8 17 17 16 6 17 18 17 17 8 7 17 8 17 18 17 0] -xshow -530 1837 moveto -<3936202B20284C> -[16 18 8 18 9 10 0] -xshow -627 1848 moveto -(Helvetica-iso1252) cvn findfont 19 -19 matrix scale makefont setfont -<3120> -[10 0] -xshow -641 1837 moveto -(Helvetica-iso1252) cvn findfont 34 -34 matrix scale makefont setfont -<78> -show -539 1891 moveto -<51> -show -563 1902 moveto -(Helvetica-iso1252) cvn findfont 19 -19 matrix scale makefont setfont -<31> -show -573 1891 moveto -(Helvetica-iso1252) cvn findfont 34 -34 matrix scale makefont setfont -<29202B2050> -[10 9 18 8 0] -xshow -638 1902 moveto -(Helvetica-iso1252) cvn findfont 19 -19 matrix scale makefont setfont -<31> -show -729 1837 moveto -(Helvetica-iso1252) cvn findfont 34 -34 matrix scale makefont setfont -<205265636F726420536574202331> -[8 23 16 16 17 10 17 8 21 17 8 9 17 0] -xshow -1229 1837 moveto -<5265636F7264204C656E6774689731362D62697420756E7369676E656420696E74656765722028 -4C> -[22 17 15 17 10 17 9 17 17 17 18 8 16 31 17 17 10 17 7 8 9 16 18 16 6 17 17 17 17 - 9 6 18 8 17 17 18 10 8 10 0] -xshow -1808 1848 moveto -(Helvetica-iso1252) cvn findfont 19 -19 matrix scale makefont setfont -<31> -show -1818 1837 moveto -(Helvetica-iso1252) cvn findfont 34 -34 matrix scale makefont setfont -<29> -show -1229 1949 moveto -<5265636F726420436F756E749731362D62697420756E7369676E656420696E7465676572202851> -[22 17 15 17 10 17 9 23 16 17 18 7 31 17 17 10 17 7 8 9 17 17 16 6 17 17 17 17 9 - 6 18 8 17 17 18 10 8 9 0] -xshow -1803 1960 moveto -(Helvetica-iso1252) cvn findfont 19 -19 matrix scale makefont setfont -<31> -show -1813 1949 moveto -(Helvetica-iso1252) cvn findfont 34 -34 matrix scale makefont setfont -<29> -show -1229 2007 moveto -<5265636F72642056616C75657397284C> -[22 17 15 17 10 17 9 19 17 6 18 17 14 33 9 0] -xshow -1487 2018 moveto -(Helvetica-iso1252) cvn findfont 19 -19 matrix scale makefont setfont -<31> -show -1497 2007 moveto -(Helvetica-iso1252) cvn findfont 34 -34 matrix scale makefont setfont -<20782051> -[9 15 9 0] -xshow -1554 2018 moveto -(Helvetica-iso1252) cvn findfont 19 -19 matrix scale makefont setfont -<31> -show -1564 2007 moveto -(Helvetica-iso1252) cvn findfont 34 -34 matrix scale makefont setfont -<292062697473> -[10 9 17 7 8 0] -xshow -1229 2061 moveto -<50616464696E679750> -[19 18 16 18 6 18 16 32 0] -xshow -1393 2072 moveto -(Helvetica-iso1252) cvn findfont 19 -19 matrix scale makefont setfont -<31> -show -1403 2061 moveto -(Helvetica-iso1252) cvn findfont 34 -34 matrix scale makefont setfont -<2062697473> -[9 17 7 8 0] -xshow -1233 2133 moveto -(Symbol) cvn findfont 38 -38 matrix scale makefont setfont - -show -1233 2182 moveto - -show -1233 2231 moveto - -show -1229 2282 moveto -(Helvetica-iso1252) cvn findfont 34 -34 matrix scale makefont setfont -<446174756D2049449733322D62697420656E756D65726174696F6E> -[22 18 7 17 26 9 8 22 32 17 17 10 17 7 8 9 17 17 16 27 17 10 17 9 6 17 0] -xshow -1229 2333 moveto -<5265636F7264205365742053657269616C204E756D6265729733322D62697420756E7369676E65 -6420696E7465676572> -[22 17 15 17 10 17 9 21 17 8 9 20 17 11 6 18 6 9 22 17 26 17 17 9 32 17 17 10 18 - 6 9 8 17 17 16 6 17 18 17 17 8 7 17 8 17 18 17 0] -xshow -527 2384 moveto -<3936202B20284C> -[17 17 9 18 8 10 0] -xshow -623 2395 moveto -(Helvetica-iso1252) cvn findfont 19 -19 matrix scale makefont setfont -<52> -show -636 2384 moveto -(Helvetica-iso1252) cvn findfont 34 -34 matrix scale makefont setfont -<2078> -[8 0] -xshow -538 2438 moveto -<51> -show -562 2449 moveto -(Helvetica-iso1252) cvn findfont 19 -19 matrix scale makefont setfont -<5229> -[13 0] -xshow -581 2438 moveto -(Helvetica-iso1252) cvn findfont 34 -34 matrix scale makefont setfont -<202B2050> -[9 17 9 0] -xshow -636 2449 moveto -(Helvetica-iso1252) cvn findfont 19 -19 matrix scale makefont setfont -<52> -show -729 2384 moveto -(Helvetica-iso1252) cvn findfont 34 -34 matrix scale makefont setfont -<205265636F726420536574202352> -[8 23 16 16 17 10 17 8 21 17 8 9 17 0] -xshow -1229 2384 moveto -<5265636F7264204C656E6774689731362D62697420756E7369676E656420696E74656765722028 -4C> -[22 17 15 17 10 17 9 17 17 17 18 8 16 31 17 17 10 17 7 8 9 16 18 16 6 17 17 17 17 - 9 6 18 8 17 17 18 10 8 10 0] -xshow -1808 2395 moveto -(Helvetica-iso1252) cvn findfont 19 -19 matrix scale makefont setfont -<52> -show -1821 2384 moveto -(Helvetica-iso1252) cvn findfont 34 -34 matrix scale makefont setfont -<29> -show -1229 2496 moveto -<5265636F726420436F756E749731362D62697420756E7369676E656420696E7465676572202851> -[22 17 15 17 10 17 9 23 16 17 18 7 31 17 17 10 17 7 8 9 17 17 16 6 17 17 17 17 9 - 6 18 8 17 17 18 10 8 9 0] -xshow -1803 2506 moveto -(Helvetica-iso1252) cvn findfont 19 -19 matrix scale makefont setfont -<52> -show -1816 2496 moveto -(Helvetica-iso1252) cvn findfont 34 -34 matrix scale makefont setfont -<29> -show -1229 2554 moveto -<5265636F72642056616C75657397284C> -[22 17 15 17 10 17 9 19 17 6 18 17 14 33 9 0] -xshow -1487 2564 moveto -(Helvetica-iso1252) cvn findfont 19 -19 matrix scale makefont setfont -<52> -show -1500 2554 moveto -(Helvetica-iso1252) cvn findfont 34 -34 matrix scale makefont setfont -<20782051> -[9 15 9 0] -xshow -1556 2564 moveto -(Helvetica-iso1252) cvn findfont 19 -19 matrix scale makefont setfont -<52> -show -1569 2554 moveto -(Helvetica-iso1252) cvn findfont 34 -34 matrix scale makefont setfont -<292062697473> -[10 8 18 6 9 0] -xshow -1229 2611 moveto -<50616464696E679750> -[19 18 16 18 6 18 16 32 0] -xshow -1393 2622 moveto -(Helvetica-iso1252) cvn findfont 19 -19 matrix scale makefont setfont -<52> -show -1406 2611 moveto -(Helvetica-iso1252) cvn findfont 34 -34 matrix scale makefont setfont -<2062697473> -[9 17 7 8 0] -xshow -grestore -gsave -readpath -R000A45B00015FE09B200B00815F~ -closepath clip newpath -0 0 0 setrgbcolor -1 setlinewidth -479 2629 moveto -1999 2629 lineto -stroke -479 2978 moveto -1999 2978 lineto -stroke -readpath -V01DF0A45B00015DA0400B00815DA8400~ -gsave -eofill -grestore -stroke -1999 2629 moveto -1999 2978 lineto -stroke -grestore -gsave -508 2665 moveto -0 0 0 setrgbcolor -(Helvetica-iso1252) cvn findfont 34 -34 matrix scale makefont setfont -<202020202020202020202020202020202020202020202020202020202020202020202020202020 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -52> -[8 9 8 9 9 8 9 8 9 8 9 8 9 8 9 9 8 9 8 9 8 9 8 9 8 9 8 9 9 8 9 8 9 8 9 8 9 8 9 9 - 8 9 8 9 8 9 8 9 8 9 8 9 9 8 9 8 9 8 9 8 9 8 9 9 8 9 8 9 8 9 8 9 8 9 8 9 9 8 9 0] -xshow -508 2727 moveto -<546F74616C205472616E7366657220436F6E74726F6C205265717565737420205044552073697A -65203D20333230202B20> -[15 18 8 18 6 9 16 9 18 17 16 7 18 10 8 23 17 17 8 10 18 6 9 22 17 17 17 17 16 8 - 8 9 20 22 23 8 16 7 15 17 9 18 8 17 17 17 9 18 0] -xshow -1189 2727 moveto -(Symbol) cvn findfont 50 -50 matrix scale makefont setfont - -show -1225 2727 moveto -(Helvetica-iso1252) cvn findfont 34 -34 matrix scale makefont setfont -<283936202B20284C> -[10 17 17 9 18 8 10 0] -xshow -1331 2738 moveto -(Helvetica-iso1252) cvn findfont 19 -19 matrix scale makefont setfont -<6920> -[4 0] -xshow -1340 2727 moveto -(Helvetica-iso1252) cvn findfont 34 -34 matrix scale makefont setfont -<782051> -[15 9 0] -xshow -1388 2738 moveto -(Helvetica-iso1252) cvn findfont 19 -19 matrix scale makefont setfont -<69> -show -1392 2727 moveto -(Helvetica-iso1252) cvn findfont 34 -34 matrix scale makefont setfont -<29202B2050> -[10 8 18 9 0] -xshow -1458 2738 moveto -(Helvetica-iso1252) cvn findfont 19 -19 matrix scale makefont setfont -<69> -show -1462 2727 moveto -(Helvetica-iso1252) cvn findfont 34 -34 matrix scale makefont setfont -<292062697473> -[11 8 18 6 8 0] -xshow -508 2780 moveto -<202020202020202020202020202020202020202020202020202020202020202020202020202020 -20202020202020202020202020202020202020202020202020202020202020202020202020206920 -3D2031> -[8 9 8 9 9 8 9 8 9 8 9 8 9 8 9 9 8 9 8 9 8 9 8 9 8 9 8 9 9 8 9 8 9 8 9 8 9 8 9 9 - 8 9 8 9 8 9 8 9 8 9 8 9 9 8 9 8 9 8 9 8 9 8 9 9 8 9 8 9 8 9 8 9 8 9 8 9 9 6 9 18 - 8 0] -xshow -508 2874 moveto -<7768657265> -[22 17 18 9 0] -xshow -508 2967 moveto -<522020697320746865206E756D626572206F6620205265636F72642053657473> -[22 9 8 6 16 9 8 17 18 8 17 17 26 17 17 10 9 18 8 8 9 22 17 15 17 10 17 9 21 17 - 8 0] -xshow -376 3104 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<41434D2063757272656E746C792069676E6F726573207265636F7264207365747320696E206120 -7472616E7366657220636F6E74726F6C205044552E> -[24 27 32 10 19 21 12 12 21 21 11 7 20 10 8 21 21 21 12 21 19 10 12 21 19 21 12 - 21 11 18 21 10 19 11 8 21 10 21 11 10 12 21 21 20 9 21 13 10 18 22 21 10 12 21 - 8 11 24 28 27 0] -xshow -376 3343 moveto -<41434D20666F7220554E495820616E642057696E646F7773> -[24 27 32 10 9 22 12 11 27 28 9 26 10 21 21 21 10 37 7 21 21 20 27 0] -xshow -1256 3343 moveto -<3234> -[20 0] -xshow -1962 3343 moveto -<30362F31302F3036> -[21 21 9 21 21 10 21 0] -xshow -grestore grestore -showpage -%%PageTrailer - -%%Page: 25 25 -%%PageBoundingBox: 0 0 595 842 -%%BeginPageSetup -% -%%EndPageSetup -gsave -[0.24 0 0 -0.24 0 842] concat -gsave -376 590 moveto -0 0 0 setrgbcolor -(Helvetica-Bold-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<5472616E736665722054797065> -[21 14 21 23 21 12 21 15 10 21 20 23 0] -xshow -376 673 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<546869732073656374696F6E207370656369666965732074686520382D62697420656E756D6572 -6174696F6E20666F7220746865205472616E736665722054797065206669656C64206F6620746865 -205472616E7366657220436F6E74726F6C205044552E> -[24 21 7 19 11 18 22 19 10 8 21 21 10 19 21 21 19 8 10 8 21 19 11 10 21 21 11 21 - 12 21 8 11 10 21 21 20 32 22 11 22 10 8 21 21 10 9 22 13 10 10 21 21 11 19 12 21 - 21 20 9 21 13 10 19 19 21 21 10 11 8 21 8 21 11 21 10 10 10 22 21 10 20 11 22 21 - 19 9 22 12 10 28 21 21 10 11 22 8 10 25 28 26 0] -xshow -grestore -gsave -readpath -R000300B0002B4E09B200B0082B4~ -closepath clip newpath -readpath -V035F0319E053900A0004E853900A0084~ -gsave -0 0 0 setrgbcolor -eofill -grestore -0 0 0 setrgbcolor -1 setlinewidth -stroke -readpath -V015F0319E020000A0004E820000A0084~ -gsave -eofill -grestore -stroke -863 879 moveto -2196 879 lineto -stroke -355 879 moveto -863 879 lineto -stroke -863 961 moveto -2196 961 lineto -stroke -355 961 moveto -863 961 lineto -stroke -863 1043 moveto -2196 1043 lineto -stroke -355 1043 moveto -863 1043 lineto -stroke -863 1125 moveto -2196 1125 lineto -stroke -355 1125 moveto -863 1125 lineto -stroke -863 1208 moveto -2196 1208 lineto -stroke -355 1208 moveto -863 1208 lineto -stroke -863 1290 moveto -2196 1290 lineto -stroke -355 1290 moveto -863 1290 lineto -stroke -863 1372 moveto -2196 1372 lineto -stroke -355 1372 moveto -863 1372 lineto -stroke -readpath -V035F05AEE053900A0004E853900A0084~ -gsave -eofill -grestore -stroke -readpath -V015F05AEE020000A0004E820000A0084~ -gsave -eofill -grestore -stroke -readpath -V015F055CA0056A0400A00D6A8400~ -gsave -eofill -grestore -stroke -readpath -V015F0319A0056A0400A00D6A8400~ -gsave -eofill -grestore -stroke -readpath -V015F036FA0052A0400A00D2A8400~ -gsave -eofill -grestore -stroke -readpath -V015F03C1A0052A0400A00D2A8400~ -gsave -eofill -grestore -stroke -readpath -V015F0413A0052A0400A00D2A8400~ -gsave -eofill -grestore -stroke -readpath -V015F0465A0053A0400A00D3A8400~ -gsave -eofill -grestore -stroke -readpath -V015F04B8A0052A0400A00D2A8400~ -gsave -eofill -grestore -stroke -readpath -V015F050AA0052A0400A00D2A8400~ -gsave -eofill -grestore -stroke -863 797 moveto -863 879 lineto -stroke -863 879 moveto -863 961 lineto -stroke -863 961 moveto -863 1043 lineto -stroke -863 1043 moveto -863 1125 lineto -stroke -863 1125 moveto -863 1208 lineto -stroke -863 1208 moveto -863 1290 lineto -stroke -863 1290 moveto -863 1372 lineto -stroke -863 1372 moveto -863 1454 lineto -stroke -readpath -V0894055CA0056A0400A00D6A8400~ -gsave -eofill -grestore -stroke -readpath -V08940319A0056A0400A00D6A8400~ -gsave -eofill -grestore -stroke -readpath -V0894036FA0052A0400A00D2A8400~ -gsave -eofill -grestore -stroke -readpath -V089403C1A0052A0400A00D2A8400~ -gsave -eofill -grestore -stroke -readpath -V08940413A0052A0400A00D2A8400~ -gsave -eofill -grestore -stroke -readpath -V08940465A0053A0400A00D3A8400~ -gsave -eofill -grestore -stroke -readpath -V089404B8A0052A0400A00D2A8400~ -gsave -eofill -grestore -stroke -readpath -V0894050AA0052A0400A00D2A8400~ -gsave -eofill -grestore -stroke -grestore -gsave -516 841 moveto -0 0 0 setrgbcolor -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<4669656C642056616C7565> -[24 7 21 8 21 11 22 22 7 22 0] -xshow -516 845 186 2 rectfill -1475 841 moveto -<4E6174757265> -[28 21 10 21 12 0] -xshow -1475 845 113 2 rectfill -598 923 moveto -<30> -show -886 923 moveto -<4F74686572> -[31 9 21 21 0] -xshow -598 1005 moveto -<31> -show -886 1005 moveto -<436F6E74726F6C6C696E67206170706C69636174696F6E207265717565737473207472616E7366 -6572206F6620616E20656E74697479> -[28 21 21 10 12 21 8 8 8 21 22 10 21 21 21 8 8 19 21 11 7 21 22 10 12 21 21 21 21 - 19 9 20 10 10 12 21 22 19 9 21 13 10 21 11 10 21 21 10 21 21 11 8 10 0] -xshow -598 1088 moveto -<32> -show -886 1088 moveto -<4170706C69636174696F6E206465736972696E6720636F6E74726F6C2072657175657374732074 -72616E73666572206F6620616E20656E74697479> -[26 20 22 8 8 18 22 10 8 21 21 11 20 21 20 7 13 8 21 21 11 18 21 22 9 13 21 8 11 - 11 21 21 21 21 19 10 19 11 10 12 21 21 20 8 22 12 11 21 10 10 21 21 11 21 21 10 - 8 10 0] -xshow -598 1170 moveto -<33> -show -886 1170 moveto -<4D757475616C2065786368616E6765202F2073776170206F6620616E20656E74697479> -[32 21 10 21 21 8 11 19 19 19 21 20 21 22 21 10 10 11 18 27 21 21 11 21 10 10 21 - 21 11 20 22 10 8 10 0] -xshow -598 1252 moveto -<34> -show -886 1252 moveto -<436F6E74726F6C6C696E67206170706C69636174696F6E207265717565737473207472616E7366 -6572206F6620616E20656E7669726F6E6D656E74616C2070726F63657373> -[28 21 21 10 12 21 8 8 8 21 22 10 21 21 21 8 8 19 21 11 7 21 22 10 12 21 21 21 21 - 19 9 20 10 10 12 21 22 19 9 21 13 10 21 11 10 21 21 10 21 21 19 8 11 21 21 32 21 - 21 10 21 8 11 21 12 21 18 21 19 0] -xshow -598 1334 moveto -<35> -show -886 1334 moveto -<4170706C69636174696F6E206465736972696E6720636F6E74726F6C7320726571756573742074 -72616E73666572206F6620616E20656E7669726F6E6D656E74616C2070726F63657373> -[26 20 22 8 8 18 22 10 8 21 21 11 20 21 20 7 13 8 21 21 11 18 21 22 9 13 21 8 19 - 10 12 21 21 21 21 19 10 11 10 12 21 21 20 8 22 12 11 21 10 10 21 21 11 21 20 19 - 8 12 21 20 32 21 22 9 22 8 10 21 12 21 19 21 18 0] -xshow -598 1416 moveto -<36> -show -886 1416 moveto -<4D757475616C2065786368616E6765206F6620616E20656E7669726F6E6D656E74616C> -[32 21 10 21 21 8 11 19 19 19 21 20 21 22 21 10 21 10 11 21 21 10 21 20 19 8 12 - 21 21 32 21 21 9 22 0] -xshow -376 1803 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 45 -45 matrix scale makefont setfont -<417373756D696E67204F776E657273686970> -[30 23 22 25 38 10 25 26 11 32 32 25 23 15 23 25 11 0] -xshow -grestore -gsave -readpath -V01770726B0004AEE05DD00B0084AE~ -closepath clip newpath -readpath -V029D0B91B0083DAA0C00B0003DAA8C00~ -0 0 0 setrgbcolor -eofill -622 1900 moveto -(Helvetica-iso1252) cvn findfont 22 -50 matrix scale makefont setfont -<4F74686572> -[39 14 28 28 0] -xshow -561 1960 moveto -<4170706C69636174696F6E> -[33 28 28 12 12 25 28 14 12 28 0] -xshow -readpath -V060B0B91B0283DAA0C00B8203DAA8C00~ -eofill -1510 1900 moveto -<41434D> -[33 36 0] -xshow -1441 1960 moveto -<4170706C69636174696F6E> -[33 28 28 12 12 25 28 14 12 28 0] -xshow -readpath -V05ED084FE8325EFA0082E03256FA0002~ -eofill -readpath -V06010851A9D0AA0489A0189A818AA1912~ -eofill -readpath -V05200851A0B82A0B85A088AA058AA028CA00A5A828CA858AA8888A8B86A8B82E817600A8C02A8B0 -6A8808A850AA820CA0025A020CA050AA080AA0B05A0C02E017600~ -1 1 1 setrgbcolor -eofill -0 0 0 setrgbcolor -1 setlinewidth -readpath -V05200851A0B82A0B85A088AA058AA028CA00A5A828CA858AA8888A8B86A8B82E817600A8C02A8B0 -6A8808A850AA820CA0025A020CA050AA080AA0B05A0C02E017600~ -stroke -1004 2062 moveto -(Helvetica-iso1252) cvn findfont 15 -33 matrix scale makefont setfont -<456E7469747920537461746520504455> -[22 17 9 7 9 15 9 22 9 17 9 17 9 22 24 0] -xshow -1022 2102 moveto -<656E746974792073312E61312E6531> -[17 18 8 7 9 15 9 17 18 9 17 18 9 17 0] -xshow -readpath -V05ED08E5E8325EEA0082E03256EA0002~ -eofill -readpath -V060108E7A9D0AA0489A0189A8189A1911~ -eofill -readpath -V052008E7A0B82A0B85A0889A058AA028CA00A5A828CA858AA8888A8B86A8B82E817600A8C02A8B0 -6A8808A850AA820CA0025A020CA050AA0809A0B05A0C02E017600~ -1 1 1 setrgbcolor -eofill -0 0 0 setrgbcolor -readpath -V052008E7A0B82A0B85A0889A058AA028CA00A5A828CA858AA8888A8B86A8B82E817600A8C02A8B0 -6A8808A850AA820CA0025A020CA050AA0809A0B05A0C02E017600~ -stroke -1004 2213 moveto -<456E7469747920537461746520504455> -[22 17 9 7 9 15 9 22 9 17 9 17 9 22 24 0] -xshow -1022 2253 moveto -<656E746974792073312E61312E6531> -[17 18 8 7 9 15 9 17 18 9 17 18 9 17 0] -xshow -readpath -V02E509B2E0313DCA0002E83135CA0082~ -eofill -readpath -V02D209B5A1990A8209A0109A0408A9C8A~ -eofill -readpath -V052909C8A0B82A0B85A0889A068AA018CA00A5A818CA868AA8888A8B86A8B82E817600A8C02A8A0 -6A8808A860AA820CA0025A020CA060AA0809A0A05A0C02E017600~ -1 1 1 setrgbcolor -eofill -0 0 0 setrgbcolor -readpath -V052909C8A0B82A0B85A0889A068AA018CA00A5A818CA868AA8888A8B86A8B82E817600A8C02A8A0 -6A8808A860AA820CA0025A020CA060AA0809A0A05A0C02E017600~ -stroke -979 2458 moveto -<5265717565737420436F6E74726F6C20504455> -[24 17 18 17 17 17 9 9 24 17 18 9 11 17 7 9 22 24 0] -xshow -readpath -V02E50B50E0313C9A0002E831349A0082~ -eofill -readpath -V02D20B53A1A90A8209A0009A0409A9C8B~ -eofill -readpath -V05290B65A0B81A0B86A0888A068BA018BA00A6A818BA868BA8888A8B85A8B82E817600A8C02A8A0 -5A8808A860BA820BA0026A020BA060BA0808A0A06A0C01E017600~ -1 1 1 setrgbcolor -eofill -0 0 0 setrgbcolor -readpath -V05290B65A0B81A0B86A0888A068BA018BA00A6A818BA868BA8888A8B85A8B82E817600A8C02A8A0 -5A8808A860BA820BA0026A020BA060BA0808A0A06A0C01E017600~ -stroke -1014 2851 moveto -<456E7469747920537461746520504455> -[22 17 9 7 9 15 9 22 9 17 9 17 9 22 24 0] -xshow -1031 2891 moveto -<656E746974792073312E61312E6531> -[17 17 9 7 9 15 9 17 18 9 17 18 9 17 0] -xshow -readpath -V05ED0A5CE8325EEA0082E03256EA0002~ -eofill -readpath -V06010A5EA9D0AA0489A0189A8189A1911~ -eofill -readpath -V05200A5EA0B82A0B85A0889A058AA028CA00A5A828CA858AA8888A8B86A8B82E817600A8C02A8B0 -6A8808A850AA820CA0025A020CA050AA0809A0B05A0C02E017600~ -1 1 1 setrgbcolor -eofill -0 0 0 setrgbcolor -readpath -V05200A5EA0B82A0B85A0889A058AA028CA00A5A828CA858AA8888A8B86A8B82E817600A8C02A8B0 -6A8808A850AA820CA0025A020CA050AA0809A0B05A0C02E017600~ -stroke -991 2608 moveto -<41636B6E6F776C6465676520504455> -[22 17 15 18 17 23 7 18 17 18 17 9 22 24 0] -xshow -grestore -gsave -376 3343 moveto -0 0 0 setrgbcolor -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<41434D20666F7220554E495820616E642057696E646F7773> -[24 27 32 10 9 22 12 11 27 28 9 26 10 21 21 21 10 37 7 21 21 20 27 0] -xshow -1255 3343 moveto -<3235> -[20 0] -xshow -1962 3343 moveto -<30362F31302F3036> -[21 21 9 21 21 10 21 0] -xshow -grestore grestore -showpage -%%PageTrailer - -%%Page: 26 26 -%%PageBoundingBox: 0 0 595 842 -%%BeginPageSetup -% -%%EndPageSetup -gsave -[0.24 0 0 -0.24 0 842] concat -gsave -376 350 moveto -0 0 0 setrgbcolor -(Helvetica-BoldOblique-iso1252) cvn findfont 45 -45 matrix scale makefont setfont -<416363657074696E67204F776E6572736869702062792052657175657374> -[30 22 23 22 26 14 10 25 26 11 32 32 25 23 15 23 26 10 26 11 24 23 11 30 22 25 26 - 22 23 0] -xshow -376 421 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<416E6F746865722066656174757265206F662041434D9273207472616E7366657220636F6E7472 -6F6C2070726F746F636F6C20737570706F72742069732074686174206F74686572206170706C6963 -6174696F6E73206D617920726571756573742074686174> -[26 20 22 9 21 22 12 10 9 22 21 10 21 12 21 11 21 10 11 23 27 33 6 19 11 10 12 21 - 21 20 9 21 13 10 19 21 21 10 12 21 8 11 21 11 22 9 21 19 22 7 11 18 21 21 21 21 - 14 10 11 7 20 10 10 21 22 10 10 21 10 21 22 12 10 21 21 21 8 8 19 22 10 8 21 21 - 19 10 32 19 19 11 12 21 21 20 21 19 10 11 10 21 22 0] -xshow -376 478 moveto -<41434D2074616B6520636F6E74726F6C206F6620616E2061697263726166742074686174207468 -65206F74686572206170706C69636174696F6E20636F6E74726F6C732E> -[24 27 32 10 10 21 18 21 11 18 21 22 10 12 21 8 11 21 10 10 21 21 11 21 8 12 19 - 12 22 10 11 10 10 21 22 10 11 10 21 21 10 22 9 21 21 13 10 21 21 21 8 8 19 21 11 - 8 21 21 10 19 21 21 10 12 21 9 18 0] -xshow -376 3343 moveto -<41434D20666F7220554E495820616E642057696E646F7773> -[24 27 32 10 9 22 12 11 27 28 9 26 10 21 21 21 10 37 7 21 21 20 27 0] -xshow -1255 3343 moveto -<3236> -[20 0] -xshow -1962 3343 moveto -<30362F31302F3036> -[21 21 9 21 21 10 21 0] -xshow -grestore grestore -showpage -%%PageTrailer - -%%Page: 27 27 -%%PageBoundingBox: 0 0 595 842 -%%BeginPageSetup -% -%%EndPageSetup -gsave -[0.24 0 0 -0.24 0 842] concat -gsave -376 344 moveto -0 0 0 setrgbcolor -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<54686520536F7572636520436F6465202841434D20666F722057696E646F7773206F6E6C7929> -[24 20 21 11 25 21 21 12 18 21 11 27 21 21 21 10 12 24 27 32 10 10 21 13 10 37 7 - 21 21 20 27 19 10 21 22 7 19 0] -xshow -376 426 moveto -<546869732073656374696F6E20636F6E7461696E7320736F6D6520696E666F726D6174696F6E20 -746F2068656C7020796F75206E61766967617465207468726F756768207468652041434D20666F72 -2057696E646F777320736F75726365732E> -[24 21 7 19 11 18 22 19 10 8 21 21 10 19 21 21 10 22 7 21 19 11 18 21 32 21 10 8 - 22 9 21 12 32 22 10 7 22 21 10 10 21 10 21 22 7 21 11 18 21 21 10 21 20 20 7 21 - 21 10 21 11 10 21 12 21 21 21 21 10 10 21 21 11 24 26 32 10 9 22 13 10 37 7 21 - 21 20 28 18 11 18 21 21 12 19 21 19 0] -xshow -376 590 moveto -<48657265927320612073756D6D617279206F662074686520636F6E74656E7473206F6620656163 -68206F6620746865206469726563746F7269657320696E2074686520736F7572636520636F646520 -747265653A> -[28 21 11 22 6 20 10 21 11 18 21 31 32 21 13 19 11 21 10 10 10 22 21 10 19 21 21 - 10 20 22 10 19 10 22 10 10 21 21 19 21 10 21 10 11 10 21 21 11 21 8 12 21 19 9 - 21 14 7 21 19 11 7 22 10 10 21 22 10 19 21 21 12 18 22 10 19 21 21 21 10 10 12 - 21 22 0] -xshow -376 740 moveto -(Courier-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<736F757263655C61636D> -[28 27 28 27 28 27 28 27 28 0] -xshow -976 740 moveto -<546F706C6576656C206469726563746F727920666F722041434D20666F722057696E646F7773> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 0] -xshow -376 816 moveto -<736F757263655C61636D5C706320202020202020202020202020546865204D46432D6261736564 -2066726F6E742D656E6420746F20746865> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 - 28 0] -xshow -376 866 moveto -<73696D756C61746F72> -[28 27 28 27 28 27 28 27 0] -xshow -376 941 moveto -<202020202020202020202020202020202020202020202020202054686973206469726563746F72 -7920686F6C647320746865206D61696E> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -376 991 moveto -<9161636D2E64737792> -[28 27 28 27 28 27 28 27 0] -xshow -376 1066 moveto -<202020202020202020202020202020202020202020202020202056432B2B20352E302070726F6A -65637420776F726B73706163652E> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -376 1142 moveto -<736F757263655C61636D5C70635C686C70> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -1126 1142 moveto -<48656C702066696C6573206173736F636961746564207769746820746865> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 0] -xshow -376 1192 moveto -<70726F6A656374> -[28 27 28 27 28 27 0] -xshow -376 1267 moveto -<736F757263655C61636D5C70635C726573> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -1126 1267 moveto -<57696E646F7773207265736F757263657320286269746D6170732C2069636F6E732C> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 0] -xshow -376 1317 moveto -<8529> -[28 0] -xshow -376 1393 moveto -<736F757263655C61636D5C737263> -[28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -976 1393 moveto -<432D626173656420666C696768742073696D756C61746F7220636F6465> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 0] -xshow -376 1468 moveto -<736F757263655C61636D5C565C6C6962> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -976 1468 moveto -<546865203344206772617068696373206C696272617279> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -376 1543 moveto -<736F757263655C61636D5C565C74657374> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -376 1618 moveto -<736F757263655C61636D5C6469735C6C6962> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -1126 1618 moveto -<546865204449532F7820494545452031323738206C696272617279> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -376 1693 moveto -<736F757263655C61636D5C6469735C74657374> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -376 1769 moveto -<736F757263655C61636D5C6469735C64697367656E> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -976 1769 moveto -<4945454520313237382070726F746F636F6C20636F6D70696C6572> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -376 1844 moveto -<736F757263655C61636D5C746F6F6C73> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -976 1844 moveto -<566172696F757320696E6672657175656E746C79207573656420746F6F6C20736F7572636573> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 0] -xshow -376 1919 moveto -<736F757263655C696E636C756465> -[28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -976 1919 moveto -<537570706C656D656E74616C2073797374656D206865616465722066696C6573> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 0] -xshow -376 1994 moveto -<736F757263655C6F6E63727063> -[28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -976 1994 moveto -<412057696E646F777320706F7274206F662053756E9273204F4E4320525043206C696272617269 -6573> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -376 2069 moveto -<736F757263655C72706367656E> -[28 27 28 27 28 27 28 27 28 27 28 27 0] -xshow -976 2069 moveto -<412057696E646F777320706F7274206F662053756E92732052504347454E20636F6D6D616E64> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 0] -xshow -376 3343 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<41434D20666F7220554E495820616E642057696E646F7773> -[24 27 32 10 9 22 12 11 27 28 9 26 10 21 21 21 10 37 7 21 21 20 27 0] -xshow -1255 3343 moveto -<3237> -[20 0] -xshow -1962 3343 moveto -<30362F31302F3036> -[21 21 9 21 21 10 21 0] -xshow -grestore grestore -showpage -%%PageTrailer - -%%Page: 28 28 -%%PageBoundingBox: 0 0 595 842 -%%BeginPageSetup -% -%%EndPageSetup -gsave -[0.24 0 0 -0.24 0 842] concat -gsave -376 422 moveto -0 0 0.50196 setrgbcolor -(Helvetica-iso1252) cvn findfont 68 -68 matrix scale makefont setfont -<446576656C6F7065722053747564696F20536574757020> -[46 32 29 35 13 34 35 34 20 17 42 16 34 36 12 35 17 41 34 16 34 35 0] -xshow -1040 422 moveto -(Helvetica-iso1252) cvn findfont 38 -38 matrix scale makefont setfont -<2841434D20666F722057696E646F7773206F6E6C7929> -[11 22 24 29 10 8 20 11 10 33 6 19 19 19 25 17 9 19 20 6 18 0] -xshow -376 575 moveto -0 0 0 setrgbcolor -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<312E> -[20 0] -xshow -451 575 moveto -<496E7374616C6C207468697320736F6674776172652028696620796F7520617265207265616469 -6E6720746869732C207468656E20796F75206861766520616C726561647920646F6E652074686174 -292E> -[10 21 20 9 22 8 8 11 10 21 8 19 11 19 21 11 9 28 21 12 21 10 12 9 10 11 18 21 21 - 10 21 12 21 10 13 20 21 22 7 21 21 11 10 22 7 19 11 10 10 21 22 21 10 18 21 21 - 10 21 20 18 21 11 21 8 12 21 21 21 19 10 21 21 21 20 11 10 21 22 10 13 0] -xshow -376 657 moveto -<322E> -[22 0] -xshow -451 657 moveto -<456E737572652056697375616C20432B2B20352E3020686173206265656E20696E7374616C6C65 -64> -[26 20 19 21 12 21 11 25 8 18 21 22 8 10 28 21 22 11 21 10 21 10 21 21 19 10 21 - 21 21 21 10 8 21 19 10 22 8 8 21 0] -xshow -376 739 moveto -<332E> -[22 0] -xshow -451 739 moveto -<496E7374616C6C20746865204469726563745820536F66747761726520446576656C6F706D656E -74204B69742E> -[10 21 20 9 22 8 8 11 10 21 21 11 28 7 12 21 19 10 25 11 25 22 10 9 28 21 12 21 - 10 28 20 18 21 8 21 20 32 21 21 10 11 26 7 11 0] -xshow -376 820 moveto -<342E> -[22 0] -xshow -451 820 moveto -<5365766572616C206469726563746F7269657320696E636C7564656420696E2074686520736F75 -7263652072656C65617365206D75737420626520616464656420746F207468652064656661756C74 -20736561726368206469726563746F726965732E> -[26 20 18 21 12 21 8 11 21 8 12 21 19 10 21 13 7 21 19 11 7 22 19 8 21 21 21 21 - 10 8 21 11 10 21 21 10 19 21 21 12 19 21 11 11 22 7 21 22 18 21 11 31 21 19 10 - 11 20 21 11 21 20 21 21 21 11 9 22 10 10 21 21 11 21 21 9 21 22 8 10 11 19 20 21 - 12 19 21 11 21 8 12 21 19 10 21 13 7 22 18 0] -xshow -451 878 moveto -<46726F6D2074686520> -[22 12 20 32 11 10 21 21 0] -xshow -610 878 moveto -(Helvetica-Bold-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<546F6F6C733E4F7074696F6E7385> -[20 23 24 9 21 22 30 23 13 9 23 24 20 0] -xshow -909 878 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<206D656E7520696E20446576656C6F7065722053747564696F2073656C6563742074686520> -[11 31 21 21 21 10 8 21 11 27 20 18 21 8 21 21 21 13 10 26 9 21 22 7 22 10 19 21 - 8 21 19 10 11 10 21 21 0] -xshow -1532 878 moveto -(Helvetica-Bold-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<4469726563746F72696573> -[28 10 15 20 22 11 24 14 10 21 0] -xshow -1728 878 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<207461622E202053656C65637420> -[10 10 22 22 9 11 10 25 22 7 21 19 11 0] -xshow -1937 878 moveto -(Helvetica-Bold-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<496E636C756465> -[10 24 20 10 23 23 0] -xshow -451 938 moveto -<66696C6573> -[13 10 10 21 0] -xshow -526 938 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<20696E2074686520> -[10 8 21 11 10 21 21 0] -xshow -639 938 moveto -(Helvetica-Bold-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<53686F77204469726563746F7269657320666F723A> -[25 23 22 29 11 28 10 14 21 21 12 23 15 9 22 21 10 11 24 14 0] -xshow -1017 938 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<20626F782E2020446F75626C6520636C69636B2074686520656D70747920656E74727920617420 -74686520> -[11 21 20 20 9 11 10 27 21 21 21 8 21 10 20 8 8 18 20 10 10 21 21 11 20 32 21 10 - 19 11 20 22 10 13 19 11 21 10 10 10 21 22 0] -xshow -1707 938 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<626F74746F6D> -[23 23 12 12 23 0] -xshow -1833 938 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<206F66207468652063757272656E74> -[10 22 10 10 10 21 21 11 18 21 13 11 22 21 0] -xshow -451 995 moveto -<6C69737420616E64206164642074686520> -[9 7 20 10 11 20 21 21 11 20 21 21 11 10 21 21 0] -xshow -716 995 moveto -(Courier-Bold-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<633A5C736F75726365735C696E636C756465> -[27 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -1211 995 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<206469726563746F727920962061646A75737420746865206469726563746F7279206E616D6520 -746F207375697420746865> -[10 22 7 12 21 19 10 21 13 19 11 21 10 21 21 8 21 19 10 11 10 21 21 10 22 7 12 21 - 19 10 21 14 19 10 21 20 32 21 11 9 22 10 19 21 8 11 10 10 21 0] -xshow -451 1052 moveto -<636F72726563742041434D20666F722057696E646F777320736F7572636520696E7374616C6C61 -74696F6E206C6F636174696F6E206F6E20796F75722073797374656D2E> -[19 21 12 12 21 20 10 10 24 27 31 11 9 22 12 11 36 7 21 21 20 28 18 11 18 21 22 - 11 19 21 11 7 22 19 10 21 8 8 22 10 8 21 21 11 7 22 18 22 10 8 21 21 11 20 21 11 - 18 21 21 12 11 18 19 18 10 21 32 0] -xshow -376 1135 moveto -<352E> -[22 0] -xshow -451 1135 moveto -<46726F6D2074686520> -[22 12 20 32 11 10 21 21 0] -xshow -610 1135 moveto -(Helvetica-Bold-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<546F6F6C733E4F7074696F6E7385> -[20 23 24 9 21 22 30 23 13 9 23 24 20 0] -xshow -909 1135 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<206D656E7520696E20446576656C6F7065722053747564696F2073656C6563742074686520> -[11 31 21 21 21 10 8 21 11 27 20 18 21 8 21 21 21 13 10 26 9 21 22 7 22 10 19 21 - 8 21 19 10 11 10 21 21 0] -xshow -1532 1135 moveto -(Helvetica-Bold-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<4469726563746F72696573> -[28 10 15 20 22 11 24 14 10 21 0] -xshow -1728 1135 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<207461622E202053656C656374> -[10 10 22 22 9 11 10 25 22 7 21 19 0] -xshow -451 1194 moveto -(Helvetica-Bold-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<45786563757461626C652066696C6573> -[26 20 21 20 24 12 21 23 10 22 10 12 11 10 21 0] -xshow -735 1194 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<20696E2074686520> -[10 8 22 10 10 21 21 0] -xshow -848 1194 moveto -(Helvetica-Bold-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<53686F77204469726563746F7269657320666F723A> -[25 23 22 30 10 28 10 14 21 21 12 23 15 10 21 21 10 12 23 14 0] -xshow -1225 1194 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<20626F782E2020446F75626C6520636C69636B2074686520656D70747920656E74727920617420 -74686520> -[10 21 20 21 8 11 10 28 20 22 20 8 21 11 19 8 8 19 19 10 10 22 21 10 20 32 22 9 - 19 11 21 21 10 13 20 10 21 10 11 10 21 21 0] -xshow -1915 1194 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<626F74746F6D> -[22 24 12 11 23 0] -xshow -2042 1194 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<206F66> -[10 22 0] -xshow -451 1252 moveto -<7468652063757272656E74206C69737420616E64206164642074686520> -[10 21 22 10 19 21 12 12 21 21 11 10 8 8 19 11 10 21 21 21 10 21 21 21 10 10 22 - 21 0] -xshow -906 1252 moveto -(Courier-Bold-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<633A5C62696E> -[28 27 28 27 28 0] -xshow -1071 1252 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<206469726563746F727920962061646A75737420746865206469726563746F7279206E616D6520 -746F20737569742074686520636F72726563742041434D> -[11 21 8 12 21 19 9 22 13 19 10 21 11 21 21 7 21 20 10 10 10 21 22 10 21 8 12 21 - 19 10 21 13 19 11 20 21 32 21 10 10 21 11 18 22 8 10 11 10 21 21 10 19 21 12 12 - 21 19 11 10 24 27 0] -xshow -451 1309 moveto -<666F722057696E646F777320736F7572636520696E7374616C6C6174696F6E206C6F636174696F -6E206F6E20796F75722073797374656D2E> -[9 22 13 10 37 7 21 21 20 27 19 10 19 21 21 12 19 21 10 8 21 19 10 22 8 8 21 11 - 7 21 22 10 8 21 19 21 11 7 22 21 10 21 21 10 18 21 22 12 10 19 18 19 10 20 33 0] -xshow -376 1393 moveto -<362E> -[22 0] -xshow -451 1393 moveto -<446F75626C6520636C69636B2074686520656D70747920656E7472792061742074686520> -[28 21 21 20 8 22 10 19 8 8 19 19 11 10 21 21 10 21 32 21 10 19 10 21 21 10 14 19 - 10 21 10 11 10 21 21 0] -xshow -1039 1393 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<626F74746F6D> -[22 24 12 11 23 0] -xshow -1166 1393 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<206F66207468652063757272656E74206C69737420616E642061646420746865> -[10 22 10 10 10 21 22 10 19 21 12 12 21 21 10 11 8 8 19 10 11 21 21 21 10 21 21 - 21 10 10 21 0] -xshow -451 1450 moveto -(Courier-Bold-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<633A5C445853444B5C73646B5C696E63> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -891 1450 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<206469726563746F727920962061646A75737420746865206469726563746F7279206E616D6520 -746F20737569742074686520636F7272656374204469726563745820536F667477617265> -[11 21 8 12 21 19 10 21 13 19 11 20 11 21 21 8 21 19 10 10 10 22 21 10 21 8 12 21 - 19 10 21 14 19 10 21 20 32 21 10 10 21 11 19 21 8 10 11 10 21 21 10 19 21 12 12 - 21 20 10 10 28 8 12 20 20 9 26 10 26 21 11 9 28 21 11 0] -xshow -451 1507 moveto -<446576656C6F706D656E74204B697420696E7374616C6C6174696F6E206C6F636174696F6E206F -6E20796F75722073797374656D2E20> -[28 20 18 21 8 21 20 32 21 21 10 11 26 8 10 10 8 21 19 10 22 8 7 22 10 8 21 21 11 - 8 21 19 21 11 7 21 21 11 21 21 10 18 21 21 13 10 19 18 19 10 20 34 8 0] -xshow -1338 1507 moveto -(Helvetica-Oblique-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<55736520746865206172726F77206B65797320746F206D6F76652074686973206974656D20746F -20746865> -[27 19 21 10 10 21 21 11 21 11 12 20 28 10 18 20 18 19 10 10 21 11 31 21 17 21 10 - 10 22 8 19 10 8 10 21 32 10 10 21 10 10 21 0] -xshow -1338 1511 712 2 rectfill -451 1564 moveto -<746F70206F6620746865206469726563746F7279206C697374> -[10 21 21 10 22 10 10 10 21 21 11 21 8 12 21 18 10 21 14 18 11 8 8 19 0] -xshow -451 1568 366 2 rectfill -817 1564 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<2E2020496620796F7520646F206E6F7420646F20746869732C2056697375616C20432B2B207769 -6C6C20696E636F72726563746C79207573652074686520446972656374582076657273696F6E2032> -[11 10 11 10 11 10 18 21 21 10 21 21 11 20 22 10 10 21 21 10 10 22 8 19 10 11 25 - 8 18 21 22 8 10 28 21 22 11 28 8 8 8 10 8 21 19 21 13 11 22 19 10 8 19 10 21 19 - 21 10 10 21 22 10 28 7 12 21 20 9 26 10 18 22 11 20 7 22 21 10 0] -xshow -451 1621 moveto -<696E636C7564652066696C65732074686174207368697070656420776974682056432B2B20352E -302E> -[8 21 20 7 21 22 21 10 10 9 7 21 19 11 10 21 22 10 10 19 21 8 21 21 21 21 10 28 - 8 10 21 11 24 27 21 22 11 21 10 21 0] -xshow -376 1704 moveto -<372E> -[20 0] -xshow -451 1704 moveto -<46726F6D2074686520> -[22 12 20 32 11 10 21 21 0] -xshow -610 1704 moveto -(Helvetica-Bold-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<546F6F6C733E4F7074696F6E7385> -[20 23 24 9 21 22 30 23 13 9 23 24 20 0] -xshow -909 1704 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<206D656E7520696E20446576656C6F7065722053747564696F2073656C6563742074686520> -[11 31 21 21 21 10 8 21 11 27 20 18 21 8 21 21 21 13 10 26 9 21 22 7 22 10 19 21 - 8 21 19 10 11 10 21 21 0] -xshow -1532 1704 moveto -(Helvetica-Bold-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<4469726563746F72696573> -[28 10 15 20 22 11 24 14 10 21 0] -xshow -1728 1704 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<207461622E202053656C65637420> -[10 10 22 22 9 11 10 25 22 7 21 19 11 0] -xshow -1937 1704 moveto -(Helvetica-Bold-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<4C696272617279> -[24 9 24 14 21 15 0] -xshow -451 1763 moveto -<66696C6573> -[13 10 10 21 0] -xshow -526 1763 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<20696E2074686520> -[10 8 21 11 10 21 21 0] -xshow -639 1763 moveto -(Helvetica-Bold-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<53686F77204469726563746F7269657320666F723A> -[25 23 22 29 11 28 10 14 21 21 12 23 15 9 22 21 10 11 24 14 0] -xshow -1017 1763 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<20626F782E2020446F75626C6520636C69636B2074686520656D70747920656E74727920617420 -74686520> -[11 21 20 20 9 11 10 27 21 21 21 8 21 10 20 8 8 18 20 10 10 21 21 11 20 32 21 10 - 19 11 20 22 10 13 19 11 21 10 10 10 21 22 0] -xshow -1707 1763 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<626F74746F6D> -[23 23 12 12 23 0] -xshow -1833 1763 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<206F66207468652063757272656E74> -[10 22 10 10 10 21 21 11 18 21 13 11 22 21 0] -xshow -451 1821 moveto -<6C69737420616E64206164642074686520> -[9 7 20 10 11 20 21 21 11 20 21 21 11 10 21 21 0] -xshow -716 1821 moveto -(Courier-Bold-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<633A5C445853444B5C73646B5C6C696220> -[27 27 28 27 28 27 28 27 28 27 28 27 28 27 28 28 0] -xshow -1184 1821 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<6469726563746F727920962061646A75737420746865206469726563746F7279206E616D652074 -6F20737569742074686520636F7272656374> -[21 8 12 21 19 10 21 14 18 11 21 10 21 22 7 21 19 10 11 10 21 21 10 22 7 12 22 19 - 9 21 14 19 10 21 21 32 20 11 9 22 10 19 21 8 10 11 10 21 21 11 18 22 12 12 21 19 0] -xshow -451 1878 moveto -<4469726563745820536F66747761726520446576656C6F706D656E74204B697420696E7374616C -6C6174696F6E206C6F636174696F6E206F6E20796F75722073797374656D2E20> -[28 8 12 21 19 9 26 11 25 21 11 9 28 21 12 21 10 28 20 17 22 7 21 21 32 21 21 10 - 11 25 8 10 11 8 21 19 10 21 9 7 22 10 8 21 21 11 7 22 18 22 10 8 21 21 11 21 20 - 11 18 21 21 12 11 18 19 19 9 21 34 8 0] -xshow -1629 1878 moveto -(Helvetica-Oblique-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<55736520746865206172726F77206B65797320746F206D6F7665> -[27 19 21 10 10 21 21 11 21 11 12 20 28 10 18 20 18 19 10 10 21 10 32 21 17 0] -xshow -1629 1882 459 2 rectfill -451 1935 moveto -<74686973206974656D20746F2074686520746F70206F6620746865206469726563746F7279206C -697374> -[10 22 7 20 10 8 10 20 33 10 10 21 10 10 21 21 11 10 20 21 11 21 10 11 9 22 21 10 - 22 7 12 21 19 10 21 13 19 10 8 8 19 0] -xshow -451 1939 620 2 rectfill -1070 1935 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<2E2020496620796F7520646F206E6F7420646F20746869732C2056697375616C20432B2B207769 -6C6C20696E636F72726563746C792075736520746865> -[10 10 11 10 11 10 18 21 21 11 20 21 11 21 21 10 10 21 21 11 10 21 8 19 11 10 26 - 7 19 21 21 8 11 27 22 21 11 28 8 8 8 11 7 21 19 22 12 12 21 19 10 8 19 11 20 19 - 21 11 9 22 0] -xshow -451 1992 moveto -<446972656374582076657273696F6E2032206C6962726172792066696C65732074686174207368 -697070656420776974682056432B2B20352E302E> -[28 8 12 21 19 9 26 11 17 22 12 19 8 21 21 11 20 11 8 8 22 11 22 13 19 11 10 8 8 - 21 19 11 10 21 21 10 11 19 21 7 21 22 20 21 11 28 8 9 22 10 24 27 22 22 10 22 9 - 22 0] -xshow -376 2074 moveto -<382E> -[22 0] -xshow -451 2074 moveto -<4F70656E20746865206D61696E2041434D20666F722057696E646F77732056432B2B20776F726B -73706163652E204974206973206E616D6564> -[30 21 20 21 11 10 21 21 11 31 21 8 21 10 24 27 32 10 9 22 13 10 36 7 22 21 19 28 - 19 10 24 27 22 22 10 27 21 12 19 19 20 21 19 22 10 10 10 11 10 8 19 11 21 20 32 - 21 0] -xshow -451 2125 moveto -(Courier-Bold-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<5C736F757263655C61636D5C70635C61636D2E647377> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -376 2288 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<54686520626173696320776F726B737061636520696E636C7564657320666976652070726F6A65 -6374733A> -[24 20 21 11 21 20 20 7 19 11 27 21 12 18 19 21 21 18 22 10 8 21 19 8 21 21 21 19 - 10 11 8 18 21 10 21 12 22 7 21 19 10 20 0] -xshow -376 2452 moveto -<61636D> -[21 19 0] -xshow -526 2452 moveto -<5C736F757263655C61636D5C70635C61636D2E647370> -[10 19 21 21 13 18 22 10 21 18 32 10 21 19 10 21 18 33 10 21 18 0] -xshow -1276 2452 moveto -<546865206D61696E2070726F6772616D> -[24 20 21 11 31 22 7 21 10 22 11 21 21 12 21 0] -xshow -376 2534 moveto -<6673696D> -[10 20 7 0] -xshow -526 2534 moveto -<5C736F757263655C61636D5C7372635C6673696D2E647370> -[10 19 21 21 13 18 22 10 21 18 32 10 19 12 19 11 10 19 7 33 9 22 18 0] -xshow -1276 2534 moveto -<74686520666C696768742073696D756C6174696F6E206C696272617279> -[10 21 22 10 10 9 8 21 21 10 11 19 7 32 22 7 22 10 8 21 21 10 9 8 21 12 21 14 0] -xshow -376 2615 moveto -<766C6962> -[20 8 7 0] -xshow -526 2615 moveto -<5C736F757263655C61636D5C565C6C69625C766C69622E647370> -[10 19 21 21 13 18 22 10 21 18 32 10 26 10 8 8 22 9 20 8 8 21 10 21 19 0] -xshow -1276 2615 moveto -<746865203344206772617068696373206C696272617279> -[10 21 22 10 21 27 11 21 12 20 22 21 8 19 19 10 8 8 22 12 21 13 0] -xshow -376 2697 moveto -<646973> -[22 7 0] -xshow -526 2697 moveto -<5C736F757263655C61636D5C6469735C6C69625C6469732E647370> -[10 19 21 21 13 18 22 10 21 18 32 10 22 7 20 10 8 8 21 10 22 8 19 10 21 19 0] -xshow -1126 2697 moveto -<7468652049454545203132373820444953206C696272617279> -[10 21 22 10 10 25 26 25 10 20 20 20 20 11 28 9 25 11 8 8 22 11 22 13 0] -xshow -376 2779 moveto -<64697367656E> -[22 7 19 21 21 0] -xshow -526 2779 moveto -<5C736F757263655C61636D5C6469735C64697367656E5C64697367656E2E647370> -[10 19 21 21 13 18 22 10 21 18 32 10 22 7 20 9 22 8 19 20 22 21 10 21 8 19 21 21 - 21 10 21 19 0] -xshow -1276 2779 moveto -<6120444953206865616465722066696C652067656E657261746F72> -[21 11 28 9 25 11 21 20 21 21 22 12 10 10 9 8 21 11 20 21 21 22 11 22 9 22 0] -xshow -376 3095 moveto -0 0 0.50196 setrgbcolor -(Helvetica-iso1252) cvn findfont 68 -68 matrix scale makefont setfont -<4275696C64696E672041434D206F6E20554E49582053797374656D73> -[42 35 13 12 36 12 34 35 17 39 44 52 17 34 34 18 44 46 15 41 17 42 30 30 16 33 53 0] -xshow -376 3343 moveto -0 0 0 setrgbcolor -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<41434D20666F7220554E495820616E642057696E646F7773> -[24 27 32 10 9 22 12 11 27 28 9 26 10 21 21 21 10 37 7 21 21 20 27 0] -xshow -1255 3343 moveto -<3238> -[20 0] -xshow -1962 3343 moveto -<30362F31302F3036> -[21 21 9 21 21 10 21 0] -xshow -grestore grestore -showpage -%%PageTrailer - -%%Page: 29 29 -%%PageBoundingBox: 0 0 595 842 -%%BeginPageSetup -% -%%EndPageSetup -gsave -[0.24 0 0 -0.24 0 842] concat -gsave -376 334 moveto -0 0 0 setrgbcolor -(Courier-iso1252) cvn findfont 42 -42 matrix scale makefont setfont -<41434D2063616E20626520646F776E6C6F616465642066726F6D20746865205765622053696D75 -6C6174696F6E732073697465> -[25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 - 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0] -xshow -376 380 moveto -<28> -show -401 380 moveto -0 0 1 setrgbcolor -<7777772E77656273696D756C6174696F6E732E636F6D> -[25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0] -xshow -401 383 550 2 rectfill -951 380 moveto -0 0 0 setrgbcolor -<29206173206120677A69707065642074617220617263686976652E2020557061636B2074686520 -736F75726365> -[25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 - 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0] -xshow -376 425 moveto -<747265653A> -[25 25 25 25 0] -xshow -526 517 moveto -<24207A6361742061636D2D352E302E7461722E677A207C20746172207876662096> -[25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 - 25 25 25 25 25 0] -xshow -376 608 moveto -<546F206275696C642041434D2C20747970653A> -[25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0] -xshow -526 699 moveto -<242063642061636D2D352E30> -[25 25 25 25 25 25 25 25 25 25 25 0] -xshow -526 745 moveto -<24202E2F636F6E666967757265> -[25 25 25 25 25 25 25 25 25 25 25 25 0] -xshow -526 790 moveto -<24206D616B65> -[25 25 25 25 25 0] -xshow -376 882 moveto -<4F6E2073797374656D732077686572652058313120697320696E7374616C6C656420696E20616E -20756E757375616C206C6F636174696F6E2C20636F6E666967757265> -[25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 - 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 - 25 25 25 25 25 25 25 25 25 25 25 25 0] -xshow -376 927 moveto -<6D617920686176652074726F75626C65206C6F636174696E6720746865205820696E636C756465 -2066696C657320616E64206C69627261726965732028796F75276C6C> -[25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 - 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 - 25 25 25 25 25 25 25 25 25 25 25 25 0] -xshow -376 973 moveto -<6B6E6F77207468617420626563617573652074686520636F6D70696C65722077696C6C20636F6D -706C61696E20746861742069742063616E27742066696E642066696C6573> -[25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 - 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 - 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0] -xshow -376 1019 moveto -<6C696B6520225831312F582E6822292E20496620746869732070726F626C656D2063726F707320 -75702C20796F752063616E2068656C7020636F6E66696775726520746F> -[25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 - 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 - 25 25 25 25 25 25 25 25 25 25 25 25 25 0] -xshow -376 1064 moveto -<73657420757020746865204D616B6566696C65732062792074656C6C696E672069742077686572 -6520746F2066696E64205831313A> -[25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 - 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0] -xshow -526 1155 moveto -<2420785F696E636C756465733D2F7573722F6D795831312F696E636C7564653B206578706F7274 -20785F696E636C75646573> -[25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 - 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0] -xshow -526 1201 moveto -<2420785F6C69627261726965733D2F7573722F6D795831312F6C69623B206578706F727420785F -6C6962726172696573> -[25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 - 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0] -xshow -526 1247 moveto -<24202E2F636F6E666967757265> -[25 25 25 25 25 25 25 25 25 25 25 25 0] -xshow -526 1292 moveto -<24206D616B65> -[25 25 25 25 25 0] -xshow -376 1384 moveto -<42792064656661756C742C20636F6E6669677572652077696C6C20636F6D70696C652041434D20 -7573696E67206763632069662067636320697320666F756E6420696E> -[25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 - 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 - 25 25 25 25 25 25 25 25 25 25 25 25 0] -xshow -376 1429 moveto -<796F7572205041544820656E7669726F6E6D656E74207661726961626C652E2020536F6D652063 -6F6D62696E6174696F6E73206F662067636320616E64204F53> -[25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 - 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 - 25 25 25 25 25 25 25 25 25 0] -xshow -376 1475 moveto -<706C6174666F726D7320686176652070726F626C656D7320776974682041434D20286763632032 -2E322E32207365656D7320746F20686176652070726F626C656D73206F6E> -[25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 - 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 - 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0] -xshow -376 1520 moveto -<53756E4F5320616E642048502D55582C20666F72206578616D706C65292E20596F752063616E20 -6F7665727269646520636F6E66696775726527732073656C656374696F6E> -[25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 - 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 - 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0] -xshow -376 1566 moveto -<6F66206763633A> -[25 25 25 25 25 25 0] -xshow -526 1657 moveto -<242043433D63633B206578706F7274204343> -[25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0] -xshow -526 1703 moveto -<24202E2F636F6E666967757265> -[25 25 25 25 25 25 25 25 25 25 25 25 0] -xshow -526 1749 moveto -<24206D616B65> -[25 25 25 25 25 0] -xshow -376 3343 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<41434D20666F7220554E495820616E642057696E646F7773> -[24 27 32 10 9 22 12 11 27 28 9 26 10 21 21 21 10 37 7 21 21 20 27 0] -xshow -1255 3343 moveto -<3239> -[20 0] -xshow -1962 3343 moveto -<30362F31302F3036> -[21 21 9 21 21 10 21 0] -xshow -grestore grestore -showpage -%%PageTrailer - -%%Page: 30 30 -%%PageBoundingBox: 0 0 595 842 -%%BeginPageSetup -% -%%EndPageSetup -gsave -[0.24 0 0 -0.24 0 842] concat -gsave -376 422 moveto -0 0 0.50196 setrgbcolor -(Helvetica-iso1252) cvn findfont 68 -68 matrix scale makefont setfont -<446566696E696E67204E6577205363656E6573> -[45 35 16 13 35 12 35 35 17 45 32 45 17 42 30 34 34 35 0] -xshow -376 500 moveto -0 0 0 setrgbcolor -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<546865207363656E652066696C6520646566696E6573207468652076697369626C652041434D20 -93776F726C64942E202049742073686F756C642062652073746F726564206173206120554E495820 -666F726D617420415343494920746578742066696C652E> -[24 20 21 11 18 19 21 21 21 10 11 8 8 21 11 21 21 10 8 21 21 19 10 10 21 21 11 19 - 8 19 8 21 8 21 11 23 27 32 10 12 27 21 13 8 21 14 9 11 10 10 11 11 18 21 21 22 - 7 21 11 20 21 11 19 9 21 12 21 21 11 21 18 11 21 10 27 28 9 26 10 10 21 12 32 22 - 10 10 25 25 28 10 10 11 9 20 20 10 10 11 8 8 21 0] -xshow -376 556 moveto -<5265636F726473206172652064656C696D69746564206279206C696E65207465726D696E61746F -727320284153434949206C696E656665656473292E20204669656C647320696E2061207265636F72 -642061726520736570617261746564206279206F6E65206F72> -[28 21 18 21 12 21 19 10 21 12 21 11 21 21 8 7 33 8 9 22 21 10 20 19 11 8 8 21 21 - 11 9 21 12 33 8 20 22 9 22 12 19 10 12 26 25 28 10 10 10 9 7 22 21 9 21 21 22 18 - 14 9 11 10 24 7 22 7 21 19 10 8 22 10 21 10 12 22 18 22 11 22 10 21 12 21 10 19 - 21 21 21 12 21 10 21 21 10 21 18 11 21 21 20 11 21 0] -xshow -376 613 moveto -<6D6F726520737061636573206F722074616220636861726163746572732E> -[32 21 12 21 10 19 21 21 18 21 19 11 21 12 10 10 21 22 10 19 21 21 12 21 19 10 21 - 13 18 0] -xshow -376 696 moveto -(Helvetica-Bold-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<4E4F54453A> -[28 28 23 26 0] -xshow -493 696 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<205468697320646F63756D656E74206465736372696265732074686520656C656D656E7473206F -6620746865207363656E652066696C6520666F726D61742074686174206172652063757272656E74 -6C7920757365642062792041434D2E> -[11 23 21 8 19 10 21 21 19 20 32 21 21 10 11 20 21 19 19 13 8 21 21 19 10 10 21 - 21 11 21 8 20 32 21 21 10 19 11 21 10 11 9 22 21 10 19 19 21 21 20 11 10 9 7 22 - 10 9 21 13 32 21 10 11 10 21 21 11 10 21 12 21 10 19 21 12 12 21 22 10 8 19 10 - 21 19 21 21 10 20 19 11 23 27 32 0] -xshow -376 754 moveto -<536F6D6520656C656D656E7473206D6179206265207365656E20696E2064697374726962757465 -64207363656E652066696C6573207468617420617265206E6F742070726F63657373656420627920 -7468652063757272656E742076657273696F6E206F66> -[26 20 32 21 10 22 7 21 32 20 22 9 20 10 32 20 18 11 20 21 11 19 20 21 21 11 8 21 - 10 22 7 20 10 12 8 21 21 10 21 21 11 19 18 21 21 21 10 11 8 8 21 19 10 10 22 21 - 10 11 21 12 21 10 21 21 10 10 21 12 21 19 21 19 18 21 21 11 20 19 10 10 21 21 11 - 19 21 12 12 21 21 10 11 18 21 12 19 8 21 21 11 21 0] -xshow -376 811 moveto -<41434D2E2020496E206566666563742C2041434D207472656174732074686F736520756E646F63 -756D656E74656420656C656D656E747320617320636F6D6D656E74732E> -[24 27 34 8 11 10 10 21 11 21 11 9 21 20 10 11 10 23 28 31 11 10 12 21 21 10 19 - 11 10 21 21 19 21 10 21 21 21 21 18 21 32 21 21 9 21 21 11 21 8 20 32 21 21 10 - 19 11 21 18 11 19 20 32 31 21 22 10 18 0] -xshow -376 893 moveto -<4F6E20737461727475702C2041434D2075736573207468652091> -[30 21 10 19 10 21 14 10 21 21 10 11 23 27 32 10 21 19 21 19 10 10 21 21 11 0] -xshow -827 893 moveto -(Courier-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<64656661756C742D7363656E6592> -[28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -1212 893 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<2066696C652066726F6D207468652091> -[11 10 8 8 22 10 10 12 20 33 10 10 21 21 11 0] -xshow -1437 893 moveto -(Courier-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<6F626A656374732F> -[28 27 28 27 28 27 28 0] -xshow -1657 893 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<92206469726563746F72792E20576974682041434D20666F72> -[9 10 22 7 12 21 19 10 21 14 17 9 11 36 8 10 21 11 23 27 32 10 9 22 0] -xshow -376 950 moveto -<554E49582C20796F752063616E206F7665727269646520746869732064656661756C7420627920 -73706563696679696E672074686520912D73207363656E652D66696C652D706174686E616D659220 -6F7074696F6E2E> -[27 28 10 26 10 10 18 21 21 10 19 21 21 10 21 18 21 12 13 7 22 21 10 10 22 7 20 - 10 21 22 8 22 21 8 11 10 20 19 11 18 21 21 19 8 10 20 8 20 22 10 10 21 21 11 8 - 13 19 10 19 18 21 21 21 13 10 8 8 22 12 21 21 10 21 21 20 32 23 6 11 21 21 10 8 - 21 21 0] -xshow -376 1031 moveto -<5468652067656E6572616C20666F726D6174206F66207468652066696C6520666F6C6C6F777320 -74686973206C61796F75743A> -[24 20 21 11 21 20 22 21 11 22 8 10 9 22 12 32 21 11 10 21 10 11 10 21 21 11 10 - 8 8 21 11 9 22 8 8 20 28 19 10 10 22 7 20 10 8 20 18 21 21 10 0] -xshow -526 1195 moveto -<3C7465616D2031206C6F636174696F6E207265636F72643E> -[22 10 21 21 32 10 21 10 8 21 19 22 10 8 21 21 10 12 21 19 21 12 21 0] -xshow -526 1277 moveto -<3C7465616D2032206C6F636174696F6E207265636F72643E> -[22 10 21 21 32 10 21 10 8 21 19 22 10 8 21 21 10 12 21 19 21 12 21 0] -xshow -526 1359 moveto -<3C67726F756E6420636F6C6F72207265636F72643E> -[22 21 12 21 21 21 21 10 19 22 7 22 12 10 12 21 19 21 12 21 0] -xshow -526 1441 moveto -<3C72756E7761792F4E4156414944207265636F7264733E> -[22 13 20 21 27 20 19 9 28 23 22 26 9 28 10 12 21 19 21 12 21 19 0] -xshow -526 1516 moveto -(Courier-Bold-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<4645415455524553> -[28 27 28 27 28 27 28 0] -xshow -526 1598 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<3C6F626A6563742F66656174757265207265636F7264733E> -[22 21 22 7 21 19 11 11 8 22 21 10 21 12 21 11 11 22 18 21 12 21 19 0] -xshow -376 1735 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 45 -45 matrix scale makefont setfont -<5465616D204C6F636174696F6E73> -[23 22 22 37 12 25 25 23 23 13 11 25 25 0] -xshow -376 1807 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<41434D2067726F757073207061727469636970616E74732028706C61796572732920696E746F20 -74776F207465616D732E2020546865207363656E652066696C6520646566696E6573207468652069 -6E697469616C206C6F636174696F6E20666F722065616368> -[24 27 32 10 21 12 21 21 21 18 11 21 21 14 10 8 19 8 21 21 21 10 19 11 12 21 8 20 - 18 22 12 19 12 11 8 21 10 21 10 10 27 21 11 10 21 20 33 19 9 11 10 23 21 21 10 - 19 19 21 21 21 10 11 8 7 22 10 21 21 11 7 21 21 19 11 10 21 21 10 8 22 8 11 7 22 - 8 11 7 22 18 22 10 8 21 21 11 8 22 13 10 21 21 19 0] -xshow -376 1864 moveto -<7465616D2E20205479706963616C6C792C2074686973206C6F636174696F6E2077696C6C206265 -20706F736974696F6E656420616E64206F7269656E7465642061742074686520656E64206F662061 -2072756E7761792061742074686520706C617965729273> -[10 21 21 33 9 11 10 19 19 21 8 19 21 8 9 16 11 10 10 22 7 20 10 8 21 19 21 11 7 - 21 22 10 28 8 8 8 10 21 21 11 21 21 19 8 10 8 21 21 21 21 11 20 21 21 11 21 13 - 7 21 21 10 21 21 11 21 10 10 10 22 21 10 21 21 21 10 22 10 10 21 10 13 21 20 27 - 20 19 10 21 11 10 10 21 21 11 21 8 20 18 21 14 6 0] -xshow -376 1920 moveto -<93686F6D659420616972706F72742E> -[12 22 20 32 22 11 11 21 8 13 21 21 13 11 0] -xshow -376 2003 moveto -(Helvetica-Bold-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<4578616D706C65> -[25 21 20 35 23 10 0] -xshow -376 2080 moveto -(Courier-Bold-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<33322D35382D31382E3739384E203039362D35302D31362E36303457203634342E3020313534> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 0] -xshow -376 2162 moveto -(Helvetica-Bold-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<4669656C6473> -[24 9 22 10 23 0] -xshow -376 2245 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<4C61746974756465> -[21 21 11 8 10 21 21 0] -xshow -376 2327 moveto -<4C6F6E676974756465> -[21 21 21 21 8 10 22 20 0] -xshow -376 2409 moveto -<416C746974756465202866742C204D534C29> -[26 8 10 8 10 22 21 21 10 13 11 10 11 10 32 25 21 0] -xshow -376 2491 moveto -<496E697469616C2048656164696E672028646567726565732C207472756529> -[10 22 8 11 7 22 8 11 27 21 20 22 7 21 22 10 12 21 21 21 12 21 21 19 10 11 10 12 - 21 22 0] -xshow -376 2628 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 45 -45 matrix scale makefont setfont -<47726F756E6420436F6C6F72> -[33 14 25 26 25 25 11 30 26 10 25 0] -xshow -376 2699 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<416E205831312D7374796C6520> -[26 20 11 23 20 20 12 19 10 19 8 21 0] -xshow -595 2699 moveto -(Courier-Bold-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<282352524747424229> -[27 27 28 27 28 27 28 27 0] -xshow -843 2699 moveto -(Courier-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<20> -show -870 2699 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<636F6C6F722073706563696669636174696F6E20646566696E696E672074686520636F6C6F7220 -6F66207468652067726F756E642E20205265642C20677265656E20616E6420626C7565> -[18 22 7 22 12 10 19 21 21 19 8 11 7 19 22 10 8 21 21 11 20 22 10 7 22 8 21 21 10 - 10 21 22 10 19 21 8 21 13 10 21 10 11 10 21 21 11 20 12 21 21 21 22 9 11 10 28 - 20 22 10 10 21 12 21 21 21 10 21 21 21 10 21 8 21 0] -xshow -376 2756 moveto -<636F6C6F7220636F6D706F6E656E7473206172652068657861646563696D616C2076616C756520 -66726F6D20303020746F2046462E> -[19 22 7 21 13 10 19 20 33 20 21 21 21 22 9 19 11 21 11 22 10 21 20 18 21 21 21 - 19 7 32 22 8 10 18 22 7 21 21 11 10 12 20 32 11 21 21 10 10 21 11 23 18 0] -xshow -376 2894 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 45 -45 matrix scale makefont setfont -<52756E776179207265636F7264> -[30 25 24 32 22 23 11 15 23 23 26 14 0] -xshow -376 2948 moveto -(Courier-Bold-iso1252) cvn findfont 33 -33 matrix scale makefont setfont -<5257592041444D2031372F3335203736322036383739203135302033342D31382D34332E303734 -4E203039372D30312D32342E353330572033342D31372D33352E3033314E203039372D30312D3235 -2E31333057> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 0] -xshow -376 2985 moveto -<34393520383330> -[20 20 20 20 20 20 0] -xshow -376 3064 moveto -(Helvetica-Bold-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<4669656C6473> -[24 9 22 10 23 0] -xshow -376 3147 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<5265636F7264204964656E7469666965723A209152575992> -[28 21 18 21 12 21 11 9 22 21 21 10 8 11 7 21 15 9 10 8 26 36 26 0] -xshow -376 3343 moveto -<41434D20666F7220554E495820616E642057696E646F7773> -[24 27 32 10 9 22 12 11 27 28 9 26 10 21 21 21 10 37 7 21 21 20 27 0] -xshow -1255 3343 moveto -<3330> -[20 0] -xshow -1962 3343 moveto -<30362F31302F3036> -[21 21 9 21 21 10 21 0] -xshow -grestore grestore -showpage -%%PageTrailer - -%%Page: 31 31 -%%PageBoundingBox: 0 0 595 842 -%%BeginPageSetup -% -%%EndPageSetup -gsave -[0.24 0 0 -0.24 0 842] concat -gsave -376 344 moveto -0 0 0 setrgbcolor -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<54687265652F466F7572206C657474657220616972706F727420636F6465> -[24 20 12 21 22 9 23 21 21 12 11 7 22 10 10 21 12 11 21 8 13 21 20 14 10 11 19 21 - 20 0] -xshow -376 426 moveto -<52756E776179206964656E746966696572> -[28 20 21 27 19 19 11 7 22 21 21 10 9 10 7 22 0] -xshow -376 508 moveto -<52756E77617920416C746974756465202866742C204D534C29> -[28 20 21 27 19 19 11 25 8 11 8 10 21 21 21 10 14 10 11 10 11 31 25 21 0] -xshow -376 590 moveto -<4E65617220456E64204C61746974756465> -[28 21 21 12 10 25 21 21 11 21 21 10 8 10 21 21 0] -xshow -376 671 moveto -<4E65617220456E64204C6F6E676974756465> -[28 21 21 12 10 25 21 21 11 21 20 21 22 8 10 21 21 0] -xshow -376 753 moveto -<5265636970726F63616C20456E64204C61746974756465> -[28 21 18 8 21 12 21 19 21 8 11 25 21 21 10 21 21 10 9 9 22 20 0] -xshow -376 835 moveto -<5265636970726F63616C20456E64204C6F6E676974756465> -[28 21 18 8 21 12 21 19 21 8 11 25 21 21 10 21 21 21 21 8 10 21 21 0] -xshow -376 917 moveto -<4E65617220456E6420646973706C61636564207468726573686F6C64> -[28 21 21 12 10 25 21 21 11 21 8 18 22 7 22 18 21 21 11 10 21 12 21 19 21 21 8 0] -xshow -376 999 moveto -<5265636970726F63616C20456E6420646973706C61636564205468726573686F6C64> -[28 21 18 8 21 12 21 19 21 8 11 25 21 21 10 21 8 19 21 8 21 19 20 22 10 23 21 12 - 21 19 20 22 7 0] -xshow -376 1189 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 45 -45 matrix scale makefont setfont -<544143414E205265636F7264> -[21 28 29 30 29 12 30 22 23 25 15 0] -xshow -376 1243 moveto -(Courier-Bold-iso1252) cvn findfont 33 -33 matrix scale makefont setfont -<4E4156204E424520544143414E2033322D34342D30352E3135324E203039362D35382D30302E32 -3131572034363320303845203130382E332030323058> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 0] -xshow -376 1322 moveto -(Helvetica-Bold-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<4669656C6473> -[24 9 22 10 23 0] -xshow -376 1405 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<5265636F7264204964656E7469666965723A20914E415692> -[28 21 18 21 12 21 11 9 22 21 21 10 8 11 7 21 15 9 10 8 27 23 26 0] -xshow -376 1487 moveto -<54687265652F466F7572204C6574746572206964656E746966696572> -[24 20 12 21 22 9 23 21 21 12 11 20 22 9 10 22 12 10 8 21 21 22 10 8 11 7 22 0] -xshow -376 1569 moveto -<4E415641494420547970653A2091544143414E92> -[28 22 22 26 9 28 10 19 19 21 23 9 10 9 18 24 27 25 28 0] -xshow -376 1651 moveto -<4C61746974756465> -[21 21 11 8 10 21 21 0] -xshow -376 1733 moveto -<5472616E736D6974746572204C6F6E676974756465> -[20 12 21 21 18 33 8 10 10 21 12 11 21 21 21 21 8 10 21 21 0] -xshow -376 1815 moveto -<5472616E736D697474657220416C746974756465202866742C204D534C29> -[20 12 21 21 18 33 8 10 10 21 12 11 25 8 11 8 10 21 21 21 11 13 10 11 10 11 31 25 - 22 0] -xshow -376 1896 moveto -<4D61676E6574696320766172696174696F6E2061742073746174696F6E20286465677265657320 -65617374206F72207765737429> -[32 21 21 20 21 11 7 19 11 18 21 13 7 22 10 8 21 21 11 21 10 11 19 9 22 10 8 21 - 21 11 12 21 21 21 12 21 21 19 10 21 21 19 10 10 22 12 10 27 21 19 10 0] -xshow -376 1978 moveto -<564846204672657175656E637920284D487A29> -[25 28 23 10 21 13 20 21 21 21 21 19 19 10 12 32 27 19 0] -xshow -376 2060 moveto -<544143414E206368616E6E656C206E756D626572> -[19 23 28 25 27 10 19 21 21 21 21 21 8 11 20 21 32 21 21 0] -xshow -376 2198 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 45 -45 matrix scale makefont setfont -<494C53205265636F7264> -[11 25 28 11 30 22 23 26 14 0] -xshow -376 2252 moveto -(Courier-Bold-iso1252) cvn findfont 33 -33 matrix scale makefont setfont -<494C5320333020494C532049414957203130382E392033342D31382D34372E3136314E20303937 -2D30312D33382E323830572033342D31372D35392E3533334E203039372D30302D33352E30313857 -203732392E32> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 0] -xshow -376 2289 moveto -<30364520342E39322033303920332E3030> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 2368 moveto -(Helvetica-Bold-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<4669656C6473> -[24 9 22 10 23 0] -xshow -376 2451 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<5265636F7264204964656E7469666965723A2091494C5392> -[28 21 18 21 12 21 11 9 22 21 21 10 8 11 7 21 15 9 10 9 9 21 26 0] -xshow -376 2533 moveto -<52756E776179204964656E7469666965723A> -[28 20 21 27 19 19 11 10 21 21 21 11 8 10 8 20 14 0] -xshow -376 2614 moveto -<494C5320547970653A20206569746865722091494C53922C2091494C532F444D45922C20914C4F -43414C495A4552922C206F7220914C4F432F444D4592> -[10 21 25 11 19 19 21 22 9 11 10 21 8 10 21 22 12 11 8 10 20 25 8 10 10 8 10 21 - 26 9 27 32 25 7 10 10 7 21 29 27 25 21 10 22 25 28 7 10 10 21 13 10 7 20 30 28 - 9 27 32 26 0] -xshow -376 2696 moveto -<466F7572206C6574746572204964656E746966696572> -[22 21 22 12 10 8 21 11 9 22 12 11 10 21 21 21 10 8 11 8 21 0] -xshow -376 2778 moveto -<564846204672657175656E637920284D487A29> -[25 28 23 10 21 13 20 21 21 21 21 19 19 10 12 32 27 19 0] -xshow -376 2860 moveto -<4C6F63616C697A6572205472616E736D6974746572204C61746974756465> -[21 21 19 21 8 9 18 21 13 10 19 12 22 21 18 33 8 10 9 22 12 11 20 22 10 8 10 21 - 21 0] -xshow -376 2942 moveto -<4C6F63616C697A6572205472616E736D6974746572204C6F6E676974756465> -[21 21 19 21 8 9 18 21 13 10 19 12 22 21 18 33 8 10 9 22 12 11 20 21 21 22 8 10 - 21 21 0] -xshow -376 3024 moveto -<476C69646520536C6F7065205472616E736D6974746572204C617469747564652028912D912066 -6F72204C6F63616C697A65722D6F6E6C7920617070726F616368657329> -[31 7 8 21 21 11 25 8 21 21 21 10 19 12 21 22 18 33 7 10 10 22 12 11 20 22 10 8 - 10 21 21 21 11 12 8 13 8 11 9 22 12 11 21 21 18 22 8 8 18 21 12 12 21 21 8 19 10 - 21 21 21 12 21 21 19 21 21 19 0] -xshow -376 3106 moveto -<476C69646520536C6F7065205472616E736D6974746572204C6F6E6769747564652028912D9120 -666F72204C6F63616C697A65722D6F6E6C7920617070726F616368657329> -[31 7 8 21 21 11 25 8 21 21 21 10 19 12 21 22 18 33 7 10 10 22 12 11 20 21 21 22 - 8 10 21 21 21 10 13 8 12 9 10 9 22 12 11 21 21 19 21 8 8 19 20 12 13 20 22 7 19 - 11 21 21 20 12 21 21 19 21 21 19 0] -xshow -376 3188 moveto -<476C69646520536C6F7065207472616E736D697474657220616C746974756465202866742C204D -534C292028912D9120666F72204C6F63616C697A65722D6F6E6C7920617070726F616368657329> -[31 7 8 21 21 11 25 8 21 21 21 10 11 11 22 21 18 33 8 10 9 22 12 10 22 8 10 8 10 - 21 22 21 10 13 11 10 11 10 32 25 21 12 11 12 8 13 8 11 9 21 13 10 21 21 19 21 8 - 9 18 21 12 12 21 21 8 19 10 21 21 21 12 21 21 18 21 21 19 0] -xshow -376 3343 moveto -<41434D20666F7220554E495820616E642057696E646F7773> -[24 27 32 10 9 22 12 11 27 28 9 26 10 21 21 21 10 37 7 21 21 20 27 0] -xshow -1256 3343 moveto -<3331> -[20 0] -xshow -1962 3343 moveto -<30362F31302F3036> -[21 21 9 21 21 10 21 0] -xshow -grestore grestore -showpage -%%PageTrailer - -%%Page: 32 32 -%%PageBoundingBox: 0 0 595 842 -%%BeginPageSetup -% -%%EndPageSetup -gsave -[0.24 0 0 -0.24 0 842] concat -gsave -376 344 moveto -0 0 0 setrgbcolor -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<4D61676E6574696320766172696174696F6E206174206C6F63616C697A65722073746174696F6E -2028646567726565732C2065617374206F72207765737429> -[32 21 21 20 21 11 7 19 11 18 21 13 7 22 10 8 21 21 11 21 10 11 7 22 18 22 8 8 19 - 21 12 11 19 10 21 10 8 21 21 11 12 21 21 21 12 21 21 19 10 11 20 21 19 10 11 21 - 12 11 27 20 19 11 0] -xshow -376 426 moveto -<4C6F63616C697A657220776964746820286465677265657329> -[21 21 19 21 8 9 18 21 13 10 28 7 22 10 21 10 12 22 21 21 11 21 22 18 0] -xshow -376 508 moveto -<4C6F63616C697A65722062656172696E672028646567726565732C206D61676E6574696329> -[21 21 19 21 8 9 18 21 13 10 21 21 21 13 7 22 21 10 12 21 21 21 12 21 21 19 10 11 - 32 20 21 21 21 10 8 19 0] -xshow -376 590 moveto -<476C69646520736C6F706520616E676C65202864656772656573292028912D9120666F72204C6F -63616C697A65722D6F6E6C7920617070726F616368657329> -[31 7 8 21 21 11 19 7 21 21 21 11 21 21 21 8 21 10 12 22 21 21 12 20 22 19 12 10 - 13 8 13 8 10 10 21 13 10 21 21 19 21 8 8 19 20 12 13 21 21 8 19 10 21 21 21 12 - 20 21 19 21 21 19 0] -xshow -376 809 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 45 -45 matrix scale makefont setfont -<4665617475726573> -[25 23 23 13 25 15 23 0] -xshow -376 880 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<5573652066656174757265207265636F72647320746F20706C616365206F626A6563747320696E -20616E2041434D207363656E652E> -[28 18 21 11 9 21 22 9 22 11 22 10 12 21 19 21 12 21 19 10 10 21 11 21 8 21 18 22 - 10 21 21 8 21 19 10 19 11 7 22 10 21 21 10 24 27 32 10 19 19 21 21 21 0] -xshow -376 1018 moveto -(Helvetica-BoldOblique-iso1252) cvn findfont 45 -45 matrix scale makefont setfont -<46656174757265205265636F7264> -[25 23 23 13 25 15 23 12 30 22 23 25 15 0] -xshow -376 1083 moveto -(Courier-Bold-iso1252) cvn findfont 46 -46 matrix scale makefont setfont -<746F7765722E6F62762033322D35382D30342E3830304E203039362D35302D31362E3830305720 -3634342030> -[28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 - 27 28 27 28 27 28 27 28 27 28 27 28 27 28 27 28 0] -xshow -376 1165 moveto -(Helvetica-Bold-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<4669656C6473> -[24 9 22 10 23 0] -xshow -376 1248 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<4F626A6563742066696C656E616D65> -[30 21 8 21 19 10 11 10 8 8 21 21 21 31 0] -xshow -376 1330 moveto -<4C61746974756465> -[21 21 11 8 10 21 21 0] -xshow -376 1412 moveto -<4C6F6E676974756465> -[21 21 21 21 8 10 22 20 0] -xshow -376 1494 moveto -<416C746974756465202866742C204D534C29> -[26 8 10 8 10 22 21 21 10 13 11 10 11 10 32 25 21 0] -xshow -376 1575 moveto -<4F7269656E746174696F6E20616E676C652028646567726565732C207472756529> -[30 13 7 21 22 9 22 10 8 21 21 11 21 21 21 8 21 10 12 22 21 20 12 21 22 18 11 10 - 10 13 21 21 0] -xshow -376 3343 moveto -<41434D20666F7220554E495820616E642057696E646F7773> -[24 27 32 10 9 22 12 11 27 28 9 26 10 21 21 21 10 37 7 21 21 20 27 0] -xshow -1255 3343 moveto -<3332> -[20 0] -xshow -1962 3343 moveto -<30362F31302F3036> -[21 21 9 21 21 10 21 0] -xshow -grestore grestore -showpage -%%PageTrailer - -%%Page: 33 33 -%%PageBoundingBox: 0 0 595 842 -%%BeginPageSetup -% -%%EndPageSetup -gsave -[0.24 0 0 -0.24 0 842] concat -gsave -376 422 moveto -0 0 0.50196 setrgbcolor -(Helvetica-iso1252) cvn findfont 68 -68 matrix scale makefont setfont -<446566696E696E67204E6577204169726372616674> -[45 35 16 13 35 12 35 35 17 45 32 45 17 43 12 19 32 19 36 17 0] -xshow -376 581 moveto -0 0 0 setrgbcolor -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<5468652073746F75742D6F662D6865617274206D617920626520696E746572657374656420696E -206372656174696E67206E65772061697263726166742074797065732E20536F6D65206F66207468 -697320696E666F726D6174696F6E206D757374206265> -[24 20 21 11 19 9 21 21 10 13 21 11 12 21 21 20 14 11 10 32 20 18 11 20 21 11 8 - 21 10 21 12 21 19 9 21 21 11 8 21 11 18 12 21 22 10 7 22 21 10 21 20 28 10 22 7 - 12 20 11 22 11 10 11 10 19 21 21 20 9 11 25 20 32 21 10 22 10 10 10 22 7 20 10 - 8 22 8 22 12 32 21 11 7 21 21 11 31 21 19 10 11 21 0] -xshow -376 638 moveto -<67656E6572617465642062792068616E642C206275742049206469642063726561746520612070 -726F6772616D20746F2068656C70206D652067656E6572617465206169726372616674206F626A65 -6374733A2047454449542E2047454449542069732061> -[21 21 21 22 11 21 10 21 21 11 20 19 10 21 21 21 21 10 11 20 22 10 10 11 10 22 7 - 21 11 19 12 21 21 10 21 10 21 10 21 12 21 22 11 21 32 10 10 21 11 21 21 7 22 10 - 32 20 11 21 21 20 22 12 21 10 21 10 22 7 13 19 12 21 11 10 11 21 21 8 21 19 10 - 20 9 11 29 25 28 10 20 10 10 29 25 28 10 23 10 8 19 11 0] -xshow -376 695 moveto -<727564696D656E74617279204D6F7469662070726F6772616D207468617420616C6C6F77732079 -6F7520746F2063726561746520332D64696D656E73696F6E616C206F626A656374732E2049742069 -7320617661696C61626C652066726F6D206D652E20> -[13 21 21 7 32 21 21 10 21 14 19 10 32 21 10 8 10 11 21 12 21 21 12 20 32 11 10 - 21 21 11 10 21 8 8 20 28 19 10 18 21 21 11 9 21 11 19 12 20 22 9 22 10 21 12 22 - 7 32 21 21 19 7 22 20 22 8 10 21 21 8 21 19 11 20 9 10 11 10 11 8 19 10 21 17 22 - 8 7 22 21 8 21 10 10 12 21 32 11 32 22 8 0] -xshow -376 859 moveto -<5468652073796E746178206F6620746869732066696C65206973206E6F7420636F6D706C65782E> -[24 20 21 11 18 19 22 9 21 19 11 21 10 10 10 22 8 19 10 11 8 8 21 11 7 20 10 21 - 21 10 11 18 21 32 21 8 20 19 0] -xshow -376 1006 moveto -(Courier-Bold-iso1252) cvn findfont 33 -33 matrix scale makefont setfont -<2320416972637261667420496E76656E746F727920666F722041434D20352E30> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 0] -xshow -376 1068 moveto -<23205365652041434D2D4269626C696F67726170687920666F72206675727468657220696E666F -726D6174696F6E2061626F75742074686520736F7572636573206F662074686973> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 1129 moveto -<2320696E666F726D6174696F6E2E> -[20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 1190 moveto -<23204D69472D32392046756C6372756D> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 1252 moveto -<23204D69472D32394D20696E666F726D6174696F6E2077617320646572697665642066726F6D20 -74776F20736F75726365733A205B537069636B38375D20616E64205B416972492041756739325D2E> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 1375 moveto -<616972637261667420224D69472D323922207B> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 1436 moveto -<202020202020204F626A6563742020202020202020226D696732392E6F626A22> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 0] -xshow -376 1596 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<5468652076697375616C206465736372697074696F6E206F6620616E2041434D20616972637261 -66742069732073746F7265642073657061726174656C7920696E20562D6C69627261727920666F72 -6D61742E20546869732066696C6520646573637269626573206120736574> -[24 20 21 11 19 7 19 21 22 8 10 21 21 18 19 13 8 21 11 7 21 22 10 22 9 11 21 21 - 10 24 27 31 11 21 8 12 19 12 22 10 11 10 8 20 10 19 9 22 12 20 21 11 19 20 22 21 - 11 22 9 22 8 19 10 8 21 11 23 13 8 8 22 11 22 13 19 11 9 21 13 32 21 11 9 11 23 - 21 8 19 10 11 8 7 22 10 22 20 19 19 13 7 21 21 19 11 21 10 19 21 0] -xshow -376 1653 moveto -<6F6620706F6C79676F6E73207468617420726F7567686C7920617070726F78696D617465732074 -6865207368617065206F66207468652061637475616C2061697220706C616E652E20492075736564 -20474544495420746F20637265617465206D6F7374206F66> -[22 10 10 21 21 8 18 21 21 21 19 10 10 21 22 10 11 11 21 21 21 21 8 19 11 20 21 - 21 12 20 19 8 32 21 9 22 18 11 10 21 21 11 18 21 21 21 21 11 21 10 10 10 21 22 - 10 21 19 10 21 21 8 11 21 8 13 10 21 8 21 21 22 9 11 10 11 21 18 21 21 11 29 25 - 28 9 23 11 10 21 10 19 12 21 21 10 21 10 32 21 19 10 10 21 0] -xshow -376 1710 moveto -<7468652041434D206169726372616674206F626A656374732E20> -[10 21 22 10 24 27 31 11 21 8 12 19 12 22 11 10 11 20 22 7 21 20 10 20 9 0] -xshow -376 1857 moveto -(Courier-Bold-iso1252) cvn findfont 33 -33 matrix scale makefont setfont -<2020202020202057696E67417265612020202020203430302E30202023202877696E6753292057 -696E6720737572666163652061726561202866745E3229> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 0] -xshow -376 1919 moveto -<2020202020202057696E6748616C665370616E2031382E383720202023202877696E6773292057 -696E672068616C662D7370616E2028667429> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 0] -xshow -376 1980 moveto -<2020202020202043686F7264202020202020202020392E36312020202320286329204D65616E20 -67656F6D65747269632063686F7264206F662077696E672028667429> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 2041 moveto -<20202020202020417370656374526174696F202020332E35362020202320286173706563745261 -74696F292061737065637420726174696F> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 0] -xshow -376 2103 moveto -<20202020202020456D70747957656967687420202032323530302E30202328656D707479576569 -6768742920456D7074792077656967687420286C6229> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 0] -xshow -376 2263 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<54686573652076616C7565732061726520757375616C6C792071756F746564207769746820616E -206169726372616674277320706572666F726D616E636520666967757265732E20> -[24 20 21 19 21 10 18 22 7 21 21 19 11 21 11 21 11 21 19 21 21 8 8 19 10 21 21 21 - 10 21 21 10 28 8 10 21 10 21 21 11 21 8 12 19 12 22 10 11 6 20 10 21 22 13 9 21 - 12 32 21 21 19 21 10 11 7 21 22 12 21 20 9 0] -xshow -376 2410 moveto -(Courier-Bold-iso1252) cvn findfont 33 -33 matrix scale makefont setfont -<202020202020202320284928782C792C7A2929204D6F6D656E7473206F6620696E6572746961> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 2471 moveto -<20202020202020497878202020202020202020202031303030302E30> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 2533 moveto -<20202020202020497979202020202020202020202037353030302E30> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 2594 moveto -<20202020202020497A7A202020202020202020202038303030302E30> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 2754 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<54686573652061726520686172642076616C75657320746F2073696D706C652067756573732E20 -49206861766520677261626265642076616C75657320776865726520746865792077657265206176 -61696C61626C6520616E642073696D706C79> -[24 20 21 19 21 10 21 12 21 11 21 21 12 21 10 18 22 7 21 21 19 11 9 22 10 19 7 32 - 22 7 22 10 21 21 21 19 20 9 10 11 10 21 20 18 21 11 21 12 21 20 21 21 21 11 18 - 21 8 21 21 19 10 28 20 21 12 21 11 10 21 20 19 10 27 21 12 21 10 21 17 22 8 8 21 - 21 8 21 11 21 20 21 11 19 7 32 22 7 0] -xshow -376 2811 moveto -<6775657373656420736F6D6574696D65732C20746F6F2E20> -[21 21 21 19 19 20 21 11 19 20 32 21 10 7 33 21 18 11 10 10 22 21 9 0] -xshow -376 2893 moveto -<4D6F6D656E7473206F6620696E657274696120696E20616E2061637475616C2061697263726166 -7420617265206E6F7420636F6E7374616E742E204D6F7374206E6F7461626C792C20617320616E20 -6169726372616674206275726E73206675656C2C2069742773> -[32 20 32 21 21 10 19 10 22 10 10 8 21 21 14 11 7 22 10 8 21 11 21 20 11 21 19 10 - 21 21 8 11 21 8 12 19 12 22 11 10 10 21 12 21 11 21 21 10 10 19 21 21 19 10 20 - 22 11 10 10 32 20 19 10 11 21 21 9 22 21 8 16 11 10 21 19 10 21 21 11 21 8 12 19 - 12 22 10 11 10 21 21 13 21 18 11 10 21 21 9 10 10 8 11 7 0] -xshow -376 2950 moveto -<77656967687420646973747269627574696F6E2C2063656E7465722D6F662D677261766974792C -20616E64206D6F6D656E7473206F6620696E6572746961206368616E67652E20496E2041434D2C20 -686F77657665722C206D6F6D656E7473206F66> -[27 22 7 21 22 10 10 21 8 19 10 13 8 21 21 11 7 21 22 10 10 19 21 21 10 20 13 12 - 21 10 13 21 11 21 19 8 11 16 11 10 21 21 21 10 32 20 32 21 21 10 19 10 22 10 10 - 8 21 21 14 10 8 21 11 18 21 21 21 22 22 9 10 10 22 10 24 27 32 10 10 21 20 28 20 - 18 21 10 10 11 32 20 32 20 22 9 19 11 21 0] -xshow -376 3007 moveto -<696E657274696120616E6420434720646F206E6F74206368616E67652E20> -[8 21 21 14 11 7 22 10 21 21 21 10 27 30 10 21 21 10 21 22 10 10 19 21 21 20 22 - 22 9 0] -xshow -376 3154 moveto -(Courier-Bold-iso1252) cvn findfont 33 -33 matrix scale makefont setfont -<2020202020202023202863466C617029204C6966742064756520746F20666C6170732028796965 -6C647320436C696674206F6620312E30206174206D617820657874656E73696F6E29> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 3343 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<41434D20666F7220554E495820616E642057696E646F7773> -[24 27 32 10 9 22 12 11 27 28 9 26 10 21 21 21 10 37 7 21 21 20 27 0] -xshow -1255 3343 moveto -<3333> -[20 0] -xshow -1962 3343 moveto -<30362F31302F3036> -[21 21 9 21 21 10 21 0] -xshow -grestore grestore -showpage -%%PageTrailer - -%%Page: 34 34 -%%PageBoundingBox: 0 0 595 842 -%%BeginPageSetup -% -%%EndPageSetup -gsave -[0.24 0 0 -0.24 0 842] concat -gsave -376 327 moveto -0 0 0 setrgbcolor -(Courier-Bold-iso1252) cvn findfont 33 -33 matrix scale makefont setfont -<2020202020202043466C6170202020202020202020302E3634323739> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 389 moveto -<20202020202020434C4E65675374616C6C2020202031372E3020202023202864656729> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 0] -xshow -376 450 moveto -<20202020202020434C506F735374616C6C2020202033302E3020202023202864656729> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 0] -xshow -376 512 moveto -<20202020202020426574615374616C6C202020202031352E3020202023202864656729> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 0] -xshow -376 573 moveto -<2020202020202043466C6170447261672020202020302E303436372023202863466C6170447261 -672920447261672064756520746F20466C617073> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 0] -xshow -376 635 moveto -<202020202020204347656172447261672020202020302E30332020202320286347656172447261 -672920447261672064756520746F2047656172> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 0] -xshow -376 696 moveto -<202020202020204353706565644272616B65202020302E30332020202320286353706565644272 -616B652920447261672064756520746F205370656564204272616B65> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 758 moveto -<202020202020202020202020202020202020202020202020202020202320617420393020646567 -72656573> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 901 moveto -<202020202020202320284344622920447261672043686172616374657269737469632065717561 -74696F6E205B576176652B626F64795D> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 962 moveto -<202020202020202320696E646570656E64656E74207661726961626C65206973206D616368206E -756D626572> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 1085 moveto -<20202020202020434462202020207B202020202020202020202020202320284344622920447261 -67204368617261637465726973746963206571756174696F6E205B576176652B626F64795D> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 1147 moveto -<202020202020202020202020202020202020202020202020202020202320696E646570656E6465 -6E74207661726961626C65206973206D616368206E756D626572> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 1208 moveto -<2020202020202020202020202020302E302C202020302E3032302C> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 1270 moveto -<2020202020202020202020202020302E322C202020302E3032302C> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 1331 moveto -<2020202020202020202020202020302E39352C2020302E3031352C> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 1393 moveto -<2020202020202020202020202020312E30352C2020302E3034352C> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 1454 moveto -<2020202020202020202020202020322E30302C2020302E3033302C> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 1515 moveto -<202020202020202020202020202031302E302C2020302E303330> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 1577 moveto -<20202020202020202020202020207D> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 1737 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<496E2041434D2C20776176652F626F6479206472616720636F656666696369656E742069732061 -2066756E6374696F6E206F6620746865206169727370656564206578707265737365642061732061 -204D616368206E756D6265722E204C657373> -[10 22 10 24 27 32 10 10 27 20 18 21 10 21 21 21 19 10 22 11 21 22 10 19 21 21 11 - 10 8 19 8 21 22 10 10 8 19 11 21 10 10 21 21 19 11 7 22 21 10 21 10 11 10 21 21 - 11 21 8 12 19 21 21 21 21 10 20 19 21 12 21 19 18 21 21 11 21 19 10 21 11 31 21 - 18 21 11 21 20 32 21 21 12 9 10 21 21 19 0] -xshow -376 1794 moveto -<64726167206D616B657320666F722061206661737465722061697263726166742E205468697320 -66756E6374696F6E2067656E6572616C6C79206861732061206D6178696D756D206E656172204D61 -636820312E302E20596F752070726F6261626C79> -[22 11 22 21 10 32 20 18 21 19 10 9 22 13 10 21 10 10 21 19 10 21 12 11 21 8 12 - 19 12 22 11 11 10 10 23 21 8 19 10 10 22 21 19 10 8 21 21 11 20 21 21 22 11 22 - 8 8 19 10 21 21 19 11 20 11 32 20 19 8 31 21 32 10 21 21 21 12 11 32 20 19 21 10 - 20 9 23 8 11 21 21 21 11 21 12 21 21 21 21 7 0] -xshow -376 1851 moveto -<73686F756C64206E6F74206368616E67652074686973207461626C6520756E6C65737320796F75 -207265616C6C79206B6E6F77207768617420796F7527726520646F696E672E20> -[19 21 21 21 8 21 11 20 22 10 10 19 21 21 21 20 22 10 10 22 7 20 10 10 22 20 8 22 - 10 21 21 8 21 19 19 10 18 21 21 10 12 21 22 8 8 19 10 19 21 20 27 11 27 21 21 10 - 11 18 20 22 6 13 21 10 21 22 7 21 23 9 0] -xshow -376 1998 moveto -(Courier-Bold-iso1252) cvn findfont 33 -33 matrix scale makefont setfont -<20202020202020434C69667420207B20202020202020202020202020232028434C69667429204C -6966742D736C6F70652063757276652028767320616C70686129> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 2059 moveto -<20202020202020202020202020202D332E302C2020302E302C> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 2121 moveto -<20202020202020202020202020202D312E30352C20302E302C> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 2182 moveto -<20202020202020202020202020202D302E3537362C202D322E3139392C> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 0] -xshow -376 2244 moveto -<20202020202020202020202020202D302E3535362C202D322E32332C> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 2305 moveto -<20202020202020202020202020202D302E3532342C202D322E3139392C> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 0] -xshow -376 2366 moveto -<2020202020202020202020202020302E3532342C20322E3139392C> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 2428 moveto -<2020202020202020202020202020302E3535362C20322E32332C> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 2489 moveto -<2020202020202020202020202020302E3537362C20322E3139392C> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 2551 moveto -<2020202020202020202020202020312E30352C2020302E302C> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 2612 moveto -<2020202020202020202020202020322E302C202020302E30> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 2674 moveto -<20202020202020202020202020207D> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 2916 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<4C69667420697320646566696E656420627920746865206571756174696F6E203A> -[22 8 11 10 11 8 19 10 21 21 11 7 21 21 21 11 20 19 10 10 21 22 10 21 21 21 21 10 - 8 21 21 11 0] -xshow -376 3079 moveto -<3C506963747572653A2028466967757265293E> -[22 26 7 20 9 22 12 22 9 11 12 23 8 21 21 12 21 12 0] -xshow -376 3343 moveto -<41434D20666F7220554E495820616E642057696E646F7773> -[24 27 32 10 9 22 12 11 27 28 9 26 10 21 21 21 10 37 7 21 21 20 27 0] -xshow -1255 3343 moveto -<3334> -[21 0] -xshow -1962 3343 moveto -<30362F31302F3036> -[21 21 9 21 21 10 21 0] -xshow -grestore grestore -showpage -%%PageTrailer - -%%Page: 35 35 -%%PageBoundingBox: 0 0 595 842 -%%BeginPageSetup -% -%%EndPageSetup -gsave -[0.24 0 0 -0.24 0 842] concat -gsave -376 426 moveto -0 0 0 setrgbcolor -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<5768657265207220697320746865206169722064656E736974792C205320697320746865207769 -6E67207265666572656E63652061726561202866745E32292C20616E642056206973207468652061 -69727370656564202866742F20736563292C20616E6420434C206973> -[36 21 21 12 21 10 13 10 8 19 11 10 21 21 10 22 8 12 11 20 21 21 20 7 11 16 11 10 - 25 11 7 20 10 10 22 21 10 28 7 21 21 11 12 21 9 21 13 20 22 18 21 11 21 12 20 22 - 10 13 11 10 17 22 12 11 10 21 21 21 10 25 11 8 19 10 10 21 22 10 21 8 12 19 21 - 21 21 21 11 13 10 11 10 11 19 21 19 12 10 11 21 20 21 11 27 21 10 8 0] -xshow -376 483 moveto -<74686520636F656666696369656E74206F66206C6966742E20> -[10 21 22 10 19 21 21 11 10 8 19 8 21 22 10 10 22 10 10 9 8 11 12 9 0] -xshow -376 646 moveto -<496E2041434D2C2074686520636F656666696369656E74206F66206C6966742069732070757265 -6C7920612066756E6374696F6E206F6620616E676C65206F662061747461636B2028616C70686129 -2E20> -[10 22 10 24 27 32 10 10 10 21 22 10 19 21 22 10 10 8 19 8 21 22 10 10 22 10 10 - 9 8 11 11 10 8 19 10 21 21 12 22 7 19 11 21 10 10 21 21 19 11 7 22 21 10 22 10 - 10 21 21 21 8 21 11 21 10 10 22 10 10 21 19 19 10 12 22 7 22 20 22 13 10 0] -xshow -376 892 moveto -<464947555245203130204C49465420434F454646494349454E54205441424C45> -[24 9 30 27 27 25 11 20 20 10 22 9 23 23 11 27 29 25 23 24 9 28 10 25 27 23 11 18 - 26 25 21 0] -xshow -376 1056 moveto -<3C506963747572653A2028466967757265293E> -[22 26 7 20 9 22 12 22 9 11 12 23 8 21 21 12 21 12 0] -xshow -376 1203 moveto -(Courier-Bold-iso1252) cvn findfont 33 -33 matrix scale makefont setfont -<20202020202020436E42657461207B20202020202020202020202020232028436E426574612920 -5961772064756520746F2073696465736C6970206571756174696F6E> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 1264 moveto -<2020202020202020202020202020302C20202020202D302E30383132352C> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 0] -xshow -376 1326 moveto -<2020202020202020202020202020302E3532333534302C202D302E3037383132352C> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 0] -xshow -376 1387 moveto -<2020202020202020202020202020302E3738353334302C202D302E303630393337352C> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 0] -xshow -376 1449 moveto -<2020202020202020202020202020312E3034373139382C20302E3132352C> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 0] -xshow -376 1510 moveto -<2020202020202020202020202020312E35382C2020302E30> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 1572 moveto -<20202020202020202020202020207D> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 1732 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<496E2041434D206E65676174697665207961772064756520746F2073696465736C6970206D6561 -6E73207468617420746865206169726372616674206973202277656174686572636F636B20737461 -626C65222C20746861742069732C2074686520706C616E65> -[10 22 10 24 27 32 10 21 21 21 21 10 8 18 21 11 18 20 27 11 21 21 20 11 10 21 10 - 19 8 21 21 19 9 7 22 10 32 20 21 21 19 10 10 21 22 10 11 10 21 21 10 22 7 13 19 - 12 21 11 10 11 8 19 11 12 28 20 22 10 21 21 12 18 22 18 19 11 19 9 22 21 8 21 13 - 11 10 10 21 21 11 10 8 19 11 10 10 21 21 11 21 8 21 21 0] -xshow -376 1789 moveto -<74656E647320746F2079617720696E206120776179207468617420726564756365732074686520 -73696465736C697020636F6D706F6E656E742E20> -[10 21 21 21 19 10 10 21 11 18 20 27 11 7 22 10 21 11 27 19 19 11 10 21 21 10 11 - 12 21 21 21 18 21 19 11 9 22 21 10 19 8 21 21 19 8 8 22 10 19 20 32 21 21 21 21 - 21 11 10 0] -xshow -376 2034 moveto -<20202020202020436C42657461207B20202020202020202020202020232028436C426574612920 -526F6C6C2064756520746F2073696465736C6970206571756174696F6E20> -[11 10 11 10 11 10 11 28 7 25 21 10 21 10 13 11 10 10 11 10 11 10 11 10 11 10 11 - 10 21 10 12 28 8 25 21 10 21 13 10 27 22 8 8 10 21 21 21 10 10 21 11 19 7 21 22 - 19 8 7 22 10 21 21 21 21 11 7 21 22 0] -xshow -376 2116 moveto -<2020202020202020202020202020302C20202020202D302E303132352C> -[11 10 11 10 11 10 11 10 11 10 10 11 10 11 21 10 11 10 10 11 10 13 21 9 20 20 21 - 21 0] -xshow -376 2198 moveto -<2020202020202020202020202020302E34333633332C202D302E3031352C> -[11 10 11 10 11 10 11 10 11 10 10 11 10 11 21 10 21 21 21 21 21 10 11 12 21 9 20 - 20 21 0] -xshow -376 2280 moveto -<2020202020202020202020202020302E37383534302C20302E3132352C> -[11 10 11 10 11 10 11 10 11 10 10 11 10 11 21 9 21 21 21 21 21 10 11 20 7 20 21 - 21 0] -xshow -376 2362 moveto -<2020202020202020202020202020312E35382C2020302E302C> -[11 10 11 10 11 10 11 10 11 10 10 11 10 11 20 9 21 21 10 10 11 21 10 21 0] -xshow -376 2444 moveto -<2020202020202020202020202020332E3134322C20302E3132352C> -[11 10 11 10 11 10 11 10 11 10 10 11 10 11 19 8 20 20 21 10 10 20 7 20 21 21 0] -xshow -376 2771 moveto -<20202020202020202020202020207D> -[11 10 11 10 11 10 11 10 11 10 10 11 10 11 0] -xshow -376 3099 moveto -<41206E656761746976652076616C7565206D65616E732074686174207468652061697263726166 -742077696C6C20726F6C6C20696E20746865206F70706F7369746520646972656374696F6E206F66 -207468652073696465736C697020636F6D706F6E656E742C> -[25 11 21 21 21 21 10 8 18 21 11 18 21 8 21 21 10 32 21 21 21 18 11 9 22 21 10 11 - 10 21 21 11 21 8 12 19 12 22 10 11 10 28 8 8 8 11 11 22 8 8 11 8 21 11 9 22 21 - 10 21 21 21 21 19 8 10 21 10 22 8 11 22 19 10 8 21 21 10 22 10 10 10 21 22 10 19 - 8 21 21 19 8 8 21 11 18 21 32 21 21 21 20 22 10 0] -xshow -376 3155 moveto -<74656E64696E6720746F206D616B6520746865206169726372616674206D6F726520737461626C -652E20> -[10 21 21 22 7 21 21 11 9 22 10 32 21 17 21 11 9 22 21 10 22 8 12 19 11 23 10 11 - 10 32 20 12 21 11 19 10 21 21 8 22 9 0] -xshow -376 3343 moveto -<41434D20666F7220554E495820616E642057696E646F7773> -[24 27 32 10 9 22 12 11 27 28 9 26 10 21 21 21 10 37 7 21 21 20 27 0] -xshow -1255 3343 moveto -<3335> -[20 0] -xshow -1962 3343 moveto -<30362F31302F3036> -[21 21 9 21 21 10 21 0] -xshow -grestore grestore -showpage -%%PageTrailer - -%%Page: 36 36 -%%PageBoundingBox: 0 0 595 842 -%%BeginPageSetup -% -%%EndPageSetup -gsave -[0.24 0 0 -0.24 0 842] concat -gsave -376 409 moveto -0 0 0 setrgbcolor -(Courier-Bold-iso1252) cvn findfont 33 -33 matrix scale makefont setfont -<202020202020204344424F726967696E2020202020302020202020202320284344424F72696769 -6E2C20434442466163746F722920447261672064756520746F2073696465736C6970> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 471 moveto -<20202020202020434442466163746F722020202020302E3520202020> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 532 moveto -<202020202020204344425068617365202020202020302020202020202320284344425068617365 -292073696465736C69702064726167207068617365202864656729> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 692 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<4344422076616C75657320646566696E652074686520626F647920647261672061646465642062 -792073696465736C6970206F6E207468652061697263726166742E20> -[27 28 25 10 18 22 7 21 21 19 11 21 21 10 7 22 21 10 10 21 22 10 21 21 21 18 11 - 21 12 21 21 10 21 21 21 21 21 10 20 19 11 19 8 21 21 19 8 8 21 11 20 21 11 10 21 - 21 11 21 8 12 19 12 22 10 12 9 0] -xshow -376 839 moveto -(Courier-Bold-iso1252) cvn findfont 33 -33 matrix scale makefont setfont -<2020202020202043594265746120202020202020202D302E383520202320284359626574612920 -536964652D666F7263652066726F6D20736964652D736C6970205B6443592F64426574615D> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 999 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<4359426574612069732074686520226C696674222064756520746F2073696465736C69702E2054 -6869732069732074686520666163746F72207468617420616C6C6F777320746F20726F6C6C203930 -20646567726565732066726F6D206C6576656C2C206B69636B20746865> -[28 25 25 21 9 22 10 8 19 11 10 21 21 10 14 8 9 10 11 13 11 21 21 21 10 10 21 10 - 20 7 21 21 20 8 8 22 9 11 23 21 8 18 11 8 19 11 9 22 21 10 9 22 19 10 21 12 11 - 10 21 22 10 10 21 9 7 20 28 19 10 10 21 11 11 22 8 8 11 21 20 11 21 21 21 12 21 - 21 18 11 10 12 20 33 10 8 20 18 22 8 10 11 19 8 18 19 11 10 21 0] -xshow -376 1056 moveto -<7275646465722061206C6F742C20616E64207374696C6C2073746179206C6576656C2E204E6F74 -20616C6C2073696D756C61746F72732074616B65207468697320696E746F206163636F756E742E20> -[13 21 21 20 22 12 11 20 11 8 21 10 11 10 21 21 21 10 20 10 8 8 8 11 19 10 20 19 - 10 8 20 18 22 9 10 10 27 21 10 10 22 8 8 11 19 7 32 21 8 21 10 21 12 19 11 10 21 - 18 21 11 10 21 8 19 11 7 22 10 21 10 21 19 19 20 21 22 11 9 0] -xshow -376 1367 moveto -(Courier-Bold-iso1252) cvn findfont 33 -33 matrix scale makefont setfont -<20202020202020456666456C657661746F72202020302E3630202020232028656666456C657661 -746F722920456C657661746F72206566666563746976656E657373> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 1428 moveto -<202020202020204566665275646465722020202020302E33352020202320286566665275646465 -722920527564646572206566666563746976656E657373> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 0] -xshow -376 1490 moveto -<202020202020204D61785275646465722020202020323020202020202320286D61785275646465 -7229206D617820527564646572202864656729> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 0] -xshow -376 1551 moveto -<2020202020202053655472696D54616B656F6666203020202020202023202853655472696D5461 -6B656F66662920456C657661746F72207472696D2061742074616B656F6666202864656729> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 1613 moveto -<202020202020204D617841696C65726F6E20202020323020202020202320286D617841696C6572 -6F6E29206D61782041696C65726F6E202864656729> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 0] -xshow -376 1674 moveto -<202020202020204D6178466C617020202020202020323020202020202320286D6178466C617029 -206D617820666C61702073657474696E67202864656729> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 0] -xshow -376 1797 moveto -<20202020202020232028666C6170526174652920666C617020657874656E73696F6E2072617465 -202861626F75742032207365637320746F2066756C6C7920657874656E6420666C61707329> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 1920 moveto -<20202020202020466C617052617465202020202020313020202020202320286465672F73656329> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 2043 moveto -<20202020202020232028676561725261746529206765617220657874656E73696F6E2072617465 -202861626F75742033207365637320746F2066756C6C7920657874656E64206765617229> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 2166 moveto -<202020202020204765617252617465202020202020333020202020202320286465672F73656329> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 2227 moveto -<202020202020204D617853706565644272616B6520383020202020202320286D61785370656564 -4272616B6529206D6178205370656564204272616B652073657474696E67202864656729> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 2350 moveto -<2020202020202023202873706565644272616B6552617465292072617465206F66207370656564 -206272616B6520657874656E73696F6E202832207365637320746F2066756C6C2065787429> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 2473 moveto -<2020202020202053706565644272616B6552617465203430202020202320286465672F73656329> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 2596 moveto -<2020202020202023202873706565644272616B65496E637229207370656564204272616B652069 -6E6372656D656E7420706572206B65797374726F6B65> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 0] -xshow -376 2719 moveto -<2020202020202053706565644272616B65496E63722038302020202023202864656729> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 0] -xshow -376 2879 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<54686573652076616C7565732064657465726D696E652074686520636861726163746572697374 -696373206F66207468652061697263726166742773207370656564206272616B6573202873706565 -64206272616B657320617265207573656420696E20746865> -[24 20 21 19 21 10 18 22 7 21 21 19 11 20 22 9 21 12 33 7 21 21 11 10 21 21 10 19 - 21 22 11 21 19 10 21 13 7 20 10 8 19 19 10 22 10 10 10 21 21 11 21 8 12 20 11 22 - 11 10 7 19 11 18 21 21 21 21 10 22 11 21 18 21 19 11 12 19 21 21 21 21 10 21 12 - 21 18 21 19 10 21 12 21 11 20 19 21 21 11 7 22 10 10 21 0] -xshow -376 2936 moveto -<6169722C20776865656C206272616B6573206172652075736564206F6E207468652067726F756E -64292E204D617853706565644272616B65206465746572206D696E657320746865206D6178696D75 -6D20657874656E73696F6E206F6620746865> -[22 8 10 10 11 27 21 21 21 8 11 21 11 22 17 22 18 11 21 12 21 10 21 19 21 21 10 - 21 21 10 10 21 22 10 21 12 21 21 21 21 14 8 11 32 20 19 25 21 21 21 20 26 12 21 - 18 21 10 21 21 10 21 12 11 32 7 21 21 19 10 10 21 22 10 32 21 19 7 32 20 32 10 - 20 19 10 21 21 19 8 21 21 10 22 10 10 10 21 0] -xshow -376 2993 moveto -<7370656564206272616B652070616E656C732E2053706565644272616B65496E63722064657465 -72206D696E657320686F7720666172206F6E65207072657373206F662074686520285329206B6579 -2077696C6C20696E63726561736520746865> -[19 21 21 21 21 10 22 11 21 18 21 11 21 21 21 21 8 20 9 10 26 20 21 21 21 26 11 - 21 18 22 9 21 19 13 10 21 21 10 21 12 11 32 7 21 21 19 11 21 20 27 10 10 21 13 - 10 21 21 21 11 21 11 22 18 19 10 22 10 10 10 21 22 10 12 26 12 10 18 21 18 11 28 - 7 8 9 10 8 21 19 12 21 21 19 21 10 10 21 0] -xshow -376 3050 moveto -<7370656564206272616B6520657874656E73696F6E2E20497420646F6573206E6F74206E656564 -20746F20626520616E206576656E20696E6372656D656E74206F66204D617853706565644272616B -652E2053706565644272616B6552617465> -[19 21 21 21 21 10 22 11 21 18 21 11 20 19 9 21 21 20 7 21 23 9 10 11 10 11 21 20 - 21 19 11 20 22 9 11 21 21 21 21 10 10 21 11 20 21 11 20 21 11 20 18 21 21 11 7 - 21 19 13 20 32 21 21 10 11 21 10 10 32 21 18 25 21 21 21 21 26 11 21 19 22 9 10 - 25 21 21 21 21 25 12 21 18 21 27 21 10 0] -xshow -376 3106 moveto -<6465746572206D696E657320686F77206661737420746865206272616B65732077696C6C206465 -706C6F79206F7220726574726163742E20> -[21 21 10 21 12 11 32 7 21 21 19 10 21 20 28 10 10 21 19 10 11 10 21 21 11 21 12 - 21 18 21 18 11 28 8 8 8 11 20 21 22 8 20 19 10 21 12 11 11 22 10 12 21 19 12 9 0] -xshow -376 3343 moveto -<41434D20666F7220554E495820616E642057696E646F7773> -[24 27 32 10 9 22 12 11 27 28 9 26 10 21 21 21 10 37 7 21 21 20 27 0] -xshow -1255 3343 moveto -<3336> -[20 0] -xshow -1962 3343 moveto -<30362F31302F3036> -[21 21 9 21 21 10 21 0] -xshow -grestore grestore -showpage -%%PageTrailer - -%%Page: 37 37 -%%PageBoundingBox: 0 0 595 842 -%%BeginPageSetup -% -%%EndPageSetup -gsave -[0.24 0 0 -0.24 0 842] concat -gsave -376 327 moveto -0 0 0 setrgbcolor -(Courier-Bold-iso1252) cvn findfont 33 -33 matrix scale makefont setfont -<20202020202020436C646120202020202020202020302E3034382020232028436C64612920726F -6C6C206D6F6D656E742066726F6D2061696C65726F6E206F6666736574> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 389 moveto -<20202020202020436C647220202020202020202020302E3030342020232028436C64722920726F -6C6C206D6F6D656E742066726F6D20727564646572206F6666736574> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 450 moveto -<20202020202020436C7020202020202020202020202D302E32372020232028436C702920726F6C -6C2064616D70696E67> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 512 moveto -<20202020202020436D7120202020202020202020202D382E30202020232028436D712920706974 -63682064616D70696E6720666163746F72> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 0] -xshow -376 573 moveto -<20202020202020436E7220202020202020202020202D322E30202020232028436E722920796177 -2064616D70696E6720666163746F72> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 733 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<546865736520666163746F727320636861726163746572697A6520736F6D65206F662074686520 -726F6C6C2C20706974636820616E642079617720636861726163746572697374696373206F662074 -68652061697263726166742E20546865792061726520696E20746865> -[24 20 21 19 21 10 10 21 19 10 21 12 19 11 19 20 22 12 21 19 9 21 14 7 19 21 10 - 19 21 32 21 10 21 10 11 9 22 21 11 11 22 8 8 11 10 21 8 10 19 21 11 21 21 21 10 - 18 20 28 10 18 22 21 12 21 19 9 22 13 7 19 11 8 19 19 10 21 10 11 10 21 21 11 21 - 7 13 19 12 22 10 12 9 11 23 21 20 18 11 21 12 21 10 8 21 11 10 21 0] -xshow -376 790 moveto -<4E41434120666F726D2E2044616D70696E6720666163746F72732064657465726D696E6520686F -7720717569636B6C7920616E2061697263726166742072657475726E7320746F2061207374656164 -7920737461746520616674657220736F6D65> -[27 24 26 25 11 9 21 12 34 9 10 28 20 32 21 8 21 21 10 10 21 19 10 21 12 19 11 20 - 22 9 21 12 33 7 21 21 11 21 20 27 11 21 21 8 18 20 8 19 10 21 21 10 22 8 11 20 - 11 23 10 11 10 12 21 10 21 13 21 18 11 9 22 10 21 11 18 10 21 21 21 19 10 19 10 - 21 10 21 10 22 10 10 21 13 11 18 20 33 0] -xshow -376 847 moveto -<6368616E676520696E20636F6E74726F6C20696E7075742E204C6172676572206E656761746976 -652064616D70696E6720666163746F7273206D616B6520666F722061206D6F726520737461626C65 -2061697263726166742E20> -[19 21 21 21 21 21 10 8 22 10 19 21 21 10 12 22 7 11 8 21 21 21 12 9 10 21 21 12 - 22 21 12 11 20 21 21 21 11 8 18 21 10 21 21 32 21 8 21 21 10 9 22 19 10 21 12 19 - 11 32 20 18 21 10 10 21 13 10 21 10 32 21 12 21 10 19 10 21 21 8 21 11 21 8 12 - 19 12 22 10 12 9 0] -xshow -376 974 moveto -(Courier-Bold-iso1252) cvn findfont 33 -33 matrix scale makefont setfont -<20202020202020436D416C706861202020202020202D302E33302020232028636D536C6F706529 -20436D416C70686120637572766520736C6F706520> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 0] -xshow -376 1035 moveto -<20202020202020436D466163746F722020202020202D302E32302020232028636D466163746F72 -2920436D416C70686120666163746F72207768656E207374616C6C656420> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 1096 moveto -<202020202020204D61784675656C20202020202020393735302020202320286D61784675656C29 -206D6178696D756D20696E7465726E616C206675656C20286C6229> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 1219 moveto -<202020202020202320656E67696E65206C616720666163746F722028686F77206661737420646F -657320697420726573706F6E6420746F207468726F74746C65206368616E676573> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 1342 moveto -<20202020202020456E67696E654C616720202020202D332E30> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 1465 moveto -<202020202020202320456E67696E652064617461206261736564206F6E20757064617465642052 -442D33334B20656E67696E657320636974656420696E205B416972492041756738395D2E> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 1527 moveto -<202020202020202320286D617854687275737429206D617820737461746963207468727573742C -206D696C697461727920706F77657220286C622920> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 0] -xshow -376 1650 moveto -<202020202020204D617854687275737420202020203237303030> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 1773 moveto -<202020202020202320286D6178414254687275737429206D617820737461746963207468727573 -742C2061667465726275726E6572206F6E20286C622920> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 0] -xshow -376 1895 moveto -<202020202020204D617841425468727573742020203434303030> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 2055 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<4D6178696D756D20737461746963206D696C697461727920616E642061667465726275726E6572 -207468727573742076616C7565732063616E20757375616C6C7920626520666F756E6420696E2064 -6F63756D656E74732074686174206465736372696265> -[32 21 19 7 32 20 32 11 19 9 22 10 8 19 11 32 8 8 8 10 21 14 19 10 21 21 21 10 22 - 10 10 22 12 20 21 13 21 21 13 10 10 21 13 21 19 10 10 18 22 7 21 21 19 11 18 21 - 21 11 21 18 21 22 8 7 20 10 21 21 10 9 22 21 21 21 10 8 22 10 21 21 18 21 32 21 - 21 10 19 10 10 21 22 10 11 20 21 19 19 13 7 21 0] -xshow -376 2112 moveto -<616972637261667420706572666F726D616E63652E20> -[22 8 11 20 11 23 10 11 10 21 22 13 9 21 12 32 21 21 19 22 9 0] -xshow -376 2259 moveto -(Courier-Bold-iso1252) cvn findfont 33 -33 matrix scale makefont setfont -<20202020202020546872757374207B202020202020202020202020202320285468727573742920 -4D616368204E756D6265722076732E2074687275737420> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 0] -xshow -376 2321 moveto -<2020202020202020202020202020302C2020202020312C> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 2382 moveto -<2020202020202020202020202020312E372C202020312E352C> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 2444 moveto -<2020202020202020202020202020322E302C202020302E38342C> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 2505 moveto -<2020202020202020202020202020352C2020202020302E35> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 2567 moveto -<20202020202020202020202020207D> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 2628 moveto -<202020202020204142546872757374207B20202020232028414254687275737429206166746572 -6275726E657220746872757374207461626C65> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 0] -xshow -376 2690 moveto -<2020202020202020202020202020302C2020202020312C> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 2751 moveto -<2020202020202020202020202020302E352C202020312C> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 2813 moveto -<2020202020202020202020202020312C2020202020312E32312C> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 2874 moveto -<2020202020202020202020202020312E372C202020312E372C> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 2935 moveto -<2020202020202020202020202020352C2020202020312E3634> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 2997 moveto -<20202020202020202020202020207D> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 3157 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<5468652054687275737420616E6420414254687275737420636F72726563747320746865207374 -61746963207468727573742076616C756520666F72207468652061697263726166742773204D6163 -68206E756D6265722E20556E6C65737320796F75> -[24 20 21 11 23 21 12 21 19 10 10 21 21 21 11 25 25 23 21 12 21 19 10 10 19 21 12 - 12 21 19 10 19 11 10 21 21 11 19 9 22 10 8 19 11 9 22 12 21 19 10 11 18 21 8 21 - 21 11 9 21 13 10 10 21 22 10 22 7 12 19 12 22 11 10 7 19 11 31 21 19 21 10 21 20 - 32 21 21 12 9 10 28 21 8 21 18 19 11 18 20 0] -xshow -376 3343 moveto -<41434D20666F7220554E495820616E642057696E646F7773> -[24 27 32 10 9 22 12 11 27 28 9 26 10 21 21 21 10 37 7 21 21 20 27 0] -xshow -1255 3343 moveto -<3337> -[20 0] -xshow -1962 3343 moveto -<30362F31302F3036> -[21 21 9 21 21 10 21 0] -xshow -grestore grestore -showpage -%%PageTrailer - -%%Page: 38 38 -%%PageBoundingBox: 0 0 595 842 -%%BeginPageSetup -% -%%EndPageSetup -gsave -[0.24 0 0 -0.24 0 842] concat -gsave -376 344 moveto -0 0 0 setrgbcolor -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<68617665206861726420696E666F726D6174696F6E2061626F757420746869732C206C65617665 -207468657365206669656C647320616C6F6E652E20> -[21 20 18 21 11 21 21 12 21 10 8 22 9 21 12 32 22 10 8 21 21 10 21 21 21 21 10 11 - 10 21 8 19 11 10 8 21 21 17 22 10 10 21 21 19 21 10 11 7 22 8 21 19 10 22 7 21 - 22 22 9 0] -xshow -376 491 moveto -(Courier-Bold-iso1252) cvn findfont 33 -33 matrix scale makefont setfont -<2020202020202023202873704675656C436F6E73756D7029207370656369666963206675656C20 -636F6E73756D70286C62206675656C2F6C622054207820687229> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 614 moveto -<2020202020202053704675656C436F6E73756D702020202020202020302E3638> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 0] -xshow -376 737 moveto -<20202020202020232028737041424675656C436F6E73756D702920414220737065636966696320 -6675656C20636F6E73756D70286C62206675656C2F6C622054207820687229> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 860 moveto -<20202020202020537041424675656C436F6E73756D70202020202020322E3535> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 0] -xshow -376 1020 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<5468657365206669656C647320646566696E6520746865207370656369666963206675656C2063 -6F6E73756D7074696F6E20286675656C20636F6E73756D65642070657220706F756E64206F662074 -68727573742070657220686F7572292E20556E6C657373> -[24 20 21 19 21 10 11 8 21 8 21 19 10 21 21 11 7 21 21 11 10 21 21 11 18 21 21 20 - 7 11 8 19 10 10 21 22 8 10 19 21 21 18 21 32 21 10 8 21 21 11 12 10 21 22 8 10 - 19 21 21 18 21 32 21 21 10 21 21 12 11 21 20 22 20 21 11 21 10 11 10 21 12 21 19 - 10 11 21 21 12 11 21 21 21 12 14 9 10 27 22 7 21 19 0] -xshow -376 1077 moveto -<796F752068617665206861726420696E666F726D6174696F6E2061626F757420746869732C206C -65617665207468657365206669656C647320616C6F6E652E20> -[18 21 21 11 21 20 18 21 10 21 21 12 21 11 7 22 9 21 13 32 21 10 8 21 21 11 21 20 - 21 22 10 10 10 22 8 19 10 11 7 22 20 18 21 10 10 21 21 19 21 11 10 8 21 8 21 19 - 11 21 8 20 22 22 9 0] -xshow -376 1224 moveto -(Courier-Bold-iso1252) cvn findfont 33 -33 matrix scale makefont setfont -<2020202020202023202867726F756E64696E67506F696E7429206879706F746865746963616C20 -73696E676C6520706F696E74206F6620636F6E7461637420772F67726F756E6420> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 1347 moveto -<2020202020202047726F756E64696E67506F696E74202020202020207B20302C20302C20342E32 -3232207D> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 1507 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<47726F756E64696E67506F696E7420697320626573742063616C63756C61746564207573696E67 -20746F6F6C732F62616C616E63652E632E20497420646566696E6573206120676F6F6420696E6974 -69616C206775657373206F662074686520227265737422205A> -[30 12 21 21 20 22 7 21 21 24 22 7 22 10 10 8 19 11 21 21 19 10 10 19 21 8 19 21 - 8 21 10 21 21 11 20 20 7 21 21 11 10 20 22 8 19 10 21 21 8 21 21 19 21 10 21 9 - 10 10 11 10 21 21 11 7 21 21 19 11 21 10 21 21 21 21 10 8 22 8 10 8 22 8 10 21 - 21 21 19 19 10 21 10 11 10 21 21 11 13 12 21 19 10 13 11 0] -xshow -376 1564 moveto -<706F736974696F6E20666F722061206E65776C7920637265617465642061697263726166742E20 -546F206265206D6F72652061636375726174652C20492073686F756C64206D616B65207468697320 -612073696E6765205A2076616C756520616E64207468656E> -[21 21 19 8 11 7 22 21 10 9 22 13 10 21 11 20 20 28 8 19 10 19 12 21 21 10 21 21 - 10 21 8 12 20 11 22 11 11 10 10 19 22 10 21 21 11 31 21 12 21 10 21 19 19 21 12 - 21 10 21 10 11 10 11 18 21 21 22 7 21 11 31 21 18 21 10 10 22 8 19 10 21 11 19 - 7 21 21 22 10 23 11 17 22 7 21 22 10 21 21 21 10 10 21 21 0] -xshow -376 1620 moveto -<61646420616E20696E697469616C20726573742070697463682C2061732077656C6C2E2053696E -6365204920646F6E27742C20746869732069732077687920796F752073656520616E206169726372 -616674207069746368206120626974206A757374206166746572206974206973> -[21 21 21 11 21 20 11 8 21 8 11 7 22 8 11 12 21 19 10 10 22 8 10 18 22 10 11 21 - 18 11 27 21 8 9 10 10 26 7 21 19 21 11 10 10 21 21 22 6 11 10 11 10 21 8 19 11 - 8 19 10 28 20 18 11 18 21 21 10 19 21 21 10 21 21 11 21 7 13 19 12 22 10 11 10 - 22 8 10 18 22 10 21 10 22 8 10 11 7 22 19 10 10 22 10 10 22 12 10 9 10 11 7 0] -xshow -376 1677 moveto -<637265617465642E20> -[19 12 21 21 10 21 22 9 0] -xshow -376 1824 moveto -(Courier-Bold-iso1252) cvn findfont 33 -33 matrix scale makefont setfont -<2020202020202023202876696577506F696E74292070696C6F7427732076696577696E67206C6F -636174696F6E20777274204347> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 1947 moveto -<2020202020202056696577506F696E742020202020202020202020207B2031342E37352C20302C -202D352E333735207D> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 2189 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<54686973206973207468652058595A206C6F636174696F6E2072656C617469766520746F207468 -652061697263726166742063656E746572206F6620677261766974792074686174206C6F63617465 -73207468652070696C6F742773206579652076696577206F757473696465206F66> -[24 21 7 19 11 8 19 10 10 21 22 10 25 25 23 11 7 22 19 21 10 8 21 21 11 12 21 8 - 21 11 7 18 22 10 10 21 10 10 22 21 10 22 7 12 20 11 22 11 10 11 19 21 21 9 22 12 - 10 22 10 10 22 11 20 20 8 10 19 10 10 22 21 10 11 7 22 18 22 9 21 19 11 10 21 21 - 10 22 8 7 22 10 7 19 10 20 19 21 10 19 8 20 28 10 21 21 10 19 8 21 21 11 21 0] -xshow -376 2246 moveto -<74686520636F636B7069742E20> -[10 21 22 10 19 21 18 19 22 8 11 10 0] -xshow -376 2393 moveto -(Courier-Bold-iso1252) cvn findfont 33 -33 matrix scale makefont setfont -<2020202020202023204C616E64696E67204765617220636F6E74726F6C20706172616D65746572 -73> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 2516 moveto -<202020202020204D75537461746963202020202020302E30382020202320286D75537461746963 -292073746174696320636F656666206F66206672696374696F6E206E6F2D6272616B657320> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 2578 moveto -<202020202020204D754B696E657469632020202020302E30352020202320286D754B696E657469 -6329206D6F76696E6720636F656666206F66206672696374696F6E206E6F2D6272616B6573> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 2639 moveto -<202020202020204D75425374617469632020202020302E37202020202320286D75425374617469 -632920737461746963206272616B65732D6F6E> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 0] -xshow -376 2700 moveto -<202020202020204D75424B696E6574696320202020302E36202020202320286D75424B696E6574 -696329206D6F76696E67206272616B65732D6F6E> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 0] -xshow -376 2860 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<546865736520666F75722076616C75657320636861726163746572697A652074686520616D6F75 -6E74206F66206672696374696F6E20746861742074686520776865656C732067656E657261746520 -7768656E20696E20636F6E74616374207769746820746865> -[24 20 21 19 21 10 10 21 21 13 10 18 21 8 21 21 19 10 19 21 22 11 21 19 10 21 13 - 8 18 22 10 10 21 21 11 20 32 21 21 21 10 11 21 10 11 10 13 7 20 10 8 21 21 11 10 - 21 21 10 11 10 21 21 11 27 21 21 21 8 18 11 21 21 21 21 12 21 10 21 10 28 21 20 - 21 11 7 22 10 19 21 21 10 21 19 11 10 28 8 10 21 10 10 21 0] -xshow -376 2917 moveto -<67726F756E642E20546865206D6178696D756D207468656F7265746963616C2076616C7565206F -6620616E79206F6620746865736520697320312E302E20> -[21 12 21 21 21 23 8 11 23 21 21 10 32 21 19 7 32 20 32 10 10 21 22 21 11 22 10 - 8 18 22 8 11 17 22 7 21 22 10 21 10 11 21 20 19 10 21 11 10 10 21 21 19 21 11 7 - 20 10 20 9 23 8 0] -xshow -376 3064 moveto -(Courier-Bold-iso1252) cvn findfont 33 -33 matrix scale makefont setfont -<202020202020204D61784E57446566202020202020373220202020202320286D61784E57446566 -29206D6178696D756D206E6F7365776865656C206465666C656374696F6E202864656729> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 3126 moveto -<202020202020204E57496E63722020202020202020302E30333937202320284E57496E63722920 -6465666C656374696F6E20666F72206561636820756E69742028312E32372F333229> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 3187 moveto -<202020202020204D61784E57532020202020202020383520202020202320286D61784E57532920 -6D6178696D756D204E57532076656C6F63697479202866707329> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 3343 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<41434D20666F7220554E495820616E642057696E646F7773> -[24 27 32 10 9 22 12 11 27 28 9 26 10 21 21 21 10 37 7 21 21 20 27 0] -xshow -1255 3343 moveto -<3338> -[20 0] -xshow -1962 3343 moveto -<30362F31302F3036> -[21 21 9 21 21 10 21 0] -xshow -grestore grestore -showpage -%%PageTrailer - -%%Page: 39 39 -%%PageBoundingBox: 0 0 595 842 -%%BeginPageSetup -% -%%EndPageSetup -gsave -[0.24 0 0 -0.24 0 842] concat -gsave -376 405 moveto -0 0 0 setrgbcolor -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<596F752063616E2070726F6261626C79206A757374206C65617665207468657365207468726565 -206E6F73652D776865656C207374656572696E6720706172616D657465727320616C6F6E652E20> -[21 21 22 10 19 21 21 10 21 12 21 21 21 21 8 19 10 8 21 20 10 10 8 21 20 18 21 11 - 10 21 21 19 21 10 10 22 11 22 21 10 21 21 18 22 12 27 21 21 21 8 11 18 10 21 21 - 13 8 21 21 10 21 21 12 21 31 21 10 21 12 19 11 21 8 21 21 22 9 0] -xshow -376 553 moveto -(Courier-Bold-iso1252) cvn findfont 33 -33 matrix scale makefont setfont -<20202020202020232028726D29206C6F636174696F6E206F66206D61696E206765617220617474 -6163686D656E7473> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 675 moveto -<20202020202020526D2020202020202020202020207B202D322E3230363030302C20302E303030 -3030302C20312E373032207D> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 798 moveto -<20202020202020232028726E29206C6F636174696F6E206F66206E6F7365206765617220617474 -6163686D656E7473> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 921 moveto -<20202020202020526E2020202020202020202020207B20392E3339353030302C20302E30303030 -30302C20312E383037207D> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 1044 moveto -<20202020202020446D2020202020202020202020203130303030202023206D61696E206F6C656F -2064616D70696E6720666163746F7220286C62732D66742F73656329> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 1106 moveto -<20202020202020446E2020202020202020202020203830202020202023206E6F7365206F6C656F -2064616D70696E6720666163746F7220286C62732D66742F73656329> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 1229 moveto -<202020202020204B6D20202020202020202020202031383232302E372023206D61696E206F6C65 -6F20737072696E6720666163746F72> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 1290 moveto -<202020202020204B6E202020202020202020202020343237382E33342023206E6F7365206F6C65 -6F20737072696E6720666163746F72> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 1413 moveto -<20202020202020476D202020202020202020202020312E352020202023206D61696E2073747275 -74206C656E677468207769746820746972652028667429> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 0] -xshow -376 1474 moveto -<20202020202020476E202020202020202020202020312E352020202023206E6F73652073747275 -74206C656E677468207769746820746972652028667429> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 0] -xshow -376 1597 moveto -<20202020202020436D4D6178202020202020202020312E3020202020232028636D4D617829206D -61696E206D6178206F6C656F20657874656E73696F6E2064697374616E63652028667429> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 1659 moveto -<20202020202020436E4D6178202020202020202020312E3520202020232028636E4D617829206E -6F7365206D6178206F6C656F20657874656E73696F6E2064697374616E63652028667429> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 1819 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<4C616E64696E67206765617220706172616D65746572732061726520646966666963756C742074 -6F20657374696D6174652E2047454449542063616E206265207573656420746F2064657465726D69 -6E6520636F722072656374206C616E64696E672067656172> -[21 21 21 21 8 21 21 11 21 20 22 12 10 21 22 11 21 32 21 9 22 12 19 10 21 12 21 - 11 21 8 11 10 8 19 22 8 10 10 10 22 10 21 19 10 7 32 22 9 23 9 10 30 25 27 10 23 - 10 19 21 21 10 22 20 11 21 18 21 21 11 9 22 10 21 21 10 20 12 33 7 22 21 10 19 - 21 12 11 11 22 19 10 10 8 21 21 22 7 21 21 11 21 21 21 0] -xshow -376 1876 moveto -<6C6F636174696F6E732E2049207468656E20757365207468652070726F6772616D20746F6F6C73 -2F62616C616E63652E6320746F2067656E65726174652074686520617070726F7072696174652076 -616C75657320666F7220746865736520666163746F727320666F72> -[8 21 19 22 10 8 21 21 20 9 11 10 11 10 21 21 21 10 21 19 21 10 10 21 21 11 21 12 - 21 21 12 20 32 11 9 22 21 8 19 10 21 21 8 21 21 19 21 10 19 11 9 21 11 21 21 21 - 21 12 21 10 21 10 10 21 22 10 21 21 21 12 21 20 14 7 21 10 21 11 18 21 7 22 21 - 19 10 9 22 12 11 10 21 21 19 21 10 10 21 19 10 21 13 18 11 9 22 0] -xshow -376 1933 moveto -<65616368206E6577206169726372616674207479706520746861742049206372656174652E204E -6F74652074686174206E656974686572204745444954206E6F722062616C616E63652E6320637572 -72656E746C792063616C63756C617465206F6C656F> -[21 21 19 21 10 21 20 28 10 22 8 11 20 12 22 10 11 10 10 19 21 21 11 10 21 21 10 - 11 10 11 18 12 21 22 9 23 9 10 27 21 10 21 10 10 21 22 10 11 20 22 8 10 21 21 12 - 11 29 25 28 10 23 10 21 21 13 10 21 21 8 21 21 19 21 10 19 10 19 21 12 12 21 21 - 11 7 20 10 19 21 8 19 21 8 21 10 21 11 21 7 21 0] -xshow -376 1989 moveto -<64616D70696E6720666163746F72732E20> -[21 21 32 21 7 22 21 10 9 22 19 10 21 13 20 9 0] -xshow -376 2136 moveto -(Courier-Bold-iso1252) cvn findfont 33 -33 matrix scale makefont setfont -<202020202020202320287461696C457874656E742920617320776520726F746174652C20746869 -732070617274206D6179206472616720> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 2259 moveto -<202020202020205461696C457874656E7420202020202020202020207B202D31382E3136352C20 -302E302C20312E313931207D> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 2399 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<5468697320646566696E657320776865726520746865206166742D6D6F7374206C6F7765722070 -617274206F6620746865206169726372616674206973206C6F63617465642E205468697320697320 -7468652070617274206F662074686520706C616E652074686174206D6179> -[24 21 7 19 11 21 21 10 8 21 21 19 10 28 20 21 12 21 11 9 22 21 10 22 10 11 13 31 - 21 19 10 10 8 20 28 21 12 11 20 21 14 10 11 21 10 11 10 21 21 10 22 7 13 19 12 - 22 10 11 10 8 19 11 7 21 19 22 9 21 23 9 10 23 22 7 19 11 8 19 10 10 21 22 10 21 - 21 14 10 10 22 10 10 10 21 21 11 21 8 21 21 21 10 10 21 22 10 11 31 20 0] -xshow -376 2456 moveto -<736372617065207468652067726F756E6420617320776520726F746174652E2054686973207661 -6C7565206973206E6F742063757272656E746C7920757365642E20496E7374656164207765207369 -6D706C79206C696D69742075702D7069746368206F6E20746865> -[19 19 12 21 21 21 11 10 21 21 10 21 12 21 21 21 21 10 21 19 10 27 21 10 12 22 9 - 22 10 22 9 10 23 22 7 19 11 17 22 8 21 21 10 8 19 11 21 21 10 10 19 21 12 12 21 - 22 10 8 19 10 21 19 21 22 9 11 10 21 19 9 21 21 21 11 27 20 11 19 7 33 21 8 18 - 11 8 8 32 8 11 10 21 21 12 22 8 10 18 22 10 21 21 11 10 21 0] -xshow -376 2513 moveto -<67726F756E6420746F20323020646567726565732E20> -[21 12 21 21 21 21 10 10 21 11 21 21 10 21 21 21 11 22 21 20 9 0] -xshow -376 2660 moveto -(Courier-Bold-iso1252) cvn findfont 33 -33 matrix scale makefont setfont -<20202020202020537472756374757265506F696E74732020202020203135202020202023202873 -747275637475726550747329206D6178696D756D207374727563747572616C2064616D616765> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 2820 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<546869732076616C756520636861726163746572697A657320686F77206D7563682064616D6167 -652063616E206265206162736F726265642062792074686520706C616E65206265666F7265206974 -2073696D20706C79206578706C6F6465732E20> -[24 21 7 19 11 18 21 8 21 21 10 19 21 21 12 21 19 10 21 13 8 18 22 19 10 21 20 28 - 10 32 20 19 21 10 21 21 32 21 20 21 11 19 20 22 10 21 21 10 21 21 18 22 12 21 21 - 21 10 21 18 11 9 22 21 11 21 7 21 21 21 11 21 21 9 21 12 22 10 8 11 10 19 8 32 - 10 21 8 19 10 20 19 22 7 21 21 21 21 9 0] -xshow -376 2967 moveto -(Courier-Bold-iso1252) cvn findfont 33 -33 matrix scale makefont setfont -<20202020202020232052616461722064617461206261736564206F6E204E2D3031392050756C73 -6520446F70706C657220726164617220636974656420696E205B416972492041756738395D2E> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 3090 moveto -<2020202020202052616461724F7574707574202020202020202020203135303030202023202872 -616461724F757470757429207261646172206F75747075742028776174747329> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 3151 moveto -<2020202020202052616461725452616E6765202020202020202020203338202020202023202872 -616461725452616E67652920747261636B696E672072616461722072616E676520286E6D29> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 3343 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<41434D20666F7220554E495820616E642057696E646F7773> -[24 27 32 10 9 22 12 11 27 28 9 26 10 21 21 21 10 37 7 21 21 20 27 0] -xshow -1255 3343 moveto -<3339> -[20 0] -xshow -1962 3343 moveto -<30362F31302F3036> -[21 21 9 21 21 10 21 0] -xshow -grestore grestore -showpage -%%PageTrailer - -%%Page: 40 40 -%%PageBoundingBox: 0 0 595 842 -%%BeginPageSetup -% -%%EndPageSetup -gsave -[0.24 0 0 -0.24 0 842] concat -gsave -376 327 moveto -0 0 0 setrgbcolor -(Courier-Bold-iso1252) cvn findfont 33 -33 matrix scale makefont setfont -<2020202020202052616461724452616E6765202020202020202020203535202020202023202872 -616461724452616E67652920646574656374696F6E2072616461722072616E676520286E6D29> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 389 moveto -<20202020202020544557535468726573686F6C6420202020202020203020202020202023205261 -646172205761726E696E67205265636569766572207468726573686F6C642028776174747329> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 549 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<496620796F75206861766520616E7920696E666F726D6174696F6E2061626F7574207468652072 -61646172206361706162696C6974696573206F66207468652061697263726166742C206865726527 -732074686520706C61636520666F72207468656D2E20546865> -[11 10 11 18 21 21 10 21 20 18 21 10 22 20 18 11 8 22 8 22 12 32 21 11 7 21 22 10 - 21 21 21 21 10 11 10 21 21 10 12 21 21 21 13 10 19 21 21 21 21 8 8 8 11 8 21 19 - 11 21 10 10 10 21 22 10 21 8 12 20 11 22 11 10 11 10 21 21 12 22 6 19 10 10 22 - 21 10 21 8 21 19 21 10 9 22 13 10 10 21 21 34 8 11 23 21 0] -xshow -376 606 moveto -<646574656374696F6E2072616E676520697320746865206D6178696D756D2072616E6765207468 -61742061207461726765742063616E206265207365656E206F6E2072616461722E204E6F20617474 -656D7074206973206D61646520746F2074616B65> -[21 21 10 21 19 10 8 21 21 11 11 22 21 21 21 10 8 19 11 10 21 21 11 31 21 19 7 32 - 21 31 11 12 21 21 21 21 11 10 21 21 10 11 21 10 10 22 12 21 21 10 10 19 21 21 10 - 21 21 11 18 21 21 21 11 21 20 11 12 21 21 21 12 9 10 28 20 11 21 10 10 20 32 22 - 10 10 8 19 11 31 21 21 21 10 10 21 10 10 22 18 0] -xshow -376 663 moveto -<696E746F206163636F756E74207468652072616461722063726F73732073656374696F6E206F66 -20746865207461726765742E2054686520747261636B20696E672072616E67652069732074686520 -72616E676520726571756972656420746F206765742061206C6F636B> -[8 22 9 22 10 21 19 18 21 21 21 11 10 10 21 21 11 11 22 21 21 13 10 19 12 21 18 - 19 11 18 21 19 11 7 22 21 10 21 11 10 10 21 21 11 10 21 12 21 21 12 9 10 23 21 - 21 11 10 12 22 18 19 10 8 21 22 10 12 21 21 21 21 11 8 19 10 10 21 22 10 12 21 - 21 21 21 11 11 22 20 22 8 11 22 21 10 10 21 11 20 22 10 10 21 10 8 22 18 0] -xshow -376 719 moveto -<6F6E746F20746865207461726765742E20> -[21 21 10 21 11 10 21 21 10 10 22 12 21 21 12 9 0] -xshow -376 866 moveto -(Courier-Bold-iso1252) cvn findfont 33 -33 matrix scale makefont setfont -<202020202020202320576561706F6E73> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 989 moveto -<20202020202020576561706F6E436F756E742039> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 1051 moveto -<2020202020202048617264506F696E7430207B20372E302C202D342E302C20302E30207D> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 0] -xshow -376 1112 moveto -<2020202020202048617264506F696E7431207B20302E3335372C2031352E362C20302E30207D> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 1174 moveto -<2020202020202048617264506F696E7432207B20302E3335372C202D31352E362C20302E30207D> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 1235 moveto -<2020202020202048617264506F696E7433207B20312E352C20392E302C20322E30207D> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 0] -xshow -376 1297 moveto -<2020202020202048617264506F696E7434207B20312E352C202D392E302C20322E30207D> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 0] -xshow -376 1358 moveto -<2020202020202048617264506F696E7435207B20312E352C20382E302C20312E35207D> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 0] -xshow -376 1420 moveto -<2020202020202048617264506F696E7436207B20312E352C202D382E302C20312E35207D> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 0] -xshow -376 1481 moveto -<2020202020202048617264506F696E7437207B20312E352C2031302E302C20312E35207D> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 0] -xshow -376 1543 moveto -<2020202020202048617264506F696E7438207B20312E352C202D31302E302C20312E35207D> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 0] -xshow -376 1682 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<546865736520617265207468652058595A206C6F636174696F6E732072656C617469766520746F -20746865206169726372616674204347206F66206561636820776561706F6E2E2042792064656669 -6E696E672074686573652C2065616368206D697373696C65> -[24 20 21 19 21 10 21 12 21 11 10 21 21 10 25 25 23 11 8 21 19 21 11 7 21 21 19 - 11 12 21 8 21 10 8 18 22 10 10 21 10 10 21 22 10 22 8 12 19 12 22 10 11 10 27 29 - 11 21 10 11 21 20 19 21 11 27 20 21 21 21 23 8 11 25 19 10 21 21 10 8 22 7 21 22 - 10 10 21 21 19 21 10 11 21 21 18 22 10 32 8 18 19 9 7 0] -xshow -376 1739 moveto -<6F722063616E6E6F6E2066697265732066726F6D2069747320617070726F707269617465206C6F -636174696F6E206F6E207468652061697263726166742E20> -[22 12 10 19 21 21 21 20 21 11 11 7 12 22 18 11 10 12 21 32 10 8 10 19 11 21 21 - 21 11 21 21 13 8 21 10 21 11 7 22 18 22 10 8 21 21 11 20 22 10 10 21 21 11 21 8 - 12 19 12 22 10 12 9 0] -xshow -376 1886 moveto -(Courier-Bold-iso1252) cvn findfont 33 -33 matrix scale makefont setfont -<20202020202020576561706F6E53746174696F6E203020226D3631613122203530302020203020 -202030> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 1948 moveto -<20202020202020576561706F6E53746174696F6E2031202261696D396D22203020202030202020 -30> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 2009 moveto -<20202020202020576561706F6E53746174696F6E2032202261696D396D22203020202030202020 -30> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 2070 moveto -<20202020202020576561706F6E53746174696F6E2033202261696D396D22203020202030202020 -30> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 2132 moveto -<20202020202020576561706F6E53746174696F6E2034202261696D396D22203020202030202020 -30> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 2193 moveto -<20202020202020576561706F6E53746174696F6E2035202261696D396D22203020202030202020 -30> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 2255 moveto -<20202020202020576561706F6E53746174696F6E2036202261696D396D22203020202030202020 -30> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 2316 moveto -<20202020202020576561706F6E53746174696F6E2037202261696D396D22203020202030202020 -30> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 2378 moveto -<20202020202020576561706F6E53746174696F6E2038202261696D396D22203020202030202020 -30> -[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20 20 20 20 20 0] -xshow -376 2538 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<54686520576561706F6E53746174696F6E2064697265637469766520646566696E657320746865 -2074797065206F6620776561706F6E206C6F63617465642061742065616368206861726420706F69 -6E742E20546865206F6E6C792063757272656E746C79> -[24 20 21 11 34 21 21 21 21 20 26 10 21 10 8 21 21 11 21 8 12 21 19 11 7 18 22 10 - 21 21 11 7 21 21 19 10 10 22 21 10 10 19 21 21 11 21 10 11 26 21 21 21 21 21 10 - 8 21 19 21 10 21 21 10 22 10 10 21 21 19 21 10 21 21 12 21 11 21 21 8 21 12 9 10 - 23 21 21 11 21 21 7 19 11 18 22 12 12 20 22 10 8 0] -xshow -376 2595 moveto -<646566696E656420776561706F6E2074797065732061726520226D363161312220666F72205675 -6C63616E2063616E6E6F6E7320616E64202261696D396D2220666F72205369646577696E64657220 -6D697373696C65732E205468726565> -[21 21 11 7 21 21 22 10 27 21 20 21 21 21 11 10 19 20 22 18 11 21 12 21 10 13 31 - 21 20 21 21 13 11 9 22 12 11 23 21 8 19 21 21 11 18 21 21 21 21 21 19 10 21 21 - 21 10 13 22 7 32 21 32 13 10 9 22 12 11 26 7 21 20 28 8 21 21 21 12 11 32 7 19 - 19 8 8 22 20 9 10 23 21 12 21 0] -xshow -376 2651 moveto -<657874726120776561706F6E2D646566696E656420696E7465676572206669656C647320617265 -2070726F76696465642E205468657365206669656C64732068617665206E6F206D65616E696E6720 -666F72202261696D396D22206D697373696C65732E> -[20 20 10 12 21 11 26 21 21 21 21 21 12 21 21 11 7 21 21 21 11 7 22 10 21 21 21 - 12 11 10 8 22 7 21 19 11 21 12 21 10 21 12 20 20 7 21 21 23 9 10 23 21 21 18 21 - 11 10 8 22 7 21 19 11 21 20 18 21 10 21 21 10 32 21 21 21 8 21 21 10 9 22 13 10 - 13 22 6 33 20 32 13 11 32 8 18 20 7 8 22 19 0] -xshow -376 2708 moveto -<546865206669727374206669656C6420646566696E65732074686520696E697469616C206E756D -626572206F6620726F756E647320737570706C69656420746F20226D36316131222063616E6E6F6E -732E20> -[24 20 21 11 10 8 12 20 10 10 11 7 22 8 21 10 21 22 10 7 21 22 18 11 10 21 21 11 - 7 22 8 11 7 22 8 11 20 21 32 21 21 12 11 21 10 10 12 21 21 21 21 19 10 19 21 21 - 21 8 8 21 21 11 9 22 10 13 31 20 21 21 21 13 11 18 21 21 21 21 21 20 9 0] -xshow -376 3343 moveto -<41434D20666F7220554E495820616E642057696E646F7773> -[24 27 32 10 9 22 12 11 27 28 9 26 10 21 21 21 10 37 7 21 21 20 27 0] -xshow -1255 3343 moveto -<3430> -[20 0] -xshow -1962 3343 moveto -<30362F31302F3036> -[21 21 9 21 21 10 21 0] -xshow -grestore grestore -showpage -%%PageTrailer - -%%Page: 41 41 -%%PageBoundingBox: 0 0 595 842 -%%BeginPageSetup -% -%%EndPageSetup -gsave -[0.24 0 0 -0.24 0 842] concat -gsave -376 422 moveto -0 0 0.50196 setrgbcolor -(Helvetica-iso1252) cvn findfont 68 -68 matrix scale makefont setfont -<5374617274696E672041434D20666F722057696E646F777320> -[42 16 35 23 16 13 34 35 17 39 44 52 17 14 36 21 17 60 11 34 35 32 46 30 0] -xshow -grestore -gsave -readpath -V017701C8B0004B0E064100B0084B0~ -closepath clip newpath -gsave -375 1655 translate -3.125 3.125 scale -[/Indexed /DeviceRGB 15 -psp_lzwstring -J,g]^GRso^GCi*@P@M8$7Gn2`?LBT~> -pop ] setcolorspace -512 384 1 1 psp_imagedict image -J-$ii3$]7K#D>EP:q1$o*=mro@So+\<\5,H7Uo<*j@fOaO@Wn[3@'nb-^757;IDnq>q_R=AlC^cenm@9 -:1mM9jS"!dOb)Qb$7+&(*McSI<4ZX!SPQ1`C/Bd&(9K>@q2!+&E`kN%="TT%^]4@"+:,;H.PE]Y>'a770mGYj&K$PK,B=)! -G!?e*"67g3<15ZmP=B+=k[^u524I>'':IA19 -4^F.Nlk-c:^/6,A9rqBb%A([YYY/d*W]eYlFh:rJ(RrtC2,L,JDpV[X(:/_4@H)92Ks)A3PM'PKa_[.c -NL!]:n,R\E#S2O'@#ud!*X<+._kHT+N(PH3MT)=[Ls0Tm*0/(7nd,:Y&L,iAtW+:\C&b.nR&N65ci -Ra%`$M9Oli,DJnME2XHp*=JUYBMc3U)M^\V_s'#"ocfGkTh&qkMTonF>cu\ZnQ?it:F;=J-'IM'lITj\ -gS],HNE2H?Vbh%AC6dfC<4Q>=pNrJ9_1]\aYkX/P*lJ>i=R=Uh,ei0#b2oM,a8d=g":'S;E&]B]%1.\R -@*ki73YMpX6/f'3X>2(4Ma_)0LqHJ!,EBlVdWn6X<@aA.A^^C-`aprp9kMk"5WfW?Skj!LE!-R]5`O0) -e9XP1PtRuD_%Wfe7\s%`YurY; -r!!?GCV&JDfR-.9'oS6*1"cDY7f,TiATH;E,QJ,PJ\`J5BKRIP$AHA@YipI$,8,jP,-bgo@P\p^a!%++ -2uk$EOi\lSBfr+g.[A1'!.];<4#35K-F7F!ic@/OcQLX2%(:dTU!Y/an3nOb8u9uc[-E'+UJe)A.^a$) -@^B7?f.48orIVprX%4YICH\Ct0X9@a[d/@Yj)V]d0"5S4QIC/nd-14NrW<7S_;R)XCF'&XMT*]@fR/-8 -,Eg110\;h,@K6pi5i@`+1`-c7"@D(/fQ9;#&W&p8O]\ts0c>s?j,r!dIR,->8E>q9a;b3cPtL/$flXr: -!ee[mP?G9LEB0RbkEFTk7Stn6;!=-G<%1=T#U70`V>ATQ!FQ)@m+, -_P(qiC^^dR#K3?V8?>uJ(lZJ0EQGp<*tFCRUiK$XRSP>rb,'.#CqIW=h -Q^d?=]4&M5VUdgTo$MTCh.W1ECl[s9\`3)/l8CPm"FpIQ!/M=!%0qPQ@8OIE2B<H!;Xho0i!^"@'M-pG$ubueY;RPS>'.mXii1/HHe@K -AZO:]'%t2AeH`QcWYN-N6K]W(e?8@%m#'\AOkm(E))SMr3Q'i231r\-OcIKC1,N`G1A>:Y7UQ4H!$V^O -K0^Xl-nHha",4T7nCUDi'b6&<@W:Oa8i[T?7\`gO]P^(XP/QB7q';gN-'1ZoZFI9I?Se(ijq;r=@X0o$ -as[rB'b6'hUJ]s"Du`(i9rCqT'cN?4WE#uuJH5O7L498`:?OBGQ$1,WT$6R7\Fk0a(9UaaEQ^2uf.=L% -Cba[]`qMC(?=hLlo_/)n^0U5mN)hSLNSi%#ZNhm"c(!( -Yo%!u*taIM,B6hu@OV\;7:WVoj@WDXKudee3CHI[(lh)Hdn+Ya/NT'2V6]m_C5"I*87YUYV#iG&MFH_b -3fQb0<3"KKonnPF!"Z6aX7co1MT985frXm$5X)Mj[bIf=RsiG_EOjo.pP[;]Ytr'jYP8L]DUF-SiNW#k -`k -VH#.494cQIKR+RURS@DCGf4W44.]5\e+s4PKgVS--?G&5-C#:9;.JMi/OB\=W_4gA)&6JK!iZ/MeU%I? -(LO>dlVL5+P0[UDfB*iPSVg-YZiV_b\c!S9HbN3g[Q6"gj)U2ajgPW:gD,@Z@Bapu1a:D!X]T/eN-kU; -!eJ01YWr=,&Hd^g+cpAb66d,"`?MN/2uk$=NQ39Kkkp$",*Btm!.]Gt*>XpYAPhT$W`q$B_PT+L]KQo\ -JPMm..?)u1&=ULGF4aaW/OY9?B9^P-3h'$H`M4&L]je#RA@XP1apm>7QA2U$t(D*cF#mbGR-&jN`65R7-#_8^o4s2keO] -OW!ffOXuj8B[[;g:5K:Rc)PoceQSSMX&A/HgBF0u:S$.?2(Ng`i=q9o/sfeMhG#Jc;/=Pe'p>Uk[_usH -)tjo^5c`4E'H5N.&SK/B,.SY'At8o)!!*X%(]k3QJO(GuQs;Zm",K;f;&F[10,&n'+OR^;<\4N2`+1Q( -oO]flNC5"rBl(@f0UU(\TPslpD`F94VfTuHqL:c'cTqR,S;p#OUWP"T=X9G/8X.^M'fc.Q6VWlpW`"/N -7StP;<9!S]N..g8ZdYc%Wf%4)$4$oi66L5l4;nk:L;P0RW*DA6'9#?<0W9@s3>[TC@e$BB68opG6mXV!7#Ft_ON6;mff[De -)j*m.;n:u_FpA!LkYsSh(6(h[;JB+AAKVNpT1&_p33>qU0o8T_o(pke?Oj)*//*p]7N#a%etQ&g[B@D' -Wm5A-gJ#35BtN*%Z'iSJ9k(TgX*?^2lFC'1eLd.-rLX0haCK^**XINgiXl.j+t!kX`1l/q]NQO#O%87D -)&.fa,Ek^\&t)_%=Y5t5jqAVsc=R:]6DkKbeF%TAL.UBER-\Q07#XR5e65gL1J*Tq.1o_u3gimC;CWAo -e<[:8XArrAWpJ0UA[>P,(7S:?D*>@4mM":ONeL;cctbRdIG4F?]\`).li%Ck?,'h4FSlmu3E)t^neiF5 -:FVP3>Ac+pHjU)]K#+,LLeK94#R>r)nHb(=!>C7-,#LnP+tj[ja(!HKhuZCnLrJCP#o%\[,a:fpo!rRW -5r=\H@rlop8pM8S$7p7&EQ^#K.b3GVB210nda4&6Y5IF"s$*k>7$-iWV]< -c=iG5*@>2aTMK7Nl@]pk2N?7%eU#2H[9Ke&j0G]hL;dYe9.RGq>uK'c[TdV"qh<&O"L$K2f6bH!c#]r7 -0:2S@#6fas7BX+i7OH$"_W,Xgr.[]fEl6nBfm+83&.\n0+L#NA+qk<;_]c8JHpT%jM8^[DBY7e1)NDc^ -Z078h!"Y46,dM,HU/NP,b9aH]'RjOIRE[(bBtWGH3h=-`1?n`=K0kkt-^8@/,*PWqdj_R/'b7!:WQHWr -lFgZ5>-6C*Zg+B=_a1>)Cpn+BU=3h[fWDUH4d+?9\_SmIB\fuOHFDUHpZqe\")FiAn?r_m$PSE:j!OMj -2F<+R`oStdCqMM'#64kaOB==\&IF.XiK2]6-kHml7,j>2ZsGI)NCMrjf^sVY+d#=VP$'W5;(7c&jc\:* -$6M!j9]hGhN4O!hSPJ@3g%>8p6(pb['3[77OU7N(l'0nE5+tiQ<933"64CBm!:l=ON=5<8M#N+%u\T,Eli./?SIkkVK5>1g(P?f:8`0Tm#k4) -T[9WZ8hCsB8>O)b1[8g-D&0`+bJDm$Y!&dnnr_BCV3>V[6""+UFB.%F0c(5p0W0rWlJ0F.p$UbXA=P"R-a!Tc)9 ->d@QdQcpd4.@eh$#EVO?1TB1#HTm/%,IAp@&rR]icfm9d>`Kp,Vpm1R.\0J<+R6fJ[pPYNY8"+UFBR+-"6*KN_O&fDCD56?_Y^_2J`!a-t*b%8q&Cs#O2M+-G[fjnhP -(m7\Y'H.\b9fAbDknKRd/e'e6e*7YbobMC!JlSO&C;jEi>+/A@'^>8P2e/gim1_UXK%Y"M>N0bj:!VuD -[EW;@\:s3J?FWo"on+`DR/s11lA*Onf?$6Z5b#]mN!(7)(!.ht:&;V#9$Nl,LiD>>8&fh16 -`M2mYbSUfi#D;'Akko`g+Ge,"nek-$="KZ\V=P"PKFeZR9r@N=bj'C7T$O>+W8u*V7&&)+'1rC2.1V2$ -TTN?Q/tl1!_eKn\9k'AQTh")t#o&OiA!'XTp5;Wl\SS_/XnN3GHIHuIdHu,2AR:j1Vpak[lCCiI=1HUf -ZCF=G_.Kq-Z2"^-f+!tejg+LA!#ttLJjEekGXNkn$\h#Wd%EWd&JL$j@aTG1!\51G`hS'?oNFHnO2tjO -\Enf=.[7q!deSR5"U'CmB!=;6*cDR\:M8/O1e(tBU/>URH:90G9;Y-iF:*^kV$WhoAJ2OIDuh,_en'!G -CpLleX&Ea(=f&!:Ba<5SG5HqNX(AkJDV'6S.\C^p?XXa4/=sHD6!Q^TLt%6L'6XdACm -!$;8n_'#siGTm\)Ku5(mMh!7^qHRop2l>!f[;"DGTj"SM.s3>TK#9"d@[E*&?H[Wck -&@C1EZV,G`o4GR>YI5ChlN;a4?SC&F2?O2AT7QNWlR"\=g[%*3Lrq.PM,U-FXibTk`f58!g-'N -;X'G"FZuK(Ti#Qi=R@0)=fk`jQ.kn[6W:$fm#a?JK$e;?>4%X.Fc+@^W`e`@>IE>XH(E_C=4r#Momsqe -n<^3;q[jmb@<%[iG!;=L`8or<]S9cJ!!GQ[E(DMu%g[j*TlA(h3Zeoh`1[0M!'W%QN5hW4aR"4;+HXW0 -!;N(Q:FMIMV/j[o\mI.YbbfG0XGUpUSBdoC8Yl345bQK&F@n,'JMs(IWH?5Bp5`%Ke>dX`X]gQQVUheh -MLAgG@'J:bG"M@=\S/@iX4CKl]&.J:eSOr[X`E*8]RfNqbO,0+JAC*IGYB_/%uA0`Z$=K1&kd5U?*\Ra -`TJEFJ,g]g3$]7K#D>EP:q1$o*=mro@So+\+:o%d7Uo<*jE<[.O@Wn)Du`'r-^757;Rp>H>q_R<,4[1Y -enm@9:1mM9,fY6sTMT<$3[GQ$8!H``'04l,SK"0K.TJKO17qXLJccW*D(s -!X&Vb!/R.C.h`#8,#N%/E]Y>'a48> -!(:9O#fO`(:8^YEodZM1X":-slSY]uEgK;s!Leu\HnjY+jjI-[Uj$:fkhKr-&PDOLY/[_8JRiIBtHgs;d]dsq,j03X10,a#+L=a@IY&3IL<,W``9'> -/7qYd6&+%O:]P_O#m,ZD+E0Sn)A`L06Qo9^Cdo!@K>\ppR)E/I&;rteO[sjp7hgToUTg,UISCc?abf[0F1V=%I:9D,kE[Uj -(<:*pgM=8+La%K_!(PnPH"=cd/""8NZKp'3o7X`tA$PpMi`cn]9JO&VA9/?<_+(\LVuRG6"+igH@"M&9dX1B`0g;2T02i^0icgI(:ZcpBS,a-&J\`J5BKRIG#64kA!'kcA*ta;sU(Kq\:,*N? -`FG$T`+D:SNCY;B8Gn?*,a6BI&m9%R;)4>+jO0Eki`/%1cG9MVoHjeNTMT=/C--0[-E'+UJe)A -.^a#V&sGid="B@T!$]6fK%R/*4"MGtA$`u;(95p%NCsCJ@l'NH549MRh^O^-oNqK@S'<;3r&ts?j,r!dC(V&?6D3g=4Iu^&"A0tZ -3Fo-a,a-u:acoIr8$_P%NS>WNrbj%g5?f&]j<`&-i2)U[gu-RSP>ralFT?Cqr&$KW77hf38C5q3hk3+ES4m^^L4:uVR;lSRa)0=;!g0!CjK6#O^,%J9:af& -Ge;h92p:%RqgcH>YW,;t)[gqMJan!/DDjpa[q);BlQ07`R",:s:bY-s&I3tU@8OIE2B<noGT"kNCTdBBFnoY.W%2E -<+Jq=D-!c1WE*e7]&e+K.'(b[p%p#'WFUgLUk[38]O#MX]B/bb22kg[;>\',%>Vl2 -EEK`)cNfM_;_a\&VH5@9VSE2i!.5Ce#(sc90W853)\.Q'!T8d(;C`N@`Zm4:gi>ItO2rS%.3+LD-BlRu -19"Na>9SPbjteHVdMidb:+%ish"#eUT?nuC.*TPD7\eBT1O:&sRnfm2.Q&]G^'@61eg>LMV/j1SYLkB` -3\=seAqX4OR=1&K$a-.2@b+^u,3?DE/_u8)t:#'TPa2OFdN'GuUqL/XK,m',d%[Bf2AH@kqcJ -mWgsY8ga0K'b6'hUJ^7iQosMZ9rCqN'FIi8WE$!!lP5eH18/!W:?ki['opCIZWZ8;b5JKr*jF?N(E8Xb -kq]YND\`.tf&-eJ?gnmP((U_*_dW'PS5:8*I)f(OpRIL0pQ)W"5S*nu$3p]c_4^:R9I^heL;Lb,n3fkr -'T0l(nVGD(2]RjuU[e^"MD>D:"6B$09WD/FQHQ,r$&l;9,FZlSo81[p9/<*bVt::SHiZ'p;5j,E9e&:g -T[Tn5$"Xm=<3"KCFP;^h[m,[BA@4J3MT98(en^S09WH!A[bIR#HWA59Cl?pi2Z(bapD(3nn+?LZni6li -aQ]p#7%/N-^fKr+g*PbgPfh[aGj#,k"Ts?B@*j-d-4C.bJg&M9KLR7$MFD"%E!0K))idEsi,Af+6R%[[ -T^k*"VH#.#_d`0BA9qfCRS@DCH,Si2/=oXMe+dajF$ku-BU!c&llRXGKWH -[47Ri\^KjXGV-?/HFl^cp)$e-gOkR;Xr)OU-HTT0@r]jG*\)5C[TVTJ -k]?e)#R!DcE+h?X'+0H2!8mj%496(M`$+YAN++:KNQ,I*khK?)(QM'4Z=uEd&.aC]i_XlAWYmR[bpKc2 -]]*unS^/H5ksYZ+6D;dTZC+tkP=^AAjfhm(&t;dq:M94MUkUa%P/us/(n>3C7^:A!nMiqRO]8aC/[jtm -m]C$1h(H!9NPb:!^#(:rqOQnaV7OkDU88VXKYma@$3Z@)e^?uieo^1%'J"9H:LPhL7D2(kS%lBPP\*hc`&8n7H`XO=d+Yu[iH.g59I4IaS=F,O;k_*FF=Wca-R)C]41?LO68oEqF: -_-lb6C]5CfHbeSpR+R-31O-k!nsN_E0-(#t^n>X;//f$)KYi;uLgVDK&;\9!ECd070,TYfUN+B-*!$G/ -aJE'&D`Ej$k&\Z2qL9'Fc=h;k`9o3,LJTFAb&'1R+JRAcE2l&bY?7CC -Wg1`n0FqQqfW7=F[:[`u[*1%ClYR-VC:N&t2&g\lDudQ-YBS/A.d)>tghiC*/;iD<`7'83XDCZ3Nl^:X -pe3SL&Vtr=+Ab$C((CM%6=E^#A2YG=K7i/\32BS,(Q:gn;7P\14VEQAA5YE5Q;&`k!Pfbs#D+9X -M58^>2k3WU;n:u_I6X8pVA)';(1fb,;JB+AAN$)TW'TWH>,>7]8#Y!S&@

&_HSAuG*bK&N@J9W7E"bT,"&=?EL)%D?giXm#`*[qh^73HRue8@8e -O%87D)&/*&'*&-r&t)_%=Y5t5jqAVs\cjCL:$3+]3!+@gT1r_bhukB^6\A0I1n%DsR8'SSk&hT-:8ot@ -;l^Y#PsT1&UVgcQpa$idA[>P,&k_7dfkn2k.e]?s@b5S&6#;X`%H?Q!^L-H]>CI(h1Uu?t&j-l/%LB`- -YEujA&p[u^;DQT!!$DjT!'m2rLeK97%#2ZnnHb(G-PVHWU@F&`0Fe'fa.r23%#RP#P0'NjM'*o_)OARC -o*EQ\9.P_4T[5Y\&pHC,c6k<%/HUJaK#-WV)GM]J9W$:4dlC,pVc9\IN:gpBc7kX`V/1Uc&%/lLt[shBeJ(%2.8N[SZM8S$7p7&Es7OTE6/.>5]P1R_$Mds8moD$6/#B@H\[ -Y$F,@a!+?9KPHW>LI3:?l-6C,[H`HrCqa?Y#_>8!OB==\&IF.XiK2\/)upM+7,j>2ZsGI)NCMrjJ3Z:=+d#=VP$'W5;(7c& -jc\;=^0raY`$;Tk[,,dAO3FMcg%>8p6(q-=PZ\FCF%N3+iq'`=5+tiQ<9f`PV';=1X\GeFCA!%l@Biqu -[>Ne3d1rh;/XG.6^>WP->&KV;?,lD[]jC/j>Fj@H9"Wu"Qs;Nja+(nal]MZG59Z02:[qQ2ZtfmH"@/W! -81YYi#_^'gE6)iV*tX7HU2``*=t^_O`hROp:`KHGON=5<8M$<+.$VlNEc=9-4#!&GVK5>1g2As@cCkjG -AGUd@TZX+[\h+h]8>O\5FNBF7Ki"_tUsr"R>-D&0euNoHI87ObT@I_C9.cUYBXHBm2Top"a(`'=Y'3O? -C=d@9fPVL@mJ?j5[7DrQ9*OnhLrA;XF*knC+$da(13lQr=r33L"5m!8,SggoKL0*D\7>jV%g5:0;)k@P -/Jj@8@o9bsG!-q/87YUY,aM.PPY,Lb\G.$E%@Bh$;`J#G=Z;jGB2cA%p3f/u:h'"[V&#%\KMACE\n*dj -:T.6-;V?IBX]LogWcbo7G.h7e<2c(?-'f'FYhEqp]4JG*A$]EV[Yo:Zmp5sI1?uT41-,-F/ -`)1Ij>\5o8O.P5`3B1n0+d^D$Y!&dnnr_BCV3>V[6.LVtAk-m0K0%u\FP0rWlJ4!'I(,VdY24sq\@ -asAgB>d@QdQcpd4.@eO2,+Hk*1T:M?Bg/09-or"E'UXUbN.\0J<ddn@2lkd*q[L,BYV`u2q[8.ri[X^3(,EKJ`8i[6/=a`sNQ]B# -!.];<#mGrIi=MAU/f>+R6fJ[pPYNYBMacY+dZ!g'H.[k@6C;^knKRd/t#Fq8>pYLPtk1FVcE$tRal;d9qPE:()dWc]4Ji -P"B1,J:(['/!`h>deSR9AM]cLB$cphRWU]`:LoWF]`s0XU/>URH:9.k3M05aeG07LPuF\_C=RXLAg:!J -=)69rQ"n9JZ<;"pG]e&ACUQa72N*:/j`A",X]F2qIc#:^?Z4QnXkrZ%VdAj0Hq#Iu7DWCeed5))-'QJ_ -@^t3@!$;8n_'#sq4,O5bQ8re%.+LO%?(pWH?4?p4Z>Ae>1SdD-F,F -XOaFog3l`2@%YtbQ:ifucY0];X>\7

EP:q1$A&.\n3@So+\<\5,H7Uo<*jE<[.O@Wn[3@'nb-^757;RlKA!=bDi -AlCZo5$9h7:1mM9jS"!dTMT+gl(o/T7taU8<4ZX!SPQ1`C/W`5,-=q7;Q=lNj`\=EYZ.QdM^=Z">-Q^t -Jcc -W*D(s%YT?5nG&MO.g,s)!"cZ)>!!dZ`Zu--I$.,LPKG1,WEc`5/sLr4OnkNqCGq[--Sq]C7X%%K`Zn9Er*KnT"U0"HTX'N"o=gl@dPWOQD_$I;KY;`Im -7d5B:i%*CS]Oir%T`Qq^>EgJ^'Z/k)q&"8.JKqkj+9;0N%LE;k6/\DdGTn"7LI:&5(mIcE'oPN@&X_'c -3?=/Nj.HZ_Jfk&K8V%M27$8Mp!(u6K3=MK^.?;TGZKO^EGs.cqkS(I*eqlhj;<\d`<.[P/QqF7*H$$nJ -16,?][>;KT.6=-RlkUNT%[Ub5=mZuo4Z89qL.gbg33?@C>*m_k(Al=Qo3.&R,'E2e%gdr@=Y3aG<\G>L -[S^nnbDkq"+2;%N:]N`^":0Upi,E?T()IC6_Z91^F=n[HMT)=[Ls0Tm*0/(7nZY8B,p\YqV"0@9W`La; -bGFe:N65B*Oj)dh(fVPp%Z!kh;e^XY$im$=TTf4(.ZZ-:8`Gm?NCp*JNl\,`MTonF>cu\U;d.u=&S/#i -V">P#3[6_>dUs3hFIJn']%sOZR_=1EI(nLApY--l`sKW6/FmRM[g?lGgM%53I5Zii\m@/fL]BUB"+if> -!:WB''aoa`@F4e&7O8_*7:OYh`+CkGN^eO1M!R)%,61'+Z=s^u%jQp%,B?@8,%36k9Vmi=,iU[3M+Z^4 -q?7(W6_[Fkcr`E-PtRuQC"3!55!MoE6R?djI(H@_Sj[5@HNf/CA#*/+G'cZTeSC1Em?H>;[bjl``%1OS -`THgpUtkFjr!!@(DS\g10cN"d1NeK/ms+ba')RR/ATHB",QJDXJ\`J5BKRIP$AF'3huEm2*t4"F,-beq -3Yr82a!7kQr.79[Oi\lSBb2I7(Rs?j,r!dBFk]18E>q:1nIPn -PtL/$flXr:0pt_tP?G9LEB0N,U\!12rdc)OcDZt22'.lOV,HQBg2rX+6)diKOd[:SZ!"20l]p2sITo[L -f^+ge]n4XG[9Ds`gAQoPEOeO)p?T-CnThfSXqs1mQKrn6@.9Og1tqhV`Dl=dI!.^tOhO6RH!Fm<,le'5 -TQ!FQ)@m+,_P(qiCcWXLLr?$-8?>uJ(lZFahuJ.N59Q'/UiK$XRSP>p!WhhjCq]*V)V:P$X]O#MX]B/bbJ&#H2=?IoH -%>Vl2EEKkc2][t#A9(g8VH5@9bWl3u-l`j-#(sc90W853)\.YA+u(L9;C`N@`Zm4:gi>ItO2rS%.3+LD --BlRu19"Na>:u8d-8R*@dVCb1_]U'~> -grestore -grestore -gsave -376 1798 moveto -0 0 0 setrgbcolor -(Helvetica-iso1252) cvn findfont 34 -34 matrix scale makefont setfont -<43616C6C205369676E> -[23 17 7 6 9 21 6 17 0] -xshow -676 1798 moveto -<416C74686F7567682074686973206973206E6F7420636F6D706C6574656C7920696D706C656D65 -6E7465642C207965742C20796F75206D617920726567697374657220796F75722061697263726166 -7492732063616C6C207369676E20962077686963682077696C6C> -[21 7 8 17 17 17 18 17 8 8 18 6 16 9 6 16 8 17 18 8 9 15 16 27 17 6 18 7 18 6 16 - 9 5 27 18 6 16 27 17 17 8 17 17 9 8 15 17 8 9 9 14 17 17 9 26 16 15 9 9 18 17 6 - 16 8 18 10 8 15 17 17 10 9 18 6 10 16 9 18 9 9 5 16 9 15 18 6 7 9 15 6 18 17 9 - 17 8 23 17 6 16 17 8 23 7 7 0] -xshow -676 1845 moveto -<7573656420746F206964656E7469667920796F7520746F206F7468657220706C61796572732E> -[17 16 17 17 9 7 18 8 7 17 17 18 8 7 8 16 8 15 17 17 9 8 17 9 17 8 17 17 10 9 17 - 7 16 15 17 10 16 0] -xshow -376 2006 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<41697263726166742054797065> -[26 8 12 19 12 22 10 11 10 19 19 21 0] -xshow -676 2006 moveto -<596F75206D61792073656C656374206569746865722061204D69472D32394D206F7220462D3136 -432046616C636F6E2E> -[21 21 22 10 32 20 19 10 19 21 8 21 19 10 11 21 8 10 21 21 13 10 21 10 33 7 30 12 - 21 20 32 10 21 13 10 23 12 20 20 27 11 21 22 7 19 21 22 0] -xshow -376 2162 moveto -(Helvetica-iso1252) cvn findfont 34 -34 matrix scale makefont setfont -<5465616D> -[16 17 17 0] -xshow -676 2162 moveto -<5465616D206C6F636174696F6E732061726520646566696E656420696E20746865207363656E65 -2066696C652E2020496E20746865207363656E652066696C65207368697070656420776974682041 -434D2C207465616D206F6E65206973206261736564206174> -[16 17 17 26 9 6 17 16 17 9 6 17 18 15 9 17 9 18 8 17 17 9 6 17 18 17 8 6 18 9 8 - 17 18 8 16 15 17 17 17 9 8 7 6 19 7 9 8 9 17 9 7 18 17 9 15 15 18 17 17 8 9 7 6 - 18 8 15 18 6 17 17 18 17 8 23 7 7 18 9 19 22 27 7 9 8 17 17 26 9 17 17 17 8 7 15 - 9 17 17 15 18 17 8 18 0] -xshow -676 2209 moveto -<41646469736F6E20616972706F727420696E2044616C6C61732C2054657861732E20205465616D -2074776F20697320626173656420612053686570706172642041697220466F72636520426173652C -205769636974612046616C6C732C2054657861732E> -[21 17 17 6 16 17 17 9 17 6 11 17 17 12 8 8 6 18 9 22 18 6 6 18 15 9 8 16 16 15 - 18 16 8 8 9 15 17 17 26 9 8 22 18 8 6 16 9 17 17 15 17 17 9 17 9 20 17 17 17 17 - 18 9 18 8 22 6 10 9 18 17 10 15 17 9 20 17 16 17 9 8 30 6 16 6 8 18 8 18 18 6 7 - 15 9 8 16 16 15 18 15 0] -xshow -376 2363 moveto -<46756C6C2053637265656E> -[19 17 6 7 8 21 16 9 17 17 0] -xshow -676 2363 moveto -<496620796F752073656C6563742066756C6C2D73637265656E206D6F64652C2041434D2077696C -6C206F6363757079207468652066756C6C2073637265656E20287375727072697365292E20204375 -7272656E746C792C207468652066756C6C2073637265656E206C61796F7574> -[9 8 9 15 17 17 9 15 17 6 18 16 8 8 9 18 6 7 10 15 16 9 18 17 17 8 27 16 18 17 8 - 8 20 22 26 8 23 7 6 7 9 17 15 15 18 16 15 9 8 17 18 8 8 18 7 7 8 15 16 10 17 17 - 17 9 9 16 17 11 17 10 6 16 18 11 7 9 8 22 18 10 9 17 18 8 7 13 9 9 8 17 17 9 8 - 18 6 7 9 15 16 9 17 17 18 8 7 16 15 17 18 0] -xshow -676 2409 moveto -<6973203830307836303020616E642032353620636F6C6F72732E> -[7 16 8 17 17 17 16 17 17 17 9 17 17 17 8 17 17 18 8 15 18 6 18 10 15 0] -xshow -376 2489 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<20> -show -376 3343 moveto -<41434D20666F7220554E495820616E642057696E646F7773> -[24 27 32 10 9 22 12 11 27 28 9 26 10 21 21 21 10 37 7 21 21 20 27 0] -xshow -1257 3343 moveto -<3431> -[19 0] -xshow -1962 3343 moveto -<30362F31302F3036> -[21 21 9 21 21 10 21 0] -xshow -grestore grestore -showpage -%%PageTrailer - -%%Page: 42 42 -%%PageBoundingBox: 0 0 595 842 -%%BeginPageSetup -% -%%EndPageSetup -gsave -[0.24 0 0 -0.24 0 842] concat -gsave -376 422 moveto -0 0 0.50196 setrgbcolor -(Helvetica-iso1252) cvn findfont 68 -68 matrix scale makefont setfont -<53657474696E6720757020616E2041434D2073657373696F6E20> -[41 35 17 17 12 34 35 17 35 34 17 34 34 17 39 44 52 17 30 35 31 31 12 35 35 0] -xshow -1132 422 moveto -(Helvetica-iso1252) cvn findfont 38 -38 matrix scale makefont setfont -<2841434D20666F722057696E646F7773206F6E6C7929> -[10 22 25 29 9 8 20 12 9 34 6 19 19 18 25 17 10 19 19 7 17 0] -xshow -grestore -gsave -readpath -V0177021AB0004B0E064100B0084B0~ -closepath clip newpath -gsave -375 1737 translate -3.125 3.125 scale -[/Indexed /DeviceRGB 15 -psp_lzwstring -J,g]^GRso^GCi*@P@M8$7Gn2`?LBT~> -pop ] setcolorspace -512 384 1 1 psp_imagedict image -J-$ii3$]7K#D>EP:q1$o*=mro@So+\<\5,H7Uo<*j@fOaO@Wn[3@'nb-^757;IDnq>q_R=AlC^cenm@9 -:1mM9jS"!dOb)Qb$7+&(*McSI<4ZX!SPQ1`C/Bd&(9K>@q2!+&E`kN%="TT%^]4@"+:,;H.PE]Y>'a.0li%R,A -*L<]2\`)s88_%SKNlT%UQ9,duNK_Kc+9;0J&.&Gj^k(uG6lH@@LI:&5(mIcE'oPN@&X_'c3?=/Nj:W=E -N_'`dJgD%["KVVQ"9H:L8U(:Q24I>'':IAqh[?-e94ONla0^:a-TFX==lN[aOQMMJZheFh:rJ(Rrp':G.r7,o,>`cHCpZ@GuBK6q5^c\'hE^*.@9) -Q-3b1&-*s_#6]XpT^[b2.LZgj6\,4;"?Ib<"+VLZLp0'%*0/(7nd,_^7jO8=5nMZgD?VNl94`/EI(ElD -REHq@.C:^O4J'lsoEl$7LI@laW:YsA.[L9m`8XVgUh24^WQD15MTom--j3IYQ2,7AF(:]ajn"rV1=p?N -gTC2XNQUEMVaKnHGdLp;>JB!und=d5#DBtQYkX/P.XcKQ?8#;_joZuqXC/;YL]A%k"+igHd!.r*'aoa` -@F4e&7O8_*7:OYh`"3spN^mU,huj;s#64kedWn6X<@aA.A^^C-YRh,_GM&9fR-.9'oU(AES11'P3%nM=Y^kB_uLANJ\`J5BKRIP$AHA@YipI$,8,jP,-bgo@P\5kJ-#3( -r.79[Oi\lSBfr+\#RAAGZKZbR@ksIs-F7F!iXHllcR6'`r16tMU!Y9qC-s?j,r!dIR,->8E>q:1nIPnPtL)pE!/(- -0pt_oE;=&$EB0RbkEFTkrdd@nbGLM-2'*>fTi1->g3#TQ;5m3"oSU%_AP/rQl]p2sI_epV<\0P=4_hlK -[9Ds`gMMtqEO+:Mf3>Z>nTg@(/m$aqde/1-@.9KYXnr]!^gV5Mgibl.I)P+)\@dQ'0`V>ATQ!FQ)@m+, -_P(qiCcWXLLr>s:Du`'T(lZJ0EQIKm59Q'.5lg\MRSP>rb,'.#CqF,GBP^L4:uXEI2.B";T^`iIZpD7\VD\CGEhX0$Eq-icVQ -:d>3\q0[bOC0.JWb--PRiahhs4urpj]4@mbN+MGSR",/;&3(X:#mZ,M@8OIE-4L06`*uS'UfK&`N(.;3 -#[DC-$4"X_;E6"g9dc/tAQ$'4H4gG_9.!RtUt/KN#KPd9k\q^h/c\]1PGltpM+=@>BiMU5%LGn$:2,tS -9Yr#.RoX<)\NJl87\J(?nEL^2$O*c\WUm_qqU5MSg+?9;4U/_D\m;E2H]>W.I(*6%pPXJ)d;QJLY]l"r -!t0Oj@IdNZ:*QT6W^$Rr-l`j-#(sc90Ru+a'F9Eqi\;jO;C`N@`Zm4:gftC$LI`P,cp.Y&,CrGIctI7$ -8I1SRA^ZA[`b?]`8>^HbSEb;RQHlB`H/uPV/>#ULF"/`XF#KiCVmJuG[Zs[^cfoRe>_]j3Y?3>6.i^a< -#)Gc$2QL,h1LIFf.$Q`oR]B\_;.rrK]\Z:b]ML5)Wgu&QH+[I$dp&*o99-dC1%^uZ$Pt55@pf:m'F4^A -K#'_aLccR]!/EmKE>Xp8.2)s*@hG*XDE/_r!T=X[!'Wt#P=ajKR8g=l/XK(\&U#bcR3i5j?Ze/PYV+@E4VU5`6DAbj<;7+m -EB$p42]Rju!V,CG1,gG>ae\GE7"c'sN_9EE$&m#>1n)[do81]VC^?+pV%IC*-8cP=;5eRc9W!d[Mo2L_ -C1Ke(6)@Oq[&Trh"V@!LW>17AI_AR8="LdA9o>hoWDfegg8tRIENDst;s@;rPBXakYJ?!*SmORriNW*6 -`:j:k`mH#ogi`cEGKOI%prEF8&HdVN5nGG$-5?oC6Xe@:KLQ4XM*RaG0Ebu>"GB7>&9tj60c?!BU/7LF -?5G$qb@T,tKZ7RZRS@DCH'fd)-_=+C1.h-C$UC=]-rbL\C/mWb;CU,lI-r("O2pOM3<`SH#HcP?nsFO) -EFZ:WCsuP;6Ifk[>A_sgKuW4:WC*][HK:)X<2J$T3IgWTWt -#_Bda:d@De#7-#LiNUCN66ZYf`'FthHt"lMNQ39Kkkp$",*)d+nQ@uK;\4gYU!hVA_IG?hbpK[:AD2)X -S3imTWN;Og/>#;'1h^,8O%Q"iic:F!Nh]LOeKbc1rF.9EXOes9b3]PR@$oR*2HhAtb;l6V'2$&(_)OP!)D!=Xbd -ifR?M?83=W7cTW`oOng%Pk?R_:5VD*i$W6Ko6=bpHjDYt/\S>;`"m&;^B3p=j`(i>o4-+]@"#(@=/J;Wmeto[`P:WE6*$ -]CkUnG/N=DPKGHmYE-_30c,,,0+@ma!$FO_/.;O]JjNmBQol9/"c1*jEC_oE,moT#UN+Aj5!'mKaJM&g9Dn7;)6`KOu;BT?q87R&m0C9VkW20^>/8QOTt4-aaj% -C9\PW;!?I+m8CQ(X&L=..ZFMK4-E@A2bU:,2(4R/k4d'dqYrCBh;WU(Fr&n3_HNtEHo2heMR1j<\9sfU -T8nF'+@$2D+peC(_4YaL4>%9QKgR%]#])+B&VWUrd?o;.4VNiFij'F!Q;&\2alQF2A@>bsJH=e/=cbga -2k3WU;n:u_I6XB#!>:fRShETq;C%DRL]T(4OjmmGB_/+OKf]:G)Pu?F, -Q34qs4/LNqGJ%7#=1dSfoeVZRBK/+$(C`R%gaL\;L,'!oWBmYNb`uKTN6&d8&0M)g#6KO0+Fj_[.Lc]: -6D8?X>Y6LMLVb2gf[Nq>'9:,o&\-mo)&J+MAC:b%DG)1=`aR8OPZgj;S'EB9);Oe05+g1M1b'K>EX2bt -!VEBt17M%:e1*=*SPl*d#LTS0W:b&??E`!4&mGe0a_%[-k&u)WZJ09+gb(91798_t]A>#[H^(PZI)"HT -enQf=a_AS"EB(%+1&_FIIA,@bN9oIL_L=*"bT,"&=?EL)%D?giXm#l:+6p96@dtoHu:qbO%87D -)&/*&-'3]ZnTe*:=Y5t5jqAVsc=o/*6=VcbeF%TFP"I(jO9?>S(ST7='Nd$jR6d`Ll4k5&:)>p_r1bS^hEiMG4SW -<27mDp8CA[-VLsKDUE4dlM#\?hlldcrK@J>_T_AqgJ,!j7&eqCFIS:G1N(6M8RrroHsR'YJ]e',l$UKX/=K4>TF#_WCGV7"B.tdap16Ub -cKLFk74+9mVGh3YqLgmc-E:'\eTiF7PsM'<-*pauiaG*;f;l8O"PRKuZ -2Cg#8alOh9b][Fq%tR"(J:Mkg&IF.XiK2]64s:Mp7,j>2ZsGI)NCMrjf^sVY+d#3Di!:U";(7c&jc\;= -^(1I2biY*l[,,d_SPJ@3fPHj^6(q-=P)(skO\)BIl'0nE4tf0qeEW<$*?LnWX]FbQg@[e/cgeVaT.">:u7H[GLEr[p3j:CRsVhJ\ba]Z>8kLX+.uqnX/*RlM$+V9JKZI[U1`h"@/W!81YYi -#_^'gE6)i(%KHaPU2``*=t^_O`hROp^`X^/ON=5<8M$<+.$VlNEli./?SIkgiXskFg2As1a6!AIkT4;# -T[9WZ8hCsB8KG5SZNep(9Khcfm=.4`7l>Khq%-LaA5%BXGY@FSfpdD,HS:!"_buJd_mA -hJH9I]I(rr^e-:]@"%JCI`(%o\@`5>hiPq/0@HeP+"7_N"2PO&5TU(3KL0*D\7@K<%u&8Ao4]7DJ\Os,/ -\EpM@O2tjP;d%[(HU"u)!:V*r+:\p75sb!2-m0T:Jq;mc(gIt$%tm7lOVi100a`OuiUKHT?6'E*7j4#9 -<0Bl++YmHY40//g?jE#UrL0Y%Kc04cPN34T>P/:q\Blum&7&!R-eHeiLQSXiX/2f"! -P07IDfmqufIBqUF\(iSp/"P,O%CB:j<_9,[9d#MA,<,N(3hq2)eSk%!*[:hYYX"j`r&.$0IZMVo!-!0, -#RGuI+Ad;:4r"BT_Ve6M8002iM*iHEGU,Hh"cPbm&U6Eu1DktfA+A4TJk6-3_kg9L9Ys@1RE+EYdq\MuBjd+AXV+hX6E_<'bT[d91u8gM -Y1tZDHOVb)/tTq_pSba)dh/EYYVOm:f*?K9=7)0o4C4A)XC^u7!(7/!"G4I_n:3Iu*t3nAU%&DI8gb=1 -`M,VJHm1KhKgF`q?p'#E+p7q^nX(;^9FmE2jc^!%Sl6nr9VjM$Ct_B3SO"X1$/CDh,a_3&C6 -j&1^jrgQQH9WAeaI270"R`VHbg:_rL:8^mfoXR,VW?[F-XnN3_b!QPph6-L1bYlQ(KYf=KgC,hF-_/d= -egV@:$TO^1Vt2qB6IfGc@;5DU!#uIS#D+(+LdW-b"G&nUnCS]r)[q>7U/9c1<\jr56_Q34N.NK!M++2E -LjWMr&;nOT@/4W-2`$gkjAMrsdNJaI9Vh1qgtIHLU/>URH:9/A!16]!eG=kgV,OBoC=P?+.[)`Cf-k\X -jT]QrKM,o3>==p6A?sg([efB3_$%2?-oC2MR`g#jD8=fk`jQ.gWbX'r80WqG[8T$_8[>3m"dFhU^a[G:2:>IEf.4i?!J/'k -.Q>R/LAcbD@e#i=c0Gn&U#L(F>dduo!!GQ[E'QZ.!"Xb"TlA(h3Zeoh`1h5?5X#PmN5hW4aR"4;+HX[? -E_.gN:FMIMV/j[o\lf8q9Vul&X@b&tSBe$RamAkR5bQK&EN+oNO%?(aV\8J^3"JEUe>dX`X]hniUJe.8 -adk1q#67l*d@^ULblkCV_%pfcVVP@7>V5VqFj-?efE6A*Y_[E_=spl1m(Cq!W*D(s -%YqtH0drP[%KHaR,;H.PE]Y>'a&94'?QLTED2a!B!lB])R32?=6qd?eUCRrWEA6TX'N$cD3W-02_1HI5pa!,XqJinhS!Qr -9k]m)9fEAhV-2uiCc'QN/AgGG<%;I''2PN9huJQE!X&d\!$Mo01_pH*K>V,:3+O'N&VriJO_CO;2%5F3 -+n:A9Ah>'f8`^SQ<3B@UQV5-pDu`(924I>'':IA":0Rp@'E0I)ANU366X^c4?ahqLdPQI=DV.])2#pQEHp8f-PVV0V"0@9W`La;bGFe: -L`?C*Ra%`$M9P7/4J'lso<:JD@kIl"B(U@BBE:egaQ&N,6meZAMSSMBGr8Wl-`gAm'hYkl7oPCIiAISl -MQnG4g2%KC?*`93\6>q5pgl)F&\?HXe4^>[#DBoekST7R.i1CC@:_5sQ:E$]b2or)L]AV&"+igHd!.r* -'aoa`@,M<47O8_*7:OYP2uk$>N^mU,q#lF@,EbW/+FniG'-3?2A^^C-`aprp6_Y5s`9)1JN6/!Hq?7'p -.%Sb!e9XP1PtRuQAi&-U7\s%F;(:%A`FcM^Y#f6n$DiKr5H@keepBi_eSCRT/9^oDHHU-9?#J8@`AZOl -^0'fIS-B3%K>KqCGMGVZs+SI&ES1--*tsjD8obes_uLANJ\`J5BKRIP$AHA@YipI$,8,e5^]=/B@P\p^ -a!7kQr.79V"9[Y(Bfr+g.[A1'ZKZbR@ksIrU9Z5\ic@/B8LBYcr;qUY-lGab4Bqmh_24gV:u)F]O.nQCd'&HJAG_G -Zs?j,r!d8.GV)aQ/Le1nIPnPtL/$ -fh;`:#Qr;do,4plEB0RbkEFTkrX0m9;!=-I1pUO1R=H`:$(NCE"K9/:FWa+BWu8"TCNKhFG,YqT6L8]< -c'H$SZrX;0RIpoJEOf?9'U[[173n`qi>"E0T"/^I:G$QK/V_6#_8S,'C:$1FNO!$W2k-[O0`VHoTQ!FM -+O -,s\-MW,tW`)M\Qh_^G'`9V+uZW5moFLt+sl;?U"aor?87]+qEeC=XljC;C^i=6m8P26o/?Z<44%>HOdO -EfS]8Z+CureT&@ZXr'3Ro$MBn@4E'e/9;V@ZW+.fMnLVo$%N&l!;IfT%0qPQ@8OIE2B<,-"2PR/UfK&` -Ma4!K.'Nb'*f7r`+GfZU.3amG,]^F8U/V,S8n7HQI%F=iR)`h0Bk6(9/Wrk?dWuV]Ma!_.W=uh=-@&+R -bN]_.FZu-MS53`S3c,q=+g+M6(-qNtWY6id5:`&CjraYS -GTmFtK0]M,3'8`'#64kc&Ju39!="Ft,4U1O<\GJF`aa"f'P]EDON?MRR66p0+-aqo1$L5m>r.jBk*"EI -Z>D4d9&pVqI0sIAUJ@Xafp)Jk1S7HS&aA*mTga]9lP5e'.^9J>fBa7l'opCIZWZYB3n,La#_H.FnOPV@ -koc0gY->G'dcVI]o6e:0YO];I[``F& -iNVpcAJYN#`oF?"%$!t.Pc\FL1KXW@"Ts?B@*j-d-5?oC6,`kVH#.494a6!kSsU4RS@DCG[*Eq0UGRJe+s4PKgVS3B[ceDuHi -<4[L4`AX[8/(Mg3VU]Ij>A.&`m*X1c+;HbNj*eZ4@$_0*V#/@UQ:-P_QZ@q6DnSdu3mVr?t9 -S9+`C!eJ01Y\6-C'+0H2+gC0X66d,"`?MR#]OEJu#K":7!.9Ac,*BtmZ=uFq;_!t4,E^Z$An*TabpKc2 -]]*unS]mjKf_hn)6D;dQ'%gakGtOp^.CAAg6DGEo_IM)!]jeUEu#DGM'OP"Y= -+VBQ!ifLB04:rHj7cTW`i#XToN<-fpq)"[?.@!NeP1ark@4[>XUN-[:hJ"7&cKCDEo_sD-Thss;=u@@` -8X@T`'\LX`D`X^okk*#VL7M)=<@a?gomX_cYup3IC2mD7<`WhXPm):p'I?rPgp7 -^"724*!Q1'FMZu,R+ujKbD4";.Mk4$:C@.*5bLA]Hk$YmKYjBiDu`'D&;\9!ECd070,TYfUN+BAH9WO6 -aJbsQqV*j -3Mb55+Hk#Y;E6"oD*OH6-a>,Ml?tpn;JB+AAN$)TQI)S9C*ZQ8:oltJ[;+MmXVS"jCfWVDQH_%]=/"*b -21j.I[);9sWr9[!GJ%7#;gRiZGC>TXYB*?rY5s(T'Ui#SR8&sn-up4?mMep% -6n/k\eOHB8X4Q\R)\nCT:T`4keMuq3b=J_gm.Q?3HJ@^c_pC@r1[sp"AIsAH4;?26^q"fZW^'UVc9\HWqD2/_P'i)aXU;Yj_g2eY"(p&`j-^9AG1&0r4+:\AV_-kW7 -6m`WVL-oCrpfJX[#`;&[d6Kfh0,opA?r0CIL.*>M8S$7p7&Es7Q:kf;pl&rN1Q07bO?&!V>nWSkVGl1O -icRV_;/"I*74+9JSkpf@Bq5Tt;hJ"`1\u5`5ub!gCXr:cL/1jOa(c4OQ&:K1ZW8W^b>#"uF1PXpdT^:s -/SDCjmdn&4DY\Up?a'6P7OJpB]\t6eHo>.`*9I2b\g#Q%tR"(OB<&:*XIHdiK0]p-6!PR7)8kB"<'!4NCMrjf^sVY+d#=VP$'W5;(7c& -i@tV6^)ITM7AZ2NZlWKeR7nuiae[dE6(q-=PZfpcD[;r\B61#b,,#4;9]n7CI/]mDX]FbQg@V\KF_dfrI/Co/j^>X(B8o6JsNKRdI\]q:^.W*o1g2@7ZasV08 -1nI],TZcLspr)`K5bV)TFNSG]T2;K%W0DR%)Dasa<,.\U]iJ&OX]VZJ9.cUY*j/T(e``iAd6Y0EXgYaI -L>dBihQM.H:"&;4T3*bQCR)4,K>M*&Gg("\%<]Kf0)4[K68a7C![(^,K?7[)Ld[,+08@RpE$.9CB/bCbAeV`9p3f/u:hWfg/D>(oR`sqo8n>r$ --`#/Q'Y8-^X]MT)CJlUH8s)o%<@`.em=)`-YupBo]4JG,+0sSd2@)Dlh`J?t/se$3g@'O,?uT,(c15Rq -^>S'3>Flb,I`5i<=ZiKa)18Bu!>$Y!$k<7B_BCV3>V[6.LVtAk-u^:N"H1**d>6Ru0ad@QdLW*c0.+fRu*KSD,1+R6fJ[pPYN,&#D+04R+-"6)["(>Z&gpH.4(0LimJ[nIT7tb8EB@[Pg3u#Rn`&Z -RFKqh/tYTZP1bNVM%H9*U_ES&%Z=&Z;sG)9Pti\sV+^&.)J)g=t7&&)%F.(gl -@7uF(l1&K$/sAo)e11-Kc"a^mRae@Ag136k?(tEe2+n(dSRo7aXnN3^Wm>F4=KFF(Pg\e(]A7D7S(7rP -KYl:nQi$IY%4T5$XZ-(<#8rcKjg+He!'ChqJjEekGVC0B#_E)m!;M4:,nl/)@aTG=Ai1>,6K+"c<.77X -LIU@QGsnN0/!`h>deSR9AM]cDj0C\`2E_J3c"GKS]T,?>U/,FoH:90G9;YX%d`N"37735*l1K:d7S,\@ -sYDV'6Sk#ZK381U!qVT<[;*BaZQ>L`B%'A:(:?E1<2p\d2,;,*[G*:A -kiIuRBX:D!2Yhd@T5q,@Y4q8]!s;T:hW8rQ?2"L?_Fa7l>>?[nP0)f1q!1(l!!n-@i*^L(4qS*T6K+$Y -F?Ui[M*lgop`s/R(5t`CObbhh5p;@]jH!^W9et?3L3?NF'5%400#M!k`f7. -*g'$j8Z.dZm+OHdV:=H,+jsElR_;arLN$^nH!!g<4E(DMu%g[j*TlA(h3Zeoh`1h4t5WfVqN5hW4aOhOe -*K5Qb&P4OB:DT&3U[kC#W^eG(bbfGQXP.SPSBe"[R<89[/=+L-F@_)YKcm#6k]C!F3hK6Ie>dLL4Xsf1 -OOG\DqR((E=-q#ZQ:ifucY0];X>0#DEjobQ>4)%LA9u:9]\]i9bNpG9Fp(WX=6Zjh=*;=*0,Rr34!0QU -@W'gZeh\N`J-#c0La3`F"9ZHtn@3!c&-i1;i__\2<\5,H7Uo<*jE<[.O@Wn[3@'nb-^755O=54Z)$uWt -,uZh"<`q/29;bThPh(7ITMT<$3[GQ$".[ZuZO0r,O&([.l#`@o2PF3Rc*iY?/Fmq]\]kp4=1iKI)"RC(hl_hm:j>]0K@:R="Tc(^]EAL*"iV`K>E*- --q"UV!!gFd0drPi.i+&_,;H.$+r:Z=_P?ZMp`;pPPKG1,WEc`5/sjd/1F\jBCFYB=A25QTDL4R>cm(9u -2!Sd@UXCSJWa.BL'opbC2(G.pOYifM-^@lk.Yf7M9rp6'*KnTXZe?uhWO7-;*Y($XN5f64d_0/orf -o(rU!_I<0Y*;8P@]&0bPXBm\%Nj@Rrpadai08?Rf+9733%LE;k6/`BB<%]$tLI:&5(mIcE'oPN@&X_'c -('b)b5QLToN_(O\8`^SQ<3B@P"@qLY#is9F24I>'':IAK'q3XDO"mV8lkUNTNlaD`67UNtM -a(+ZX*0sALQ-3b1&-+g"#6]XpT^[b2.Mi9oJg'XiL`d0-#K4OVAFbRNW`La; -bGFe:N65ciRa%`##qS[t31e>>F/fZVLI@laW:YsA.[Ni+e#E!INCp*JWn"%(an9CM5c`M;p'V=ea(2L/ -XS+^"DV$&7g+E%,NQUF+]%s>$X(CQb,eMs;p^@W?#Bmc:nF:jK',QVIj0ACW2Br`iaCV[QL]AV&"+igH -d!.r*'aoa`@F4e&7LfY'"6.^Q`+CkGN^mU,q#kXJ%uEkgdWn6X<@aA.A^^C-`apr]73j[7`9)1aOj,9& -q?7(W6_[Fke-WMMPtRuDkHoPh7\s%`9d>OD]V -IZ3:TR-]6aDedDU1:!C/L&_GY"5o8C+9;Q>E04`@l:UQWbW(6*7DguULWFY9(VNCkSgS8Bo"H^s+EEZD4a/H>nR -+@(`6%L3/j_P(qiCcWXLLr?$-5WA`c(lZJ0EQIKm59Q'/UVMD-;C**A8YL*Z1qEu"QGM]=^]`@+/XO[) -'03/NAMBdn-?I;9p4k2i:1t=[1u;q@JQ&H[WeF=o3MBDe[(\;N(.;S\E%fr+,kcd!;Rn+9dc/tAQ$'L[Tt?c"6:'I'V](SKuG5iaK.Q=5+Y2UnR)L^M+=48B5i_# -)OEI>6mo>Ze4PE]UID2HMVW$28$#bU[/:D-"8ZJnm$L>]*V'ADZ&S"2L_aWoW`;#,9cpFBf5) -$&,_:YS\8_*sYET==Mn4^,#eEXM=f9L_(a8"TUk3Yc&fk)[D,8+qU]C&dK&%73OCQe/fDGO%,kJkj2JA -*0J3LEiE:u8d-8R*@-k64^c6kEIh"#eUT?nuC.I\H%1mq)_FIG?JRnfm2.Q&]H;QDO:eZ1R-h+DNO -YLkBa.Ld0&3j)X<2QL,hgF]L2Xu@hQHH13@hC#a9SauZ,^Yge*/0,etH,JVm(VD(N)ihu"1,qBS-S(LR -insfm'FkEQK0eH-QrG[U%>R=1&K$a-.2@b0it7[.DE/..J-#3Y'TPa2P=ajKR8g=a#RAC^',d%[Bf2AS -k7a95,!RWN:ZrK1<4[9BUJ^7iRT1u.&Y@@L'cN=*M+t$NlP5l=DOXG$fBa1IX`DNpZWZZ2Re;EgD3A#g -2]J%-l#hthmFRg:_X2cd?gni1"mZJ&^0kptS5q7\Gf&M)(jopk.@&(Cn^%8`$3p]c_4^:R9I^heJH>l1 -Ll=qR'T0l(nVGD(2]RjuU[e^"MFSqTae\Ka9WD/9"+VQ$$&m#>$\unPo81]VGN4D[p5'=lF%%irg-o[bGmGs%BA"^X4_@a$]W;+0=f29eHifSm@6oiNW#[Xs-#RZ=;q)ke7-&Pc%qEq1o"p"Ts?B@*j-d-5?oC6Xe@:GQ8ff!!4@LGdM';)i[?tOneR' -5nsM'^_01#:*D-R94Y>a7$o&PRS@DCH,Sif4.]5\+Gj(/KgVS3B[h>s-C"ak5c,7,KN:fCJl$1sGVkj* -17qW`eb]L;JQT3\CtJcPiW*#]=nKYjF%aDK.NUsc5aaZQkc:oMmDF\8`E -FT\::VQgDk15/r(;5gh$D48daP#L^*bAFiJCogZFQUi^^lZg%uY;aY\qYP@;:[@`]`Jta*[,S?4X'QSa -ON?LV[k+&]#8D[i+Ab$C((CM%6=E^#0H:*$LBHO532BS,(Q:gn;7P[p&.aLdA5YE5Q;&`k8nCo2A=*?- -"3b@U3Mb5C2k3WU;a:IL&KmCdAJ"'Y^,ni\;JB",rP,(7P.jR;KE-^_[rTcKTJ`?1/T!eaE6]^L-II*#9%kKu7?h(n=V[ -#B.XmneiF5:FVRPAb-H5HjU)]K#+,LLeK97%#2ZnnHb(G-PVHWU@F&`C,[,ma.r23%#RP#P0'NjM+jpN -/=+JUo*LAuB/H(%VXoYgl?>@^c_pCB%17kYU=#q3MG5Re9W$:r2: -ZIu>QMbU5'Cpr*#pBuu'kB+;kY4mk!lM#\?hlle`%LWMp_T#t+~> -grestore -grestore -gsave -376 1880 moveto -0 0 0 setrgbcolor -(Helvetica-iso1252) cvn findfont 34 -34 matrix scale makefont setfont -<416476616E636564> -[21 17 14 17 18 15 17 0] -xshow -676 1880 moveto -<557365207468697320627574746F6E20746F2073656C656374206120646966666572656E742044 -6972656374506C617920736572766963652070726F766964657220286D6F64656D2C205443502F49 -502C2064697265637420636F6E6E6563742073657269616C2C206F72> -[23 15 17 9 8 18 6 15 9 17 17 9 8 17 17 9 8 17 8 16 17 6 18 16 8 8 17 9 18 6 9 7 - 18 10 17 18 8 8 23 6 10 17 16 8 21 6 17 15 9 15 18 10 16 6 16 17 9 17 10 16 16 - 6 17 18 10 9 9 26 17 18 16 27 8 8 18 23 20 9 8 16 8 9 18 6 10 17 15 9 8 16 17 17 - 17 17 16 8 9 15 17 11 6 17 7 8 9 17 0] -xshow -676 1927 moveto -<49505829206F7220746F20736574204945454520313237382044495320706172616D6574657273 -2E> -[8 21 21 10 9 17 10 9 7 18 9 15 17 8 9 8 20 21 21 8 16 17 16 17 8 23 8 21 8 17 18 - 9 17 26 18 7 18 10 15 0] -xshow -376 3343 moveto -(Helvetica-iso1252) cvn findfont 41 -41 matrix scale makefont setfont -<41434D20666F7220554E495820616E642057696E646F7773> -[24 27 32 10 9 22 12 11 27 28 9 26 10 21 21 21 10 37 7 21 21 20 27 0] -xshow -1255 3343 moveto -<3432> -[20 0] -xshow -1962 3343 moveto -<30362F31302F3036> -[21 21 9 21 21 10 21 0] -xshow -grestore grestore -showpage -%%PageTrailer - -%%Trailer -%%BoundingBox: 0 0 595 842 -%%Pages: 42 -%%EOF diff -Nru acm-5.0/debian/acm-docs.docs acm-6.0+20200416/debian/acm-docs.docs --- acm-5.0/debian/acm-docs.docs 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/debian/acm-docs.docs 2020-11-17 11:52:56.000000000 +0000 @@ -0,0 +1,2 @@ +README.source +README.Debian diff -Nru acm-5.0/debian/changelog acm-6.0+20200416/debian/changelog --- acm-5.0/debian/changelog 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/debian/changelog 2020-12-06 19:13:50.000000000 +0000 @@ -1,3 +1,37 @@ +acm (6.0+20200416-1ubuntu1) hirsute; urgency=medium + + * Merge from Debian unstable (LP: #1015343). Remaining changes: + - debian/control: Improve clarity of description. + * Dropped change to call fclose in src/main.c (no longer applicable). + + -- Logan Rosen Sun, 06 Dec 2020 14:13:50 -0500 + +acm (6.0+20200416-1) unstable; urgency=medium + + * Switch to new upstream source, + http://www.icosaedro.it/acm/download.html. (Closes: #362023) + Also does not exhibit some "black screen" behaviour from the + previous version. (Closes: #765815) + * Take opportunity to switch to source format 3 / quilt. + * Patch inventory.c for format errors. Using changes suggested by + upstream, thank you! (fix_inventory.patch) + * Fix enum so that acm builds. (fix_mouse_stick_mode_enum.patch) + * Set directories for Debian filesystem (set_default_object_dir.patch + and fix_paths_in_acm_tcl.patch) + * Revise build-depends for substantially revised upstream code. + * Add some hardening (hardening1.patch). + + -- Phil Brooke Tue, 17 Nov 2020 11:52:56 +0000 + +acm (5.0-30) unstable; urgency=medium + + * Fix FTBFS with gcc-10. Due to variable hasFired in aim120.c that + should be static. (Closes: 956978) + * Add to radar.c. + * Bump standards-version to 4.5.0. + + -- Phil Brooke Wed, 19 Aug 2020 11:45:47 +0100 + acm (5.0-29.2ubuntu1) cosmic; urgency=medium * Merge from Debian unstable. Remaining changes: diff -Nru acm-5.0/debian/compat acm-6.0+20200416/debian/compat --- acm-5.0/debian/compat 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/debian/compat 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -11 diff -Nru acm-5.0/debian/control acm-6.0+20200416/debian/control --- acm-5.0/debian/control 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/debian/control 2020-12-06 19:13:50.000000000 +0000 @@ -3,23 +3,13 @@ Priority: optional Maintainer: Ubuntu Developers XSBC-Original-Maintainer: Phil Brooke -Build-Depends: - debhelper (>= 11), - libaudio-dev, - libelfg0-dev [hurd-i386], - libgdbm-compat-dev, - libgdbm-dev, - libx11-dev, - libxext-dev, - sharutils, - x11proto-core-dev -Standards-Version: 3.9.6 +Build-Depends: debhelper-compat (= 13), libasound2-dev, libx11-dev, libmotif-dev, sharutils +Standards-Version: 4.5.0 +Homepage: http://www.icosaedro.it/acm/download.html Package: acm Architecture: any -Depends: - ${misc:Depends}, - ${shlibs:Depends} +Depends: ${shlibs:Depends}, ${misc:Depends}, tk Description: Multi-player classic air combat simulator A multi-player aerial combat simulation. Players engage in air to air combat against one another using heat seeking missiles and cannons. @@ -44,3 +34,6 @@ acm runs under the X window system. This version of acm is implemented as a distributed simulation. It communicates information via the IEEE Distributed Interactive Simulation protocol. + . + The original version of acm was written by Riley Rainey. This is + Umberto Salsi's updated version. diff -Nru acm-5.0/debian/patches/fix_inventory.patch acm-6.0+20200416/debian/patches/fix_inventory.patch --- acm-5.0/debian/patches/fix_inventory.patch 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/debian/patches/fix_inventory.patch 2020-11-17 11:52:56.000000000 +0000 @@ -0,0 +1,43 @@ +Index: acm-6.0+20200416/src/acm/inventory.c +=================================================================== +--- acm-6.0+20200416.orig/src/acm/inventory.c ++++ acm-6.0+20200416/src/acm/inventory.c +@@ -1293,7 +1293,7 @@ ParseAircraft(struct lex_record *p, craf + + } + else { +- sprintf(s, "\"%s\" is not a valid aircraft type", token); ++ sprintf(s, "\"%.99s\" is not a valid aircraft type", token); + ParseError(p, s); + } + } +@@ -1309,17 +1309,17 @@ ParseAircraft(struct lex_record *p, craf + else if( strcmp(token, "GenericRocketEngine") == 0 ) + xxx.engineType = inventory_GenericRocketEngine; + else { +- sprintf(s, "unknown engine type: \"%s\"", token); ++ sprintf(s, "unknown engine type: \"%.99s\"", token); + ParseError(p, s); + } + + } else { +- sprintf(s, "unexpected token: \"%s\"", token); ++ sprintf(s, "unexpected token: \"%.99s\"", token); + ParseError(p, s); + } + + } else { +- sprintf(s, "unexpected token: \"%s\"", token); ++ sprintf(s, "unexpected token: \"%.99s\"", token); + ParseError(p, s); + } + break; +@@ -1440,7 +1440,7 @@ ParseAircraft(struct lex_record *p, craf + return 0; + } + else { +- sprintf(s, "\"%s\" was found where another token was\ ++ sprintf(s, "\"%.99s\" was found where another token was\ + expected", token); + ParseError(p, s); + return -1; diff -Nru acm-5.0/debian/patches/fix_mouse_stick_mode_enum.patch acm-6.0+20200416/debian/patches/fix_mouse_stick_mode_enum.patch --- acm-5.0/debian/patches/fix_mouse_stick_mode_enum.patch 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/debian/patches/fix_mouse_stick_mode_enum.patch 2020-11-17 11:52:56.000000000 +0000 @@ -0,0 +1,23 @@ +Index: acm-6.0+20200416/src/acm/mouse.h +=================================================================== +--- acm-6.0+20200416.orig/src/acm/mouse.h ++++ acm-6.0+20200416/src/acm/mouse.h +@@ -35,14 +35,16 @@ + * high precision). Ailerons and elevator are in thei neutral position when the + * mouse pointer is exactly in the middle of the window. + */ +-enum { ++enum mouse_STICK_MODE { + /** Linear. */ + mouse_FAST, + /** Quadratic. */ + mouse_NORMAL, + /** Cubic. */ + mouse_PRECISE +-} mouse_stick_mode; ++}; ++ ++EXTERN enum mouse_STICK_MODE mouse_stick_mode; + + /** + * Get stick input from mouse and set c->pitchComm, c->rollComm, and c->steerComm diff -Nru acm-5.0/debian/patches/fix_paths_in_acm_tcl.patch acm-6.0+20200416/debian/patches/fix_paths_in_acm_tcl.patch --- acm-5.0/debian/patches/fix_paths_in_acm_tcl.patch 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/debian/patches/fix_paths_in_acm_tcl.patch 2020-11-17 11:52:56.000000000 +0000 @@ -0,0 +1,26 @@ +Index: acm-6.0+20200416/acm.tcl +=================================================================== +--- acm-6.0+20200416.orig/acm.tcl ++++ acm-6.0+20200416/acm.tcl +@@ -540,16 +540,16 @@ proc SetDefault { } { + set latitude "" + set longitude "" + set objects "" +- if { [file exists "objects"] } { +- set objects "objects" ++ if { [file exists "/usr/share/games/acm/objects"] } { ++ set objects "/usr/share/games/acm/objects" + } else { + # keep curr value + } + set plane "C-172" +- if { [file exists "acm.exe"] } { +- set program "acm.exe" +- } elseif { [file exists "src/acm/acm.exe"] } { ++ if { [file exists "src/acm/acm.exe"] } { + set program "src/acm/acm.exe" ++ } elseif { [file exists "/usr/games/acm"] } { ++ set program "/usr/games/acm" + } else { + # keep curr value + } diff -Nru acm-5.0/debian/patches/hardening1.patch acm-6.0+20200416/debian/patches/hardening1.patch --- acm-5.0/debian/patches/hardening1.patch 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/debian/patches/hardening1.patch 2020-11-17 11:52:56.000000000 +0000 @@ -0,0 +1,87 @@ +Index: acm-6.0+20200416/src/acm/Makefile-include.txt +=================================================================== +--- acm-6.0+20200416.orig/src/acm/Makefile-include.txt ++++ acm-6.0+20200416/src/acm/Makefile-include.txt +@@ -12,4 +12,5 @@ else + CFLAGS += + LIBS += -lX11 -lasound -pthread + endif +-endif +\ No newline at end of file ++endif ++include ../Makefile-include.txt +Index: acm-6.0+20200416/src/dis/Makefile-include.txt +=================================================================== +--- /dev/null ++++ acm-6.0+20200416/src/dis/Makefile-include.txt +@@ -0,0 +1,2 @@ ++include ../Makefile-include.txt ++ +Index: acm-6.0+20200416/src/gedit/Makefile-include.txt +=================================================================== +--- acm-6.0+20200416.orig/src/gedit/Makefile-include.txt ++++ acm-6.0+20200416/src/gedit/Makefile-include.txt +@@ -5,4 +5,5 @@ all: + @echo gedit is a X-Window program only, cannot compile under Windows, sorry! + exit 0 + +-endif +\ No newline at end of file ++endif ++include ../Makefile-include.txt +Index: acm-6.0+20200416/src/util/Makefile-include.txt +=================================================================== +--- /dev/null ++++ acm-6.0+20200416/src/util/Makefile-include.txt +@@ -0,0 +1 @@ ++include ../Makefile-include.txt +Index: acm-6.0+20200416/src/V/Makefile-include.txt +=================================================================== +--- /dev/null ++++ acm-6.0+20200416/src/V/Makefile-include.txt +@@ -0,0 +1 @@ ++include ../Makefile-include.txt +Index: acm-6.0+20200416/src/wmm/Makefile-include.txt +=================================================================== +--- /dev/null ++++ acm-6.0+20200416/src/wmm/Makefile-include.txt +@@ -0,0 +1,2 @@ ++include ../Makefile-include.txt ++ +Index: acm-6.0+20200416/src/Makefile-include.txt +=================================================================== +--- /dev/null ++++ acm-6.0+20200416/src/Makefile-include.txt +@@ -0,0 +1,2 @@ ++DPKG_EXPORT_BUILDFLAGS = 1 ++include /usr/share/dpkg/buildflags.mk +Index: acm-6.0+20200416/src/V/VPoly.c +=================================================================== +--- acm-6.0+20200416.orig/src/V/VPoly.c ++++ acm-6.0+20200416/src/V/VPoly.c +@@ -216,10 +216,10 @@ VPrintPolygon(FILE * file, VPolygon * p) + char *nullPoly = "*** Null Polygon ***\n"; + + if (p == (VPolygon *) NULL) +- fprintf(file, nullPoly); ++ fprintf(file, "%s\n", nullPoly); + else { + if (p->numVtces == 0) { +- fprintf(file, nullPoly); ++ fprintf(file, "%s\n", nullPoly); + return; + } + +Index: acm-6.0+20200416/src/gedit/io.c +=================================================================== +--- acm-6.0+20200416.orig/src/gedit/io.c ++++ acm-6.0+20200416/src/gedit/io.c +@@ -321,7 +321,7 @@ int + gedit_error (char *s) + { + +- fprintf (stderr, s); ++ fprintf (stderr, "%s\n", s); + return 0; + } + diff -Nru acm-5.0/debian/patches/series acm-6.0+20200416/debian/patches/series --- acm-5.0/debian/patches/series 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/debian/patches/series 2020-11-17 11:52:56.000000000 +0000 @@ -0,0 +1,5 @@ +fix_inventory.patch +fix_mouse_stick_mode_enum.patch +set_default_object_dir.patch +fix_paths_in_acm_tcl.patch +hardening1.patch diff -Nru acm-5.0/debian/patches/set_default_object_dir.patch acm-6.0+20200416/debian/patches/set_default_object_dir.patch --- acm-5.0/debian/patches/set_default_object_dir.patch 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/debian/patches/set_default_object_dir.patch 2020-11-17 11:52:56.000000000 +0000 @@ -0,0 +1,14 @@ +Index: acm-6.0+20200416/src/acm/init.c +=================================================================== +--- acm-6.0+20200416.orig/src/acm/init.c ++++ acm-6.0+20200416/src/acm/init.c +@@ -51,7 +51,8 @@ + "." \ + SEPARATOR "objects" \ + SEPARATOR "../objects" \ +- SEPARATOR "../../objects" ++ SEPARATOR "../../objects" \ ++ SEPARATOR "/usr/share/games/acm/objects" + + static char ** objects_dirs = NULL; + diff -Nru acm-5.0/debian/postinst acm-6.0+20200416/debian/postinst --- acm-5.0/debian/postinst 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/debian/postinst 2020-11-17 21:48:07.000000000 +0000 @@ -1,4 +1,4 @@ -#! /bin/sh +#!/bin/sh # postinst script for acm # # see: dh_installdeb(1) @@ -10,26 +10,19 @@ # * `abort-upgrade' # * `abort-remove' `in-favour' # +# * `abort-remove' # * `abort-deconfigure' `in-favour' # `removing' # -# for details, see http://www.debian.org/doc/debian-policy/ or +# for details, see https://www.debian.org/doc/debian-policy/ or # the debian-policy package -# -# quoting from the policy: -# Any necessary prompting should almost always be confined to the -# post-installation script, and should be protected with a conditional -# so that unnecessary prompting doesn't happen if a package's -# installation fails and the `postinst' is called with `abort-upgrade', -# `abort-remove' or `abort-deconfigure'. + case "$1" in configure) - ;; abort-upgrade|abort-remove|abort-deconfigure) - ;; *) @@ -38,12 +31,9 @@ ;; esac - # dh_installdeb will replace this with shell code automatically # generated by other debhelper scripts. #DEBHELPER# exit 0 - - diff -Nru acm-5.0/debian/postrm acm-6.0+20200416/debian/postrm --- acm-5.0/debian/postrm 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/debian/postrm 2020-11-17 11:52:56.000000000 +0000 @@ -0,0 +1,37 @@ +#!/bin/sh +# postrm script for acm +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `remove' +# * `purge' +# * `upgrade' +# * `failed-upgrade' +# * `abort-install' +# * `abort-install' +# * `abort-upgrade' +# * `disappear' +# +# for details, see https://www.debian.org/doc/debian-policy/ or +# the debian-policy package + + +case "$1" in + purge|remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear) + ;; + + *) + echo "postrm called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 diff -Nru acm-5.0/debian/preinst acm-6.0+20200416/debian/preinst --- acm-5.0/debian/preinst 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/debian/preinst 2020-11-17 11:52:56.000000000 +0000 @@ -0,0 +1,35 @@ +#!/bin/sh +# preinst script for acm +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `install' +# * `install' +# * `upgrade' +# * `abort-upgrade' +# for details, see https://www.debian.org/doc/debian-policy/ or +# the debian-policy package + + +case "$1" in + install|upgrade) + ;; + + abort-upgrade) + ;; + + *) + echo "preinst called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 diff -Nru acm-5.0/debian/prerm acm-6.0+20200416/debian/prerm --- acm-5.0/debian/prerm 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/debian/prerm 2020-11-17 21:48:07.000000000 +0000 @@ -1,4 +1,4 @@ -#! /bin/bash +#!/bin/sh # prerm script for acm # # see: dh_installdeb(1) @@ -13,31 +13,26 @@ # * `deconfigure' `in-favour' # `removing' # -# for details, see http://www.debian.org/doc/debian-policy/ or +# for details, see https://www.debian.org/doc/debian-policy/ or # the debian-policy package case "$1" in remove|upgrade|deconfigure) -# install-info --quiet --remove /usr/info/#PACKAGE#.info.gz - ;; + ;; + failed-upgrade) - ;; + ;; + *) echo "prerm called with unknown argument \`$1'" >&2 exit 1 ;; esac -if [ \( "$1" = "upgrade" -o "$1" = "remove" \) -a -L /usr/doc/acm ]; then - rm -f /usr/doc/acm -fi - # dh_installdeb will replace this with shell code automatically # generated by other debhelper scripts. #DEBHELPER# exit 0 - - diff -Nru acm-5.0/debian/README.Debian acm-6.0+20200416/debian/README.Debian --- acm-5.0/debian/README.Debian 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/debian/README.Debian 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -Version 5.0 of this package was put together by Phil Brooke -, from sources obtained from: - ftp://ftp.websimulations.com/pub/download/acm-5.0.tar.gz - -The upstream source tarball was repackaged to remove a single bogus -entry that caused problems with the packaging tools. - -libgdbmg1-dev is needed for a clean compile from source to avoid a -problem with sdbm. - -Re: bug 143297: There is at least one report of acm not working -properly on 16-bit displays. However, it does seem to work on many. -If you have problems running acm on a particular colour depth, try -using the `-nosplash' switch (added by Debian maintainer), then try it -on other colour depths. Then add your experiences to this bug report -so it can be fixed. Thanks! - -Also added by the Debian maintainer: a -dis-silent switch: this stops -acm from sending out the DIS update packets. - -If you want to see other people, then you need to share the same --dis-exercise number and make sure that your packets get to each -other. - - diff -Nru acm-5.0/debian/rules acm-6.0+20200416/debian/rules --- acm-5.0/debian/rules 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/debian/rules 2020-11-17 21:48:07.000000000 +0000 @@ -1,100 +1,29 @@ #!/usr/bin/make -f -# Sample debian/rules that uses debhelper. -# GNU copyright 1997 to 1999 by Joey Hess. +# See debhelper(7) (uncomment to enable) +# output every command that modifies files on the build system. +#export DH_VERBOSE = 1 + + +# see FEATURE AREAS in dpkg-buildflags(1) +export DEB_BUILD_MAINT_OPTIONS = hardening=+all +# Except we'll also have to put this into the individual src/*/Makefiles + +# see ENVIRONMENT in dpkg-buildflags(1) +# package maintainers to append CFLAGS +#export DEB_CFLAGS_MAINT_APPEND = -Wall -pedantic +# package maintainers to append LDFLAGS +#export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed + + +%: + dh $@ + +override_dh_install: + install src/acm/acm.exe debian/acm/usr/games/acm + install -t debian/acm/usr/games/ acm.tcl + install src/dis/server/dis_relay.exe debian/acm/usr/games/dis_relay + install -t debian/acm/usr/share/games/acm/objects objects/*.txt objects/*.COF objects/*.obv + for d in features zones/usa zones/middleeast zones/europe missiles sounds aircraft; do install -t debian/acm/usr/share/games/acm/objects/"$${d}" objects/"$${d}"/*.*; done + install debian/icons/acm.xpm debian/acm/usr/share/pixmaps/acm.xpm + for r in 64x64 96x96 128x128 256x256; do uudecode -o debian/acm/usr/share/icons/hicolor/$${r}/apps/acm.png debian/icons/acm-$${r}.png.b64 ;done -# Uncomment this to turn on verbose mode. -#export DH_VERBOSE=1 - -DPKG_EXPORT_BUILDFLAGS = 1 -include /usr/share/dpkg/buildflags.mk - -# List of files taken from the upstream Makefile. -SCENES = default-scene dallas-scene -OBJECTS = inventory f16.obv f18.obv \ - su30.obv mig23.obv mig25.obv mig29.obv \ - kc135.obv c172.obv aim9.obv tracer.obv tower.obv \ - f117.dxf il78.obv sa2.obv sa10.obv sa11.obv \ - hangar.obv surface.obv telar1.obv \ - acmlogo-unix.xwd object-map.txt munition-map.txt -SOUNDS = aconnon.au cannon.au crash.au engine.au gear_up.au \ - gear_dn.au imarker.au missile.au \ - mmarker.au omarker.au \ - rwr.au screetch.au stall.au apglock.au - -configure: configure-stamp -configure-stamp: - dh_testdir - # Configuration of ACM. - CFLAGS="$(CFLAGS)" ./configure --prefix=/usr - touch configure-stamp - -build: build-arch build-indep - -build-arch: configure-stamp build-stamp - -build-indep: configure-stamp build-stamp - -build-stamp: - dh_testdir - # ACM compilation. - $(MAKE) - touch build-stamp - -clean: configure-stamp - dh_testdir - dh_testroot - rm -f debian/icons/*.png - rm -f build-stamp configure-stamp - # Clean up after the build process. - [ ! -f Makefile ] || $(MAKE) distclean - dh_clean - -install: build - dh_testdir - dh_testroot - dh_prep - dh_installdirs - install -g root -m 755 -o root src/acm debian/acm/usr/games/acm - cd objects && install -g root -m 644 -o root \ - $(SCENES) $(OBJECTS) $(SOUNDS) ../debian/acm/usr/share/games/acm - install -o root -g root -m 644 debian/icons/acm.xpm debian/acm/usr/share/pixmaps/acm.xpm - for r in 64x64 96x96 128x128 256x256; do uudecode -o debian/icons/acm-$${r}.png debian/icons/acm-$${r}.png.b64 ;done - for r in 64x64 96x96 128x128 256x256; do install -o root -g root -m 644 debian/icons/acm-$${r}.png debian/acm/usr/share/icons/hicolor/$${r}/apps/acm.png;done - install -o root -g root -m 644 debian/acm.desktop debian/acm/usr/share/applications - -# Build architecture-independent files here. -binary-indep: build install -# We have nothing to do by default. - -# Build architecture-dependent files here. -binary-arch: build install - dh_testdir - dh_testroot -# dh_installdebconf - dh_installdocs acmdoc.rtf debian/acmdoc.ps README ACM-Bibliography -# dh_installexamples - dh_installmenu -# dh_installlogrotate -# dh_installemacsen -# dh_installpam -# dh_installmime -# dh_installinit -# dh_installcron - dh_installman src/acm.man -# dh_installinfo -# dh_undocumented - dh_installchangelogs -# dh_link - dh_strip - dh_compress - dh_fixperms -# dh_makeshlibs - dh_installdeb -# dh_perl - dh_shlibdeps - dh_gencontrol - dh_md5sums - dh_builddeb - -binary: binary-indep binary-arch -.PHONY: build clean binary-indep binary-arch binary install configure diff -Nru acm-5.0/debian/source/format acm-6.0+20200416/debian/source/format --- acm-5.0/debian/source/format 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/debian/source/format 2020-11-17 21:48:07.000000000 +0000 @@ -1 +1 @@ -1.0 +3.0 (quilt) diff -Nru acm-5.0/debian/TODO acm-6.0+20200416/debian/TODO --- acm-5.0/debian/TODO 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/debian/TODO 1970-01-01 00:00:00.000000000 +0000 @@ -1,10 +0,0 @@ -- Stop segfault when firing cannon with option -simx and no SIM/x - server is available. - -- Document the switches that are in src/main.c, but not listed in the - manpage. - -- Make a better fix for bug 143297. Ideally, this involves - fixing the xwud code in splash.c. At the moment, the only - workaround is to put -nosplash on the command-line. - diff -Nru acm-5.0/dis/aclocal.m4 acm-6.0+20200416/dis/aclocal.m4 --- acm-5.0/dis/aclocal.m4 1998-08-14 21:19:59.000000000 +0000 +++ acm-6.0+20200416/dis/aclocal.m4 1970-01-01 00:00:00.000000000 +0000 @@ -1,39 +0,0 @@ -dnl (Taken off gnu.misc.discuss. It is GPL'ed - Michael) -dnl --- *@-mdw_CHECK_MANYLIBS-@* --- -dnl -dnl Author: Mark Wooding -dnl -dnl Synopsis: mdw_CHECK_MANYLIBS(FUNC, LIBS, [IF-FOUND], [IF-NOT-FOUND]) -dnl -dnl Arguments: FUNC = a function to try to find -dnl LIBS = a whitespace-separated list of libraries to search -dnl IF-FOUND = what to do when the function is found -dnl IF-NOT-FOUND = what to do when the function isn't found -dnl -dnl Use: Searches for a library which defines FUNC. It first tries -dnl without any libraries; then it tries each library specified -dnl in LIBS in turn. If it finds a match, it adds the -dnl appropriate library to `LIBS'. -dnl -dnl This is particularly handy under DIREIX: if you link with -dnl `-lnsl' then you get non-NIS-aware versions of getpwnam and -dnl so on, which is clearly a Bad Thing. - -AC_DEFUN(mdw_CHECK_MANYLIBS, -[AC_CACHE_CHECK([for library containing $1], [mdw_cv_lib_$1], -[mdw_save_LIBS="$LIBS" -mdw_cv_lib_$1="no" -AC_TRY_LINK(,[$1()], [mdw_cv_lib_$1="none required"]) -test "$mdw_cv_lib_$1" = "no" && for i in $2; do -LIBS="-l$i $mdw_save_LIBS" -AC_TRY_LINK(,[$1()], -[mdw_cv_lib_$1="-l$i" -break]) -done -LIBS="$mdw_save_LIBS"]) -if test "$mdw_cv_lib_$1" != "no"; then - test "$mdw_cv_lib_$1" = "none required" || LIBS="$mdw_cv_lib_$1 $LIBS" - $3 -else : - $4 -fi]) diff -Nru acm-5.0/dis/Artistic acm-6.0+20200416/dis/Artistic --- acm-5.0/dis/Artistic 1995-12-20 21:27:32.000000000 +0000 +++ acm-6.0+20200416/dis/Artistic 1970-01-01 00:00:00.000000000 +0000 @@ -1,111 +0,0 @@ - - - - - The "Artistic License" - - Preamble - -The intent of this document is to state the conditions under which a -Package may be copied, such that the Copyright Holder maintains some -semblance of artistic control over the development of the package, -while giving the users of the package the right to use and distribute -the Package in a more-or-less customary fashion, plus the right to make -reasonable modifications. - -Definitions: - - "Package" refers to the collection of files distributed by the - Copyright Holder, and derivatives of that collection of files - created through textual modification. - - "Standard Version" refers to such a Package if it has not been - modified, or has been modified in accordance with the wishes - of the Copyright Holder as specified below. - - "Copyright Holder" is whoever is named in the copyright or - copyrights for the package. - - "You" is you, if you're thinking about copying or distributing - this Package. - - "Reasonable copying fee" is whatever you can justify on the - basis of media cost, duplication charges, time of people involved, - and so on. (You will not be required to justify it to the - Copyright Holder, but only to the computing community at large - as a market that must bear the fee.) - - "Freely Available" means that no fee is charged for the item - itself, though there may be fees involved in handling the item. - It also means that recipients of the item may redistribute it - under the same conditions they received it. - -1. You may make and give away verbatim copies of the source form of the -Standard Version of this Package without restriction, provided that you -duplicate all of the original copyright notices and associated disclaimers. - -2. You may apply bug fixes, portability fixes and other modifications -derived from the Public Domain or from the Copyright Holder. A Package -modified in such a way shall still be considered the Standard Version. - -3. You may otherwise modify your copy of this Package in any way, provided -that you insert a prominent notice in each changed file stating how and -when you changed that file, and provided that you do at least ONE of the -following: - - a) place your modifications in the Public Domain or otherwise make them - Freely Available, such as by posting said modifications to Usenet or - an equivalent medium, or placing the modifications on a major archive - site such as uunet.uu.net, or by allowing the Copyright Holder to include - your modifications in the Standard Version of the Package. - - b) use the modified Package only within your corporation or organization. - - c) rename any non-standard executables so the names do not conflict - with standard executables, which must also be provided, and provide - a separate manual page for each non-standard executable that clearly - documents how it differs from the Standard Version. - - d) make other distribution arrangements with the Copyright Holder. - -4. You may distribute the programs of this Package in object code or -executable form, provided that you do at least ONE of the following: - - a) distribute a Standard Version of the executables and library files, - together with instructions (in the manual page or equivalent) on where - to get the Standard Version. - - b) accompany the distribution with the machine-readable source of - the Package with your modifications. - - c) give non-standard executables non-standard names, and clearly - document the differences in manual pages (or equivalent), together - with instructions on where to get the Standard Version. - - d) make other distribution arrangements with the Copyright Holder. - -5. You may charge a reasonable copying fee for any distribution of this -Package. You may charge any fee you choose for support of this -Package. You may not charge a fee for this Package itself. However, -you may distribute this Package in aggregate with other (possibly -commercial) programs as part of a larger (possibly commercial) software -distribution provided that you do not advertise this Package as a -product of your own. - -6. Aggregation of this Package with a commercial distribution is always -permitted provided that the use of this Package is embedded; that is, -when no overt attempt is made to make this Package's interfaces visible -to the end user of the commercial distribution. Such use shall not be -construed as a distribution of this Package. - -7. The name of the Copyright Holder may not be used to endorse or promote -products derived from this software without specific prior written permission. - -8. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR -IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED -WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - - The End - -Note: this "Artistic" license is based on the Artistic license -distributed with Perl by Larry Wall. diff -Nru acm-5.0/dis/configure acm-6.0+20200416/dis/configure --- acm-5.0/dis/configure 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/dis/configure 1970-01-01 00:00:00.000000000 +0000 @@ -1,2000 +0,0 @@ -#! /bin/sh - -# Guess values for system-dependent variables and create Makefiles. -# Generated automatically using autoconf version 2.12 -# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. -# -# This configure script is free software; the Free Software Foundation -# gives unlimited permission to copy, distribute and modify it. - -# Defaults: -ac_help= -ac_default_prefix=/usr/local -# Any additions from configure.in: - -# Initialize some variables set by options. -# The variables have the same names as the options, with -# dashes changed to underlines. -build=NONE -cache_file=./config.cache -exec_prefix=NONE -host=NONE -no_create= -nonopt=NONE -no_recursion= -prefix=NONE -program_prefix=NONE -program_suffix=NONE -program_transform_name=s,x,x, -silent= -site= -srcdir= -target=NONE -verbose= -x_includes=NONE -x_libraries=NONE -bindir='${exec_prefix}/bin' -sbindir='${exec_prefix}/sbin' -libexecdir='${exec_prefix}/libexec' -datadir='${prefix}/share' -sysconfdir='${prefix}/etc' -sharedstatedir='${prefix}/com' -localstatedir='${prefix}/var' -libdir='${exec_prefix}/lib' -includedir='${prefix}/include' -oldincludedir='/usr/include' -infodir='${prefix}/info' -mandir='${prefix}/man' - -# Initialize some other variables. -subdirs= -MFLAGS= MAKEFLAGS= -# Maximum number of lines to put in a shell here document. -ac_max_here_lines=12 - -ac_prev= -for ac_option -do - - # If the previous option needs an argument, assign it. - if test -n "$ac_prev"; then - eval "$ac_prev=\$ac_option" - ac_prev= - continue - fi - - case "$ac_option" in - -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; - *) ac_optarg= ;; - esac - - # Accept the important Cygnus configure options, so we can diagnose typos. - - case "$ac_option" in - - -bindir | --bindir | --bindi | --bind | --bin | --bi) - ac_prev=bindir ;; - -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) - bindir="$ac_optarg" ;; - - -build | --build | --buil | --bui | --bu) - ac_prev=build ;; - -build=* | --build=* | --buil=* | --bui=* | --bu=*) - build="$ac_optarg" ;; - - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - cache_file="$ac_optarg" ;; - - -datadir | --datadir | --datadi | --datad | --data | --dat | --da) - ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ - | --da=*) - datadir="$ac_optarg" ;; - - -disable-* | --disable-*) - ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then - { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } - fi - ac_feature=`echo $ac_feature| sed 's/-/_/g'` - eval "enable_${ac_feature}=no" ;; - - -enable-* | --enable-*) - ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then - { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } - fi - ac_feature=`echo $ac_feature| sed 's/-/_/g'` - case "$ac_option" in - *=*) ;; - *) ac_optarg=yes ;; - esac - eval "enable_${ac_feature}='$ac_optarg'" ;; - - -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ - | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ - | --exec | --exe | --ex) - ac_prev=exec_prefix ;; - -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ - | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ - | --exec=* | --exe=* | --ex=*) - exec_prefix="$ac_optarg" ;; - - -gas | --gas | --ga | --g) - # Obsolete; use --with-gas. - with_gas=yes ;; - - -help | --help | --hel | --he) - # Omit some internal or obsolete options to make the list less imposing. - # This message is too long to be a string in the A/UX 3.1 sh. - cat << EOF -Usage: configure [options] [host] -Options: [defaults in brackets after descriptions] -Configuration: - --cache-file=FILE cache test results in FILE - --help print this message - --no-create do not create output files - --quiet, --silent do not print \`checking...' messages - --version print the version of autoconf that created configure -Directory and file names: - --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] - --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - [same as prefix] - --bindir=DIR user executables in DIR [EPREFIX/bin] - --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] - --libexecdir=DIR program executables in DIR [EPREFIX/libexec] - --datadir=DIR read-only architecture-independent data in DIR - [PREFIX/share] - --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] - --sharedstatedir=DIR modifiable architecture-independent data in DIR - [PREFIX/com] - --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] - --libdir=DIR object code libraries in DIR [EPREFIX/lib] - --includedir=DIR C header files in DIR [PREFIX/include] - --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] - --infodir=DIR info documentation in DIR [PREFIX/info] - --mandir=DIR man documentation in DIR [PREFIX/man] - --srcdir=DIR find the sources in DIR [configure dir or ..] - --program-prefix=PREFIX prepend PREFIX to installed program names - --program-suffix=SUFFIX append SUFFIX to installed program names - --program-transform-name=PROGRAM - run sed PROGRAM on installed program names -EOF - cat << EOF -Host type: - --build=BUILD configure for building on BUILD [BUILD=HOST] - --host=HOST configure for HOST [guessed] - --target=TARGET configure for TARGET [TARGET=HOST] -Features and packages: - --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) - --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] - --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --x-includes=DIR X include files are in DIR - --x-libraries=DIR X library files are in DIR -EOF - if test -n "$ac_help"; then - echo "--enable and --with options recognized:$ac_help" - fi - exit 0 ;; - - -host | --host | --hos | --ho) - ac_prev=host ;; - -host=* | --host=* | --hos=* | --ho=*) - host="$ac_optarg" ;; - - -includedir | --includedir | --includedi | --included | --include \ - | --includ | --inclu | --incl | --inc) - ac_prev=includedir ;; - -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ - | --includ=* | --inclu=* | --incl=* | --inc=*) - includedir="$ac_optarg" ;; - - -infodir | --infodir | --infodi | --infod | --info | --inf) - ac_prev=infodir ;; - -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) - infodir="$ac_optarg" ;; - - -libdir | --libdir | --libdi | --libd) - ac_prev=libdir ;; - -libdir=* | --libdir=* | --libdi=* | --libd=*) - libdir="$ac_optarg" ;; - - -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ - | --libexe | --libex | --libe) - ac_prev=libexecdir ;; - -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ - | --libexe=* | --libex=* | --libe=*) - libexecdir="$ac_optarg" ;; - - -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst \ - | --locals | --local | --loca | --loc | --lo) - ac_prev=localstatedir ;; - -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* \ - | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) - localstatedir="$ac_optarg" ;; - - -mandir | --mandir | --mandi | --mand | --man | --ma | --m) - ac_prev=mandir ;; - -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) - mandir="$ac_optarg" ;; - - -nfp | --nfp | --nf) - # Obsolete; use --without-fp. - with_fp=no ;; - - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c) - no_create=yes ;; - - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) - no_recursion=yes ;; - - -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ - | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ - | --oldin | --oldi | --old | --ol | --o) - ac_prev=oldincludedir ;; - -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ - | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ - | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) - oldincludedir="$ac_optarg" ;; - - -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) - ac_prev=prefix ;; - -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix="$ac_optarg" ;; - - -program-prefix | --program-prefix | --program-prefi | --program-pref \ - | --program-pre | --program-pr | --program-p) - ac_prev=program_prefix ;; - -program-prefix=* | --program-prefix=* | --program-prefi=* \ - | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) - program_prefix="$ac_optarg" ;; - - -program-suffix | --program-suffix | --program-suffi | --program-suff \ - | --program-suf | --program-su | --program-s) - ac_prev=program_suffix ;; - -program-suffix=* | --program-suffix=* | --program-suffi=* \ - | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) - program_suffix="$ac_optarg" ;; - - -program-transform-name | --program-transform-name \ - | --program-transform-nam | --program-transform-na \ - | --program-transform-n | --program-transform- \ - | --program-transform | --program-transfor \ - | --program-transfo | --program-transf \ - | --program-trans | --program-tran \ - | --progr-tra | --program-tr | --program-t) - ac_prev=program_transform_name ;; - -program-transform-name=* | --program-transform-name=* \ - | --program-transform-nam=* | --program-transform-na=* \ - | --program-transform-n=* | --program-transform-=* \ - | --program-transform=* | --program-transfor=* \ - | --program-transfo=* | --program-transf=* \ - | --program-trans=* | --program-tran=* \ - | --progr-tra=* | --program-tr=* | --program-t=*) - program_transform_name="$ac_optarg" ;; - - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - silent=yes ;; - - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) - ac_prev=sbindir ;; - -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ - | --sbi=* | --sb=*) - sbindir="$ac_optarg" ;; - - -sharedstatedir | --sharedstatedir | --sharedstatedi \ - | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ - | --sharedst | --shareds | --shared | --share | --shar \ - | --sha | --sh) - ac_prev=sharedstatedir ;; - -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ - | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ - | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ - | --sha=* | --sh=*) - sharedstatedir="$ac_optarg" ;; - - -site | --site | --sit) - ac_prev=site ;; - -site=* | --site=* | --sit=*) - site="$ac_optarg" ;; - - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - srcdir="$ac_optarg" ;; - - -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ - | --syscon | --sysco | --sysc | --sys | --sy) - ac_prev=sysconfdir ;; - -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ - | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) - sysconfdir="$ac_optarg" ;; - - -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target ;; - -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target="$ac_optarg" ;; - - -v | -verbose | --verbose | --verbos | --verbo | --verb) - verbose=yes ;; - - -version | --version | --versio | --versi | --vers) - echo "configure generated by autoconf version 2.12" - exit 0 ;; - - -with-* | --with-*) - ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then - { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } - fi - ac_package=`echo $ac_package| sed 's/-/_/g'` - case "$ac_option" in - *=*) ;; - *) ac_optarg=yes ;; - esac - eval "with_${ac_package}='$ac_optarg'" ;; - - -without-* | --without-*) - ac_package=`echo $ac_option|sed -e 's/-*without-//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then - { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } - fi - ac_package=`echo $ac_package| sed 's/-/_/g'` - eval "with_${ac_package}=no" ;; - - --x) - # Obsolete; use --with-x. - with_x=yes ;; - - -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ - | --x-incl | --x-inc | --x-in | --x-i) - ac_prev=x_includes ;; - -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ - | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) - x_includes="$ac_optarg" ;; - - -x-libraries | --x-libraries | --x-librarie | --x-librari \ - | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) - ac_prev=x_libraries ;; - -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ - | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries="$ac_optarg" ;; - - -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } - ;; - - *) - if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then - echo "configure: warning: $ac_option: invalid host type" 1>&2 - fi - if test "x$nonopt" != xNONE; then - { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } - fi - nonopt="$ac_option" - ;; - - esac -done - -if test -n "$ac_prev"; then - { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } -fi - -trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 - -# File descriptor usage: -# 0 standard input -# 1 file creation -# 2 errors and warnings -# 3 some systems may open it to /dev/tty -# 4 used on the Kubota Titan -# 6 checking for... messages and results -# 5 compiler messages saved in config.log -if test "$silent" = yes; then - exec 6>/dev/null -else - exec 6>&1 -fi -exec 5>./config.log - -echo "\ -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. -" 1>&5 - -# Strip out --no-create and --no-recursion so they do not pile up. -# Also quote any args containing shell metacharacters. -ac_configure_args= -for ac_arg -do - case "$ac_arg" in - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c) ;; - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; - *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) - ac_configure_args="$ac_configure_args '$ac_arg'" ;; - *) ac_configure_args="$ac_configure_args $ac_arg" ;; - esac -done - -# NLS nuisances. -# Only set these to C if already set. These must not be set unconditionally -# because not all systems understand e.g. LANG=C (notably SCO). -# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! -# Non-C LC_CTYPE values break the ctype check. -if test "${LANG+set}" = set; then LANG=C; export LANG; fi -if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi -if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi -if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi - -# confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -rf conftest* confdefs.h -# AIX cpp loses on an empty file, so make sure it contains at least a newline. -echo > confdefs.h - -# A filename unique to this package, relative to the directory that -# configure is in, which we can look for to find out if srcdir is correct. -ac_unique_file=README - -# Find the source files, if location was not specified. -if test -z "$srcdir"; then - ac_srcdir_defaulted=yes - # Try the directory containing this script, then its parent. - ac_prog=$0 - ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` - test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. - srcdir=$ac_confdir - if test ! -r $srcdir/$ac_unique_file; then - srcdir=.. - fi -else - ac_srcdir_defaulted=no -fi -if test ! -r $srcdir/$ac_unique_file; then - if test "$ac_srcdir_defaulted" = yes; then - { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } - else - { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } - fi -fi -srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` - -# Prefer explicitly selected file to automatically selected ones. -if test -z "$CONFIG_SITE"; then - if test "x$prefix" != xNONE; then - CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" - else - CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" - fi -fi -for ac_site_file in $CONFIG_SITE; do - if test -r "$ac_site_file"; then - echo "loading site script $ac_site_file" - . "$ac_site_file" - fi -done - -if test -r "$cache_file"; then - echo "loading cache $cache_file" - . $cache_file -else - echo "creating cache $cache_file" - > $cache_file -fi - -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - -if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then - # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. - if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then - ac_n= ac_c=' -' ac_t=' ' - else - ac_n=-n ac_c= ac_t= - fi -else - ac_n= ac_c='\c' ac_t= -fi - - - -# handle case when -srcdir is invoked: make location directory for generated -# header files -if test ! -d ./dis ; then - mkdir ./dis -fi - -# Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:532: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_CC="gcc" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:561: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - ac_prog_rejected=no - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - break - fi - done - IFS="$ac_save_ifs" -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $# -gt 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - set dummy "$ac_dir/$ac_word" "$@" - shift - ac_cv_prog_CC="$@" - fi -fi -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } -fi - -echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:609: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 - -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then - ac_cv_prog_cc_works=yes - # If we can't run a trivial program, we are probably using a cross compiler. - if (./conftest; exit) 2>/dev/null; then - ac_cv_prog_cc_cross=no - else - ac_cv_prog_cc_cross=yes - fi -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - ac_cv_prog_cc_works=no -fi -rm -fr conftest* - -echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 -if test $ac_cv_prog_cc_works = no; then - { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } -fi -echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 -echo "configure:643: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 -echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 -cross_compiling=$ac_cv_prog_cc_cross - -echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 -echo "configure:648: checking whether we are using GNU C" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then - ac_cv_prog_gcc=yes -else - ac_cv_prog_gcc=no -fi -fi - -echo "$ac_t""$ac_cv_prog_gcc" 1>&6 - -if test $ac_cv_prog_gcc = yes; then - GCC=yes - ac_test_CFLAGS="${CFLAGS+set}" - ac_save_CFLAGS="$CFLAGS" - CFLAGS= - echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 -echo "configure:672: checking whether ${CC-cc} accepts -g" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - echo 'void f(){}' > conftest.c -if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then - ac_cv_prog_cc_g=yes -else - ac_cv_prog_cc_g=no -fi -rm -f conftest* - -fi - -echo "$ac_t""$ac_cv_prog_cc_g" 1>&6 - if test "$ac_test_CFLAGS" = set; then - CFLAGS="$ac_save_CFLAGS" - elif test $ac_cv_prog_cc_g = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-O2" - fi -else - GCC= - test "${CFLAGS+set}" = set || CFLAGS="-g" -fi - -ac_aux_dir= -for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do - if test -f $ac_dir/install-sh; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f $ac_dir/install.sh; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - fi -done -if test -z "$ac_aux_dir"; then - { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; } -fi -ac_config_guess=$ac_aux_dir/config.guess -ac_config_sub=$ac_aux_dir/config.sub -ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. - -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# ./install, which can be erroneously created by make from ./install.sh. -echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 -echo "configure:729: checking for a BSD compatible install" >&5 -if test -z "$INSTALL"; then -if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - # Account for people who put trailing slashes in PATH elements. - case "$ac_dir/" in - /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - for ac_prog in ginstall installbsd scoinst install; do - if test -f $ac_dir/$ac_prog; then - if test $ac_prog = install && - grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - # OSF/1 installbsd also uses dspmsg, but is usable. - : - else - ac_cv_path_install="$ac_dir/$ac_prog -c" - break 2 - fi - fi - done - ;; - esac - done - IFS="$ac_save_IFS" - -fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL="$ac_cv_path_install" - else - # As a last resort, use the slow shell script. We don't cache a - # path for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the path is relative. - INSTALL="$ac_install_sh" - fi -fi -echo "$ac_t""$INSTALL" 1>&6 - -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' - -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' - -# Extract the first word of "ranlib", so it can be a program name with args. -set dummy ranlib; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:781: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_RANLIB="ranlib" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":" -fi -fi -RANLIB="$ac_cv_prog_RANLIB" -if test -n "$RANLIB"; then - echo "$ac_t""$RANLIB" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 -echo "configure:808: checking how to run the C preprocessor" >&5 -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then -if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - # This must be in double quotes, not single quotes, because CPP may get - # substituted into the Makefile and "${CC-cc}" will confuse make. - CPP="${CC-cc} -E" - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. - cat > conftest.$ac_ext < -Syntax Error -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:829: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out` -if test -z "$ac_err"; then - : -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - CPP="${CC-cc} -E -traditional-cpp" - cat > conftest.$ac_ext < -Syntax Error -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:846: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out` -if test -z "$ac_err"; then - : -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - CPP=/lib/cpp -fi -rm -f conftest* -fi -rm -f conftest* - ac_cv_prog_CPP="$CPP" -fi - CPP="$ac_cv_prog_CPP" -else - ac_cv_prog_CPP="$CPP" -fi -echo "$ac_t""$CPP" 1>&6 - -echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 -echo "configure:869: checking for ANSI C header files" >&5 -if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -#include -#include -#include -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:882: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out` -if test -z "$ac_err"; then - rm -rf conftest* - ac_cv_header_stdc=yes -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_cv_header_stdc=no -fi -rm -f conftest* - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. -cat > conftest.$ac_ext < -EOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "memchr" >/dev/null 2>&1; then - : -else - rm -rf conftest* - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. -cat > conftest.$ac_ext < -EOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "free" >/dev/null 2>&1; then - : -else - rm -rf conftest* - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. -if test "$cross_compiling" = yes; then - : -else - cat > conftest.$ac_ext < -#define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int main () { int i; for (i = 0; i < 256; i++) -if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); -exit (0); } - -EOF -if { (eval echo configure:949: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null -then - : -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -fr conftest* - ac_cv_header_stdc=no -fi -rm -fr conftest* -fi - -fi -fi - -echo "$ac_t""$ac_cv_header_stdc" 1>&6 -if test $ac_cv_header_stdc = yes; then - cat >> confdefs.h <<\EOF -#define STDC_HEADERS 1 -EOF - -fi - -ac_safe=`echo "sys/time.h" | sed 'y%./+-%__p_%'` -echo $ac_n "checking for sys/time.h""... $ac_c" 1>&6 -echo "configure:974: checking for sys/time.h" >&5 -if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:984: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out` -if test -z "$ac_err"; then - rm -rf conftest* - eval "ac_cv_header_$ac_safe=yes" -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_header_$ac_safe=no" -fi -rm -f conftest* -fi -if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then - echo "$ac_t""yes" 1>&6 - cat >> confdefs.h <<\EOF -#define HAVE_SYS_TIME_H 1 -EOF - -else - echo "$ac_t""no" 1>&6 -fi - -for ac_hdr in stdlib.h unistd.h string.h memory.h fcntl.h -do -ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` -echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:1012: checking for $ac_hdr" >&5 -if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1022: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out` -if test -z "$ac_err"; then - rm -rf conftest* - eval "ac_cv_header_$ac_safe=yes" -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_header_$ac_safe=no" -fi -rm -f conftest* -fi -if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` - cat >> confdefs.h <&6 -fi -done - -echo $ac_n "checking whether time.h and sys/time.h may both be included""... $ac_c" 1>&6 -echo "configure:1049: checking whether time.h and sys/time.h may both be included" >&5 -if eval "test \"`echo '$''{'ac_cv_header_time'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -#include -#include -int main() { -struct tm *tp; -; return 0; } -EOF -if { (eval echo configure:1063: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - ac_cv_header_time=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_cv_header_time=no -fi -rm -f conftest* -fi - -echo "$ac_t""$ac_cv_header_time" 1>&6 -if test $ac_cv_header_time = yes; then - cat >> confdefs.h <<\EOF -#define TIME_WITH_SYS_TIME 1 -EOF - -fi - - -echo $ac_n "checking for bind in -lsocket""... $ac_c" 1>&6 -echo "configure:1085: checking for bind in -lsocket" >&5 -ac_lib_var=`echo socket'_'bind | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-lsocket $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - LIBS="$LIBS -lsocket" -else - echo "$ac_t""no" 1>&6 -fi - -echo $ac_n "checking for xdr_free in -lnsl""... $ac_c" 1>&6 -echo "configure:1125: checking for xdr_free in -lnsl" >&5 -ac_lib_var=`echo nsl'_'xdr_free | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="$LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - LIBS="$LIBS" -else - echo "$ac_t""no" 1>&6 -fi - -echo $ac_n "checking for dbm_fetch in -lgdbm""... $ac_c" 1>&6 -echo "configure:1165: checking for dbm_fetch in -lgdbm" >&5 -ac_lib_var=`echo gdbm'_'dbm_fetch | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-lgdbm -lgdbm_compat $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - LIBS="$LIBS -lgdbm -lgdbm_compat" -else - echo "$ac_t""no" 1>&6 -fi - - - - - - - - - -echo $ac_n "checking for msg_accrights in struct msghdr""... $ac_c" 1>&6 -echo "configure:1213: checking for msg_accrights in struct msghdr" >&5 -if eval "test \"`echo '$''{'ac_cv_struct_msg_accrights'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -#include -#include -int main() { -struct msghdr s; s.msg_accrights; -; return 0; } -EOF -if { (eval echo configure:1227: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - ac_cv_struct_msg_accrights=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_cv_struct_msg_accrights=no -fi -rm -f conftest* -fi - -echo "$ac_t""$ac_cv_struct_msg_accrights" 1>&6 -if test $ac_cv_struct_msg_accrights = yes; then - cat >> confdefs.h <<\EOF -#define HAVE_MSG_ACCRIGHTS 1 -EOF - -fi - -echo $ac_n "checking for msg_control in struct msghdr""... $ac_c" 1>&6 -echo "configure:1248: checking for msg_control in struct msghdr" >&5 -if eval "test \"`echo '$''{'ac_cv_struct_msg_control'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -#include -#include -int main() { -struct msghdr s; s.msg_control; -; return 0; } -EOF -if { (eval echo configure:1262: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - ac_cv_struct_msg_control=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_cv_struct_msg_control=no -fi -rm -f conftest* -fi - -echo "$ac_t""$ac_cv_struct_msg_control" 1>&6 -if test $ac_cv_struct_msg_control = yes; then - cat >> confdefs.h <<\EOF -#define HAVE_MSG_CONTROL 1 -EOF - -fi - -echo $ac_n "checking for recvmsg system call""... $ac_c" 1>&6 -echo "configure:1283: checking for recvmsg system call" >&5 -if eval "test \"`echo '$''{'ac_cv_have_recvmsg'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -#include -#include -int main() { -int s, f; struct msghdr m; recvmsg(s, &m, f); -; return 0; } -EOF -if { (eval echo configure:1297: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then - rm -rf conftest* - ac_cv_have_recvmsg=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_cv_have_recvmsg=no -fi -rm -f conftest* -fi - -echo "$ac_t""$ac_cv_have_recvmsg" 1>&6 -if test $ac_cv_have_recvmsg = yes; then - cat >> confdefs.h <<\EOF -#define HAVE_RECVMSG 1 -EOF - -fi - - -echo $ac_n "checking for elf_end in -lelf""... $ac_c" 1>&6 -echo "configure:1319: checking for elf_end in -lelf" >&5 -ac_lib_var=`echo elf'_'elf_end | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-lelf $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - LIBS="$LIBS -lelf" -else - echo "$ac_t""no" 1>&6 -fi - - -# Solaris special handling ... -if uname -sr | grep '^SunOS 5' >/dev/null ; then - LIBS="$LIBS -R/usr/ucblib -L/usr/ucblib -lucb" -fi - -echo $ac_n "checking for -ldnet_stub""... $ac_c" 1>&6 -echo "configure:1365: checking for -ldnet_stub" >&5 -if eval "test \"`echo '$''{'ac_cv_lib_dnet_stub'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-ldnet_stub $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then - rm -rf conftest* - ac_cv_lib_dnet_stub=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_cv_lib_dnet_stub=no -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -echo "$ac_t""$ac_cv_lib_dnet_stub" 1>&6 -if test "$ac_cv_lib_dnet_stub" = yes; then - LIBS="$LIBS -ldnet_stub" -fi - - -if uname -srv | grep '^AIX 2 3' >/dev/null ; then - : -else - echo $ac_n "checking for -lbsd""... $ac_c" 1>&6 -echo "configure:1402: checking for -lbsd" >&5 -if eval "test \"`echo '$''{'ac_cv_lib_bsd'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-lbsd $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then - rm -rf conftest* - ac_cv_lib_bsd=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_cv_lib_bsd=no -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -echo "$ac_t""$ac_cv_lib_bsd" 1>&6 -if test "$ac_cv_lib_bsd" = yes; then - LIBS="$LIBS -lbsd" -fi - -fi - -LIBS="$LIBS -lm" -for ac_func in strdup -do -echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:1440: checking for $ac_func" >&5 -if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -$ac_func(); -#endif - -; return 0; } -EOF -if { (eval echo configure:1468: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then - rm -rf conftest* - eval "ac_cv_func_$ac_func=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_$ac_func=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` - cat >> confdefs.h <&6 -LIBOBJS="$LIBOBJS ${ac_func}.o" -fi -done - - - -echo $ac_n "checking for dbm_fetch in -lc""... $ac_c" 1>&6 -echo "configure:1496: checking for dbm_fetch in -lc" >&5 -ac_lib_var=`echo c'_'dbm_fetch | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-lc $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - DBMLIB="" -else - echo "$ac_t""no" 1>&6 -DBMLIB="-ldbm" -fi - - -echo $ac_n "checking "whether RPCGEN generates ANSI C function prototypes"""... $ac_c" 1>&6 -echo "configure:1538: checking "whether RPCGEN generates ANSI C function prototypes"" >&5 -cat > conftest.x << EOF -program TESTPRG -{ - version TESTVER - { - void TESTFUN(void) = 0; - } = 1; -} = 1; -EOF -if rpcgen -h conftest.x | grep testfun_1_svc > /dev/null -then -echo "$ac_t"""prototyped"" 1>&6 -cat >> confdefs.h <<\EOF -#define HAVE_NEW_RPCGEN 1 -EOF - -else -echo "$ac_t"""classic"" 1>&6 -fi - - - - - -dsubdirs="lib" - -NON_DBM_LIBS="$LIBS" - -echo $ac_n "checking for library containing dbm_fetch""... $ac_c" 1>&6 -echo "configure:1568: checking for library containing dbm_fetch" >&5 -if eval "test \"`echo '$''{'mdw_cv_lib_dbm_fetch'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - mdw_save_LIBS="$LIBS" -mdw_cv_lib_dbm_fetch="no" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then - rm -rf conftest* - mdw_cv_lib_dbm_fetch="none required" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 -fi -rm -f conftest* -test "$mdw_cv_lib_dbm_fetch" = "no" && for i in db dbm gdbm; do -LIBS="-l$i $mdw_save_LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then - rm -rf conftest* - mdw_cv_lib_dbm_fetch="-l$i" -break -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 -fi -rm -f conftest* -done -LIBS="$mdw_save_LIBS" -fi - -echo "$ac_t""$mdw_cv_lib_dbm_fetch" 1>&6 -if test "$mdw_cv_lib_dbm_fetch" != "no"; then - test "$mdw_cv_lib_dbm_fetch" = "none required" || LIBS="$mdw_cv_lib_dbm_fetch $LIBS" - - cat >> confdefs.h <<\EOF -#define HAVE_NDBM 1 -EOF - - DBM="$LIBS" - DB_LOADER=create-tables-4 - -else : - - dsubdirs="$dsubdirs sdbm" - DBM="$LIBS -L../sdbm -lsdbm" - SIMX_INCLUDES="-I../sdbm" - DB_LOADER=create-tables-5 - -fi -LIBS="$NON_DBM_LIBS" - -dsubdirs="$dsubdirs server data test" - -subdirs="disgen" - - -trap '' 1 2 15 -cat > confcache <<\EOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs. It is not useful on other systems. -# If it contains results you don't want to keep, you may remove or edit it. -# -# By default, configure uses ./config.cache as the cache file, -# creating it if it does not exist already. You can give configure -# the --cache-file=FILE option to use a different cache file; that is -# what configure does when it calls configure scripts in -# subdirectories, so they share the cache. -# Giving --cache-file=/dev/null disables caching, for debugging configure. -# config.status only pays attention to the cache file if you give it the -# --recheck option to rerun configure. -# -EOF -# The following way of writing the cache mishandles newlines in values, -# but we know of no workaround that is simple, portable, and efficient. -# So, don't put newlines in cache variables' values. -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -(set) 2>&1 | - case `(ac_space=' '; set) 2>&1` in - *ac_space=\ *) - # `set' does not quote correctly, so add quotes (double-quote substitution - # turns \\\\ into \\, and sed turns \\ into \). - sed -n \ - -e "s/'/'\\\\''/g" \ - -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" - ;; - *) - # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' - ;; - esac >> confcache -if cmp -s $cache_file confcache; then - : -else - if test -w $cache_file; then - echo "updating cache $cache_file" - cat confcache > $cache_file - else - echo "not updating unwritable cache $cache_file" - fi -fi -rm -f confcache - -trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 - -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - -# Any assignment to VPATH causes Sun make to only execute -# the first set of double-colon rules, so remove it if not needed. -# If there is a colon in the path, we need to keep it. -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' -fi - -trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 - -# Transform confdefs.h into DEFS. -# Protect against shell expansion while executing Makefile rules. -# Protect against Makefile macro expansion. -cat > conftest.defs <<\EOF -s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g -s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g -s%\[%\\&%g -s%\]%\\&%g -s%\$%$$%g -EOF -DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '` -rm -f conftest.defs - - -# Without the "./", some shells look in PATH for config.status. -: ${CONFIG_STATUS=./config.status} - -echo creating $CONFIG_STATUS -rm -f $CONFIG_STATUS -cat > $CONFIG_STATUS </dev/null | sed 1q`: -# -# $0 $ac_configure_args -# -# Compiler output produced by configure, useful for debugging -# configure, is in ./config.log if it exists. - -ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" -for ac_option -do - case "\$ac_option" in - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" - exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; - -version | --version | --versio | --versi | --vers | --ver | --ve | --v) - echo "$CONFIG_STATUS generated by autoconf version 2.12" - exit 0 ;; - -help | --help | --hel | --he | --h) - echo "\$ac_cs_usage"; exit 0 ;; - *) echo "\$ac_cs_usage"; exit 1 ;; - esac -done - -ac_given_srcdir=$srcdir -ac_given_INSTALL="$INSTALL" - -trap 'rm -fr `echo "Makefile lib/Makefile sdbm/Makefile server/Makefile data/Makefile test/Makefile" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 -EOF -cat >> $CONFIG_STATUS < conftest.subs <<\\CEOF -$ac_vpsub -$extrasub -s%@CFLAGS@%$CFLAGS%g -s%@CPPFLAGS@%$CPPFLAGS%g -s%@CXXFLAGS@%$CXXFLAGS%g -s%@DEFS@%$DEFS%g -s%@LDFLAGS@%$LDFLAGS%g -s%@LIBS@%$LIBS%g -s%@exec_prefix@%$exec_prefix%g -s%@prefix@%$prefix%g -s%@program_transform_name@%$program_transform_name%g -s%@bindir@%$bindir%g -s%@sbindir@%$sbindir%g -s%@libexecdir@%$libexecdir%g -s%@datadir@%$datadir%g -s%@sysconfdir@%$sysconfdir%g -s%@sharedstatedir@%$sharedstatedir%g -s%@localstatedir@%$localstatedir%g -s%@libdir@%$libdir%g -s%@includedir@%$includedir%g -s%@oldincludedir@%$oldincludedir%g -s%@infodir@%$infodir%g -s%@mandir@%$mandir%g -s%@CC@%$CC%g -s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g -s%@INSTALL_DATA@%$INSTALL_DATA%g -s%@RANLIB@%$RANLIB%g -s%@CPP@%$CPP%g -s%@LIBOBJS@%$LIBOBJS%g -s%@dsubdirs@%$dsubdirs%g -s%@DBM@%$DBM%g -s%@DB_LOADER@%$DB_LOADER%g -s%@SIMX_INCLUDES@%$SIMX_INCLUDES%g -s%@subdirs@%$subdirs%g - -CEOF -EOF - -cat >> $CONFIG_STATUS <<\EOF - -# Split the substitutions into bite-sized pieces for seds with -# small command number limits, like on Digital OSF/1 and HP-UX. -ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. -ac_file=1 # Number of current file. -ac_beg=1 # First line for current file. -ac_end=$ac_max_sed_cmds # Line after last line for current file. -ac_more_lines=: -ac_sed_cmds="" -while $ac_more_lines; do - if test $ac_beg -gt 1; then - sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file - else - sed "${ac_end}q" conftest.subs > conftest.s$ac_file - fi - if test ! -s conftest.s$ac_file; then - ac_more_lines=false - rm -f conftest.s$ac_file - else - if test -z "$ac_sed_cmds"; then - ac_sed_cmds="sed -f conftest.s$ac_file" - else - ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" - fi - ac_file=`expr $ac_file + 1` - ac_beg=$ac_end - ac_end=`expr $ac_end + $ac_max_sed_cmds` - fi -done -if test -z "$ac_sed_cmds"; then - ac_sed_cmds=cat -fi -EOF - -cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF -for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then - # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". - case "$ac_file" in - *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` - ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; - *) ac_file_in="${ac_file}.in" ;; - esac - - # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. - - # Remove last slash and all that follows it. Not all systems have dirname. - ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` - if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then - # The file is in a subdirectory. - test ! -d "$ac_dir" && mkdir "$ac_dir" - ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" - # A "../" for each directory in $ac_dir_suffix. - ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` - else - ac_dir_suffix= ac_dots= - fi - - case "$ac_given_srcdir" in - .) srcdir=. - if test -z "$ac_dots"; then top_srcdir=. - else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; - /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; - *) # Relative path. - srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" - top_srcdir="$ac_dots$ac_given_srcdir" ;; - esac - - case "$ac_given_INSTALL" in - [/$]*) INSTALL="$ac_given_INSTALL" ;; - *) INSTALL="$ac_dots$ac_given_INSTALL" ;; - esac - - echo creating "$ac_file" - rm -f "$ac_file" - configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." - case "$ac_file" in - *Makefile*) ac_comsub="1i\\ -# $configure_input" ;; - *) ac_comsub= ;; - esac - - ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` - sed -e "$ac_comsub -s%@configure_input@%$configure_input%g -s%@srcdir@%$srcdir%g -s%@top_srcdir@%$top_srcdir%g -s%@INSTALL@%$INSTALL%g -" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file -fi; done -rm -f conftest.s* - -EOF -cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF - -exit 0 -EOF -chmod +x $CONFIG_STATUS -rm -fr confdefs* $ac_clean_files -test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 - -if test "$no_recursion" != yes; then - - # Remove --cache-file and --srcdir arguments so they do not pile up. - ac_sub_configure_args= - ac_prev= - for ac_arg in $ac_configure_args; do - if test -n "$ac_prev"; then - ac_prev= - continue - fi - case "$ac_arg" in - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - ;; - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - ;; - *) ac_sub_configure_args="$ac_sub_configure_args $ac_arg" ;; - esac - done - - for ac_config_dir in disgen; do - - # Do not complain, so a configure script can configure whichever - # parts of a large source tree are present. - if test ! -d $srcdir/$ac_config_dir; then - continue - fi - - echo configuring in $ac_config_dir - - case "$srcdir" in - .) ;; - *) - if test -d ./$ac_config_dir || mkdir ./$ac_config_dir; then :; - else - { echo "configure: error: can not create `pwd`/$ac_config_dir" 1>&2; exit 1; } - fi - ;; - esac - - ac_popdir=`pwd` - cd $ac_config_dir - - # A "../" for each directory in /$ac_config_dir. - ac_dots=`echo $ac_config_dir|sed -e 's%^\./%%' -e 's%[^/]$%&/%' -e 's%[^/]*/%../%g'` - - case "$srcdir" in - .) # No --srcdir option. We are building in place. - ac_sub_srcdir=$srcdir ;; - /*) # Absolute path. - ac_sub_srcdir=$srcdir/$ac_config_dir ;; - *) # Relative path. - ac_sub_srcdir=$ac_dots$srcdir/$ac_config_dir ;; - esac - - # Check for guested configure; otherwise get Cygnus style configure. - if test -f $ac_sub_srcdir/configure; then - ac_sub_configure=$ac_sub_srcdir/configure - elif test -f $ac_sub_srcdir/configure.in; then - ac_sub_configure=$ac_configure - else - echo "configure: warning: no configuration information is in $ac_config_dir" 1>&2 - ac_sub_configure= - fi - - # The recursion is here. - if test -n "$ac_sub_configure"; then - - # Make the cache file name correct relative to the subdirectory. - case "$cache_file" in - /*) ac_sub_cache_file=$cache_file ;; - *) # Relative path. - ac_sub_cache_file="$ac_dots$cache_file" ;; - esac - case "$ac_given_INSTALL" in - [/$]*) INSTALL="$ac_given_INSTALL" ;; - *) INSTALL="$ac_dots$ac_given_INSTALL" ;; - esac - - echo "running ${CONFIG_SHELL-/bin/sh} $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_sub_srcdir" - # The eval makes quoting arguments work. - if eval ${CONFIG_SHELL-/bin/sh} $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_sub_srcdir - then : - else - { echo "configure: error: $ac_sub_configure failed for $ac_config_dir" 1>&2; exit 1; } - fi - fi - - cd $ac_popdir - done -fi - diff -Nru acm-5.0/dis/configure.in acm-6.0+20200416/dis/configure.in --- acm-5.0/dis/configure.in 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/dis/configure.in 1970-01-01 00:00:00.000000000 +0000 @@ -1,126 +0,0 @@ -AC_INIT(README) - -# handle case when -srcdir is invoked: make location directory for generated -# header files -if test ! -d ./dis ; then - mkdir ./dis -fi - -AC_PROG_CC -AC_PROG_INSTALL -AC_PROG_RANLIB -AC_HEADER_STDC -AC_CHECK_HEADER(sys/time.h, AC_DEFINE(HAVE_SYS_TIME_H)) -AC_CHECK_HEADERS(stdlib.h unistd.h string.h memory.h fcntl.h) -AC_HEADER_TIME - -AC_CHECK_LIB(socket, bind, [LIBS="$LIBS -lsocket"]) -AC_CHECK_LIB(nsl, xdr_free, [LIBS="$LIBS"]) -AC_CHECK_LIB(gdbm, dbm_fetch, [LIBS="$LIBS -lgdbm"]) - - -AC_DEFUN(AC_STRUCT_MSG_ACCRIGHTS, -[AC_CACHE_CHECK([for msg_accrights in struct msghdr], ac_cv_struct_msg_accrights, -[AC_TRY_COMPILE([#include -#include -#include ], [struct msghdr s; s.msg_accrights;], -ac_cv_struct_msg_accrights=yes, ac_cv_struct_msg_accrights=no)]) -if test $ac_cv_struct_msg_accrights = yes; then - AC_DEFINE(HAVE_MSG_ACCRIGHTS) -fi -]) - -AC_DEFUN(AC_STRUCT_MSG_CONTROL, -[AC_CACHE_CHECK([for msg_control in struct msghdr], ac_cv_struct_msg_control, -[AC_TRY_COMPILE([#include -#include -#include ], [struct msghdr s; s.msg_control;], -ac_cv_struct_msg_control=yes, ac_cv_struct_msg_control=no)]) -if test $ac_cv_struct_msg_control = yes; then - AC_DEFINE(HAVE_MSG_CONTROL) -fi -]) - -AC_DEFUN(AC_HAVE_RECVMSG, -[AC_CACHE_CHECK([for recvmsg system call], ac_cv_have_recvmsg, -[AC_TRY_LINK([#include -#include -#include ], [int s, f; struct msghdr m; recvmsg(s, &m, f);], -ac_cv_have_recvmsg=yes, ac_cv_have_recvmsg=no)]) -if test $ac_cv_have_recvmsg = yes; then - AC_DEFINE(HAVE_RECVMSG) -fi -]) - -AC_STRUCT_MSG_ACCRIGHTS -AC_STRUCT_MSG_CONTROL -AC_HAVE_RECVMSG - -AC_CHECK_LIB(elf, elf_end, [LIBS="$LIBS -lelf"]) - -# Solaris special handling ... -if uname -sr | grep '^SunOS 5' >/dev/null ; then - LIBS="$LIBS -R/usr/ucblib -L/usr/ucblib -lucb" -fi - -AC_HAVE_LIBRARY(dnet_stub, [LIBS="$LIBS -ldnet_stub"]) - -if uname -srv | grep '^AIX 2 3' >/dev/null ; then - : -else - AC_HAVE_LIBRARY(bsd, [LIBS="$LIBS -lbsd"]) -fi - -LIBS="$LIBS -lm" -AC_REPLACE_FUNCS(strdup) - -dnl Check for dbm_* routine buried in libc (Solaris) -AC_CHECK_LIB(c, dbm_fetch, [DBMLIB=""], [DBMLIB="-ldbm"]) - -AC_MSG_CHECKING("whether RPCGEN generates ANSI C function prototypes") -cat > conftest.x << EOF -program TESTPRG -{ - version TESTVER - { - void TESTFUN(void) = 0; - } = 1; -} = 1; -EOF -if rpcgen -h conftest.x | grep testfun_1_svc > /dev/null -then -AC_MSG_RESULT("prototyped") -AC_DEFINE(HAVE_NEW_RPCGEN) -else -AC_MSG_RESULT("classic") -fi - -AC_SUBST(dsubdirs) -AC_SUBST(DBM) -AC_SUBST(DB_LOADER) -AC_SUBST(SIMX_INCLUDES) -dsubdirs="lib" - -dnl Hide away non-dbm libraries, since mdw_CHECK_MANYLIBS always -dnl modifies LIBS. This might not be necessary - the only consequence -dnl of not doing this is that the test programs get needlessly linked -dnl against dbm. -NON_DBM_LIBS="$LIBS" - -mdw_CHECK_MANYLIBS(dbm_fetch,db dbm gdbm,[ - AC_DEFINE(HAVE_NDBM) - DBM="$LIBS" - DB_LOADER=create-tables-4 -],[ - dsubdirs="$dsubdirs sdbm" - DBM="$LIBS -L../sdbm -lsdbm" - SIMX_INCLUDES="-I../sdbm" - DB_LOADER=create-tables-5 -]) -LIBS="$NON_DBM_LIBS" - -dsubdirs="$dsubdirs server data test" - -AC_CONFIG_SUBDIRS(disgen) - -AC_OUTPUT(Makefile lib/Makefile sdbm/Makefile server/Makefile data/Makefile test/Makefile) diff -Nru acm-5.0/dis/conftest.x acm-6.0+20200416/dis/conftest.x --- acm-5.0/dis/conftest.x 1998-08-14 21:20:02.000000000 +0000 +++ acm-6.0+20200416/dis/conftest.x 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ -program TESTPRG -{ - version TESTVER - { - void TESTFUN(void) = 0; - } = 1; -} = 1; diff -Nru acm-5.0/dis/COPYING acm-6.0+20200416/dis/COPYING --- acm-5.0/dis/COPYING 1995-12-20 17:40:08.000000000 +0000 +++ acm-6.0+20200416/dis/COPYING 1970-01-01 00:00:00.000000000 +0000 @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 675 Mass Ave, Cambridge, MA 02139, USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - Appendix: How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) 19yy - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) 19yy name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff -Nru acm-5.0/dis/COPYING.LIB acm-6.0+20200416/dis/COPYING.LIB --- acm-5.0/dis/COPYING.LIB 1995-12-20 17:40:14.000000000 +0000 +++ acm-6.0+20200416/dis/COPYING.LIB 1970-01-01 00:00:00.000000000 +0000 @@ -1,481 +0,0 @@ - GNU LIBRARY GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1991 Free Software Foundation, Inc. - 675 Mass Ave, Cambridge, MA 02139, USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the library GPL. It is - numbered 2 because it goes with version 2 of the ordinary GPL.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Library General Public License, applies to some -specially designated Free Software Foundation software, and to any -other libraries whose authors decide to use it. You can use it for -your libraries, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if -you distribute copies of the library, or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link a program with the library, you must provide -complete object files to the recipients so that they can relink them -with the library, after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - Our method of protecting your rights has two steps: (1) copyright -the library, and (2) offer you this license which gives you legal -permission to copy, distribute and/or modify the library. - - Also, for each distributor's protection, we want to make certain -that everyone understands that there is no warranty for this free -library. If the library is modified by someone else and passed on, we -want its recipients to know that what they have is not the original -version, so that any problems introduced by others will not reflect on -the original authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that companies distributing free -software will individually obtain patent licenses, thus in effect -transforming the program into proprietary software. To prevent this, -we have made it clear that any patent must be licensed for everyone's -free use or not licensed at all. - - Most GNU software, including some libraries, is covered by the ordinary -GNU General Public License, which was designed for utility programs. This -license, the GNU Library General Public License, applies to certain -designated libraries. This license is quite different from the ordinary -one; be sure to read it in full, and don't assume that anything in it is -the same as in the ordinary license. - - The reason we have a separate public license for some libraries is that -they blur the distinction we usually make between modifying or adding to a -program and simply using it. Linking a program with a library, without -changing the library, is in some sense simply using the library, and is -analogous to running a utility program or application program. However, in -a textual and legal sense, the linked executable is a combined work, a -derivative of the original library, and the ordinary General Public License -treats it as such. - - Because of this blurred distinction, using the ordinary General -Public License for libraries did not effectively promote software -sharing, because most developers did not use the libraries. We -concluded that weaker conditions might promote sharing better. - - However, unrestricted linking of non-free programs would deprive the -users of those programs of all benefit from the free status of the -libraries themselves. This Library General Public License is intended to -permit developers of non-free programs to use free libraries, while -preserving your freedom as a user of such programs to change the free -libraries that are incorporated in them. (We have not seen how to achieve -this as regards changes in header files, but we have achieved it as regards -changes in the actual functions of the Library.) The hope is that this -will lead to faster development of free libraries. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, while the latter only -works together with the library. - - Note that it is possible for a library to be covered by the ordinary -General Public License rather than by this special one. - - GNU LIBRARY GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library which -contains a notice placed by the copyright holder or other authorized -party saying it may be distributed under the terms of this Library -General Public License (also called "this License"). Each licensee is -addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also compile or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - c) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - d) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the source code distributed need not include anything that is normally -distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Library General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - Appendix: How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the Free - Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! diff -Nru acm-5.0/dis/data/countries.txt acm-6.0+20200416/dis/data/countries.txt --- acm-5.0/dis/data/countries.txt 1998-08-14 21:20:12.000000000 +0000 +++ acm-6.0+20200416/dis/data/countries.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,265 +0,0 @@ -1,Afghanistan -2,Albania -3,Algeria -4,American Samoa (United States) -5,Andorra -6,Angola -7,Anguilla -8,Antarctica (International) -9,Antigua and Barbuda -10,Argentina -244,Armenia -11,Aruba -12,Ashmore and Cartier Islands (Australia) -13,Australia -14,Austria -245,Azerbaijan -15,Bahamas -16,Bahrain -17,Baker Island (United States) -18,Bangladesh -19,Barbados -20,Bassas da India (France) -246,Belarus -21,Belgium -22,Belize -23,Benin (aka Dahomey) -24,Bermuda (United Kingdom) -25,Bhutan -26,Bolivia -247,Bosnia and Hercegovina -27,Botswana -28,Bouvet Island (Norway) -29,Brazil -30,British Indian Ocean Territory (United Kingdom) -31,British Virgin Islands (United Kingdom) -32,Brunei -33,Bulgaria -34,Burkina (aka Burkina Faso or Upper Volta -35,Burma (Myanmar) -36,Burundi -37,Cambodia (aka Kampuchea) -38,Cameroon -39,Canada -40,Cape Verde, Republic of -41,Cayman Islands (United Kingdom) -42,Central African Republic -43,Chad -44,Chile -45,China, People's Republic of -46,Christmas Island (Australia) -248,Clipperton Island (France) -47,Cocos (Keeling) Islands (Australia) -48,Colombia -222,Commonwealth of Independent States -49,Comoros -50,Congo, Republic of -51,Cook Islands (New Zealand) -52,Coral Sea Islands (Australia) -53,Costa Rica -107,(Cote D'Ivoire (aka Ivory Coast) -249,Croatia -54,Cuba -55,Cyprus -56,Czechoslovakia (separating into Czech Republic and Slovak Republic) -23,Dahomey (aka Benin) -57,Denmark -58,Djibouti -59,Dominica -60,Dominican Republic -61,Ecuador -62,Egypt -63,El Salvador -64,Equatorial Guinea -250,Estonia -65,Ethiopia -66,Europa Island (France) -67,Falkland Islands (aka Islas Malvinas) (United Kingdom) -68,Faroe Islands (Denmark) -69,Fiji -70,Finland -71,France -72,French Guiana (France) -73,French Polynesia (France) -74,French Southern and Antarctic Islands (France) -75,Gabon -76,Gambia, The -77,Gaza Strip (Israel) -251,Georgia -78,Germany -79,Ghana -80,Gibraltar (United Kingdom) -81,Glorioso Islands (France) -82,Greece -83,Greenland (Denmark) -84,Grenada -85,Guadaloupe (France) -86,Guam (United States) -87,Guatemala -88,Guernsey (United Kingdom) -89,Guinea -90,Guinea- Bissau -91,Guyana -92,Haiti -93,Heard Island and McDonald Islands (Australia) -94,Honduras -95,Hong Kong (United Kingdom) -96,Howland Island (United States) -97,Hungary -98,Iceland -99,India -100,Indonesia -101,Iran -102,Iraq -104,Ireland -105,Israel -106,Italy -107,Ivory Coast (aka Cote D'Ivoire) -108,Jamaica -109,Jan Mayen (Norway) -110,Japan -111,Jarvis Island (United States) -112,Jersey (United Kingdom) -113,Johnston Atoll (United States) -114,Jordan -115,Juan de Nova Island -252,Kazakhstan -116,Kenya -117,Kingman Reef (United States) -118,Kiribati -119,Korea, Democratic People's Republic of (North) -120,Korea, Republic of (South) -121,Kuwait -253,Kyrgyzstan -122,Laos -254,Latvia -123,Lebanon -124,Lesotho -125,Liberia -126,Libya -127,Liechtenstein -255,Lithuania -128,Luxembourg -130,Macau (Portugal) -256,Macedonia -129,Madagascar -131,Malawi -132,Malaysia -133,Maldives -134,Mali -135,Malta -136,Man, Isle of (United Kingdom) -137,Marshall Islands -138,Martinique (France) -139,Mauritania -140,Mauritius -141,Mayotte (France) -142,Mexico -143,Micronesia, Federative States of -257,Midway Islands (United States) -258,Moldova -144,Monaco -145,Mongolia -259,Montenegro -146,Montserrat (United Kingdom) -147,Morocco -148,Mozambique -35,Myanmar (aka Burma) -149,Namibia (South West Africa) -150,Nauru -151,Navassa Island (United States) -152,Nepal -153,Netherlands -154,Netherlands Antilles (Curacao, Bonaire, Saba, Saint Maarten Saint Eustatius) -155,New Caledonia (France) -156,New Zealand -157,Nicaragua -158,Niger -159,Nigeria -160,Niue (New Zealand) -161,Norfolk Island (Australia) -162,Northern Mariana Islands (United States) -163,Norway -164,Oman -216,Pacific Islands, Trust Territory of the (Palau) -165,Pakistan -166,Palmyra Atoll (United States) -168,Panama -169,Papua New Guinea -170,Paracel Islands (International - Occupied by China, also claimed by Taiwan and Vietnam) -171,Paraguay -172,Peru -173,Philippines -174,Pitcairn Islands (United Kingdom) -175,Poland -176,Portugal -177,Puerto Rico (United States) -178,Qatar -179,Reunion (France) -180,Romania -260,Russia -181,Rwanda -183,St. Helena (United Kingdom) -184,St. Lucia -186,St. Vincent and the Grenadines -182,St. Kitts and Nevis -185,St. Pierre and Miquelon (France) -187,San Marino -188,Sao Tome and Principe -189,Saudi Arabia -190,Senegal -261,Serbia and Montenegro (Montenegro to separate) -191,Seychelles -192,Sierra Leone -193,Singapore -262,Slovenia -194,Solomon Islands -195,Somalia -197,South Africa -196,South Georgia and the South Sandwich Islands (United Kingdom) -198,Spain -199,Spratly Islands (International - parts occupied and claimed by China,Malaysia, Philippines, Taiwan, Vietnam) -200,Sri Lanka -201,Sudan -202,Suriname -203,Svalbard (Norway) -204,Swaziland -205,Sweden -206,Switzerland -207,Syria -208,Taiwan -263,Tajikistan -209,Tanzania -210,Thailand -211,Togo -212,Tokelau (New Zealand) -213,Tonga -214,Trinidad and Tobago -215,Tromelin Island (France) -217,Tunisia -218,Turkey -264,Turkmenistan -219,Turks and Caicos Islands (United Kingdom) -220,Tuvalu -221,Uganda -265,Ukraine -223,United Arab Emirates -224,United Kingdom -225,United States -34,Upper Volta (aka Burkina or Burkina Faso) -226,Uruguay -266,Uzbekistan -227,Vanuatu -228,Vatican City (Holy See) -229,Venezuela -230,Vietnam -231,Virgin Islands (United States) -232,Wake Island (United States) -233,Wallis and Futuna (France) -235,West Bank (Israel) -234,Western Sahara -236,Western Samoa -237,Yemen -241,Zaire -242,Zambia -243,Zimbabwe \ No newline at end of file diff -Nru acm-5.0/dis/data/create-tables-4 acm-6.0+20200416/dis/data/create-tables-4 --- acm-5.0/dis/data/create-tables-4 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/dis/data/create-tables-4 1970-01-01 00:00:00.000000000 +0000 @@ -1,56 +0,0 @@ -#! /usr/local/bin/perl - -open (CAT, ">./categories"); - -@last_a = ('', '', '', '', '', '', ''); - -open (ENTITIES, "./entities"); -dbmopen (%entities, "./dis-entities", 0644); -while () { - chop; - next if /^\s*#/; - s/\s*$//g; - @a = split ('\,'); - $key = pack ("CCSCCCC", - $a[0], $a[1], $a[2], $a[3], $a[4], $a[5], $a[6]); - $j = 0; - for ($i=0; $i<7; ++$i) { - $j = index(substr($_, $j), ',') + $j + 1; - } - $entities{$key} = substr($_, $j); - $entities{$key} =~ s/^\s+//g; - $match = 1; - for ($i=0; $i<7 && $match == 1; ++$i) { - if ($a[$i] ne $last_a[$i]) { - $match = 0; - } - } - if ($match == 1) { - print STDERR "Yow! duplicate \"$_\"\n"; - } - if ($a[4] eq '0') { - print $entities{$key}, "\n"; - print CAT $_, "\n"; - } - - @last_a = @a; - -} -dbmclose (%entities); -close (ENTITIES); - -open (SITES, "./sites"); -dbmopen (%sites, "./dis-sites", 0666); -while () { - chop; - if (/^#/) { - } - else { - @a = split ('\,'); - $key = pack ("S", $a[0]); - $sites{$key} = $a[1]; - } -} -dbmclose (%sites); -close (SITES); - diff -Nru acm-5.0/dis/data/create-tables-5 acm-6.0+20200416/dis/data/create-tables-5 --- acm-5.0/dis/data/create-tables-5 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/dis/data/create-tables-5 1970-01-01 00:00:00.000000000 +0000 @@ -1,58 +0,0 @@ -#! /usr/local/bin/perl - -use SDBM_File; - -open (CAT, ">./categories"); - -@last_a = ('', '', '', '', '', '', ''); - -open (ENTITIES, "./entities"); -dbmopen (%entities, "./dis-entities", 0644); -while () { - chop; - next if /^\s*#/; - s/\s*$//g; - @a = split ('\,'); - $key = pack ("CCSCCCC", - $a[0], $a[1], $a[2], $a[3], $a[4], $a[5], $a[6]); - $j = 0; - for ($i=0; $i<7; ++$i) { - $j = index(substr($_, $j), ',') + $j + 1; - } - $entities{$key} = substr($_, $j); - $entities{$key} =~ s/^\s+//g; - $match = 1; - for ($i=0; $i<7 && $match == 1; ++$i) { - if ($a[$i] ne $last_a[$i]) { - $match = 0; - } - } - if ($match == 1) { - print STDERR "Yow! duplicate \"$_\"\n"; - } - if ($a[4] eq '0') { - print $entities{$key}, "\n"; - print CAT $_, "\n"; - } - - @last_a = @a; - -} -dbmclose (%entities); -close (ENTITIES); - -open (SITES, "./sites"); -dbmopen (%sites, "./dis-sites", 0666); -while () { - chop; - if (/^#/) { - } - else { - @a = split ('\,'); - $key = pack ("S", $a[0]); - $sites{$key} = $a[1]; - } -} -dbmclose (%sites); -close (SITES); - diff -Nru acm-5.0/dis/data/entities acm-6.0+20200416/dis/data/entities --- acm-5.0/dis/data/entities 1996-01-04 17:20:42.000000000 +0000 +++ acm-6.0+20200416/dis/data/entities 1970-01-01 00:00:00.000000000 +0000 @@ -1,7049 +0,0 @@ -# These are placeholders for types that will not show up as entities -1,0,0,0,0,0,0,Platform -1,1,0,0,0,0,0,Land -1,2,0,0,0,0,0,Air -1,3,0,0,0,0,0,Surface -1,4,0,0,0,0,0,Subsurface -1,5,0,0,0,0,0,Space -2,0,0,0,0,0,0,Munition -2,1,0,0,0,0,0,Anti-Air -2,2,0,0,0,0,0,Anti-Armor -2,3,0,0,0,0,0,Anti-Guided Munition -2,4,0,0,0,0,0,Anti-Radar -2,5,0,0,0,0,0,Anti-Satellite -2,6,0,0,0,0,0,Anti-Ship -2,7,0,0,0,0,0,Anti-Submarine -2,8,0,0,0,0,0,Anti-Personnel -2,9,0,0,0,0,0,Battlefield Support -2,10,0,0,0,0,0,Strategic -2,11,0,0,0,0,0,Tactical -3,0,0,0,0,0,0,Life Form -4,0,0,0,0,0,0,Environmental -5,0,0,0,0,0,0,Cultural -6,0,0,0,0,0,0,Supply -7,0,0,0,0,0,0,Radio -# Countries -0,0,0,0,0,0,0,Other -0,0,1,0,0,0,0,Afghanistan -0,0,2,0,0,0,0,Albania -0,0,3,0,0,0,0,Algeria -0,0,4,0,0,0,0,American Samoa (United States) -0,0,5,0,0,0,0,Andorra -0,0,6,0,0,0,0,Angola -0,0,7,0,0,0,0,Anguilla -0,0,8,0,0,0,0,Antarctica (International) -0,0,9,0,0,0,0,Antigua and Barbuda -0,0,10,0,0,0,0,Argentina -0,0,244,0,0,0,0,Armenia -0,0,11,0,0,0,0,Aruba -0,0,12,0,0,0,0,Ashmore and Cartier Islands (Australia) -0,0,13,0,0,0,0,Australia -0,0,14,0,0,0,0,Austria -0,0,245,0,0,0,0,Azerbaijan -0,0,15,0,0,0,0,Bahamas -0,0,16,0,0,0,0,Bahrain -0,0,17,0,0,0,0,Baker Island (United States) -0,0,18,0,0,0,0,Bangladesh -0,0,19,0,0,0,0,Barbados -0,0,20,0,0,0,0,Bassas da India (France) -0,0,246,0,0,0,0,Belarus -0,0,21,0,0,0,0,Belgium -0,0,22,0,0,0,0,Belize -0,0,23,0,0,0,0,Benin (aka Dahomey) -0,0,24,0,0,0,0,Bermuda (United Kingdom) -0,0,25,0,0,0,0,Bhutan -0,0,26,0,0,0,0,Bolivia -0,0,247,0,0,0,0,Bosnia and Hercegovina -0,0,27,0,0,0,0,Botswana -0,0,28,0,0,0,0,Bouvet Island (Norway) -0,0,29,0,0,0,0,Brazil -0,0,30,0,0,0,0,British Indian Ocean Territory (United Kingdom) -0,0,31,0,0,0,0,British Virgin Islands (United Kingdom) -0,0,32,0,0,0,0,Brunei -0,0,33,0,0,0,0,Bulgaria -0,0,34,0,0,0,0,Burkina (aka Burkina Faso or Upper Volta -0,0,35,0,0,0,0,Burma (Myanmar) -0,0,36,0,0,0,0,Burundi -0,0,37,0,0,0,0,Cambodia (aka Kampuchea) -0,0,38,0,0,0,0,Cameroon -0,0,39,0,0,0,0,Canada -0,0,40,0,0,0,0,Cape Verde, Republic of -0,0,41,0,0,0,0,Cayman Islands (United Kingdom) -0,0,42,0,0,0,0,Central African Republic -0,0,43,0,0,0,0,Chad -0,0,44,0,0,0,0,Chile -0,0,45,0,0,0,0,China, People's Republic of -0,0,46,0,0,0,0,Christmas Island (Australia) -0,0,248,0,0,0,0,Clipperton Island (France) -0,0,47,0,0,0,0,Cocos (Keeling) Islands (Australia) -0,0,48,0,0,0,0,Colombia -0,0,222,0,0,0,0,Commonwealth of Independent States -0,0,49,0,0,0,0,Comoros -0,0,50,0,0,0,0,Congo, Republic of -0,0,51,0,0,0,0,Cook Islands (New Zealand) -0,0,52,0,0,0,0,Coral Sea Islands (Australia) -0,0,53,0,0,0,0,Costa Rica -0,0,107,0,0,0,0,(Cote D'Ivoire (aka Ivory Coast) -0,0,249,0,0,0,0,Croatia -0,0,54,0,0,0,0,Cuba -0,0,55,0,0,0,0,Cyprus -0,0,56,0,0,0,0,Czechoslovakia (separating into Czech Republic and Slovak Republic) -0,0,23,0,0,0,0,Dahomey (aka Benin) -0,0,57,0,0,0,0,Denmark -0,0,58,0,0,0,0,Djibouti -0,0,59,0,0,0,0,Dominica -0,0,60,0,0,0,0,Dominican Republic -0,0,61,0,0,0,0,Ecuador -0,0,62,0,0,0,0,Egypt -0,0,63,0,0,0,0,El Salvador -0,0,64,0,0,0,0,Equatorial Guinea -0,0,250,0,0,0,0,Estonia -0,0,65,0,0,0,0,Ethiopia -0,0,66,0,0,0,0,Europa Island (France) -0,0,67,0,0,0,0,Falkland Islands (aka Islas Malvinas) (United Kingdom) -0,0,68,0,0,0,0,Faroe Islands (Denmark) -0,0,69,0,0,0,0,Fiji -0,0,70,0,0,0,0,Finland -0,0,71,0,0,0,0,France -0,0,72,0,0,0,0,French Guiana (France) -0,0,73,0,0,0,0,French Polynesia (France) -0,0,74,0,0,0,0,French Southern and Antarctic Islands (France) -0,0,75,0,0,0,0,Gabon -0,0,76,0,0,0,0,Gambia, The -0,0,77,0,0,0,0,Gaza Strip (Israel) -0,0,251,0,0,0,0,Georgia -0,0,78,0,0,0,0,Germany -0,0,79,0,0,0,0,Ghana -0,0,80,0,0,0,0,Gibraltar (United Kingdom) -0,0,81,0,0,0,0,Glorioso Islands (France) -0,0,82,0,0,0,0,Greece -0,0,83,0,0,0,0,Greenland (Denmark) -0,0,84,0,0,0,0,Grenada -0,0,85,0,0,0,0,Guadaloupe (France) -0,0,86,0,0,0,0,Guam (United States) -0,0,87,0,0,0,0,Guatemala -0,0,88,0,0,0,0,Guernsey (United Kingdom) -0,0,89,0,0,0,0,Guinea -0,0,90,0,0,0,0,Guinea- Bissau -0,0,91,0,0,0,0,Guyana -0,0,92,0,0,0,0,Haiti -0,0,93,0,0,0,0,Heard Island and McDonald Islands (Australia) -0,0,94,0,0,0,0,Honduras -0,0,95,0,0,0,0,Hong Kong (United Kingdom) -0,0,96,0,0,0,0,Howland Island (United States) -0,0,97,0,0,0,0,Hungary -0,0,98,0,0,0,0,Iceland -0,0,99,0,0,0,0,India -0,0,100,0,0,0,0,Indonesia -0,0,101,0,0,0,0,Iran -0,0,102,0,0,0,0,Iraq -0,0,104,0,0,0,0,Ireland -0,0,105,0,0,0,0,Israel -0,0,106,0,0,0,0,Italy -0,0,107,0,0,0,0,Ivory Coast (aka Cote D'Ivoire) -0,0,108,0,0,0,0,Jamaica -0,0,109,0,0,0,0,Jan Mayen (Norway) -0,0,110,0,0,0,0,Japan -0,0,111,0,0,0,0,Jarvis Island (United States) -0,0,112,0,0,0,0,Jersey (United Kingdom) -0,0,113,0,0,0,0,Johnston Atoll (United States) -0,0,114,0,0,0,0,Jordan -0,0,115,0,0,0,0,Juan de Nova Island -0,0,252,0,0,0,0,Kazakhstan -0,0,116,0,0,0,0,Kenya -0,0,117,0,0,0,0,Kingman Reef (United States) -0,0,118,0,0,0,0,Kiribati -0,0,119,0,0,0,0,Korea, Democratic People's Republic of (North) -0,0,120,0,0,0,0,Korea, Republic of (South) -0,0,121,0,0,0,0,Kuwait -0,0,253,0,0,0,0,Kyrgyzstan -0,0,122,0,0,0,0,Laos -0,0,254,0,0,0,0,Latvia -0,0,123,0,0,0,0,Lebanon -0,0,124,0,0,0,0,Lesotho -0,0,125,0,0,0,0,Liberia -0,0,126,0,0,0,0,Libya -0,0,127,0,0,0,0,Liechtenstein -0,0,255,0,0,0,0,Lithuania -0,0,128,0,0,0,0,Luxembourg -0,0,130,0,0,0,0,Macau (Portugal) -0,0,256,0,0,0,0,Macedonia -0,0,129,0,0,0,0,Madagascar -0,0,131,0,0,0,0,Malawi -0,0,132,0,0,0,0,Malaysia -0,0,133,0,0,0,0,Maldives -0,0,134,0,0,0,0,Mali -0,0,135,0,0,0,0,Malta -0,0,136,0,0,0,0,Man, Isle of (United Kingdom) -0,0,137,0,0,0,0,Marshall Islands -0,0,138,0,0,0,0,Martinique (France) -0,0,139,0,0,0,0,Mauritania -0,0,140,0,0,0,0,Mauritius -0,0,141,0,0,0,0,Mayotte (France) -0,0,142,0,0,0,0,Mexico -0,0,143,0,0,0,0,Micronesia, Federative States of -0,0,257,0,0,0,0,Midway Islands (United States) -0,0,258,0,0,0,0,Moldova -0,0,144,0,0,0,0,Monaco -0,0,145,0,0,0,0,Mongolia -0,0,259,0,0,0,0,Montenegro -0,0,146,0,0,0,0,Montserrat (United Kingdom) -0,0,147,0,0,0,0,Morocco -0,0,148,0,0,0,0,Mozambique -0,0,35,0,0,0,0,Myanmar (aka Burma) -0,0,149,0,0,0,0,Namibia (South West Africa) -0,0,150,0,0,0,0,Nauru -0,0,151,0,0,0,0,Navassa Island (United States) -0,0,152,0,0,0,0,Nepal -0,0,153,0,0,0,0,Netherlands -0,0,154,0,0,0,0,Netherlands Antilles (Curacao, Bonaire, Saba, Saint Maarten Saint Eustatius) -0,0,155,0,0,0,0,New Caledonia (France) -0,0,156,0,0,0,0,New Zealand -0,0,157,0,0,0,0,Nicaragua -0,0,158,0,0,0,0,Niger -0,0,159,0,0,0,0,Nigeria -0,0,160,0,0,0,0,Niue (New Zealand) -0,0,161,0,0,0,0,Norfolk Island (Australia) -0,0,162,0,0,0,0,Northern Mariana Islands (United States) -0,0,163,0,0,0,0,Norway -0,0,164,0,0,0,0,Oman -0,0,216,0,0,0,0,Pacific Islands, Trust Territory of the (Palau) -0,0,165,0,0,0,0,Pakistan -0,0,166,0,0,0,0,Palmyra Atoll (United States) -0,0,168,0,0,0,0,Panama -0,0,169,0,0,0,0,Papua New Guinea -0,0,170,0,0,0,0,Paracel Islands (International - Occupied by China, also claimed by Taiwan and Vietnam) -0,0,171,0,0,0,0,Paraguay -0,0,172,0,0,0,0,Peru -0,0,173,0,0,0,0,Philippines -0,0,174,0,0,0,0,Pitcairn Islands (United Kingdom) -0,0,175,0,0,0,0,Poland -0,0,176,0,0,0,0,Portugal -0,0,177,0,0,0,0,Puerto Rico (United States) -0,0,178,0,0,0,0,Qatar -0,0,179,0,0,0,0,Reunion (France) -0,0,180,0,0,0,0,Romania -0,0,260,0,0,0,0,Russia -0,0,181,0,0,0,0,Rwanda -0,0,183,0,0,0,0,St. Helena (United Kingdom) -0,0,184,0,0,0,0,St. Lucia -0,0,186,0,0,0,0,St. Vincent and the Grenadines -0,0,182,0,0,0,0,St. Kitts and Nevis -0,0,185,0,0,0,0,St. Pierre and Miquelon (France) -0,0,187,0,0,0,0,San Marino -0,0,188,0,0,0,0,Sao Tome and Principe -0,0,189,0,0,0,0,Saudi Arabia -0,0,190,0,0,0,0,Senegal -0,0,261,0,0,0,0,Serbia and Montenegro (Montenegro to separate) -0,0,191,0,0,0,0,Seychelles -0,0,192,0,0,0,0,Sierra Leone -0,0,193,0,0,0,0,Singapore -0,0,262,0,0,0,0,Slovenia -0,0,194,0,0,0,0,Solomon Islands -0,0,195,0,0,0,0,Somalia -0,0,197,0,0,0,0,South Africa -0,0,196,0,0,0,0,South Georgia and the South Sandwich Islands (United Kingdom) -0,0,198,0,0,0,0,Spain -0,0,199,0,0,0,0,Spratly Islands (International - parts occupied and claimed by China,Malaysia, Philippines, Taiwan, Vietnam) -0,0,200,0,0,0,0,Sri Lanka -0,0,201,0,0,0,0,Sudan -0,0,202,0,0,0,0,Suriname -0,0,203,0,0,0,0,Svalbard (Norway) -0,0,204,0,0,0,0,Swaziland -0,0,205,0,0,0,0,Sweden -0,0,206,0,0,0,0,Switzerland -0,0,207,0,0,0,0,Syria -0,0,208,0,0,0,0,Taiwan -0,0,263,0,0,0,0,Tajikistan -0,0,209,0,0,0,0,Tanzania -0,0,210,0,0,0,0,Thailand -0,0,211,0,0,0,0,Togo -0,0,212,0,0,0,0,Tokelau (New Zealand) -0,0,213,0,0,0,0,Tonga -0,0,214,0,0,0,0,Trinidad and Tobago -0,0,215,0,0,0,0,Tromelin Island (France) -0,0,217,0,0,0,0,Tunisia -0,0,218,0,0,0,0,Turkey -0,0,264,0,0,0,0,Turkmenistan -0,0,219,0,0,0,0,Turks and Caicos Islands (United Kingdom) -0,0,220,0,0,0,0,Tuvalu -0,0,221,0,0,0,0,Uganda -0,0,265,0,0,0,0,Ukraine -0,0,223,0,0,0,0,United Arab Emirates -0,0,224,0,0,0,0,United Kingdom -0,0,225,0,0,0,0,United States -0,0,34,0,0,0,0,Upper Volta (aka Burkina or Burkina Faso) -0,0,226,0,0,0,0,Uruguay -0,0,266,0,0,0,0,Uzbekistan -0,0,227,0,0,0,0,Vanuatu -0,0,228,0,0,0,0,Vatican City (Holy See) -0,0,229,0,0,0,0,Venezuela -0,0,230,0,0,0,0,Vietnam -0,0,231,0,0,0,0,Virgin Islands (United States) -0,0,232,0,0,0,0,Wake Island (United States) -0,0,233,0,0,0,0,Wallis and Futuna (France) -0,0,235,0,0,0,0,West Bank (Israel) -0,0,234,0,0,0,0,Western Sahara -0,0,236,0,0,0,0,Western Samoa -0,0,237,0,0,0,0,Yemen -0,0,241,0,0,0,0,Zaire -0,0,242,0,0,0,0,Zambia -0,0,243,0,0,0,0,Zimbabwe -# Now the real entities -1,1,225,0,0,0,0,Other -1,1,225,0,1,0,0,Miscellaneous guns -1,1,225,0,1,1,0,M901 40-mm machine gun -1,1,225,0,1,2,0,20-mm Vulcan air defense system -1,1,225,0,1,3,0,Liquid propellant guns -1,1,225,0,2,0,0,Grenade launchers -1,1,225,0,2,1,0,Mk 19 40-mm -1,1,225,0,2,2,0,Brunswick Multisalvo Smoke Grenade Launcher -1,1,225,0,2,3,0,Tracor Aerospace Advanced Smoke Launcher System -1,1,225,0,3,0,0,Other missile systems -1,1,225,0,3,1,0,McDonnell-Douglas Harpoon Coastal Defense System -1,1,225,0,4,0,0,Bridges -1,1,225,0,4,1,0,Trailer Launched Bridge (TLB) -1,1,225,0,4,2,0,Mobile assault bridge -1,1,225,1,0,0,0,Tank -1,1,225,1,1,0,0,M1 Abrams -1,1,225,1,1,1,0,M1 Abrams -1,1,225,1,1,2,0,M1A1 Abrams -1,1,225,1,1,3,0,M1A2 -1,1,225,1,1,4,0,M1A1 w/ mine rollers -1,1,225,1,1,5,0,M1A1 w/ mine plows -1,1,225,1,1,6,0,M1A1 w/ DU armor -1,1,225,1,1,7,0,M1A2 w/ Combat Vehicle Command and Control (CVCC) -1,1,225,1,2,0,0,M60 Main Battle Tank (MBT) -1,1,225,1,2,1,0,M60A3 -1,1,225,1,2,2,0,M60A1 -1,1,225,1,2,4,0,M60A1 with ERA -1,1,225,1,3,0,0,M551 Sheridan light tank/reconnaissance vehicle -1,1,225,1,3,1,0,M551A1 -1,1,225,1,4,0,0,M48 medium tank -1,1,225,1,4,1,0,M48C -1,1,225,1,4,2,0,M48A1 -1,1,225,1,4,3,0,M48A2 -1,1,225,1,4,4,0,M48A2C -1,1,225,1,4,5,0,M48A3 -1,1,225,1,4,6,0,M48A4 -1,1,225,1,4,7,0,M48A5 -1,1,225,1,4,8,0,M48H -1,1,225,1,4,9,0,M48 AVLB -1,1,225,1,4,10,0,M48 ARV -1,1,225,1,4,11,0,M48 mine clearing vehicle -1,1,225,1,4,12,0,M48A2GA2 -1,1,225,1,4,13,0,M48A5E -1,1,225,1,4,14,0,M48A2C -1,1,225,1,5,0,0,M47 medium tank -1,1,225,1,5,1,0,M47 -1,1,225,1,5,2,0,M47M -1,1,225,1,5,3,0,GLS M47 ARV -1,1,225,1,6,0,0,M41 light tank -1,1,225,1,6,1,0,M41C -1,1,225,1,6,2,0,M41E -1,1,225,1,6,3,0,QM41 -1,1,225,1,6,4,0,M41B -1,1,225,1,6,5,0,M41C -1,1,225,1,6,6,0,M41 German Tank Improvement (GTI) -1,1,225,1,7,0,0,Cadillac Gage Commando Stingray light tank -1,1,225,1,8,0,0,FMC Close Combat Vehicle Light VFM 5 tank -1,1,225,1,9,0,0,AAI Rapid Deployment Force Light Tank (RDF/LT) Combined Arms Team/Lightweight Combat Vehicle (CAT/LCV) -1,1,225,1,9,1,0,Prototype -1,1,225,1,10,0,0,Teledyne Continental Armored Gun System -1,1,225,2,0,0,0,Armored fighting vehicle -1,1,225,2,1,0,0,FMC M2/M3 Bradley -1,1,225,2,1,1,0,M2A2 Bradley Infantry Fighting Vehicle (IFV) -1,1,225,2,1,2,0,M3A2 Bradley Cavalry Fighting Vehicle (CFV) -1,1,225,2,1,3,0,FMC Bradley IFV -1,1,225,2,1,4,0,M2 Bradley IFV -1,1,225,2,1,5,0,M2A1 Bradley IFV -1,1,225,2,1,6,0,M3 Bradley CFV -1,1,225,2,1,7,0,M3A1 Bradley CFV -1,1,225,2,3,0,0,FMC M113 Armored Personnel Carrier (APC) -1,1,225,2,3,1,0,M113A2 -1,1,225,2,3,2,0,M113A3 -1,1,225,2,3,3,0,M113A3 w/ M105 trailer -1,1,225,2,3,6,0,M113A1 Improved TOW Vehicle (ITV) -1,1,225,2,3,7,0,M113A1 TOW -1,1,225,2,3,8,0,M113A2 ITV -1,1,225,2,3,9,0,M113A2 TOW -1,1,225,2,3,10,0,M730 Chaparral Surface-to-Air Missile (SAM) launcher -1,1,225,2,3,11,0,M113 -1,1,225,2,3,12,0,M113A1 -1,1,225,2,3,13,0,M113A1R -1,1,225,2,3,14,0,M113A2DR -1,1,225,2,3,15,0,M113A2H -1,1,225,2,3,16,0,M113A2IT -1,1,225,2,3,17,0,M113A2MK -1,1,225,2,3,18,0,M113A2R -1,1,225,2,3,19,0,M132/M132A1 Flamethrower -1,1,225,2,3,20,0,M667 -1,1,225,2,3,21,0,M730 -1,1,225,2,3,22,0,M730A1 -1,1,225,2,3,23,0,M741 -1,1,225,2,3,24,0,M741A1 -1,1,225,2,3,25,0,M741A2 -1,1,225,2,3,26,0,RTL -1,1,225,2,3,27,0,XM474 -1,1,225,2,3,28,0,XM474E2 -1,1,225,2,3,29,0,XM667E1 -1,1,225,2,3,30,0,XM727 -1,1,225,2,3,31,0,XM730 -1,1,225,2,3,32,0,XM741 -1,1,225,2,3,33,0,XM806E1 -1,1,225,2,3,34,0,XM806E2 -1,1,225,2,5,0,0,Light Armored Vehicle (LAV) TOW -1,1,225,2,6,0,0,FMC Armored IFV -1,1,225,2,6,1,0,YPR 765 PRI -1,1,225,2,6,2,0,YPR 765 PRCO-B command vehicle -1,1,225,2,6,3,0,YPR 765 PRCO-C1 to C5 -1,1,225,2,6,4,0,YPR 765 PRRDR radar vehicle -1,1,225,2,6,5,0,YPR 765 PRRDR-C radar/command vehicle -1,1,225,2,6,6,0,YPR 765 PRGWT ambulance -1,1,225,2,6,7,0,YPR 765 PRI/I -1,1,225,2,6,8,0,YPR 765 PRMR mortar tractor -1,1,225,2,6,9,0,YPR 765 PRVR-A cargo vehicle -1,1,225,2,6,10,0,YPR 765 PRVR-B cargo vehicle -1,1,225,2,6,11,0,YPR 765 PRAT -1,1,225,2,7,0,0,FMC Lynx (or M113) Command and Reconnaissance Vehicle -1,1,225,2,8,0,0,M981 FIST-V -1,1,225,2,9,0,0,M106 mortar carrier -1,1,225,2,9,1,0,M106 107-mm -1,1,225,2,9,2,0,M106A1 107-mm -1,1,225,2,9,3,0,M106A2 107-mm -1,1,225,2,9,4,0,M1064 120-mm -1,1,225,2,10,0,0,Electronics & Space Corp M901 ITV -1,1,225,2,10,1,0,M901 -1,1,225,2,10,2,0,M901A1 -1,1,225,2,11,0,0,M125 81-mm mortar carrier -1,1,225,2,11,1,0,M125A1 -1,1,225,2,11,2,0,M125A2 -1,1,225,2,12,0,0,Cadillac Gage V-600 Armored Car -1,1,225,2,13,0,0,Cadillac Gage LAV Assault Gun LAV-105 -1,1,225,2,14,0,0,M59 APC -1,1,225,2,15,0,0,LAV-105 -1,1,225,2,16,0,0,Chrysler MAC-1 armored car -1,1,225,2,17,0,0,Cadillac Gage Commando Scout -1,1,225,2,18,0,0,Cadillac Gage Commando V-300 -1,1,225,2,18,1,0,V-300 w/ TOW -1,1,225,2,18,2,0,V-300 w/ 81-mm mortar -1,1,225,2,18,3,0,V-300 ambulance -1,1,225,2,19,0,0,Cadillac Gage Commando V-150 -1,1,225,2,19,1,0,Commando w/ MG turret -1,1,225,2,19,2,0,Commando w/ 1-m MG turret -1,1,225,2,19,3,0,Commando w/ 1-m 20-mm turret -1,1,225,2,19,4,0,Commando w/ 20-mm turret -1,1,225,2,19,5,0,Commando w/ 25-mm turret -1,1,225,2,19,6,0,Commando w/ 40-mm/12.7-mm turret -1,1,225,2,19,7,0,Commando V-150 S -1,1,225,2,19,8,0,Commando air defense vehicle -1,1,225,2,19,9,0,Commando with 76-mm turret-mounted gun -1,1,225,2,19,10,0,Commando with 90-mm turret-mounted gun -1,1,225,2,19,11,0,Commando with 81-mm mortar -1,1,225,2,19,12,0,Commando with TOW -1,1,225,2,19,13,0,Commando command vehicle -1,1,225,2,19,14,0,Base security vehicle -1,1,225,2,19,15,0,Malaysian upgraded V-150 Commando -1,1,225,2,20,0,0,AV Technology Corporation Dragoon -1,1,225,2,20,1,0,APC -1,1,225,2,20,2,0,ASV-XC extended cab -1,1,225,2,20,3,0,Dragoon Armored Command Vehicle (ACV) -1,1,225,2,20,4,0,Dragoon Armored Mortar -1,1,225,2,20,5,0,Dragoon TOW Carrier -1,1,225,2,21,0,0,Half-track APCs -1,1,225,2,22,0,0,Cadillac Gage Commando Ranger APC -1,1,225,2,23,0,0,Vehicle Sys Development Corp Lancer Armored Patrol Vehicle (APV) -1,1,225,2,24,0,0,AAI Propulsion System Demonstrator Amphibious Assault Vehicle (AAV) -1,1,225,2,25,0,0,Advanced AAV -1,1,225,2,26,0,0,FMC AAV7A1 (LVTP7A1) -1,1,225,2,26,1,0,AAVC7A1 command vehicle -1,1,225,2,26,2,0,AAVR7A1 recovery vehicle -1,1,225,2,26,3,0,AAV7A1 with mine plow -1,1,225,2,26,4,0,AAV7A1 with VEMASID -1,1,225,2,26,5,0,AAV7A1 with mine-clearance-system kit -1,1,225,2,26,6,0,AAV7A1 with upgunned weapons station -1,1,225,2,27,0,0,LVTP5A1 Armored AAV -1,1,225,2,27,1,0,LVTC5 (Command, Model 5) -1,1,225,2,27,2,0,LVTE1 (Engineer, Model 1) -1,1,225,2,27,3,0,LVTH6 (Howitzer, Model 6) -1,1,225,2,27,4,0,LVTR1 (Recovery, Model 1) -1,1,225,2,28,0,0,Composite Armored Vehicle (CAV) -1,1,225,2,29,0,0,XM987 Fighting Vehicle Systems Carrier -1,1,225,2,30,0,0,M93 Armored Reconnaisance Vehicle -1,1,225,3,0,0,0,Armored utility vehicle -1,1,225,3,1,0,0,M88 medium recovery vehicle -1,1,225,3,1,1,0,M88A1 -1,1,225,3,1,2,0,M88A2 -1,1,225,3,1,3,0,M88A1E1 -1,1,225,3,2,0,0,M578 light armored recovery vehicle -1,1,225,3,4,0,0,AVLB -1,1,225,3,4,1,0,M1 AVLB bridge layer -1,1,225,3,4,2,0,M60AVLB -1,1,225,3,4,3,0,M48 AVLB -1,1,225,3,5,0,0,M728 combat engineer vehicle -1,1,225,3,6,0,0,M9 armored combat earthmover -1,1,225,3,7,0,0,Cadillac Gage -1,1,225,3,8,0,0,AV Technology Corporation Dragoon -1,1,225,3,8,1,0,Armored Logistics Support Vehicle (ALSV) -1,1,225,3,9,0,0,M548 unarmed cargo carrier -1,1,225,3,9,1,0,M548 tracked Rapier -1,1,225,3,9,2,0,M548G -1,1,225,3,9,3,0,M548A1 -1,1,225,3,10,0,0,M113/M113A1/M113A2 bulldozer -1,1,225,3,11,0,0,M577/M577A1/M577A2 command post -1,1,225,3,12,0,0,Stretched M577A2E2 command post -1,1,225,3,13,0,0,XM1068 command post vehicle -1,1,225,3,14,0,0,FMC (M113) APC ambulance -1,1,225,3,15,0,0,M113A2 recovery vehicle -1,1,225,3,16,0,0,Abrams Recovery Vehicle -1,1,225,3,17,0,0,Assault amphibian vehicle, recovery, model 7A1 -1,1,225,3,18,0,0,Fitter's vehicle -1,1,225,3,19,0,0,Armored Maintenance Vehicle (AMV) -1,1,225,3,20,0,0,M1059 smoke-generating system -1,1,225,4,0,0,0,Self-propelled artillery -1,1,225,4,1,0,0,M270 Multiple Launch Rocket System (MLRS) -1,1,225,4,2,0,0,M110 203-mm (8-inch) SP Howitzer -1,1,225,4,2,1,0,M110 -1,1,225,4,2,2,0,M110A2 -1,1,225,4,3,0,0,M109 155-mm SP Howitzer -1,1,225,4,3,1,0,M109 -1,1,225,4,3,2,0,M109A1 -1,1,225,4,3,3,0,M109A2 -1,1,225,4,3,4,0,M109A3 -1,1,225,4,3,5,0,M109A4 -1,1,225,4,3,6,0,M109A5 -1,1,225,4,3,7,0,M109A6 -1,1,225,4,3,8,0,M109L -1,1,225,4,4,0,0,Ground Launched Cruise Missile (GLCM) launcher -1,1,225,4,5,0,0,M163 Vulcan Anti-aircraft gun -1,1,225,4,6,0,0,M107-175 mm gun -1,1,225,4,7,0,0,M44 155-mm Howitzer -1,1,225,4,8,0,0,M108 105-mm Howitzer -1,1,225,4,9,0,0,Advanced Field Artillery System (AFAS) -1,1,225,4,10,0,0,Liquid-propellant Artillery System -1,1,225,4,11,0,0,M42 twin 40-mm SP anti-aircraft gun -1,1,225,4,12,0,0,M163 20-mm Vulcan SP anti-aircraft gun -1,1,225,4,13,0,0,General Electric Vulcan-Commando 20-mm SP Air Defense (AD) system -1,1,225,4,14,0,0,Boeing Avenger pedestal-mounted Stinger SP AD System -1,1,225,4,15,0,0,Raytheon/Loral Aeronutronic Saber AD missile system -1,1,225,4,16,0,0,LTV Crossbow pedestal-mounted weapon system -1,1,225,4,17,0,0,Fiber Optic Guided Missile (FOG-M) -1,1,225,4,18,0,0,Loral Aeronutronic M48 Chaparral -1,1,225,4,18,1,0,M48 -1,1,225,4,18,2,0,M48A1 -1,1,225,4,18,3,0,M48A2 -1,1,225,4,18,4,0,M48A3 -1,1,225,4,19,0,0,Block VII Low-Altitude SAM System -1,1,225,4,20,0,0,Loral Aeronutronic SAM System -1,1,225,4,21,0,0,Electronic & Space Corp Ground-Launched Hellfire: Heavy (GLH:H) -1,1,225,4,22,0,0,Line-of-Sight Anti-Tank (LOSAT) -1,1,225,5,0,0,0,Towed artillery -1,1,225,5,1,0,0,M114 155-mm Howitzer -1,1,225,5,2,0,0,M198 155-mm towed Howitzer -1,1,225,5,3,0,0,M101 105-mm Howitzer -1,1,225,5,3,1,0,M101 -1,1,225,5,3,2,0,M101A1 -1,1,225,5,4,0,0,M119 105-mm light Howitzer -1,1,225,5,5,0,0,M115 8-inch Howitzer -1,1,225,5,6,0,0,155-mm Lightweight Howitzer (LW155) -1,1,225,5,7,0,0,M59 155-mm gun -1,1,225,5,8,0,0,M102 105-mm Howitzer -1,1,225,5,9,0,0,M1 40-mm Automatic Anti-aircraft gun -1,1,225,5,10,0,0,M167 20-mm Vulcan Anti-aircraft gun -1,1,225,5,11,0,0,M55 12.7-mm (Quad) Anti-aircraft MG -1,1,225,5,12,0,0,MIM-23 Raytheon Hawk Low-to-Medium Altitude SAM System -1,1,225,5,13,0,0,MIM-104 Raytheon Patriot High-to-Medium Altitude Air Defense (HIMAD) System -1,1,225,5,14,0,0,MIM-14B Nike-Hercules SAM System -1,1,225,5,15,0,0,M993 70-mm Rapid Deployment Multiple Launch Rocket System (MLRS) -1,1,225,6,0,0,0,Small wheeled utility vehicle -1,1,225,6,1,0,0,LTV HMMWV M998-series multipurpose wheeled vehicles -1,1,225,6,1,1,0,M998 cargo/troop carrier without winch -1,1,225,6,1,2,0,M1038 cargo/troop carrier with winch -1,1,225,6,1,3,0,M966 TOW missile carrier, basic armor, without winch -1,1,225,6,1,4,0,M1036 TOW missile carrier, basic armor, with winch -1,1,225,6,1,5,0,M1045 TOW missile carrier, supplemental armor, without winch -1,1,225,6,1,6,0,M1046 TOW missile carrier, supplemental armor, with winch -1,1,225,6,1,7,0,M1025 armament carrier, basic armor, without winch -1,1,225,6,1,8,0,M1026 armament carrier, basic armor, with winch -1,1,225,6,1,9,0,M1043 armament carrier, supplemental armor, without winch -1,1,225,6,1,10,0,M1044 armament carrier, supplemental armor, with winch -1,1,225,6,1,11,0,M996 mini-ambulance, 2-litter, basic armor -1,1,225,6,1,12,0,M997 maxi-ambulance, 4-litter, basic armor -1,1,225,6,1,13,0,M1035 soft-top ambulance, 2-litter -1,1,225,6,1,14,0,M1037 S-250 shelter carrier, without winch -1,1,225,6,1,15,0,M1042 S-250 shelter carrier, with winch -1,1,225,6,1,16,0,M1069 tractor for M119 105-mm light gun -1,1,225,6,2,0,0,Warrior NMC-40 Long-range Fast Attack Vehicle (FAV) -1,1,225,6,3,0,0,Chenowith FAV/Light Strike Vehicle (LSV) -1,1,225,6,4,0,0,M58/M59 Mine-clearing charge (MICLIC) (towed) -1,1,225,6,4,1,0,M58A3 -1,1,225,6,4,2,0,M58A4 -1,1,225,6,4,3,0,M59 -1,1,225,6,5,0,0,Teledyne 4x4 725-kg light forces vehicle -1,1,225,6,6,0,0,TPC -1,1,225,6,7,0,0,M151 4x4 362-kg light vehicle and variants -1,1,225,6,8,0,0,Jeep 4x4 light vehicle -1,1,225,6,9,0,0,Jeep XJ 4x4 light truck/wagon series -1,1,225,6,10,0,0,M38-series 4x4 363-kg light vehicle (CJ-3A) -1,1,225,6,11,0,0,Cargo truck and variants: -1,1,225,6,11,1,0,M37 -1,1,225,6,11,2,0,M42 -1,1,225,6,11,3,0,M43 -1,1,225,6,11,4,0,M201 -1,1,225,6,12,0,0,Stewart & Stevenson Services Inc SS-200 6x6 multi-purpose light vehicle -1,1,225,6,13,0,0,Commercial Utility Cargo Vehicle (CUCV) -1,1,225,6,14,0,0,M1008, truck, cargo, tactical 1-1/4 ton, 4x4 -1,1,225,6,15,0,0,M1009, truck, utility, tactical 3/4 ton, 4x4 -1,1,225,6,16,0,0,M1010, truck, ambulance, tactical 1-1/4 ton, 4x4 -1,1,225,6,17,0,0,M1031, truck, chassis, tactical 1-1/4 ton, 4x4 -1,1,225,6,18,0,0,M1028, truck, cargo, shelter carrier, tactical 1-1/4 -1,1,225,6,19,0,0,M715 4x4 1-1/4 ton truck, AM715-series 4x4 1-1/4 ton cargo trucks -1,1,225,6,20,0,0,Jeep AM 720 4x4 1135-kg light truck -1,1,225,6,21,0,0,M880 4x4 1133 kg -1,1,225,6,22,0,0,M890 4x2 1133 kg -1,1,225,7,0,0,0,Large wheeled utility vehicle -1,1,225,7,1,0,0,M35/M44A2 6x6 2-1/2 ton cargo truck series -1,1,225,7,1,1,0,M34: cargo truck with an unladen weight of 5332 kg, chassis designated M44 -1,1,225,7,1,2,0,M47: dump truck with an unladen weight of 6100 kg, chassis designated M57 -1,1,225,7,1,3,0,Truck, maintenance: earth-boring machine and pole setter V18A/MTQ, chassis M44 -1,1,225,7,1,4,0,Truck, maintenance: telephone construction and maintenance V17A/MTQ, chassis M44. -1,1,225,7,1,5,0,M35 truck: basic M45 chassis -1,1,225,7,1,6,0,M35A2 -1,1,225,7,1,7,0,M35A2C -1,1,225,7,1,8,0,M36 -1,1,225,7,1,9,0,M36A2 -1,1,225,7,1,10,0,M48: tractor truck -1,1,225,7,1,11,0,M49: fuel tanker -1,1,225,7,1,12,0,M49A2C -1,1,225,7,2,0,0,M816, truck, wrecker, 5-ton, 6x6 -1,1,225,7,3,0,0,M819, tractor, wrecker, 5-ton, 6x6 -1,1,225,7,4,0,0,M817 engineer dump truck -1,1,225,7,5,0,0,M939 6X6 5-ton cargo truck -1,1,225,7,7,0,0,M543, truck, wrecker: medium, 5-ton, 6x6 -1,1,225,7,8,0,0,M915 series of 5-ton trucks -1,1,225,7,8,1,0,Cargo -1,1,225,7,8,2,0,w/ FS pods -1,1,225,7,8,3,0,w/ shelter -1,1,225,7,8,4,0,M915, tractor, truck, 14-ton, 6x4 -1,1,225,7,8,5,0,M915A1, tractor, truck, 14-ton, 6x4 -1,1,225,7,9,0,0,LTV Hummer cab-over 4x4 2268-kg cargo truck -1,1,225,7,10,0,0,Freightliner All-Terrain Tow Vehicle (ATTV) -1,1,225,7,11,0,0,Stewart & Stevenson SS-300 8x8 2268-kg All-Terrain Vehicle -1,1,225,7,12,0,0,Stewart & Stevenson Family of Medium Tactical Vehicles (FMTV) -1,1,225,7,12,1,0,M1078 Truck, Cargo; LMTV w/ Equip -1,1,225,7,12,2,0,M1078 Truck, Cargo; LMTV w/ Equip, w/ Winch -1,1,225,7,12,3,0,M1079 Truck, Van; LMTV w/ Equip -1,1,225,7,12,4,0,M1079 Truck, Van; LMTV w/ Equip, w/ Winch -1,1,225,7,12,5,0,M1080 Truck, Chassis; LMTV w/ Equip -1,1,225,7,12,6,0,M1081 Truck, Cargo; LMTV, LAPES/AD, w/ Equip -1,1,225,7,12,7,0,M1082 Trailer; LMTV -1,1,225,7,12,8,0,M1083 Truck, Cargo; MTV w/ Equip -1,1,225,7,12,9,0,M1083 Truck, Cargo; MTV w/ Equip, w/ winch -1,1,225,7,13,0,0,TTC FMTV -1,1,225,7,13,1,0,LMTV -1,1,225,7,13,2,0,MTV -1,1,225,7,14,0,0,M54 6x6 5-ton cargo truck series -1,1,225,7,14,1,0,M41, cargo -1,1,225,7,14,2,0,M41, dump6 -1,1,225,7,14,3,0,M52 , tractor -1,1,225,7,14,4,0,M54, cargo, -1,1,225,7,14,5,0,M55, cargo -1,1,225,7,14,6,0,M62k, wrecker, medium -1,1,225,7,14,7,0,M64, cargo, van -1,1,225,7,14,8,0,M246, tractor, wrecker -1,1,225,7,14,9,0,M291, van, expansible -1,1,225,7,14,10,0,M328, stake, bridging -1,1,225,7,14,11,0,M543, wrecker, medium -1,1,225,7,14,12,0,M748, bolster -1,1,225,7,14,13,0,M139 chassis -1,1,225,7,15,0,0,M809 6x6 5-ton cargo truck series -1,1,225,7,15,1,0,M809 -1,1,225,7,15,2,0,M810 -1,1,225,7,15,3,0,M811/M812 -1,1,225,7,16,0,0,M813 cargo truck, 5-ton, 6x6 -1,1,225,7,17,0,0,Standard Trailing Arm Drive (TAD) vehicle series -1,1,225,7,17,1,0,Modular wheeled carrier -1,1,225,7,17,2,0,Forward Area Multi-purpose Vehicle (FAMV) -1,1,225,7,17,3,0,Medium Combat Truck (MCT) -1,1,225,7,18,0,0,Oshkosh MK48-series articulated 8x8 vehicle -1,1,225,7,18,1,0,MK48/14: logistics platform truck -1,1,225,7,18,2,0,MK48/15: recovery vehicle -1,1,225,7,18,3,0,MK48/16: truck tractor -1,1,225,7,18,4,0,MK48/17: cargo truck with Material Handling Crane (MHC) -1,1,225,7,18,5,0,MK48/18: load handling system vehicle. -1,1,225,7,19,0,0,Oshkosh Heavy Expanded Mobility Tactical Truck (HEMTT) 8x8 9979-kg -1,1,225,7,19,1,0,M977 cargo -1,1,225,7,19,2,0,M978 fuel-servicing -1,1,225,7,19,3,0,M983 tractor -1,1,225,7,19,4,0,M984A1 wrecker -1,1,225,7,19,5,0,M985 cargo -1,1,225,7,19,6,0,M977 w/ Mine Plow -1,1,225,7,19,7,0,M977 w/ Mine Roller -1,1,225,7,19,8,0,M985 w/ Mine Roller -1,1,225,7,19,9,0,M985 w/ Mine Plow -1,1,225,7,20,0,0,Mack RM6866SX 6x6 10000-kg truck -1,1,225,7,21,0,0,M1070 8x8 Heavy Equipment Transporter (HET) -1,1,225,7,22,0,0,M911 8x6 truck tractor -1,1,225,7,23,0,0,M746 8x8 22-1/2 ton tractor truck (HET) -1,1,225,7,24,0,0,Mack RD8226SX 52000-kg 6x6 tank transporter -1,1,225,7,25,0,0,Navistar International Corporation F5070 6x4 tank transporter -1,1,225,7,26,0,0,LARC-5 4x4 4545-kg amphibious cargo carrier -1,1,225,7,27,0,0,Variable Reach Rough Terrain Forklift Truck (VRRTFLT) -1,1,225,7,28,0,0,Rough Terrain Container Straddle Truck (RTCST) -1,1,225,7,29,0,0,Truck, tractor, yard type, 4x2 -1,1,225,7,29,1,0,M878 -1,1,225,7,29,2,0,M878A1 -1,1,225,7,30,0,0,Case MC2500 30-ton rough terrain crane -1,1,225,7,31,0,0,Crane, truck-mounted, hydraulic, 25-ton (CCE) (Grove TMS 300-5) -1,1,225,7,32,0,0,Rough terrain crane 4x4 5-ton Hanson H-446A -1,1,225,7,33,0,0,Wreckers, 2-1/2 ton 6x6 -1,1,225,7,33,1,0,M60 -1,1,225,7,33,2,0,M108 -1,1,225,7,34,0,0,M62, truck, wrecker, medium, 5-ton, 6x6 -1,1,225,7,35,0,0,M246, truck, tractor, wrecker, 5-ton, 6x6 -1,1,225,8,0,0,0,Small tracked utility vehicle -1,1,225,9,0,0,0,Large tracked utility vehicle -1,1,225,9,1,0,0,M548 tracked cargo carrier -1,1,225,9,1,1,0,M1015 -1,1,225,9,1,2,0,Stretched M548A1E1 -1,1,225,9,1,3,0,M667 -1,1,225,9,1,4,0,M730 -1,1,225,9,1,5,0,Recovery vehicles -1,1,225,9,1,6,0,Rapier SAM system -1,1,225,9,1,7,0,Radar vehicles -1,1,225,9,1,8,0,M45 -1,1,225,9,1,9,0,M548A1 -1,1,225,9,1,10,0,M548GA1 -1,1,225,9,1,11,0,M548/S -1,1,225,9,1,12,0,LAR 160 -1,1,225,9,3,0,0,M992 Field Artillery Ammunition Support Vehicle (FAASV) -1,1,225,9,3,1,0,M993 MLRS carrier -1,1,225,9,3,2,0,XM987 cargo carrier -1,1,225,9,3,3,0,Armored, Forward-Area, Rearm Vehicle (AFARV) -1,1,225,9,3,4,0,Armored Maintenance Vehicle -1,1,225,9,3,5,0,XM1070 Electronic Fighting Vehicle System (EFVS) -1,1,225,9,3,6,0,Command-post vehicle -1,1,225,9,4,0,0,M973 Small Unit Support Vehicle (SUSV) -1,1,225,9,5,0,0,LMC 1500 Over-snow vehicle -1,1,225,9,6,0,0,Caterpillar 988 50,000-lb (22,680-kg) rough terrain container handler -1,1,225,10,0,0,0,Mortar -1,1,225,10,1,0,0,M29 81-mm -1,1,225,10,2,0,0,M224 60-mm light company mortar -1,1,225,10,3,0,0,M1 81-mm -1,1,225,10,4,0,0,M2 60-mm -1,1,225,10,5,0,0,M19 60-mm -1,1,225,10,6,0,0,M29A1 81-mm -1,1,225,10,7,0,0,M30 107-mm rifled -1,1,225,10,8,0,0,M252 81-mm -1,2,225,1,0,0,0,Fighter/Air Defense -1,2,225,1,1,0,0,Lockheed F-117A -1,2,225,1,2,0,0,Grumman F-14 Tomcat -1,2,225,1,3,0,0,General Dynamics F-16 Fighting Falcon -1,2,225,1,3,1,0,F-16A -1,2,225,1,3,2,0,F-16B -1,2,225,1,3,3,0,F-16C -1,2,225,1,3,4,0,F-16D -1,2,225,1,3,5,0,F-16E -1,2,225,1,3,6,0,F-16N -1,2,225,1,3,7,0,F-16 (ADF) -1,2,225,1,3,8,0,F-16 RECCE -1,2,225,1,3,9,0,F/A-16 -1,2,225,1,4,0,0,McDonnell-Douglas F-4 Phantom II -1,2,225,1,4,1,0,F-4A -1,2,225,1,4,2,0,F-4B -1,2,225,1,4,3,0,F-4C -1,2,225,1,4,4,0,F-4D -1,2,225,1,4,5,0,F-4E -1,2,225,1,4,6,0,F-4F -1,2,225,1,4,7,0,F-4J -1,2,225,1,4,8,0,F-4K -1,2,225,1,4,9,0,F-4M -1,2,225,1,4,10,0,F-4N -1,2,225,1,4,11,0,F-4S -1,2,225,1,5,0,0,McDonnell-Douglas F-15 Eagle -1,2,225,1,5,1,0,F-15A -1,2,225,1,5,2,0,F-15B -1,2,225,1,5,3,0,F-15C -1,2,225,1,5,4,0,F-15D -1,2,225,1,5,5,0,F-15E -1,2,225,1,5,6,0,F-15F -1,2,225,1,5,7,0,F-15H -1,2,225,1,6,0,0,Lockheed F-22 Superstar -1,2,225,1,6,1,0,F-22A -1,2,225,1,6,2,0,F-22B -1,2,225,1,7,0,0,Lockheed F-104 Starfighter -1,2,225,1,8,0,0,General Dynamics F-111 -1,2,225,1,8,1,0,F-111A -1,2,225,1,8,2,0,F-111C -1,2,225,1,8,3,0,F-111D -1,2,225,1,8,4,0,F-111E -1,2,225,1,8,5,0,F-111F -1,2,225,1,8,6,0,F-111G -1,2,225,1,9,0,0,McDonnell-Douglas F/A-18 Hornet -1,2,225,1,9,1,0,F/A-18A -1,2,225,1,9,2,0,F/A-18B -1,2,225,1,9,3,0,F/A-18C -1,2,225,1,9,4,0,F/A-18D -1,2,225,1,9,5,0,AF-18A -1,2,225,1,9,6,0,ATF-18A -1,2,225,1,9,7,0,CF-188A/B -1,2,225,1,9,8,0,C.15 -1,2,225,1,9,9,0,CE.15 -1,2,225,1,9,10,0,F/A-18E/F -1,2,225,1,10,0,0,Northrop F-5 Freedom Fighter/Tiger II -1,2,225,1,10,1,0,F-5A -1,2,225,1,10,2,0,F-5B -1,2,225,1,10,3,0,F-5E Tiger II -1,2,225,1,10,4,0,F-5F -1,2,225,1,10,5,0,RF-5A -1,2,225,1,10,6,0,RF-5E Tigereye -1,2,225,1,10,7,0,RF-5F -1,2,225,2,0,0,0,Attack/Strike -1,2,225,2,1,0,0,McDonnell-Douglas A-4 Skyhawk -1,2,225,2,2,0,0,A-6 Intruder -1,2,225,2,2,1,0,A-6A -1,2,225,2,2,2,0,A-6B -1,2,225,2,2,3,0,A-6C -1,2,225,2,2,4,0,A-6E -1,2,225,2,3,0,0,Vought A-7 Corsair II -1,2,225,2,3,1,0,A-7D -1,2,225,2,4,0,0,Fairchild Republic A-10 Thunderbolt II -1,2,225,2,4,1,0,A-10A -1,2,225,2,5,0,0,Cessna 318E Dragonfly -1,2,225,2,5,1,0,A-37 -1,2,225,2,6,0,0,Grumman EA-6 Prowler -1,2,225,2,6,1,0,EA-6A -1,2,225,2,6,2,0,EA-6B -1,2,225,2,7,0,0,Grumman A-6 Intruder Tanker -1,2,225,2,7,1,0,KA-6D -1,2,225,2,7,2,0,KA-6H -1,2,225,2,8,0,0,McDonnell-Douglas AV-8B Harrier II -1,2,225,2,8,1,0,AV-8B -1,2,225,2,8,2,0,TAV-8B -1,2,225,2,8,3,0,Harrier GR. Mk 5 -1,2,225,2,8,4,0,Harrier GR. Mk 5A -1,2,225,2,8,5,0,Harrier GR. Mk 7 -1,2,225,2,8,6,0,Harrier T. Mk 10 -1,2,225,2,8,7,0,VA.2 Matador II -1,2,225,2,9,0,0, Rockwell (Lockheed) AC-130U Spectre -1,2,225,2,10,0,0,McDonnell-Douglas F-4 Phantom II -1,2,225,2,10,1,0,F-4G Wild Weasel -1,2,225,3,0,0,0,Bomber -1,2,225,3,1,0,0,Rockwell International B-1 -1,2,225,3,1,1,0,B-1B -1,2,225,3,2,0,0,Northrop B-2 -1,2,225,3,3,0,0,Boeing B-52 Stratofortress -1,2,225,3,3,1,0,B-52G -1,2,225,3,3,2,0,B-52H -1,2,225,4,0,0,0,Cargo/Tanker -1,2,225,4,1,0,0,Lockheed C-130 (Model 382) Hercules -1,2,225,4,1,1,0,C-130 -1,2,225,4,1,2,0,AC-130 -1,2,225,4,1,3,0,DC-130 -1,2,225,4,1,4,0,EC-130 -1,2,225,4,1,5,0,HC-130 -1,2,225,4,1,6,0,JC-130 -1,2,225,4,1,7,0,LC-130 -1,2,225,4,1,8,0,MC-130 -1,2,225,4,1,9,0,NC-130 -1,2,225,4,1,10,0,RC-130 -1,2,225,4,1,11,0,WC-130 -1,2,225,4,1,12,0,TC-130 -1,2,225,4,1,13,0,KC-130 -1,2,225,4,1,14,0,CC-130 -1,2,225,4,1,15,0,Hercules C. Mk 1 -1,2,225,4,1,16,0,Hercules C. Mk 2 -1,2,225,4,1,17,0,Hercules C. Mk 3P -1,2,225,4,1,19,0,T.10 -1,2,225,4,1,20,0,TK.10 -1,2,225,4,1,21,0,TL.10 -1,2,225,4,1,22,0,Tp 84 -1,2,225,4,1,23,0,C-130H -1,2,225,4,1,24,0,C-130H-30 -1,2,225,4,1,25,0,KC-130H -1,2,225,4,1,26,0,C-130H-MP -1,2,225,4,1,27,0,VC-130H -1,2,225,4,2,0,0,Lockheed C-5 Galaxy -1,2,225,4,2,1,0,C-5A -1,2,225,4,2,2,0,C-5B -1,2,225,4,3,0,0,Lockheed C-141 Starlifter -1,2,225,4,3,1,0,C-141A -1,2,225,4,3,2,0,C-141B -1,2,225,4,4,0,0,C-135 -1,2,225,4,5,0,0,Boeing KC-135 Stratotanker -1,2,225,4,5,1,0,KC-135A -1,2,225,4,5,2,0,KC-135E -1,2,225,4,5,3,0,KC-135Q -1,2,225,4,5,4,0,KC-135R -1,2,225,4,6,0,0,McDonnell-Douglas KC-10 Extender -1,2,225,4,6,1,0,KC-10A -1,2,225,4,7,0,0,Boeing 707 tanker/transport -1,2,225,4,7,1,0,KE-3A -1,2,225,4,7,2,0,T.17 -1,2,225,4,8,0,0,Boeing 707 -1,2,225,4,8,1,0,VC-137 -1,2,225,4,8,2,0,E-6A -1,2,225,4,8,3,0,E-8 -1,2,225,4,9,0,0,McDonnell-Douglas C-17A -1,2,225,4,10,0,0,Boeing 747 -1,2,225,4,10,1,0,C-25A -1,2,225,4,10,2,0,VC-25A "Air Force One" -1,2,225,4,11,0,0,Gulfstream Aerospace Gulfstream III -1,2,225,4,11,1,0,C-20 -1,2,225,4,12,0,0,Learjet 35A/36A -1,2,225,4,12,1,0,C-21A -1,2,225,4,13,0,0,Lockheed Model 1329-25 Jetstar II -1,2,225,4,13,1,0,C-140 -1,2,225,4,14,0,0,Douglas DC-3 -1,2,225,4,14,1,0,C-47 -1,2,225,4,14,2,0,R4D -1,2,225,4,14,3,0,Dakota -1,2,225,4,15,0,0,McDonnell-Douglas DC-9 -1,2,225,4,15,1,0,C-9A -1,2,225,4,15,2,0,VC-9C -1,2,225,4,15,3,0,C-9B -1,2,225,4,16,0,0,Beechcraft Super King Air 200/B200 -1,2,225,4,16,1,0,C-12 -1,2,225,4,17,0,0,Bell/Boeing V-22 Osprey -1,2,225,4,18,0,0,Rockwell T-39 Saberliner -1,2,225,5,0,0,0,Antisubmarine/patrol/observation -1,2,225,5,1,0,0,Lockheed Model 185/285 Orion -1,2,225,5,1,1,0,P-3 -1,2,225,5,1,2,0,P-3C -1,2,225,5,1,3,0,UP-3 -1,2,225,5,1,4,0,UP-3C -1,2,225,5,1,5,0,EP-3 -1,2,225,5,1,6,0,P-3J -1,2,225,5,1,7,0,P-3W -1,2,225,5,1,8,0,P-3 AEW&C -1,2,225,5,1,9,0,CF-140 Aurora -1,2,225,5,1,10,0,CP-140 Arcturus -1,2,225,5,2,0,0,Lockheed S-3 Viking -1,2,225,5,3,0,0,Rockwell International OV-10 Bronco -1,2,225,5,3,1,0,OV-10 -1,2,225,5,3,2,0,OV-10D Plus -1,2,225,5,4,0,0,Schweizer SA 2-37A -1,2,225,5,4,1,0,RG-8A -1,2,225,6,0,0,0,EW -1,2,225,6,7,0,0,Grumman (General Dynamics) EF-111 Raven -1,2,225,6,7,1,0,EF-111A -1,2,225,7,0,0,0,Reconnaissance -1,2,225,7,1,0,0,Lockheed SR-71 Blackbird -1,2,225,7,1,1,0,SR-71B -1,2,225,7,2,0,0,Lockheed TR-1 -1,2,225,7,2,1,0,TR-1A -1,2,225,7,2,2,0,TR-1B -1,2,225,7,3,0,0,Lockheed U-2 -1,2,225,7,3,1,0,U-2R -1,2,225,7,3,2,0,ER-2 -1,2,225,7,4,0,0,McDonell-Douglas F-4 Phantom II -1,2,225,7,4,1,0,RF-4B -1,2,225,7,4,2,0,YRF-4C -1,2,225,7,4,3,0,RF-4C -1,2,225,7,4,4,0,RF-4E -1,2,225,7,4,5,0,RF-4EJ -1,2,225,7,5,0,0,Sadler A-22 LASA -1,2,225,7,6,0,0,Boeing Canada DHC-7 Airborne Reconnaissance--Low (ARL) -1,2,225,7,7,0,0,Boeing RC-135 -1,2,225,7,7,1,0,RC-135S Cobra Ball -1,2,225,7,7,2,0,RC-135U Combat Sent -1,2,225,7,7,3,0,RC-135 V/W Rivet Joint -1,2,225,7,7,4,0,RC-135X Cobra Eye -1,2,225,8,0,0,0,Surveillance / Command and Control / Airborne Early Warning (AEW) -1,2,225,8,1,0,0,Grumman E-2 Hawkeye -1,2,225,8,1,1,0,E-2C -1,2,225,8,1,2,0,TE-2C -1,2,225,8,2,0,0,EA-3 -1,2,225,8,2,2,0,EA-3B -1,2,225,8,3,0,0,Boeing E-6A Mercury (TACAMO II) -1,2,225,8,4,0,0,Boeing E-3 -1,2,225,8,4,1,0,E-3A Airborne Warning and Control System (AWACS) -1,2,225,8,4,2,0,E-3B AWACS -1,2,225,8,4,3,0,E-3C AWACS -1,2,225,8,4,4,0,E-3D Sentry AEW. Mk 1 -1,2,225,8,4,5,0,E-3F System de Detection Aeroporte -1,2,225,8,5,0,0,Boeing E-4 Advanced Airborne Command Post (AABNCP) -1,2,225,8,5,1,0,E-4A -1,2,225,8,5,2,0,E-4B -1,2,225,8,6,0,0,Boeing/Grumman E-8 (JSTARS) -1,2,225,20,0,0,0,Attack helicopter -1,2,225,20,1,0,0,McDonnell-Douglas AH-64 Apache -1,2,225,20,1,1,0,AH-64A -1,2,225,20,1,2,0,AH-64B -1,2,225,20,1,3,0,AH-64C -1,2,225,20,1,4,0,AH-64D -1,2,225,20,1,5,0,Petan (Cobra) -1,2,225,20,2,0,0,Bell Model 209 Hueycobra, Seacobra, Supercobra -1,2,225,20,2,1,0,AH-1E -1,2,225,20,2,2,0,AH-1F -1,2,225,20,2,3,0,AH-1G -1,2,225,20,2,4,0,AH-1J -1,2,225,20,2,5,0,AH-1P -1,2,225,20,2,6,0,AH-1Q -1,2,225,20,2,7,0,AH-1R -1,2,225,20,2,8,0,AH-1S -1,2,225,20,2,9,0,AH-1T -1,2,225,20,2,10,0,AH-1W -1,2,225,20,2,11,0,AH-1W Venom -1,2,225,20,2,12,0,TH-1S -1,2,225,20,3,0,0,Bell AH-1(4B)W Viper -1,2,225,20,4,0,0,Boeing/Sikorsky RAH-66 Comanche -1,2,225,20,5,0,0,McDonnell-Douglas 500/530 Defender -1,2,225,20,5,1,0,MH-6 -1,2,225,20,5,2,0,AH-6 -1,2,225,20,5,3,0,500MG -1,2,225,20,5,4,0,530MG -1,2,225,20,5,5,0,MH-6J -1,2,225,21,0,0,0,Utility helicopter -1,2,225,21,1,0,0,Bell model 204 Iroquois -1,2,225,21,1,1,0,UH-1A -1,2,225,21,1,2,0,UH-1B -1,2,225,21,1,3,0,UH-1C -1,2,225,21,1,4,0,UH-1E -1,2,225,21,1,5,0,UH-1F -1,2,225,21,1,6,0,UH-1L -1,2,225,21,1,7,0,HH-1K -1,2,225,21,1,8,0,TH-1F -1,2,225,21,1,9,0,TH-1L -1,2,225,21,1,10,0,UH-1HP -1,2,225,21,2,0,0,Sikorsky S-70A -1,2,225,21,2,1,0,UH-60A Blackhawk -1,2,225,21,2,2,0,UH-60L Blackhawk -1,2,225,21,2,3,0,EH-60C -1,2,225,21,2,4,0,MH-60K -1,2,225,21,2,5,0,VH-60N -1,2,225,21,2,6,0,UH-60P -1,2,225,21,2,7,0,S-70A-1 -1,2,225,21,2,8,0,S-70A-1L -1,2,225,21,2,9,0,S-70A-5 -1,2,225,21,2,10,0,S-70A-6 -1,2,225,21,2,11,0,S-70A-9 -1,2,225,21,2,12,0,S-70A-A9 -1,2,225,21,2,13,0,S-70A-A11 -1,2,225,21,2,14,0,S-70A-A12 -1,2,225,21,2,15,0,S-70A-A14 -1,2,225,21,2,16,0,S-70A-A16 -1,2,225,21,2,17,0,S-70A-A17 -1,2,225,21,2,18,0,S-70A-A18 -1,2,225,21,2,19,0,S-70A-A19 -1,2,225,21,2,20,0,S-70A-A20 -1,2,225,21,2,21,0,S-70A-A21 -1,2,225,21,2,22,0,S-70A-A22 -1,2,225,21,2,23,0,S-70A-A24 -1,2,225,21,3,0,0,Boeing model 107 -1,2,225,21,3,1,0,UH-46 Sea Knight -1,2,225,21,3,2,0,CH-46 Sea Knight -1,2,225,21,4,0,0,S-70C -1,2,225,21,4,1,0,H-60 -1,2,225,21,5,0,0,Sikorsky H-76 Eagle -1,2,225,22,0,0,0,Antisubmarine Warfare/patrol helicopter -1,2,225,22,1,0,0,Kaman Seasprite and Super Seasprite -1,2,225,22,1,1,0,SH-2 -1,2,225,22,2,0,0,Agusta Sikorsky AS-61/ASH-3H Sea King -1,2,225,22,2,1,0,SH-3D -1,2,225,22,2,2,0,SH-3H -1,2,225,22,2,3,0,SH-3D/TS -1,2,225,22,2,4,0,ASH-3D -1,2,225,22,2,5,0,AS-61 -1,2,225,22,3,0,0,Sikorsky S-70B -1,2,225,22,3,1,0,SH-60B Seahawk -1,2,225,22,3,2,0,SH-60F Oceanhawk -1,2,225,22,3,3,0,HH-60H -1,2,225,22,3,4,0,HH-60J Jayhawk -1,2,225,22,3,5,0,HS.23 -1,2,225,22,3,6,0,XSH-60J -1,2,225,22,3,7,0,UH-60J -1,2,225,22,3,8,0,S-70B-2 -1,2,225,23,0,0,0,Cargo helicopter -1,2,225,23,1,0,0,Boeing Models -1,2,225,23,1,1,0,CH-47 Chinook -1,2,225,23,1,2,0,CH-47B -1,2,225,23,1,3,0,CH-47C -1,2,225,23,1,4,0,CH-47D -1,2,225,23,1,5,0,CH-147 -1,2,225,23,1,6,0,Chinook HC.Mk 1 -1,2,225,23,1,7,0,Chinook HC.Mk 2 -1,2,225,23,1,8,0,HT.17 -1,2,225,23,2,0,0,Sikorsky S-80/H-53 -1,2,225,23,2,1,0,CH-53E Super Stallion -1,2,225,23,2,2,0,MH-53E Sea Dragon -1,2,225,23,2,3,0,S-80E -1,2,225,23,2,4,0,S-80M -1,2,225,23,3,0,0,Sikorsky S-65A -1,2,225,23,3,1,0,CH-53A Sea Stallion -1,2,225,23,3,2,0,HH-53B -1,2,225,23,3,3,0,HH-53C -1,2,225,23,3,4,0,CH-53A -1,2,225,23,3,5,0,CH-53D -1,2,225,24,0,0,0,Observation helicopter -1,2,225,24,1,0,0,Bell Kiowa -1,2,225,24,1,1,0,OH-58 -1,2,225,24,1,2,0,CH-136 -1,2,225,24,1,3,0,OH-58C -1,2,225,24,2,0,0,Bell Model 406 AHIP -1,2,225,24,2,1,0,OH-58D Kiowa/Kiowa Warrior -1,2,225,24,3,0,0,Bell Model 406 CS Combat Scout -1,2,225,24,3,2,0,MH-58D Combat Scout -1,2,225,25,0,0,0,Special Operations helicopter -1,2,225,25,1,0,0,Sikorsky S-70A -1,2,225,25,1,1,0,MH-60A -1,2,225,25,1,2,0,MH-60G Pave Hawk -1,2,225,25,1,3,0,MH-60K -1,2,225,25,1,4,0,MH-60L -1,2,225,25,2,0,0,Boeing models 114/414 -1,2,225,25,2,1,0,MH-47E -1,2,225,25,3,0,0,Sikorsky S-65/MH-53J Pave Low III Enhanced -1,2,225,25,3,1,0,HH-53B -1,2,225,25,3,2,0,HH-53C -1,2,225,25,3,3,0,CH-53C -1,2,225,25,3,4,0,MH-53J -1,2,225,25,4,0,0,McDonnell-Douglas 500/530 Defender -1,2,225,25,4,1,0,MH-6 -1,2,225,40,0,0,0,Trainers -1,2,225,40,1,0,0,Cessna 172 -1,2,225,40,1,1,0,T-41 -1,2,225,40,2,0,0,Cessna 318 -1,2,225,40,2,1,0,T-37 -1,2,225,40,3,0,0,Northrop Talon -1,2,225,40,3,1,0,T-38 -1,2,225,40,4,0,0,McDonnell-Douglas/BAe T45TS -1,2,225,40,4,1,0,T-45 Goshawk -1,2,225,40,5,0,0,Beechcraft T-34C -1,2,225,40,5,1,0,T-34C -1,2,225,40,6,0,0,Beechcraft Sierrra 200/Sundowner 180 -1,2,225,40,6,1,0,CT-134A Musketeer II -1,2,225,40,7,0,0,Lockheed T-33 -1,2,225,40,8,0,0,Beechcraft Model 400A Beechjet -1,2,225,40,8,1,0,T-1A Jayhawk -1,2,225,40,9,0,0,Boeing TC-135 -1,2,225,40,9,1,0,TC-135W Rivet Joint Trainer -1,2,225,40,9,2,0,TC-135S Cobra Ball Trainer -1,2,225,50,0,0,0,Unmanned Air Vehicle -1,2,225,50,1,0,0,TRW/IAI Hunter - land based -1,2,225,50,2,0,0,TRW/IAI Hunter - -1,2,225,50,3,0,0,Manuever UAV -1,3,225,1,0,0,0,Carrier -1,3,225,1,1,0,0,Nimitz Class -1,3,225,1,1,1,0,CVN 68 Nimitz -1,3,225,1,1,2,0,CVN 69 Dwight D. Eisenhower -1,3,225,1,1,3,0,CVN 70 Carl Vinson -1,3,225,1,1,4,0,CVN 71 Theodore Roosevelt -1,3,225,1,1,5,0,CVN 72 George Washington -1,3,225,1,1,6,0,CVN 73 Abraham Lincoln -1,3,225,1,1,7,0,CVN 74 John C. Stennis -1,3,225,1,1,8,0,CVN 75 United States -1,3,225,1,2,0,0,Enterprise Class -1,3,225,1,2,1,0,CVN 65 Enterprise -1,3,225,1,3,0,0,Kitty Hawk/John F. Kennedy Class -1,3,225,1,3,1,0,CV 63 Kitty Hawk -1,3,225,1,3,2,0,CV 64 Constellation -1,3,225,1,3,3,0,CV 66 America -1,3,225,1,3,4,0,CV 67 John F. Kennedy -1,3,225,1,4,0,0,Forrestal Class -1,3,225,1,4,1,0,AVT 59 Forrestal -1,3,225,1,4,2,0,CV 60 Saratoga -1,3,225,1,4,3,0,CV 61 Ranger -1,3,225,1,4,4,0,CV 62 Independence -1,3,225,2,0,0,0,Command Ship/Cruiser -1,3,225,2,1,0,0,Blue Ridge Class -1,3,225,2,1,1,0,LCC 19 Blue Ridge -1,3,225,2,1,2,0,LLC 20 Mount Whitney -1,3,225,2,2,0,0,Raleigh and Austin Classes -1,3,225,2,2,1,0,AGF 11 Coronado -1,3,225,2,2,2,0,AGF 3 La Salle -1,3,225,3,0,0,0,Guided Missile Cruiser -1,3,225,3,1,0,0,Ticonderoga Class -1,3,225,3,1,1,0,CG 47 Ticonderoga -1,3,225,3,1,2,0,CG 48 Yorktown -1,3,225,3,1,3,0,CG 49 Vincennes -1,3,225,3,1,4,0,CG 50 Valley Forge -1,3,225,3,1,5,0,CG 51 Thomas S. Gates -1,3,225,3,1,6,0,CG 52 Bunker Hill -1,3,225,3,1,7,0,CG 53 Mobile Bay -1,3,225,3,1,8,0,CG 54 Antietam -1,3,225,3,1,9,0,CG 55 Leyte Gulf -1,3,225,3,1,10,0,CG 56 San Jacinto -1,3,225,3,1,11,0,CG 57 Lake Champlain -1,3,225,3,1,12,0,CG 58 Philippine Sea -1,3,225,3,1,13,0,CG 59 Princeton -1,3,225,3,1,14,0,CG 60 Normandy -1,3,225,3,1,15,0,CG 61 Monterey -1,3,225,3,1,16,0,CG 62 Chancellorsville -1,3,225,3,1,17,0,CG 63 Cowpens -1,3,225,3,1,18,0,CG 64 Gettysburg -1,3,225,3,1,19,0,CG 65 Chosin -1,3,225,3,1,20,0,CG 66 Hue City -1,3,225,3,1,21,0,CG 67 Shiloh -1,3,225,3,1,22,0,CG 68 Anzio -1,3,225,3,1,23,0,CG 69 Vicksburg -1,3,225,3,1,24,0,CG 70 Lake Erie -1,3,225,3,1,25,0,CG 71 Cape St. George -1,3,225,3,1,26,0,CG 72 Vella Gulf -1,3,225,3,1,27,0,CG 73 Port Royal -1,3,225,3,2,0,0,Virginia Class -1,3,225,3,2,1,0,CGN 38 Virginia -1,3,225,3,2,2,0,CGN 39 Texas -1,3,225,3,2,3,0,CGN 40 Mississippi -1,3,225,3,2,4,0,CGN 41 Arkansas -1,3,225,3,3,0,0,California Class -1,3,225,3,3,1,0,CGN 36 California -1,3,225,3,3,2,0,CGN 37 South Carolina -1,3,225,3,4,0,0,Truxtun Class -1,3,225,3,4,1,0,CGN 35 Truxtun -1,3,225,3,5,0,0,Belknap Class -1,3,225,3,5,1,0,CG 26 Belknap -1,3,225,3,5,2,0,CG 27 Josephus Daniels -1,3,225,3,5,3,0,CG 28 Wainwright -1,3,225,3,5,4,0,CG 29 Jouett -1,3,225,3,5,5,0,CG 30 Horne -1,3,225,3,5,6,0,CG 31 Sterett -1,3,225,3,5,7,0,CG 32 W.H. Standley -1,3,225,3,5,8,0,CG 33 Fox -1,3,225,3,5,9,0,CG 34 Biddle -1,3,225,3,6,0,0,Bainbridge Class -1,3,225,3,6,1,0,CGN 25 Bainbridge -1,3,225,3,7,0,0,Leahy Class -1,3,225,3,7,1,0,CG 16 Leahy -1,3,225,3,7,2,0,CG 17 Harry E. Yarnell -1,3,225,3,7,3,0,CG 18 Worden -1,3,225,3,7,4,0,CG 19 Dale -1,3,225,3,7,5,0,CG 20 R.K. Turner -1,3,225,3,7,6,0,CG 21 Gridley -1,3,225,3,7,7,0,CG 22 England -1,3,225,3,7,8,0,CG 23 Halsey -1,3,225,3,7,9,0,CG 24 Reeves -1,3,225,3,9,0,0,Long Beach Class -1,3,225,3,9,1,0,CGN 9 Long Beach -1,3,225,4,0,0,0,Guided Missile Destroyer -1,3,225,4,1,0,0,Arleigh Burke Class -1,3,225,4,1,1,0,DDG 51 Arleigh Burke -1,3,225,4,1,2,0,DDG 52 Barry -1,3,225,4,1,3,0,DDG 53 John Paul Jones -1,3,225,4,1,4,0,DDG 54 Curtis Wilbur -1,3,225,4,1,5,0,DDG 55 Stout -1,3,225,4,1,6,0,DDG 56 John S. McCain -1,3,225,4,1,7,0,DDG 57 Mitscher -1,3,225,4,1,8,0,DDG 58 Laboon -1,3,225,4,1,9,0,DDG 59 Russell -1,3,225,4,1,10,0,DDG 60 Paul Hamilton -1,3,225,4,1,11,0,DDG 61 Ramage -1,3,225,4,1,12,0,DDG 62 Fitzgerald -1,3,225,4,1,13,0,DDG 63 Stethem -1,3,225,4,1,14,0,DDG 64 Carney -1,3,225,4,1,15,0,DG 65 Benfold -1,3,225,4,1,16,0,DG 66 Gonzalez -1,3,225,4,1,17,0,DG 67 Cole -1,3,225,4,2,0,0,Kidd Class -1,3,225,4,2,1,0,DDG 993 Kidd -1,3,225,4,2,2,0,DDG 994 Callaghan -1,3,225,4,2,3,0,DDG 995 Scott -1,3,225,4,2,4,0,DDG 996 Chandler -1,3,225,4,3,0,0,Coontz Class -1,3,225,4,3,1,0,DDG 39 MacDonough -1,3,225,4,3,2,0,DDG 43 Dahlgren -1,3,225,4,4,0,0,Charles F. Adams Class -1,3,225,4,4,1,0,DDG 2 Charles F. Adams -1,3,225,5,0,0,0,Destroyer -1,3,225,5,1,0,0,Spruance Class -1,3,225,5,1,1,0,DD 963 Spruance -1,3,225,5,1,2,0,DD 964 Paul F. Foster -1,3,225,5,1,3,0,DD 965 Kinkaid -1,3,225,5,1,4,0,DD 966 Hewitt -1,3,225,5,1,5,0,DD 967 Elliott -1,3,225,5,1,6,0,DD 968 A. W. Radford -1,3,225,5,1,7,0,DD 969 Peterson -1,3,225,5,1,8,0,DD 970 Caron -1,3,225,5,1,9,0,DD 971 David R. Ray -1,3,225,5,1,10,0,DD 972 Olendorf -1,3,225,5,1,11,0,DD 973 John Young -1,3,225,5,1,12,0,DD 974 Comte De Grasse -1,3,225,5,1,13,0,DD 975 O'Brien -1,3,225,5,1,14,0,DD 976 Merrill -1,3,225,5,1,15,0,DD 977 Briscoe -1,3,225,5,1,16,0,DD 978 Stump -1,3,225,5,1,17,0,DD 979 Conolly -1,3,225,5,1,18,0,DD 980 Moosebrugger -1,3,225,5,1,19,0,DD 981 John Hancock -1,3,225,5,1,20,0,DD 982 Nicholson -1,3,225,5,1,21,0,DD 983 John Rodgers -1,3,225,5,1,22,0,DD 984 Leftwich -1,3,225,5,1,23,0,DD 985 Cushing -1,3,225,5,1,24,0,DD 986 Harry W. Hill -1,3,225,5,1,25,0,DD 987 O'Bannon -1,3,225,5,1,26,0,DD 988 Thorn -1,3,225,5,1,27,0,DD 989 Deyo -1,3,225,5,1,28,0,DD 990 Ingersoll -1,3,225,5,1,29,0,DD 991 Fife -1,3,225,5,1,30,0,DD 992 Fletcher -1,3,225,5,1,31,0,DD 993 Hayler -1,3,225,6,0,0,0,Guided Missile Frigate -1,3,225,6,1,0,0,Oliver Perry Class -1,3,225,6,1,1,0,FFG 7 O.H. Perry -1,3,225,6,1,2,0,FFG 8 McInerney -1,3,225,6,1,3,0,FFG 9 Wadsworth -1,3,225,6,1,4,0,FFG 10 Duncan -1,3,225,6,1,5,0,FFG 11 Clark -1,3,225,6,1,6,0,FFG 12 George Philip -1,3,225,6,1,7,0,FFG 13 Sam E. Morison -1,3,225,6,1,8,0,FFG 14 Sides -1,3,225,6,1,9,0,FFG 15 Estocin -1,3,225,6,1,10,0,FFG 16 Clifton Sprauge -1,3,225,6,1,11,0,FFG 19 John A. Moore -1,3,225,6,1,12,0,FFG 20 Antrim -1,3,225,6,1,13,0,FFG 21 Flatley -1,3,225,6,1,14,0,FFG 22 Fahrion -1,3,225,6,1,15,0,FFG 23 Lewis B. Puller -1,3,225,6,1,16,0,FFG 24 Jack Williams -1,3,225,6,1,17,0,FFG 25 Copeland -1,3,225,6,1,18,0,FFG 26 Gallery -1,3,225,6,1,19,0,FFG 27 M. S. Tisdale -1,3,225,6,1,20,0,FFG 28 Boone -1,3,225,6,1,21,0,FFG 29 S. W. Groves -1,3,225,6,1,22,0,FFG 30 Reid -1,3,225,6,1,23,0,FFG 31 Stark -1,3,225,6,1,24,0,FFG 32 John L. Hall -1,3,225,6,1,25,0,FFG 33 Jarrett -1,3,225,6,1,26,0,FFG 34 Aubrey Fitch -1,3,225,6,1,27,0,FFG 36 Underwood -1,3,225,6,1,28,0,FFG 37 Crommelin -1,3,225,6,1,29,0,FFG 38 Curts -1,3,225,6,1,30,0,FFG 39 Doyle -1,3,225,6,1,31,0,FFG 40 Halyburton -1,3,225,6,1,32,0,FFG 41 McClusky -1,3,225,6,1,33,0,FFG 42 Klakring -1,3,225,6,1,34,0,FFG 43 Thatch -1,3,225,6,1,35,0,FFG 45 De Wert -1,3,225,6,1,36,0,FFG 46 Rentz -1,3,225,6,1,37,0,FFG 47 Nicholas -1,3,225,6,1,38,0,FFG 48 Vandegrift -1,3,225,6,1,39,0,FFG 49 R. G. Bradley -1,3,225,6,1,40,0,FFG 50 Jesse L. Taylor -1,3,225,6,1,41,0,FFG 51 Gary -1,3,225,6,1,42,0,FFG 52 Carr -1,3,225,6,1,43,0,FFG 53 Hawes -1,3,225,6,1,44,0,FFG 54 Ford -1,3,225,6,1,45,0,FFG 55 Elrod -1,3,225,6,1,46,0,FFG 56 Simpson -1,3,225,6,1,47,0,FFG 57 Reuben James -1,3,225,6,1,48,0,FFG 58 Sam B. Roberts -1,3,225,6,1,49,0,FFG 59 Kauffman -1,3,225,6,1,50,0,FFG 60 Rodney M. Davis -1,3,225,6,1,51,0,FFG 61 Ingraham -1,3,225,7,0,0,0,Light/patrol craft -1,3,225,7,1,0,0,PC Class -1,3,225,7,1,1,0,PC 1 Cyclone -1,3,225,7,1,2,0,PC 2 Tempest -1,3,225,7,1,3,0,PC 3 Hurricane -1,3,225,7,1,4,0,PC 4 Monsoon -1,3,225,7,1,5,0,PC 5 Typhoon -1,3,225,7,1,6,0,PC 6 Sirocco -1,3,225,7,1,7,0,PC 7 Squall -1,3,225,7,1,8,0,PC 8 Zephyr -1,3,225,7,1,9,0,PC 9 Chinook -1,3,225,7,1,10,0,PC 10 Firebolt -1,3,225,7,1,11,0,PC 11 Whirlwind -1,3,225,7,1,12,0,PC 12 Thunderbolt -1,3,225,7,1,13,0,PC 13 Shamal -1,3,225,8,0,0,0,Mine countermeasure ship/craft -1,3,225,8,1,0,0,Osprey class -1,3,225,8,1,1,0,MHC 51 Osprey -1,3,225,8,1,2,0,MHC 52 Heron -1,3,225,8,1,3,0,MHC 53 Pelican -1,3,225,8,1,4,0,MHC 54 Robin -1,3,225,8,1,5,0,MHC 55 Oriole -1,3,225,8,1,6,0,MHC 56 Kingfisher -1,3,225,8,1,7,0,MHC 57 Cormorant -1,3,225,8,2,0,0,Avenger Class -1,3,225,8,2,1,0,MCM 1 Avenger -1,3,225,8,2,2,0,MCM 2 Defender -1,3,225,8,2,3,0,MCM 3 Sentry -1,3,225,8,2,4,0,MCM 4 Champion -1,3,225,8,2,5,0,MCM 5 Guardian -1,3,225,8,2,6,0,MCM 6 Devastator -1,3,225,8,2,7,0,MCM 7 Patriot -1,3,225,8,2,8,0,MCM 8 Scout -1,3,225,8,2,9,0,MCM 9 Pioneer -1,3,225,8,2,10,0,MCM 10 Warrior -1,3,225,8,2,11,0,MCM 11 Gladiator -1,3,225,8,2,12,0,MCM 12 Ardent -1,3,225,8,2,13,0,MCM 13 Dextrous -1,3,225,8,2,14,0,MCM 14 Chief -1,3,225,8,3,0,0,Acme Class -1,3,225,8,3,2,0,MSO 511 Affray -1,3,225,8,4,0,0,Agile/Aggressive Class -1,3,225,8,4,1,0,MSO 427 Constant -1,3,225,8,4,5,0,MSO 439 Excel -1,3,225,8,4,6,0,MSO 440 Exploit -1,3,225,8,4,10,0,MSO 446 Fortify -1,3,225,8,4,12,0,MSO 449 Impervious -1,3,225,8,4,16,0,MSO 488 Conquest -1,3,225,8,4,17,0,MSO 489 Gallant -1,3,225,8,4,19,0,MSO 492 Pledge -1,3,225,9,0,0,0,Dock Landing Ship -1,3,225,9,1,0,0,Whidbey Island Class -1,3,225,9,1,1,0,LSD 41 Whidbey Island -1,3,225,9,1,2,0,LSD 42 Germantown -1,3,225,9,1,3,0,LSD 43 Fort McHenry -1,3,225,9,1,4,0,LSD 44 Gunston Hall -1,3,225,9,1,5,0,LSD 45 Comstock -1,3,225,9,1,6,0,LSD 46 Tortuga -1,3,225,9,1,7,0,LSD 47 Rushmore -1,3,225,9,1,8,0,LSD 48 Ashland -1,3,225,9,1,9,0,LSD 49 Harpers Ferry -1,3,225,9,1,10,0,LSD 50 Carter Hall -1,3,225,9,1,11,0,LSD 51 Oak Hill -1,3,225,9,2,0,0,Anchorage Class -1,3,225,9,2,1,0,LSD 36 Anchorage -1,3,225,9,2,2,0,LSD 37 Portland -1,3,225,9,2,3,0,LSD 38 Pensacola -1,3,225,9,2,4,0,LSD 39 Mount Vernon -1,3,225,9,2,5,0,LSD 40 Fort Fisher -1,3,225,10,0,0,0,Tank Landing Ship -1,3,225,10,1,0,0,Newport Class -1,3,225,10,1,1,0,LST 1179 Newport -1,3,225,10,1,2,0,LST 1180 Manitowac -1,3,225,10,1,3,0,LST 1181 Sumter -1,3,225,10,1,4,0,LST 1182 Fresno -1,3,225,10,1,5,0,LST 1183 Peoria -1,3,225,10,1,6,0,LST 1184 Frederick -1,3,225,10,1,7,0,LST 1185 Schenectady -1,3,225,10,1,8,0,LST 1186 Cayuga -1,3,225,10,1,9,0,LST 1187 Tuscaloosa -1,3,225,10,1,10,0,LST 1188 Saginaw -1,3,225,10,1,11,0,LST 1189 San Bernardino -1,3,225,10,1,12,0,LST 1190 Boulder -1,3,225,10,1,13,0,LST 1191 Racine -1,3,225,10,1,14,0,LST 1192 Spartanburg County -1,3,225,10,1,15,0,LST 1193 Fairfax County -1,3,225,10,1,16,0,LST 1194 La Moure County -1,3,225,10,1,18,0,LST 1196 Harlan County -1,3,225,10,1,19,0,LST 1197 Barnstable County -1,3,225,10,1,20,0,LST 1198 Bristol County -1,3,225,11,0,0,0,Landing Craft -1,3,225,14,0,0,0,Hydrofoil -1,3,225,14,1,0,0,Pegasus class -1,3,225,14,1,1,0,PHM 1 Pegasus -1,3,225,14,1,2,0,PHM 2 Hercules -1,3,225,14,1,3,0,PHM 3 Taurus -1,3,225,14,1,4,0,PHM 4 Aquila -1,3,225,14,1,5,0,PHM 5 Aries -1,3,225,14,1,6,0,PHM 6 Gemini -1,3,225,16,0,0,0,Auxiliary -1,3,225,16,1,0,0,Cimarron class (Fleet Oilers) -1,3,225,16,1,1,0,AO 177 Cimarron -1,3,225,16,1,2,0,AO 178 Monongahela -1,3,225,16,1,3,0,AO 179 Merrimack -1,3,225,16,1,4,0,AO 180 Willamette -1,3,225,16,1,5,0,AO 186 Platte -1,3,225,16,8,0,0,Wichita class (Replenishment Oilers) -1,3,225,16,8,1,0,AOR 1 Wichita -1,3,225,16,8,2,0,AOR 2 Milwaukee -1,3,225,16,8,3,0,AOR 3 Kansas City -1,3,225,16,8,4,0,AOR 4 Savannah -1,3,225,16,8,5,0,AOR 5 Wabash -1,3,225,16,8,6,0,AOR 6 Kalamazoo -1,3,225,16,8,7,0,AOR 7 Roanoke -1,3,225,16,12,0,0,Vulcan class (Repair Ship) -1,3,225,16,12,1,0,AR 8 Jason -1,3,225,16,13,0,0,Fulton class (Submarine Tenders) -1,3,225,16,13,1,0,AS 18 Orion -1,3,225,16,14,0,0,Proteus class (Submarine Tenders) -1,3,225,16,14,1,0,AS 19 Proteus -1,3,225,16,15,0,0,Hunley class (Submarine Tenders) -1,3,225,16,15,1,0,AS 31 Hunley -1,3,225,16,15,2,0,AS 32 Holland -1,3,225,16,16,0,0,Simon Lake class (Submarine Tenders) -1,3,225,16,16,1,0,AS 33 Simon Lake -1,3,225,16,16,2,0,AS 34 Canopus -1,3,225,16,17,0,0,Spear class (Submarine Tenders) -1,3,225,16,17,1,0,AS 36 L. Y. Spear -1,3,225,16,17,2,0,AS 37 Dixon -1,3,225,16,18,0,0,Emory S. Land class (Submarine Tenders) -1,3,225,16,18,1,0,AS 39 Emory S. Land -1,3,225,16,18,2,0,AS 40 Frank Cable -1,3,225,16,18,3,0,AS 41 McKee -1,3,225,16,19,0,0,Bolster class (Salvage Ships) -1,3,225,16,19,1,0,ARS 8 Preserver -1,3,225,16,19,2,0,ARS 38 Bolster -1,3,225,16,19,3,0,ARS 39 Conserver -1,3,225,16,19,4,0,ARS 40 Hoist -1,3,225,16,19,5,0,ARS 41 Opportune -1,3,225,16,19,6,0,ARS 42 Reclaimer -1,3,225,16,19,7,0,ARS 43 Recovery -1,3,225,16,20,0,0,Safeguard class (Salvage Ships) -1,3,225,16,20,1,0,ARS 50 Safeguard -1,3,225,16,20,2,0,ARS 51 Grasp -1,3,225,16,20,3,0,ARS 52 Salvor -1,3,225,16,20,4,0,ARS 53 Grapple -1,3,225,16,21,0,0,Edenton class (Salvage Ships) -1,3,225,16,21,1,0,ATS 1 Edenton -1,3,225,16,21,2,0,ATS 2 Beaufort -1,3,225,16,21,3,0,ATS 3 Brunswick -1,3,225,16,22,0,0,Chanticleer class (Submarine Rescue) -1,3,225,16,22,1,0,ASR 13 Kittiwake -1,3,225,16,22,2,0,ASR 15 Sunbird -1,3,225,16,23,0,0,Pigeon class (Submarine Rescue) -1,3,225,16,23,1,0,ASR 21 Pigeon -1,3,225,16,23,2,0,ASR 22 Ortolan -1,3,225,16,24,0,0,Abnaki class (Fleet Ocean Tugs) -1,3,225,16,24,1,0,ATF 159 Paiute -1,3,225,16,24,2,0,ATF 160 Papago -1,3,225,17,0,0,0,Auxiliary, Merchant Marine -1,3,225,17,1,0,0,Fleet Ballistic Missile Support Ships (Naval Fleet) -1,3,225,17,1,1,0,TAK 282 Marshfield -1,3,225,17,1,2,0,TAK 286 Vega -1,3,225,17,2,0,0,Ammunition Ship (Naval Fleet) -1,3,225,17,2,1,0,TAE 26 Kilauea -1,3,225,17,3,0,0,Fleet Stores Ship (Naval Fleet) -1,3,225,17,3,1,0,TAF 58 Rigel -1,3,225,17,4,0,0,Combat Stores Ships (Naval Fleet) -1,3,225,17,4,1,0,TAFS 8 Sirius -1,3,225,17,4,2,0,TAFS 9 Spica -1,3,225,17,4,3,0,TAFS 10 Saturn -1,3,225,17,5,0,0,Neosho class (Naval Fleet Oilers) -1,3,225,17,5,1,0,TAO 143 Neosho -1,3,225,17,5,2,0,TAO 146 Kawishiwi -1,3,225,17,5,3,0,TAO 148 Ponchatoula -1,3,225,17,6,0,0,Henry J. Kaiser class (Naval Fleet Oilers) -1,3,225,17,6,1,0,TAO 187 Henry J. Kaiser -1,3,225,17,6,2,0,TAO 188 Joshua Humphreys -1,3,225,17,6,3,0,TAO 189 John Lenthall -1,3,225,17,6,4,0,TAO 190 Andrew J. Higgins -1,3,225,17,6,5,0,TAO 191 Benjamin Isherwood -1,3,225,17,6,6,0,TAO 192 Henry Eckford -1,3,225,17,6,7,0,TAO 193 Walter S. Diehl -1,3,225,17,6,8,0,TAO 194 John Ericsson -1,3,225,17,6,9,0,TAO 195 Leroy Grumman -1,3,225,17,6,10,0,TAO 196 Kanawha -1,3,225,17,6,11,0,TAO 197 Pecos -1,3,225,17,6,12,0,TAO 198 Big Horn -1,3,225,17,6,13,0,TAO 199 Tippecanoe -1,3,225,17,6,14,0,TAO 200 Guadaloupe -1,3,225,17,6,15,0,TAO 201 Patuxent -1,3,225,17,6,16,0,TAO 202 Yukon -1,3,225,17,6,17,0,TAO 203 Laramie -1,3,225,17,6,18,0,TAO 204 Rappahannock -1,3,225,17,7,0,0,Powhatan class (Fleet Ocean Tugs) -1,3,225,17,7,1,0,TATF 166 Powhatan -1,3,225,17,7,2,0,TATF 167 Narragansett -1,3,225,17,7,3,0,TATF 168 Catawba -1,3,225,17,7,4,0,TATF 169 Navajo -1,3,225,17,7,5,0,TATF 170 Mohawk -1,3,225,17,7,6,0,TATF 171 Sioux -1,3,225,17,7,7,0,TATF 172 Apache -1,3,225,17,7,19,0,TAGOS 19 Victorious (Small Water-Plane Area Twin Hull: SWATH) -1,3,225,17,7,20,0,TAGOS 20 Able (SWATH) -1,3,225,17,7,21,0,TAGOS 21 Effective (SWATH) -1,3,225,17,7,22,0,TAGOS 22 Loyal (SWATH) -1,3,225,17,7,23,0,TAGOS 23 Impeccable (SWATH) -1,3,225,17,9,0,0,Maritime Prepositioning Ships (MPS) -1,3,225,17,9,1,0,TAK 3000 Cpl Louis Hauge Jr. -1,3,225,17,9,2,0,TAK 3001 Pfc William Baugh -1,3,225,17,9,3,0,TAK 3002 Pfc James Anderson Jr. -1,3,225,17,9,4,0,TAK 3003 1st Lt Alexander Bonnyman Jr. -1,3,225,17,9,5,0,TAK 3004 Pvt Harry Fisher -1,3,225,17,9,6,0,TAK 3005 Sgt Matej Kocak -1,3,225,17,9,7,0,TAK 3006 Pfc Eugene A. Obregon -1,3,225,17,9,8,0,TAK 3007 Maj Stephen W. Pless -1,3,225,17,9,9,0, TAK 3008 2nd Lt John P. Bobo -1,3,225,17,9,10,0,TAK 3009 Pfc Dewayne T. Williams -1,3,225,17,9,11,0,TAK 3010 1st Lt Baldomero Lopez -1,3,225,17,9,12,0,TAK 3011 1st Lt Jack Lummus -1,3,225,17,9,13,0,TAK 3012 Staff Sgt William R. Button -1,3,225,17,10,0,0,Lash (Preposition) -1,3,225,17,10,1,0,TAK 1015 Green Island -1,3,225,17,10,2,0,TAK 2043 American Kestrel -1,3,225,17,10,3,0,TAK 2046 Austral Rainbow -1,3,225,17,10,4,0,TAK 2064 Green Harbour -1,3,225,17,11,0,0,Freighters (Preposition) -1,3,225,17,11,1,0,TAK 5076 Noble Star -1,3,225,17,11,2,0,TAK 2040 Advantage -1,3,225,17,11,3,0,TAK 2062 American Cormorant -1,3,225,17,12,0,0,Tankers (PRE-POSITION) -1,3,225,17,12,1,0,TAOT 170 Sealift China Sea -1,3,225,17,12,2,0,TAOT 181 Potomac -1,3,225,17,13,0,0,Tankers (Ocean Transportation) -1,3,225,17,13,1,0,TAOT 168 Sealift Pacific -1,3,225,17,13,2,0,TAOT 169 Sealift Arabian Sea -1,3,225,17,13,3,0,TAOT 171 Sealift Indian Ocean -1,3,225,17,13,4,0,TAOT 172 Sealift Atlantic -1,3,225,17,13,5,0,TAOT 173 Sealift Mediterranean -1,3,225,17,13,6,0,TAOT 174 Sealift Caribbean -1,3,225,17,13,7,0,TAOT 175 Sealift Arctic -1,3,225,17,13,8,0,TAOT 176 Sealift Antarctic -1,3,225,17,13,9,0,TAOT 1121 Gus W. Darnell -1,3,225,17,13,10,0,TAOT 1122 Paul Buck -1,3,225,17,13,11,0,TAOT 1123 Samuel L. Cobb -1,3,225,17,13,12,0,TAOT 1124 Richard G. Matthieson -1,3,225,17,13,13,0,TAOT 1125 Lawrence H. Gianella -1,3,225,17,14,0,0,Fast Sealift Ships (Strategic Sealift) -1,3,225,17,14,1,0,TAKR 287 Algol -1,3,225,17,14,2,0,TAKR 288 Bellatrix -1,3,225,17,14,3,0,TAKR 289 Denebola -1,3,225,17,14,4,0,TAKR 290 Pollux -1,3,225,17,14,5,0,TAKR 291 Altair -1,3,225,17,14,6,0,TAKR 292 Regulus -1,3,225,17,14,7,0,TAKR 293 Capella -1,3,225,17,14,8,0,TAKR 294 Antares -1,3,225,17,15,0,0,Aviation Support Ships (Strategic Sealift) -1,3,225,17,15,1,0,TAVB 3 Wright -1,3,225,17,15,2,0,TAVB 4 Curtiss -1,3,225,17,16,0,0,Hospital Ships (Strategic Sealift) -1,3,225,17,16,1,0,TAH 19 Mercy -1,3,225,17,16,2,0,TAH 20 Comfort -1,3,225,17,17,0,0,Frigate Research Ship (Special Mission Support) -1,3,225,17,17,1,0,T-AGFF1 Glover -1,3,225,17,18,0,0,Missile Range Instrumentation Ships (Special Mission Support) -1,3,225,17,18,1,0,TAGM 20 Redstone -1,3,225,17,18,2,0,TAGM 22 Range Sentinel -1,3,225,17,18,3,0,TAGM 23 Observation Island -1,3,225,17,19,0,0,Oceanographic Research Ships (Special Mission Support) -1,3,225,17,19,1,0,TAGOR 10 Thomas Washington (loan) -1,3,225,17,19,2,0,TAGOR 12 De Steigeur -1,3,225,17,19,3,0,TAGOR 13 Bartlett -1,3,225,17,19,4,0,TAGOR 14 Melville (loan) -1,3,225,17,19,5,0,TAGOR 15 Knorr (loan) -1,3,225,17,19,6,0,TAGOR 21 Gyre (loan) -1,3,225,17,19,7,0,TAGOR 22 Moana Wave (loan) -1,3,225,17,19,8,0,TAGOR 23 Thomas G. Thompson (loan) -1,3,225,17,19,9,0,TAGOR 195 Hayes -1,3,225,17,20,0,0,Surveying Ships (Special Mission Support) -1,3,225,17,20,1,0,TAGS 26 Silas Bent -1,3,225,17,20,2,0,TAGS 27 Kane -1,3,225,17,20,3,0,TAGS 29 Chauvenet -1,3,225,17,20,4,0,TAGS 32 Harkness -1,3,225,17,20,5,0,TAGS 33 Wilkes -1,3,225,17,20,6,0,TAGS 34 Wyman -1,3,225,17,20,7,0,TAGS 39 Maury -1,3,225,17,20,8,0,TAGS 40 Tanner -1,3,225,17,20,9,0,TAGS 45 Waters -1,3,225,17,20,10,0,TAGS 51 John McDonnell -1,3,225,17,20,11,0,TAGS 52 Littlehales -1,3,225,17,20,12,0,TAGS 60 Pathfinder -1,3,225,17,20,13,0,TAGS 61 Sumner -1,3,225,17,21,0,0,Navigation Test Support Ship (Special Mission Support) -1,3,225,17,21,1,0,TAG 194 Vanguard -1,3,225,17,22,0,0,Cable Repair Ships (Special Mission Support) -1,3,225,17,22,1,0,TARC 6 Albert J. Myer -1,3,225,17,22,2,0,TARC 7 Zeus -1,3,225,17,23,0,0,Deep Submergence Support Ship (Special Mission Support) -1,3,225,17,23,1,0,TAGDS 2 Point Loma -1,3,225,50,0,0,0,Frigate -1,3,225,50,1,0,0,Knox Class -1,3,225,50,1,5,0,FF 1056 Connole -1,3,225,50,1,12,0,FF 1063 Reasoner -1,3,225,50,1,13,0,FF 1064 Lockwood -1,3,225,50,1,14,0,FF 1065 Stein -1,3,225,50,1,15,0,FF 1066 Marvin Shields -1,3,225,50,1,16,0,FF 1067 F. Hammond -1,3,225,50,1,17,0,FF 1068 Vreeland -1,3,225,50,1,19,0,FF 1070 Downes -1,3,225,50,1,22,0,FF 1073 R. E. Peary -1,3,225,50,1,23,0,FF 1074 Harold E. Holt -1,3,225,50,1,24,0,FF 1075 Trippe -1,3,225,50,1,25,0,FF 1076 Fanning -1,3,225,50,1,26,0,FF 1077 Ouellet -1,3,225,50,1,27,0,FF 1078 Joseph Hewes -1,3,225,50,1,28,0,FF 1079 Bowen -1,3,225,50,1,29,0,FF 1080 Paul -1,3,225,50,1,30,0,FF 1081 Aylwin -1,3,225,50,1,31,0,FF 1082 E. Montgomery -1,3,225,50,1,32,0,FF 1083 Cook -1,3,225,50,1,33,0,FF 1084 McCandless -1,3,225,50,1,34,0,FF 1085 D. B. Beary -1,3,225,50,1,36,0,FF 1087 Kirk -1,3,225,50,1,38,0,FF 1089 J. L. Brown -1,3,225,50,1,39,0,FF 1090 Ainsworth -1,3,225,50,1,41,0,FF 1092 T. C. Hart -1,3,225,50,1,42,0,FF 1093 Capodanno -1,3,225,50,1,43,0,FF 1094 Pharris -1,3,225,50,1,44,0,FF 1095 Truett -1,3,225,50,1,46,0,FF 1097 Moinester -1,3,225,51,0,0,0,Battleship -1,3,225,52,0,0,0,Heavy Cruiser -1,3,225,53,0,0,0,Destroyer Tender -1,3,225,53,1,0,0,Sam Gompers/Yellowstone Class -1,3,225,53,1,1,0,AD 37 Samuel Gompers -1,3,225,53,1,2,0,AD 38 Puget Sound -1,3,225,53,1,3,0,AD 41 Yellowstone -1,3,225,53,1,4,0,AD 42 Acadia -1,3,225,53,1,5,0,AD 43 Cape Cod -1,3,225,53,1,6,0,AD 44 Shenandoah -1,3,225,53,2,0,0,Dixie Class -1,3,225,53,2,1,0,AD 15 Prairie -1,3,225,53,2,2,0,AD 18 Sierra -1,3,225,53,2,3,0,AD 19 Yosemite -1,3,225,54,0,0,0,Amphibious Assault Ship -1,3,225,54,1,0,0,Tarawa Class -1,3,225,54,1,1,0,LHA 1 Tarawa -1,3,225,54,1,2,0,LHA 2 Saipan -1,3,225,54,1,3,0,LHA 3 Belleau Wood -1,3,225,54,1,4,0,LHA 4 Nassau -1,3,225,54,1,5,0,LHA 5 Peleliu -1,3,225,54,2,0,0,Iwo Jima Class -1,3,225,54,2,1,0,LPH 2 Iwo Jima -1,3,225,54,2,2,0,LPH 3 Okinawa -1,3,225,54,2,3,0,LPH 7 Guadalcanal -1,3,225,54,2,4,0,LPH 9 Guam -1,3,225,54,2,5,0,LPH 10 Tripoli -1,3,225,54,2,6,0,LPH 11 New Orleans -1,3,225,54,2,7,0,LPH 12 Inchon -1,3,225,54,3,0,0,Wasp Class -1,3,225,54,3,1,0,LHD 1 Wasp -1,3,225,54,3,2,0,LHD 2 Essex -1,3,225,54,3,3,0,LHD 3 Kearsage -1,3,225,54,3,4,0,LHD 4 Boxer -1,3,225,54,3,5,0,LHD 5 Bataan -1,3,225,55,0,0,0,Amphibious Cargo Ship -1,3,225,55,1,0,0,Charleston Class -1,3,225,55,1,1,0,LKA 113 Charleston -1,3,225,55,1,2,0,LKA 114 Durham -1,3,225,55,1,3,0,LKA 115 Mobile -1,3,225,55,1,4,0,LKA 116 St. Louis -1,3,225,55,1,5,0,LKA 117 El Paso -1,3,225,56,0,0,0,Amphibious Transport Dock -1,3,225,56,1,0,0,Austin Class -1,3,225,56,1,1,0,LPD 4 Austin -1,3,225,56,1,2,0,LPD 5 Ogden -1,3,225,56,1,3,0,LPD 6 Duluth -1,3,225,56,1,4,0,LPD 7 Cleveland -1,3,225,56,1,5,0,LPD 8 Dubuque -1,3,225,56,1,6,0,LPD 9 Denver -1,3,225,56,1,7,0,LPD 10 Juneau -1,3,225,56,1,8,0,LPD 12 Shreveport -1,3,225,56,1,9,0,LPD 13 Nashville -1,3,225,56,1,10,0,LPD 14 Trenton -1,3,225,56,1,11,0,LPD 15 Ponce -1,3,225,57,0,0,0,Ammunition Ship -1,3,225,57,1,0,0,Kilauea Class -1,3,225,57,1,1,0,T-AE 26 Kilauea -1,3,225,57,1,2,0,AE 27 Butte -1,3,225,57,1,3,0,AE 28 Santa Barbara -1,3,225,57,1,4,0,AE 29 Mount Hood -1,3,225,57,1,5,0,AE 32 Flint -1,3,225,57,1,6,0,AE 33 Shasta -1,3,225,57,1,7,0,AE 34 Mount Baker -1,3,225,57,1,8,0,AE 35 Kiska -1,3,225,57,2,0,0,Suribachi Class -1,3,225,57,2,1,0,AE 21 Suribachi -1,3,225,57,2,2,0,AE 22 Mauna Kea -1,3,225,57,3,0,0,Nitro Class -1,3,225,57,3,1,0,AE 23 Nitro -1,3,225,57,3,2,0,AE 24 Pyro -1,3,225,57,3,3,0,AE 25 Haleakala -1,3,225,58,0,0,0,Combat Stores Ship -1,3,225,58,2,0,0,Mars Class -1,3,225,58,2,1,0,AFS 1 Mars -1,3,225,58,2,2,0,AFS 2 Sylvania -1,3,225,58,2,3,0,AFS 3 Niagara Falls -1,3,225,58,2,4,0,AFS 4 White Plains -1,3,225,58,2,5,0,AFS 5 Concord -1,3,225,58,2,6,0,AFS 6 San Diego -1,3,225,58,2,7,0, AFS 7 San Jose -1,3,225,59,0,0,0,Surveillance Towed Array Sonar System (SURTASS) -1,3,225,59,8,0,0,Stalwart Class (Ocean Surveillance) -1,3,225,59,8,1,0,TAGOS 1 Stalwart -1,3,225,59,8,2,0,TAGOS 2 Contender -1,3,225,59,8,3,0,TAGOS 3 Vindicator -1,3,225,59,8,4,0,TAGOS 4 Triumph -1,3,225,59,8,5,0,TAGOS 5 Assurance -1,3,225,59,8,6,0,TAGOS 6 Persistent -1,3,225,59,8,7,0,TAGOS 7 Indomitable -1,3,225,59,8,8,0,TAGOS 8 Prevail -1,3,225,59,8,9,0,TAGOS 9 Assertive -1,3,225,59,8,10,0,TAGOS 10 Invincible -1,3,225,59,8,11,0,TAGOS 11 Audacious -1,3,225,59,8,12,0,TAGOS 12 Bold -1,3,225,59,8,13,0,TAGOS 13 Adventurous -1,3,225,59,8,14,0,TAGOS 14 Worthy -1,3,225,59,8,15,0,TAGOS 15 Titan -1,3,225,59,8,16,0,TAGOS 16 Capable -1,3,225,59,8,17,0,TAGOS 17 Intrepid -1,3,225,59,8,18,0,TAGOS 18 Relentless -1,3,225,59,2,0,0,SWATH-S (Small) class -1,3,225,59,2,1,0,TAGOS 19 Victorious -1,3,225,59,2,2,0,TAGOS 20 Able -1,3,225,59,2,3,0,TAGOS 21 Effective -1,3,225,59,2,4,0,TAGOS 22 Loyal -1,3,225,59,3,0,0,SWATH-L (Large) class -1,3,225,59,3,1,0,TAGOS 23 Impeccable -1,3,225,60,0,0,0,Fast Combat Support Ship -1,3,225,60,1,0,0,Sacramento Class -1,3,225,60,1,1,0,AOE1 Sacramento -1,3,225,60,1,2,0,AOE2 Camden -1,3,225,60,1,3,0,AOE3 Seattle -1,3,225,60,1,4,0,AOE4 Detroit -1,3,225,60,2,0,0,Supply Class -1,3,225,60,2,1,0,AOE6 Supply -1,3,225,60,2,2,0,AOE7 Rainier -1,3,225,60,2,3,0,AOE8 Arctic -1,4,225,1,0,0,0,SSBN(Nuclear Ballistic Missile) -1,4,225,1,1,0,0,James Madison class -1,4,225,1,1,1,0,SSBN 629 Daniel Boone -1,4,225,1,1,2,0,SSBN 630 John C. Calhoun -1,4,225,1,1,3,0,SSBN 632 Von Steuben -1,4,225,1,1,4,0,SSBN 633 Casimir Pulaski -1,4,225,1,1,5,0,SSBN 634 Stonewall Jackson -1,4,225,1,2,0,0,Benjamin Franklin class -1,4,225,1,2,1,0,SSBN 640 Benjamin Franklin -1,4,225,1,2,2,0,SSBN 641 Simon Bolivar -1,4,225,1,2,3,0,SSBN 642 Kamehameha -1,4,225,1,2,4,0,SSBN 643 George Bancroft -1,4,225,1,2,5,0,SSBN 645 James K. Polk -1,4,225,1,2,6,0,SSBN 655 Henry L. Stimson -1,4,225,1,2,7,0,SSBN 657 Francis Scott Key -1,4,225,1,2,8,0,SSBN 658 Mariano G. Vallejo -1,4,225,1,3,0,0,Ohio class -1,4,225,1,3,1,0,SSBN 726 Ohio -1,4,225,1,3,2,0,SSBN 727 Michigan -1,4,225,1,3,3,0,SSBN 728 Florida -1,4,225,1,3,4,0,SSBN 729 Georgia -1,4,225,1,3,5,0,SSBN 730 Henry M. Jackson -1,4,225,1,3,6,0,SSBN 731 Alabama -1,4,225,1,3,7,0,SSBN 732 Alaska -1,4,225,1,3,8,0,SSBN 733 Nevada -1,4,225,1,3,9,0,SSBN 734 Tennessee -1,4,225,1,3,10,0,SSBN 735 Pennsylvania -1,4,225,1,3,11,0,SSBN 736 West Virginia -1,4,225,1,3,12,0,SSBN 737 Kentucky -1,4,225,1,3,13,0,SSBN 738 Maryland -1,4,225,1,3,14,0,SSBN 739 Nebraska -1,4,225,1,3,15,0,SSBN 740 Rhode Island -1,4,225,1,3,16,0,SSBN 741 Maine -1,4,225,1,3,17,0,SSBN 742 Wyoming -1,4,225,3,0,0,0,SSN (Nuclear Attack-Torpedo) -1,4,225,3,1,0,0,Seawolf class -1,4,225,3,1,1,0,SSN 21 Seawolf -1,4,225,3,2,0,0,Sturgeon class -1,4,225,3,2,1,0,SSN 637 Sturgeon -1,4,225,3,2,2,0,SSN 638 Whale -1,4,225,3,2,3,0,SSN 639 Tautog -1,4,225,3,2,4,0,SSN 646 Grayling -1,4,225,3,2,5,0,SSN 647 Pogy -1,4,225,3,2,6,0,SSN 648 Aspro -1,4,225,3,2,7,0,SSN 649 Sunfish -1,4,225,3,2,8,0,SSN 650 Pargo -1,4,225,3,2,9,0,SSN 652 Puffer -1,4,225,3,2,10,0,SSN 653 Ray -1,4,225,3,2,11,0,SSN 660 Sand Lance -1,4,225,3,2,12,0,SSN 662 Gurnard -1,4,225,3,2,13,0,SSN 663 Hammerhead -1,4,225,3,2,14,0,SSN 666 Hawkbill -1,4,225,3,2,15,0,SSN 667 Bergall -1,4,225,3,2,16,0,SSN 668 Spadefish -1,4,225,3,2,17,0,SSN 669 Seahorse -1,4,225,3,2,18,0,SSN 670 Finback -1,4,225,3,2,19,0,SSN 672 Pintado -1,4,225,3,2,20,0,SSN 673 Flying Fish -1,4,225,3,2,21,0,SSN 674 Trepang -1,4,225,3,2,22,0,SSN 675 Bluefish -1,4,225,3,2,23,0,SSN 676 Billfish -1,4,225,3,2,24,0,SSN 677 Drum -1,4,225,3,2,25,0,SSN 678 Archerfish -1,4,225,3,2,26,0,SSN 679 Silversides -1,4,225,3,2,27,0,SSN 680 William H. Bates -1,4,225,3,2,28,0,SSN 681 Batfish -1,4,225,3,2,29,0,SSN 682 Tunny -1,4,225,3,2,30,0,SSN 683 Parche -1,4,225,3,2,31,0,SSN 684 Cavalla -1,4,225,3,2,32,0,SSN 686 L. Mendel Rivers -1,4,225,3,2,33,0,SSN 687 Richard B. Russell -1,4,225,3,3,0,0,Narwhal class -1,4,225,3,3,1,0,SSN 671 Narwhal -1,4,225,3,4,0,0,Los Angeles class -1,4,225,3,4,1,0,SSN 688 Los Angeles -1,4,225,3,4,2,0,SSN 689 Baton Rouge -1,4,225,3,4,3,0,SSN 690 Philadelphia -1,4,225,3,4,4,0,SSN 691 Memphis -1,4,225,3,4,5,0,SSN 692 Omaha -1,4,225,3,4,6,0,SSN 693 Cincinnati -1,4,225,3,4,7,0,SSN 694 Groton -1,4,225,3,4,8,0,SSN 695 Birmingham -1,4,225,3,4,9,0,SSN 696 New York City -1,4,225,3,4,10,0,SSN 697 Indianapolis -1,4,225,3,4,11,0,SSN 698 Bremerton -1,4,225,3,4,12,0,SSN 699 Jacksonville -1,4,225,3,4,13,0,SSN 700 Dallas -1,4,225,3,4,14,0,SSN 701 La Jolla -1,4,225,3,4,15,0,SSN 702 Phoenix -1,4,225,3,4,16,0,SSN 703 Boston -1,4,225,3,4,17,0,SSN 704 Baltimore -1,4,225,3,4,18,0,SSN 705 City of Corpus Christi -1,4,225,3,4,19,0,SSN 706 Albuquerque -1,4,225,3,4,20,0,SSN 707 Portsmouth -1,4,225,3,4,21,0,SSN 708 Minneapolis-Saint Paul -1,4,225,3,4,22,0,SSN 709 Hyman G. Rickover -1,4,225,3,4,23,0,SSN 710 Augusta -1,4,225,3,4,24,0,SSN 711 San Francisco -1,4,225,3,4,25,0,SSN 712 Atlanta -1,4,225,3,4,26,0,SSN 713 Houston -1,4,225,3,4,27,0,SSN 714 Norfolk -1,4,225,3,4,28,0,SSN 715 Buffalo -1,4,225,3,4,29,0,SSN 716 Salt Lake City -1,4,225,3,4,30,0,SSN 717 Olympia -1,4,225,3,4,31,0,SSN 718 Honolulu -1,4,225,3,4,32,0,SSN 719 Providence -1,4,225,3,4,33,0,SSN 720 Pittsburgh -1,4,225,3,4,34,0,SSN 721 Chicago -1,4,225,3,4,35,0,SSN 722 Key West -1,4,225,3,4,36,0,SSN 723 Oklahoma City -1,4,225,3,4,37,0,SSN 724 Louisville -1,4,225,3,4,38,0,SSN 725 Helena -1,4,225,3,4,39,0,SSN 750 Newport News -1,4,225,3,4,40,0,SSN 751 San Juan -1,4,225,3,4,41,0,SSN 752 Pasadena -1,4,225,3,4,42,0,SSN 753 Albany -1,4,225,3,4,43,0,SSN 754 Topeka -1,4,225,3,4,44,0,SSN 755 Miami -1,4,225,3,4,45,0,SSN 756 Scranton -1,4,225,3,4,46,0,SSN 757 Alexandria -1,4,225,3,4,47,0,SSN 758 Asheville -1,4,225,3,4,48,0,SSN 759 Jefferson City -1,4,225,3,4,49,0,SSN 760 Annapolis -1,4,225,3,4,50,0,SSN 761 Springfield -1,4,225,3,4,51,0,SSN 762 Columbus -1,4,225,3,4,52,0,SSN 763 Santa Fe -1,4,225,3,4,53,0,SSN 764 Boise -1,4,225,3,4,54,0,SSN 765 Montpelier -1,4,225,3,4,55,0,SSN 766 Charlotte -1,4,225,3,4,56,0,SSN 767 Hampton -1,4,225,3,4,57,0,SSN 768 Hartford -1,4,225,3,4,58,0,SSN 769 Toledo -1,4,225,3,4,59,0,SSN 770 Tucson -1,4,225,3,4,60,0,SSN 771 Columbia -1,4,225,3,4,61,0,SSN 772 Greeneville -1,4,225,3,4,62,0,SSN 773 Cheyenne -1,4,225,3,5,0,0,Dolphin Class -1,4,225,3,5,1,0,AGSS 555 Dolphin -1,5,225,0,0,0,0,Other -1,5,225,0,1,0,0,Space Shuttle Vehicle -1,5,225,0,2,0,0,National Launch System (NLS) -1,5,225,0,3,0,0,National Aerospace Plane (NASP) -1,5,225,1,0,0,0,Manned -1,5,225,1,1,0,0,Space Shuttle Orbiter -1,5,225,1,1,1,0,Atlantis -1,5,225,1,1,2,0,Discovery -1,5,225,1,1,3,0,Columbia -1,5,225,1,1,4,0,Endeavor -1,5,225,1,1,5,0,Enterprise -1,5,225,1,2,0,0,Space Station -1,5,225,1,2,1,0,Freedom -1,5,225,2,0,0,0,Unmanned -1,5,225,2,1,0,0,Communication satellite -1,5,225,2,1,1,0,Leasat -1,5,225,2,1,2,0,DSCS -1,5,225,2,1,3,0,Fleetsatcom -1,5,225,2,1,4,0,Milstar -1,5,225,2,1,5,0,SDS -1,5,225,2,1,6,0,Tactical Data Relay Satellite System (TDRSS) -1,5,225,2,1,7,0,Lightsat -1,5,225,2,1,8,0,STEP/Eagle -1,5,225,2,1,9,0,LES/Tacsat -1,5,225,2,2,0,0,Navigation satellite -1,5,225,2,2,1,0,Transit -1,5,225,2,2,2,0,Global Positioning System (GPS) -1,5,225,2,2,3,0,Navstar 41-60 (launch 1996 or 1997) -1,5,225,2,3,0,0,Early Warning satellite -1,5,225,2,3,1,0,DSP -1,5,225,2,4,0,0,Electronic Intelligence (ELINT) satellite -1,5,225,2,4,1,0,Rhyolite -1,5,225,2,4,2,0,Magnum -1,5,225,2,4,3,0,Challet/Vortex -1,5,225,2,4,4,0,Jumpseat -1,5,225,2,5,0,0,Meteorology satellite -1,5,225,2,5,1,0,Defense Meteorological Satellite Program (DMSP) -1,5,225,2,6,0,0,Ocean Surveillance satellite -1,5,225,2,6,1,0,White Cloud -1,5,225,2,7,0,0,Imaging Radar Surveillance satellite -1,5,225,2,7,1,0,Lacrosse -1,5,225,2,8,0,0,Optical Imaging Surveillance satellite -1,5,225,2,8,1,0,KH11 -1,5,225,2,8,2,0,Advanced KH11 -1,5,225,2,9,0,0,SDI satellite -1,5,225,2,9,1,0,Delta 181 -1,5,225,2,9,2,0,E2I (Endo-Exoatmospheric Interceptor) -1,5,225,3,0,0,0,Boosters -1,5,225,3,1,0,0,Atlas -1,5,225,3,2,0,0,Conestoga -1,5,225,3,3,0,0,Delta -1,5,225,3,4,0,0,Pegasus -1,5,225,3,5,0,0,Scout -1,5,225,3,6,0,0,Taurus -1,5,225,3,7,0,0,Titan -1,1,222,0,0,0,0,Other -1,1,222,0,1,0,0,Bridges -1,1,222,0,1,1,0,PMM-2 Amphibious Bridging and Ferry System -1,1,222,0,1,2,0,Amphibious Bridging System (Wheeled) (ABS(W)) -1,1,222,0,1,3,0,MTU-72 armored bridgelayer -1,1,222,0,1,4,0,MTU-20 armored bridgelayer -1,1,222,0,1,5,0,MTU armored bridgelayer -1,1,222,0,1,6,0,TMM truck-mounted treadway -1,1,222,0,1,7,0,KMM truck-mounted treadway -1,1,222,0,1,8,0,DPP-40 floating bridge equipment -1,1,222,0,1,9,0,GSP heavy amphibious ferry -1,1,222,0,1,10,0,PVD-20 airportable -1,1,222,0,1,11,0,PMP heavy folding pontoon -1,1,222,0,1,12,0,PPS heavy girder floating -1,1,222,0,1,13,0,PVM foot suspension -1,1,222,0,1,14,0,LVM light suspension -1,1,222,0,1,15,0,TVM heavy suspension -1,1,222,0,1,16,0,Underwater bridge set -1,1,222,0,1,17,0,MARM sectional arch -1,1,222,0,1,18,0,RMM-4 portable steel fixed -1,1,222,0,1,19,0,SARM sectional deck truss -1,1,222,0,1,20,0,REM-500 railway and road-section -1,1,222,0,1,21,0,NZhM-56 heavy floating railway and road -1,1,222,0,1,22,0,Heavy barge -1,1,222,0,1,23,0,BMK-T bridging boat -1,1,222,0,1,24,0,BMK-130 bridging boat -1,1,222,0,1,25,0,BMK-150 bridging boat -1,1,222,0,1,26,0,BMK-70 bridging boat -1,1,222,0,1,27,0,BMK-90 bridging boat -1,1,222,1,0,0,0,Tank -1,1,222,1,1,0,0,T-80 MBT -1,1,222,1,1,1,0,T-80 -1,1,222,1,1,2,0,T-80B -1,1,222,1,1,3,0,T-80BK -1,1,222,1,1,4,0,T-80BV -1,1,222,1,1,5,0,T-80BVK -1,1,222,1,1,6,0,T-80U -1,1,222,1,2,0,0,T-72 MBT -1,1,222,1,2,1,0,T-72 -1,1,222,1,2,2,0,T-72M -1,1,222,1,2,3,0,T-72K -1,1,222,1,2,4,0,T-72A -1,1,222,1,2,5,0,T-72AK -1,1,222,1,2,6,0,T-72B -1,1,222,1,2,7,0,T-72BK -1,1,222,1,2,8,0,T-72B1 -1,1,222,1,2,9,0,T-72B1K -1,1,222,1,3,0,0,T-64 MBT -1,1,222,1,3,1,0,T-64A -1,1,222,1,3,2,0,T-64AK -1,1,222,1,3,3,0,T-64B -1,1,222,1,3,4,0,T-64BV -1,1,222,1,3,5,0,T-64B1 -1,1,222,1,3,6,0,T-64B1K -1,1,222,1,3,7,0,T-64BV1K -1,1,222,1,3,8,0,T-64R -1,1,222,1,4,0,0,T-62 MBT -1,1,222,1,4,1,0,T-62 -1,1,222,1,4,2,0,T-62K -1,1,222,1,4,3,0,T-62M -1,1,222,1,4,4,0,T-62MK -1,1,222,1,4,5,0,T-62MV -1,1,222,1,4,6,0,T-62M1 -1,1,222,1,5,0,0,T-54 MBT -1,1,222,1,5,1,0,T-54 -1,1,222,1,5,2,0,T-54K -1,1,222,1,5,3,0,T-54B -1,1,222,1,5,4,0,T-54BK -1,1,222,1,5,5,0,T-54M -1,1,222,1,5,6,0,T-54MK -1,1,222,1,6,0,0,T-55 MBT -1,1,222,1,6,1,0,T-55 -1,1,222,1,6,2,0,T-55K -1,1,222,1,6,3,0,T-55A -1,1,222,1,6,4,0,T-55AD -1,1,222,1,6,5,0,T-55AK -1,1,222,1,6,6,0,T-55AM -1,1,222,1,6,7,0,T-55AMD -1,1,222,1,6,8,0,T-55AMK -1,1,222,1,6,9,0,T-55AMV -1,1,222,1,6,10,0,T-55M -1,1,222,1,6,11,0,T-55MK -1,1,222,1,6,12,0,T-55MVK -1,1,222,1,8,0,0,PT-76 Amphibious light tank -1,1,222,1,8,1,0,PT-76A -1,1,222,1,8,2,0,PT-76B -1,1,222,1,9,0,0,T-90 MBT -1,1,222,2,0,0,0,Armored fighting vehicle -1,1,222,2,1,0,0,BMP-1 -1,1,222,2,1,1,0,BMP-1, basic model 1970 -1,1,222,2,1,2,0,BMP-1K command -1,1,222,2,1,3,0,BMP-1K3 command -1,1,222,2,1,4,0,BMP-1P w/ AT-4 ATGW -1,1,222,2,1,5,0,BMP-1PK command -1,1,222,2,1,6,0,BRM-1K recon (aka M-1976) -1,1,222,2,1,9,0,BMP-1KShM unarmed command -1,1,222,2,2,0,0,BMP-2 -1,1,222,2,2,1,0,BMP-2 -1,1,222,2,2,2,0,BMP-2D -1,1,222,2,2,3,0,BMP-2K -1,1,222,2,2,4,0,BMP-2 w/ KMT-8/KMT-10 -1,1,222,2,2,5,0,BVP-2 (Czech) -1,1,222,2,3,0,0,BMP-3 -1,1,222,2,3,1,0,BMP-3 [(SIFV) M1990/1] -1,1,222,2,3,2,0,BMP-3 Reconnaissance Vehicle -1,1,222,2,4,0,0,BRDM-2 Reconnaissance vehicle -1,1,222,2,4,1,0,BRDM-2 w/ AT-2 ATGM -1,1,222,2,4,2,0,BRDM-2 w/ AT-3 ATGM -1,1,222,2,4,3,0,BRDM-2 w/ AT-5 ATGM -1,1,222,2,4,4,0,BRDM-2-RKhb NBC -1,1,222,2,4,5,0,BRDM-2U command -1,1,222,2,5,0,0,BTR-40 Reconnaissance vehicle -1,1,222,2,5,1,0,BTR-40 -1,1,222,2,5,2,0,BTR-40B -1,1,222,2,5,3,0,BTR-40A anti-air -1,1,222,2,5,4,0,BTR-40Kh chemical reconnaissance -1,1,222,2,5,5,0,BTR-40zhd railroad -1,1,222,2,6,0,0,BTR-152 -1,1,222,2,6,1,0,BTR-152 -1,1,222,2,6,2,0,BTR-152V -1,1,222,2,6,3,0,BTR-152V1 -1,1,222,2,6,4,0,BTR-152V2 -1,1,222,2,6,5,0,BTR-152V3 -1,1,222,2,6,6,0,BTR-152K -1,1,222,2,6,7,0,BTR-152U -1,1,222,2,6,8,0,BTR-152A -1,1,222,2,7,0,0,MT-LB tracked vehicle -1,1,222,2,7,1,0,MT-LB 1V12 -1,1,222,2,7,2,0,MT-LB 1V13 (battery Fire Direction Center (FDC)) -1,1,222,2,7,3,0,MT-LB 1V14 (battery Command Post) -1,1,222,2,7,4,0,MT-LB 1V15 (battalion command) -1,1,222,2,7,5,0,MT-LB 1V16 (battalion FDC) -1,1,222,2,7,6,0,MT-LB 1V12M (artillery C2) -1,1,222,2,7,7,0,MT-LB 1V13M (artillery C2) -1,1,222,2,7,8,0,MT-LB 1V14M (artillery C2) -1,1,222,2,7,9,0,MT-LB 1V15M (artillery C2) -1,1,222,2,7,10,0,MT-LB 1V16M (artillery C2) -1,1,222,2,7,11,0,MT-LB 1V21 staff command -1,1,222,2,7,12,0,MT-LB 1V22 air defense management -1,1,222,2,7,13,0,MT-LB 1V23 C2 -1,1,222,2,7,14,0,MT-LB 1V24 artillery C3 -1,1,222,2,7,15,0,MT-LB 1V25 AD management -1,1,222,2,7,16,0,MT-LB R-330B jammer -1,1,222,2,7,17,0,MT-LBU command -1,1,222,2,7,18,0,MT-LB SNAR-10 radar -1,1,222,2,7,19,0,MT-LBV snow/swamp -1,1,222,2,7,20,0,MT-LB engineer -1,1,222,2,7,21,0,MT-LB ambulance -1,1,222,2,7,22,0,MT-LBR repair -1,1,222,2,7,23,0,MT-LB w/ AT-6 Anti-Tank Guided Weapon) ATGW -1,1,222,2,8,0,0,BTR-60 -1,1,222,2,8,1,0,BTR-60 -1,1,222,2,8,2,0,BTR-60P -1,1,222,2,8,3,0,BTR-60PA -1,1,222,2,8,4,0,BTR-60PB -1,1,222,2,8,5,0,BTR-60PU -1,1,222,2,8,6,0,BTR-60PBK command -1,1,222,2,8,7,0,BTR-60PU command -1,1,222,2,8,8,0,BTR-60PU-12 air defense command -1,1,222,2,8,9,0,BTR-601V19 FDC -1,1,222,2,8,10,0,BTR-601V18 artillery observation -1,1,222,2,8,11,0,BTR-60 R-145BM communications -1,1,222,2,8,12,0,BTR-60 R-975 forward air controller -1,1,222,2,8,13,0,BTR-60-E-351BR generator -1,1,222,2,8,14,0,BTR-60-P-238T switchboard -1,1,222,2,8,15,0,BTR-60-P-240T switchboard -1,1,222,2,8,16,0,BTR-60-P-241T field telephone -1,1,222,2,9,0,0,BTR-50 Amphibious Tracked APC -1,1,222,2,9,1,0,BTR-50P -1,1,222,2,9,2,0,BTR-50PA -1,1,222,2,9,3,0,BTR-50PK -1,1,222,2,9,4,0,BTR-50PU -1,1,222,2,9,5,0,BTR-50PU R82 -1,1,222,2,9,6,0,BTR-50PU-11 -1,1,222,2,9,7,0,BTR-50PUM -1,1,222,2,9,8,0,BTR-50PUR -1,1,222,2,9,9,0,BTR-50PK(B) -1,1,222,2,9,10,0,MTP technical support -1,1,222,2,9,11,0,MTK mineclearing -1,1,222,2,9,12,0,MTR-1 repair -1,1,222,2,11,0,0,BMD airborne fire support vehicle -1,1,222,2,11,1,0,BMD-1 -1,1,222,2,11,2,0,BMD-1P w/ AT-3 ATGW -1,1,222,2,11,3,0,BMD-2 -1,1,222,2,11,4,0,BMD w/ 82-mm mortar -1,1,222,2,11,5,0,BMD KShM command -1,1,222,2,11,6,0,BTR-D -1,1,222,2,11,7,0,BMD-3 -1,1,222,2,12,0,0,BTR-70 -1,1,222,2,12,1,0,BTR-70 -1,1,222,2,12,2,0,BTR-70 M1986/1 -1,1,222,2,12,3,0,BTR-70Kh chemical reconnaissance -1,1,222,2,12,4,0,BTR-70 w/ AGS-17 -1,1,222,2,12,5,0,SPR-2 (poss jammer) -1,1,222,2,12,6,0,BTR-70MS communications -1,1,222,2,12,7,0,BTR-70KShM command/staff -1,1,222,2,12,8,0,BTR-70 BREM repair -1,1,222,2,13,0,0,BTR-80 -1,1,222,2,13,1,0,BTR-80 -1,1,222,2,13,2,0,BTR-80 M1981/1 command -1,1,222,2,13,3,0,BTR-80 RKhM-4 chemical & reconnaissance -1,1,222,2,15,0,0,BRDM-1 Reconnaissance vehicle -1,1,222,2,15,1,0,BRDM-1 -1,1,222,2,15,2,0,BRDM-1-RKhb -1,1,222,2,15,3,0,BRDM-U -1,1,222,2,16,0,0,BTR-90 -1,1,222,3,0,0,0,Armored utility vehicle -1,1,222,3,1,0,0,BTS-2 medium armored tractor -1,1,222,3,2,0,0,MTP maintenance vehicle -1,1,222,3,3,0,0,IMR combat engeer vehicle -1,1,222,3,4,0,0,IRM engineer reconnaissance vehicle -1,1,222,3,5,0,0,BAT-2 combat engineer vehicle -1,1,222,3,6,0,0,MT-LB engineer vehicle -1,1,222,3,7,0,0,BTU tank-mounted bulldozer -1,1,222,3,8,0,0,BTU-55 tank-mounted bulldozer -1,1,222,3,9,0,0,BREM-1 recovery and repair vehicle -1,1,222,3,10,0,0,M1977 armored recovery vehicle -1,1,222,3,11,0,0,T-54-T armored recovery vehicle -1,1,222,3,12,0,0,T-55-T armored recovery vehicle -1,1,222,3,13,0,0,T-55-TK armored recovery vehicle -1,1,222,3,14,0,0,BTR-50PK(B) amphibious recovery vehicle -1,1,222,3,15,0,0,BREM-4 light recovery vehicle -1,1,222,3,16,0,0,MTP-LB technical support vehicle -1,1,222,4,0,0,0,Self-propelled artillery -1,1,222,4,1,0,0,M-1973 152-mm gun (2S3) (SO-152) -1,1,222,4,2,0,0,M-1974 122-mm Howitzer (2S1) (SO-122) -1,1,222,4,6,0,0,Frog-3 rocket launcher -1,1,222,4,7,0,0,Frog-4 rocket launcher -1,1,222,4,8,0,0,Frog-5 rocket launcher -1,1,222,4,9,0,0,Frog-7 rocket launcher -1,1,222,4,10,0,0,SS-1 Scud missile launcher -1,1,222,4,10,1,0,Scud A -1,1,222,4,10,2,0,Scud B -1,1,222,4,10,3,0,Scud C -1,1,222,4,12,0,0,BM-14-17 140-mm rocket launcher -1,1,222,4,13,0,0,BM-21 122-mm rocket launcher -1,1,222,4,14,0,0,M-1975 120-mm rocket launcher -1,1,222,4,15,0,0,BM-24 240-mm rocket launcher -1,1,222,4,16,0,0,BM-25 250-mm rocket launcher -1,1,222,4,18,0,0,ZSU-23/4 Quad 23-mm AAA -1,1,222,4,19,0,0,SA-6 SAM -1,1,222,4,19,1,0,SA-6A -1,1,222,4,19,2,0,SA-6B -1,1,222,4,20,0,0,SA-9 SAM -1,1,222,4,21,0,0,SA-13 SAM -1,1,222,4,21,1,0,Strela-10M2 -1,1,222,4,21,2,0,Strela-10M3 -1,1,222,4,22,0,0,2S6 Quad 30-mm/SA-19 AD system -1,1,222,4,23,0,0,2S4 M-1975 240-mm mortar -1,1,222,4,24,0,0,2S7 M-1975 203-mm gun -1,1,222,4,25,0,0,M-1976 152-mm gun (2S5)(MSTA-B) -1,1,222,4,26,0,0,152-mm 2S19 (aka MSTA-S) -1,1,222,4,27,0,0,120-mm Howitzer/mortar (2S9) (SO-120) -1,1,222,4,28,0,0,120-mm Howitzer/mortar (2S23) -1,1,222,4,29,0,0,300-mm BM-30 14/12-round multiple rocket systems (9A52 Smerch) -1,1,222,4,30,0,0,220-mm BM-22 16-round multiple rocket system (M1977 Uragan) -1,1,222,4,31,0,0,200-mm 4-round BMD-20 multiple rocket system -1,1,222,4,32,0,0,140-mm 16-round RPU-14 multiple rocket system -1,1,222,4,34,0,0,ZSU-57-2 twin 57-mm anti-aircraft gun system -1,1,222,4,35,0,0,BTR-40A w/ ZTPU-2 mount -1,1,222,4,36,0,0,BTR-152A w/ ZTPU-2 mount -1,1,222,4,37,0,0,BTR-152D w/ twin 14.5-mm ZPU-2 mount -1,1,222,4,38,0,0,BTR-152 w/ twin 23-mm ZU-23 -1,1,222,4,39,0,0,BTR-152 with M53 MGs -1,1,222,4,40,0,0,SA-4 -1,1,222,4,41,0,0,SA-8 Gecko SAM -1,1,222,4,41,1,0,SA-8 -1,1,222,4,41,2,0,SA-8A -1,1,222,4,41,3,0,SA-8B -1,1,222,4,42,0,0,SA-10B Mod 1 Grumble SAM -1,1,222,4,43,0,0,SA-11 Gadfly SAM -1,1,222,4,44,0,0,SA-12A Gladiator SAM -1,1,222,4,45,0,0,SA-12A ATBM -1,1,222,4,46,0,0,SA-X-12B Giant SAM -1,1,222,4,47,0,0,SA-X-12B SAM (rail w/ SS-24) -1,1,222,4,48,0,0,SA-15 Gauntlet SAM -1,1,222,4,49,0,0,SA-X-17 SAM (replaces SA-11) -1,1,222,4,50,0,0,SA-19 SAM -1,1,222,4,51,0,0,SS-21 -1,1,222,5,0,0,0,Towed artillery -1,1,222,5,1,0,0,S-23 180-mm field gun -1,1,222,5,2,0,0,2A36 (M1976) 152-mm field gun -1,1,222,5,3,0,0,D-20 152-mm gun-Howitzer -1,1,222,5,4,0,0,D-30 122-mm gun-Howitzer -1,1,222,5,5,0,0,M-46 130-mm field gun -1,1,222,5,6,0,0,D-30 field Howitzer -1,1,222,5,7,0,0,T-12/MT-12 100-mm antitank gun -1,1,222,5,8,0,0,SD-44 gun -1,1,222,5,8,1,0,SD-44 85-mm auxiliary-propelled field gun -1,1,222,5,9,0,0,M-1966 76.2-mm mountain gun -1,1,222,5,11,0,0,M-240 (aka M1953 or M53) 240-mm mortar -1,1,222,5,14,0,0,2A65 (M1987) 152-mm gun/Howitzer -1,1,222,5,16,0,0,M1943 (D-1) 152-mm Howitzer -1,1,222,5,17,0,0,M1937 (ML-20) 152-mm gun/Howitzer -1,1,222,5,19,0,0,D-74 122-mm field gun -1,1,222,5,21,0,0,M1938 (M-30) 122-mm Howitzer -1,1,222,5,22,0,0,2B16 120-mm combination gun -1,1,222,5,23,0,0,M1944 (BS-3) 100-mm field gun -1,1,222,5,24,0,0,D-48 85-mm antitank gun -1,1,222,5,25,0,0,M-1945 (D-44) 85-mm antitank gun -1,1,222,5,26,0,0,Vasilyek 82-mm automatic mortar -1,1,222,5,27,0,0,M1942 (ZIS-3) 76-mm divisional gun -1,1,222,5,28,0,0,SM-4-1 130-mm coastal gun -1,1,222,5,29,0,0,SPG-9 73-mm recoilless gun -1,1,222,5,30,0,0,B-10 82-mm recoilless gun -1,1,222,5,31,0,0,B-11 107-mm recoilless gun -1,1,222,5,32,0,0,KS-30 130-mm AA gun -1,1,222,5,33,0,0,KS-19 100-mm AA gun -1,1,222,5,34,0,0,S-60 57-mm AAA gun -1,1,222,5,35,0,0,M1939 37-mm AAA gun -1,1,222,5,36,0,0,ZU-23 twin 23-mm AAA gun -1,1,222,5,37,0,0,14.5-mm ZPU AA MG -1,1,222,5,37,1,0,ZPU-1 -1,1,222,5,37,2,0,ZPU-2 -1,1,222,5,37,3,0,ZPU-4 -1,1,222,5,38,0,0,125-mm AT Gun 2A45M -1,1,222,6,0,0,0,Small wheeled utility vehicle -1,1,222,6,1,0,0,GAZ-69 4x4 light vehicle -1,1,222,6,2,0,0,UAZ-469B 4x4 600-kg light vehicle -1,1,222,6,4,0,0,LuAZ-967M amphibious battlefield support vehicle -1,1,222,6,5,0,0,LuAZ-969 4x4 light vehicle -1,1,222,6,6,0,0,GAZ-69A 4x4 light vehicle -1,1,222,6,7,0,0,UAZ-452D 4x4 800-kg light vehicle -1,1,222,7,0,0,0,Large wheeled utility vehicle -1,1,222,7,1,0,0,PZM-2 regimental trench-digging machine -1,1,222,7,4,0,0,ZIL-131 6x6 3500-kg truck -1,1,222,7,5,0,0,ZIL-151 6x6 2500-kg truck -1,1,222,7,6,0,0,ZIL-157 6x6 2500-kg truck -1,1,222,7,8,0,0,GAZ-66 4x4 2000-kg truck -1,1,222,7,9,0,0,Ural-375 6x6 4000-kg truck -1,1,222,7,10,0,0,KamAZ-4310 -1,1,222,7,11,0,0,Ural-4320 6x6 4500-kg trucks -1,1,222,7,13,0,0,KrAZ-255B 6x6 7500-kg truck -1,1,222,7,13,1,0,Fuel service -1,1,222,7,14,0,0,Ural-375D 6x6 recovery vehicle -1,1,222,7,15,0,0,Ural-4320 6x6 recovery vehicle -1,1,222,7,16,0,0,KET-L 6x6 recovery truck -1,1,222,7,17,0,0,GAZ-53 4x2 3000-kg truck -1,1,222,7,18,0,0,Ural-377 6x4 7500-kg truck -1,1,222,7,19,0,0,ZIL-133 6x4 8000 kg-truck -1,1,222,7,20,0,0,YaAZ-214 6x6 7000-kg truck -1,1,222,7,21,0,0,KrAZ-214 6x6 7000-kg truck -1,1,222,7,22,0,0,KrAZ-206V 6x6 tractor truck -1,1,222,7,23,0,0,KamAZ-5320 6x4 8000-kg truck -1,1,222,7,24,0,0,KrAZ-260 6x6 9000-kg truck -1,1,222,7,25,0,0,KrAZ-240 6x6 9000-kg truck -1,1,222,7,26,0,0,Ural-5323 8x8 9000-kg truck -1,1,222,7,27,0,0,KrAZ-257 6x4 12000-kg truck -1,1,222,7,28,0,0,ZIL-135 series 8x8 truck -1,1,222,7,29,0,0,MAZ-543 8x8 truck -1,1,222,7,30,0,0,BAZ-5937 6x6 special purpose vehicle -1,1,222,7,31,0,0,BAZ-5939 6x6 special purpose vehicle -1,1,222,7,32,0,0,MAZ-535 and MAZ-537 8x8 series -1,1,222,7,33,0,0,TMK-2 trench-digging machine -1,1,222,7,34,0,0,PZM regimental trench-digging machine -1,1,222,7,35,0,0,OPS mobile water-desalination plant -1,1,222,7,36,0,0,POU mobile water-desalination plant -1,1,222,7,37,0,0,LBU-200 mobile well-drilling equipment -1,1,222,8,0,0,0,Small tracked utility vehicle -1,1,222,8,1,0,0,AT-L light artillery tractor -1,1,222,8,2,0,0,AT-LM light artillery tractor -1,1,222,8,3,0,0,ATS-59G medium artillery tractor -1,1,222,8,4,0,0,ATS-59 medium artillery tractor -1,1,222,8,5,0,0,MT-S medium transporter -1,1,222,8,6,0,0,GT-SM amphibious over-snow vehicle -1,1,222,8,7,0,0,GT-T amphibious over-snow vehicle -1,1,222,8,8,0,0,MT-L amphibious over-snow vehicle -1,1,222,9,0,0,0,Large tracked utility vehicle -1,1,222,9,1,0,0,PTS amphibious transport -1,1,222,9,2,0,0,PTS-M amphibious vehicle -1,1,222,9,3,0,0,PTS-2 amphibious vehicle -1,1,222,9,4,0,0,MTK-2 armored mineclearing vehicle -1,1,222,9,5,0,0,AT-T heavy artillery tractor -1,1,222,9,6,0,0,MT-T heavy transporter -1,1,222,9,7,0,0,GM-569 tractor -1,1,222,9,8,0,0,BTM high-speed ditching machine -1,1,222,9,9,0,0,BTM-3 high-speed ditching machine -1,1,222,9,10,0,0,BTM-TMG high-speed ditching machine -1,1,222,9,11,0,0,BTM-TMG2S high-speed ditching machine -1,1,222,9,12,0,0,MDK-2 trench-digging machine -1,1,222,9,13,0,0,MDK-2M trench-digging machine -1,1,222,9,14,0,0,MDK-3 trench-digging machine -1,1,222,9,15,0,0,BAT-1 high-speed tractor-mounted bulldozer -1,1,222,9,16,0,0,BAT-M high-speed tractor-mounted bulldozer -1,1,222,9,17,0,0,OLT high-speed tractor-mounted bulldozer -1,1,222,9,18,0,0,OST high-speed tractor-mounted bulldozer -1,1,222,9,19,0,0,OTT high-speed tractor-mounted bulldozer -1,1,222,9,20,0,0,GMZ Mine Layer -1,1,222,10,0,0,0,Mortar -1,1,222,10,7,0,0,M-36 82-mm -1,1,222,10,8,0,0,M-37 82-mm -1,1,222,10,9,0,0,M-37 82-mm "new" -1,1,222,10,10,0,0,M-41 82-mm -1,1,222,10,11,0,0,AM 2B9 "Vasilek" 82-mm automatic -1,1,222,10,12,0,0,M-38 107-mm -1,2,222,1,0,0,0,Fighter/Air Defense -1,2,222,1,1,0,0,MiG-31 Foxhound -1,2,222,1,1,1,0,MiG-31 Foxhound-A -1,2,222,1,1,2,0,MiG-31M Foxhound-B -1,2,222,1,2,0,0,MiG-29 Fulcrum -1,2,222,1,2,1,0,MiG-29 Fulcrum A -1,2,222,1,2,2,0,MiG-29UB Fulcrum B -1,2,222,1,2,3,0,MiG-29 Fulcrum C -1,2,222,1,2,4,0,MiG-29K Fulcrum D -1,2,222,1,2,5,0,MiG-29M advanced version -1,2,222,1,2,6,0,MiG-29 thrust vectoring -1,2,222,1,2,7,0,MiG-29KU ship-based trainer -1,2,222,1,3,0,0,Su-27 Flanker -1,2,222,1,3,1,0,Su-27 Flanker A prototypes -1,2,222,1,3,2,0,Su-27 Flanker B production -1,2,222,1,3,3,0,Su-27UB Flanker C -1,2,222,1,3,4,0,Su-27K Flanker D -1,2,222,1,3,5,0,Su-27IB -1,2,222,1,4,0,0,MiG-25 Foxbat -1,2,222,1,4,1,0,MiG-25P Foxbat A -1,2,222,1,4,2,0,MiG-25RB Foxbat B -1,2,222,1,4,3,0,MiG-25RBV Foxbat B -1,2,222,1,4,4,0,MiG-25BBT Foxbat B -1,2,222,1,4,5,0,MiG-25R Foxbat B -1,2,222,1,4,6,0,MiG-25PU Foxbat C -1,2,222,1,4,7,0,MiG-25RU Foxbat C -1,2,222,1,4,8,0,MiG-25U Foxbat C -1,2,222,1,4,9,0,MiG-25RBK Foxbat D -1,2,222,1,4,10,0,MiG-25RBS Foxbat D -1,2,222,1,4,11,0,MiG-25RBSh Foxbat D -1,2,222,1,4,12,0,MiG-25RBF Foxbat D -1,2,222,1,4,13,0,MiG-25PD Foxbat E -1,2,222,1,4,14,0,MiG-25PDS Foxbat E -1,2,222,1,4,15,0, MiG-25BM Foxbat F -1,2,222,1,5,0,0,MiG-23/24 Flogger -1,2,222,1,5,1,0,MiG-23M Flogger B -1,2,222,1,5,2,0,MiG-23MF Flogger B -1,2,222,1,5,3,0,MiG-23UB Flogger C -1,2,222,1,5,4,0,MiG-23UM Flogger C -1,2,222,1,5,5,0,MiG-23MF Flogger E -1,2,222,1,5,6,0,MiG-23MS Flogger E -1,2,222,1,5,7,0,MiG-23BN Flogger F -1,2,222,1,5,8,0,MiG-23BM Flogger F -1,2,222,1,5,9,0,MiG-23B Flogger F -1,2,222,1,5,10,0,MiG-23ML Flogger G -1,2,222,1,5,11,0,MiG-23P Flogger G -1,2,222,1,5,12,0,MiG-23BK Flogger H -1,2,222,1,5,13,0,MiG-23BN Flogger H -1,2,222,1,5,14,0,MiG-23MLD Flogger K -1,2,222,1,5,15,0,MiG-24 (export MiG-23) -1,2,222,1,6,0,0,MiG-21 Fishbed/Mongol -1,2,222,1,6,1,0,MiG-21F Fishbed C -1,2,222,1,6,2,0,MiG-21PF Fishbed D -1,2,222,1,6,3,0,MiG-21PFM Fishbed F -1,2,222,1,6,4,0,MiG-21R Fishbed H -1,2,222,1,6,5,0,MiG-21S Fishbed H -1,2,222,1,6,6,0,MiG-21RF Fishbed H -1,2,222,1,6,7,0,MiG-21SM Fishbed J -1,2,222,1,6,8,0,MiG-21M (Type 96/Hindustan Aeronautics-India) -1,2,222,1,6,9,0,MiG-21PFMA Fishbed J -1,2,222,1,6,10,0,MiG-21MF Fishbed J -1,2,222,1,6,11,0,MiG-21SMT Fishbed K -1,2,222,1,6,12,0,MiG-21SMB Fishbed K -1,2,222,1,6,13,0,MiG-21bis-A Fishbed L -1,2,222,1,6,14,0,MiG-21bis-B Fishbed N -1,2,222,1,6,15,0,MiG-21U Mongol A -1,2,222,1,6,16,0,MiG-21US Mongol B -1,2,222,1,6,17,0,MiG-21UM Mongol B -1,2,222,1,10,0,0,Su-15 Flagon -1,2,222,1,10,1,0,Su-15TM Flagon E -1,2,222,1,10,2,0,Su-15bis Flagon F -1,2,222,1,10,3,0,Su-15 trainer -1,2,222,1,11,0,0,Tu-128 Fiddler -1,2,222,1,11,1,0,Tu-128P Fiddler -1,2,222,1,13,0,0,Yak-28 Firebar -1,2,222,1,13,1,0,Yak-28P -1,2,222,1,13,2,0,Yak-28PA -1,2,222,1,13,3,0,Yak-28PB -1,2,222,2,0,0,0,Attack/Strike -1,2,222,2,1,0,0,MiG-27 Flogger -1,2,222,2,1,1,0,MiG-27 Flogger D -1,2,222,2,1,2,0,MiG-27K Flogger D -1,2,222,2,1,3,0,MiG-27D Flogger J -1,2,222,2,1,4,0,MiG-27M (Bahadur-India) -1,2,222,2,4,0,0,Su-17 Fitter -1,2,222,2,4,1,0,Su-17 (S-32, Fitter C) -1,2,222,2,4,2,0,Su-17M (S-32M, Fitter C) -1,2,222,2,4,3,0,Su-17R Fitter C -1,2,222,2,4,4,0,Su-17M-2/M-2D (S-32M2, Fitter D) -1,2,222,2,4,5,0,Su-17UM-2D (U-32, Fitter E) -1,2,222,2,4,6,0,Su-17UM-3 Fitter G -1,2,222,2,4,7,0,Su-17M-3 (S-52, Fitter H) -1,2,222,2,4,8,0,Su-17-1/M-2 Fitter H -1,2,222,2,4,9,0,Su-17M-4 (S-54, Fitter K) -1,2,222,2,5,0,0,Su-20 Fitter C (Export Su-17) -1,2,222,2,5,1,0,Su-20 (S32Mk, Fitter-C) -1,2,222,2,5,2,0,Su-20R -1,2,222,2,6,0,0,Su-22 Fitter -1,2,222,2,6,1,0,Su-22U Fitter E -1,2,222,2,6,2,0,Su-22 Fitter F -1,2,222,2,6,3,0,Su-22UM-3K Fitter G -1,2,222,2,6,4,0,Su-22 Fitter G -1,2,222,2,6,5,0,Su-22M-3 Fitter J -1,2,222,2,6,6,0,Su-22M-4 Fitter K -1,2,222,2,7,0,0,Su-24 Fencer -1,2,222,2,7,1,0,Su-24 Fencer B -1,2,222,2,7,2,0,Su-24 Fencer C -1,2,222,2,7,3,0,Su-24MK Fencer D -1,2,222,2,7,4,0,Su-24MR Fencer E -1,2,222,2,7,5,0,Su-24MP Fencer F -1,2,222,2,8,0,0,Su-25 Frogfoot -1,2,222,2,8,1,0,Su-25 Frogfoot A -1,2,222,2,8,2,0,Su-25UB Frogfoot B -1,2,222,2,8,3,0,Su-25K (export "A") -1,2,222,2,8,4,0,Su-25UBK (export "UB") -1,2,222,2,8,5,0,Su-25UT Frogfoot B -1,2,222,2,8,6,0,Su-25UTG (tailhook) -1,2,222,2,8,7,0,Su-25T (Su-34) (antitank) -1,2,222,2,8,8,0,Su-25BM (target towing) -1,2,222,2,9,0,0,Su-37 multirole fighter -1,2,222,2,10,0,0,Yak-38 Forger -1,2,222,2,10,1,0,Yak-38 Forger A -1,2,222,2,10,2,0,Yak-38 Forger B -1,2,222,3,0,0,0,Bomber -1,2,222,3,1,0,0,Tu-160 Blackjack -1,2,222,3,2,0,0,Tu-16 Badger -1,2,222,3,2,1,0,Tu-16A Badger A -1,2,222,3,2,2,0,Tu-16N Badger A, tanker -1,2,222,3,2,3,0,Tu-16T Badger A, torpedo -1,2,222,3,2,4,0,Tu-16KS-1 Badger B -1,2,222,3,2,5,0,Tu-16 Korvet, Search and Rescue (SAR) -1,2,222,3,2,6,0,Tu-16 K-10 Badger C -1,2,222,3,2,7,0,Tu-16R Badger D -1,2,222,3,2,8,0,Tu-16 Badger E, photo reconnaissance -1,2,222,3,2,9,0,Tu-16R Badger F, ELINT -1,2,222,3,2,10,0,Tu-16 Badger-G, ASM carrier -1,2,222,3,2,11,0,Tu-16K Badger G Mod -1,2,222,3,2,12,0,Tu-16PP Badger H, chaff dispenser -1,2,222,3,2,13,0,Tu-16PP Badger J, ECM -1,2,222,3,2,14,0,Tu-16R Badger K, reconnaissance -1,2,222,3,2,15,0,Tu-16 Badger L, EW -1,2,222,3,3,0,0,Tu-26 Backfire -1,2,222,3,3,1,0,Tu-22M-1 Backfire A -1,2,222,3,3,2,0,Tu-22M-2 Backfire B -1,2,222,3,3,3,0,Tu-22M-3 Backfire C -1,2,222,3,4,0,0,Tu-22 Blinder -1,2,222,3,4,1,0,Tu-22 Blinder-A -1,2,222,3,4,2,0,Tu-22 Blinder-B -1,2,222,3,4,3,0,Tu-22 Blinder-C, reconnaissance -1,2,222,3,4,4,0,Tu-22U Blinder-D -1,2,222,3,4,5,0,Tu-22 Blinder-E, EW/reconnaissance -1,2,222,3,5,0,0,Tu-95 or Tu-142 Bear -1,2,222,3,5,1,0,Tu-95 Bear D, sea reconnaissance -1,2,222,3,5,2,0,Tu-95 Bear E ("A" conversion) -1,2,222,3,5,3,0,Tu-95 Bear G ("B/C" ELINT conversion) -1,2,222,3,5,4,0,Tu-95MS Bear H -1,2,222,3,5,5,0,Tu-142 Bear F, ASW -1,2,222,3,5,6,0,Tu-142 Bear F Mod 1 -1,2,222,3,5,7,0,Tu-142M Bear F Mod 2 -1,2,222,3,5,8,0,Tu-142 Bear F Mod 3 -1,2,222,3,5,9,0,Tu-142 Bear F Mod 4 -1,2,222,3,5,10,0,Tu-142 Bear J, VLF Communications -1,2,222,3,5,11,0,Tu-142K Bear H -1,2,222,4,0,0,0,Cargo/Tanker -1,2,222,4,1,0,0,An-124 Condor -1,2,222,4,1,1,0,An-124 -1,2,222,4,2,0,0,An-22 Cock -1,2,222,4,2,1,0,An-22 -1,2,222,4,3,0,0,Il-76 Candid -1,2,222,4,3,1,0,Il-76 Candid A -1,2,222,4,3,2,0,Il-76T Candid A, civil reserve -1,2,222,4,3,3,0,Il-76M Candid B -1,2,222,4,3,4,0,Il-76TD Candid A, civil reserve -1,2,222,4,3,5,0,Il-76MD Candid B -1,2,222,4,4,0,0,Il-20/22 Coot -1,2,222,4,4,1,0,Il-20 Coot A, ELINT/recon (Il-18 variant) -1,2,222,4,4,2,0, Il-22 Coot B -1,2,222,4,5,0,0,An-12 Cub -1,2,222,4,5,1,0,An-12BP -1,2,222,4,5,2,0,An-12A Cub A, ELINT -1,2,222,4,5,3,0,An-12B Cub B, SNA ELINT -1,2,222,4,5,4,0,An-12C Cub C, SNA ECM -1,2,222,4,5,5,0,An-12D Cub D, SNA ECM -1,2,222,4,6,0,0,An-24 Coke -1,2,222,4,6,1,0,An-24 -1,2,222,4,7,0,0,An-26 Curl -1,2,222,4,7,1,0,An-26 Curl A, manual -1,2,222,4,7,2,0,An-26B Curl A, pallets -1,2,222,4,7,3,0,An-26 Curl B, SIGINT -1,2,222,4,8,0,0,An-32 Cline -1,2,222,4,8,1,0,An-32 -1,2,222,4,8,2,0,An-32 Sutlej (India) -1,2,222,4,9,0,0,An-70T -1,2,222,4,9,1,0,An-70T -1,2,222,4,10,0,0,An-72 Coaler -1,2,222,4,10,1,0,An-72 -1,2,222,4,11,0,0,An-225 Cossack -1,2,222,4,11,1,0,An-225 -1,2,222,4,12,0,0,Il-78 Midas -1,2,222,4,12,1,0,Il-78 (tanker) -1,2,222,4,13,0,0,An-2 Colt -1,2,222,4,13,1,0,An-2 biplane -1,2,222,5,0,0,0,Antisubmarine/patrol/observation -1,2,222,5,1,0,0,II-38 May -1,2,222,5,1,1,0,Il-38 -1,2,222,5,2,0,0,Be-12 Mail -1,2,222,5,2,1,0,Be-12 -1,2,222,5,3,0,0,Be-42 Mermaid -1,2,222,5,3,1,0,Be-42 -1,2,222,5,5,0,0,A-40 Albatross -1,2,222,5,5,1,0,A-40 -1,2,222,8,0,0,0,Surveillance/C2 -1,2,222,8,1,0,0,A-50 Mainstay -1,2,222,8,1,1,0,A-50 AEW&C -1,2,222,8,2,0,0,An-74 Madcap -1,2,222,8,2,1,0,An-74 -1,2,222,8,3,0,0,TU-126 Moss -1,2,222,8,3,1,0,Tu-126 -1,2,222,20,0,0,0,Attack helicopter -1,2,222,20,1,0,0,Mi-28 Havoc -1,2,222,20,1,1,0,Mi-28 -1,2,222,20,2,0,0,Mi-24/25/35 Hind -1,2,222,20,2,1,0,Mi-24 Hind A -1,2,222,20,2,2,0,Mi-24 Hind B -1,2,222,20,2,3,0,Mi-24 Hind C -1,2,222,20,2,4,0,Mi-24D Hind D (1st gunship) -1,2,222,20,2,5,0,Mi-24W Hind E -1,2,222,20,2,6,0,Mi-24P Hind F -1,2,222,20,2,7,0,Mi-24RSH Hind G1 (NBC armored) -1,2,222,20,2,8,0,Mi-24RSH Hind G2 (reconnaissance/spotter) -1,2,222,20,2,9,0,Mi-25 (export Mi-24D) -1,2,222,20,2,10,0,Mi-35 (export Mi-24W) -1,2,222,20,2,11,0,Mi-35P (export Mi-24P) -1,2,222,20,3,0,0,Ka-50 Hokum -1,2,222,20,3,1,0,Ka-50 Hokum A close air support -1,2,222,20,3,2,0,Ka-50 Hokum B tandem trainer -1,2,222,20,4,0,0,Ka-25 Hormone -1,2,222,20,4,1,0,Ka-25BSh Hormone A, ASW -1,2,222,20,4,2,0,Ka-25 Hormone B (targeting & missile guidance) -1,2,222,20,4,3,0,Ka-25PS Hormone C (targeting & missile guidance) -1,2,222,21,0,0,0,Utility helicopter -1,2,222,21,1,0,0,Mi-8/9/17/171 Hip -1,2,222,21,1,1,0,Mi-8 Hip C (assault) -1,2,222,21,1,2,0,Mi-8 Hip D (airborne communications) -1,2,222,21,1,3,0,Mi-8 Hip E "C" development, 12.7 -1,2,222,21,1,4,0,Mi-8TBK (Mi-17) ("E" uprated) -1,2,222,21,1,5,0,Mi-8 Hip F ("E" export) -1,2,222,21,1,6,0,Mi-8 Hip J (ECM) -1,2,222,21,1,7,0,Mi-8PP Hip K (ECM) -1,2,222,21,1,8,0,Mi-9 Hip G (special duty & airborne communications) -1,2,222,21,1,9,0,Mi-17 Hip H (MI-8 update) -1,2,222,21,1,10,0,Mi-17P (Hip K derivative) -1,2,222,21,1,11,0,Mi-171 Hip H (hospital) -1,2,222,21,1,12,0,Mi-17 (EW) -1,2,222,21,2,0,0,Mi-14 Haze -1,2,222,21,2,1,0,Mi-14PL Haze A (ASW) -1,2,222,21,2,2,0,Mi-14PW (Polish Mi-14PL) -1,2,222,21,2,3,0,Mi-14BT Haze B (MCM) -1,2,222,21,2,4,0,Mi-14PS Haze C (SAR) -1,2,222,21,3,0,0,Mi-26 Halo -1,2,222,21,3,1,0,Mi-26 heavy transport -1,2,222,21,3,2,0,Mi-26TZ tanker -1,2,222,21,3,3,0,Mi-26 communications & support -1,2,222,21,4,0,0,Mi-6 Hook -1,2,222,21,4,1,0,Mi-6 Hook A (export) -1,2,222,21,4,2,0,Mi-6 Hook B (command support) -1,2,222,21,4,3,0,Mi-6 Hook C ("B" development, command support) -1,2,222,21,5,0,0,Mi-2 Hoplite -1,2,222,21,5,1,0,Mi-2 (only mfg in Poland) -1,2,222,21,6,0,0,Mi-4 Hound -1,2,222,21,6,1,0,Mi-4 -1,2,222,21,7,0,0,Mi-10 Harke -1,2,222,21,7,1,0,Mi-10 -1,2,222,21,7,2,0,Mi-10K -1,2,222,21,9,0,0,Ka-27/28/29 Helix -1,2,222,21,9,1,0,Ka-27PL Helix A (ASW) -1,2,222,21,9,2,0,Ka-27PS Helix D (SAR) -1,2,222,21,9,3,0,Ka-28 Helix A (export Ka-27PL) -1,2,222,21,9,4,0,Ka-29TB Helix B (EW & assault) -1,2,222,21,10,0,0,Mi-34 Hermit -1,2,222,21,10,1,0,Mi-34 (1 engine) -1,2,222,21,10,2,0,Mi-34V (2 engine) -1,2,222,21,11,0,0,Mi-38 -1,2,222,21,11,1,0,Mi-38 (2 turbine, replaces Mi-8/17) -1,2,222,21,12,0,0,Ka-26/126 Hoodlum -1,2,222,21,12,1,0,Ka-26 Hoodlum A (reciprocating) -1,2,222,21,12,2,0,Ka-126 Hoodlum B (turbine) -1,2,222,40,0,0,0,Trainer -1,2,222,40,1,0,0,Tu-134 Crusty -1,2,222,40,1,1,0,Tu-134UBL (bomber pilot) -1,2,222,40,1,2,0,Tu-134Bsh (bomber navigator) -1,3,222,1,0,0,0,Carrier -1,3,222,1,1,0,0,Kiev class -1,3,222,1,1,1,0,Kiev -1,3,222,1,1,2,0,Minsk -1,3,222,1,1,3,0,Novorossiysk -1,3,222,1,2,0,0,Ulyanovsk class (CVN) -1,3,222,1,2,1,0,Ulyanovsk (1996) -1,3,222,1,3,0,0,Kuznetsov class (CV) -1,3,222,1,3,1,0,Admiral Kuznetsov (ex-Tbilisi, ex-Leonid Brezhnev) -1,3,222,1,3,2,0,Varyag (ex-Riga) -1,3,222,1,4,0,0,Modified Kiev class (CV) -1,3,222,1,4,1,0,Admiral Gorshkov (ex-Baku) -1,3,222,3,0,0,0,Guided-missile Cruiser -1,3,222,3,1,0,0,Slava class (CG) -1,3,222,3,1,1,0,Slava -1,3,222,3,1,2,0,Marshal Ustinov -1,3,222,3,1,3,0,Chervona Ukraina -1,3,222,3,1,4,0,Admiral Lobov -1,3,222,3,2,0,0,Kirov class -1,3,222,3,2,1,0,Kirov -1,3,222,3,2,2,0,Frunze -1,3,222,3,2,3,0,Kalinin -1,3,222,3,2,4,0,Yuri Andropov -1,3,222,3,3,0,0,Kara class -1,3,222,3,3,1,0,Nikolayev -1,3,222,3,3,2,0,Ochakov -1,3,222,3,3,3,0,Kerch -1,3,222,3,3,4,0,Azov -1,3,222,3,3,5,0,Petropavlovsk -1,3,222,3,3,6,0,Tashkent -1,3,222,3,3,7,0,Vladivostok (ex-Tallinn) -1,3,222,3,4,0,0,Kresta II class -1,3,222,3,4,1,0,Kronshtadt -1,3,222,3,4,2,0,Admiral Isakov -1,3,222,3,4,3,0,Admiral Nakhimov -1,3,222,3,4,4,0,Khabarovsk (ex-Voroshilov) -1,3,222,3,4,5,0,Admiral Oktyabrskiy -1,3,222,3,4,6,0,Admiral Isachenkov -1,3,222,3,4,7,0,Marshal Timoshenko -1,3,222,3,4,8,0,Vasiliy Chapayev -1,3,222,3,4,9,0,Admiral Yumashev -1,3,222,3,4,10,0,Admiral Makarov -1,3,222,3,5,0,0,Kresta I class -1,3,222,3,5,1,0,Admiral Zozulya -1,3,222,3,6,0,0,Kynda class -1,3,222,3,6,1,0,Grozny -1,3,222,3,6,2,0,Admiral Fokin -1,3,222,3,6,3,0,Admiral Golovko -1,3,222,4,0,0,0,Guided-missile Destroyer -1,3,222,4,1,0,0,Udaloy class -1,3,222,4,1,1,0,Udaloy -1,3,222,4,1,2,0,Vitse Admiral Kulakov -1,3,222,4,1,3,0,Marshal Vasilevsky -1,3,222,4,1,4,0,Admiral Zakharov -1,3,222,4,1,5,0,Admiral Spiridonov -1,3,222,4,1,6,0,Admiral Tributs -1,3,222,4,1,7,0,Marshal Shaposhnikov -1,3,222,4,1,8,0,Simferopol (ex-Marshal Buokenny) -1,3,222,4,1,9,0,Admiral Levchenko -1,3,222,4,1,10,0,Admiral Vinogradov -1,3,222,4,1,11,0,Admiral Kharlamov -1,3,222,4,1,12,0,Admiral Panteleyev -1,3,222,4,2,0,0,Sovremennyy class -1,3,222,4,2,1,0,Sovremennyy -1,3,222,4,2,2,0,Otchayannyy -1,3,222,4,2,3,0,Otlichnny -1,3,222,4,2,4,0,Osmotritelny -1,3,222,4,2,5,0,Bezuprechny -1,3,222,4,2,6,0,Boyevoy -1,3,222,4,2,7,0,Stoyky -1,3,222,4,2,8,0,Okrylenny -1,3,222,4,2,9,0,Burny -1,3,222,4,2,10,0,Gremyashchy -1,3,222,4,2,11,0,Bystry -1,3,222,4,2,12,0,Rastoropny -1,3,222,4,2,13,0,Bezboyaznenny -1,3,222,4,2,14,0,Bezuderzhny -1,3,222,4,2,15,0,Bespokoiny -1,3,222,4,3,0,0,Modified Kashin class -1,3,222,4,3,3,0,Sderzhandoyy -1,3,222,4,3,5,0,Smyshlennyy -1,3,222,4,4,0,0,Kashin class -1,3,222,4,4,1,0,Komsomolets Ukrainyy -1,3,222,4,4,2,0,Krasnyy Kavkaz -1,3,222,4,4,3,0,Krasnyy Krym -1,3,222,4,4,4,0,Obraztsovyy -1,3,222,4,4,5,0,Odarennyy -1,3,222,4,4,7,0,Reshitelnyy -1,3,222,4,4,8,0,Skoryy -1,3,222,4,4,9,0,Smetlivvy -1,3,222,4,4,11,0,Sposobnyy -1,3,222,6,0,0,0,Guided-missile Frigate (includes Corvette) -1,3,222,6,1,0,0,Krivak I class -1,3,222,6,1,1,0,Bditelny -1,3,222,6,1,2,0,Bezukoriznenny -1,3,222,6,1,3,0,Bezzavetny -1,3,222,6,1,4,0,Bodry -1,3,222,6,1,5,0,Deyatelny -1,3,222,6,1,6,0,Doblestny -1,3,222,6,1,7,0,Dostoyny -1,3,222,6,1,8,0,Druzhny -1,3,222,6,1,9,0,Ladny -1,3,222,6,1,10,0,Leningradskiy -1,3,222,6,1,11,0,Komsomolets -1,3,222,6,1,12,0,Letuchy -1,3,222,6,1,14,0,Razumny -1,3,222,6,1,15,0,Razyashchiy -1,3,222,6,1,16,0,Retivy -1,3,222,6,1,17,0,Silnyy -1,3,222,6,1,18,0,Storozhevoy -1,3,222,6,1,19,0,Svirepyy -1,3,222,6,1,20,0,Zadorny -1,3,222,6,1,21,0,Zharky -1,3,222,6,1,22,0,Pylky -1,3,222,6,1,23,0,Poryvisty -1,3,222,6,2,0,0,Krivak II class -1,3,222,6,2,1,0,Bessmenny -1,3,222,6,2,2,0,Gordelivy -1,3,222,6,2,3,0,Gromky -1,3,222,6,2,4,0,Grozyashchy -1,3,222,6,2,5,0,Neukrotimy -1,3,222,6,2,6,0,Pitlivy -1,3,222,6,2,7,0,Razitelny -1,3,222,6,2,8,0,Revnosttny -1,3,222,6,2,9,0,Rezky -1,3,222,6,2,10,0,Rezvy -1,3,222,6,2,11,0,Ryanny -1,3,222,6,4,0,0,Neustrashimy class (FFG) -1,3,222,6,4,1,0,Neustrashimy -1,3,222,6,5,0,0,Tarantul I class (Corvette) -1,3,222,6,6,0,0,Tarantul II class (Corvette) -1,3,222,6,7,0,0,Nanuchka I class (Corvette) -1,3,222,6,7,1,0,Grad -1,3,222,6,7,2,0,Raduga -1,3,222,6,7,3,0,Suval -1,3,222,6,7,4,0,Storm -1,3,222,6,7,5,0,Taifun -1,3,222,6,7,6,0,Zyklon -1,3,222,6,7,7,0,Metl -1,3,222,6,7,8,0,Zarnitsa -1,3,222,6,7,9,0,Grom -1,3,222,6,7,10,0,Molnija -1,3,222,6,7,11,0,Musson -1,3,222,6,8,0,0,Nanuchka III class (Corvette) -1,3,222,6,9,0,0,Nanuchka IV class (Corvette) -1,3,222,6,10,0,0,Tarantul III class (Corvette) -1,3,222,7,0,0,0,Light/Patrol craft -1,3,222,7,1,0,0,2/3 T 58 PGF/PGR class (patrol) -1,3,222,7,2,0,0,Dergach class (light missile force) -1,3,222,7,2,1,0,Sivuch -1,3,222,7,3,0,0,OSA I class -1,3,222,7,4,0,0,OSA II class -1,3,222,7,5,0,0,Poti class (fast attack craft--patrol) -1,3,222,7,6,0,0,Svetlyak class (fast attack craft--patrol) -1,3,222,7,7,0,0,Pauk I class (fast attack craft--patrol) -1,3,222,7,8,0,0,Zhuk class -1,3,222,7,9,0,0,Yaz class -1,3,222,7,10,0,0,Stenka class -1,3,222,7,11,0,0,Piyavka class (river patrol craft) -1,3,222,7,12,0,0,SO 1 class -1,3,222,7,13,0,0,Shmel class (river patrol craft) -1,3,222,7,14,0,0,TR 40 class (river patrol craft) -1,3,222,7,15,0,0,Command ship (river patrol craft) -1,3,222,7,15,1,0,SSV-10 -1,3,222,7,16,0,0,Potok class (torpedo experimental ships) -1,3,222,7,16,1,0,OS-100 -1,3,222,7,16,2,0,OS-138 -1,3,222,7,16,3,0,OS-145 -1,3,222,7,16,4,0,OS-225 -1,3,222,7,17,0,0,Shelon class (torpedo operating/patrol & target craft) -1,3,222,7,18,0,0,Poluchat I/II/III classes (torpedo operating/patrol & target craft) -1,3,222,7,19,0,0,Pozharny I class -1,3,222,7,20,0,0,Iva class (fire/patrol craft) -1,3,222,7,20,1,0,PZHK 415 -1,3,222,7,20,2,0,1514 -1,3,222,7,20,3,0,1544 -1,3,222,7,20,4,0,1547 -1,3,222,7,20,5,0,1859 -1,3,222,7,21,0,0,Vikhr class -1,3,222,7,22,0,0,Vosh class (river patrol craft) -1,3,222,8,0,0,0,Mine Countermeasure Ship / Craft -1,3,222,8,1,0,0,Alesha Class -1,3,222,8,1,1,0,Pripyat -1,3,222,8,1,2,0,Vychegda -1,3,222,8,1,3,0,Pechora -1,3,222,8,2,0,0,Natya I class -1,3,222,8,2,1,0,Dizelist -1,3,222,8,2,2,0,Miner -1,3,222,8,2,3,0,Starshkiy -1,3,222,8,2,4,0,Snaypr -1,3,222,8,2,5,0,Elektrik -1,3,222,8,2,6,0,Motorist -1,3,222,8,2,7,0,Signalshik -1,3,222,8,2,8,0,Turbinist -1,3,222,8,2,9,0,Polemetchiz -1,3,222,8,2,10,0,Rulevoy -1,3,222,8,2,11,0,Zapal -1,3,222,8,2,12,0,Zenitchik -1,3,222,8,2,13,0,Radist -1,3,222,8,2,14,0,Dobrotay -1,3,222,8,2,15,0,Zaryad -1,3,222,8,3,0,0,Natya II class -1,3,222,8,4,0,0,Yurka class -1,3,222,8,4,1,0,Gafel -1,3,222,8,4,2,0,Evgeniy Nikonov -1,3,222,8,4,3,0,Mazlov -1,3,222,8,4,4,0,Navodchik -1,3,222,8,4,5,0,Semen Rosal -1,3,222,8,5,0,0,T-43 class -1,3,222,8,6,0,0,Sonya class -1,3,222,8,7,0,0,Baltika class -1,3,222,8,8,0,0,Vanya I class -1,3,222,8,9,0,0,Vanya II class -1,3,222,8,10,0,0,Sasha class -1,3,222,8,11,0,0,Yevgenya class -1,3,222,8,12,0,0,Pelikan class ACV (minesweeper, inshore) -1,3,222,8,13,0,0,Lida class (minehunter, inshore) -1,3,222,8,14,0,0,Ilyusha class (minesweeper, inshore) -1,3,222,8,16,0,0,Olya class (minesweeper, inshore) -1,3,222,8,17,0,0,Tanya class (minesweeper, inshore) -1,3,222,8,18,0,0,K 8 class (minesweeping boat) -1,3,222,8,19,0,0,Gorya class (minehunter, ocean) -1,3,222,8,19,1,0,Zheleznyakov -1,3,222,9,0,0,0,Dock landing ship -1,3,222,9,1,0,0,Ivan Rogov class -1,3,222,9,1,1,0,Ivan Rogov -1,3,222,9,1,2,0,Aleksandr Nikolay -1,3,222,9,1,3,0,Mitrofan Moskalenko -1,3,222,10,0,0,0,Tank landing ship -1,3,222,10,1,0,0,Ropucha class -1,3,222,10,1,1,0,Aleksandr Shabalin -1,3,222,10,1,2,0,Constantin Olshanskiy -1,3,222,10,1,3,0,Tsesar Kunikov -1,3,222,10,1,4,0,Bobruisk -1,3,222,10,2,0,0,Alligator class -1,3,222,10,2,1,0,Aleksandr Tortsev -1,3,222,10,2,2,0,Donetskiy Shakhter -1,3,222,10,2,3,0,Krasnaya Presnya -1,3,222,10,2,4,0,Krymskiy Kom. -1,3,222,10,2,5,0,Nikolay Fil'chenkov -1,3,222,10,2,6,0,Nikolay Vilkov -1,3,222,10,2,7,0,50 Let Sheftsva Vlksm -1,3,222,10,2,8,0,Petr Il'ichyev -1,3,222,10,2,9,0,Sergei Lazo -1,3,222,10,2,10,0,Tomskiy Kom. -1,3,222,10,2,11,0,Ilya Azarov -1,3,222,10,3,0,0,Polnocny class -1,3,222,11,0,0,0,Landing craft -1,3,222,11,4,0,0,Vydra class -1,3,222,11,5,0,0,Ondatra class -1,3,222,14,0,0,0,Hydrofoil -1,3,222,14,3,0,0,Matka class (fast attack craft, missile hydrofoil) -1,3,222,14,5,0,0,Mukha class (fast attack craft, patrol hydrofoil) -1,3,222,14,6,0,0,Turya class (fast attack craft, torpedo hydrofoil) -1,3,222,14,9,0,0,Babochka class (fast attack craft, patrol hydrofoil) -1,3,222,14,10,0,0,Muravey class (fast attack craft, patrol hydrofoil) -1,3,222,15,0,0,0,Air cushion/Surface effect -1,3,222,15,1,0,0,Pomornik class (air-cushion vehicles) -1,3,222,15,2,0,0,Aist class (air-cushion vehicles) -1,3,222,15,3,0,0,Tsaplya class (air-cushion vehicles) -1,3,222,15,4,0,0,Lebed class (air-cushion vehicles) -1,3,222,15,5,0,0,Utenok class (air-cushion vehicles) -1,3,222,15,6,0,0,Gus class (air-cushion vehicles) -1,3,222,15,7,0,0,Utka class (wing-in-ground-effect craft) (air cushion) -1,3,222,15,8,0,0,Orlan class (wing-in-ground-effect craft) (air cushion) -1,3,222,16,0,0,0,Auxiliary -1,3,222,16,1,0,0,Ugra class (submarine depot ships) -1,3,222,16,1,1,0,Ivan Kolyshkin -1,3,222,16,1,2,0,Ivan Vakhrameev -1,3,222,16,1,3,0,Volga -1,3,222,16,1,4,0,Ivan Kucherenko -1,3,222,16,1,5,0,Tobol -1,3,222,16,1,6,0,Lentra -1,3,222,16,2,0,0,Don class (submarine depot ships) -1,3,222,16,2,1,0,Dmitry Galkin -1,3,222,16,2,2,0,Kamchatsky Kkomsomolets -1,3,222,16,2,3,0,Magomet Gadzhiev (ex-Mikhail Tukhachevsky) -1,3,222,16,2,4,0,Viktor Kotelnikov -1,3,222,16,2,5,0,Fedor Vidyayev -1,3,222,16,2,6,0,Magadansky Komsomolets -1,3,222,16,3,0,0,Aleksandr Brykin class (missile support ship) -1,3,222,16,3,1,0,Aleksandr Brykin -1,3,222,16,4,0,0,Amga class (missile support ships) -1,3,222,16,4,1,0,Amga -1,3,222,16,4,2,0,Vetluga -1,3,222,16,4,3,0,Daugava -1,3,222,16,5,0,0,Malina class (nuclear submarine support ships) -1,3,222,16,5,1,0,PM 63 -1,3,222,16,5,2,0,PM 74 -1,3,222,16,5,3,0,PM 12 -1,3,222,16,6,0,0,Pinega class (nuclear submarine support ships) -1,3,222,16,6,1,0,Pinega -1,3,222,16,6,2,0,Amur -1,3,222,16,7,0,0,Lama class (missile support ships) -1,3,222,16,7,1,0,General Ryabakov -1,3,222,16,7,2,0,Voronesh -1,3,222,16,7,3,0,PM 44 -1,3,222,16,7,4,0,PM 93 -1,3,222,16,7,5,0,PM 131 -1,3,222,16,7,6,0,PM 150 -1,3,222,16,7,7,0,PM 154 -1,3,222,16,8,0,0,Modified Andizhan class (missile support ships) -1,3,222,16,8,1,0,Venta -1,3,222,16,8,2,0,Vilyuy -1,3,222,16,9,0,0,Amur I Class (Repair Ship) -1,3,222,16,9,1,0,PM 9 -1,3,222,16,9,2,0,PM 10 -1,3,222,16,9,3,0,PM 15 -1,3,222,16,9,4,0,PM 37 -1,3,222,16,9,5,0,PM 49 -1,3,222,16,9,6,0,PM 52 -1,3,222,16,9,7,0,PM 56 -1,3,222,16,9,8,0,PM 75 -1,3,222,16,9,9,0,PM 94 -1,3,222,16,9,10,0,PM 138 -1,3,222,16,9,11,0,PM 161 -1,3,222,16,9,12,0,PM 163 -1,3,222,16,9,13,0,5 -1,3,222,16,9,14,0,30 -1,3,222,16,9,15,0,34 -1,3,222,16,9,16,0,40 -1,3,222,16,9,17,0,64 -1,3,222,16,9,18,0,73 -1,3,222,16,9,19,0,81 -1,3,222,16,9,20,0,82 -1,3,222,16,9,21,0,129 -1,3,222,16,9,22,0,139 -1,3,222,16,9,23,0,140 -1,3,222,16,9,24,0,156 -1,3,222,16,10,0,0,Amur II Class (repair ship) -1,3,222,16,10,1,0,59 -1,3,222,16,10,2,0,69 -1,3,222,16,10,3,0,86 -1,3,222,16,10,4,0,92 -1,3,222,16,10,5,0,97 -1,3,222,16,11,0,0,Oskol class (repair ships) -1,3,222,16,11,1,0,PM 2 -1,3,222,16,11,2,0,PM 24 -1,3,222,16,11,3,0,PM 26 -1,3,222,16,11,4,0,PM 42 -1,3,222,16,11,5,0,PM 147 -1,3,222,16,11,6,0,PM 148 -1,3,222,16,11,7,0,20 -1,3,222,16,11,8,0,21 -1,3,222,16,11,9,0,51 -1,3,222,16,11,10,0,68 -1,3,222,16,11,11,0,146 -1,3,222,16,12,0,0,Tomba class (support ships) -1,3,222,16,12,1,0,244 -1,3,222,16,12,2,0,254 -1,3,222,16,12,3,0,348 -1,3,222,16,12,4,0,357 -1,3,222,16,13,0,0,Vytegrales class (support & depot) -1,3,222,16,13,1,0,Apsheron (ex-Vagales) -1,3,222,16,13,2,0,Baskunchak (ex-Kirishi) -1,3,222,16,13,3,0,Dauriya (ex-Vyborgles) -1,3,222,16,13,4,0,Dikson (ex-Vostok 3) -1,3,222,16,13,5,0,Donbas (ex-Vostok 4) -1,3,222,16,13,6,0,Sevan (ex-Siverles) -1,3,222,16,13,7,0,Taman (ex-Suzdal) -1,3,222,16,13,8,0,Yamal (ex-Tosnoles) -1,3,222,16,14,0,0,Vishnya class (AGIs) -1,3,222,16,14,1,0,SSV 169 -1,3,222,16,14,2,0,SSV 175 -1,3,222,16,14,3,0,SSV 201 -1,3,222,16,14,4,0,SSV 208 -1,3,222,16,14,5,0,SSV 231 -1,3,222,16,14,6,0,SSV 520 -1,3,222,16,14,7,0,SSV 535 -1,3,222,16,15,0,0,Balzam class (AGIs) -1,3,222,16,15,1,0,SSV 80 -1,3,222,16,15,2,0,SSV 493 -1,3,222,16,15,3,0,SSV 516 -1,3,222,16,15,4,0,SSV 571 -1,3,222,16,16,0,0,Primorye class (AGIs) -1,3,222,16,16,1,0,SSV 464 Zabaykalye -1,3,222,16,16,2,0,SSV 465 Primorye -1,3,222,16,16,3,0,SSV 501 Zaporozhye -1,3,222,16,16,4,0,SSV 502 Zakarpatye -1,3,222,16,16,5,0,SSV 590 Krym -1,3,222,16,16,6,0,SSV 591 Kavkaz -1,3,222,16,17,0,0,Nikolay Zubov class (AGIs) -1,3,222,16,17,1,0,SSV 468 Gavril Sarychev (mod) -1,3,222,16,17,2,0,SSV 469 Semen Chelyuskin -1,3,222,16,17,3,0,SSV 503 Khariton Laptev (mod) -1,3,222,16,18,0,0,Modified Pamir class (AGIs) -1,3,222,16,18,1,0,SSV 477 Peleng (ex-Arban) -1,3,222,16,19,0,0,Moma class (AGIs) -1,3,222,16,19,1,0,Ekvator -1,3,222,16,19,2,0,Yupiter (mod) -1,3,222,16,19,3,0,Kildin (mod) -1,3,222,16,19,4,0,SSV 472 (ex-Ilmen) (mod) -1,3,222,16,19,5,0,SSV 474 (ex-Vega) (mod) -1,3,222,16,19,6,0,SSV 506 (ex-Nakhodka) -1,3,222,16,19,7,0,SSV 509 (ex-Pelorus) (mod) -1,3,222,16,19,8,0,SSV 512 (ex-Arkhipelag) (mod) -1,3,222,16,19,9,0,SSV 514 (ex-Seliger) (mod) -1,3,222,16,20,0,0,Alpinist class (AGIs) -1,3,222,16,20,1,0,GS 7 (mod) -1,3,222,16,20,2,0,GS 8 -1,3,222,16,20,3,0,GS 19 (mod) -1,3,222,16,20,4,0,GS 39 (mod) -1,3,222,16,21,0,0,Mayak class -1,3,222,16,21,1,0,Khersones -1,3,222,16,21,2,0,Kurs -1,3,222,16,21,3,0,Kursograf -1,3,222,16,21,4,0,Ladoga -1,3,222,16,21,5,0,GS 239 -1,3,222,16,21,6,0,GS 242 -1,3,222,16,21,7,0,Girorulevoy -1,3,222,16,21,8,0,Aneroid -1,3,222,16,22,0,0,Okean class (AGIs) -1,3,222,16,22,1,0,Alidada -1,3,222,16,22,2,0,Barograf -1,3,222,16,22,3,0,Deflektor -1,3,222,16,22,4,0,Ekholot -1,3,222,16,22,5,0,Krenometr -1,3,222,16,22,6,0,Linza (mod) -1,3,222,16,22,7,0,Lotlin (mod) -1,3,222,16,22,8,0,Reduktor (mod) -1,3,222,16,22,9,0,Repiter -1,3,222,16,22,10,0,Teodolit -1,3,222,16,22,11,0,Traverz -1,3,222,16,22,12,0,Zond (mod) no missiles -1,3,222,16,23,0,0,Lentra class (AGIs) -1,3,222,16,23,1,0,GS 41 -1,3,222,16,23,2,0,GS 43 (mod) -1,3,222,16,23,3,0,GS 55 -1,3,222,16,23,4,0,GS 59 -1,3,222,16,24,0,0,Akademik Krylov class (naval research) -1,3,222,16,24,1,0,Admiral Vladimirsky -1,3,222,16,24,2,0,Ivan Kruzenshtern -1,3,222,16,24,3,0,Leonid Demin -1,3,222,16,24,4,0,Akademik Krylov -1,3,222,16,24,5,0,Leonid Sobolev -1,3,222,16,24,6,0,Mikhail Krupsky -1,3,222,16,25,0,0,Abkhaziya class (naval research) -1,3,222,16,25,1,0,Abkhaziya -1,3,222,16,25,2,0,Adzhariya -1,3,222,16,25,3,0,Bashkiriya -1,3,222,16,25,4,0,Moldavia -1,3,222,16,26,0,0,Polyus class (Kovel type) (naval research) -1,3,222,16,26,1,0,Baykal (mod) -1,3,222,16,26,2,0,Balkhash (mod) -1,3,222,16,26,3,0,Polyus -1,3,222,16,27,0,0,Modified Dobrynya Nikitich class (naval research) -1,3,222,16,27,1,0,Vladimir Kavraysky -1,3,222,16,28,0,0,Nikolay Zubov class (naval research) -1,3,222,16,28,1,0,Aleksey Chirikov -1,3,222,16,28,2,0,Fedor Litke -1,3,222,16,28,3,0,Andrey Vilkitsky -1,3,222,16,28,4,0,Nikolay Zubov -1,3,222,16,28,5,0,Boris Davidov -1,3,222,16,28,6,0,Semen Dezhnev -1,3,222,16,28,7,0,Faddey Bellinsgausen -1,3,222,16,28,8,0,Vasily Golovnin -1,3,222,16,29,0,0,Yug class (naval research) -1,3,222,16,29,1,0,V Adm Vorontsov (ex-Briz) -1,3,222,16,29,2,0,Donuzlav -1,3,222,16,29,3,0,Gals -1,3,222,16,29,4,0,Gidrolog -1,3,222,16,29,5,0,Gorizont -1,3,222,16,29,6,0,Mangyshlak -1,3,222,16,29,7,0,Marshal Gelovani -1,3,222,16,29,8,0,Nikolay Matusevich -1,3,222,16,29,9,0,Pegas -1,3,222,16,29,10,0,Persey -1,3,222,16,29,11,0,Pluton -1,3,222,16,29,12,0,Senezh -1,3,222,16,29,13,0,Strelets -1,3,222,16,29,14,0,Tayga -1,3,222,16,29,15,0,Vizir -1,3,222,16,29,16,0,Zodiak -1,3,222,16,29,17,0,Stvor -1,3,222,16,29,18,0,704 (ex-SSV 328) -1,3,222,16,30,0,0,Mod Sorum class (naval research) -1,3,222,16,30,1,0,OS 572 -1,3,222,16,31,0,0,Moma class (+9 AGIs) (naval survey) -1,3,222,16,31,1,0,Altair -1,3,222,16,31,2,0,Anadyr -1,3,222,16,31,3,0,Andromeda -1,3,222,16,31,4,0,Antares -1,3,222,16,31,5,0,Antarktyda -1,3,222,16,31,6,0,Arktika -1,3,222,16,31,7,0,Askold -1,3,222,16,31,8,0,Berezan -1,3,222,16,31,9,0,Cheleken -1,3,222,16,31,10,0,Elton -1,3,222,16,31,11,0,Kolguev (mod) -1,3,222,16,31,12,0,Krilon -1,3,222,16,31,13,0,Liman -1,3,222,16,31,14,0,Mars -1,3,222,16,31,15,0,Morzhovets -1,3,222,16,31,16,0,Okean -1,3,222,16,31,17,0,Rybachi (mod) -1,3,222,16,31,18,0,Sever -1,3,222,16,31,19,0,Taymyr -1,3,222,16,31,20,0,Zapolyarye -1,3,222,16,32,0,0,Samara class (naval survey) -1,3,222,16,32,1,0,Azimut -1,3,222,16,32,2,0,Glubomer -1,3,222,16,32,3,0,Tropik -1,3,222,16,32,4,0,Deviator -1,3,222,16,32,5,0,Gradus -1,3,222,16,32,6,0,Vostok -1,3,222,16,32,7,0,Gigrometr -1,3,222,16,32,8,0,Kompas -1,3,222,16,32,9,0,Vaygach (mod) -1,3,222,16,32,10,0,Moskovsky Universitet -1,3,222,16,32,11,0,Pamyat Merkuryia -1,3,222,16,32,12,0,Zenit (ex-Gorizont) (mod) -1,3,222,16,32,13,0,Rumb -1,3,222,16,33,0,0,Finik class (naval survey) -1,3,222,16,33,1,0,GS 44 -1,3,222,16,33,2,0,47 -1,3,222,16,33,3,0,84 -1,3,222,16,33,4,0,86 -1,3,222,16,33,5,0,87 -1,3,222,16,33,6,0,260 -1,3,222,16,33,7,0,265 -1,3,222,16,33,8,0,270 -1,3,222,16,33,9,0,272 -1,3,222,16,33,10,0,278 -1,3,222,16,33,11,0,296 -1,3,222,16,33,12,0,297 -1,3,222,16,33,13,0,301 -1,3,222,16,33,14,0,388 -1,3,222,16,33,15,0,392 -1,3,222,16,33,16,0,397 -1,3,222,16,33,17,0,398 -1,3,222,16,33,18,0,399 -1,3,222,16,33,19,0,400 -1,3,222,16,33,20,0,401 -1,3,222,16,33,21,0,402 -1,3,222,16,33,22,0,403 -1,3,222,16,33,23,0,404 -1,3,222,16,33,24,0,405 -1,3,222,16,34,0,0,Biya class (naval survey) -1,3,222,16,34,1,0,GS 182 -1,3,222,16,34,2,0,193 -1,3,222,16,34,3,0,194 -1,3,222,16,34,4,0,198 -1,3,222,16,34,5,0,200 -1,3,222,16,34,6,0,202 -1,3,222,16,34,7,0,204 -1,3,222,16,34,8,0,206 -1,3,222,16,34,9,0,210 -1,3,222,16,34,10,0,212 -1,3,222,16,34,11,0,214 -1,3,222,16,34,12,0,271 -1,3,222,16,34,13,0,273 -1,3,222,16,34,14,0,275 -1,3,222,16,35,0,0,Kamenka class (naval survey) -1,3,222,16,35,1,0,GS 66 -1,3,222,16,35,2,0,74 -1,3,222,16,35,3,0,78 -1,3,222,16,35,4,0,82 -1,3,222,16,35,5,0,107 -1,3,222,16,35,6,0,108 (ex-Vernier) -1,3,222,16,35,7,0,113 (ex-Belbeck) -1,3,222,16,35,8,0,118 -1,3,222,16,35,9,0,199 (ex-Sima) -1,3,222,16,35,10,0,207 -1,3,222,16,35,11,0,211 -1,3,222,16,35,12,0,Astronom (mod) -1,3,222,16,36,0,0,Vinograd class (naval survey) -1,3,222,16,36,1,0,GS 525 -1,3,222,16,36,2,0,GS 526 -1,3,222,16,37,0,0,Melitopol class (naval survey) -1,3,222,16,37,1,0,Mayak -1,3,222,16,37,2,0,Nivelir -1,3,222,16,37,3,0,Prizma -1,3,222,16,37,4,0,Indigurka (mod) -1,3,222,16,37,5,0,Shevchenoko (mod) -1,3,222,16,38,0,0,Nyryat 1 class (naval survey) -1,3,222,16,39,0,0,Nyryat 2 class (naval survey) -1,3,222,16,40,0,0,Sibir class (naval missile range) -1,3,222,16,40,1,0,Sakhalin -1,3,222,16,40,2,0,Spassk (ex-Suchan) -1,3,222,16,41,0,0,Marshal Nedelin class (naval missile range) -1,3,222,16,41,1,0,Marshal Nedelin -1,3,222,16,41,2,0,Marshal Krylov -1,3,222,16,41,3,0,Akademik Nicolai Pilyugin -1,3,222,16,42,0,0,Kamchatka class (AG) (naval missile range) -1,3,222,16,42,1,0,SSV 391 Kamchatka -1,3,222,16,43,0,0,Kapusta class (naval missile range) -1,3,222,16,43,1,0,SSV 33 Ural -1,3,222,16,44,0,0,Ugra II class (AXT) (training) -1,3,222,16,44,1,0,Borodino -1,3,222,16,44,2,0,Gangut -1,3,222,16,45,0,0,Smolny class (AXT) (training) -1,3,222,16,45,1,0,Khasan -1,3,222,16,45,2,0,Perekop -1,3,222,16,45,3,0,Smolny -1,3,222,16,46,0,0,Wodnik II class (AXT) (training) -1,3,222,16,46,1,0,Luga -1,3,222,16,46,2,0,Oka -1,3,222,16,47,0,0,Sail training ships -1,3,222,16,47,1,0,Mir -1,3,222,16,47,2,0,Druzjba -1,3,222,16,47,3,0,Khersones -1,3,222,16,47,4,0,Pallada -1,3,222,16,48,0,0,Klasma class (cable ships) -1,3,222,16,48,1,0,Donets -1,3,222,16,48,2,0,Ingul -1,3,222,16,48,3,0,Inguri -1,3,222,16,48,4,0,Katun -1,3,222,16,48,5,0,Tavda -1,3,222,16,48,6,0,Tsna -1,3,222,16,48,7,0,Yana type I -1,3,222,16,48,8,0,Zeya -1,3,222,16,49,0,0,Emba I class (cable ships) -1,3,222,16,49,1,0,Emba -1,3,222,16,49,2,0,Nepryadva -1,3,222,16,49,3,0,Setun -1,3,222,16,50,0,0,Emba II class (cable ships) -1,3,222,16,50,1,0,Biriusa -1,3,222,16,50,2,0,Kemj -1,3,222,16,51,0,0,Berezina class (replenishment ships) -1,3,222,16,51,1,0,Berezina -1,3,222,16,52,0,0,Boris Chilikin class (replenishment ships) -1,3,222,16,52,1,0,Boris Butoma -1,3,222,16,52,2,0,Genrich Gasanov -1,3,222,16,52,3,0,Boris Chilikin -1,3,222,16,52,4,0,Ivan Bubnov -1,3,222,16,52,5,0,Dnestr -1,3,222,16,52,6,0,Vladimir Kolechitsky -1,3,222,16,53,0,0,Dubna class (replenishment tankers) -1,3,222,16,53,1,0,Dubna -1,3,222,16,53,2,0,Pechenga -1,3,222,16,53,3,0,Irkut -1,3,222,16,53,4,0,Sventa -1,3,222,16,54,0,0,Mod Kazbek class (replenishment tankers) -1,3,222,16,54,1,0,Alatyr -1,3,222,16,54,2,0,Desna -1,3,222,16,54,3,0,Volkhov -1,3,222,16,55,0,0,Mod Altay class (replenishment tankers) -1,3,222,16,55,1,0,Elnya -1,3,222,16,55,2,0,Ilim -1,3,222,16,55,3,0,Izhora -1,3,222,16,55,4,0,Kola -1,3,222,16,55,5,0,Prut -1,3,222,16,55,6,0,Yegorlik -1,3,222,16,56,0,0,Uda class (replenishment tankers) -1,3,222,16,56,1,0,Dunay (mod) -1,3,222,16,56,2,0,Koida -1,3,222,16,56,3,0,Lena (mod) -1,3,222,16,56,4,0,Terek (mod) -1,3,222,16,56,5,0,Vishera -1,3,222,16,57,0,0,Olekma class (replenishment tankers) -1,3,222,16,57,1,0,Olekma (mod) -1,3,222,16,57,2,0,Iman -1,3,222,16,57,3,0,Zolotoy rog -1,3,222,16,58,0,0,Kaliningradneft class (support tankers) -1,3,222,16,58,1,0,Argun -1,3,222,16,58,2,0,Vyazma -1,3,222,16,59,0,0,Sofya class (support tanker) -1,3,222,16,59,1,0,Akhtyuba (ex-Hanoi) -1,3,222,16,60,0,0,Nercha class (support tankers) -1,3,222,16,60,1,0,Nara -1,3,222,16,60,2,0,Nercha -1,3,222,16,61,0,0,Konda class (support tankers) -1,3,222,16,61,1,0,Konda -1,3,222,16,61,2,0,Rossosh -1,3,222,16,61,3,0,Soyana -1,3,222,16,61,4,0,Yakhroma -1,3,222,16,62,0,0,Khobi class (support tankers) -1,3,222,16,62,1,0,Cheremshan -1,3,222,16,62,2,0,Orsha -1,3,222,16,62,3,0,Shelon -1,3,222,16,62,4,0,Tartu -1,3,222,16,62,5,0,Khobi -1,3,222,16,62,6,0,Seima -1,3,222,16,62,7,0,Sosva -1,3,222,16,62,8,0,Titan 150 -1,3,222,16,62,9,0,Lovat -1,3,222,16,62,10,0,Shacha -1,3,222,16,62,11,0,Sysola -1,3,222,16,62,12,0,Tunguska -1,3,222,16,62,13,0,Metan -1,3,222,16,63,0,0,Irtysh class (support tanker) -1,3,222,16,63,1,0,Narva -1,3,222,16,64,0,0,Baskunchak class (support tankers) -1,3,222,16,64,1,0,Ivan Golubets -1,3,222,16,64,2,0,Sovietsky Pogranichnik -1,3,222,16,65,0,0,Luza class (special tankers) -1,3,222,16,65,1,0,Alambai -1,3,222,16,65,2,0,Barguzin -1,3,222,16,65,3,0,Kama -1,3,222,16,65,4,0,Aragvi -1,3,222,16,65,5,0,Don -1,3,222,16,65,6,0,Selenga -1,3,222,16,66,0,0,Vala class (special tankers) -1,3,222,16,66,1,0,Vala -1,3,222,16,66,2,0,TNT 11 -1,3,222,16,66,3,0,TNT 27 -1,3,222,16,66,4,0,12 -1,3,222,16,66,5,0,19 -1,3,222,16,66,6,0,25 -1,3,222,16,66,7,0,29 -1,3,222,16,67,0,0,OB class (AH) -1,3,222,16,67,1,0,OB -1,3,222,16,67,2,0,Yenisei -1,3,222,16,67,3,0,Svir -1,3,222,16,67,4,0,Irtysh -1,3,222,16,68,0,0,Mikhail Rudnitsky class (ARs) -1,3,222,16,68,1,0,Mikhail Rudnitsky -1,3,222,16,68,2,0,Georgy Kozmin -1,3,222,16,68,3,0,Georgy Titov -1,3,222,16,68,4,0,Sayany -1,3,222,16,69,0,0,Pamir class (salvage, rescue & mooring) -1,3,222,16,69,1,0,Agatan -1,3,222,16,69,2,0,Aldan -1,3,222,16,70,0,0,Ingul class (salvage, rescue & mooring) -1,3,222,16,70,1,0,Pamir -1,3,222,16,70,2,0,Mashuk -1,3,222,16,70,3,0,Alatau -1,3,222,16,70,4,0,Karakh -1,3,222,16,71,0,0,Sliva class (salvage, rescue & mooring) -1,3,222,16,71,1,0,SB 406 -1,3,222,16,71,2,0,SB 408 -1,3,222,16,71,3,0,SB 921 -1,3,222,16,71,4,0,SB 922 Shakhter -1,3,222,16,72,0,0,Kashtan class (buoy tenders) -1,3,222,16,72,1,0,KIL 926 -1,3,222,16,72,2,0,KIL 143 -1,3,222,16,72,3,0,KIL 164 -1,3,222,16,72,4,0,KIL 498 -1,3,222,16,72,5,0,KIL 927 -1,3,222,16,72,6,0,KIL 158 -1,3,222,16,72,7,0,KIL 140 -1,3,222,16,72,8,0,KIL 168 -1,3,222,16,73,0,0,Sura class (buoy tenders) -1,3,222,16,73,1,0,KIL 1 -1,3,222,16,73,2,0,2 -1,3,222,16,73,3,0,21 -1,3,222,16,73,4,0,22 -1,3,222,16,73,5,0,25 -1,3,222,16,73,6,0,27 -1,3,222,16,73,7,0,29 -1,3,222,16,73,8,0,31 -1,3,222,16,73,9,0,32 -1,3,222,16,73,10,0,33 -1,3,222,16,74,0,0,Orel class (salvage tugs) -1,3,222,16,74,1,0,SB 38 -1,3,222,16,74,2,0,SB 43 -1,3,222,16,75,0,0,Katun I class (salvage & rescue tugs) -1,3,222,16,75,1,0,PZHS 96 -1,3,222,16,75,2,0,98 -1,3,222,16,75,3,0,123 -1,3,222,16,75,4,0,124 -1,3,222,16,75,5,0,209 -1,3,222,16,75,6,0,273 -1,3,222,16,75,7,0,279 -1,3,222,16,75,8,0,282 -1,3,222,16,75,9,0,551 -1,3,222,16,76,0,0,Katun II (salvage & rescue tugs) -1,3,222,16,76,1,0,PZHS 64 -1,3,222,16,76,2,0,92 -1,3,222,16,77,0,0,Neptun class (salvage, rescue & mooring) -1,3,222,16,77,1,0,KIL 3 -1,3,222,16,77,2,0,6 -1,3,222,16,77,3,0,7 -1,3,222,16,77,4,0,9 -1,3,222,16,77,5,0,11 -1,3,222,16,77,6,0,13 -1,3,222,16,77,7,0,15 -1,3,222,16,77,8,0,17 -1,3,222,16,77,9,0,18 -1,3,222,16,78,0,0,Elbrus class (submarine rescue ships) -1,3,222,16,78,1,0,Elbrus -1,3,222,16,78,2,0,Alagez -1,3,222,16,79,0,0,Nepa class (submarine rescue ships) -1,3,222,16,79,1,0,Karpaty -1,3,222,16,80,0,0,Prut class (submarine rescue ships) -1,3,222,16,80,1,0,Altay -1,3,222,16,80,2,0,Beshtau -1,3,222,16,80,3,0,Vladimir Trefolev -1,3,222,16,80,4,0,Zhiguli -1,3,222,16,80,5,0,SS 21 -1,3,222,16,80,6,0,Epron (ex-SS 26) -1,3,222,16,80,7,0,SS 83 -1,3,222,16,81,0,0,Valday class (ex-T 58) -1,3,222,16,81,1,0,Kazbek -1,3,222,16,81,2,0,Khibiny -1,3,222,16,81,3,0,Valday -1,3,222,16,81,4,0,Zangezur -1,3,222,16,81,5,0,Pulkovo (ex-SS 38) -1,3,222,16,81,6,0,SS 30 -1,3,222,16,81,7,0,35 -1,3,222,16,81,8,0,40 -1,3,222,16,81,9,0,47 -1,3,222,16,81,10,0,50 -1,3,222,16,82,0,0,Anadyr class (transports) -1,3,222,16,82,1,0,Anadyr -1,3,222,16,83,0,0,Angara class (transports) -1,3,222,16,83,1,0,Angara (ex-Hela) -1,3,222,16,84,0,0,Amguema class (transports) -1,3,222,16,84,1,0,Yauza -1,3,222,16,85,0,0,Chulym class (transports) -1,3,222,16,85,1,0,Severodonetsk -1,3,222,16,86,0,0,Andizan class (transports) -1,3,222,16,86,1,0,Onda -1,3,222,16,86,2,0,Posyet -1,3,222,16,87,0,0,Kalinin class (transports) -1,3,222,16,87,1,0,Kuban (ex-Nadeshda-Krupskaya) -1,3,222,16,88,0,0,Antonov class (transports) -1,3,222,16,88,1,0,Neon Antonov -1,3,222,16,88,2,0,Irbit -1,3,222,16,88,3,0,Nicolay Starshinov -1,3,222,16,88,4,0,Ivan Lednev -1,3,222,16,88,5,0,Nikolay Sipyagin -1,3,222,16,88,6,0,Ivan Sudtsov -1,3,222,16,88,7,0,Ivan Odtejev -1,3,222,16,88,8,0,Victor Denison -1,3,222,16,88,9,0,Sergey Sudetsky -1,3,222,16,88,10,0,Dvina -1,3,222,16,88,11,0,Mikhail Konovalov -1,3,222,16,89,0,0,Partizan class (transports) -1,3,222,16,89,1,0,Pechora -1,3,222,16,89,2,0,Turgay -1,3,222,16,89,3,0,Ufa -1,3,222,16,89,4,0,V Adm Fomin (ex-Pinega) (mod) -1,3,222,16,90,0,0,Keyla class (transports) -1,3,222,16,90,1,0,Mezen -1,3,222,16,90,2,0,Onega -1,3,222,16,90,3,0,Ponoi -1,3,222,16,90,4,0,Ritsa (AGI) -1,3,222,16,90,5,0,Teriberka -1,3,222,16,90,6,0,Tuloma -1,3,222,16,90,7,0,Tvertsa -1,3,222,16,90,8,0,Unza -1,3,222,16,90,9,0,Ussury -1,3,222,16,90,10,0,Yeruslan -1,3,222,16,91,0,0,Muna class (transports) -1,3,222,16,91,1,0,VTR 28 -1,3,222,16,91,2,0,48 -1,3,222,16,91,3,0,81 -1,3,222,16,91,4,0,82 -1,3,222,16,91,5,0,83 -1,3,222,16,91,6,0,84 -1,3,222,16,91,7,0,85 -1,3,222,16,91,8,0,86 -1,3,222,16,91,9,0,91 -1,3,222,16,91,10,0,92 -1,3,222,16,91,11,0,93 -1,3,222,16,91,12,0,94 -1,3,222,16,91,13,0,148 -1,3,222,16,92,0,0,Mayak class (transports) -1,3,222,16,92,1,0,Buzuluk -1,3,222,16,92,2,0,Ishim -1,3,222,16,92,3,0,Lama -1,3,222,16,92,4,0,Mius -1,3,222,16,92,5,0,Neman -1,3,222,16,92,6,0,Rioni -1,3,222,16,92,7,0,Ulma -1,3,222,16,92,8,0,Vytegra -1,3,222,16,93,0,0,Lentra class (transports) -1,3,222,16,93,1,0,Alma -1,3,222,16,93,2,0,Kacha -1,3,222,16,93,3,0,Ufa -1,3,222,16,93,4,0,Ugra -1,3,222,16,93,5,0,VTR 1 -1,3,222,16,93,6,0,28 -1,3,222,16,93,7,0,32 -1,3,222,16,93,8,0,143 -1,3,222,16,93,9,0,144 -1,3,222,16,93,10,0,145 -1,3,222,16,94,0,0,MP 4 class (transports) -1,3,222,16,94,1,0,VTR 294 -1,3,222,16,94,2,0,VTR 295 -1,3,222,16,95,0,0,MP 6 class (transports) -1,3,222,16,95,1,0,Bira -1,3,222,16,95,2,0,Vologda -1,3,222,16,96,0,0,Telnovsk class (transports) -1,3,222,16,96,1,0,Burovestnik -1,3,222,16,96,2,0,Lag -1,3,222,16,96,3,0,VTR 73 -1,3,222,16,96,4,0,VTR 74 (ex-Jan Kreuks) -1,3,222,16,97,0,0,Khabarov class (transports) -1,3,222,16,97,1,0,VTR 8 -1,3,222,16,97,2,0,13 -1,3,222,16,97,3,0,15 -1,3,222,16,97,4,0,25 -1,3,222,16,98,0,0,Komandor class -1,3,222,16,98,1,0,Komandor -1,3,222,16,98,2,0,Shkiper Gyek -1,3,222,16,98,3,0,Herluf Bidstrup -1,3,222,16,99,0,0,Onega class -1,3,222,16,99,1,0,GKS 52 -1,3,222,16,99,2,0,SFP 95 -1,3,222,16,99,3,0,SFP 224 -1,3,222,16,99,4,0,SFP 240 -1,3,222,16,99,5,0,SFP 283 -1,3,222,16,99,6,0,GKS 286 -1,3,222,16,99,7,0,SFP 295 -1,3,222,16,99,8,0,SFP 322 -1,3,222,16,99,9,0,SFP 340 -1,3,222,16,99,10,0,SFP 173 -1,3,222,16,99,11,0,SFP 511 -1,3,222,16,99,12,0,SFP 542 -1,3,222,16,99,13,0,SFP 562 -1,3,222,16,99,14,0,SFP 177 -1,3,222,16,100,0,0,T 43 class -1,3,222,16,100,1,0,GKS 11 -1,3,222,16,100,2,0,12 -1,3,222,16,100,3,0,14-24 -1,3,222,16,100,4,0,26 -1,3,222,16,100,5,0,45 -1,3,222,16,104,0,0,PO 2 class -1,3,222,16,105,0,0,Nyryat 2 class -1,3,222,16,106,0,0,Nyryat 1 class -1,3,222,16,107,0,0,Petrushka class -1,3,222,16,108,0,0,Miernyk class -1,3,222,16,109,0,0,Daldyn class -1,3,222,16,109,1,0,Daldyn -1,3,222,16,110,0,0,Yelva class -1,3,222,16,110,1,0,VM 143 -1,3,222,16,110,2,0,146 -1,3,222,16,110,3,0,154 -1,3,222,16,110,4,0,266 -1,3,222,16,110,5,0,268 -1,3,222,16,110,6,0,413 -1,3,222,16,110,7,0,414 -1,3,222,16,110,8,0,416 -1,3,222,16,110,9,0,420 -1,3,222,16,110,10,0,425 -1,3,222,16,110,11,0,907 -1,3,222,16,110,12,0,909 -1,3,222,16,111,0,0,Bolva (barracks ships) -1,3,222,16,111,1,0,Bolva 1 -1,3,222,16,111,2,0,Bolva 2 -1,3,222,16,111,3,0,Bolva 3 -1,3,222,17,0,0,0,Auxiliary, Merchant Marine -1,3,222,17,1,0,0,Tamyr class (ice breakers) -1,3,222,17,1,1,0,Tamyr -1,3,222,17,1,2,0,Vaygach -1,3,222,17,2,0,0,Arktika class (ice breakers) -1,3,222,17,2,1,0,Arktika -1,3,222,17,2,2,0,Sibir -1,3,222,17,2,3,0,Rossiya -1,3,222,17,2,4,0,Sovetskiy Soyuz -1,3,222,17,2,5,0,Oktyabryskaya Revolutsiya -1,3,222,17,2,6,0,Ural (1996) -1,3,222,17,3,0,0,Yermak class (ice breakers) -1,3,222,17,3,1,0,Yermak -1,3,222,17,3,2,0,Admiral Makarov -1,3,222,17,3,3,0,Krasin -1,3,222,17,4,0,0,Moskva class (ice breakers) -1,3,222,17,4,1,0,Kiev -1,3,222,17,4,2,0,Leningrad -1,3,222,17,4,3,0,Moskva -1,3,222,17,4,4,0,Murmansk -1,3,222,17,4,5,0,Vladivostok -1,3,222,17,5,0,0,Kapitan Sorokin class (ice breakers) -1,3,222,17,5,1,0,Kapitan Sorokin (mod) -1,3,222,17,5,2,0,Kapitan Nikolayev -1,3,222,17,5,3,0,Kapitan Dranitsyn -1,3,222,17,5,4,0,Kapitan Khlebnikov -1,3,222,17,6,0,0,Mudyug class (ice breakers) -1,3,222,17,6,1,0,Mudyug -1,3,222,17,6,2,0,Magadan -1,3,222,17,6,3,0,Dikson -1,3,222,17,7,0,0,Kapitan Belousov class (ice breakers) -1,3,222,17,7,1,0,Kapitan Belousov -1,3,222,17,7,2,0,Kapitan Melekhov -1,3,222,17,7,3,0,Kapitan Voronin -1,3,222,17,8,0,0,Dobrynya Nikitich class (ice breakers) -1,3,222,17,8,1,0,Afanasy Nikitin (ex-Ledokol 2) -1,3,222,17,8,2,0,Purga (1961) -1,3,222,17,8,3,0,Buran (1966) -1,3,222,17,8,4,0,Sadko (1968) -1,3,222,17,8,5,0,Dobrynya Nikitich (1960) -1,3,222,17,8,6,0,Semen Chelyuskin (ex-Ledokol 8)(1965) -1,3,222,17,8,7,0,Fedor Litke (1970) -1,3,222,17,8,8,0,Georgy Sedov (1967) -1,3,222,17,8,9,0,Semen Dezhnev (1971) -1,3,222,17,8,10,0,Ilya Muromets (1966) -1,3,222,17,8,11,0,Vasily Poyarkov (ex-Ledokol 4) (1963) -1,3,222,17,8,12,0,Ivan Moskvitin (1971) -1,3,222,17,8,13,0,Vladimir Rusanov (ex-Ledokol 7) (1964) -1,3,222,17,8,14,0,Ivan Kruzenshtern (ex-Ledokol 6) (1964) -1,3,222,17,8,15,0,Khariton Laptev (ex-Ledokol 3) (1962) -1,3,222,17,8,16,0,Vyuga (1961) (ex-Ledokol 5) (1963) -1,3,222,17,8,17,0,P Pakhtusov (1966) -1,3,222,17,8,18,0,Peresvet (1969) -1,3,222,17,8,19,0,Yerofei Khabarov -1,3,222,17,8,20,0,Yury Lisyansky (ex-Ledokol 9) (1965) -1,3,222,17,8,21,0,Plug (1961) -1,3,222,17,9,0,0,Kapitan Chechkin class (ice breakers) -1,3,222,17,9,1,0,Kapitan Chechkin -1,3,222,17,9,2,0,Kapitan Plakhin -1,3,222,17,9,3,0,Kapitan Chadayev -1,3,222,17,9,4,0,Kapitan Krutov -1,3,222,17,9,5,0,Kapitan Bukayev -1,3,222,17,9,6,0,Kapitan Zarubin -1,3,222,17,10,0,0,Kapitan Yevdokimov class (ice breakers) -1,3,222,17,10,1,0,Kapitan Uevdokimov -1,3,222,17,10,2,0,Kapitan Babichev -1,3,222,17,10,3,0,Kapitan Chudinov -1,3,222,17,10,4,0,Kapitan Borodkin -1,3,222,17,10,5,0,Avramiy Zavenyagin (ex-Kapitan Krylov) -1,3,222,17,10,6,0,Kapitan Metsayk -1,3,222,17,10,7,0,Kapitan Demidov -1,3,222,17,10,8,0,Kapitan Moshkin -1,3,222,17,11,0,0,Kapitan Izmaylov class (ice breakers) -1,3,222,17,11,1,0,Kapitan M. Izmaylov -1,3,222,17,11,2,0,Kapitan Kosolapov -1,3,222,17,11,3,0,Kapitan A. Radzabov -1,3,222,17,12,0,0,Stroptivy class (ice breakers) -1,3,222,17,12,1,0,Stroptivy -1,3,222,17,12,2,0,Stakhanovets -1,3,222,17,12,3,0,Sibirsky -1,3,222,17,12,4,0,Spravedlivy -1,3,222,17,12,5,0,Suvorovets -1,3,222,17,12,6,0,Fobos -1,3,222,17,12,7,0,Deymos -1,3,222,17,13,0,0,Ivan Susanin class (armed ice breakers) -1,3,222,17,13,1,0,Zaisberg -1,3,222,17,13,2,0,Neva -1,3,222,17,13,3,0,Dunay -1,3,222,17,13,4,0,Ruslan -1,3,222,17,13,5,0,Imeni XXVI Syezda KPSS -1,3,222,17,13,6,0,Volga -1,3,222,17,13,7,0,Ivan Susanin -1,3,222,17,13,8,0,Imeni XXV Syezda KPSS -1,3,222,18,0,0,0,Utility -1,3,222,18,1,0,0,Manych class (water tankers) -1,3,222,18,1,1,0,Manych -1,3,222,18,1,2,0,Tagil -1,3,222,18,2,0,0,Voda class (water carriers) -1,3,222,18,2,1,0,Abakan -1,3,222,18,2,2,0,Sura -1,3,222,18,2,3,0,MVT 6 -1,3,222,18,2,4,0,9 -1,3,222,18,2,5,0,10 -1,3,222,18,2,6,0,16 -1,3,222,18,2,7,0,17 -1,3,222,18,2,8,0,18 -1,3,222,18,2,9,0,20 -1,3,222,18,2,10,0,21 -1,3,222,18,2,11,0,24 -1,3,222,18,2,12,0,134 -1,3,222,18,2,13,0,135 -1,3,222,18,2,14,0,138 -1,3,222,18,3,0,0,Pelym class (degaussing ships (YDG)) -1,3,222,18,3,1,0,SR 70 -1,3,222,18,3,2,0,SR 111 -1,3,222,18,3,3,0,SR 179 -1,3,222,18,3,4,0,SR 180 -1,3,222,18,3,5,0,SR 191 -1,3,222,18,3,6,0,SR 203 -1,3,222,18,3,7,0,SR 215 -1,3,222,18,3,8,0,SR 218 -1,3,222,18,3,9,0,SR 221 -1,3,222,18,3,10,0,SR 222 -1,3,222,18,3,11,0,SR 233 -1,3,222,18,3,12,0,SR 241 -1,3,222,18,3,13,0,SR 276 -1,3,222,18,3,14,0,SR 280 -1,3,222,18,3,15,0,SR 281 -1,3,222,18,3,16,0,SR 407 -1,3,222,18,3,17,0,SR 409 -1,3,222,18,3,18,0,SR 455 -1,3,222,18,4,0,0,Bereza Class (degaussing ships (YDG)) -1,3,222,18,4,1,0,SR 28 -1,3,222,18,4,2,0,SR 59 -1,3,222,18,4,3,0,SR 74 -1,3,222,18,4,4,0,SR 120 -1,3,222,18,4,5,0,SR 137 -1,3,222,18,4,6,0,SR 188 -1,3,222,18,4,7,0,SR 216 -1,3,222,18,4,8,0,SR 370 -1,3,222,18,4,9,0,SR 478 -1,3,222,18,4,10,0,SR 479 -1,3,222,18,4,11,0,SR 541 -1,3,222,18,4,12,0,SR 548 -1,3,222,18,4,13,0,SR 568 -1,3,222,18,4,14,0,SR 569 -1,3,222,18,4,15,0,SR 570 -1,3,222,18,4,16,0,SR 936 -1,3,222,18,4,17,0,SR 939 -1,3,222,18,5,0,0,Khabarov class (degaussing ships (YDG)) -1,3,222,18,5,1,0,Khabarov -1,3,222,18,5,2,0,SR 164 -1,3,222,18,6,0,0,Sekstan class -1,3,222,18,7,0,0,Korall class -1,3,222,18,8,0,0,Baklazhan class (tugs) -1,3,222,18,8,1,0,SB 131 Nikolai Chiker -1,3,222,18,8,2,0,SB 135 -1,3,222,18,9,0,0,Neftegaz class (tugs) -1,3,222,18,9,1,0,Aleksey Kortunov -1,3,222,18,9,2,0,Ilga -1,3,222,18,9,3,0,Umka -1,3,222,18,9,4,0,Kalar -1,3,222,18,10,0,0,Goryn class (tugs) -1,3,222,18,10,1,0,MB 15 -1,3,222,18,10,2,0,MB 119 -1,3,222,18,10,3,0,MB 18 -1,3,222,18,10,4,0,SB 365 (ex-MB 29) -1,3,222,18,10,5,0,MB 32 -1,3,222,18,10,6,0,SB 521 (ex-MB 61) -1,3,222,18,10,7,0,MB 35 -1,3,222,18,10,8,0,SB 522 (ex-MB 62) -1,3,222,18,10,9,0,MB 36 -1,3,222,18,10,10,0,SB 523 (ex-MB 64) -1,3,222,18,10,11,0,MB 38 -1,3,222,18,10,12,0,SB 524 (ex-MB 108) -1,3,222,18,10,13,0,MB 105 -1,3,222,18,11,0,0,Sorum class (tugs) -1,3,222,18,11,1,0,Amur -1,3,222,18,11,2,0,Primorye -1,3,222,18,11,3,0,Brest -1,3,222,18,11,4,0,Bug -1,3,222,18,11,5,0,Burya -1,3,222,18,11,6,0,Chukotka -1,3,222,18,11,7,0,Kamchatka -1,3,222,18,11,8,0,Karelia -1,3,222,18,11,9,0,Ladoga -1,3,222,18,11,10,0,Neman -1,3,222,18,11,11,0,Sakhalin -1,3,222,18,11,12,0,Ural -1,3,222,18,11,13,0,Victor Kingsiepp -1,3,222,18,11,14,0,Yan Berzin -1,3,222,18,11,15,0,Yenisey -1,3,222,18,11,16,0,Zabaykalye -1,3,222,18,11,17,0,Zapolarye -1,3,222,18,11,18,0,MB 4 -1,3,222,18,11,19,0,MB 6 -1,3,222,18,11,20,0,MB 13 -1,3,222,18,11,21,0,MB 19 -1,3,222,18,11,22,0,MB 25 -1,3,222,18,11,23,0,MB 26 -1,3,222,18,11,24,0,MB 28 -1,3,222,18,11,25,0,MB 30 -1,3,222,18,11,26,0,MB 31 -1,3,222,18,11,27,0,MB 37 -1,3,222,18,11,28,0,MB 56 -1,3,222,18,11,29,0,MB 58 -1,3,222,18,11,30,0,MB 61 -1,3,222,18,11,31,0,MB 76 -1,3,222,18,11,32,0,MB 99 -1,3,222,18,11,33,0,MB 110 -1,3,222,18,11,34,0,MB 147 -1,3,222,18,11,35,0,MB 148 -1,3,222,18,11,36,0,MB 196 -1,3,222,18,11,37,0,MB 236 -1,3,222,18,11,38,0,MB 304 -1,3,222,18,11,39,0,MB 307 -1,3,222,18,12,0,0,Okhtensky class (tugs) -1,3,222,18,12,1,0,Loksa -1,3,222,18,12,2,0,Orion -1,3,222,18,12,3,0,Saturn -1,3,222,18,12,4,0,Neptun -1,3,222,18,12,5,0,Pochetny -1,3,222,18,12,6,0,Tyulen -1,3,222,18,13,0,0,Roslavl class (tugs) -1,3,222,18,13,1,0,MB 50 -1,3,222,18,13,2,0,MB 94 -1,3,222,18,13,3,0,MB 95 -1,3,222,18,13,4,0,MB 102 -1,3,222,18,13,5,0,MB 125 -1,3,222,18,13,6,0,MB 145 -1,3,222,18,13,7,0,MB 146 -1,3,222,18,13,8,0,MB 147 -1,3,222,18,13,9,0,SB 41 -1,3,222,18,13,10,0,SB 46 -1,3,222,18,14,0,0,Zenit class (tugs) -1,3,222,18,15,0,0,Scholle class (harbor tugs) -1,3,222,18,16,0,0,Tugur class (harbor tugs) -1,3,222,18,17,0,0,Sidehole (1, 2) classes (harbor tugs) -1,3,222,50,0,0,0,Frigate/Corvette -1,3,222,50,1,0,0,Grisha I class -1,3,222,50,1,1,0,Ametyst -1,3,222,50,1,2,0,Brilliant -1,3,222,50,1,3,0,Izumrud -1,3,222,50,1,4,0,Predanny -1,3,222,50,1,5,0,Rubin -1,3,222,50,1,6,0,Sapfir -1,3,222,50,1,7,0,Zhemchug -1,3,222,50,1,8,0,Provorny -1,3,222,50,2,0,0,Grisha II class -1,3,222,50,3,0,0,Grisha III class -1,3,222,50,4,0,0,Grisha V class -1,3,222,50,5,0,0,Mirka II class -1,3,222,50,6,0,0,Petya I class -1,3,222,50,7,0,0,Petya II class -1,3,222,50,8,0,0,Riga class -1,3,222,50,8,1,0,Astrakhan'skiy Kom. -1,3,222,50,8,2,0,Arkhangel'skiy Kom. -1,3,222,50,8,3,0,Bars -1,3,222,50,8,4,0,Barsuk -1,3,222,50,8,5,0,Bobr -1,3,222,50,8,6,0,Buyvol -1,3,222,50,8,7,0,Byk -1,3,222,50,8,8,0,Gepard -1,3,222,50,8,9,0,Giena -1,3,222,50,8,10,0,Kobchik -1,3,222,50,8,11,0,Komsomolets Gruziy -1,3,222,50,8,12,0,Komsomolets Litviy -1,3,222,50,8,13,0,Krasnodarskiy Kom. -1,3,222,50,8,14,0,Kunitsa -1,3,222,50,8,15,0,Leopard -1,3,222,50,8,16,0,Lev -1,3,222,50,8,17,0,Lisa -1,3,222,50,8,18,0,Medved -1,3,222,50,8,19,0,Pantera -1,3,222,50,8,20,0,Rys Rosomakha -1,3,222,50,8,21,0,Shakal -1,3,222,50,8,22,0,Tigr -1,3,222,50,8,23,0,Turman -1,3,222,50,8,24,0,Volk -1,3,222,50,8,25,0,Voron -1,3,222,50,8,26,0,Yaguar -1,3,222,50,9,0,0,Krivak III (Zaliv (Kerch)) -1,3,222,50,9,1,0,Menzhinsky -1,3,222,50,9,2,0,Derzhinsky -1,3,222,50,9,3,0,Imeni XXVII Sezda Kpss -1,3,222,50,9,4,0,Imeni lXX Letiya Vchk-Kgb -1,3,222,50,9,5,0,Imeni lXX Letiya Pogranvoysk -1,3,222,50,9,6,0,Kedrov -1,3,222,50,9,7,0,Vorovsky -1,3,222,50,10,0,0,Parchim II Class -1,3,222,52,0,0,0,Heavy Cruiser -1,4,222,1,0,0,0,SSBN (Nuclear Ballistic Missile) -1,4,222,1,1,0,0,Typhoon class -1,4,222,1,2,0,0,Delta IV class -1,4,222,1,3,0,0,Delta III class -1,4,222,1,4,0,0,Delta II class -1,4,222,1,5,0,0,Delta I class -1,4,222,1,6,0,0,Yankee I class -1,4,222,2,0,0,0,SSGN (Nuclear Guided Missile) -1,4,222,2,1,0,0,Oscar II class -1,4,222,2,2,0,0,Oscar I class -1,4,222,2,3,0,0,Charlie II class -1,4,222,2,4,0,0,Charlie I class -1,4,222,2,5,0,0,Echo II class -1,4,222,2,6,0,0,Yankee conversion class -1,4,222,3,0,0,0,SSN (Nuclear Attack-Torpedo) -1,4,222,3,1,0,0,Victor III Class -1,4,222,3,2,0,0,Victor II class -1,4,222,3,3,0,0,Victor I class -1,4,222,3,4,0,0,Yankee Notch class -1,4,222,3,5,0,0,Sierra II class -1,4,222,3,6,0,0,Sierra I class -1,4,222,3,7,0,0,Alfa class -1,4,222,3,8,0,0,Akula class -1,4,222,4,0,0,0,SSG (Conventional Guided Missile) -1,4,222,4,1,0,0,Juliett Class -1,4,222,5,0,0,0,SS (Conventional Attack-Torpedo, Patrol) -1,4,222,5,1,0,0,Kilo class -1,4,222,5,2,0,0,Tango class -1,4,222,5,3,0,0,Foxtrot class -1,4,222,6,0,0,0,SSAN (Nuclear Auxiliary) -1,4,222,6,1,0,0,Yankee class (ex-SSBN) -1,4,222,6,2,0,0,Uniform class -1,4,222,7,0,0,0,SSA (Conventional Auxiliary) -1,4,222,7,3,0,0,Lima class -1,4,222,7,4,0,0,Beluga class -1,4,222,7,5,0,0,X-Ray class -1,4,222,7,6,0,0,India class -1,4,222,7,7,0,0,Bravo class (target sub) -1,5,222,0,0,0,0,Other -1,5,222,0,1,0,0,Astronomical Module -1,5,222,0,1,1,0,Kavant 1 -1,5,222,0,1,2,0,Kavant 2 -1,5,222,0,1,3,0,Priroda -1,5,222,0,1,4,0,Spektrum -1,5,222,0,1,5,0,Kristall -1,5,222,1,0,0,0,Manned -1,5,222,1,1,0,0,Space Shuttle -1,5,222,1,1,1,0,Buran -1,5,222,1,2,0,0,Space Station -1,5,222,1,2,1,0,Mir -1,5,222,1,2,2,0,Kvant -1,5,222,1,2,3,0,Resurs-F2 -1,5,222,1,3,0,0,Space vehicles -1,5,222,1,3,1,0,Phobos 2 -1,5,222,1,3,2,0,Soyuz-TM -1,5,222,1,3,3,0,Phobos -1,5,222,1,3,4,0,Progress -1,5,222,1,3,5,0,Progress-M -1,5,222,1,3,6,0,Prognaz -1,5,222,1,3,7,0,Vostok -1,5,222,1,3,8,0,Molniya -1,5,222,1,3,9,0,Cosmos -1,5,222,1,3,10,0,Proton K -1,5,222,1,3,11,0,Proton KM -1,5,222,1,3,12,0,Tsyklon -1,5,222,1,3,13,0,Zenit -1,5,222,1,3,14,0,Lomonosov (MHB) -1,5,222,2,0,0,0,Unmanned -1,5,222,2,1,0,0,Communication satellite -1,5,222,2,1,1,0,Molniya -1,5,222,2,2,0,0,Navigation satellite -1,5,222,2,2,1,0,GEO-IK Geodedic Cosmos -1,5,222,2,2,2,0,Elektron -1,5,222,2,3,0,0,Early Warning satellite -1,5,222,2,3,1,0,Cosmos -1,5,222,2,4,0,0,Electronic Intelligence satellite -1,5,222,2,4,1,0,Elints -1,5,222,2,6,0,0,Ocean surveillance satellite -1,5,222,2,6,1,0,Okean -1,5,222,2,6,2,0,Eorsats -1,5,222,2,8,0,0,Optical imaging surveillance satellite -1,5,222,2,8,1,0,Venera -1,5,222,2,8,2,0,Generation -1,5,222,2,10,0,0,Minor military satellite -1,5,222,2,10,1,0,C2093 -1,5,222,2,10,2,0,C2002 -1,5,222,2,10,3,0,C2059 -1,5,222,2,10,4,0,C2075 -1,5,222,2,10,5,0,C2137 -1,5,222,2,10,6,0,C2164 -1,5,222,2,10,7,0,C1985 -1,5,222,2,10,8,0,C2053 -1,5,222,2,10,9,0,C2106 -1,5,222,2,11,0,0,Illuminating satellite -1,5,222,2,11,1,0,Reflector -1,5,222,2,11,2,0,Energia -1,5,222,2,12,0,0,Microwave activity -1,5,222,2,12,1,0,Relikt -1,1,224,1,0,0,0,Tank -1,1,224,1,1,0,0,Chieftain MBT -1,1,224,1,2,0,0,Challenger MBT -1,1,224,1,2,1,0,Mark I -1,1,224,1,2,2,0,Mark II -1,1,224,1,3,0,0,FV-101 Scorpion -1,1,224,2,0,0,0,Armored fighting vehicle -1,1,224,2,1,0,0,FV 432 Rarden (APC) -1,1,224,2,2,0,0,FV 103 Spartan (APC) -1,1,224,2,3,0,0,FV 601 Saladin -1,1,224,2,4,0,0,FV 107 Scimitar -1,1,224,2,5,0,0,FV 105 Sultan -1,1,224,2,6,0,0,FV 603 Saracen -1,1,224,2,7,0,0,AT 105 Saxon -1,1,224,2,8,0,0,FV 510 Warrior -1,1,224,2,9,0,0,FV 711 Ferret -1,1,224,2,10,0,0,FV 721 Fox -1,1,224,2,11,0,0,Tracked Rapier -1,1,224,2,12,0,0,FV 102 Striker -1,1,224,3,0,0,0,Armored utility vehicle -1,1,224,3,1,0,0,Chieftain ARV -1,1,224,3,2,0,0,Challenger ARV -1,1,224,3,3,0,0,Centurian AVRE -1,1,224,3,4,0,0,Chieftain AVRE -1,1,224,3,5,0,0,Combat Engineer tractor -1,1,224,3,6,0,0,Chieftain AVLB -1,1,224,3,7,0,0,Mobile bridge -1,1,224,3,7,1,0,M2 -1,1,224,3,7,2,0,M3 -1,1,224,4,0,0,0,Self-propelled artillery -1,1,224,4,1,0,0,FV 433 Abbot 105-mm Howitzer -1,1,224,4,2,0,0,M-109 155-mm Howitzer -1,1,224,4,3,0,0,M-107 175-mm Howitzer -1,1,224,4,4,0,0,M-110 203-mm Howitzer -1,1,224,5,0,0,0,Towed artillery -1,1,224,5,1,0,0,FH-70 155-mm gun -1,1,224,5,2,0,0,L-118 105-mm -1,1,224,5,3,0,0,M-56 105-mm -1,1,224,5,4,0,0,5.5-in/140-mm -1,1,224,6,0,0,0,Small wheeled utility vehicle -1,1,224,6,1,0,0,LWB Land Rover -1,1,224,6,2,0,0,Land Rover 6x6 truck -1,1,224,7,0,0,0,Large wheeled utility vehicle -1,1,224,8,0,0,0,Small tracked utility vehicle -1,1,224,9,0,0,0,Large tracked utility vehicle -1,1,224,10,0,0,0,Mortar -1,2,224,1,0,0,0,Fighter/Air Defense -1,2,224,1,1,0,0,Tornado ADV -1,2,224,1,1,1,0,Tornado F. Mk2 -1,2,224,1,1,2,0,Tornado F. Mk 2A -1,2,224,1,1,3,0,Tornado F. Mk 3 -1,2,224,1,2,0,0,Phantom FGR 2 -1,2,224,1,3,0,0,Eurofighter 2000 -1,2,224,2,0,0,0,Attack/Strike -1,2,224,2,1,0,0,Sea Harrier -1,2,224,2,1,1,0,Sea Harrier FRS. Mk 1 -1,2,224,2,1,2,0,Sea Harrier T. Mk 4 -1,2,224,2,1,3,0,Sea Harrier FRS. Mk 51 -1,2,224,2,2,0,0,Harrier -1,2,224,2,2,1,0,Harrier GR. Mk 3 -1,2,224,2,2,2,0,Harrier T. Mk 4 -1,2,224,2,2,3,0,Harrier GR. 5 -1,2,224,2,2,4,0,Harrier GR. 7 -1,2,224,2,2,5,0,VA.1 Matador (AV-8S & TAV-8S) -1,2,224,2,3,0,0,BAe HS Buccaneer -1,2,224,2,4,0,0,Tornado -1,2,224,2,4,1,0,Tornado GR Mk 1 -1,2,224,2,4,2,0,Tornado GR Mk 1A -1,2,224,2,4,3,0,Tornado GR Mk 4 -1,2,224,2,5,0,0,Jaguar -1,2,224,2,5,1,0,Jaguar GR1 Mk 1 -1,2,224,2,5,2,0,Jaguar GR1 Mk 1A -1,2,224,2,6,0,0,Bae Hawk -1,2,224,2,6,1,0,Hawk T Mk 1 -1,2,224,2,6,2,0,Hawk T Mk 1A -1,2,224,4,0,0,0,Cargo/Tanker -1,2,224,4,1,0,0,K-2 Victor -1,2,224,4,2,0,0,Hercules C130 -1,2,224,4,2,1,0,Hercules C. Mk 1 -1,2,224,4,2,2,0,Hercules C. Mk 1P -1,2,224,4,2,3,0,Hercules C. MK 1K -1,2,224,4,2,4,0,Hercules C. Mk 3P -1,2,224,4,3,0,0,BAe 146 -1,2,224,4,3,1,0,BAe 146 CC. Mk 2 -1,2,224,4,4,0,0,HS 125 Dominie -1,2,224,4,5,0,0,Sea Devon -1,2,224,4,6,0,0,Sea Heron -1,2,224,4,7,0,0,V-22 Osprey -1,2,224,4,8,0,0,BAe (BAC/Vickers) VC-10 -1,2,224,4,8,1,0,VC-10 C. Mk1(K) -1,2,224,4,8,2,0,VC-10 K. Mk 2 -1,2,224,4,8,3,0,VC-10 K. Mk 3 -1,2,224,4,8,4,0,VC-10 K. Mk 4 -1,2,224,4,9,0,0,Pilatus Britten-Norman Defender -1,2,224,4,10,0,0,Pilatus B-N Maritime Defender -1,2,224,4,11,0,0,Pilatus Britten-Norman BN-2T Turbine Defender -1,2,224,4,11,1,0,Islander CC. Mk 2 -1,2,224,4,11,2,0,Islander AL. Mk 1 -1,2,224,4,12,0,0,Shorts 330 Sherpa -1,2,224,4,12,1,0,C-23A -1,2,224,4,12,2,0,C-23B -1,2,224,4,12,3,0,Shorts 330-UTT -1,2,224,4,13,0,0,BAe 125-800 -1,2,224,4,13,1,0,C-29A -1,2,224,4,13,2,0,U-125A -1,2,224,4,14,0,0,BAe HS 748MF -1,2,224,4,14,1,0,Andover C. Mk 1 -1,2,224,4,15,0,0,Vickers VC2 Viscount -1,2,224,4,16,0,0,L-1011 TriStar -1,2,224,4,16,1,0,TriStar KC Mk 1 -1,2,224,4,16,2,0,TriStar K Mk 1 -1,2,224,4,16,3,0,TriStar C Mk 2 -1,2,224,5,0,0,0,ASW/patrol/observation -1,2,224,5,1,0,0,Nimrod -1,2,224,5,1,1,0,Nimrod R Mk 1 -1,2,224,5,1,2,0,Nimrod MR Mk 2 -1,2,224,5,1,3,0,Nimrod MR Mk 2P -1,2,224,5,1,4,0,Nimrod MR Mk 3 -1,2,224,5,2,0,0,BAe P. 132 -1,2,224,5,3,0,0,Islander -1,2,224,5,3,1,0,Islander AL. Mk 1 -1,2,224,7,0,0,0,Reconnnaisance -1,2,224,7,1,0,0,English Electric Canberra -1,2,224,7,1,1,0,Canberra PR Mk 7 -1,2,224,7,1,2,0,Canberra PR Mk 9 -1,2,224,7,2,0,0,HS Buccaneer -1,2,224,7,2,1,0,Buccaneer S. Mk 2A -1,2,224,7,3,0,0,Tornado -1,2,224,7,3,1,0,Tornado GR Mk 1 -1,2,224,8,0,0,0,Surveillance/C2 -1,2,224,8,1,0,0,E-3D Sentry AEW Mk 1 -1,2,224,8,2,0,0,Andover -1,2,224,8,2,1,0,Andover C. Mk1 -1,2,224,8,3,0,0,Canberra -1,2,224,8,3,1,0,B Mk 2 -1,2,224,8,3,2,0,T Mk 4 -1,2,224,8,3,3,0,E Mk 15 -1,2,224,8,3,4,0,E Mk 17 -1,2,224,8,3,5,0,TT Mk 18 -1,2,224,8,3,6,0,TT Mk 22 -1,2,224,8,4,0,0,Hawker Hunter -1,2,224,8,4,1,0,GA 11 -1,2,224,8,4,2,0,T. Mk 7 -1,2,224,8,4,3,0,T. Mk 8 -1,2,224,8,4,4,0,PR Mk 11 -1,2,224,8,5,0,0,Mystere-Falcon 20 -1,2,224,21,0,0,0,Utility helicopter -1,2,224,21,2,0,0,Westland Lynx -1,2,224,21,2,1,0,Mk 5 -1,2,224,21,2,2,0,HAS. Mk 2 -1,2,224,21,2,3,0,HAS. Mk 3 -1,2,224,21,2,4,0,HAS. Mk 2(FN) -1,2,224,21,2,5,0,HAS. Mk 3(FN) -1,2,224,21,2,6,0,MK 21 -1,2,224,21,2,7,0,Mk 23 -1,2,224,21,2,8,0,Mk 25 -1,2,224,21,2,9,0,Mk 27 -1,2,224,21,2,10,0,Mk 81 -1,2,224,21,2,11,0,Mk 28 -1,2,224,21,2,12,0,Mk 80 -1,2,224,21,2,13,0,Mk 90 -1,2,224,21,2,14,0,Mk 86 -1,2,224,21,2,15,0,Mk 95 -1,2,224,21,2,16,0,Mk 99 -1,2,224,21,2,17,0,AH. Mk1 -1,2,224,21,2,18,0,AH. Mk 7 -1,2,224,21,2,19,0,AH. Mk 9 -1,2,224,21,3,0,0,SA341 Gazelle -1,2,224,21,3,1,0,HT Mk 2 -1,2,224,21,3,2,0,HT Mk 3 -1,2,224,21,6,0,0,Puma -1,2,224,21,7,0,0,Jet Provost -1,2,224,21,8,0,0,Westland Wessex -1,2,224,21,8,1,0,HC.MK 2 -1,2,224,21,8,2,0,HC.MK 5 -1,2,224,21,9,0,0,Scout -1,2,224,21,10,0,0,Wasp -1,2,224,21,14,0,0,Alouette II -1,2,224,21,16,0,0,A109 -1,2,224,21,17,0,0,CH 47 Chinook -1,2,224,21,18,0,0,SA 330 -1,2,224,21,19,0,0,Westland Super Lynx -1,2,224,21,19,1,0,Mk 95 -1,2,224,21,19,2,0,Mk 99 -1,2,224,22,0,0,0,Antisubmarine Warfare / Patrol Helicopter -1,2,224,22,1,0,0,Westland Sea King -1,2,224,22,1,1,0,HAS. Mk 1 -1,2,224,22,1,2,0,HAS. Mk 2 -1,2,224,22,1,3,0,HAS. Mk 5 -1,2,224,22,1,4,0,HAS. Mk 6 -1,2,224,22,1,5,0,AEW. Mk 2A -1,2,224,22,1,6,0,HAR. Mk 3 -1,2,224,22,1,7,0,HAR. Mk 5 -1,2,224,22,1,8,0,Mk 41 -1,2,224,22,1,9,0,Mk 42 -1,2,224,22,1,10,0,Mk 42A -1,2,224,22,1,11,0,Mk 42B -1,2,224,22,1,12,0,Mk 43 -1,2,224,22,1,13,0,Mk 43A -1,2,224,22,1,14,0,Mk 43B -1,2,224,22,1,15,0,Mk 45 -1,2,224,22,1,16,0,Mk 47 -1,2,224,22,1,17,0,Mk 48 -1,2,224,22,1,18,0,Mk 50 -1,2,224,23,0,0,0,Cargo Helicopter -1,2,224,23,1,0,0,Westland Commando -1,2,224,23,1,1,0,Commando Mk 1 -1,2,224,23,1,2,0,Commando Mk 2 -1,2,224,23,1,3,0,Commando Mk 2B -1,2,224,23,1,4,0,Commando Mk 2E -1,2,224,23,1,5,0,Commando Mk 2A -1,2,224,23,1,6,0,Commando Mk 2C -1,2,224,23,1,7,0,Commando Mk 3 -1,2,224,23,1,8,0,Indian Sea King Mk 42C -1,2,224,23,1,9,0,Sea King HC. Mk -1,2,224,40,0,0,0,Trainer -1,2,224,40,1,0,0,Shorts S312 Tucano -1,2,224,40,1,1,0,T. Mk 1 -1,2,224,40,2,0,0,Bulldog -1,2,224,40,2,1,0,T. MK 1 -1,2,224,40,3,0,0,Chipmunk -1,2,224,40,4,0,0,Pilatus Britten-Norman BN-2T -1,2,224,40,4,1,0,Turbine Islander -1,2,224,40,5,0,0,BAe Hawk -1,2,224,40,5,1,0,Hawk T. Mk 1 -1,2,224,40,5,2,0,Hawk T. Mk 1A -1,2,224,40,5,3,0,Goshawk T-45A -1,2,224,40,6,0,0,BAe Jetstream Super 31 -1,2,224,40,6,1,0,Jetstream T Mk 2 -1,2,224,40,6,2,0,Jetstream T Mk 3 -1,2,224,40,7,0,0,Chieftain -1,2,224,40,8,0,0,BAe 125-800 -1,2,224,40,8,1,0,C-29A -1,2,224,40,8,2,0,U-125A -1,2,224,40,9,0,0,Slingsby T67 Firefly -1,2,224,40,9,1,0,T67M Mk II -1,2,224,40,9,2,0,T67M260 -1,2,224,40,10,0,0,Provost -1,2,224,40,10,1,0,T Mk 5 -1,2,224,50,0,0,0,Unmanned vehicles -1,2,224,50,1,0,0,English Electric Canberra -1,2,224,50,1,1,0,PR Mk10 -1,3,224,4,0,0,0,Guided-missile Destroyer -1,3,224,4,1,0,0,Type 42 -1,3,224,4,1,1,0,D 86 Birmingham -1,3,224,4,1,2,0,D 87 Newcastle -1,3,224,4,1,3,0,D 88 Glasgow -1,3,224,4,1,4,0,D 108 Cardiff -1,3,224,4,1,5,0,D 89 Exeter -1,3,224,4,1,6,0,D 90 Southampton -1,3,224,4,1,7,0,D 91 Nottingham -1,3,224,4,1,8,0,D 92 Liverpool -1,3,224,4,1,9,0,D 95 Manchester -1,3,224,4,1,10,0,D 96 Gloucester -1,3,224,4,1,11,0,D 97 Edinburgh -1,3,224,4,1,12,0,D 98 York -1,3,224,6,0,0,0,Guided-missile Frigate -1,3,224,6,1,0,0,Duke class (Type 23) -1,3,224,6,1,1,0,F 230 Norfolk -1,3,224,6,1,2,0,F 231 Argyll -1,3,224,6,1,3,0,F 229 Lancaster (ex-F 232) -1,3,224,6,1,4,0,F 233 Marlborough -1,3,224,6,1,5,0,F 234 Iron Duke -1,3,224,6,1,6,0,F 235 Monmouth -1,3,224,6,1,7,0,F 236 Montrose -1,3,224,6,1,8,0,F 237 Westminster -1,3,224,6,1,9,0,F 238 Northumberland -1,3,224,6,1,10,0,F 239 Richmond -1,3,224,6,1,11,0,F 240 Somerset -1,3,224,6,1,12,0,F 241 Grafton -1,3,224,6,1,13,0,F 242 Sutherland -1,3,224,6,2,0,0,Broadsword class (Type 22) -1,3,224,6,2,1,0,F 88 Broadsword -1,3,224,6,2,2,0,F 89 Battleaxe -1,3,224,6,2,3,0,F 90 Brilliant -1,3,224,6,2,4,0,F 91 Brazen -1,3,224,6,2,5,0,F 92 Boxer -1,3,224,6,2,6,0,F 93 Beaver -1,3,224,6,2,7,0,F 94 Brave -1,3,224,6,2,8,0,F 95 London (ex-Bloodhound) -1,3,224,6,2,9,0,F 96 Sheffield -1,3,224,6,2,10,0,F 98 Coventry -1,3,224,6,2,11,0,F 85 Cumberland -1,3,224,6,2,12,0,F 86 Campbeltown -1,3,224,6,2,13,0,F 87 Chatham -1,3,224,6,2,14,0,F 99 Cornwall -1,3,224,6,3,0,0,Amazon class (Type 21) -1,3,224,6,3,1,0,F 169 Amazon -1,3,224,6,3,2,0,F 171 Active -1,3,224,6,3,3,0,F 172 Ambuscade -1,3,224,6,3,4,0,F 173 Arrow -1,3,224,6,3,5,0,F 174 Alacrity -1,3,224,6,3,6,0,F 185 Avenger -1,4,224,6,4,0,0,Leander class -1,4,224,6,4,1,0,F 40 Sirius -1,4,224,6,4,2,0,F 56 Argonaut -1,4,224,6,4,3,0,F 57 Andromeda -1,4,224,6,4,4,0,F 71 Scylla -1,4,224,7,0,0,0,Light/patrol craft -1,4,224,7,1,0,0,Antarctic patrol ship -1,4,224,7,1,1,0,A 176 Polar Circle -1,4,224,7,2,0,0,Castle class (offshore patrol vessels MK 2) -1,4,224,7,2,1,0,P 258 Leeds Castle -1,4,224,7,2,2,0,Dumbarton Castle -1,4,224,7,3,0,0,Island class (offshore patrol vessels) -1,4,224,7,3,1,0,P 277 Anglesey -1,4,224,7,3,2,0,P 278 Alderney -1,4,224,7,3,3,0,P 295 Jersey -1,4,224,7,3,4,0,P 297 Guernsey -1,4,224,7,3,5,0,P 298 Shetland -1,4,224,7,3,6,0,P 299 Orkney -1,4,224,7,3,7,0,P 300 Lindisfarne -1,4,224,7,4,0,0,Peacock class (large patrol craft) -1,4,224,7,4,1,0,P 239 Peacock -1,4,224,7,4,2,0,P 240 Plover -1,4,224,7,4,3,0,P 241 Starling -1,4,224,7,5,0,0,Bird and Seal class (large patrol craft) -1,4,224,7,5,1,0,P 259 Redpole (ex-Sea Otter) -1,4,224,7,5,2,0,P 260 Kingfisher -1,4,224,7,5,3,0,P 261 Cygnet -1,4,224,7,6,0,0,Archer class (training and patrol craft) -1,4,224,7,6,1,0,P 264 Archer -1,4,224,7,6,2,0,P 270 Biter -1,4,224,7,6,3,0,P 272 Smiter -1,4,224,7,6,4,0,P 273 Pursuer -1,4,224,7,6,5,0,P 279 Blazer -1,4,224,7,6,6,0,P 280 Dasher -1,4,224,7,6,7,0,P 291 Puncher -1,4,224,7,6,8,0,P 292 Charger -1,4,224,7,6,9,0,P 293 Ranger -1,4,224,7,6,10,0,P 294 Trumpeter -1,4,224,7,6,11,0,A 153 Example (RNXS) -1,4,224,7,6,12,0,A 154 Explorer (RNXS) -1,4,224,7,6,13,0,A 163 Express (RNXS) -1,4,224,7,6,14,0,A 167 Exploit (RNXS) -1,4,224,8,0,0,0,Mine Countermeasure Ship / Craft -1,4,224,8,1,0,0,Hunt class (minesweepers/minehunters, coastal) -1,4,224,8,1,1,0,M 29 Brecon -1,4,224,8,1,2,0,M 30 Ledbury -1,4,224,8,1,3,0,M 31 Cattistock -1,4,224,8,1,4,0,M 32 Cottesmore -1,4,224,8,1,5,0,M 33 Brocklesby -1,4,224,8,1,6,0,M 34 Middleton -1,4,224,8,1,7,0,M 35 Dulverton -1,4,224,8,1,8,0,M 36 Bicester -1,4,224,8,1,9,0,M 37 Chiddingfold -1,4,224,8,1,10,0,M 38 Atherstone -1,4,224,8,1,11,0,M 39 Hurworth -1,4,224,8,1,12,0,M 40 Berkeley -1,4,224,8,1,13,0,M 41 Quorn -1,4,224,8,2,0,0,River class (minesweepers, coastal) -1,4,224,8,2,1,0,M 2003 Waveney -1,4,224,8,2,2,0,M 2004 Carron -1,4,224,8,2,3,0,M 2005 Dovey -1,4,224,8,2,4,0,M 2006 Helford -1,4,224,8,2,5,0,M 2007 Humber -1,4,224,8,2,6,0,M 2008 Blackwater -1,4,224,8,2,7,0,M 2009 Itchen -1,4,224,8,2,8,0,M 2010 Helmsdale -1,4,224,8,2,9,0,M 2011 Orwell -1,4,224,8,2,10,0,M2012 Ribble -1,4,224,8,2,11,0,M 2013 Spey -1,4,224,8,2,12,0,M 2014 Arun -1,4,224,8,3,0,0,Ton class (coastal minehunters) -1,4,224,8,3,1,0,M 1114 Brinton -1,4,224,8,3,2,0,M 1151 Iveston -1,4,224,8,3,3,0,M 1154 Kellington -1,4,224,8,3,4,0,M 1166 Nurton -1,4,224,8,3,5,0,M 1181 Sheraton -1,4,224,8,4,0,0,Sandown class (minehunters) -1,4,224,8,4,1,0,M 101 Sandown -1,4,224,8,4,2,0,M 102 Inverness -1,4,224,8,4,3,0,M 103 Cromer -1,4,224,8,4,4,0,M 104 Walney -1,4,224,8,4,5,0,M 105 Bridport -1,4,224,12,0,0,0,Light carrier -1,4,224,12,1,0,0,Light aircraft carrier (CVSG) -1,4,224,12,1,1,0,R 05 Invincible -1,4,224,12,1,2,0,R 06 Illustrious -1,4,224,12,1,3,0,R 07 Ark Royal -1,4,224,16,0,0,0,Auxiliary -1,4,224,16,1,0,0,Leander class (training ships) -1,4,224,16,1,1,0,F 52 Juno -1,4,224,16,2,0,0,Dartmouth training ship -1,4,224,16,2,1,0,M1116 Wilton -1,4,224,16,3,0,0,Improved Hecla class (survey) -1,4,224,16,3,1,0,A 138 Herald -1,4,224,16,4,0,0,Hecla class (survey) -1,4,224,16,4,1,0,A 133 Hecla -1,4,224,16,5,0,0,A 317 Bulldog class (survey) -1,4,224,16,5,1,0,A 317 Bulldog -1,4,224,16,5,2,0,A 319 Beagle -1,4,224,16,6,0,0,Roebuck class (survey) -1,4,224,16,6,1,0,A 130 Roebuck -1,4,224,16,7,0,0,Ol class (large fleet tankers (AO)) -1,4,224,16,7,1,0,A 122 Olwen -1,4,224,16,7,2,0,A 123 Olna -1,4,224,16,7,3,0,A 124 Olmeda -1,4,224,16,8,0,0,Appleleaf class (support tankers (AOT)) -1,4,224,16,8,1,0,A 81 Brambleleaf (ex-Hudson Cavalier) -1,4,224,16,8,2,0,A 109 Bayleaf -1,4,224,16,8,3,0,A 110 Orangeleaf (ex-Balder London, ex-Hudson Progress) -1,4,224,16,9,0,0,Rover class (small fleet tankers (AOL)) -1,4,224,16,9,1,0,A 269 Grey Rover -1,4,224,16,9,2,0,A 270 Blue rover -1,4,224,16,9,3,0,A 271 Gold rover -1,4,224,16,9,4,0,A 273 Black rover -1,4,224,16,10,0,0,Fort Victoria class (fleet replenishment) -1,4,224,16,10,1,0,A 387 Fort Victoria -1,4,224,16,10,2,0,A 388 Fort George -1,4,224,16,11,0,0,Fort Grange class (AFS(H)) -1,4,224,16,11,1,0,A 385 Fort Grange -1,4,224,16,11,2,0,A 386 Fort Austin -1,4,224,16,12,0,0,Regent class (AFS(H)) -1,4,224,16,12,1,0,A 480 Resource -1,4,224,16,12,2,0,A 486 Regent -1,4,224,16,13,0,0,Stena type (forward repair ship) -1,4,224,16,13,1,0,A 132 Diligence (ex-Stena Inspector) -1,4,224,16,14,0,0,Sal Class (salvage & mooring) -1,4,224,16,14,1,0,A 185 Salmoor -1,4,224,16,14,2,0,A 186 Salmaster -1,4,224,16,14,3,0,A 187 Salmaid -1,4,224,16,15,0,0,Wild Duck class (salvage & mooring) -1,4,224,16,15,1,0,A 164 Goosander -1,4,224,16,15,2,0,A 165 Pochard -1,4,224,16,16,0,0,Moorhen class (salvage & mooring) -1,4,224,16,16,1,0,Y 32 Moorhen -1,4,224,16,16,2,0,Y 33 Moorfowl -1,4,224,16,16,3,0,A 72 Cameron -1,4,224,16,17,0,0,Oilpress class (coastal tankers) -1,4,224,16,17,1,0,Y 21 Oilpress -1,4,224,16,17,2,0,Y 22 Oilstone -1,4,224,16,17,3,0,Y 23 Oilwell -1,4,224,16,17,4,0,Y 25 Oilbird -1,4,224,16,17,5,0,Y 26 Oilman -1,4,224,16,18,0,0,Tornado class (torpedo recovery) -1,4,224,16,18,1,0,A 140 Tornado -1,4,224,16,18,2,0,A 141 Torch a 141 -1,4,224,16,18,3,0,A 142 Tormentor -1,4,224,16,18,4,0,A 143 Toreador -1,4,224,16,19,0,0,Water class (water carriers) -1,4,224,16,19,1,0,Y 17 Waterfall -1,4,224,16,19,2,0,Y 18 Watershed -1,4,224,16,19,3,0,Y 19 Waterspout -1,4,224,16,19,4,0,Y 30 Watercourse -1,4,224,16,19,5,0,Y 31 Waterfowl -1,4,224,16,19,6,0,A 146 Waterman -1,4,224,16,20,0,0,Seal class (lrrsc) (aviation support) -1,4,224,16,20,1,0,5000 Seal -1,4,224,16,20,2,0,5001 Seagull -1,4,224,16,21,0,0,Spitfire class (rttl mk 3) (aviation support) -1,4,224,16,21,1,0,4000 Spitfire -1,4,224,16,21,2,0,4003 Halifax -1,4,224,16,21,3,0,4004 Hampden -1,4,224,16,21,4,0,4005 Hurricane -1,4,224,16,21,5,0,4006 Lancaster -1,4,224,16,21,6,0,4007 Wellington -1,4,224,16,22,0,0,Insect class (fleet tenders) -1,4,224,16,22,1,0,A 216 Bee -1,4,224,16,22,2,0,A 229 Cricket -1,4,224,16,22,3,0,A 230 Cockchafer -1,4,224,16,22,4,0,A 239 Gnat -1,4,224,16,22,5,0,A 253 Ladybird -1,4,224,16,22,6,0,A 263 Cicada -1,4,224,16,22,7,0,A 272 Scarab -1,4,224,16,23,0,0,Loyal class (RNXs) (fleet tenders) -1,4,224,16,23,1,0,A 157 Loyal Helper -1,4,224,16,23,2,0,A 158 Supporter (ex-Loyal Supporter) -1,4,224,16,23,3,0,A 159 Loyal Watcher -1,4,224,16,23,4,0,A 160 Loyal Volunteer -1,4,224,16,23,5,0,A 161 Loyal Mediator -1,4,224,16,23,6,0,A 220 Loyal Moderator -1,4,224,16,23,7,0,A 1770 Loyal Chancellor -1,4,224,16,23,8,0,A 1771 Loyal Proctor -1,4,224,16,24,0,0,Clovelly class (fleet tenders) -1,4,224,16,24,1,0,A 207 Llandovery -1,4,224,16,24,2,0,A 208 Lamlash -1,4,224,16,24,3,0,A 211 Lechlade -1,4,224,16,24,4,0,A 251 Lydford (ex-Loyal Governor, ex-Alert) -1,4,224,16,24,5,0,A 254 Meavy (ex-Loyal Factor, ex-Vigilant) -1,4,224,16,24,6,0,A 274 Ettrick -1,4,224,16,24,7,0,A 277 Elsing -1,4,224,16,24,8,0,A 341 Fotherby -1,4,224,16,24,9,0,A 348 Felsted -1,4,224,16,24,10,0,A 353 Elkstone -1,4,224,16,24,11,0,A 354 Froxfield -1,4,224,16,24,12,0,A 355 Epworth -1,4,224,16,24,13,0,A 365 Fulbeck -1,4,224,16,24,14,0,A 381 Cricklade -1,4,224,16,24,15,0,A 391 Criccieth -1,4,224,16,24,16,0,A 392 Glencoe -1,4,224,16,24,17,0,A 393 Dunster -1,4,224,16,24,18,0,A 394 Fintry -1,4,224,16,24,19,0,A 402 Grasmere -1,4,224,16,24,20,0,A 488 Cromarty -1,4,224,16,24,21,0,A 490 Dornoch -1,4,224,16,24,22,0,A 1766 Headcorn -1,4,224,16,24,23,0,A 1767 Hever -1,4,224,16,24,24,0,A 1768 Harlech -1,4,224,16,24,25,0,A 1769 Hambledon -1,4,224,16,24,26,0,A 1772 Holmwood -1,4,224,16,24,27,0,A 1773 Horning -1,4,224,16,25,0,0,Manly class (fleet tenders) -1,4,224,16,25,1,0,A 83 Melton -1,4,224,16,25,2,0,A 84 Menai -1,4,224,16,25,3,0,A 87 Meon -1,4,224,16,25,4,0,A 91 Milford -1,4,224,16,25,5,0,A 107 Messina -1,4,224,16,26,0,0,Magnet class (degaussing vessels) -1,4,224,16,26,1,0,A 114 Magnet -1,4,224,16,26,2,0,A 115 Lodestone -1,4,224,16,27,0,0,Aberdovey class (auxiliary training vessels) -1,4,224,16,27,1,0,A 100 Beddgelert -1,4,224,16,27,2,0,A 103 Sultan Venturer (ex-Bibury) -1,4,224,16,27,3,0,A 383 Appleby -1,4,224,16,27,4,0,Y 10 Aberdovey -1,4,224,16,27,5,0,Y 11 Abinger -1,4,224,16,27,6,0,Y 13 Alnmouth -1,4,224,17,0,0,0,Auxiliary, Merchant Marine -1,4,224,17,1,0,0,Avon class (Royal Corps of Transport) -1,4,224,17,1,1,0,RPL 05 Eden -1,4,224,17,1,2,0,RPL 06 Forth -1,4,224,17,1,3,0,RPL 12 Medway -1,4,224,17,2,0,0,Adept class (TUTT) (tugs) -1,4,224,17,2,1,0,A 221 Forceful -1,4,224,17,2,2,0,A 222 Nimble -1,4,224,17,2,3,0,A 223 Powerful -1,4,224,17,2,4,0,A 224 Adept -1,4,224,17,2,5,0,A 225 Bustler -1,4,224,17,2,6,0,A 226 Capable -1,4,224,17,2,7,0,A 227 Careful -1,4,224,17,2,8,0,A 228 Faithful -1,4,224,17,2,9,0,A 231 Dexterous -1,4,224,17,3,0,0,Dog class (tugs and range-trials vessels) -1,4,224,17,3,1,0,A 106 Alsatian -1,4,224,17,3,2,0,A 126 Cairn -1,4,224,17,3,3,0,A 129 Dalmatian -1,4,224,17,3,4,0,A 155 Deerhound -1,4,224,17,3,5,0,A 162 Elkhound -1,4,224,17,3,6,0,A 168 Labrador -1,4,224,17,3,7,0,A 178 Husky -1,4,224,17,3,8,0,A 180 Mastiff -1,4,224,17,3,9,0,A 182 Saluki -1,4,224,17,3,10,0,A 188 Pointer -1,4,224,17,3,11,0,A 189 Setter -1,4,224,17,3,12,0,A 197 Sealyham -1,4,224,17,3,13,0,A 201 Spaniel -1,4,224,17,3,14,0,A 250 Sheepdog -1,4,224,17,3,15,0,A 326 Foxhound (ex-Boxer) -1,4,224,17,3,16,0,A 327 Basset (ex-Beagle) -1,4,224,17,3,17,0,A 328 Collie -1,4,224,17,3,18,0,A 330 Corgi -1,4,224,17,4,0,0,Modified Girl Class -1,4,224,17,4,1,0,A 156 Daphne -1,4,224,17,4,2,0,A 177 Edith -1,4,224,17,5,0,0,Triton class -1,4,224,17,5,1,0,A 166 Kathleen -1,4,224,17,5,2,0,A 170 Kitty -1,4,224,17,5,3,0,A 172 Lesley -1,4,224,17,5,4,0,A 174 Lilah -1,4,224,17,5,5,0,A 175 Mary -1,4,224,17,5,6,0,A 181 Irene -1,4,224,17,5,7,0,A 183 Isabel -1,4,224,17,5,8,0,A 190 Joan -1,4,224,17,5,9,0,A 193 Joyce -1,4,224,17,5,10,0,A 199 Myrtle -1,4,224,17,5,11,0,A 202 Nancy -1,4,224,17,5,12,0,A 205 Norah -1,4,224,17,6,0,0,Felicity class -1,4,224,17,6,1,0,A 112 Felicity -1,4,224,17,6,2,0,A 147 Frances -1,4,224,17,6,3,0,A 148 Fiona -1,4,224,17,6,4,0,A 149 Florence -1,4,224,17,6,5,0,A 150 Genevieve -1,4,224,17,6,6,0,A 152 Georgina -1,4,224,17,6,7,0,A 196 Gwendoline -1,4,224,17,6,8,0,A 198 Helen -1,4,224,56,0,0,0,Amphibious transport dock -1,4,224,56,1,0,0,Assault ships (LPD) -1,4,224,56,1,1,0,L 10 Fearless -1,4,224,56,1,2,0,L 11 Intrepid -1,5,224,1,0,0,0,SSBN (Nuclear Ballistic Missiles) -1,5,224,1,1,0,0,Vanguard Class -1,5,224,1,1,1,0,05 Vanguard -1,5,224,1,1,2,0,06 Victorious -1,5,224,1,1,3,0,07 Vigilant -1,5,224,1,1,4,0,08 -1,5,224,1,2,0,0,Resolution Class -1,5,224,1,2,1,0,S 22 Resolution -1,5,224,1,2,2,0,S 23 Repulse -1,5,224,1,2,3,0,S 26 Renown -1,5,224,1,2,4,0,S 27 Revenge -1,5,224,3,0,0,0,SSN (Nuclear Attack-Torpedo) -1,5,224,3,1,0,0,Trafalgar Class -1,5,224,3,1,1,0,S 87 Turbulent -1,5,224,3,1,2,0,S 88 Tireless -1,5,224,3,1,3,0,S 90 Torbay -1,5,224,3,1,4,0,S 91 Trenchant -1,5,224,3,1,5,0,S 92 Talent -1,5,224,3,1,6,0,S 93 Triumph -1,5,224,3,1,7,0,S 107 Trafalgar -1,5,224,3,2,0,0,Swiftsure Class -1,5,224,3,2,1,0,S 104 Sceptre -1,5,224,3,2,2,0,S 105 Spartan -1,5,224,3,2,3,0,S 106 Splendid -1,5,224,3,2,4,0,S 108 Sovereign -1,5,224,3,2,5,0,S 109 Superb -1,5,224,3,3,0,0,Valiant Class -1,5,224,3,3,1,0,S 102 Valiant -1,5,224,5,0,0,0,SS (Conventional Attack-Torpedo, Patrol) -1,5,224,5,1,0,0,Upholder class (Type 2400) -1,5,224,5,1,1,0,S 40 Upholder -1,5,224,5,1,2,0,S 41 Unseen -1,5,224,5,1,3,0,S 42 Ursula -1,5,224,5,1,4,0,S 43 Unicorn -1,5,224,5,2,0,0,Oberon Class -1,5,224,5,2,1,0,S 16 Oracle -1,5,224,5,2,2,0,S 19 Opossum -1,5,224,5,2,3,0,S 20 Opportune -1,5,224,5,1,0,0,Communication satellite -1,5,224,5,1,1,0,Skynet 4 -1,5,224,5,1,2,0,Skynet 4A -1,5,224,5,1,3,0,Skynet 4B -1,5,224,5,1,4,0,Skynet 4C -1,5,224,5,1,5,0,NATO 4 -1,5,224,5,1,6,0,ECS -1,5,224,5,1,7,0,Eurostar -1,1,71,1,0,0,0,Tank -1,1,71,1,1,0,0,AMX-30 -1,1,71,1,1,1,0,AMX-30B2 -1,1,71,1,2,0,0,AMX-13 Light Tank -1,1,71,1,3,0,0,AMX-40 MBT -1,1,71,2,0,0,0,Armored fighting vehicle -1,1,71,2,1,0,0,VBC-90 armored car -1,1,71,2,2,0,0,ERC-90 armored car -1,1,71,2,3,0,0,AML-90 armored car -1,1,71,2,4,0,0,AML-60 armored car -1,1,71,2,5,0,0,VAB APC -1,1,71,2,6,0,0,AMX-10RC armored car -1,1,71,2,7,0,0,AMX-13 IFV -1,1,71,2,8,0,0,AMX-10 IFV -1,1,71,2,9,0,0,EBR armored car -1,1,71,2,10,0,0,AMX-13 VCI APC -1,1,71,2,11,0,0,AMX-13 DCA -1,1,71,2,12,0,0,Berliet VXB armored car -1,1,71,2,13,0,0,Panhard EBR -1,1,71,3,0,0,0,Armored utility vehicle -1,1,71,3,1,0,0,AMX-10 ECH Recovery Vehicle -1,1,71,4,0,0,0,Self-propelled artillery -1,1,71,4,1,0,0,A UF1 155-mm Howitzer -1,1,71,4,2,0,0,AMX 105-mm Howitzer -1,1,71,4,3,0,0,AU-50 105-mm Howitzer -1,1,71,4,4,0,0,F-3 155-mm gun -1,1,71,5,0,0,0,Towed artillery -1,1,71,5,1,0,0,TR 155-mm Howitzer -1,1,71,6,0,0,0,Small wheeled utility vehicle -1,1,71,7,0,0,0,Large wheeled utility vehicle -1,1,71,8,0,0,0,Small tracked utility vehicle -1,1,71,9,0,0,0,Large tracked utility vehicle -1,1,71,10,0,0,0,Mortar -1,2,71,1,0,0,0,Fighter/Air Defense -1,2,71,1,1,0,0,Mirage F-1 -1,2,71,1,1,1,0,F1-AD -1,2,71,1,1,2,0,F1-AZ -1,2,71,1,1,3,0,F1-B -1,2,71,1,1,4,0,F1-BD -1,2,71,1,1,5,0,F1-BE -1,2,71,1,1,6,0,F1-BJ -1,2,71,1,1,7,0,F1-BK -1,2,71,1,1,8,0,F1-BQ -1,2,71,1,1,9,0,F1-B & E -1,2,71,1,1,10,0,F1-C -1,2,71,1,1,11,0,F1-CE -1,2,71,1,1,12,0,F1-CG -1,2,71,1,1,13,0,F1-CH -1,2,71,1,1,14,0,F1-CJ -1,2,71,1,1,15,0,F1-CK -1,2,71,1,1,16,0,F1-CR-200 -1,2,71,1,1,17,0,F1-CZ -1,2,71,1,1,18,0,F1-C-200s -1,2,71,1,1,19,0,F1-DDA -1,2,71,1,1,20,0,F1-ED -1,2,71,1,1,21,0,F1-EDA -1,2,71,1,1,22,0,F1-EE -1,2,71,1,1,23,0,F1-EH -1,2,71,1,1,24,0,F1-EJ -1,2,71,1,1,25,0,F1-EQ -1,2,71,1,1,26,0,F1-JA -1,2,71,1,1,27,0,F1-JE -1,2,71,1,3,0,0,Mirage III -1,2,71,1,3,1,0,Mirage III-D -1,2,71,1,3,2,0,Mirage III-E -1,2,71,1,4,0,0,Mirage IV 2000 -1,2,71,1,4,1,0,Mirage 2000AD -1,2,71,1,4,2,0,Mirage 2000BGM -1,2,71,1,4,3,0,Mirage 2000C -1,2,71,1,4,4,0,Mirage 2000D -1,2,71,1,4,5,0,Mirage 2000DAD -1,2,71,1,4,6,0,Mirage 2000DP -1,2,71,1,4,7,0,Mirage 2000E -1,2,71,1,4,8,0,Mirage 2000EAD -1,2,71,1,4,9,0,Mirage 2000EGM -1,2,71,1,4,10,0,Mirage 2000H (KF-101) -1,2,71,1,4,11,0,Mirage 2000N -1,2,71,1,4,12,0,Mirage 2000P -1,2,71,1,4,13,0,Mirage 2000RAD -1,2,71,1,4,14,0,Mirage 2000TH (KT-201) -1,2,71,1,4,15,0,Mirage 2000-5 -1,2,71,1,4,16,0,Vajra (Divine Thunder) -1,2,71,1,5,0,0,Dassault Rafale (Squall) -1,2,71,1,5,1,0,Rafale B -1,2,71,1,5,2,0,Rafale C -1,2,71,1,5,3,0,Rafale S-1 Standard -1,2,71,1,6,0,0,Mirage 50 -1,2,71,2,0,0,0,Attack/Strike -1,2,71,2,1,0,0,Dassault/BAe Jaguar -1,2,71,2,2,0,0,Etendard IV-P -1,2,71,2,3,0,0,Dassault Super Etendard -1,2,71,2,3,1,0,Super Etendard -1,2,71,2,4,0,0,Dassault/Dornier Alpha Jet -1,2,71,2,4,1,0,Alpha Jet 2 -1,2,71,2,4,2,0,Alpha Jet E -1,2,71,2,4,3,0,Alpha Jet A -1,2,71,2,4,4,0,Alpha Jet 3 -1,2,71,2,5,0,0,Mirage 5 -1,2,71,2,6,0,0,Crusader(Vought F-8E(FN)) -1,2,71,3,0,0,0,Bomber -1,2,71,3,1,0,0,Mirage IV -1,2,71,4,0,0,0,Cargo/Tanker -1,2,71,4,1,0,0,Transall C-160 -1,2,71,4,2,0,0,Dassault Mystere-Falcon 50 -1,2,71,4,3,0,0,T.16 -1,2,71,4,4,0,0,Reims F 406 Caravan II -1,2,71,4,4,1,0,Reims F 406 Vigilante -1,2,71,4,5,0,0,SECA/Fokker F27 Friendship Arat -1,2,71,4,6,0,0,Dassault Mystere-Falcon 20 -1,2,71,4,6,1,0,HU-25 Guardian -1,2,71,5,0,0,0,Antisubmarine/patrol/observation -1,2,71,5,1,0,0,Dassault Alantique 2 -1,2,71,5,2,0,0,Dassault (Breguet) Alize -1,2,71,5,3,0,0,Dassault (Breguet) (1050) Atlantic -1,2,71,5,4,0,0,Dassault Mystere-Falcon 900 -1,2,71,5,4,1,0,T.18 -1,2,71,5,5,0,0,Dassault Gardian 2 -1,2,71,6,0,0,0,EW -1,2,71,6,1,0,0,Transall C-160 -1,2,71,6,2,0,0,Dassault (Breguet 1050) Alize -1,2,71,6,3,0,0,Dassault Mystere-Falcon 20 (ECM) -1,2,71,7,0,0,0,Reconnaisance -1,2,71,7,1,0,0,Dassault Mystere-Falcon 900 -1,2,71,7,2,0,0,Mirage III -1,2,71,7,2,1,0,Mirage III-R -1,2,71,7,2,2,0,Mirage III-R2Z -1,2,71,7,2,3,0,Mirage III-RD -1,2,71,7,3,0,0,Dassault Mystere-Falcon 20SNR -1,2,71,20,0,0,0,Attack Helicopter -1,2,71,20,1,0,0,Eurocopter AS 532 Cougar -1,2,71,20,1,1,0,AS 532AC -1,2,71,20,1,2,0,AS 532AL -1,2,71,20,2,0,0,Eurocopter SA342 Gazelle -1,2,71,20,2,1,0,SA 342ATAM -1,2,71,20,2,2,0,SA 342M Viviane -1,2,71,20,3,0,0,Eurocopter BO 105/PAH-1/VBH/BSH-1 -1,2,71,20,3,1,0,BO 105 PAH-1A1 -1,2,71,21,0,0,0,Utility Helicopter -1,2,71,21,1,0,0,Aerospatiale SA 313B Alouette II -1,2,71,21,2,0,0,Aerospatiale SA 315B -1,2,71,21,2,1,0,Cheetah -1,2,71,21,3,0,0,Aerospatiale SA 316B Alouette III -1,2,71,21,4,0,0,Aerospatiale SA 321 Super Frelon -1,2,71,21,4,1,0,SA 321H -1,2,71,21,5,0,0,Aerospatiale SA 330 Puma -1,2,71,21,5,1,0,330 Puma -1,2,71,21,5,2,0,332M Super Puma -1,2,71,21,5,3,0,Super Puma/Puma -1,2,71,21,6,0,0,Aerospatiale SA 341 Gazelle -1,2,71,21,6,1,0,342M Gazelle -1,2,71,21,6,2,0,SA 341B -1,2,71,21,6,3,0,Gazelle HT. Mk 3 -1,2,71,21,6,4,0,Gazelle HCC. Mk4 -1,2,71,21,6,5,0,SA 341 F -1,2,71,21,6,6,0,SA 341 H -1,2,71,21,7,0,0,Eurocopter AS 332L Super Puma MK II and AS 532 Cougar MkII -1,2,71,21,7,1,0,532U2 Cougar MK II -1,2,71,21,7,2,0,532A2 Cougar Mk II -1,2,71,21,8,0,0,Eurocopter SA 342 Gazelle -1,2,71,21,8,1,0,SA 341 F -1,2,71,21,8,2,0,SA 342M -1,2,71,21,9,0,0,Eurocopter AS 532 Cougar -1,2,71,21,9,1,0,AS 532UC -1,2,71,21,9,2,0,AS 532Ul -1,2,71,21,9,3,0,AS 532MC -1,2,71,21,9,4,0,AS 532UL -1,2,71,21,10,0,0,Eurocopter AS 565 Panther -1,2,71,21,10,1,0,AS 365N2 Dauphin 2 -1,2,71,21,10,2,0,AS 565MA -1,2,71,21,11,0,0,Eurocopter 365N2 Dauphin 2 -1,2,71,21,11,1,0,AS 366G1 (HH-65A Dolphin) -1,2,71,21,12,0,0,Eurocopter BO 105 -1,2,71,22,0,0,0,Antisubmarine Warfare / Patrol Helicopter -1,2,71,22,1,0,0,Aerospatiale SA 319B ASTAZOU -1,2,71,22,2,0,0,Aerospatiale SA 321 Super Frelon -1,2,71,22,2,1,0,AS 32 -1,2,71,22,3,0,0,Eurocopter AS 532 Cougar -1,2,71,22,3,1,0,AS 532SC -1,2,71,22,4,0,0,Eurocopter AS 565 Panther -1,2,71,22,4,1,0,AS 565SA -1,2,71,22,4,2,0,AS 565F (MA) -1,2,71,40,0,0,0,Training -1,2,71,40,1,0,0,Mudry CAP 10 B -1,2,71,40,2,0,0,Socata TB 30 Epsilon -1,2,71,40,3,0,0,Socata TB 31 Omega -1,2,71,40,4,0,0,SEPECAT Jaguar International -1,2,71,40,4,1,0,Jaguar GR. Mk 1A -1,2,71,40,5,0,0,Dassault Mystere-Falcon 20SNA -1,3,71,1,0,0,0,Carrier (Porte-Avions) -1,3,71,1,1,0,0,Nuclear-Propelled Aircraft Carriers (CVN) -1,3,71,1,1,1,0,R 91 Charles De Gaulle -1,3,71,1,2,0,0,Clemenceau class (CV) -1,3,71,1,2,1,0,R 98 Clemenceau -1,3,71,1,2,2,0,R 99 Foch -1,3,71,4,0,0,0,Guided Missile Destroyers (Fregates or Escorteurs D'escadres) -1,3,71,4,1,0,0,Georges Leygues Class (Type f 70 (ASW)) -1,3,71,4,1,1,0,D 640 Georges Leygues -1,3,71,4,1,2,0,D 641 Dupleix -1,3,71,4,1,3,0,D 642 Montcalm -1,3,71,4,1,4,0,D 643 Jean de vienne -1,3,71,4,1,5,0,D 644 Primauguet -1,3,71,4,1,6,0,D 645 La motte-picquet -1,3,71,4,1,7,0,D 646 Latouche-treville -1,3,71,4,2,0,0,Cassard class (Type F 70 (A/A)) -1,3,71,4,2,1,0,D 614 Cassard -1,3,71,4,2,2,0,D 615 Jean Bart -1,3,71,4,3,0,0,Suffren class -1,3,71,4,3,1,0,D 602 Suffren -1,3,71,4,3,2,0,D 603 Duquesne -1,3,71,4,4,0,0,Tourville class (Type F 67) -1,3,71,4,4,1,0,D 610 Tourville -1,3,71,4,4,2,0,D 611 Duguay-Trouin -1,3,71,4,4,3,0,D 612 De grasse -1,3,71,4,5,0,0,Type F 65 (ASW) -1,3,71,4,5,1,0,D 609 Aconit (ex-F 703) -1,3,71,6,0,0,0,Guided-missile Frigate -1,3,71,6,1,0,0,La Fayette class (light frigates) -1,3,71,6,1,1,0,F 710 Lafayette -1,3,71,6,1,2,0,F 711 Surcouf -1,3,71,6,1,3,0,F 712 Courbet -1,3,71,6,2,0,0,Floreal class (patrol frigates) -1,3,71,6,2,1,0,F 730 Floreal -1,3,71,6,2,2,0,F 731 Prairial -1,3,71,6,2,3,0,F 732 Nivose -1,3,71,6,2,4,0,F 733 Ventose -1,3,71,6,2,5,0,F 734 Vendemiaire -1,3,71,6,2,6,0,F 735 Germinal -1,3,71,7,0,0,0,Light/patrol craft -1,3,71,7,1,0,0,P 400 class (fast attack craft--patrol) -1,3,71,7,1,1,0,P 682 L'audacieuse -1,3,71,7,1,2,0,P 683 La boudeuse -1,3,71,7,1,3,0,P 684 La capricieuse -1,3,71,7,1,4,0,P 685 La fougueuse -1,3,71,7,1,5,0,P 686 La glorieuse -1,3,71,7,1,6,0,P 687 La gracieuse -1,3,71,7,1,7,0,P 688 La moqueuse -1,3,71,7,1,8,0,P 689 La railleuse -1,3,71,7,1,9,0,P 690 La rieuse -1,3,71,7,1,10,0,P 691 La tapageuse -1,3,71,7,2,0,0,Thomson-CSF Type (large patrol craft) -1,3,71,7,2,1,0,P 696 Iris -1,3,71,8,0,0,0,Mine Countermeasure Ship / Craft -1,3,71,8,1,0,0,Narvik class (minehunter/sweeper) -1,3,71,8,1,1,0,M 660 Narvik -1,3,71,8,1,2,0,Bir Hakeim -1,3,71,8,1,3,0,Garigliano -1,3,71,8,1,4,0,Autun -1,3,71,8,1,5,0,Colmar -1,3,71,8,1,6,0,Berlaimont -1,3,71,8,2,0,0,Eridan (Tripartite) class (minehunters) -1,3,71,8,2,1,0,M 641 Eridan -1,3,71,8,2,2,0,M 642 Cassiopee -1,3,71,8,2,3,0,M 643 Andromede -1,3,71,8,2,4,0,M 644 Pegase -1,3,71,8,2,5,0,M 645 Orion -1,3,71,8,2,6,0,M 646 Croix du sud -1,3,71,8,2,7,0,M 647 Aigle -1,3,71,8,2,8,0,M 648 Lyre -1,3,71,8,2,9,0,M 649 Persee -1,3,71,8,3,0,0,Circe class (minehunters) -1,3,71,8,3,1,0,M 712 Cybele -1,3,71,8,3,2,0,M 713 Calliope -1,3,71,8,3,3,0,M 714 Clio -1,3,71,8,3,4,0,M 715 Circe -1,3,71,8,3,5,0,M 716 Ceres -1,3,71,8,4,0,0,ex-US Aggressive class (minesweepers) -1,3,71,8,4,1,0,M 610 Ouistreham (ex-MSO 513) -1,3,71,8,4,2,0,M 612 Alencon (ex-MSO 453) -1,3,71,8,4,3,0,M 623 Baccarat (ex-MSO 505) -1,3,71,8,5,0,0,MCM diving support ships -1,3,71,8,5,1,0,A 613 Acheron -1,3,71,8,5,2,0,M 611 Vulcain -1,3,71,8,5,3,0,M 614 Styx -1,3,71,8,5,4,0,M 622 Pluton -1,3,71,9,0,0,0,Dock Landing Ship -1,3,71,9,1,0,0,Foudre class (Type TCD 90) -1,3,71,9,1,1,0,L 9011 Foudre -1,3,71,9,2,0,0,Ouragan class (TCDs) -1,3,71,9,2,1,0,L 9021 Ouragan -1,3,71,9,2,2,0,L 9022 Orage -1,3,71,50,0,0,0,Frigate -1,3,71,50,1,0,0,D'estienne D'orves (Type A 69) class -1,3,71,50,1,1,0,F 781 D'estienne D'orves -1,3,71,50,1,2,0,F 782 Amyot d'inville -1,3,71,50,1,3,0,F 783 Drogou -1,3,71,50,1,4,0,F 784 Detroyat -1,3,71,50,1,5,0,F 785 Jean Moulin -1,3,71,50,1,6,0,F 786 Quartier Maitre Anquetil -1,3,71,50,1,7,0,F 787 Commandant de Pimodan -1,3,71,50,1,8,0,F 788 Second Maitre Le Bihan -1,3,71,50,1,9,0,F 789 Lieutenant De Vaisseau Le Henaff -1,3,71,50,1,10,0,F 790 Lieutenant De Vaisseau Lavallee -1,3,71,50,1,11,0,F 791 Commandant L'herminier -1,3,71,50,1,12,0,F 792 Premier Maitre L'her -1,3,71,50,1,13,0,F 793 Commandant Blaison -1,3,71,50,1,14,0,F 794 Enseigne De Vaisseau Jacoubet -1,3,71,50,1,15,0,F 795 Commandant Ducuing -1,3,71,50,1,16,0,F 796 Commandant Birot -1,3,71,50,1,17,0,F 797 Commandant Bouan -1,3,71,50,2,0,0,Commandant Riviere class (Avisos Escorteurs) -1,3,71,50,2,1,0,F 726 Commandant Bory -1,3,71,50,2,2,0,F 729 Balny -1,3,71,50,2,3,0,F 749 Enseigne de Vaisseau Henry -1,4,71,11,0,0,0,Landing Craft -1,4,71,11,1,0,0,Bougainville class (BTs) -1,4,71,11,1,1,0,L 9077 Bougainville -1,4,71,11,2,0,0,Batral type (light transports and landing ships) -1,4,71,11,2,1,0,L 9030 Champlain -1,4,71,11,2,2,0,L 9031 Francis Garnier -1,4,71,11,2,3,0,L 9032 Dumont D'urville -1,4,71,11,2,4,0,L 9033 Jacques Cartier -1,4,71,11,2,5,0,L 9034 La grandiere -1,4,71,11,3,0,0,Edic 700 class (LCT) -1,4,71,11,3,1,0,L 9051 -1,4,71,11,3,2,0,L 9052 -1,4,71,11,4,0,0,Edic class (LCT) -1,4,71,11,4,1,0,L 9070 -1,4,71,11,4,2,0,L 9072 -1,4,71,11,4,3,0,L 9074 -1,4,71,11,5,0,0,CDIC class (LCT) -1,4,71,11,5,1,0,L 9061 -1,4,71,11,5,2,0,L 9062 -1,4,71,11,6,0,0,Transport landing ship -1,4,71,11,6,1,0,L 9090 Gapeau -1,4,71,16,0,0,0,Auxiliary -1,4,71,16,1,0,0,BH2 class (Batiments Hydrographiques De 2E class) (oceanographic & survey) -1,4,71,16,1,1,0,A 791 Laperouse -1,4,71,16,1,2,0,A 792 Borda -1,4,71,16,1,3,0,A 793 Laplace -1,4,71,16,1,4,0,A 795 Arago -1,4,71,16,2,0,0,Durance class (underway replenishment tankers) -1,4,71,16,2,1,0,A 607 Meuse -1,4,71,16,2,2,0,A 608 Var -1,4,71,16,2,3,0,A 629 Durance -1,4,71,16,2,4,0,A 630 Marne -1,4,71,16,2,5,0,A 631 Somme -1,4,71,16,3,0,0,Maintenance and repair ship -1,4,71,16,3,1,0,A 620 Jules Verne (ex-Acheron) -1,4,71,16,4,0,0,Rhin class (depot and support ships) -1,4,71,16,4,1,0,A 615 Loire -1,4,71,16,4,2,0,A 617 Garonne -1,4,71,16,4,3,0,A 618 Rance -1,4,71,16,4,4,0,A 621 Rhin -1,4,71,16,4,5,0,A 622 Rhone -1,4,71,16,5,0,0,Chamois class (supply tenders) -1,4,71,16,5,1,0,A 633 Taape -1,4,71,16,5,2,0,A 767 Chamois -1,4,71,16,5,3,0,A 768 Elan -1,4,71,16,5,4,0,A 774 Chevreuil -1,4,71,16,5,5,0,A 775 Gazelle -1,4,71,16,5,6,0,A 776 Isard -1,4,71,16,5,7,0,A 779 Tapatai (ex-Silver Fish) -1,4,71,16,6,0,0,RR 4000 type (supply tenders) -1,4,71,16,6,1,0,A 634 Rari -1,4,71,16,6,2,0,A 635 Revi -1,4,71,16,7,0,0,Leopard class (training ships) -1,4,71,16,7,1,0,A 748 Leopard -1,4,71,16,7,2,0,A 749 Panthere -1,4,71,16,7,3,0,A 750 Jaguar -1,4,71,16,7,4,0,A 751 Lynx -1,4,71,16,7,5,0,A 752 Guepard -1,4,71,16,7,6,0,A 753 Chacal -1,4,71,16,7,7,0,A 754 Tigre -1,4,71,16,7,8,0,A 755 Lion -1,4,71,17,0,0,0,Auxiliary, Merchant Marine -1,4,71,17,1,0,0,Government Maritime Forces -1,4,71,17,1,1,0,Patra Class (fast patrol craft) -1,4,71,17,2,0,0,Harbour tugs (Remorqueurs De Port) -1,4,71,17,2,1,0,105-ton type -1,4,71,17,2,2,0,93-ton type -1,4,71,17,2,3,0,65-ton type -1,5,71,1,0,0,0,SSBN (Nuclear Ballistic Missile) -1,5,71,1,1,0,0,Le Triomphant class (SNLE-NG) -1,5,71,1,1,1,0,S 616 Le triomphant -1,5,71,1,1,2,0,S 617 Le temeraire -1,5,71,1,1,3,0,S 618 -1,5,71,2,0,0,0,SSGN (Nuclear Guided Missile) -1,5,71,2,1,0,0,L'inflexible class (SNLE) -1,5,71,2,1,1,0,S 610 Le foudroyant -1,5,71,2,1,2,0,S 612 Le terrible -1,5,71,2,1,3,0,S 613 L'indomptable -1,5,71,2,1,4,0,S 614 Le tonnant -1,5,71,2,1,5,0,S 615 L'inflexible -1,5,71,3,0,0,0,SSN (Nuclear Attack Ballistic Missile) (Sous-Marins Nucleaires D'attaque (SNA)) -1,5,71,3,1,0,0,Rubis Class (SNA 72) -1,5,71,3,1,1,0,S 601 Rubis -1,5,71,3,1,2,0,S 602 Saphir -1,5,71,3,1,3,0,S 603 Casabianca -1,5,71,3,1,4,0,S 604 Emeraude -1,5,71,3,1,5,0,S 605 Amethyste -1,5,71,3,1,6,0,S 606 Perle -1,5,71,3,1,7,0,S 607 Turquoise -1,5,71,5,0,0,0,SS (Conventional Attack-Torpedo, Patrol) (Sous-Marins D'attaque) -1,5,71,5,1,0,0,Agosta Class -1,5,71,5,1,1,0,S 620 Agosta -1,5,71,5,1,2,0,S 621 Beveziers -1,5,71,5,1,3,0,S 622 La praya -1,5,71,5,1,4,0,S 623 Ouessant -1,5,71,5,2,0,0,Daphne Class -1,5,71,5,2,1,0,S 643 Doris -1,5,71,5,2,2,0,S 648 Jun -1,5,71,5,2,3,0,S 650 Psyche -1,5,71,5,2,4,0,S 651 Sirene -1,6,71,0,0,0,0,Other -1,6,71,1,0,0,0,Manned -1,6,71,1,6,0,0,Space Plane -1,6,71,1,6,1,0,Hermes -1,6,71,2,0,0,0,Unmanned -1,6,71,2,1,0,0,Communication satellite -1,6,71,2,1,1,0,Telecom -1,6,71,2,1,2,0,Hispasat -1,6,71,2,1,3,0,Eutelsat -1,6,71,2,1,4,0,Turksat -1,6,71,2,1,6,0,Argos -1,6,71,2,1,7,0,S80/T -1,6,71,2,1,8,0,Arsene -1,6,71,2,1,9,0,Syracuse -1,6,71,2,2,0,0,Navigation satellite -1,6,71,2,4,0,0,Electronic Intelligence satellite -1,6,71,2,4,1,0,Cerise -1,6,71,2,7,0,0,Imaging Radar surveillance satellite -1,6,71,2,7,1,0,Helios -1,6,71,2,7,2,0,Osiris SAR -1,6,71,2,8,0,0,Optical imaging surveillance satellite -1,6,71,2,8,1,0,Syracuse 3 -1,6,71,2,13,0,0,Science satellite -1,6,71,2,13,1,0,Hipparcos -1,6,71,2,13,2,0,Titan -1,6,71,2,13,3,0,Topex/Poseidon -1,6,71,2,13,4,0,Starlette -1,6,71,2,13,5,0,SRAT 2 -1,6,71,2,14,0,0,Survey satellite -1,6,71,2,14,1,0,Stella -1,6,71,2,3,0,0,Boosters -1,6,71,2,1,0,0,Ariane -1,1,78,1,0,0,0,Tank -1,1,78,1,1,0,0,Leopard 1 A5 MBT -1,1,78,1,1,1,0,A1 -1,1,78,1,1,2,0,A2 -1,1,78,1,1,3,0,A3 -1,1,78,1,1,4,0,A4 -1,1,78,1,1,5,0,A5 -1,1,78,1,2,0,0,Leopard 2 MBT -1,1,78,1,3,0,0,Leopard 2 (improved) MBT -1,1,78,2,0,0,0,Armored Fighting Vehicle -1,1,78,2,1,0,0,Marder 1 A3 -1,1,78,2,2,0,0,Marder 2 -1,1,78,2,3,0,0,BMP 1 -1,1,78,2,4,0,0,Jaguar 1 tank destroyer, missile -1,1,78,2,5,0,0,Jaguar 2 -1,1,78,2,6,0,0,Luchs armored reconnaissance vehicle -1,1,78,2,7,0,0,Zobel armored reconnaissance vehicle -1,1,78,2,8,0,0,Roland AD system, missile -1,1,78,2,9,0,0,Gepard armored AD, gun -1,1,78,3,0,0,0,Armored Utility Vehicle -1,1,78,3,1,0,0,Biber armored bridge layer -1,1,78,3,2,0,0,Dachs armored engineer tank -1,1,78,3,3,0,0,Keiler armored minesweeper -1,1,78,3,4,0,0,Skorpion armored minelayer -1,1,78,3,7,0,0,M113 armored artillery observer -1,1,78,3,6,0,0,M113 armored motor-ambulance -1,1,78,10,0,0,0,Mortar -1,1,78,10,1,0,0,M113 armored mortar -1,2,78,1,0,0,0,Fighter/Air Defense -1,2,78,1,1,0,0,MRCA Tornado -1,2,78,1,3,0,0,Tornado 2000 -1,2,78,1,4,0,0,EFM (Enhanced Fighter Maneuverability) X-31A -1,2,78,1,5 MiG - 29A Fulcrum,0,0, -1,2,78,1,6 MiG-29UB Fulcrum,0,0, -1,2,78,2,0,0,0,Attack/Strike -1,2,78,2,1,0,0,Dassault/Dornier Alpha Jet -1,2,78,2,1,1,0,Alpha Jet E trainer/attack -1,2,78,2,1,2,0,Alpha Jet MS1 -1,2,78,2,1,3,0,Alpha Jet A -1,2,78,2,1,4,0,Alpha Jet MS2 -1,2,78,2,1,5,0,Alpha Jet 2 -1,2,78,2,2,0,0,Panavia Tornado IDS -1,2,78,2,2,1,0,Tornado IDS GR. Mk 1 -1,2,78,2,2,2,0,Tornado IDS GR. 1A -1,2,78,2,2,3,0,Tornado IDS GR. 4 -1,2,78,6,0,0,0,EW -1,2,78,6,1,0,0,Panavia Tornado ECR -1,2,78,7,0,0,0,Reconnaissance -1,2,78,7,1,0,0,Panavia Tornado ECR -1,2,78,8,0,0,0,Surveillance/C2 -1,2,78,8,1,0,0,Transall C-160 -1,2,78,8,1,1,0,C-160S. Maritime -1,2,78,8,1,2,0,C-160SE. Electronic -1,2,78,8,1,3,0,C-160AAA AEW -1,2,78,8,2,0,0,Egrett II -1,2,78,8,2,1,0,Strato 1 -1,2,78,20,0,0,0,Attack Helicopter -1,2,78,20,1,0,0,Eurocopter BO 105/PAH-1/VBH/BSH-1 -1,2,78,20,1,1,0,PAH-1 -1,2,78,20,1,2,0,PAH-1A1 -1,2,78,20,1,3,0,BSH -1,2,78,20,1,4,0,PAH-2 Tiger -1,2,78,20,1,5,0,HAC Tigre -1,2,78,20,1,6,0,HAP Tigre -1,2,78,21,0,0,0,Utility Helicopter -1,2,78,21,1,0,0,NH 90 -1,2,78,21,1,1,0,TTH 90 medium helicopter -1,2,78,21,2,0,0,Eurocopter SA 342 Gazelle -1,2,78,21,2,1,0,SA 341F -1,2,78,21,2,2,0,SA 342M -1,2,78,21,2,3,0,SA 342M ATAM -1,2,78,21,2,4,0,SA 342M Viviane -1,2,78,21,2,5,0,SA 341L1 -1,2,78,21,3,0,0,Eurocopter AS 350 Ecureuil/Astar and AS 550 Fennec -1,2,78,21,3,1,0,CH-50 -1,2,78,21,3,2,0,TH-50 Esquilo -1,2,78,21,3,3,0,HA-1 Esquilo -1,2,78,21,3,4,0,UH-12 Esquilo -1,2,78,21,3,5,0,AS 350BA Ecureuil -1,2,78,21,3,6,0,AS 350B2 Ecureuil -1,2,78,21,3,7,0,AS 350 B3 Ecureuil -1,2,78,21,3,8,0,AS 350D AStar -1,2,78,21,3,9,0,AS 350 Firefighter -1,2,78,21,3,10,0,AS 550 Fennec -1,2,78,21,3,11,0,550A2 -1,2,78,21,3,12,0,AS 550C2 -1,2,78,21,3,13,0,AS 550M2 -1,2,78,21,3,14,0,AS 550S2 -1,2,78,21,4,0,0,Eurocopter AS 355 Ecureuil 2 Twinstar and AS 555 Fennec -1,2,78,21,4,1,0,CH-55 -1,2,78,21,4,2,0,VH-55 Esquilo -1,2,78,21,4,3,0,UH-12B Esquilo -1,2,78,21,4,4,0,AS 555UN Fennec -1,2,78,21,4,5,0,AS 555AN Fennec -1,2,78,21,4,6,0,AS 555CN Fennec -1,2,78,21,4,7,0,AS 555MN Fennec -1,2,78,21,4,8,0,AS 555SN Fennec naval ASW -1,2,78,21,5,0,0,Eurocopter AS 365N2 Dauphin 2 -1,2,78,21,5,1,0,AS 366G1 (HH-65A Dolphin) -1,2,78,21,5,2,0,AS 565 Panther -1,2,78,21,5,3,0,HM-1 -1,2,78,21,5,4,0,AS 565AA -1,2,78,21,5,5,0,AS 565CA -1,2,78,21,5,6,0,AS 565 Panther 800 -1,2,78,21,5,7,0,AS 565MA Panther -1,2,78,21,5,8,0,AS 565SA Panther -1,2,78,21,6,0,0,Eurocopter BO 105 -1,2,78,21,6,1,0,BO 105CB -1,2,78,21,6,2,0,BO 105CBS -1,2,78,21,7,0,0,Eurocopter/Kawasaki BK 117 -1,2,78,21,7,1,0,BK 117 M -1,2,78,21,7,2,0,NBK-117 -1,2,78,22,0,0,0,Antisubmarine Warfare / Patrol Helicopter -1,2,78,22,1,0,0,NH 90 -1,2,78,22,2,0,0,NFH 90 -1,2,78,40,0,0,0,Trainer -1,2,78,40,1,0,0,Dassault/Dornier Alpha Jet -1,2,78,40,1,1,0,Alpha Jet E -1,2,78,40,1,2,0,Alpha Jet 3 -1,3,78,4,0,0,0,Guided Missile Destroyer -1,3,78,4,1,0,0,Ex-US Modified Charles F. Adams class (type 103B) (DDGs) -1,3,78,4,1,1,0,D 185 Lutjens (ex-US DDG 28) -1,3,78,4,1,2,0,D 186 Molders (ex-US DDG 29) -1,3,78,4,1,3,0,D 187 Rommel (ex-US DDG 30) -1,3,78,5,0,0,0,Destroyer -1,3,78,5,2,0,0,Hamburg class (Type 101A) -1,3,78,5,2,1,0,D 181 Hamburg -1,3,78,5,2,2,0,D 182 Schleswig-Hostein -1,3,78,5,2,3,0,D 183 Bayern -1,3,78,6,0,0,0,Guided Missile Frigate -1,3,78,6,1,0,0,Brandenburg class (type 123) -1,3,78,6,1,1,0,F 215 Brandenburg -1,3,78,6,1,2,0,F 216 Schleswig-Holstein -1,3,78,6,1,3,0,F 217 Bayern -1,3,78,6,1,4,0,F 218 Mecklenburg-Vorpommern -1,3,78,6,2,0,0,Bremen class (type 122) -1,3,78,6,2,1,0,F 207 Bremen -1,3,78,6,2,2,0,F 208 Niedersachsen -1,3,78,6,2,3,0,F 209 Rheinland-Pfalz -1,3,78,6,2,4,0,F 210 Emden -1,3,78,6,2,5,0,F 211 Koln -1,3,78,6,2,6,0,F 212 Karlsruhe -1,3,78,6,2,7,0,F 213 Augsburg -1,3,78,6,2,8,0,F 214 Lubeck -1,3,78,7,0,0,0,Light/patrol craft -1,3,78,7,1,0,0,Gepard class (type 143 A) (fast attack craft, missile) -1,3,78,7,1,1,0,P 6121 Gepard -1,3,78,7,1,2,0,P 6122 Puma -1,3,78,7,1,3,0,P 6123 Hermelin -1,3,78,7,1,4,0,P 6124 Nerz -1,3,78,7,1,5,0,P 6125 Zobel -1,3,78,7,1,6,0,P 6126 Frettechen -1,3,78,7,1,7,0,P 6127 Dachs -1,3,78,7,1,8,0,P 6128 Ozelot -1,3,78,7,1,9,0,P 6129 Wiesel -1,3,78,7,1,10,0,P 6130 Hyane -1,3,78,7,2,0,0,Albatros class (type 143/143B) (fast attack craft, missile) -1,3,78,7,2,1,0,P 6111 Albatros -1,3,78,7,2,2,0,P 6122 Falke -1,3,78,7,2,3,0,P 6113 Geier -1,3,78,7,2,4,0,P 6114 Bussard -1,3,78,7,2,5,0,P 6115 Sperber -1,3,78,7,2,6,0,P 6116 Greif -1,3,78,7,2,7,0,P 6117 Kondor -1,3,78,7,2,8,0,P 6118 Seeadler -1,3,78,7,2,9,0,P 6119 Habicht -1,3,78,7,2,10,0,P 6120 Kormoran -1,3,78,7,3,0,0,Tiger class (type 148) (fast attack craft, missile) -1,3,78,7,3,1,0,P 6141 Tiger -1,3,78,7,3,2,0,P 6142 Iltis -1,3,78,7,3,3,0,P 6143 Luchs -1,3,78,7,3,4,0,P 6144 Marder -1,3,78,7,3,5,0,P 6145 Leopard -1,3,78,7,3,6,0,P 6146 Fuchs -1,3,78,7,3,7,0,P 6147 Jaguar -1,3,78,7,3,8,0,P 6148 Lowe -1,3,78,7,3,9,0,P 6149 Wolf -1,3,78,7,3,10,0,P 6150 Panther -1,3,78,7,3,11,0,P 6151 Haher -1,3,78,7,3,12,0,P 6152 Storch -1,3,78,7,3,13,0,P 6153 Pelikan -1,3,78,7,3,14,0,P 6154 Elster -1,3,78,7,3,15,0,P 6155 Alk -1,3,78,7,3,16,0,P 6156 Dommel -1,3,78,7,3,17,0,P 6157 Weihe -1,3,78,7,3,18,0,P 6158 Pinguin -1,3,78,7,3,19,0,P 6159 Reiher -1,3,78,7,3,20,0,P 6160 Kranich -1,3,78,7,4,0,0,Bredstedt class (large patrol craft, Coast Guard vessels) -1,3,78,7,4,1,0,BG 21 Bredstedt -1,3,78,7,5,0,0,Sassnitz class (Coast Guard vessels) -1,3,78,7,5,1,0,Sassnitz (ex-P 6165, ex-591) -1,3,78,7,5,2,0,Sellin (ex-592) -1,3,78,7,5,3,0,Binz (ex-593) -1,3,78,7,6,0,0,Neustadt class (large patrol craft, Coast Guard vessels) -1,3,78,7,6,1,0,BG 11 Neustadt -1,3,78,7,6,2,0,BG 12 Bad Bramstedt -1,3,78,7,6,3,0,BG 14 Duderstadt -1,3,78,7,6,4,0,BG 15 Eschwege -1,3,78,7,6,5,0,BG 16 Alsfeld -1,3,78,7,6,6,0,BG 17 Bayreuth -1,3,78,7,6,7,0,BG 18 Rosenheim -1,3,78,7,7,0,0,Bremse class (harbor patrol craft, Coast Guard vessels) -1,3,78,7,7,1,0,GS 23 -1,3,78,7,7,2,0,GS 30 -1,3,78,7,7,3,0,GS 31 -1,3,78,7,7,4,0,GS 32 -1,3,78,7,7,5,0,GS 40 -1,3,78,7,7,6,0,GS 41 -1,3,78,7,7,7,0,GS 42 -1,3,78,7,7,8,0,GS 51 -1,3,78,7,7,9,0,GS 52 -1,3,78,8,0,0,0,Mine Countermeasure Ship / Craft -1,3,78,8,1,0,0,Schutze class (type 340-341, minesweepers, coastal) -1,3,78,8,1,1,0,M 1059 Spica -1,3,78,8,1,2,0,M 1062 Schutze -1,3,78,8,1,3,0,M 1063 Waage -1,3,78,8,2,0,0,Lindau class (coastal minesweepers and minehunters: type 331, minehunters; and type 351, Troika) -1,3,78,8,2,1,0,M 1070 Gottingen -1,3,78,8,2,2,0,M 1071 Koblenz -1,3,78,8,2,3,0,M 1072 Lindau -1,3,78,8,2,4,0,M 1073 Schleswig -1,3,78,8,2,5,0,M 1074 Tubingen -1,3,78,8,2,6,0,M 1075 Wetzlar -1,3,78,8,2,7,0,M 1076 Paderborn -1,3,78,8,2,8,0,M 1077 Weilheim -1,3,78,8,2,9,0,M 1078 Cuxhaven -1,3,78,8,2,10,0,M 1079 Duren -1,3,78,8,2,11,0,M 1080 Marburg -1,3,78,8,2,12,0,M 1081 Konstanz -1,3,78,8,2,13,0,M 1082 Wolfsburg -1,3,78,8,2,14,0,M 1083 Ulm -1,3,78,8,2,15,0,M 1085 Minden -1,3,78,8,3,0,0,Kondor II class (minesweeper, coastal) -1,3,78,8,3,1,0,M2670 Sommerda (ex-311) -1,3,78,8,4,0,0,Frauenlob class (type 394 minesweepers, inshore) -1,3,78,8,4,1,0,M 2658 Frauenlob -1,3,78,8,4,2,0,M 2659 Nautilus -1,3,78,8,4,3,0,M 2660 Gefion -1,3,78,8,4,4,0,M 2661 Medusa -1,3,78,8,4,5,0,M 2662 Undine -1,3,78,8,4,6,0,M 2663 Minerva -1,3,78,8,4,7,0,M 2664 Diana -1,3,78,8,4,8,0,M 2665 Loreley -1,3,78,8,4,9,0,M 2666 Atlantis -1,3,78,8,4,10,0,M 2667 -1,3,78,8,5,0,0,Ariadne Class (Type 393 minesweepers, inshore) -1,3,78,8,5,1,0,M 2651 Freya -1,3,78,8,5,2,0,M 2653 Hertha -1,3,78,8,5,3,0,M 2654 Nymphe -1,3,78,8,5,4,0,M 2655 Hertha -1,3,78,8,6,0,0,Frankenthal class (type 332 minehunters, coastal) -1,3,78,8,6,1,0,M 1060 Weiden -1,3,78,8,6,2,0,M 1061 Rottweil -1,3,78,8,6,3,0,M 1062 Sulzbach-Rosenberg -1,3,78,8,6,4,0,M 1063 Bad Bevensen -1,3,78,8,6,5,0,M 1064 Gromitz -1,3,78,8,6,6,0,M 1065 Dillingen -1,3,78,8,6,7,0,M 1066 Frankenthal -1,3,78,8,6,8,0,M 1067 Bad Rappenau -1,3,78,8,6,9,0,M 1068 Datteln -1,3,78,8,6,10,0,M 1069 Homburg -1,3,78,8,7,0,0,Hameln class (type 343 minesweepers, coastal) -1,3,78,8,7,1,0,M 1090 Pegnitz -1,3,78,8,7,2,0,M 1091 Kulmbach -1,3,78,8,7,3,0,M 1092 Hameln -1,3,78,8,7,4,0,M 1093 Auerbach -1,3,78,8,7,5,0,M 1094 Ensdorf -1,3,78,8,7,6,0,M 1095 Uberherrn -1,3,78,8,7,7,0,M 1096 Passau -1,3,78,8,7,8,0,M 1097 Laboe -1,3,78,8,7,9,0,M 1098 Siegburg -1,3,78,8,7,10,0,M 1099 Herten -1,3,78,8,8,0,0,Trials ship (type 740, ex-minesweeper) -1,3,78,8,8,1,0,A 1400 Holnis (ex-A 836) -1,3,78,8,9,0,0,Schutze class (type 732, diver-support ship) -1,3,78,8,9,1,0,M 1053 Stier (ex-Y 849) -1,3,78,8,10,0,0,Sachsenwald class (type 762, mine transport) -1,3,78,8,10,1,0,A 1438 Steigerwald -1,3,78,8,11,0,0,Kondor I class (minesweeper/patrol craft; Coast Guard vessels) -1,3,78,8,11,1,0,BG 31 Templin (ex-GS 06, ex-G 442) -1,3,78,8,11,2,0,BG 32 Kuhlungsborn (ex-GS 07, ex-G 445) -1,3,78,8,11,3,0,BG 33 Ahrenshoop (ex-GS 08, ex-G 415) -1,3,78,8,11,4,0,GS 01 Uckermunde (ex-G 411) -1,3,78,8,11,5,0,GS 02 Demmin (ex-G 422) -1,3,78,8,11,6,0,GS 03 Malchin (ex-G 441) -1,3,78,8,11,7,0,GS 04 Altentreptow (ex-G 414) -1,3,78,8,11,8,0,GS 05 Pasewalk (ex-G 423) -1,3,78,8,11,9,0,GS 09 Boltenhagen (ex-G 443) -1,3,78,11,0,0,0,Landing Craft -1,3,78,11,1,0,0,Type 521 (LCMs) -1,3,78,11,1,1,0,LCM 12 Sprotte -1,3,78,11,1,2,0,LCM 13 Sardine -1,3,78,11,1,3,0,LCM 14 Sardelle -1,3,78,11,1,4,0,LCM 15 Hering -1,3,78,11,1,5,0,LCM 16 Orfe -1,3,78,11,1,6,0,LCM 17 Marane -1,3,78,11,1,7,0,LCM 18 Saibling -1,3,78,11,1,8,0,LCM 19 Stint -1,3,78,11,1,9,0,LCM 20 Aesche -1,3,78,11,1,10,0,L 780 Hummer -1,3,78,11,1,11,0,L 781 Krill -1,3,78,11,1,12,0,L 782 Krabbe -1,3,78,11,1,13,0,L 783 Auster -1,3,78,11,1,14,0,L 784 Muschel -1,3,78,11,1,15,0,L 785 Koralle -1,3,78,11,1,16,0,L 786 Garnele -1,3,78,11,1,17,0,L 787 Languste -1,3,78,11,2,0,0,Type 520 (LCUs) -1,3,78,11,2,1,0,L 760 Flunder -1,3,78,11,2,2,0,L 761 Karpfen -1,3,78,11,2,3,0,L 762 Lachs -1,3,78,11,2,4,0,L 763 Plotze -1,3,78,11,2,5,0,L 766 Stor -1,3,78,11,2,6,0,L 767 Tummler -1,3,78,11,2,7,0,L 768 Wels -1,3,78,11,2,8,0,L 769 Zander -1,3,78,11,2,9,0,L 788 Butt -1,3,78,11,2,10,0,L 795 Inger -1,3,78,11,3,0,0,Mannheim 59 class (river landing craft, LCMs) -1,3,78,11,4,0,0,Bodan class (river landing craft, LCMs) -1,3,78,16,0,0,0,Auxiliary -1,3,78,16,1,0,0,Elbe class (type 404, tenders) -1,3,78,16,1,1,0,A 511 Elbe -1,3,78,16,1,2,0,A 512 Mosel -1,3,78,16,1,3,0,A 513 Rhein -1,3,78,16,1,4,0,A 514 Werra -1,3,78,16,1,5,0,A 515 Main -1,3,78,16,1,6,0,A 516 Donau -1,3,78,16,2,0,0,Rhein class (type 401, tenders) -1,3,78,16,2,1,0,A 58 Rhein -1,3,78,16,2,2,0,A 61 Elbe -1,3,78,16,2,3,0,A 63 Main -1,3,78,16,2,4,0,A 69 Donau -1,3,78,16,3,0,0,Replenishment tankers (type 704) -1,3,78,16,3,1,0,A 1442 Spessart (ex-Okapi) -1,3,78,16,3,2,0,A 1443 Rhon (ex-Okene) -1,3,78,16,4,0,0,Walchensee class (type 703, replenishment tankers) -1,3,78,16,4,1,0,A 1424 Walchensee -1,3,78,16,4,2,0,A 1425 Ammersee -1,3,78,16,4,3,0,A 1426 Tegernsee -1,3,78,16,4,4,0,A 1427 Westensee -1,3,78,16,5,0,0,Type 763 (support tanker) -1,3,78,16,5,1,0,A 1407 Wittensee (ex-Sioux) -1,3,78,16,6,0,0,Luneburg class (type 701, support ships) -1,3,78,16,6,1,0,A 1411 Luneburg -1,3,78,16,6,2,0,A 1413 Freiburg -1,3,78,16,6,3,0,A 1414 Glucksburg -1,3,78,16,6,4,0,A 1415 Saarburg -1,3,78,16,6,5,0,A 1416 Nienburg -1,3,78,16,6,6,0,A 1417 Offenburg -1,3,78,16,6,7,0,A 1418 Meersburg -1,3,78,16,7,0,0,Westerwald class (type 760, ammunition -1,3,78,16,7,1,0,A 1435 Westerwald -1,3,78,16,7,2,0,A 1436 Odenwald -1,3,78,16,8,0,0,Towing launches (type 946) -1,3,78,16,8,1,0,AK 1 Y 1671 -1,3,78,16,8,2,0,AK 3 Y 1672 -1,3,78,16,8,3,0,MA 2 Y 1676 -1,3,78,16,8,4,0,MA 3 Y 1677 -1,3,78,16,8,5,0,Borby Y 1687 -1,3,78,16,9,0,0,Oste Class (type 423, AGI) -1,3,78,16,9,1,0,A 50 Alster -1,3,78,16,9,2,0,A 52 Oste -1,3,78,16,9,3,0,A 53 Oker -1,3,78,16,10,0,0,Trials ship (type 742) -1,3,78,16,10,1,0,A 1410 Walther Von Ledebur (ex-Y 841) -1,3,78,16,11,0,0,Research ship (type 750) -1,3,78,16,11,1,0,A 1450 Planet -1,3,78,16,12,0,0,Trials ship (type 741) -1,3,78,16,12,1,0,A 1408 SP 1 (ex-A 837) -1,3,78,16,12,2,0,A 1409 Wilhelm Pullwer (ex-Y 838) -1,3,78,16,13,0,0,Diving tender (type 732) -1,3,78,16,13,1,0,M 1050 TB1 -1,3,78,16,14,0,0,Helgoland class (type 720, salvage tugs) -1,3,78,16,14,1,0,A 1457 Helgoland -1,3,78,16,14,2,0,A 1458 Fehmarn -1,3,78,16,15,0,0,Wangerooge class (type 722, type 754; tugs) -1,3,78,16,15,1,0,A 1439 Baltrum -1,3,78,16,15,2,0,A 1440 Juist -1,3,78,16,15,3,0,A 1441 Langeoog -1,3,78,16,15,4,0,A 1451 Wangerooge -1,3,78,16,15,5,0,A 1452 Spiekeroog -1,3,78,16,15,6,0,A 1455 Rderney -1,3,78,17,0,0,0,Auxiliary, Merchant Marine -1,3,78,17,1,0,0,Harbor tugs (type 724) -1,3,78,17,1,1,0,Y 820 Sylt -1,3,78,17,1,2,0,Y 821 Fohr -1,3,78,17,1,3,0,Y 822 Amrum -1,3,78,17,1,4,0,Y 823 Neuwerk -1,3,78,17,1,5,0,Y 1680 Neuende -1,3,78,17,1,6,0,Y 1681 Heppens -1,3,78,17,1,7,0,Y 1682 Ellerbek -1,3,78,17,2,0,0,Harbor tugs (type 725) -1,3,78,17,2,1,0,Y 812 Lutjehorn -1,3,78,17,2,2,0,Y 814 Knechtsand -1,3,78,17,2,3,0,Y 815 Scharhorn -1,3,78,17,2,4,0,Y 816 Vogelsand -1,3,78,17,2,5,0,Y 817 Rdstrand -1,3,78,17,2,6,0,Y 819 Langeness -1,3,78,17,3,0,0,Harbor tugs (type 414) -1,3,78,17,3,1,0,Koos (ex-Delphin) -1,3,78,17,3,2,0,Wustrow (ex-Zander) -1,3,78,17,3,3,0,Drankse (ex-Kormoran) -1,3,78,17,3,4,0,Y 1651 (ex-A 08) -1,3,78,17,3,5,0,Y 1656 (ex-A 45) -1,3,78,17,3,6,0,Y 1658 (ex-A 68) -1,3,78,17,4,0,0,Icebreaking tug (type 724; Coast Guard vessels) -1,3,78,17,4,1,0,BG 5 Rettin -1,3,78,18,0,0,0,Utility -1,3,78,18,1,0,0,Gustav Konigs class (harbor tankers) -1,3,78,18,1,1,0,Y 1652 Kolpinsee (ex-C 11) -1,3,78,18,1,2,0,Y 1657 Fleesensee (ex-C 40) -1,3,78,18,2,0,0,Ohre class (accommodation ships) -1,3,78,18,2,1,0,Y 890 Vogtland (ex-H 71) -1,3,78,18,2,2,0,Y 891 Altmark (ex-H 11) -1,3,78,18,2,3,0,Y 892 Havelland (ex-H 51) -1,3,78,18,2,4,0,Y 893 Uckermark (ex-H 91) -1,3,78,18,2,5,0,Y 894 Borde (ex-H 72) -1,3,78,18,2,6,0,Y 895 Wische (ex-H 31) -1,3,78,18,3,0,0,Type 705 (water boats) -1,3,78,18,3,1,0,FW 1 A 1403 (ex-Y 864) -1,3,78,18,3,2,0,FW 5 A 1405 (ex-Y 868) -1,3,78,18,4,0,0,Knurrhahn Class (type 730, accommodation ship) -1,3,78,18,4,1,0,Y 811 Knurrhahn -1,3,78,18,5,0,0,Battery-charging craft (type 718) -1,3,78,18,5,1,0,LP 1 -1,3,78,18,5,2,0,LP 2 -1,3,78,18,5,3,0,Y 1690 LP 3 -1,3,78,18,6,0,0,Schwedeneck class (type 748, multipurpose) -1,3,78,18,6,1,0,Y 860 Schwedeneck -1,3,78,18,6,2,0,Y 861 Kronsort -1,3,78,18,6,3,0,Y 862 Helmsand -1,3,78,18,7,0,0,Stollergrund class (type 745, multipurpose) -1,3,78,18,7,1,0,Y 863 Stollergrund -1,3,78,18,7,2,0,Y 864 Mittelgrund -1,3,78,18,7,3,0,Y 865 Kalkgrund -1,3,78,18,7,4,0,Y 866 Breitgrund -1,3,78,18,7,5,0,Y 867 Bant -1,3,78,18,8,0,0,Trials ship (type 740) -1,3,78,18,8,1,0,Y 871 Heinz Roggenkamp -1,3,78,18,9,0,0,Floating docks (types 712-715) and cranes (type 711) -1,3,78,18,9,1,0,A Y 842 Schwimmdocks -1,3,78,18,9,2,0,Y 875 Hiev -1,3,78,18,9,3,0,B Y 879 Schwimmdocks -1,3,78,18,9,4,0,Y 876 Griep -1,3,78,18,9,5,0,c, 2 and 3 -1,3,78,18,10,0,0,Tank cleaning vessels (type 710) -1,3,78,18,10,1,0,Y 1641 Forde -1,3,78,18,10,2,0,Y 1642 Jade -1,3,78,18,11,0,0,Trial boat (type 740) -1,3,78,18,11,1,0,Y 1689 Bums -1,3,78,18,12,0,0,General service launches (types 740, 743, 744, 744a) -1,3,78,18,12,1,0,Y 1670 MT-BOOT -1,3,78,18,12,2,0,Y 1673 AK 5 -1,3,78,18,12,3,0,Y 1674 AK 6 -1,3,78,18,12,4,0,Y 1675 AM 8 -1,3,78,18,12,5,0,Y 1679 AM 7 -1,3,78,18,12,6,0,Y 1683 AK 6 -1,3,78,18,12,7,0,Y 1684 Peter Bachmann -1,3,78,18,12,8,0,Y 1686 AK 2 Y -1,3,78,18,13,0,0,Range-safety craft (5 type 369, 1 type 909) -1,3,78,18,13,1,0,Y 827 KW 15 -1,3,78,18,13,2,0,Y 830 KW 16 -1,3,78,18,13,3,0,Y 845 KW 17 -1,3,78,18,13,4,0,Y 832 KW 18 -1,3,78,18,13,5,0,Y 846 KW 20 -1,3,78,18,13,6,0,Y 857 H 11 -1,3,78,18,14,0,0,Twin-hull oil-recovery ships (type 738) -1,3,78,18,14,1,0,Y 1643 Bottsand -1,3,78,18,14,2,0,Y 1644 Eversand -1,3,78,18,15,0,0,Torpedo recovery vessels (type 430A) -1,3,78,18,15,1,0,Y 851 TF 1 -1,3,78,18,15,2,0,Y 852 TF 2 -1,3,78,18,15,3,0,Y 853 TF 3 -1,3,78,18,15,4,0,Y 855 TF 5 -1,3,78,50,0,0,0,Frigate -1,3,78,50,1,0,0,Thetis class (type 420) -1,3,78,50,1,1,0,P 6053 Hermes -1,3,78,50,1,2,0,P 6055 Triton -1,3,78,50,1,3,0,P 6056 Theseus -1,4,78,5,0,0,0,SS (Conventional attack-torpedo, patrol) -1,4,78,5,1,0,0,Type 206 -1,4,78,5,1,1,0,S 192 U 13 -1,4,78,5,1,2,0,S 193 U 14 -1,4,78,5,1,3,0,S 198 U 19 -1,4,78,5,1,4,0,S 199 U 20 -1,4,78,5,1,5,0,S 170 U 21 -1,4,78,5,1,6,0,S 176 U 27 -1,4,78,5,2,0,0,Type 206A -1,4,78,5,2,1,0,S 194 U 15 -1,4,78,5,2,2,0,S 195 U 16 -1,4,78,5,2,3,0,S 196 U 17 -1,4,78,5,2,4,0,S 197 U 18 -1,4,78,5,2,5,0,S 171 U 22 -1,4,78,5,2,6,0,S 172 U 23 -1,4,78,5,2,7,0,S 173 U 24 -1,4,78,5,2,8,0,S 174 U 25 -1,4,78,5,2,9,0,S 175 U 26 -1,4,78,5,2,10,0,S 177 U 28 -1,4,78,5,2,11,0,S 178 U 29 -1,4,78,5,2,12,0,S 179 U 30 -1,4,78,5,3,0,0,Type 205 -1,4,78,5,3,1,0,S 188 U 9 -1,4,78,5,3,2,0,S 189 U 10 -1,4,78,5,3,3,0,S 190 U 11 -1,4,78,5,3,4,0,S 191 U 12 -1,5,78,1,0,0,0,Manned -1,5,78,1,1,0,0,Space vehicles -1,5,78,1,1,1,0,Hermes -1,5,78,1,1,2,0,Saenger Spaceplane -1,5,78,1,2,0,0,Space Station -1,5,78,1,2,1,0,Columbus -1,5,78,1,3,0,0,Space Lab -1,5,78,1,3,1,0,D1 -1,5,78,1,3,2,0,D2 -1,5,78,1,3,3,0,D3 -1,5,78,1,3,4,0,IML 1 -1,5,78,2,0,0,0,Unmanned -1,5,78,2,1,0,0,Communication satellite -1,5,78,2,1,1,0,DFS-Kopernikus -1,5,78,2,1,2,0,Artemis -1,5,78,2,1,3,0,DRS -1,5,78,2,5,0,0,Meteorology satellite -1,5,78,2,5,1,0,Atmos -1,5,78,2,5,2,0,Azur -1,5,78,2,5,3,0,X-SAR -1,5,78,2,5,4,0,ERS -1,5,78,2,5,5,0,POEM -1,5,78,2,7,0,0,Imaging Radar Surveillance Satellite -1,5,78,2,7,1,0,Rosat -1,5,78,2,13,0,0,Science satellite -1,5,78,2,13,2,0,Ulysses -1,5,78,2,13,3,0,Galileo -1,5,78,2,13,4,0,Soho & Cluster -1,5,78,2,13,5,0,Eureca -1,5,78,2,13,6,0,Astro-SPAS -1,5,78,2,13,7,0,HST -1,5,78,2,13,8,0,Mars-94/96 -1,5,78,2,13,9,0,ISO -1,5,78,2,13,10,0,Huygens/Cassini -1,5,78,2,13,11,0,Giotto -1,5,78,2,13,12,0,Hipparcos -1,5,78,2,13,13,0,Compton -1,5,78,2,13,15,0,Bremsat -1,5,78,2,15,0,0,Microgravity Satellite -1,5,78,2,15,1,0,Spacelab -1,5,78,2,15,2,0,Eureca -1,5,78,2,15,3,0,SPAS -1,5,78,2,15,4,0,Maxus -1,5,78,2,15,5,0,Texus -1,5,78,2,15,6,0,Mikroba -1,5,78,2,15,7,0,Mir-92 -1,5,78,2,15,8,0,MAUS -1,5,78,2,15,9,0,Express -1,5,78,2,16,0,0,Miscellaneous -1,5,78,2,16,1,0,Shuttle Pallet (SPAS) -1,5,78,3,0,0,0,Boosters -1,5,78,3,1,0,0,Ariane -1,5,78,3,2,0,0,Maxus -1,5,78,3,3,0,0,Saenger -2,0,225,1,0,0,0,Guided -2,0,225,1,1,0,0,Deadeye 5-in. projectile -2,0,225,3,0,0,0,Fixed -2,0,225,3,1,0,0,Mine-clearing torpedo, Bangalore -2,0,225,3,1,1,0,M1A1 -2,0,225,3,1,2,0,M1A2 -2,1,225,1,0,0,0,Guided -2,1,225,1,1,0,0,AIM-9 Sidewinder -2,1,225,1,1,1,0,AIM-9B -2,1,225,1,1,2,0,AIM-9D -2,1,225,1,1,3,0,AIM-9L/M/S -2,1,225,1,1,4,0,AIM-9P -2,1,225,1,1,5,0,AIM-9R -2,1,225,1,2,0,0,AIM-120 Advanced Medium-Range Air-to-Air Missile (AMRAAM) -2,1,225,1,2,1,0,AIM-120A -2,1,225,1,4,0,0,Falcon -2,1,225,1,4,1,0,AIM-4D -2,1,225,1,4,2,0,AIM-4F -2,1,225,1,4,3,0,AIM-4G -2,1,225,1,4,4,0,AIM-26 -2,1,225,1,4,5,0,AIM-26B -2,1,225,1,5,0,0,MIM-72 Chaparral -2,1,225,1,6,0,0,MIM-23 Hawk C/E/F/G/H -2,1,225,1,6,1,0,MIM-23B I-Hawk -2,1,225,1,7,0,0,MLMS -2,1,225,1,8,0,0,AIM-54 Phoenix -2,1,225,1,8,1,0,AIM-54A -2,1,225,1,8,2,0,AIM-54C -2,1,225,1,9,0,0,Rapier UK -2,1,225,1,10,0,0,FIM-43 Redeye -2,1,225,1,11,0,0,Roland -2,1,225,1,12,0,0,Sea Sparrow -2,1,225,1,12,1,0,RIM-7H -2,1,225,1,13,0,0,Sparrow -2,1,225,1,13,1,0,AIM-7F -2,1,225,1,13,2,0,AIM-7M -2,1,225,1,13,3,0,AIM-7P -2,1,225,1,13,4,0,RIM-66 -2,1,225,1,13,5,0,RIM-67 -2,1,225,1,15,0,0,Stinger -2,1,225,1,15,1,0,FIM-92 Stinger A/B/C -2,1,225,1,15,2,0,Stinger Post -2,1,225,1,15,3,0,Stinger RMP -2,1,225,1,16,0,0,MIM-104 Patriot -2,1,225,1,16,1,0,PAC-2 -2,1,225,1,16,2,0,PAC-3 -2,1,225,1,17,0,0,Tartar -2,1,225,1,18,0,0,Terrier -2,1,225,1,19,0,0,ADATS -2,1,225,1,20,0,0,MIM-14B Nike-Hercules -2,1,225,1,21,0,0,Theatre High-Altitude Area Defense (THAAD) -2,1,225,1,22,0,0,LTV Extended Range Interceptor (ERINT) -2,1,225,1,23,0,0,RIM-67 Standard Missile -2,1,225,1,23,1,0,SM-2ER Block 4A -2,1,225,1,24,0,0,Navy Area Defence Interceptor -2,1,225,1,25,0,0,RIM-24 -2,1,225,1,25,1,0,RIM-24B -2,1,225,1,26,0,0,RIM-2 -2,1,225,2,0,0,0,Ballistic -2,1,225,2,1,0,0,3-in, .50 caliber -2,1,225,2,2,0,0,12.7-mm/.50 caliber -2,1,225,2,2,1,0,M2 AP -2,1,225,2,2,2,0,M8 API -2,1,225,2,2,3,0,M20 API-T -2,1,225,2,2,4,0,M2 ball -2,1,225,2,2,5,0,M33 ball -2,1,225,2,2,6,0,M1 incediary -2,1,225,2,2,7,0,M23 incendiary -2,1,225,3,0,0,0,Fixed -2,1,225,3,1,0,0,Anti-helicopter mine (AHM) -2,2,225,1,0,0,0,Guided -2,2,225,1,1,0,0,BGM-71 TOW -2,2,225,1,1,1,0,BGM-71A/B -2,2,225,1,1,2,0,BGM-71C ITOW -2,2,225,1,1,3,0,BGM-71D TOW 2 -2,2,225,1,2,0,0, Dragon ATGW -2,2,225,1,2,1,0,M222 Dragon -2,2,225,1,2,2,0,Dragon II -2,2,225,1,2,3,0,Dragon III -2,2,225,1,3,0,0,AGM-114 Hellfire -2,2,225,1,3,1,0,AGM-114A -2,2,225,1,3,2,0,AGM-114B -2,2,225,1,3,3,0,AGM-114C -2,2,225,1,3,4,0,AGM-114F -2,2,225,1,4,0,0,AGM-65 Maverick -2,2,225,1,4,1,0,AGM-65A -2,2,225,1,4,2,0,AGM-65B -2,2,225,1,4,3,0,AGM-65D -2,2,225,1,4,4,0,AGM-65E -2,2,225,1,4,5,0,AGM-65F -2,2,225,1,4,6,0,AGM-65G -2,2,225,1,5,0,0,M712 Copperhead Cannon Launched Guided Projectile -2,2,225,1,6,0,0,AAWS-M -2,2,225,1,7,0,0,High Velocity Missile (HVM) -2,2,225,1,8,0,0,Javelin -2,2,225,2,0,0,0,Ballistic -2,2,225,2,1,0,0,12.7-mm (.50 Cal) -2,2,225,2,1,1,0,M2 AP -2,2,225,2,1,2,0,M8 API -2,2,225,2,1,3,0,M17 -2,2,225,2,1,4,0,M20 API-T -2,2,225,2,1,5,0,A534 (4 ball & 1 tracer mix) -2,2,225,2,2,0,0,20 mm -2,2,225,2,2,1,0,M39 -2,2,225,2,2,2,0,M53 API -2,2,225,2,2,3,0,M601 API-T -2,2,225,2,2,4,0,M775 API-T -2,2,225,2,2,5,0,M940 MP-T-SD -2,2,225,2,2,6,0,MK149 Mod 4 APDS -2,2,225,2,2,7,0,Oerlikon S -2,2,225,2,2,8,0,PGU-28/B SAP-HE -2,2,225,2,2,9,0,U.S. Navy Mark 100 -2,2,225,2,3,0,0,25 mm -2,2,225,2,3,1,0,Oerlikon KBA -2,2,225,2,3,2,0,M791 APDS-T -2,2,225,2,3,3,0,M919 APFSDS-T -2,2,225,2,3,4,0,PGU-20/U API -2,2,225,2,3,5,0,PGU-32/U, SAPHEI -2,2,225,2,3,6,0,Mk 96 -2,2,225,2,4,0,0,30 mm -2,2,225,2,4,1,0,173 Mauser model F APDS-T -2,2,225,2,4,2,0,GAU-8/A -2,2,225,2,5,0,0,66 mm 72 LAW -2,2,225,2,6,0,0,76 mm -2,2,225,2,6,1,0,M319, HVAP-T -2,2,225,2,6,2,0,M331A1, HVAP-DS-T -2,2,225,2,6,3,0,M331A2, HVAP-DS-T -2,2,225,2,6,4,0,M339, AP-T -2,2,225,2,6,5,0,M464, APFSDS-T -2,2,225,2,6,6,0,M496, HEAT-T -2,2,225,2,7,0,0,81 mm -2,2,225,2,8,0,0,84 mm -2,2,225,2,9,0,0,90 mm -2,2,225,2,9,1,0,M77 AP-T -2,2,225,2,9,2,0,M82 APC-T -2,2,225,2,9,3,0,M318 AP-T -2,2,225,2,9,4,0,M318A1 AP-T -2,2,225,2,9,5,0,M332A1 HVAP-T -2,2,225,2,9,6,0,M348 HEAT -2,2,225,2,9,7,0,M348A1 HEAT -2,2,225,2,9,8,0,M431 HEAT-T -2,2,225,2,9,9,0,RCL M67 -2,2,225,2,10,0,0,105 mm -2,2,225,2,10,1,0,FP105, APFSDS -2,2,225,2,10,2,0,M392 APDS-T -2,2,225,2,10,3,0,M392A2 APDS-T -2,2,225,2,10,4,0,M456 HEAT-T -2,2,225,2,10,5,0,M456A2 HEAT-T -2,2,225,2,10,6,0,M662 HEAT-T -2,2,225,2,10,7,0,M728 APDS-T -2,2,225,2,10,8,0,M735 APFSDS-T -2,2,225,2,10,9,0,M774 APFSDS-T -2,2,225,2,10,10,0,M833 APFSDS-T -2,2,225,2,10,11,0,M900 APFSDS-T -2,2,225,2,10,12,0,Olin 105, APFSDS -2,2,225,2,10,13,0,XM815 HEAT-MP -2,2,225,2,11,0,0,106 mm RCL40 (M40) -2,2,225,2,12,0,0,107 mm -2,2,225,2,13,0,0,120 mm -2,2,225,2,13,1,0,M829 APFSDS-T -2,2,225,2,13,2,0,M829A1 APFSDS-T -2,2,225,2,13,3,0,M830 HEAT-MP-T -2,2,225,2,13,4,0,Olin 120 APFSDS -2,2,225,2,13,5,0,Olin 120+ APFSDS -2,2,225,2,14,0,0,152 mm -2,2,225,2,14,1,0,M409 Series HEAT-T-MP -2,2,225,2,15,0,0,155 mm -2,2,225,2,16,0,0,227-mm rocket -2,2,225,2,20,0,0,Hydra 70 Rocket System -2,2,225,2,50,0,0,Rockeye II Mk 20 cluster weapon -2,2,225,2,51,0,0,SUU-65/B TAC Munition Dispenser (TMD) Wide Area Antiarmor Munition (WAAM) -2,2,225,3,0,0,0,Fixed -2,2,225,3,1,0,0,Area Denial Artillery Munition (ADAM) -2,2,225,3,2,0,0,Extended Range Anti-armor Munition (ERAM) -2,2,225,3,3,0,0,GATOR Anti-armor System -2,2,225,3,4,0,0,XM93 Wide Area Mine (WAM) -2,2,225,3,5,0,0,M21 Heavy Antitank mine -2,2,225,3,6,0,0,Off-route Antitank mine -2,2,225,3,6,1,0,M24 -2,2,225,3,6,2,0,M66 -2,2,225,3,7,0,0,M19 Antitank mine -2,2,225,3,8,0,0,M15 Antitank mine -2,2,225,3,9,0,0,M86 Pursuit Deterrent Munition (PDM) -2,3,225,1,0,0,0,Guided -2,3,225,1,0,1,0, Anti-Radiation Missile Decoy (ARM-D) -2,3,225,1,2,0,0,RIM-72 Sea Chaparral -2,3,225,1,3,0,0,RIM-116A RAM -2,4,225,1,0,0,0,Guided -2,4,225,1,1,0,0,AGM-88 High-speed Antiradiation Missile (HARM) -2,4,225,1,1,1,0,AGM-88A -2,4,225,1,1,2,0,AGM-88B -2,4,225,1,1,3,0,AGM-88C -2,4,225,1,2,0,0,AGM-45 Shrike -2,4,225,1,2,1,0,AGM-45A -2,4,225,1,2,2,0,AGM-45B -2,4,225,1,3,0,0,AGM-78 Standard ARM -2,4,225,1,4,0,0,AGM-122 Sidearm -2,4,225,1,4,1,0, AGM-122A -2,4,225,1,5,0,0,AGM-136 TACIT RAINBOW -2,4,225,1,5,1,0,AGM-136A -2,4,225,1,6,0,0,Stinger -2,4,225,1,6,1,0,Air Defense Suppression Missile (ADSM) -2,5,225,1,0,0,0,Guided -2,5,225,1,1,0,0,Asat -2,6,225,1,0,0,0,Guided -2,6,225,1,1,0,0,Harpoon -2,6,225,1,1,1,0,AGM-84A -2,6,225,1,1,2,0,UGM-84A -2,6,225,1,1,3,0,RGM-84A -2,6,225,1,5,0,0,NT 37F torpedo -2,6,225,1,5,1,0,Mod 2 -2,6,225,1,5,2,0,Mod 3 -2,6,225,1,5,3,0,NT 37E -2,6,225,1,7,0,0,MK50 Torpedo Advance Light Weight (ALWP) -2,6,225,1,8,0,0,AGM-142 Popeye -2,6,225,1,9,0,0,AGM-119 Penguin -2,6,225,1,10,0,0,AGM-123 Skipper -2,6,225,1,10,1,0,AGM-123A -2,6,225,1,11,0,0,RBS 17 Hellfire (AGM-114B) anti-surface-vessel missile -2,6,225,1,12,0,0,Tomahawk Antiship Missile (TASM) -2,6,225,2,0,0,0,Ballistic -2,6,225,2,1,0,0,5-in .38 caliber -2,6,225,2,2,0,0,5-in .54 caliber -2,6,225,2,2,1,0,AAC -2,6,225,2,2,2,0,HC -2,6,225,2,2,3,0,HE-IR -2,6,225,2,2,4,0,HE-PD -2,6,225,2,2,5,0,HE -2,6,225,2,2,6,0,HE-CVT -2,6,225,2,2,7,0,IR -2,6,225,2,2,8,0,VT (Variable Time) -2,6,225,2,2,9,0,VT-IR (Variable Time, Infrared) -2,6,225,2,2,10,0,VT-RF -2,6,225,2,3,0,0,76 mm -2,6,225,2,3,1,0,AAC -2,6,225,2,3,2,0,HE -2,6,225,2,3,3,0,HE-PD -2,6,225,2,3,4,0,VT fragmentation -2,6,225,2,3,5,0,VT IR -2,6,225,3,0,0,0,Fixed -2,6,225,3,1,0,0,DST Mk 36 mine -2,6,225,3,2,0,0,DST Mk 40 mine -2,6,225,3,3,0,0,DST Mk 41 mine -2,6,225,3,4,0,0,DST 115A mine -2,6,225,3,5,0,0,Mk 52 bottom mine -2,6,225,3,5,1,0,Mod 1 -2,6,225,3,5,2,0,Mod 2 -2,6,225,3,5,3,0,Mod 3 -2,6,225,3,6,0,0,Mk 55 bottom mine -2,6,225,3,6,1,0,Mod 2 -2,6,225,3,6,2,0,Mod 3 -2,6,225,3,6,3,0,Mod 5 -2,6,225,3,6,4,0,Mod 6 -2,6,225,3,6,5,0,Mod 7 -2,6,225,3,7,0,0,Mk 57 moored mine -2,6,225,3,7,1,0,Mod 0 -2,6,225,3,8,0,0,Quickstrike mines -2,6,225,3,8,1,0,Mk 62 -2,6,225,3,8,2,0,Mk 63 -2,6,225,3,8,3,0,Mk 64 -2,6,225,3,8,4,0,Mk 65 -2,6,225,3,9,0,0,CAPTOR - Encapsulated Torpedo moored mine -2,6,225,3,10,0,0,Advanced sea mine -2,6,225,3,11,0,0,Mk 56 Mod 0 moored mine -2,7,225,1,0,0,0,Guided -2,7,225,1,1,0,0,Mk 46 torpedo -2,7,225,1,1,1,0,Mk 46 Mod 0 -2,7,225,1,1,2,0,Mk 46 Mod 5 (NEARTIP) -2,7,225,1,1,3,0,Mk 46 Mod 7 -2,7,225,1,2,0,0,Mk 48 torpedo -2,7,225,1,3,0,0,M50 Barracuda torpedo -2,7,225,1,4,0,0,MK37 torpedo -2,7,225,1,4,1,0,Mod 0 -2,7,225,1,4,2,0,Mod 1 -2,7,225,1,4,3,0,Mod 2 -2,7,225,1,4,4,0,Mod 3 -2,7,225,1,5,0,0,RUR-5A ASROC -2,7,225,1,6,0,0,CASW/SOW -2,7,225,1,7,0,0,SUBROC -2,7,225,1,7,1,0,UUM-44A -2,7,225,1,9,0,0,Mk 44 torpedo -2,7,225,1,10,0,0,Mk 48 ADCAP torpedo -2,7,225,1,11,0,0,Mk 50 Advanced lightweight torpedo -2,7,225,1,11,1,0,Mod 1 -2,7,225,1,11,2,0,Mod 2 -2,7,225,1,12,0,0,NT 37F -2,7,225,1,12,1,0,Mod 2 -2,7,225,1,12,2,0,Mod 3 -2,7,225,1,12,3,0,NT 37E -2,7,225,1,13,0,0,HOTTORP torpedo -2,7,225,1,14,0,0,Sea Lance ASW -2,7,225,1,18,0,0,Mk 32 torpedo -2,7,225,1,18,1,0,Mod 2 -2,8,225,2,0,0,0,Ballistic -2,8,225,2,1,0,0,5.56 mm -2,8,225,2,1,1,0,M193 -2,8,225,2,1,2,0,M193 Tracer -2,8,225,2,1,3,0,5.45 x 45 -2,8,225,2,1,4,0,5.56 x 45 -2,8,225,2,2,0,0,7.62 mm -2,8,225,2,2,1,0,.30 Carbine -2,8,225,2,2,2,0,.308 Winchester -2,8,225,2,2,3,0,.30-06 Springfield -2,8,225,2,2,4,0,M60 -2,8,225,2,2,5,0,M14 -2,8,225,2,2,6,0,M16 -2,8,225,2,3,0,0,9.0 mm -2,8,225,2,3,1,0,.380 Auto -2,8,225,2,3,2,0,Browning Short -2,8,225,2,3,3,0,Parabellum -2,8,225,2,3,4,0,Winchester Magnum -2,8,225,2,4,0,0,11.43 mm -2,8,225,2,5,0,0,12.7 mm -2,8,225,2,5,1,0,.50 Spotting rifle -2,8,225,2,5,2,0,.50 Browning MG -2,8,225,2,6,0,0,7.65 mm -2,8,225,2,6,1,0,Browning -2,8,225,2,6,2,0,Parabellum -2,8,225,2,7,0,0,90 mm -2,8,225,2,7,1,0,M580 APERS-T -2,8,225,2,8,0,0,105 mm -2,8,225,2,8,1,0,M336 canister -2,8,225,2,8,2,0,M377 canister -2,8,225,2,8,3,0,M494 APERS-T -2,8,225,2,8,4,0,M546 APERS-T -2,8,225,2,9,0,0,152 mm -2,8,225,2,9,1,0,M625A1 cannister (flechettes) -2,8,225,2,10,0,0,.243 -2,8,225,2,10,1,0,Winchester -2,8,225,2,11,0,0,.357 -2,8,225,2,11,1,0,Magnum -2,8,225,2,12,0,0,.38 Cal -2,8,225,2,12,1,0,Auto -2,8,225,2,12,2,0,Super Auto -2,8,225,2,12,3,0,Special -2,8,225,2,13,0,0,.45 -2,8,225,2,13,1,0,Auto Colt -2,8,225,2,14,0,0,6.35 -2,8,225,2,50,0,0,BLU-97 Submunition -2,8,225,2,50,1,0,BLU-97A -2,8,225,2,50,2,0,BLU-97B -2,8,225,2,51,0,0,ISCB-1 Area Denial Cluster Weapon -2,8,225,3,0,0,0,Fixed -2,8,225,3,1,0,0,Bounding mines -2,8,225,3,1,1,0,M16 -2,8,225,3,1,2,0,M16A1 -2,8,225,3,1,3,0,M16A2 -2,8,225,3,1,4,0,M2A4 -2,8,225,3,2,0,0,Claymore mine -2,8,225,3,3,0,0,M15 heavy AT mine -2,8,225,3,4,0,0,M19 nonmetallic AT mine -2,8,225,3,5,0,0,M21 heavy AT mine -2,8,225,3,6,0,0,M741 scatterable AT mine -2,8,225,3,7,0,0,M718 scatterable AT mine -2,8,225,3,8,0,0,M75 scatterable AT mine -2,8,225,3,9,0,0,Nonmetallic "Toe Popper" mine -2,8,225,3,9,1,0,M14 -2,8,225,3,10,0,0,M731 scatterable mine -2,8,225,3,11,0,0,M692 scatterable mine -2,8,225,3,12,0,0,M74 scatterable mine -2,8,225,3,13,0,0,M1 one-gallon chemical mine -2,8,225,3,14,0,0,M18A1 mine -2,8,225,3,15,0,0,M23 chemical-agent mine -2,8,225,3,16,0,0,M26 mine -2,9,225,1,0,0,0,Guided -2,9,225,1,1,0,0,AGM-86 Air Launched Cruise Missile (ALCM) -2,9,225,1,1,1,0,AGM-86B -2,9,225,1,1,2,0,AGM-86C -2,9,225,1,2,0,0,AGM-12 Bullpup -2,9,225,1,2,1,0,AGM-12 Bullpup A -2,9,225,1,2,2,0,AGM-12 Bullpup B -2,9,225,1,3,0,0,MGM-52C Lance -2,9,225,1,4,0,0,MGM-31 Pershing -2,9,225,1,5,0,0,AGM-109 Tomahawk -2,9,225,1,6,0,0,BGM-109G Tomahawk -2,9,225,1,7,0,0,AGM-62 Walleye -2,9,225,1,8,0,0,SRAM-A -2,9,225,1,8,1,0,AGM-69A -2,9,225,1,8,2,0,AGM-69B -2,9,225,1,9,0,0,SLAM -2,9,225,1,9,1,0,AGM/RGM 84E -2,9,225,1,10,0,0,Advanced Cruise Missile -2,9,225,1,10,1,0,AGM-129A -2,9,225,1,11,0,0,SRAM -2,9,225,1,11,1,0,AGM-131A SRAM-2 -2,9,225,1,11,2,0,AGM-131B SRAM-T -2,9,225,1,12,0,0,AGM 130 -2,9,225,1,12,1,0,AGM-130A -2,9,225,1,12,2,0,AGM-130C -2,9,225,1,13,0,0,Boeing 120-mm Fiber Optic Mortar Projectile (FOMP) -2,9,225,1,14,0,0,Mk-82 -2,9,225,1,15,0,0,Mk-84 bomb -2,9,225,1,15,1,0,GBU-15 Glide Bomb -2,9,225,1,15,2,0,GBU-24A/B Glide Bomb -2,9,225,1,15,3,0,PAVEWAY II laser-guided -2,9,225,1,15,4,0,GBU-10 Mk 84 2000-lb -2,9,225,1,15,5,0,GBU-12 Mk 82 500-lb -2,9,225,1,15,6,0,GBU-16 Mk 83 1000-lb -2,9,225,1,15,7,0,Mk 13/18 1000-lb -2,9,225,1,16,0,0,Paveway III -2,9,225,1,16,1,0,GBU-24A/B Mk 109/B 2000-lb pen Bm -2,9,225,1,16,2,0,GBU-24B Mk 84 2000-lb HE bomb -2,9,225,1,17,0,0,Army TACMS -2,9,225,1,17,1,0,M39 -2,9,225,2,0,0,0,Ballistic -2,9,225,2,1,0,0,20 mm -2,9,225,2,1,1,0,M39 -2,9,225,2,1,2,0,M56 HEI -2,9,225,2,1,3,0,M56A3 HE/I -2,9,225,2,1,4,0,M210 HEI -2,9,225,2,1,5,0,M242 HE-I-T -2,9,225,2,1,6,0,M246 HEIT-SD -2,9,225,2,1,7,0,M246 HEI-T -2,9,225,2,1,8,0,M940 MPT-SD -2,9,225,2,1,9,0,Mk 149 (Mod2, 4) CIWS -2,9,225,2,2,0,0,25 mm -2,9,225,2,2,1,0,792 HE-I-T -2,9,225,2,2,2,0,PGU-22/25 HE-I -2,9,225,2,3,0,0,30 mm -2,9,225,2,3,1,0,M789 HEDP -2,9,225,2,4,0,0,40 mm -2,9,225,2,4,1,0,Grenade cartridges -2,9,225,2,4,2,0,M433 HEDP -2,9,225,2,4,3,0,M397 Airburst -2,9,225,2,4,4,0,M397A1 Airburst -2,9,225,2,4,5,0,M381 HE -2,9,225,2,4,6,0,M386 HE -2,9,225,2,4,7,0,M406 HE -2,9,225,2,4,8,0,M433 HEDP -2,9,225,2,4,9,0,M441 HE -2,9,225,2,4,10 M576 Buckshot,0, -2,9,225,2,4,11,0,M583 White star parachute -2,9,225,2,4,12,0,M583A1 White star parachute -2,9,225,2,4,13,0,M585 Star cluster -2,9,225,2,4,14,0,M651 Tactical CS -2,9,225,2,4,15,0,M661 Green star parachute -2,9,225,2,4,16,0,M662 Red star parachute -2,9,225,2,4,17,0,M676 Yellow smoke canopy -2,9,225,2,4,18,0,M680 White smoke canopy -2,9,225,2,4,19,0,M682 Red smoke canopy -2,9,225,2,4,20,0,M713 Red ground smoke marker -2,9,225,2,4,21,0,M715 Green ground smoke marker -2,9,225,2,4,22,0,M716 Yellow ground smoke marker -2,9,225,2,5,0,0,60 mm -2,9,225,2,5,1,0,M49A4 HE bomb -2,9,225,2,5,2,0,M49A5 HE bomb -2,9,225,2,5,3,0,M83A3 illuminating bomb -2,9,225,2,5,4,0,M302A2 smoke bomb -2,9,225,2,5,5,0,M720 HE bomb -2,9,225,2,6,0,0,66 mm rocket -2,9,225,2,7,0,0,76 mm -2,9,225,2,7,1,0,M352 HE -2,9,225,2,7,2,0,M361 smoke -2,9,225,2,7,3,0,M361A1 smoke -2,9,225,2,7,4,0,M363 HE -2,9,225,2,8,0,0,81 mm -2,9,225,2,8,1,0,M43A1 HE bomb -2,9,225,2,8,2,0,M43A1B1 HE bomb -2,9,225,2,8,3,0,M57 smoke WP bomb -2,9,225,2,8,4,0,M57A1 smoke WP bomb -2,9,225,2,8,5,0,M301A1 illuminating bomb -2,9,225,2,8,6,0,M301A2 illuminating bomb -2,9,225,2,8,7,0,M301A3 illuminating bomb -2,9,225,2,8,8,0,M362 HE bomb -2,9,225,2,8,9,0,M362A1 HE bomb -2,9,225,2,8,10,0,M370 smoke bomb -2,9,225,2,8,11,0,M374 HE bomb -2,9,225,2,8,12,0,M374A2 HE bomb -2,9,225,2,8,13,0,M374A3 HE bomb -2,9,225,2,8,14,0,M375 smoke bomb -2,9,225,2,8,15,0,M375A1 smoke bomb -2,9,225,2,8,16,0,M375A2 smoke bomb -2,9,225,2,8,17,0,M445 training bomb -2,9,225,2,9,0,0,90 mm -2,9,225,2,9,1,0,M71 HE -2,9,225,2,9,2,0,M71 A1 HE-T -2,9,225,2,9,3,0,M313 smoke -2,9,225,2,9,4,0,M313C smoke -2,9,225,2,10,0,0,105 mm -2,9,225,2,10,1,0,M1 HE -2,9,225,2,10,2,0,M60 Agent H/HD -2,9,225,2,10,3,0,M60 smoke -2,9,225,2,10,4,0,M84 smoke -2,9,225,2,10,5,0,M314 illumination -2,9,225,2,10,6,0,M314A3, illuminating cartridge -2,9,225,2,10,7,0,M327 HEP/HEP-T -2,9,225,2,10,8,0,M360 Agent GB -2,9,225,2,10,9,0,M393 HEP-T -2,9,225,2,10,10,0,M413 HE -2,9,225,2,10,11,0,M416 smoke WP -2,9,225,2,10,12,0,M444 HE -2,9,225,2,10,13,0,M548 HERA -2,9,225,2,10,14,0,M629 tactical CS -2,9,225,2,10,15,0,M657 HE-T -2,9,225,2,10,16,0,M760 HE -2,9,225,2,10,17,0,M913 RAP -2,9,225,2,10,18,0,XM872 KE -2,9,225,2,11,0,0,120 mm -2,9,225,2,12,0,0,127 mm -2,9,225,2,13,0,0,152 mm -2,9,225,2,14,0,0,155 mm -2,9,225,2,14,1,0,BGD155C ICM -2,9,225,2,14,2,0,M107 HE -2,9,225,2,14,3,0,M483A1 HE DP (ICM) -2,9,225,2,14,4,0,M485 illumination -2,9,225,2,14,5,0,M485A1 illumination -2,9,225,2,14,6,0,M485A2 illumination -2,9,225,2,14,7,0,M549 HE RA -2,9,225,2,14,8,0,M549A1 HE RA -2,9,225,2,14,9,0,M864 BB ICM -2,9,225,2,15,0,0,203 mm -2,9,225,2,15,1,0,M106 HE -2,9,225,2,15,2,0,M404 HE/ICM -2,9,225,2,15,3,0,M422 nuclear -2,9,225,2,15,4,0,M426 Agent GB -2,9,225,2,15,5,0,M509 HE/ICM -2,9,225,2,15,6,0,M509 A1, HE/ICM -2,9,225,2,15,7,0,M650 HERA -2,9,225,2,15,8,0,M753 nuclear -2,9,225,2,16,0,0,227 mm rocket -2,9,225,2,18,0,0,107 mm -2,9,225,2,18,1,0,M328 smoke bomb -2,9,225,2,18,2,0,M328 A1 smoke bomb -2,9,225,2,18,3,0,M329 A1 HE bomb -2,9,225,2,18,4,0,M329 A2 HE bomb -2,9,225,2,18,5,0,M335 illuminating bomb -2,9,225,2,18,6,0,M335 A2 illuminating bomb -2,9,225,2,18,7,0,M630 tactical CS bomb -2,9,225,2,19,0,0,7.62 mm -2,9,225,2,19,1,0,A131 (4 Ball & 1 Tracer Mix) -2,9,225,2,19,2,0,M62 (4 Ball & 1 Tracer) -2,9,225,2,19,3,0,M80 -2,9,225,2,19,4,0,A141 (4 ball & 1 Tracer mix) -2,9,225,2,20,0,0,12.7 mm -2,9,225,2,20,1,0,M2 ball -2,9,225,2,20,2,0,M17 tracer -2,9,225,2,20,3,0,M33 ball -2,9,225,2,21,0,0,70 mm (2.75 in) rocket -2,9,225,2,21,1,0,M 151 HE -2,9,225,2,21,2,0,M 255 flechette -2,9,225,2,21,3,0,M 261 submunitions -2,9,225,2,21,4,0,M 262 -2,9,225,2,22,0,0,175 mm 2 -2,9,225,2,22,1,0,M437A1 HE -2,9,225,2,22,2,0,M437A2 HE -2,9,225,2,40,0,0,M76 vehicle smoke grenade -2,9,225,2,41,0,0,M243 smoke grenade -2,9,225,2,42,0,0,M250 smoke grenade -2,9,225,2,43,0,0,M257 grenade -2,9,225,2,43,1,0,L8A1/A3 red phosphorous smoke grenade -2,9,225,2,43,2,0,L8A1/A3 WP smoke grenade -2,9,225,2,44,0,0,M545 universal fragmentation grenade -2,9,225,2,45,0,0,M560-series antipersonnel fragmentation grenades -2,9,225,2,46,0,0,Ring Airfoil Grenade (RAG) -2,9,225,2,50,0,0,B28 nuclear bomb -2,9,225,2,50,1,0,B28 EX -2,9,225,2,50,2,0,B28 FI -2,9,225,2,50,3,0,B28 IN -2,9,225,2,50,4,0,B28 RE -2,9,225,2,50,5,0,B28 RI -2,9,225,2,51,0,0,B43 nuclear bomb -2,9,225,2,52,0,0,B53 nuclear bomb -2,9,225,2,53,0,0,B57 nuclear bomb -2,9,225,2,54,0,0,B61 nuclear bomb -2,9,225,2,54,1,0,mod O -2,9,225,2,54,2,0,mod 1 -2,9,225,2,54,3,0,mod 2 -2,9,225,2,54,4,0,mod 3 -2,9,225,2,54,5,0,mod 4 -2,9,225,2,54,6,0,mod 5 -2,9,225,2,55,0,0,B83 nuclear bomb -2,9,225,2,56,0,0,BLU-73/B FAE Bomb -2,9,225,2,57,0,0,BLU-109/B Bomb -2,9,225,2,58,0,0,CBU 15 -2,9,225,2,59,0,0,CBU 52 -2,9,225,2,60,0,0,CBU-55 -2,9,225,2,61,0,0,CBU 58 -2,9,225,2,62,0,0,CBU 71 -2,9,225,2,63,0,0,CBU 75 -2,9,225,2,64,0,0,CBU 87 -2,9,225,2,64,1,0,CBU-87/B (CEM) -2,9,225,2,66,0,0,CBU 89 -2,9,225,2,67,0,0,CBU-97/B -2,9,225,2,68,0,0,Direct Airfield Attack CombinedMunition Weapon (DAACM) -2,9,225,2,69,0,0,Durandal -2,9,225,2,70,0,0,M117 GP bomb -2,9,225,2,70,1,0,M117R -2,9,225,2,71,0,0,Mk-20 -2,9,225,2,72,0,0,Mk-81 -2,9,225,2,73,0,0,Mk-82 -2,9,225,2,73,1,0,Mk-82RE -2,9,225,2,74,0,0,Mk-83 -2,9,225,2,75,0,0,Mk-84 -2,9,225,2,75,1,0,Mk-84RE -2,9,225,2,76,0,0,Sensor Fused Weapon (SFW) -2,9,225,2,77,0,0,165mm HEP -2,9,225,2,78,0,0,Napalm -2,9,225,2,79,0,0,Mine Clearing Lane Charge -2,9,225,2,80,0,0,MLRS Rocket -2,9,225,2,80,1,0,M26 -2,9,225,2,80,2,0,M28A1 -2,9,225,2,81 5.56 MM,0,0, -2,9,225,2,81 5.56 MM,1 M855 Ball,0, -2,9,225,2,81 5.56 MM,2 M856 Tracer,0, -2,9,225,2,81 5.56 MM,3 A064 (4 ball & 1 tracer mix),0, -2,9,225,3,0,0,0,Fixed -2,9,225,3,1,0,0,SLAM -2,10,225,1,0,0,0,Guided -2,10,225,1,1,0,0,AGM-86B ALCM -2,10,225,1,2,0,0,AGM-109 Tomahawk -2,10,225,1,3,0,0,BGM-109G Tomahawk -2,10,225,1,4,0,0,Tomahawk -2,10,225,1,4,1,0,M-109A (TLAM-N) -2,10,225,1,4,2,0,BGM-109B TASM -2,10,225,1,4,3,0,BGM-109C (TLAM-C) -2,10,225,1,4,4,0,BGM-109D (TLAM-D) -2,10,225,1,5,0,0,LGM-25C Titan II -2,10,225,1,6,0,0,LGM-30F Minuteman II -2,10,225,1,7,0,0,LGM-30G Minuteman III -2,10,225,1,8,0,0,MGM-118 Peacekeeper -2,10,225,1,9,0,0,UGM-73 Poseidon -2,10,225,1,10,0,0,UGM-93A Trident (II) -2,1,222,1,0,0,0,Guided -2,1,222,1,1,0,0,AA-1 Alkali -2,1,222,1,2,0,0,AA-2 Atoll -2,1,222,1,2,1,0,AA-2C -2,1,222,1,2,2,0,AA-2D -2,1,222,1,3,0,0,AA-3 Anab -2,1,222,1,3,1,0,AA-3, IR -2,1,222,1,3,2,0,AA-3, radar -2,1,222,1,5,0,0,AA-5 Ash -2,1,222,1,5,1,0,AA-5, IR -2,1,222,1,5,2,0,AA-5, radar -2,1,222,1,6,0,0,AA-6 Acrid -2,1,222,1,6,1,0,AA-6, IR -2,1,222,1,6,2,0,AA-6, radar -2,1,222,1,7,0,0,AA-7 Apex -2,1,222,1,7,1,0,AA-7, IR -2,1,222,1,7,2,0,AA-7, radar -2,1,222,1,8,0,0,AA-8 Aphid -2,1,222,1,9,0,0,AA-9 Amos -2,1,222,1,9,1,0,AA-9, inertial -2,1,222,1,9,2,0,AA-9, command update -2,1,222,1,9,3,0,AA-9, radar -2,1,222,1,10,0,0,AA-10 Alamo -2,1,222,1,10,1,0,AA-10, radar -2,1,222,1,10,2,0,AA-10, inertial, IR -2,1,222,1,11,0,0,AA-11 Archer -2,1,222,1,12,0,0,AA-X-12 -2,1,222,1,13,0,0,SA-1 Guild -2,1,222,1,14,0,0,SA-2 Guideline -2,1,222,1,15,0,0,SA-3 Goa -2,1,222,1,15,1,0,SA-3A -2,1,222,1,15,2,0,SA-3B -2,1,222,1,16,0,0,SA-4 Ganef -2,1,222,1,16,1,0,SA-4A -2,1,222,1,16,2,0,SA-4B -2,1,222,1,17,0,0,SA-5 Gammon -2,1,222,1,17,1,0,SA-5A -2,1,222,1,17,2,0,SA-5B -2,1,222,1,17,3,0,SA-5C -2,1,222,1,18,0,0,SA-6 Gainful -2,1,222,1,18,1,0,SA-6A -2,1,222,1,18,2,0,SA-6B -2,1,222,1,19,0,0,SA-7 Grail -2,1,222,1,19,1,0,SA-7A -2,1,222,1,19,2,0,SA-7B -2,1,222,1,19,3,0,SA-7B (Spetsnaz mod) -2,1,222,1,19,4,0,SA-7C -2,1,222,1,20,0,0,SA-8 Gecko -2,1,222,1,20,1,0,SA-8A mod 0 -2,1,222,1,20,2,0,SA-8B mod 1 -2,1,222,1,21,0,0,SA-9 Gaskin -2,1,222,1,22,0,0,SA-10 Grumble -2,1,222,1,22,1,0,SA-10A (static) -2,1,222,1,22,2,0,SA-10B (mobile) -2,1,222,1,23,0,0,SA-11 Gadfly -2,1,222,1,24,0,0,SA-12 Gladiator/Giant -2,1,222,1,24,1,0,SA-12A Gladiator SAM -2,1,222,1,24,2,0,SA-12A Gladiator ATBM -2,1,222,1,24,3,0,SA-X-12B Giant SAM -2,1,222,1,24,4,0,SA-X-12B Giant SAM (rail w/ SS-24) -2,1,222,1,25,0,0,SA-13 Gopher -2,1,222,1,25,1,0,Strela 10M2 -2,1,222,1,25,2,0,Strela 10M3 -2,1,222,1,26,0,0,SA-14 Gremlin -2,1,222,1,27,0,0,SA-15 -2,1,222,1,28,0,0,SA-16 Gimlet -2,1,222,1,29,0,0,SA-X-17 (replaces SA-11) -2,1,222,1,30,0,0,SA-18 -2,1,222,1,31,0,0,SA-19 -2,1,222,1,32,0,0,SA-N-1 Goa (M-1 Volga-M) -2,1,222,1,33,0,0,SA-N-3 Goblet -2,1,222,1,33,1,0,SA-N-3 Mod 0 -2,1,222,1,33,2,0,SA-N-3B Mod 1 -2,1,222,1,34,0,0,SA-N-4 (OSA-M) -2,1,222,1,35,0,0,SA-N-5 Grail (Strela 2) -2,1,222,1,36,0,0,SA-N-6 -2,1,222,1,37,0,0,SA-N-7 Gadfly (Smerch/Shtil) -2,1,222,1,38,0,0,SA-N-8 Gremlin (Strela 3) -2,1,222,1,39,0,0,SA-N-9 Tor-M/Klinok) -2,1,222,1,40,0,0,SA-N-11 (9M311) -2,1,222,2,0,0,0,Ballistic -2,1,222,2,1,0,0,12.7 mm -2,1,222,2,2,0,0,14.5 mm -2,1,222,2,2,1,0,API -2,1,222,2,2,2,0,API-T -2,1,222,2,2,3,0,I-T -2,1,222,2,3,0,0,23 mm -2,1,222,2,3,1,0,NS HE-I-T OZT -2,1,222,2,3,2,0,NS AP-I BZ -2,1,222,2,3,3,0,VYa HE-I-T OZT -2,1,222,2,3,4,0,VYa AP-I BZ -2,1,222,2,5,0,0,25 mm -2,1,222,2,5,1,0,M1940 HE-I-T UOZR-132 -2,1,222,2,5,2,0,M1940 AP-T UZR-132 -2,1,222,2,5,3,0,2-M3 -2,1,222,2,5,4,0,2-M8 -2,1,222,2,6,0,0,30 mm -2,1,222,2,6,1,0,BR-83 AP-T -2,1,222,2,6,2,0,OF-83D HE -2,1,222,2,7,0,0,57 mm -2,1,222,2,8,0,0,76 mm -2,1,222,2,9,0,0,85 mm -2,1,222,2,10,0,0,100 mm -2,1,222,2,11,0,0,130 mm -2,1,222,2,11,1,0,SM-4-1 ? -2,2,222,1,0,0,0,Guided -2,2,222,1,1,0,0,RPG-7VAT Rocket Launcher -2,2,222,1,3,0,0,AT-1 Snapper -2,2,222,1,4,0,0,AT-2 Swatter -2,2,222,1,4,1,0,Swatter A/B (radio command) -2,2,222,1,4,2,0,Swatter C (SACLOS) -2,2,222,1,5,0,0,AT-3 Sagger -2,2,222,1,5,1,0,Sagger (MCLOS) -2,2,222,1,6,0,0,AT-4 Spigot -2,2,222,1,6,1,0,Spigot A -2,2,222,1,6,2,0,Spigot B -2,2,222,1,7,0,0,AT-5 Spandrel -2,2,222,1,8,0,0,AT-6 Spiral -2,2,222,1,9,0,0,AT-7 Saxhorn -2,2,222,1,10,0,0,AT-8 Songster -2,2,222,1,11,0,0,AT-9 -2,2,222,1,12,0,0,AT -10 Stabber -2,2,222,1,13,0,0,AT-11 Sniper -2,2,222,2,0,0,0,Ballistic -2,2,222,2,1,0,0,23 mm -2,2,222,2,2,0,0,30 mm -2,2,222,2,3,0,0,64 mm -2,2,222,2,3,1,0, (w/ RPG-18 light anti-armor weapon) -2,2,222,2,4,0,0,73 mm -2,2,222,2,5,0,0,76 mm -2,2,222,2,6,0,0,80 mm -2,2,222,2,7,0,0,82 mm -2,2,222,2,7,1,0,BK-881 HEAT -2,2,222,2,7,2,0,BK-881M HEAT -2,2,222,2,8,0,0,85 mm -2,2,222,2,9,0,0,107 mm -2,2,222,2,10,0,0,115 mm -2,2,222,2,11,0,0,125 mm -2,2,222,2,12,0,0,BRAB-200DS HE AP -2,2,222,2,13,0,0,BRAB-220 HE AP -2,2,222,2,14,0,0,BRAB-500 HE AP -2,2,222,2,15,0,0,BRAB-1000 HE AP -2,2,222,2,16,0,0,PTAB-2.5 bomblet HE anti-armor -2,2,222,2,17,0,0,122mm HEAT -2,2,222,2,18,0,0,120mm HEAT-FS -2,3,222,1,0,0,0,Guided -2,3,222,1,1,0,0,SH-01 Galosh (UR-96) -2,3,222,1,1,2,0,SH-08 -2,3,222,1,1,3,0,SH-11 Gorgon -2,3,222,2,0,0,0,Ballistic -2,3,222,2,1,0,0,30 mm -2,3,222,2,1,1,0,UOF-84 HE-I -2,3,222,2,1,2,0,UOR-84 HE-T -2,3,222,2,2,0,0,250 mm -2,3,222,2,2,1,0,ASW rocket launcher -2,3,222,2,3,0,0,300 mm -2,3,222,2,3,1,0,ASW Rocket Launcher -2,4,222,0,1,0,0,Guided -2,4,222,0,1,1,0,AS-4 Kitchen -2,4,222,0,1,2,0,AS-9 Kyle -2,4,222,0,1,3,0,AS-12 Kegler -2,4,222,0,1,4,0,AS-11 Kilter -2,4,222,0,1,5,0,KH-31P/X-31 or possibly AS-17 -2,5,222,1,0,0,0,Guided -2,5,222,1,1,0,0,Antisatellite System -2,6,222,1,0,0,0,Guided -2,6,222,1,2,0,0,AS-4 Kitchen -2,6,222,1,4,0,0,AS-6 Kingfish -2,6,222,1,5,0,0,AS-13 Kingbolt -2,6,222,1,6,0,0,AS-14 Kedge -2,6,222,1,7,0,0,AS-15 Kent -2,6,222,1,7,1,0,AS-15A w/ Tu-95 Bear-H -2,6,222,1,7,2,0,S-15B w/ Tu-160 Blackjack -2,6,222,1,8,0,0,SS-N-2 Styx -2,6,222,1,8,1,0,SS-N-2a -2,6,222,1,8,2,0,SS-N-2b -2,6,222,1,8,3,0,SS-N-2c -2,6,222,1,8,4,0,SS-N-2d -2,6,222,1,9,0,0,SS-N-7 Starbright -2,6,222,1,10,0,0,SS-N-9 Siren -2,6,222,1,11,0,0,SS-N-12 Sandbox -2,6,222,1,12,0,0,SS-N-19 Shipwreck -2,6,222,1,13,0,0,SS-N-22 Sunburn -2,6,222,1,14,0,0,SS-N-3 Shaddock -2,6,222,1,14,1,0,SS-N-3a -2,6,222,1,14,2,0,SS-N-3b -2,6,222,1,14,3,0,SS-N-3c -2,6,222,1,15,0,0,SSC-2b Samlet Cruise -2,6,222,1,16,0,0,SSC-1b Sepal -2,6,222,1,17,0,0,SSC-3 Styx -2,6,222,1,18,0,0,533-mm torpedo -2,6,222,1,19,0,0,406-mm torpedo -2,6,222,1,20,0,0,SA-N-11 (SA-19 ?) -2,6,222,1,21,0,0,SS-N-14 Silex -2,6,222,1,22,0,0,SS-N-21 Sampson -2,6,222,1,23,0,0,SS-N-25 (Kh 35) -2,6,222,2,0,0,0,Ballistic -2,6,222,2,1,0,0,12.7 mm -2,6,222,2,2,0,0,14.5 mm -2,6,222,2,3,0,0,23 mm -2,6,222,2,4,0,0,25 mm -2,6,222,2,5,0,0,30 mm -2,6,222,2,5,1,0,BR-83 AP-T -2,6,222,2,5,2,0,OF-83D HE -2,6,222,2,6,0,0,57 mm -2,6,222,2,7,0,0,76 mm -2,6,222,2,8,0,0,85 mm -2,6,222,2,9,0,0,100 mm -2,6,222,2,10,0,0,130 mm -2,6,222,2,10,1,0,SM-4-1 -2,7,222,1,0,0,0,Guided -2,7,222,1,1,0,0,FRAS-1 (aka SUW-N-1) -2,7,222,1,2,0,0,SS-N-14 Silex -2,7,222,1,3,0,0,SS-N-15 Starfish -2,7,222,1,4,0,0,SS-N-16 Stallion -2,7,222,1,5,0,0,533-mm torpedo -2,7,222,1,5,1,0,Type 3 -2,7,222,1,5,2,0,Type 3 nuclear -2,7,222,1,5,3,0,new passive wake-homing turbine -2,7,222,1,5,4,0,new electric -2,7,222,1,6,0,0,406-mm Type 40 torpedo -2,7,222,1,7,0,0,650-mm submarine-launched torpedo -2,7,222,1,8,0,0,RBU 1000 -2,7,222,1,9,0,0,RBU 1200 -2,7,222,1,10,0,0,RBU 2500 -2,7,222,1,11,0,0,RBU 6000 -2,7,222,1,12,0,0,RBU 12000 -2,7,222,1,13,0,0,Type 45 (light, air-launched) -2,7,222,1,14,0,0,Type E53 (light, air-launched) -2,7,222,2,0,0,0,Ballistic -2,7,222,2,1,0,0,FRAS-1/SUW-N-1 (VETER) -2,8,222,2,0,0,0,Ballistic -2,8,222,2,1,0,0,5.45 mm -2,8,222,2,1,1,0,5.45-mm Soviet pistol (aka 5.45 x 18 mm) -2,8,222,2,1,2,0,5.45-mm Soviet rifle (aka 5.45 x 39.5 mm and 5.45-mm M74) -2,8,222,2,2,0,0,7.62 mm -2,8,222,2,2,1,0,7.62 x 25-mm Soviet pistol (aka 7.62-mm Tokarev) -2,8,222,2,2,2,0,7.62 x 38R Nagant Revolver (aka 7.62-mm Soviet revolver and 7.62-mm Nagant gas-seal) -2,8,222,2,2,3,0,7.62-mm Soviet M1943 (aka 7.62 x 39 mm, 7.62-mm Kalashnikov, and 7.62-mm obr 43g) -2,8,222,2,2,4,0,7.62-mm Mosin-Nagant (aka 7.62 x 54R, 7.62-mm Soviet Rimmed, and 7.62-mm obr 1891) -2,8,222,2,3,0,0,9 mm -2,8,222,2,3,1,0,9-mm Makarov (aka 9 x 18 mm Soviet, 9-mm Stechkin, and 9-mm Type 59) -2,8,222,2,4,0,0,12.7 mm -2,8,222,2,4,1,0,12.7-mm Soviet machine gun (aka 12.7 x 107 mm) -2,8,222,2,5,0,0,14.5 mm -2,8,222,2,5,1,0,14.5-mm Soviet machine gun (aka 14.5 x 114 mm) -2,8,222,2,6,0,0,57 mm -2,8,222,2,7,0,0,82 mm -2,8,222,2,7,1,0,HE fragmentation (O-881A) -2,8,222,2,8,0,0,107-mm M-38 mortar -2,8,222,2,9,0,0,AO-1 SCH bomblet HE submunition -2,8,222,2,10,0,0,AO-2.5 bomblet -2,8,222,2,11,0,0,AO-2.5 HE submunition -2,8,222,2,12,0,0,AO-2.5-2 HE submunition -2,8,222,2,13,0,0,AO-8M2 HE -2,8,222,2,14,0,0,AO-10 HE -2,8,222,2,15,0,0,AO-10-6.5 HE -2,8,222,2,16,0,0,AO-20 HE -2,8,222,2,17,0,0,AO-20M3 HE -2,8,222,2,18,0,0,AO-25M1 HE -2,8,222,2,19,0,0,AO-25M2 HE -2,8,222,2,20,0,0,AO-100 HE -2,8,222,2,21,0,0,FAB-50 HE -2,8,222,2,22,0,0,FAB-70 HE -2,8,222,2,23,0,0,FAB-100 M43 HE -2,8,222,2,24,0,0,FAB-100 M62 HE -2,8,222,2,25,0,0,FAB-250 HE -2,8,222,2,26,0,0,FAB-250 M43 HE -2,8,222,2,27,0,0,FAB-250 M46 HE -2,8,222,2,28,0,0,FAB-250 M54 HE -2,8,222,2,29,0,0,FAB-250 M62 HE -2,8,222,2,30,0,0,FAB-500 HE -2,8,222,2,31,0,0,FAB-500 M46 HE -2,8,222,2,32,0,0,FAB-500 M54 HE -2,8,222,2,33,0,0,FAB-500 M62 HE -2,8,222,2,34,0,0,FAB-1000 M62 HE -2,8,222,2,35,0,0,FAB-1500 M46 HE -2,8,222,2,36,0,0,FAB-1500 M54 HE -2,8,222,2,37,0,0,FAB-3000 M46 HE -2,8,222,2,38,0,0,KhAB 100-kg (80) mustard gas/lewisite HL -2,8,222,2,39,0,0,KhAB 100-kg (100) mustard gas/lewisite HL -2,8,222,2,40,0,0,KhAB 250-kg Sarin (GB) -2,8,222,2,41,0,0,M-1 bomblet (35-40 g of liquid explosive) -2,8,222,2,42,0,0,Mustard gas/lewisite HL (from 500- and 1500-kg spray tanks) -2,8,222,2,43,0,0,OFAB-100M HE -2,8,222,2,44,0,0,OFAB-100MH HE -2,8,222,2,45,0,0,OFAB-100NV HE -2,8,222,2,46,0,0,OFAB-250M HE -2,8,222,2,47,0,0,OKT-11 bomblet (inciendary or chemical) -2,8,222,2,48,0,0,ROSAB bomblet HE -2,8,222,2,49,0,0,Soman (GD) (from 250-kg spray tank) -2,8,222,2,50,0,0,ZAB-1E incendiary (1.5 kg) -2,8,222,2,51,0,0,ZAB 500 T Shch incendiary (500 kg) -2,8,222,3,0,0,0,Fixed -2,8,222,3,1,0,0,Wooden TMD-B AT mine -2,8,222,3,5,0,0,TM-46 AT-blast mine -2,8,222,3,6,0,0,TMN-46 AT-blast mine -2,8,222,3,7,0,0,TM-57 AT mine -2,8,222,3,8,0,0,TM-62M AT mine (metal casing) -2,8,222,3,9,0,0,TMK-2 AT shaped-charge mine -2,8,222,3,10,0,0,Area-type POMZ-2 AP-fragmentation mine -2,8,222,3,12,0,0,MON series AP mine (directional) (MON-50/MON-90/MON-100/MON-200) -2,8,222,3,13,0,0,PMN AP-blast mine -2,8,222,3,15,0,0,AMD-500 -2,8,222,3,16,0,0,AMD-1000 -2,8,222,3,17,0,0,AMG-1 -2,8,222,3,18,0,0,BDT mine-clearance charge -2,8,222,3,19,0,0,ITB-2 mine-clearance charge -2,8,222,3,20,0,0,KMD-500 -2,8,222,3,21,0,0,KMD-1000 -2,8,222,3,22,0,0,M-08 -2,8,222,3,23,0,0,M-12 -2,8,222,3,24,0,0,M-16 -2,8,222,3,25,0,0,M-AG -2,8,222,3,26,0,0,M-KB -2,8,222,3,27,0,0,M-KB-3 -2,8,222,3,28,0,0,Mirab -2,8,222,3,29,0,0,MYaM -2,8,222,3,30,0,0,MYaRM -2,8,222,3,31,0,0,MZ-26 -2,8,222,3,32,0,0,OZM bounding AP mine -2,8,222,3,33,0,0,OZM-3 bounding AP mine -2,8,222,3,34,0,0,OZM-4 bounding AP mine -2,8,222,3,35,0,0,OZM-72 bounding AP mine -2,8,222,3,36,0,0,OZM-160 bounding AP mine -2,8,222,3,37,0,0,PFM-1 or PMZ AP mine/bomblet -2,8,222,3,38,0,0,PGMDM scatterable Anti-tank mine -2,8,222,3,39,0,0,PLT -2,8,222,3,40,0,0,PLT-3 -2,8,222,3,41,0,0,PMD-6 wooden AP mine -2,8,222,3,42,0,0,PMD-6M wooden AP mine -2,8,222,3,43,0,0,PMD-7 wooden AP mine -2,8,222,3,44,0,0,PMD-7ts wooden AP mine -2,8,222,3,45,0,0,PMD-57 wooden AP mine -2,8,222,3,46,0,0,PMN AP mine -2,8,222,3,47,0,0,PMN-2 AP mine -2,8,222,3,48,0,0,PMN-6 -2,8,222,3,49,0,0,POMZ-2 AP stake mine -2,8,222,3,50,0,0,POMZ-2M AP stake mine -2,8,222,3,51,0,0,SPZ-2 mine-clearance charge -2,8,222,3,52,0,0,SPZ-4 mine-clearance charge -2,8,222,3,53,0,0,TM-62 AT mine P2 (plastic casing) -2,8,222,3,54,0,0,TM-62B waterproof cardboard casing -2,8,222,3,55,0,0,TM-62D rectangular wooden case -2,8,222,3,56,0,0,TM-62 P3 plastic casing -2,8,222,3,57,0,0,TMD-B Anti-tank mine -2,8,222,3,58,0,0,TMD-44 Anti-tank mine -2,8,222,3,59,0,0,UEP -2,8,222,3,60,0,0,UZ-1 Bangalore torpedo -2,8,222,3,61,0,0,UZ-2 Bangalore torpedo -2,9,222,1,0,0,0,Guided -2,9,222,1,1,0,0,AS-3 Kangaroo -2,9,222,1,2,0,0,AS-4 Kitchen -2,9,222,1,4,0,0,AS-7 Kerry -2,9,222,1,5,0,0,AS-10 Karen -2,9,222,1,5,1,0,AS-10 (radio) -2,9,222,1,5,2,0,AS-10 (laser) -2,9,222,1,7,0,0,AS-14 Kedge -2,9,222,1,8,0,0,AS-15 Kent -2,9,222,1,8,1,0,AS-15A (Tu-95 Bear-H) -2,9,222,1,8,2,0,AS-15B (Tu-160 Blackjack) -2,9,222,1,9,0,0,AS-16 Kickback -2,9,222,1,14,0,0,SS-23 Spider -2,9,222,1,15,0,0,KAB-500N laser-guided HE -2,9,222,1,16,0,0,KAB-500T TV-guided HE -2,9,222,2,0,0,0,Ballistic -2,9,222,2,1,0,0,12.7 mm -2,9,222,2,2,0,0,14.5 mm -2,9,222,2,3,0,0,23 mm -2,9,222,2,4,0,0,25 mm -2,9,222,2,4,1,0,25 mm Soviet 2-M3 -2,9,222,2,4,2,0,25 mm Soviet 2-M8 -2,9,222,2,5,0,0,30 mm -2,9,222,2,6,0,0,37 mm -2,9,222,2,7,0,0,40-mm rocket -2,9,222,2,8,0,0,45 mm -2,9,222,2,9,0,0,57 mm -2,9,222,2,10,0,0,82 mm (mortar) -2,9,222,2,10,1,0,82-mm model 0-832 DU HE fragmentation bomb -2,9,222,2,11,0,0,100 mm -2,9,222,2,12,0,0,107 mm -2,9,222,2,13,0,0,120 mm (mortar) -2,9,222,2,13,1,0,HE bomb F-843 -2,9,222,2,13,2,0,HE bomb OF-843 -2,9,222,2,13,3,0,HE bomb OF-843A -2,9,222,2,14,0,0,122 mm -2,9,222,2,15,0,0,122-mm rocket -2,9,222,2,15,1,0,M-21-OF (9M22M) -2,9,222,2,15,2,0,M-21-OF (9M22U) -2,9,222,2,16,0,0,125 mm -2,9,222,2,17,0,0,130 mm -2,9,222,2,18,0,0,139.7-mm rocket -2,9,222,2,18,1,0,M-14-OF -2,9,222,2,19,0,0,152 mm -2,9,222,2,20,0,0,160 mm (mortar) -2,9,222,2,20,1,0,HE BOMB F-853U -2,9,222,2,20,2,0,HE BOMB F-853A -2,9,222,2,20,3,0,HE Bomb F-852 -2,9,222,2,21,0,0,180 mm -2,9,222,2,22,0,0,203-mm Howitzer -2,9,222,2,23,0,0,220-mm rocket -2,9,222,2,24,0,0,240 mm (mortar) -2,9,222,2,24,1,0,F-864 HE bomb -2,9,222,2,25,0,0,240-mm rocket -2,9,222,2,26,0,0,250-mm rocket -2,9,222,2,27,0,0,400-mm rocket -2,9,222,2,28,0,0,550-mm rocket -2,9,222,2,29,0,0,600-mm rocket -2,9,222,2,30,0,0,850-mm missile -2,9,222,2,31,0,0,1100-mm missile -2,9,222,2,32,0,0,250 SHN HE (parachute-retarded) -2,9,222,2,33,0,0,500 SH HE (parachute-retarded) -2,9,222,2,34,0,0,BETAB-150DS HE concrete-piercing -2,9,222,2,35,0,0,OF-841A HE fragmentation bomb -2,9,222,2,36,0,0,81mm smoke grenade -2,10,222,1,0,0,0,Guided -2,10,222,1,1,0,0,SS-N-5 Sark -2,10,222,1,2,0,0,SS-N-6 Serb -2,10,222,1,2,1,0,SS-N-6 -2,10,222,1,2,2,0,SS-N-6 Mod 1 -2,10,222,1,2,3,0,SS-N-6 Mod 2 -2,10,222,1,3,0,0,SS-N-8 -2,10,222,1,4,0,0,SS-N-17 Snipe -2,10,222,1,5,0,0,SS-N-18 Stingray -2,10,222,1,6,0,0,SS-N-20 Sturgeon -2,10,222,1,7,0,0,SS-N-23 Skiff -2,10,222,1,8,0,0,SS-N-21 Sampson -2,10,222,1,11,0,0,AS-15 Kent -2,10,222,1,11,1,0,AS-15A (Tu-95 Bear-H) -2,10,222,1,11,2,0,AS-15B (Tu-160 Blackjack) -2,10,222,1,14,0,0,SS-11 -2,10,222,1,15,0,0,SS-13 -2,10,222,1,16,0,0,SS-16 Sinner -2,10,222,1,17,0,0,SS-17 -2,10,222,1,18,0,0,SS-18 -2,10,222,1,19,0,0,SS-19 -2,10,222,1,20,0,0,SS-20 Saber -2,10,222,1,21,0,0,SS-24 -2,10,222,1,22,0,0,SS-25 -2,11,222,2,0,0,0,Ballistic -2,11,222,2,1,0,0,Frog-7 -2,1,224,1,0,0,0,Guided -2,1,224,1,1,0,0,Bloodhound Mk2 -2,1,224,1,2,0,0,Rapier -2,1,224,1,3,0,0,Rapier 2000 -2,1,224,1,4,0,0,Seacat/Tigercat -2,1,224,1,5,0,0,Blowpipe -2,1,224,1,6,0,0,Javelin -2,1,224,1,7,0,0,Star Streak -2,1,224,1,8,0,0,Sea Dart -2,1,224,1,8,1,0,GWS 30 -2,1,224,1,9,0,0,Sea Wolf -2,1,224,1,9,1,0,GWS 25 -2,1,224,1,9,2,0,GWS 26 Mod 1 -2,1,224,1,10,0,0,Sky Flash -2,2,224,1,0,0,0,Guided -2,2,224,1,1,0,0,Milan missile -2,2,224,1,2,0,0,Swingfire missile -2,2,224,1,3,0,0,Merlin -2,2,224,1,4,0,0,FI TOW -2,2,224,1,5,0,0,Trigat -2,2,224,1,6,0,0,LAW 80 -2,2,224,1,7,0,0,SWAARM -2,2,224,1,8,0,0,Wolverine -2,3,224,1,0,0,0,Guided -2,3,224,1,1,0,0,Decoys -2,3,224,1,1,1,0,Towed radar decoy -2,4,224,1,0,0,0,Guided -2,4,224,1,1,0,0,ALARM -2,6,224,1,0,0,0,Guided -2,6,224,1,1,0,0,Vosper Thorny Croft Excalibur Coast Defense Missile System -2,6,224,1,2,0,0,Sea Eagle -2,6,224,1,3,0,0,Sea Eagle SL -2,6,224,1,4,0,0,Sea Skua -2,6,224,1,5,0,0,Martel -2,6,224,1,6,0,0,Spear Fish torpedo -2,7,224,1,0,0,0,Guided -2,7,224,1,1,0,0,Tigerfish torpedo -2,7,224,1,2,0,0,Spear Fish torpedo -2,7,224,1,3,0,0,Sting Ray torpedo -2,7,224,1,4,0,0,Mk 24 torpedo -2,8,224,2,0,0,0,Ballistic -2,8,224,2,1,0,0,7.62 mm -2,8,224,2,2,0,0,9.0 mm -2,9,224,1,0,0,0,Guided -2,9,224,1,1,0,0,Lance -2,9,224,1,2,0,0,Ballistic -2,9,224,1,2,1,0,51 mm -2,9,224,1,2,2,0,89 mm -2,9,224,1,2,3,0,105 mm -2,9,224,1,2,4,0,155 mm -2,9,224,1,2,5,0,175 mm -2,10,224,1,0,0,0,Guided -2,10,224,1,1,0,0,A-3TK -2,10,224,1,2,0,0,Trident II -2,1,71,1,0,0,0,Guided -2,1,71,1,1,0,0,Aster 15 -2,1,71,1,2,0,0,Aster 30 -2,1,71,1,3,0,0,Crotale -2,1,71,1,4,0,0,Roland -2,1,71,1,5,0,0,Mistral -2,1,71,1,6,0,0,Masurca -2,1,71,1,7,0,0,Mica Missile -2,1,71,1,7,1,0,Radar -2,1,71,1,7,2,0,IR -2,1,71,1,8,0,0, -2,1,71,1,9,0,0,R-550 Magic -2,1,71,1,9,1,0,R-550 Magic 1 -2,1,71,1,9,2,0,R-550 Magic 2 -2,1,71,1,10,0,0,Super 530 -2,1,71,1,10,1,0,Super 530F -2,1,71,1,10,2,0,Super 530D -2,1,71,2,0,0,0,Ballistic -2,1,71,2,1,0,0,20 mm -2,1,71,2,2,0,0,25 mm -2,1,71,2,3,0,0,30 mm -2,1,71,2,9,0,0,90 mm -2,1,71,2,30,0,0,.50 Cal. -2,2,71,0,1,0,0,SS-11/AS-11 -2,2,71,0,2,0,0,Eryx missile -2,2,71,0,3,0,0,HOT missile -2,2,71,0,4,0,0,Milan missile -2,2,71,0,5,0,0,ACL-STRIM -2,2,71,0,6,0,0,Entac -2,2,71,0,7,0,0,AS-15 -2,2,71,0,7,1,0,AS-15 TT -2,2,71,0,8,0,0,BAT 120 anti-armor bomb -2,2,71,2,0,0,0,Ballistic -2,2,71,2,1,0,0,.50 cal. -2,2,71,2,2,0,0,8 in. -2,2,71,2,3,0,0,20 mm -2,2,71,2,4,0,0,25 mm -2,2,71,2,5,0,0,30 mm -2,2,71,2,6,0,0,60 mm -2,2,71,2,7,0,0,68 mm -2,2,71,2,8,0,0,74 mm -2,2,71,2,9,0,0,90 mm -2,2,71,2,10,0,0,105 mm -2,2,71,2,11,0,0,106 mm -2,2,71,2,12,0,0,120 mm -2,2,71,2,13,0,0,155 mm -2,2,71,2,14,0,0,175 mm -2,3,71,1,0,0,0,Guided -2,3,71,1,1,0,0,Decoys -2,4,71,1,0,0,0,Guided -2,4,71,1,1,0,0,Armat -2,6,71,1,0,0,0,Guided -2,6,71,1,1,0,0,Exocet -2,6,71,1,1,1,0,MM-38 -2,6,71,1,1,2,0,AM-39 -2,6,71,1,2,0,0,AS-11 -2,6,71,1,3,0,0,SS-12M -2,6,71,1,4,0,0,AS-15 -2,6,71,1,5,0,0,AS-30 -2,6,71,1,6,0,0,AS-37 Martel -2,6,71,1,7,0,0,ASMP -2,6,71,1,8,0,0,Otomat -2,6,71,1,9,0,0,E-14 torpedo -2,6,71,1,10,0,0,E-15 torpedo -2,6,71,1,11,0,0,F-17 torpedo -2,6,71,1,12,0,0,L-5 torpedo -2,6,71,1,13,0,0,Z-16 torpedo -2,6,71,2,0,0,0,Ballistic -2,6,71,2,1,0,0,20 mm -2,6,71,2,2,0,0,25 mm -2,6,71,2,3,0,0,30 mm -2,7,71,1,0,0,0,Guided -2,7,71,1,1,0,0,Malafon -2,7,71,1,2,0,0,E-14 torpedo -2,7,71,1,3,0,0,E-15 torpedo -2,7,71,1,4,0,0,F-17 torpedo -2,7,71,1,5,0,0,L3 torpedo -2,7,71,1,6,0,0,L4 torpedo -2,7,71,1,7,0,0,L5 torpedo -2,7,71,1,8,0,0,Murene torpedo -2,8,71,2,0,0,0,Ballistic -2,8,71,2,1,0,0,.22 cal. Long Rifle -2,8,71,2,2,0,0,.30-06 -2,8,71,2,3,0,0,.380 cal. -2,8,71,2,4,0,0,.38 -2,8,71,2,5,0,0,.45 cal. -2,8,71,2,6,0,0,.50 cal. -2,8,71,2,7,0,0,5.56 mm -2,8,71,2,8,0,0,6.35 mm -2,8,71,2,9,0,0,7.5 mm -2,8,71,2,10,0,0,7.62 mm -2,8,71,2,11,0,0,7.65 mm -2,8,71,2,12,0,0,8 mm -2,8,71,2,13,0,0,9 mm -2,8,71,2,14,0,0,20 mm -2,8,71,2,15,0,0,25 mm -2,8,71,2,16,0,0,30 mm -2,8,71,2,17,0,0,60 mm -2,8,71,2,18,0,0,68 mm -2,8,71,2,19,0,0,81 mm -2,8,71,2,20,0,0,90 mm -2,8,71,2,21,0,0,120 mm -2,9,71,1,0,0,0,Guided -2,9,71,1,1,0,0,Hades missile -2,9,71,1,2,0,0,Pluton missile -2,9,71,1,3,0,0,AS 30L (laser guided) -2,9,71,1,4,0,0,ASMP -2,9,71,1,5,0,0,Excalibur MP 22 bomb -2,9,71,1,6,0,0,Matra laser-guided bomb (LGB) -2,9,71,2,0,0,0,Ballistic -2,9,71,2,1,0,0,.50 Cal. -2,9,71,2,2,0,0,20 mm -2,9,71,2,3,0,0,25 mm -2,9,71,2,4,0,0,30 mm -2,9,71,2,5,0,0,58 mm -2,9,71,2,6,0,0,74 mm -2,9,71,2,7,0,0,90 mm -2,9,71,2,8,0,0,105 mm -2,9,71,2,9,0,0,106 mm -2,9,71,2,10,0,0,155 mm -2,9,71,2,11,0,0,175 mm -2,9,71,2,12,0,0,8 in. -2,9,71,2,50,0,0,BAP 100-mm airfield attack bomb -2,9,71,2,51,0,0,BLG 66 Belouga bomb -2,9,71,2,52,0,0,BM 400 bomb -2,9,71,2,53,0,0,CASCAD Mk 1 -2,9,71,2,54,0,0,CASCAD Mk 2 -2,9,71,2,55,0,0,CH-TABO Pod -2,9,71,2,56,0,0,Durandal penetration bomb -2,9,71,2,57,0,0,LU 250 EG-FT bomb -2,9,71,2,58,0,0,SAMP BL 61 125-kg fragmentation bomb -2,9,71,2,59,0,0,SAMP BL 70 400-kg fragmentation bomb -2,9,71,2,60,0,0,SAMP BL 99 450-kg bomb -2,9,71,2,61,0,0,SAMP BL EU4 1000-kg bomb -2,9,71,2,62,0,0,T 15 SAMP fragmentation bomb -2,9,71,2,63,0,0,BL 8 SAMP fragmentation bomb -2,9,71,2,64,0,0,BL 9 SAMP fragmentation bomb -2,9,71,2,65,0,0,BL 18 SAMP fragmentation bomb -2,9,71,2,66,0,0,SAMP GP bomb family -2,9,71,2,67,0,0,SAMP 81 AF 125-kg bomb -2,9,71,2,68,0,0,TBA retarded 125-kg close-support bomb -2,10,71,1,0,0,0,Guided -2,10,71,1,1,0,0,SSBS Type S-30D/TN-61 -2,10,71,1,2,0,0,SSBS Type S-4(SX) -2,10,71,1,3,0,0,SLBM M-20 -2,10,71,1,4,0,0,SLBM M-4 -2,1,78,1,0,0,0,Guided -2,1,78,1,1,0,0,Roland -2,2,78,1,0,0,0,Guided -2,2,78,1,1,0,0,Milan missile -2,2,78,1,2,0,0,HOT missile -2,2,78,1,3,0,0,TOW missile -2,2,78,1,4,0,0,Pars 3 missile -2,2,78,2,0,0,0,Ballistic -2,2,78,2,1,0,0,110-mm rocket -2,2,78,3,0,0,0,Fixed -2,2,78,3,1,0,0,Anti-tank mine -2,2,78,3,1,1,0,MIFF -2,2,78,3,1,2,0,KB44 -2,8,78,2,0,0,0,Ballistic -2,8,78,2,1,0,0,5.56 mm -2,8,78,2,2,0,0,7.62 mm -2,8,78,2,3,0,0,9 mm -2,8,78,3,0,0,0,Fixed -2,8,78,3,1,0,0,Mine -2,9,78,1,0,0,0,Guided -2,9,78,1,1,0,0,Parachute signal rocket, white -2,9,78,2,0,0,0,Ballistic -2,9,78,2,1,0,0,20 mm -2,9,78,2,2,0,0,35 mm -2,9,78,2,3,0,0,73 mm -2,9,78,2,4,0,0,105 mm -2,9,78,2,5,0,0,120 mm -2,11,102,2,0,0,0,Ballistic -2,11,102,2,1,0,0, Al Abbas -2,11,102,2,2,0,0, Al Hussein -2,11,102,2,3,0,0, Scud-B (SS-1C) -2,11,102,2,4,0,0, Scud-C (SS-1D) -2,11,105,2,0,0,0,Ballistic -2,11,105,2,1,0,0,Jericho2 -2,11,45,2,0,0,0,Ballistic -2,11,45,2,1,0,0,M-9 -2,11,119,2,0,0,0,Ballistic -2,11,119,2,1,0,0,Scud-B (SS-1C) -2,11,119,2,2,0,0,Scud-C (SS-1D) -3,0,0,0,0,0,0,Life Form -3,1,0,0,0,0,0,Land -3,1,0,0,1,0,0,Dismounted Infantry (with) -3,1,0,0,2,0,0,Dismounted Infantry (non-visible) -3,1,0,0,2,101,0,Fire Team -3,1,0,0,2,102,0,Squad -3,1,0,0,2,103,0,Platoon -3,1,0,0,2,104,0,Company -3,1,0,0,2,105,0,Battalion -3,1,0,0,2,106,0,Regiment -3,1,0,0,2,107,0,Division -3,1,0,0,2,108,0,Corps -3,1,0,0,2,109,0,Army -3,2,0,0,0,0,0,Air -3,2,0,1,0,0,0,Parachutist (with) -3,2,0,1,0,101,0,Fire Team -3,2,0,1,0,102,0,Squad -3,2,0,1,0,103,0,Platoon -3,2,0,1,0,104,0,Company -3,2,0,1,0,105,0,Battalion -3,2,0,1,0,106,0,Regiment -3,2,0,1,0,107,0,Division -3,2,0,1,0,108,0,Corps -3,2,0,1,0,109,0,Army -3,2,0,2,0,0,0,A bird -3,2,0,3,0,0,0,Flock of birds -3,3,0,0,0,0,0,Surface -3,3,0,1,0,0,0,Swimmer (with) -3,3,0,1,0,101,0,Fire Team -3,3,0,1,0,102,0,Squad -3,3,0,1,0,103,0,Platoon -3,3,0,1,0,104,0,Company -3,3,0,1,0,105,0,Battalion -3,3,0,1,0,106,0,Regiment -3,3,0,1,0,107,0,Division -3,3,0,1,0,108,0,Corps -3,3,0,1,0,109,0,Army -3,3,0,2,0,0,0,Occupied life raft -3,3,0,2,0,101,0,Fire Team -3,3,0,2,0,102,0,Squad -3,3,0,2,0,103,0,Platoon -3,3,0,2,0,104,0,Company -3,3,0,2,0,105,0,Battalion -3,3,0,2,0,106,0,Regiment -3,3,0,2,0,107,0,Division -3,3,0,2,0,108,0,Corps -3,3,0,2,0,109,0,Army -3,4,0,0,0,0,0,Subsurface -3,4,0,1,0,0,0,Diver (with) -3,4,0,2,0,0,0,School of Fish -3,4,0,3,0,0,0,School of Shrimp -3,4,0,4,0,0,0,Whale -3,5,0,0,0,0,0,Space -3,5,0,1,0,0,0,Astronaut (with) -4,0,0,0,0,0,0,Environmental -4,1,0,0,0,0,0,Land -4,2,0,0,0,0,0,Air -4,2,0,1,0,0,0,Smoke -4,2,0,2,0,0,0,Fog -4,2,0,3,0,0,0,Cloud -4,2,0,4,0,0,0,Cloud With Rain Falling -4,2,0,5,0,0,0,Cloud With Snow Falling -4,2,0,6,0,0,0,Haze -4,3,0,0,0,0,0,Surface -4,3,0,1,0,0,0,Sea State -4,3,0,2,0,0,0,Oil Slick -4,3,0,3,0,0,0,Ice -4,3,0,4,0,0,0,Debris -4,4,0,0,0,0,0,Subsurface -4,4,0,1,0,0,0,Sound Velocity Profile -4,4,0,2,0,0,0,Ice Berg -4,4,0,3,0,0,0,Current Profile -4,4,0,4,0,0,0,Biologics -4,4,0,4,0,1,0,Bioluminescence -4,4,0,5,0,0,0,Transmissivity profile -4,5,0,0,0,0,0,Space -5,0,0,0,0,0,0,Cultural Feature -5,1,0,0,0,0,0,Land -5,1,0,1,0,0,0,Bridge -5,1,0,1,1,0,0,Concrete, two-lane -5,1,0,1,2,0,0,Concrete, four-lane -5,1,0,1,3,0,0,Truss, two-lane -5,1,0,1,4,0,0,Truss, four-lane -5,1,0,1,5,0,0,Suspension, two-lane -5,1,0,1,6,0,0,Suspension, four-lane -5,1,0,2,0,0,0,Building -5,1,0,2,1,0,0,One-story -5,1,0,2,2,0,0,Two-story -5,1,0,2,3,0,0,Three-story -5,1,0,2,4,0,0,Four-story -5,1,0,3,0,0,0,Tracks -5,1,0,3,1,0,0,Tank -5,1,0,4,0,0,0,Crater -5,1,0,5,0,0,0,Obstacle -5,1,0,5,1,0,0,Ditch -5,1,0,5,2,0,0,Tank ditch, 100x4 M -5,1,0,5,3,0,0,Tank ditch, 200x4 M -5,1,0,5,4,0,0,Tank ditch, 300x4 M -5,1,0,5,5,0,0,Abatis, 8-tree -5,1,0,5,6,0,0,Concertina fence, 3-roll -5,1,0,5,7,0,0,Log crib, rectangular -5,1,0,5,8,0,0,Ammo prestock -5,1,0,5,9,0,0,Fuel prestock -5,1,0,5,10,0,0,Minefield, hasty, 0-300 M -5,1,0,5,11,0,0,Minefield, prepared, 0-500 M -5,1,0,5,12,0,0,Minefield, scatterable oval -5,1,0,5,13,0,0,Barbed wire -5,1,0,5,14,0,0,Dragon's teeth -5,1,0,6,0,0,0,Flags/markers -5,1,0,7,0,0,0,Prepared positions -5,1,0,7,1,0,0,Armored, hull defilade -5,1,0,7,2,0,0,Fighting, hull defilade -5,1,0,7,3,0,0,Mortar carrier, hull defilade -5,1,0,7,4,0,0,Tank, hull defilade -5,1,0,7,5,0,0,Infantry fighting -5,1,0,7,6,0,0,Machine gun -5,1,0,7,7,0,0,Covered machine gun bunker -5,1,0,7,8,0,0,Overhead covered infantry -5,2,0,0,0,0,0,Air -5,3,0,0,0,0,0,Surface -5,3,0,1,0,0,0,Oil derrick -5,3,0,2,0,0,0,Buoy -5,3,0,3,0,0,0,Pier -5,4,0,0,0,0,0,Subsurface -5,4,0,1,0,0,0,Oil derrick -5,4,0,2,0,0,0,Buoy -5,4,0,3,0,0,0,Sunken ship -5,5,0,0,0,0,0,Space -6,0,0,0,0,0,0,Supply -6,0,0,0,1,0,0,Fuels -6,0,0,0,1,1,0,Gasoline -6,0,0,0,1,2,0,Diesel Fuel -6,0,0,0,1,3,0,JP4 -6,0,0,0,1,4,0,Fuel Oil -6,0,0,0,2,0,0,Oils -6,0,0,0,3,0,0,Lubricants -6,0,0,0,4,0,0,Food -6,0,0,0,5,0,0,Spare Parts -6,0,0,0,6,0,0,Personnel -6,0,0,0,6,1,0,Dismounted Infantry -6,0,0,0,7,0,0,Equipment -6,0,0,0,7,1,0,Mine Plow -6,0,0,0,7,2,0,Mine Rollers -7,0,0,0,0,0,0,Radio diff -Nru acm-5.0/dis/data/Makefile.in acm-6.0+20200416/dis/data/Makefile.in --- acm-5.0/dis/data/Makefile.in 1998-05-12 03:43:01.000000000 +0000 +++ acm-6.0+20200416/dis/data/Makefile.in 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ -srcdir = @srcdir@ - VPATH = @srcdir@ - -ENTITIES_DB = dis-entities - SITES_DB = dis-sites - DB_LOADER = @DB_LOADER@ - PERL = perl - -all: databases - -databases: entities sites $(DB_LOADER) - $(PERL) $(srcdir)/$(DB_LOADER) - touch $@ - -depend: - -clean: - rm -rf *.bak *.o core *~ databases - rm -rf $(ENTITIES_DB).pag $(ENTITIES_DB).dir - rm -rf $(SITES_DB).pag $(SITES_DB).dir - -distclean: clean - rm -f Makefile *.pag *.dir categories - -TAGS tags test check: - -# DO NOT DELETE THIS LINE -- make depend depends on it. diff -Nru acm-5.0/dis/data/sites acm-6.0+20200416/dis/data/sites --- acm-5.0/dis/data/sites 1995-09-26 17:57:10.000000000 +0000 +++ acm-6.0+20200416/dis/data/sites 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ -# File: sites; derived from NPSNET sites.h -# Description: Registered Site IDs -# Revision: 1.2 - 02Jun93 -# -# Original Author: John Locke -# CS Department, Naval Postgraduate School -# Internet: jxxl@taurus.cs.nps.navy.mil -1,BBN Cambridge -2,Ft Knox T -3,Ft Knox D -4,AVTB -11,NRaD RESA -32,JDF Hunts -34,MDA -35,AFIT -36,NPS -47,WB Arlington -48,TACCSF -49,WP Labs -50,EXCAP -51.NTF -52,WB Remote -53,MM Orl diff -Nru acm-5.0/dis/data/test-entities acm-6.0+20200416/dis/data/test-entities --- acm-5.0/dis/data/test-entities 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/dis/data/test-entities 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ -#! /usr/local/bin/perl - -dbmopen (%entities, "./dis-entities", 0644); -@a = (1, 2, 225, 1, 3, 3, 0); -$key = pack ("CCSCCCC", - $a[0], $a[1], $a[2], $a[3], $a[4], $a[5], $a[6]); -print "We should find an F-16C: \"", $entities{$key}, "\"\n"; -@a = (1, 2, 225, 1, 3, 0, 0); -$key = pack ("CCSCCCC", - $a[0], $a[1], $a[2], $a[3], $a[4], $a[5], $a[6]); -print "We should find an F-16C: \"", $entities{$key}, "\"\n"; -@a = (1, 2, 225, 1, 0, 0, 0); -$key = pack ("CCSCCCC", - $a[0], $a[1], $a[2], $a[3], $a[4], $a[5], $a[6]); -print "We should find an F-16C: \"", $entities{$key}, "\"\n"; -dbmclose (%entities); diff -Nru acm-5.0/dis/dis/datum.h acm-6.0+20200416/dis/dis/datum.h --- acm-5.0/dis/dis/datum.h 1998-05-12 03:43:01.000000000 +0000 +++ acm-6.0+20200416/dis/dis/datum.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,296 +0,0 @@ -/* - * This header file was prepared from values listed in: - * - * "Enumeration and Bit-Encoded Values for use with - * IEEE 1278.1 - 1994, Distributed Interactive Simulation -- - * Application Protocols" - * - * Document Number: IST-CR-93-46 - * Date: March 1994 - * - * Copyright (C) 1995, Riley Rainey, riley@netcom.com - * - * DATUM IDENTIFIERS - * - * Problem: Which are fixed and which are variable ??? - */ - -typedef enum { - DatumIdentification = 10000, /* */ - DatumEntityType = 11000, /* */ - DatumConcatenated = 11100, /* */ - DatumKind = 11110, /* u_long */ - DatumDomain = 11120, /* u_long */ - DatumCountry = 11130, /* u_long */ - DatumCategory = 11140, /* u_long */ - DatumSubcategory = 11150, /* u_long */ - DatumSpecific = 11160, /* u_long */ - DatumExtra = 11170, /* u_long */ - DatumForceID = 11200, /* u_long */ - DatumDescription = 11300, /* */ - DatumAlternativeEntityType = 12000, /* */ - DatumAltKind = 12110, /* u_long */ - DatumAltDomain = 12120, /* u_long */ - DatumAltCountry = 12130, /* u_long */ - DatumAltCategory = 12140, /* u_long */ - DatumAltSubcategory = 12150, /* u_long */ - DatumAltSpecific = 12160, /* u_long */ - DatumAltExtra = 12170, /* u_long */ - DatumAltDescription = 12300, /* */ - DatumEntityMarking = 13000, /* */ - DatumEntityMarkingCharacters = 13100, /* char[10] */ - DatumCrewID = 13200, /* char[10] */ - DatumTaskOrganization = 14000, /* */ - DatumRegimentName = 14200, /* String */ - DatumBattalionName = 14300, /* String */ - DatumCompanyName = 14400, /* String */ - DatumPlatoonName = 14500, /* */ - DatumSquadName = 14520, /* */ - DatumTeamName = 14540, /* */ - DatumBumperNumber = 14600, /* */ - DatumVehicleNumber = 14700, /* */ - DatumUnitNumber = 14800, /* */ - DatumDISIdentity = 15000, /* */ - DatumDISSiteID = 15100, /* */ - DatumDISHostID = 15200, /* */ - DatumDISEntityID = 15300, /* */ - DatumLoads = 20000, /* */ - DatumCrewMembers = 21000, /* */ - DatumCrewMemberID = 21100, /* */ - DatumHealth = 21200, /* */ - DatumJobAssignment = 21300, /* String */ - DatumFuel = 23000, /* */ - DatumQuantity = 23100, /* Liters */ - DatumQuantityGallons = 23105, /* Gallons */ - DatumAmmunition = 24000, /* */ - Datum120mmHEATquantity = 24001, /* Rounds */ - Datum120mmSABOTquantity = 24002, /* Rounds */ - Datum127mmM8quantity = 24003, /* Rounds */ - Datum127mmM20quantity = 24004, /* Rounds */ - Datum762mmM62quantity = 24005, /* Rounds */ - DatumM250UKL8A1quantity = 24006, /* Grenades */ - DatumM250UKL8A3quantity = 24007, /* Grenades */ - Datum762mmM80quantity = 24008, /* Rounds */ - Datum127mmquantity = 24009, /* Rounds */ - Datum762mmquantity = 24010, /* Rounds */ - DatumMinesquantity = 24060, /* Mines */ - DatumAmmunitionType = 24100, /* */ - DatumAmmunitionKind = 24110, /* */ - DatumAmmunitionDomain = 24120, /* */ - DatumAmmunitionCountry = 24130, /* */ - DatumAmmunitionCategory = 24140, /* */ - DatumAmmunitionSubcategory = 24150, /* */ - DatumAmmunitionExtra = 24160, /* */ - DatumAmmunitionDescription = 24300, /* */ - DatumCargo = 25000, /* */ - DatumVehicleMass = 26000, /* u_long */ - DatumSupplyQuantity = 27000, /* */ - DatumArmament = 28000, /* Boolean */ - DatumStatus = 30000, /* */ - DatumPosition = 31000, /* */ - DatumMilGrid10 = 31100, /* */ - DatumGeocentricCoordinates = 31200, /* */ - DatumGeocentricCoordinatesX = 31210, /* u_long */ - DatumGeocentricCoordinatesY = 31220, /* u_long */ - DatumGeocentricCoordinatesZ = 31230, /* u_long */ - DatumLatitude = 31300, /* */ - DatumLongitude = 31400, /* */ - DatumOrientation = 32000, /* */ - DatumHullHeadingAngle = 32100, /* Degrees */ - DatumHullPitchAngle = 32200, /* */ - DatumRollAngle = 32300, /* */ - DatumOrientationX = 32500, /* u_long */ - DatumOrientationY = 32600, /* u_long */ - DatumOrientationZ = 32700, /* u_long */ - DatumAppearance = 33000, /* */ - DatumAmbientLighting = 33100, /* */ - DatumLights = 33101, /* */ - DatumPaintScheme = 33200, /* */ - DatumSmoke = 33300, /* */ - DatumTrailingEffects = 33400, /* */ - DatumFlaming = 33500, /* */ - DatumMarking = 33600, /* */ - DatumMinePlowsAttached = 33710, /* */ - DatumMineRollersAttached = 33720, /* */ - DatumTankTurretAzimuth = 33730, /* Degrees */ - DatumFailuresandMalfunctions = 34000, /* */ - DatumAge = 34100, /* Miles */ - DatumKilometers = 34110, /* */ - DatumDamage = 35000, /* */ - DatumCause = 35050, /* */ - DatumMobilityKill = 35100, /* */ - DatumFire_PowerKill = 35200, /* */ - DatumPersonnelCasualties = 35300, /* */ - DatumVelocity = 36000, /* */ - DatumXVelocity = 36100, /* Meters/sec */ - DatumYVelocity = 36200, /* Meters/sec */ - DatumZVelocity = 36300, /* Meters/sec */ - DatumAcceleration = 37000, /* */ - DatumXAcceleration = 37100, /* */ - DatumYAcceleration = 37200, /* */ - DatumZAcceleration = 37300, /* */ - DatumEngineStatus = 38100, /* */ - DatumExercise = 40000, /* */ - DatumTerrainDatabase = 41000, /* */ - DatumMissions = 42000, /* */ - DatumMissionID = 42100, /* */ - DatumMissionType = 42200, /* */ - DatumMissionRequestTimeStamp = 42300, /* */ - DatumExerciseDescription = 43000, /* String */ - DatumName = 43100, /* String */ - DatumEntities = 43200, /* Integer */ - DatumVersion = 43300, /* */ - DatumEnvironment = 50000, /* */ - DatumWeather = 51000, /* */ - DatumThermalCondition = 51100, /* */ - DatumTime = 52000, /* */ - DatumTimeofDayDiscrete = 52100, /* */ - DatumTimeofDayContinuous = 52200, /* */ - DatumTimeMode = 52300, /* */ - DatumTimeScene = 52305, /* */ - DatumCurrentHour = 52310, /* */ - DatumCurrentMinute = 52320, /* */ - DatumCurrentSecond = 52330, /* */ - DatumAzimuth = 52340, /* */ - DatumMaximumElevation = 52350, /* */ - DatumTimeZone = 52360, /* */ - DatumTimeSunriseEnabled = 52400, /* */ - DatumSunriseHour = 52410, /* */ - DatumSunriseMinute = 52420, /* */ - DatumSunriseSecond = 52430, /* */ - DatumSunriseAzimuth = 52440, /* */ - DatumTimeSunsetEnabled = 52500, /* */ - DatumSunsetHour = 52510, /* */ - DatumSunsetMinute = 52520, /* */ - DatumSunsetSecond = 52530, /* */ - DatumDate = 52600, /* */ - DatumMonth = 52610, /* */ - DatumDay = 52620, /* */ - DatumYear = 52630, /* */ - DatumClouds = 53000, /* */ - DatumCloudLayerEnable = 53050, /* */ - DatumCloudLayerSelection = 53060, /* */ - DatumCloudVisibility = 53100, /* */ - DatumCloudBaseAltitude = 53200, /* Meters */ - DatumCloudBaseAltitudeFeet = 53250, /* Feet */ - DatumCloudCeiling = 53300, /* Meters */ - DatumcloudCeilingFeet = 53350, /* Feet */ - DatumCharacteristics = 53400, /* */ - DatumPrecipitation = 54000, /* */ - DatumRain = 54100, /* Boolean */ - DatumFog = 55000, /* Boolean */ - DatumVisibility = 55100, /* Meters */ - DatumVisibilityMiles = 55105, /* Miles */ - DatumDensity = 55200, /* */ - DatumBase = 55300, /* */ - DatumViewLayerFromAbove = 55401, /* */ - DatumTransitionRange = 55410, /* */ - DatumBottom = 55420, /* Meters */ - DatumBottomFeet = 55425, /* Feet */ - DatumCeiling = 55430, /* Meters */ - DatumCeilingFeet = 55435, /* Feet */ - DatumHeavenlyBodies = 56000, /* */ - DatumSun = 56100, /* */ - DatumSunPosition = 56110, /* */ - DatumSunPositionAzimuth = 56120, /* */ - DatumSunPositionElevation = 56130, /* */ - DatumSunPositionIntensity = 56140, /* */ - DatumMoon = 56200, /* */ - DatumMoonPosition = 56210, /* */ - DatumMoonPositionAzimuth = 56220, /* */ - DatumMoonPositionElevation = 56230, /* */ - DatumMoonPositionIntensity = 56240, /* */ - DatumHorizon = 56310, /* */ - DatumHorizonAzimuth = 56320, /* */ - DatumHorizonElevation = 56330, /* */ - DatumHorizonHeading = 56340, /* */ - DatumHorizonIntensity = 56350, /* */ - DatumMeteorological = 57000, /* */ - DatumMeteorologicalTemperature = 57100, /* */ - DatumMeteorologicalHumidity = 57200, /* */ - DatumMeteorologicalVisibility = 57300, /* */ - DatumMeteorologicalWinds = 57400, /* */ - DatumMeteorologicalSpeed = 57410, /* */ - DatumMeteorologicalRainsoak = 57500, /* */ - DatumHaze = 58000, /* Boolean */ - DatumHazeVisibility = 58100, /* Meters */ - DatumHazeVisibilityMiles = 58105, /* Miles */ - DatumHazeDensity = 58200, /* */ - DatumHazeCeiling = 58430, /* Meters */ - DatumHazeCeilingFeet = 58435, /* Feet */ - DatumCommunications = 60000, /* */ - DatumChannelType = 61100, /* */ - DatumChannelType1 = 61101, /* */ - DatumChannelIdentification = 61200, /* */ - DatumAlphaIdentification = 61300, /* */ - DatumRadioIdentification = 61400, /* */ - DatumLandLineIdentification = 61500, /* */ - DatumIntercomIdentification = 61600, /* */ - DatumGroupNetworkChannelNumber = 61700, /* */ - DatumRadioCommunicationsStatus = 62100, /* */ - DatumStationaryRadioTransmittersDefaultTime = 62200, /* u_long */ - DatumMovingRadioTransmittersDefaultTime = 62300, /* u_long */ - DatumStationaryRadioSignalsDefaultTime = 62400, /* */ - DatumMovingRadioSignalDefaultTime = 62500, /* */ - DatumRadioInitTransecSecurityKey = 63101, /* variable */ - DatumRadioInitInternalNoiseLevel = 63102, /* variable */ - DatumRadioInitSquelchThreshold = 63103, /* variable */ - DatumRadioInitAntennaLocation = 63104, /* variable */ - DatumRadioInitAntennaPatternType = 63105, /* variable */ - DatumRadioInitAntennaPatternLength = 63106, /* variable */ - DatumRadioInitBeamDefinition = 63107, /* variable */ - DatumRadioInitTransmitHeartbeatTime = 63108, /* variable */ - DatumRadioInitTransmitDistanceThreshold = 63109, /* variable */ - DatumRadioChannelInitLockoutID = 63110, /* variable */ - DatumRadioChannelInitHopsetID = 63111, /* variable */ - DatumRadioChannelInitPresetFrequency = 63112, /* variable */ - DatumRadioChannelInitFrequencySyncTime = 63113, /* variable */ - DatumRadioChannelInitComsecKey = 63114, /* variable */ - DatumRadioChannelInitAlpha = 63115, /* variable */ - DatumAlgorithmParameters = 70000, /* */ - DatumDeadReckoningAlgorithm = 71000, /* */ - DatumDRALocationThreshold = 71100, /* u_long */ - DatumDRAOrientationThreshold = 71200, /* */ - DatumDRATimeThreshold = 71300, /* */ - DatumSimulationManagementParameters = 72000, /* */ - DatumCheckpointInterval = 72100, /* */ - DatumTransmitterTimeThreshold = 72600, /* */ - DatumReceiverTimeThreshold = 72700, /* */ - DatumInteroperabilityMode = 73000, /* */ - DatumSIMNETDataCollection = 74000, /* variable* */ - DatumEventID = 75000, /* */ - DatumSourceSiteID = 75100, /* */ - DatumSourceHostID = 75200, /* */ - DatumArticulatedPart = 90000, /* */ - DatumArticulatedPartID = 90050, /* */ - DatumArticulatedPartIndex = 90070, /* */ - DatumArticulatedPartPosition = 90100, /* */ - DatumArticulatedPartPositionRate = 90200, /* */ - DatumArticulatedPartExtension = 90300, /* */ - DatumArticulatedPartExtensionRate = 90400, /* */ - DatumArticulatedPartX = 90500, /* */ - DatumArticulatedPartXRate = 90600, /* */ - DatumArticulatedPartY = 90700, /* */ - DatumArticulatedPartYRate = 90800, /* */ - DatumArticulatedPartZ = 90900, /* */ - DatumArticulatedPartZRate = 91000, /* */ - DatumArticulatedPartAzimuth = 91100, /* */ - DatumArticulatedPartAzimuthRate = 91200, /* */ - DatumArticulatedPartElevation = 91300, /* */ - DatumArticulatedPartElevationRate = 91400, /* */ - DatumArticulatedPartRotation = 91500, /* */ - DatumArticulatedPartRotationRate = 91600, /* */ - DatumDRAAngularXVelocity = 100001, /* */ - DatumDRAAngularYVelocity = 100002, /* */ - DatumDRAAngularZVelocity = 100003, /* */ - DatumAppearanceTrailingEffects = 100004, /* */ - DatumAppearanceHatch = 100005, /* */ - DatumAppearanceCharacterSet = 100008, /* */ - DatumCapabilityAmmunitionSupplier = 100010, /* */ - DatumCapabilityMiscellaneousSupplier = 100011, /* */ - DatumCapabilityRepairProvider = 100012, /* */ - DatumArticulationParameter = 100014, /* */ - DatumArticulationParameterType = 100047, /* */ - DatumArticulationParameterValue = 100048, /* */ - DatumTimeofDayScene = 100058 /* */ -} dis_datum_type; diff -Nru acm-5.0/dis/dis/disenum2.h acm-6.0+20200416/dis/dis/disenum2.h --- acm-5.0/dis/dis/disenum2.h 1998-05-12 03:43:01.000000000 +0000 +++ acm-6.0+20200416/dis/dis/disenum2.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,92 +0,0 @@ - -/* - * DIS/x : An implementation of the IEEE 1278.1 protocol - * - * Copyright (C) 1997, Riley Rainey (rrainey@ix.netcom.com) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of either: - * - * a) the GNU Library General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your - * option) any later version. A description of the terms and conditions - * of the GLPL may be found in the "COPYING.LIB" file. - * - * b) the "Artistic License" which comes with this Kit. Information - * about this license may be found in the "Artistic" file. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License or the Artistic License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the Free - * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * Information describing how to contact the author can be found in the - * README file. - */ - -#define DISAppearancePaintUniform 0 -#define DISAppearancePaintCamouflage 1 -#define DISAppearancePaintMask 1 - -#define DISAppearanceMobilityNormal (0 << 1) -#define DISAppearanceMobilityDisabled (1 << 1) - -#define DISAppearanceFirepowerNormal (0 << 2) -#define DISAppearanceFirepowerDisabled (1 << 2) - -#define DISAppearanceDamageNone (0 << 3) -#define DISAppearanceDamageSlight (1 << 3) -#define DISAppearanceDamageModerate (2 << 3) -#define DISAppearanceDamageDestroyed (3 << 3) -#define DISAppearanceDamageMask (3 << 3) - -#define DISAppearanceSmokeNone (0 << 5) -#define DISAppearanceSmokePlume (1 << 5) -#define DISAppearanceSmokeEngine (2 << 5) -#define DISAppearanceSmokePlumeAndEngine (3 << 5) -#define DISAppearanceSmokeMask (3 << 5) - -#define DISAppearanceSmokeTrailingNone (0 << 7) -#define DISAppearanceSmokeTrailingSmall (1 << 7) -#define DISAppearanceSmokeTrailingMedium (2 << 7) -#define DISAppearanceSmokeTrailingLarge (3 << 7) -#define DISAppearanceSmokeTrailingMask (3 << 7) - -#define DISAppearanceHatchNA (0 << 9) -#define DISAppearanceHatchClosed (1 << 9) -#define DISAppearanceHatchPopped (2 << 9) -#define DISAppearanceHatchPoppedPerson (3 << 9) -#define DISAppearanceHatchOpen (4 << 9) -#define DISAppearanceHatchOpenPerson (5 << 9) -#define DISAppearanceHatchMask (7 << 9) - -#define DISLightsNone (0 << 12) -#define DISLightsRunning (1 << 12) -#define DISLightsNavigation (2 << 12) -#define DISLightsFormation (3 << 12) -#define DISLightsMask (3 << 12) - -#define DISNoFlames (0 << 15) -#define DISFlamesPresent (1 << 15) - -#define DISAppearancePlatformNotFrozen (0 << 21) -#define DISAppearancePlatformFrozen (1 << 21) -#define DISAppearancePlatformPowerplantOff (0 << 22) -#define DISAppearancePlatformPowerplantOn (1 << 22) -#define DISAppearancePlatformActive (0 << 23) -#define DISAppearancePlatformDeactivated (1 << 23) - -#define DISAppearanceAirAfterburnerOn (1 << 16) - -#define DISAppearanceLandLauncherRaised (1 << 16) - -#define DISAppearanceLandCammouflageDesert (0 << 17) -#define DISAppearanceLandCammouflageWinter (1 << 17) -#define DISAppearanceLandCammouflageForest (2 << 17) -#define DISAppearanceLandCammouflageMask (3 << 17) - -#define DISAppearanceLandConcealed (1 << 19) diff -Nru acm-5.0/dis/dis/disenum3.h acm-6.0+20200416/dis/dis/disenum3.h --- acm-5.0/dis/dis/disenum3.h 1998-05-12 03:43:01.000000000 +0000 +++ acm-6.0+20200416/dis/dis/disenum3.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,280 +0,0 @@ - -/* - * DIS/x : An implementation of the IEEE 1278.1 protocol - * - * Copyright (C) 1997, Riley Rainey (rrainey@ix.netcom.com) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of either: - * - * a) the GNU Library General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your - * option) any later version. A description of the terms and conditions - * of the GLPL may be found in the "COPYING.LIB" file. - * - * b) the "Artistic License" which comes with this Kit. Information - * about this license may be found in the "Artistic" file. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License or the Artistic License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the Free - * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * Information describing how to contact the author can be found in the - * README file. - */ - -#define DISForceOther 0 -#define DISForceFriendly 1 -#define DISForceOpposing 2 -#define DISForceNeutral 3 - -#define DISKindOther 0 -#define DISKindPlatform 1 -#define DISKindMunition 2 -#define DISKindLifeForm 3 -#define DISKindEnvironmental 4 -#define DISKindCultural 5 -#define DISKindSupply 6 -#define DISKindRadio 7 - -#define DISDomainOther 0 -#define DISDomainLand 1 -#define DISDomainAir 2 -#define DISDomainSurface 3 -#define DISDomainSubsurface 4 -#define DISDomainSpace 5 - -#define DISCategoryLandOther 0 -#define DISCategoryLandTank 1 -#define DISCategoryLandAFV 2 -#define DISCategoryLandAUV 3 -#define DISCategorySPA 4 -#define DISCategoryTowedArty 5 -#define DISCategorySmallWUV 6 -#define DISCategoryLargeWUV 7 - -#define DISTargetDomainOther 0 -#define DISTargetDomainAntiAir 1 -#define DISTargetDomainAntiArmor 2 -#define DISTargetDomainAntiGuidedMunition 3 -#define DISTargetDomainAntiRadar 4 -#define DISTargetDomainAntiSatellite 5 -#define DISTargetDomainAntiShip 6 -#define DISTargetDomainAntiSubmarine 7 -#define DISTargetDomainBattlefieldSupport 8 -#define DISTargetDomainStrategic 8 -#define DISTargetDomainMisc 10 - -#define DISDRMethodOther 0 -#define DISDRMethodStatic 1 -#define DISDRMethodFPW 2 -#define DISDRMethodRPW 3 -#define DISDRMethodRVW 4 -#define DISDRMethodFVW 5 -#define DISDRMethodFPB 6 -#define DISDRMethodRPB 7 -#define DISDRMethodRVB 8 -#define DISDRMethodFVB 9 -#define DISDRMethodRPW_2 10 -#define DISDRMethodRVW_2 11 - -#define DISCharSetUnused 0 -#define DISCharSetASCII 1 - -#define DISCapabilityAmmunitionSupply 1 -#define DISCapabilityFuelSupply 2 -#define DISCapabilityMiscSupply 4 -#define DISCapabilityRepair 8 - -#define DISWarheadOther 0 -#define DISWarheadHE 1000 -#define DISWarheadHEPlastic 1100 -#define DISWarheadHEIncendiary 1200 -#define DISWarheadHEFragment 1300 -#define DISWarheadHEAntiTank 1400 -#define DISWarheadHEBomblets 1500 -#define DISWarheadHEShapedCharge 1600 -#define DISWarheadSmoke 2000 -#define DISWarheadIllumination 3000 -#define DISWarheadPractice 4000 -#define DISWarheadKinetic 5000 -#define DISWarheadUnused 6000 -#define DISWarheadNuclear 7000 -#define DISWarheadChemGeneral 8000 -#define DISWarheadChemBlister 8100 -#define DISWarheadChemBlood 8200 -#define DISWarheadChemNerve 8300 -#define DISWarheadBiologicalGeneral 9000 - -#define DISFuzeOther 0 -#define DISFuzeContact 1000 -#define DISFuzeContactInstant 1100 -#define DISFuzeContactDelayed 1200 -#define DISFuzeContactElectronic 1300 -#define DISFuzeContactGraze 1400 -#define DISFuzeContactCrush 1500 -#define DISFuzeContactHydrostatic 1600 -#define DISFuzeContactMechanical 1700 -#define DISFuzeContactChemical 1800 -#define DISFuzeTimed 2000 -#define DISFuzeProximity 3000 -#define DISFuzeProximityActiveLaser 3100 -#define DISFuzeProximityMagnetic 3200 -#define DISFuzeProximityRadar 3300 -#define DISFuzeProximityRF 3400 -#define DISFuzeProximityProgrammable 3500 -#define DISFuzeProximityInfrared 3700 -#define DISFuzeCommand 4000 -#define DISFuzeCommandElectronicRS 4100 -#define DISFuzeAltitude 5000 -#define DISFuzeAltitudeRadioAltimeter 5100 -#define DISFuzeAltitudeRadioAirBurst 5100 -#define DISFuzeDepth 6000 -#define DISFuzeAcoustic 7000 -#define DISFuzePressure 8000 -#define DISFuzePyrotechnic 9000 - -#define DISDetonationResultOther 0 -#define DISDetonationResultEntityImpact 1 -#define DISDetonationResultEntityProxDetonation 2 -#define DISDetonationResultGroundImpact 3 -#define DISDetonationResultGroundProxDetonation 4 -#define DISDetonationResultDetonation 5 -#define DISDetonationResultNone 6 -#define DISDetonationResultHESmall 7 -#define DISDetonationResultHEMedium 8 -#define DISDetonationResultHELarge 9 -#define DISDetonationResultAP 10 -#define DISDetonationResultDBSmall 11 -#define DISDetonationResultDBMedium 12 -#define DISDetonationResultDBLarge 13 -#define DISDetonationResultAirHit 17 -#define DISDetonationResultBuildingHitSmall 18 -#define DISDetonationResultBuildingHitMedium 19 -#define DISDetonationResultBuildingHitLarge 20 -#define DISDetonationResultMineClearingLineCharge 21 - -#define DISServiceTypeOther 0 -#define DISServiceTypeResupply 1 -#define DISServiceTypeRepair 2 - -#define DISRepairTypeNone 0 -#define DISRepairTypeAll 1 - -#define DISRepairResultOther 0 -#define DISRepairResultEnded 1 -#define DISRepairResultInvalid 2 -#define DISRepairResultInterrupted 3 -#define DISRepairResultCancelled 4 - -#define DISStopReasonOther 0 -#define DISStopReasonRecess 1 -#define DISStopReasonTermination 2 -#define DISStopReasonSystemFailure 3 -#define DISStopReasonSecurityViolation 4 -#define DISStopReasonEntityReconstitution 5 - -#define DISAckFlagOther 0 -#define DISAckFlagCreateEntity 1 -#define DISAckFlagRemoveEntity 2 -#define DISAckFlagStartResume 3 -#define DISAckFlagStopFreeze 4 - -#define DISActionOther 0 -#define DISActionLocalStorage 1 -#define DISActionOutOfAmmunition 2 -#define DISActionKIA 3 -#define DISActionDamage 4 -#define DISActionMobilityDisabled 5 -#define DISActionFireDisabled 6 - -#define DISResponseOther 0 -#define DISResponsePending 1 -#define DISResponseExecuting 2 -#define DISResponsePartiallyComplete 3 -#define DISResponseComplete 4 - -#define DISActivateReasonOther 0 -#define DISActivateReasonStart 1 -#define DISActivateReasonRestart 2 -#define DISActivateReasonEntry 3 -#define DISActivateReasonReconstite 4 - -#define DISActivateResultOther 0 -#define DISActivateResultRequestAccepted 1 -#define DISActivateResultInvalidParam 2 -#define DISActivateResultUnexpectedParam 3 - -#define DISDeactivateReasonOther 0 -#define DISDeactivateReasonEnd 1 -#define DISDeactivateReasonWithdrawn 2 -#define DISDeactivateReasonDestroyed 3 - -#define DISDeactivateResultOther 0 -#define DISDeactivateResultReqAccepted 1 -#define DISDeactivateResultInvalidParam 2 -#define DISDeactivateResultUnexpectedReason 3 -#define DISDeactivateResultNotActive 4 - -#define DISFrozenSimulationClock (1<<0) -#define DISFrozenTransmitPDUs (1<<1) -#define DISFrozenReceivePDUs (1<<2) - -#define DISInputSourceOther 0 -#define DISInputSourcePilot 1 -#define DISInputSourceCopilot 2 -#define DISInputSourceFirstOfficer 3 - -#define DISReceiverStateOff 0 -#define DISReceiverStateOnNotReceiving 1 -#define DISReceiverStateOnReceiving 2 - -#define DISEmitterFuncUnknown 0 -#define DISEmitterFuncLandBasedAirDefense 1 -#define DISEmitterFuncBattlefieldAndGroundSurveillance 2 -#define DISEmitterFuncNavalSurveillanceAndNavigation 3 -#define DISEmitterFuncNavalFireControl 4 -#define DISEmitterFuncAirborneSurveillance 5 -#define DISEmitterFuncAirborneFireControl 6 -#define DISEmitterFuncSpaceborne 7 -#define DISEmitterFuncATCInstrumentationAndRanging 8 -#define DISEmitterFuncWeather 9 -#define DISEmitterFuncMissileGuidance 10 -#define DISEmitterFuncJamming 11 - -#define DISBeamFuncUnknown 0 -#define DISBeamFuncSearch 1 -#define DISBeamFuncHeightFinder 2 -#define DISBeamFuncAcquisition 3 -#define DISBeamFuncTracking 4 -#define DISBeamFuncAcquisitionAndTracking 5 -#define DISBeamFuncCommandGuidance 6 -#define DISBeamFuncIlluminator 7 -#define DISBeamFuncRangeOnlyRadar 8 -#define DISBeamFuncMissileBeacon 9 -#define DISBeamFuncMissileFuze 10 -#define DISBeamFuncActiveRadarMissileSeeker 11 -#define DISBeamFuncJammer 12 - -#define DISPRITypeUnknown 0 -#define DISPRITypeSteady 1 -#define DISPRITypeStaggered 2 -#define DISPRITypeJitter 3 -#define DISPRITypePulseGroup 4 -#define DISPRITypeCW 5 -#define DISPRITypePulseDoppler 6 - -#define DISScanTypeUnknown 0 -#define DISScanTypeSteady 1 -#define DISScanTypeUnidirectional 2 -#define DISScanTypeBidirectional 3 -#define DISScanTypeConical 4 -#define DISScanTypeTwoBar 5 -#define DISScanTypeThreeBar 6 -#define DISScanTypeFourBar 7 -#define DISScanTypeOneBar 8 diff -Nru acm-5.0/dis/dis/disenum.h acm-6.0+20200416/dis/dis/disenum.h --- acm-5.0/dis/dis/disenum.h 1998-12-09 21:53:50.000000000 +0000 +++ acm-6.0+20200416/dis/dis/disenum.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,146 +0,0 @@ - -/* - * DIS/x : An implementation of the IEEE 1278.1 protocol - * - * Copyright (C) 1997, Riley Rainey (rrainey@ix.netcom.com) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of either: - * - * a) the GNU Library General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your - * option) any later version. A description of the terms and conditions - * of the GLPL may be found in the "COPYING.LIB" file. - * - * b) the "Artistic License" which comes with this Kit. Information - * about this license may be found in the "Artistic" file. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License or the Artistic License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the Free - * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * Information describing how to contact the author can be found in the - * README file. - */ - -#define PDUTypeOther 0 -#define PDUTypeEntityState 1 -#define PDUTypeFire 2 -#define PDUTypeDetonation 3 -#define PDUTypeCollision 4 -#define PDUTypeServiceRequest 5 -#define PDUTypeResupplyOffer 6 -#define PDUTypeResupplyReceived 7 -#define PDUTypeResupplyCancel 8 -#define PDUTypeRepairComplete 9 -#define PDUTypeRepairResponse 10 -#define PDUTypeCreateEntity 11 -#define PDUTypeRemoveEntity 12 -#define PDUTypeStartResume 13 -#define PDUTypeStopFreeze 14 -#define PDUTypeAcknowledge 15 -#define PDUTypeActionRequest 16 -#define PDUTypeActionResponse 17 -#define PDUTypeDataQuery 18 -#define PDUTypeSetData 19 -#define PDUTypeData 20 -#define PDUTypeEventReport 21 -#define PDUTypeMessage 22 -#define PDUTypeEmission 23 -#define PDUTypeLaser 24 -#define PDUTypeTransmitter 25 -#define PDUTypeSignal 26 -#define PDUTypeReceiver 27 - -#define PDUTypeTransferControl 36 - -#define PDUFamilyOther 0 -#define PDUFamilyEntityInformation 1 -#define PDUFamilyWarfare 2 -#define PDUFamilyLogistics 3 -#define PDUFamilyRadioCommunications 4 -#define PDUFamilySimulationManagement 5 -#define PDUFamilyDistributedEmissionRegeneration 6 - - -/* - * CALSPAN experimental PDUs - */ - -#define PDUTypeExperimentalRequestControl 150 -#define PDUTypeExperimentalGrantControl 151 - -typedef enum { - DISProtocolVersionMay92 = 1, - DISProtocolVersionIEEE1278_93 = 2, - DISProtocolVersionMay93 = 3, - DISProtocolVersion2_04 = 4, - DISProtocolVersionIEEE1278_95 = 5 -} DISProtocolVersion; - -typedef enum { - DISForceOther = 0, - DISForceFriendly = 1, - DISForceOpposing = 2, - DISForceNeutral = 3 -} DISForce; - -typedef enum { - DISRequestStatusOther = 0, - DISRequestStatusPending = 1, - DISRequestStatusExecuting = 2, - DISRequestStatusPartiallyComplete = 3, - DISRequestStatusComplete = 4 -} DISRequestStatus; - -typedef enum { - DISAcknowledgeFlagCreateEntity = 1, - DISAcknowledgeFlagRemoveEntity = 2, - DISAcknowledgeFlagStart = 3, - DISAcknowledgeFlagStop = 4 -} DISAcknowledgeFlag; - -typedef enum { - DISStopReasonOther = 0, - DISStopReasonRecess = 1, - DISStopReasonTermination = 2, - DISStopReasonSystemFailure = 3, - DISStopReasonSecurityViolation = 4, - DISStopReasonEntityReconstitution = 5 -} DISStopReason; - -#define DISFrozenBehaviorRunClock (1<<0) -#define DISFrozenBehaviorTransmit (1<<1) -#define DISFrozenBehaviorReceive (1<<2) - -typedef enum { - DISTransferTypeOther = 0, - DISTransferTypeEntityControllerRequest = 1, - DISTransferTypeEntityRequest = 2, - DISTransferTypeEntityMutualExchange = 3, - DISTransferTypeEnvironmentalControllerRequest = 4, - DISTransferTypeEnvironmentalRequest = 5, - DISTransferTypeEnvironmentalMutualExchange = 6 -} DISTransferType; - - -/* - * From IEEE 1278.1-1995 - */ - -#define ALL_APPLIC 0xFFFF -#define ALL_ENTITIES 0xFFFF -#define ALL_SITES 0xFFFF -#define COLLISION_THRSH_DFLT 0.1 -#define DRA_ORIENT_THRSH_DFLT 3.0 -#define DRA_POS_THRSH_DFLT 1.0 -#define NO_APPLIC 0x0000 -#define NO_ENTITY 0x0000 -#define NO_SITE 0x0000 -#define NOR_FIRE_MISSION 0x0000 -#define RQST_ASSIGN_ID 0xFFFE diff -Nru acm-5.0/dis/dis/dis.h acm-6.0+20200416/dis/dis/dis.h --- acm-5.0/dis/dis/dis.h 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/dis/dis/dis.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,271 +0,0 @@ - -/* - * DIS/x : An implementation of the IEEE 1278.1 protocol - * - * Copyright (C) 1997, Riley Rainey (rrainey@ix.netcom.com) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of either: - * - * a) the GNU Library General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your - * option) any later version. A description of the terms and conditions - * of the GLPL may be found in the "COPYING.LIB" file. - * - * b) the "Artistic License" which comes with this Kit. Information - * about this license may be found in the "Artistic" file. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License or the Artistic License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the Free - * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * Information describing how to contact the author can be found in the - * README file. - */ - -#ifndef _dis_h -#define _dis_h - -#include -#include -#include -#include - -#if defined(__cplusplus) -extern "C" { -#endif - -#include - -#if defined(__cplusplus) -}; - -#endif -#include -#include -#include -#ifdef WIN32 -/*#include */ -#else -#include -#include -#endif -#include - -#if defined(__cplusplus) -extern "C" { -#endif - -/* - * This is a bit of a hack, we're borrowing the VMatrix definition - * from the Vlib, but I don't want to make DIS/x completely dependent - * on Vlib, sooo ... - */ - -#if defined(__Vlib) || defined (_vlibmath_h) -#include -#else - typedef struct _VMatrix { - double m[4][4]; - } VMatrix; -#endif - -#ifdef WIN32 -#define inline __inline -#endif - - static inline void - DISMatrixMultByRank(VMatrix * Mt1, VMatrix * Mt2, VMatrix * R, int rank) { - register int I, J, K; - register double x; - - for (I = 0; I < rank; ++I) - for (J = 0; J < rank; ++J) { - x = 0.0; - for (K = 0; K < rank; ++K) - x += Mt1->m[K][J] * Mt2->m[I][K]; - R->m[I][J] = x; - } - } - typedef struct _dis_dr_parameters { - double timeThreshold; /* [ seconds ] */ - double locationThreshold; /* [ meters ] */ - double orientationThreshold; /* [ radians ] */ - double omega; /* angular velocity magnitude */ - VMatrix R0; /* orientation based on euler angles in entity state */ - VMatrix skew; - VMatrix aat; - dis_entity_state_pdu pdu; /* saved entity state PDU */ - } dis_dr_parameters; - -#define DR_TIME 0x01 -#define DR_LOCATION 0x02 -#define DR_ORIENTATION 0x04 - - typedef struct _DISDestinationAddress { - struct sockaddr_in addr; - int type; /* 0=broadcast; 1=other */ - } DISDestinationAddress; - - typedef struct _DISTransceiver { - int s; - DISDestinationAddress dest[32]; - int num_dest; - } DISTransceiver; - - typedef enum { - DISResultOK = 0, - DISResultError = 1, - DISResultNoMemory = 2 - } DISResult; - - typedef struct _DISxApplicationInfo { - DISTransceiver *xcvr; - dis_pdu_header hdr; - dis_simulation_addr id; - u_short last_event; - u_short last_request; - u_short last_entity; - } DISxApplicationInfo; - - extern DISxApplicationInfo * - DISxInitializeApplication(unsigned int exercise_id, - unsigned int site_id, - unsigned int application_id); - - extern void DISxCloseApplication(DISxApplicationInfo *); - extern int DISxReadPDU(DISxApplicationInfo *, dis_pdu *); - extern int DISxWritePDU(DISxApplicationInfo *, dis_pdu *); - extern void DISxGetSimulationAddress(DISxApplicationInfo * info, - dis_simulation_addr * p); - extern dis_entity_id *DISxIssueEntityID(DISxApplicationInfo * info, - dis_entity_id * p); - extern dis_event_id *DISxIssueEventID(DISxApplicationInfo * info, - dis_event_id * p); - extern dis_request_id DISxIssueRequestID( DISxApplicationInfo * info ); - - extern DISResult DISAddArticulationParm(dis_pdu * p, - dis_articulation_parm * parm, - int *parmID); - - extern int DISSetNBIOState(DISTransceiver *, int); - extern DISTransceiver *DISOpenTransceiver(int port); - - extern void DISCloseTransceiver(DISTransceiver *); - extern int DISReadPDU(DISTransceiver *, dis_pdu *); - extern int DISWritePDU(DISTransceiver *, dis_pdu *); - extern int DISDisableWrite; - - extern void DISFreePDUComponents(dis_pdu *); - extern void DISAddPDUSizes(dis_pdu *); - - extern int DISGetRealTime(dis_time * result); - extern int DISGetTimestamp(dis_timestamp * result); - extern void DISTimeToTimeval(dis_time * in, struct timeval *out); - extern void DISTimestampToTimeval(dis_timestamp * in, struct timeval *out); - -/* - * Round world stuff - */ - - typedef struct _worldcoordinates { - double latitude; /* [radians, north positive] */ - double longitude; /* [radians, east positive] */ - double z; /* above reference ellipsoid [meters] */ - } WorldCoordinates; - - typedef enum { - LLM_DMS, /* dd mm ss.s [EWNS] */ - LLM_DM, /* dd mm [EWNS] */ - LLM_D, /* dd [EWNS] */ - LLM_SIGNED_D - } LatLongDisplayFormat; - -#ifndef M_PI -#define M_PI 3.14159265358979323846 -#endif - -#ifndef DEGtoRAD -#define DEGtoRAD(x) ((x) * M_PI / 180.0) -#define RADtoDEG(x) ((x) * 180.0 / M_PI) -#endif - -#define SECtoRAD(x) ((x) * M_PI / (180.0 * 3600.0)) - -#define WGS84_MAJOR 6378137.0 /* meters */ -#define WGS84_MINOR 6356752.3142 /* meters */ -#define WGS84_ECC 0.081819190928906199466 /* eccentricity */ -#define WGS84_ECC_SQR 0.006694380004260806515 /* eccentricity squared */ - - extern void - DISUpdateWorldCoordinates(WorldCoordinates * p, - double sin_course, double cos_course, double d_meters); - - extern void - DISUpdateWorldCoordinatesEx(WorldCoordinates * p, - double cos_course, double sin_course, double d_meters, - double * delta_course_rad ); - extern char * - DISLatitudeToString(char *s, double la, LatLongDisplayFormat mode); - extern char * - DISLongitudeToString(char *s, double lo, LatLongDisplayFormat mode); - extern void - DISGeocentricToWorldCoordinates(dis_world_coordinates * p, WorldCoordinates * w); - extern void - DISWorldCoordinatesToGeocentric(WorldCoordinates * w, dis_world_coordinates * p); - extern char * - DISStringToLatLong(char *s, WorldCoordinates * w); - - extern void - DISProcessNewDRParameters(dis_entity_state_pdu * pdu, dis_dr_parameters * dr); - extern void - DISGenerateDRParameters(dis_entity_state_pdu * pdu, dis_dr_parameters * dr); - extern void - DISComputeDRMatrix(dis_dr_parameters * dr, double dT, VMatrix * m); - extern void - DISComputeDRPosition(dis_dr_parameters * dr, - double dT, - dis_world_coordinates * pos, - dis_linear_vel_vector * vel, - VMatrix * orientation); - extern void - DISGetDRThresholds(dis_dr_parameters *, double *time, - double *location, double *orientation); - extern void - DISSetDRThresholds(dis_dr_parameters *, double time, - double location, double orientation); - extern int - DISTestDRThresholds(dis_dr_parameters *, double time, - dis_world_coordinates *current_location, - dis_euler_angles *current_orientation); - - extern int DISParseEntityID (dis_entity_id *p, - const char * buf, - int bufsize, - const char *delim); - - extern int - DISxSetProtocolVersion(int version); - - extern int - DISxSetPDUProtocolFamily (int pdu_type, int protocol_family); - - extern DISxApplicationInfo * dis_getApplicationInfo(void); - - extern void DISInitializeDatumInfo (dis_datum_spec_record *pd); - -#ifdef WIN32 - extern int gettimeofday (struct timeval *, struct timezone *); -#endif - -#if defined(__cplusplus) -}; - -#endif - -#endif diff -Nru acm-5.0/dis/dis/simx.h acm-6.0+20200416/dis/dis/simx.h --- acm-5.0/dis/dis/simx.h 1998-05-12 03:43:01.000000000 +0000 +++ acm-6.0+20200416/dis/dis/simx.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ - -#ifndef _SIMX_H -#define _SIMX_H - -extern int SIMxRegisterApplication(char *server, char *site_name, - unsigned int application_id, dis_simulation_addr * result); - -extern char *SIMxGetSiteName(char *result, int max_size); - -extern int SIMxLookupEntityName(dis_entity_type * p, char *result, int size); -extern int SIMxLookupEntityNames(dis_entity_type * p, char *result[7], int size); - -#endif diff -Nru acm-5.0/dis/disgen/configure acm-6.0+20200416/dis/disgen/configure --- acm-5.0/dis/disgen/configure 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/dis/disgen/configure 1970-01-01 00:00:00.000000000 +0000 @@ -1,913 +0,0 @@ -#! /bin/sh - -# Guess values for system-dependent variables and create Makefiles. -# Generated automatically using autoconf version 2.4 -# Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc. -# -# This configure script is free software; the Free Software Foundation -# gives unlimited permission to copy, distribute and modify it. - -# Defaults: -ac_help= -ac_default_prefix=/usr/local -# Any additions from configure.in: - -# Initialize some variables set by options. -# The variables have the same names as the options, with -# dashes changed to underlines. -build=NONE -cache_file=./config.cache -exec_prefix=NONE -host=NONE -no_create= -nonopt=NONE -no_recursion= -prefix=NONE -program_prefix=NONE -program_suffix=NONE -program_transform_name=s,x,x, -silent= -site= -srcdir= -target=NONE -verbose= -x_includes=NONE -x_libraries=NONE - -# Initialize some other variables. -subdirs= - -ac_prev= -for ac_option -do - - # If the previous option needs an argument, assign it. - if test -n "$ac_prev"; then - eval "$ac_prev=\$ac_option" - ac_prev= - continue - fi - - case "$ac_option" in - -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; - *) ac_optarg= ;; - esac - - # Accept the important Cygnus configure options, so we can diagnose typos. - - case "$ac_option" in - - -build | --build | --buil | --bui | --bu | --b) - ac_prev=build ;; - -build=* | --build=* | --buil=* | --bui=* | --bu=* | --b=*) - build="$ac_optarg" ;; - - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - cache_file="$ac_optarg" ;; - - -disable-* | --disable-*) - ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then - { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } - fi - ac_feature=`echo $ac_feature| sed 's/-/_/g'` - eval "enable_${ac_feature}=no" ;; - - -enable-* | --enable-*) - ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then - { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } - fi - ac_feature=`echo $ac_feature| sed 's/-/_/g'` - case "$ac_option" in - *=*) ;; - *) ac_optarg=yes ;; - esac - eval "enable_${ac_feature}='$ac_optarg'" ;; - - -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ - | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ - | --exec | --exe | --ex) - ac_prev=exec_prefix ;; - -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ - | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ - | --exec=* | --exe=* | --ex=*) - exec_prefix="$ac_optarg" ;; - - -gas | --gas | --ga | --g) - # Obsolete; use --with-gas. - with_gas=yes ;; - - -help | --help | --hel | --he) - # Omit some internal or obsolete options to make the list less imposing. - # This message is too long to be a string in the A/UX 3.1 sh. - cat << EOF -Usage: configure [options] [host] -Options: [defaults in brackets after descriptions] -Configuration: - --cache-file=FILE cache test results in FILE - --help print this message - --no-create do not create output files - --quiet, --silent do not print \`checking...' messages - --version print the version of autoconf that created configure -Directory and file names: - --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] - --exec-prefix=PREFIX install architecture-dependent files in PREFIX - [same as prefix] - --srcdir=DIR find the sources in DIR [configure dir or ..] - --program-prefix=PREFIX prepend PREFIX to installed program names - --program-suffix=SUFFIX append SUFFIX to installed program names - --program-transform-name=PROGRAM run sed PROGRAM on installed program names -Host type: - --build=BUILD configure for building on BUILD [BUILD=HOST] - --host=HOST configure for HOST [guessed] - --target=TARGET configure for TARGET [TARGET=HOST] -Features and packages: - --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) - --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] - --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --x-includes=DIR X include files are in DIR - --x-libraries=DIR X library files are in DIR ---enable and --with options recognized:$ac_help -EOF - exit 0 ;; - - -host | --host | --hos | --ho) - ac_prev=host ;; - -host=* | --host=* | --hos=* | --ho=*) - host="$ac_optarg" ;; - - -nfp | --nfp | --nf) - # Obsolete; use --without-fp. - with_fp=no ;; - - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c) - no_create=yes ;; - - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) - no_recursion=yes ;; - - -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) - ac_prev=prefix ;; - -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix="$ac_optarg" ;; - - -program-prefix | --program-prefix | --program-prefi | --program-pref \ - | --program-pre | --program-pr | --program-p) - ac_prev=program_prefix ;; - -program-prefix=* | --program-prefix=* | --program-prefi=* \ - | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) - program_prefix="$ac_optarg" ;; - - -program-suffix | --program-suffix | --program-suffi | --program-suff \ - | --program-suf | --program-su | --program-s) - ac_prev=program_suffix ;; - -program-suffix=* | --program-suffix=* | --program-suffi=* \ - | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) - program_suffix="$ac_optarg" ;; - - -program-transform-name | --program-transform-name \ - | --program-transform-nam | --program-transform-na \ - | --program-transform-n | --program-transform- \ - | --program-transform | --program-transfor \ - | --program-transfo | --program-transf \ - | --program-trans | --program-tran \ - | --progr-tra | --program-tr | --program-t) - ac_prev=program_transform_name ;; - -program-transform-name=* | --program-transform-name=* \ - | --program-transform-nam=* | --program-transform-na=* \ - | --program-transform-n=* | --program-transform-=* \ - | --program-transform=* | --program-transfor=* \ - | --program-transfo=* | --program-transf=* \ - | --program-trans=* | --program-tran=* \ - | --progr-tra=* | --program-tr=* | --program-t=*) - program_transform_name="$ac_optarg" ;; - - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - silent=yes ;; - - -site | --site | --sit) - ac_prev=site ;; - -site=* | --site=* | --sit=*) - site="$ac_optarg" ;; - - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - srcdir="$ac_optarg" ;; - - -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target ;; - -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target="$ac_optarg" ;; - - -v | -verbose | --verbose | --verbos | --verbo | --verb) - verbose=yes ;; - - -version | --version | --versio | --versi | --vers) - echo "configure generated by autoconf version 2.4" - exit 0 ;; - - -with-* | --with-*) - ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then - { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } - fi - ac_package=`echo $ac_package| sed 's/-/_/g'` - case "$ac_option" in - *=*) ;; - *) ac_optarg=yes ;; - esac - eval "with_${ac_package}='$ac_optarg'" ;; - - -without-* | --without-*) - ac_package=`echo $ac_option|sed -e 's/-*without-//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then - { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } - fi - ac_package=`echo $ac_package| sed 's/-/_/g'` - eval "with_${ac_package}=no" ;; - - --x) - # Obsolete; use --with-x. - with_x=yes ;; - - -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ - | --x-incl | --x-inc | --x-in | --x-i) - ac_prev=x_includes ;; - -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ - | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) - x_includes="$ac_optarg" ;; - - -x-libraries | --x-libraries | --x-librarie | --x-librari \ - | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) - ac_prev=x_libraries ;; - -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ - | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries="$ac_optarg" ;; - - -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } - ;; - - *) - if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then - echo "configure: warning: $ac_option: invalid host type" 1>&2 - fi - if test "x$nonopt" != xNONE; then - { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } - fi - nonopt="$ac_option" - ;; - - esac -done - -if test -n "$ac_prev"; then - { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } -fi - -trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 - -# File descriptor usage: -# 0 standard input -# 1 file creation -# 2 errors and warnings -# 3 some systems may open it to /dev/tty -# 4 used on the Kubota Titan -# 6 checking for... messages and results -# 5 compiler messages saved in config.log -if test "$silent" = yes; then - exec 6>/dev/null -else - exec 6>&1 -fi -exec 5>./config.log - -echo "\ -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. -" 1>&5 - -# Strip out --no-create and --no-recursion so they do not pile up. -# Also quote any args containing shell metacharacters. -ac_configure_args= -for ac_arg -do - case "$ac_arg" in - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c) ;; - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; - *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) - ac_configure_args="$ac_configure_args '$ac_arg'" ;; - *) ac_configure_args="$ac_configure_args $ac_arg" ;; - esac -done - -# NLS nuisances. -# Only set LANG and LC_ALL to C if already set. -# These must not be set unconditionally because not all systems understand -# e.g. LANG=C (notably SCO). -if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi -if test "${LANG+set}" = set; then LANG=C; export LANG; fi - -# confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -rf conftest* confdefs.h -# AIX cpp loses on an empty file, so make sure it contains at least a newline. -echo > confdefs.h - -# A filename unique to this package, relative to the directory that -# configure is in, which we can look for to find out if srcdir is correct. -ac_unique_file=rpc_clntout.c - -# Find the source files, if location was not specified. -if test -z "$srcdir"; then - ac_srcdir_defaulted=yes - # Try the directory containing this script, then its parent. - ac_prog=$0 - ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` - test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. - srcdir=$ac_confdir - if test ! -r $srcdir/$ac_unique_file; then - srcdir=.. - fi -else - ac_srcdir_defaulted=no -fi -if test ! -r $srcdir/$ac_unique_file; then - if test "$ac_srcdir_defaulted" = yes; then - { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } - else - { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } - fi -fi -srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` - -# Prefer explicitly selected file to automatically selected ones. -if test -z "$CONFIG_SITE"; then - if test "x$prefix" != xNONE; then - CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" - else - CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" - fi -fi -for ac_site_file in $CONFIG_SITE; do - if test -r "$ac_site_file"; then - echo "loading site script $ac_site_file" - . "$ac_site_file" - fi -done - -if test -r "$cache_file"; then - echo "loading cache $cache_file" - . $cache_file -else - echo "creating cache $cache_file" - > $cache_file -fi - -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5 2>&5' -ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5 2>&5' - -if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then - # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. - if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then - ac_n= ac_c=' -' ac_t=' ' - else - ac_n=-n ac_c= ac_t= - fi -else - ac_n= ac_c='\c' ac_t= -fi - - - -# Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_CC="gcc" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_prog_CC" && ac_cv_prog_CC="cc" -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - -echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.c <&5 | egrep yes >/dev/null 2>&1; then - ac_cv_prog_gcc=yes -else - ac_cv_prog_gcc=no -fi -fi -echo "$ac_t""$ac_cv_prog_gcc" 1>&6 -if test $ac_cv_prog_gcc = yes; then - GCC=yes - if test "${CFLAGS+set}" != set; then - echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_prog_gcc_g'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - echo 'void f(){}' > conftest.c -if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then - ac_cv_prog_gcc_g=yes -else - ac_cv_prog_gcc_g=no -fi -rm -f conftest* - -fi - echo "$ac_t""$ac_cv_prog_gcc_g" 1>&6 - if test $ac_cv_prog_gcc_g = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-O2" - fi - fi -else - GCC= - test "${CFLAGS+set}" = set || CFLAGS="-g" -fi - - - -for i in /usr/ccs/lib/cpp /usr/local/bin/cpp /usr/lib/cpp /usr/bin/cpp /lib/cpp ; do - if test -x $i ; then - CPPEXEC=$i - fi -done - - -echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then -if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - # This must be in double quotes, not single quotes, because CPP may get - # substituted into the Makefile and "${CC-cc}" will confuse make. - CPP="${CC-cc} -E" - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. - cat > conftest.$ac_ext < -Syntax Error -EOF -eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -ac_err=`grep -v '^ *+' conftest.out` -if test -z "$ac_err"; then - : -else - echo "$ac_err" >&5 - rm -rf conftest* - CPP="${CC-cc} -E -traditional-cpp" - cat > conftest.$ac_ext < -Syntax Error -EOF -eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -ac_err=`grep -v '^ *+' conftest.out` -if test -z "$ac_err"; then - : -else - echo "$ac_err" >&5 - rm -rf conftest* - CPP=/lib/cpp -fi -rm -f conftest* -fi -rm -f conftest* - ac_cv_prog_CPP="$CPP" -fi - CPP="$ac_cv_prog_CPP" -else - ac_cv_prog_CPP="$CPP" -fi -echo "$ac_t""$CPP" 1>&6 - -# If we cannot run a trivial program, we must be cross compiling. -echo $ac_n "checking whether cross-compiling""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_c_cross'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test "$cross_compiling" = yes; then - ac_cv_c_cross=yes -else -cat > conftest.$ac_ext </dev/null; then - ac_cv_c_cross=no -else - ac_cv_c_cross=yes -fi -fi -rm -fr conftest* -fi -cross_compiling=$ac_cv_c_cross -echo "$ac_t""$ac_cv_c_cross" 1>&6 - -echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -#include -#include -#include -EOF -eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -ac_err=`grep -v '^ *+' conftest.out` -if test -z "$ac_err"; then - rm -rf conftest* - ac_cv_header_stdc=yes -else - echo "$ac_err" >&5 - rm -rf conftest* - ac_cv_header_stdc=no -fi -rm -f conftest* - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. -cat > conftest.$ac_ext < -EOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "memchr" >/dev/null 2>&1; then - : -else - rm -rf conftest* - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. -cat > conftest.$ac_ext < -EOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "free" >/dev/null 2>&1; then - : -else - rm -rf conftest* - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. -if test "$cross_compiling" = yes; then - ac_cv_header_stdc=no -else -cat > conftest.$ac_ext < -#define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int main () { int i; for (i = 0; i < 256; i++) -if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); -exit (0); } - -EOF -eval $ac_link -if test -s conftest && (./conftest; exit) 2>/dev/null; then - : -else - ac_cv_header_stdc=no -fi -fi -rm -fr conftest* -fi -fi -echo "$ac_t""$ac_cv_header_stdc" 1>&6 -if test $ac_cv_header_stdc = yes; then - cat >> confdefs.h <<\EOF -#define STDC_HEADERS 1 -EOF - -fi - -for ac_hdr in sys/file.h -do -ac_safe=`echo "$ac_hdr" | tr './\055' '___'` -echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -EOF -eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -ac_err=`grep -v '^ *+' conftest.out` -if test -z "$ac_err"; then - rm -rf conftest* - eval "ac_cv_header_$ac_safe=yes" -else - echo "$ac_err" >&5 - rm -rf conftest* - eval "ac_cv_header_$ac_safe=no" -fi -rm -f conftest* -fi -if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_hdr=HAVE_`echo $ac_hdr | tr '[a-z]./\055' '[A-Z]___'` - cat >> confdefs.h <&6 -fi -done - -for ac_hdr in strings.h -do -ac_safe=`echo "$ac_hdr" | tr './\055' '___'` -echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -EOF -eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -ac_err=`grep -v '^ *+' conftest.out` -if test -z "$ac_err"; then - rm -rf conftest* - eval "ac_cv_header_$ac_safe=yes" -else - echo "$ac_err" >&5 - rm -rf conftest* - eval "ac_cv_header_$ac_safe=no" -fi -rm -f conftest* -fi -if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_hdr=HAVE_`echo $ac_hdr | tr '[a-z]./\055' '[A-Z]___'` - cat >> confdefs.h <&6 -fi -done - - - - -trap '' 1 2 15 -cat > confcache <<\EOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs. It is not useful on other systems. -# If it contains results you don't want to keep, you may remove or edit it. -# -# By default, configure uses ./config.cache as the cache file, -# creating it if it does not exist already. You can give configure -# the --cache-file=FILE option to use a different cache file; that is -# what configure does when it calls configure scripts in -# subdirectories, so they share the cache. -# Giving --cache-file=/dev/null disables caching, for debugging configure. -# config.status only pays attention to the cache file if you give it the -# --recheck option to rerun configure. -# -EOF -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -(set) 2>&1 | - sed -n "s/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=\${\1='\2'}/p" \ - >> confcache -if cmp -s $cache_file confcache; then - : -else - if test -w $cache_file; then - echo "updating cache $cache_file" - cat confcache > $cache_file - else - echo "not updating unwritable cache $cache_file" - fi -fi -rm -f confcache - -trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 - -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - -# Any assignment to VPATH causes Sun make to only execute -# the first set of double-colon rules, so remove it if not needed. -# If there is a colon in the path, we need to keep it. -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' -fi - -trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 - -# Transform confdefs.h into DEFS. -# Protect against shell expansion while executing Makefile rules. -# Protect against Makefile macro expansion. -cat > conftest.defs <<\EOF -s%#define \([A-Za-z_][A-Za-z0-9_]*\) \(.*\)%-D\1=\2%g -s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g -s%\[%\\&%g -s%\]%\\&%g -s%\$%$$%g -EOF -DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '` -rm -f conftest.defs - - -# Without the "./", some shells look in PATH for config.status. -: ${CONFIG_STATUS=./config.status} - -echo creating $CONFIG_STATUS -rm -f $CONFIG_STATUS -cat > $CONFIG_STATUS </dev/null | sed 1q`: -# -# $0 $ac_configure_args -# -# Compiler output produced by configure, useful for debugging -# configure, is in ./config.log if it exists. - -ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" -for ac_option -do - case "\$ac_option" in - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" - exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; - -version | --version | --versio | --versi | --vers | --ver | --ve | --v) - echo "$CONFIG_STATUS generated by autoconf version 2.4" - exit 0 ;; - -help | --help | --hel | --he | --h) - echo "\$ac_cs_usage"; exit 0 ;; - *) echo "\$ac_cs_usage"; exit 1 ;; - esac -done - -ac_given_srcdir=$srcdir - -trap 'rm -fr `echo "Makefile" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 - -# Protect against being on the right side of a sed subst in config.status. -sed 's/%@/@@/; s/@%/@@/; s/%g$/@g/; /@g$/s/[\\\\&%]/\\\\&/g; - s/@@/%@/; s/@@/@%/; s/@g$/%g/' > conftest.subs <<\CEOF -$ac_vpsub -$extrasub -s%@CFLAGS@%$CFLAGS%g -s%@CPPFLAGS@%$CPPFLAGS%g -s%@CXXFLAGS@%$CXXFLAGS%g -s%@DEFS@%$DEFS%g -s%@LDFLAGS@%$LDFLAGS%g -s%@LIBS@%$LIBS%g -s%@exec_prefix@%$exec_prefix%g -s%@prefix@%$prefix%g -s%@program_transform_name@%$program_transform_name%g -s%@CC@%$CC%g -s%@CPPEXEC@%$CPPEXEC%g -s%@CPP@%$CPP%g - -CEOF -EOF -cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF -for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then - # Support "outfile[:infile]", defaulting infile="outfile.in". - case "$ac_file" in - *:*) ac_file_in=`echo "$ac_file"|sed 's%.*:%%'` - ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; - *) ac_file_in="${ac_file}.in" ;; - esac - - # Adjust relative srcdir, etc. for subdirectories. - - # Remove last slash and all that follows it. Not all systems have dirname. - ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` - if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then - # The file is in a subdirectory. - test ! -d "$ac_dir" && mkdir "$ac_dir" - ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" - # A "../" for each directory in $ac_dir_suffix. - ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` - else - ac_dir_suffix= ac_dots= - fi - - case "$ac_given_srcdir" in - .) srcdir=. - if test -z "$ac_dots"; then top_srcdir=. - else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; - /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; - *) # Relative path. - srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" - top_srcdir="$ac_dots$ac_given_srcdir" ;; - esac - - echo creating "$ac_file" - rm -f "$ac_file" - configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." - case "$ac_file" in - *Makefile*) ac_comsub="1i\\ -# $configure_input" ;; - *) ac_comsub= ;; - esac - sed -e "$ac_comsub -s%@configure_input@%$configure_input%g -s%@srcdir@%$srcdir%g -s%@top_srcdir@%$top_srcdir%g -" -f conftest.subs $ac_given_srcdir/$ac_file_in > $ac_file -fi; done -rm -f conftest.subs - - - -exit 0 -EOF -chmod +x $CONFIG_STATUS -rm -fr confdefs* $ac_clean_files -test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 - diff -Nru acm-5.0/dis/disgen/configure.in acm-6.0+20200416/dis/disgen/configure.in --- acm-5.0/dis/disgen/configure.in 1996-09-29 15:09:50.000000000 +0000 +++ acm-6.0+20200416/dis/disgen/configure.in 1970-01-01 00:00:00.000000000 +0000 @@ -1,26 +0,0 @@ -dnl Process this file with autoconf to produce a configure script. -AC_INIT(rpc_clntout.c) - -dnl Checks for programs. -AC_PROG_CC - -dnl Find exec path to cpp -AC_SUBST(CPPEXEC) -for i in /usr/ccs/lib/cpp /usr/local/bin/cpp /usr/lib/cpp /usr/bin/cpp /lib/cpp ; do - if test -x $i ; then - CPPEXEC=$i - fi -done - -dnl Checks for libraries. - -dnl Checks for header files. -AC_HEADER_STDC -AC_CHECK_HEADERS(sys/file.h) -AC_CHECK_HEADERS(strings.h) - -dnl Checks for typedefs, structures, and compiler characteristics. - -dnl Checks for library functions. - -AC_OUTPUT(Makefile) diff -Nru acm-5.0/dis/disgen/disgen.1 acm-6.0+20200416/dis/disgen/disgen.1 --- acm-5.0/dis/disgen/disgen.1 1995-11-06 17:03:12.000000000 +0000 +++ acm-6.0+20200416/dis/disgen/disgen.1 1970-01-01 00:00:00.000000000 +0000 @@ -1,416 +0,0 @@ -.TH DISGEN 1 "1 November 1995" -.SH NAME -disgen \- DIS protocol compiler -.SH SYNOPSIS -.BI disgen " infile" -.br -.B disgen -[ -.BI \-D name [= value ] -] [ -.B \-I -[ -.BI \-K " seconds" -] ] [ -.B \-L -] [ -.B \-T -] -.I infile -.br -.B disgen -.B "\-c \|| \|\-h \|| \|\-l \|| \|\-m \|| \|\-t" -[ -.BI \-o " outfile" -] -[ -.I infile -] -.br -.B disgen -.B \-s -.I transport -[ -.BI \-o " outfile" -] -[ -.I infile -] -.SH DESCRIPTION -.IX "compilers" disgen "" "\fLdisgen\fR \(em generate RPC protocols, C header files" -.IX disgen "" "\fLdisgen\fR \(em generate RPC protocol, C header files, and server skeleton" -.IX RPC "generate protocols \(em \fLdisgen\fR" -.LP -.B disgen -generates C code to implement the -.SM Distributed Interactive Simulation -protocol. -The input to -.B disgen -is a language similar to C -known as the -.SM RPC -Language (Remote Procedure Call Language). -Information about the syntax of -.SM RPC -Language is available in the -.RI ` rpcgen ' " Programming Guide" -in the -.TX NETP -manual. -.LP -.B disgen -is normally used as in the first synopsis where it takes an input file -and generates four output files. -If the -.I infile -is named -.BR proto.x , -then -.B disgen -generates a header file in -.BR proto.h , -.SM XDR -routines in -.BR proto_xdr.c , -server side stubs in -.BR proto_svc.c , -and client side stubs in -.BR proto_clnt.c . -With the -.B \-T -option, it also generates the -.SM RPC -dispatch table in -.BR proto_tbl.i . -.LP -The second synposis provides special features which -allow for the creation of more sophisticated -.SM RPC -servers. -These features include support for -.SM RPC -dispatch tables, -and user provided -.BR #defines . -The entries in the -.SM RPC -dispatch table contain: -.LP -.RS -.PD 0 -.TP 3 -\(bu -pointers to the service routine corresponding -to that procedure -.TP -\(bu -a pointer to the input and output arguments -.TP -\(bu -the size of these routines -.PD -.RE -.LP -A server can use the dispatch table to check authorization -and then to execute the service routine; -a client library may use it to deal with the details -of storage management and -.SM XDR -data conversion. -.LP -The other two synopses shown above are used when one does not want to -generate all the output files, but only a particular one. Their -usage is described in the -.SM EXAMPLES -section below. -.LP -The C-preprocessor, -.BR cpp (1), -is run on the input file before it is actually -interpreted by -.BR disgen , -so all the -.B cpp -directives are legal within an -.B disgen -input file. For each type of output file, -.B disgen -defines a special -.B cpp -symbol for use by the -.B disgen -programmer: -.LP -.RS -.PD 0 -.TP 12 -.SB RPC_HDR -defined when compiling into header files -.TP -.SB RPC_XDR -defined when compiling into -.SM XDR -routines -.TP -.SB RPC_SVC -defined when compiling into server side stubs -.TP -.SB RPC_CLNT -defined when compiling into client side stubs -.TP -.SB RPC_TBL -defined when compiling into -.SM RPC -dispatch tables -.PD -.RE -.LP -In addition, -.B disgen -does a little preprocessing of its own. -Any line beginning with -.RB ` % ' -is passed directly into the output file, uninterpreted by -.BR disgen . -For every data type referred to in -.IR infile , -.B disgen -assumes that there exists a routine with the string -.RB ` xdr_ ' -prepended to the data type. -If this routine does not exist in the -.SM RPC/XDR -library, it must be provided. -Providing an undefined data type -allows customization of -.SM XDR -routines. -.SH OPTIONS -.TP 12 -.B \-c -Compile into -.SM XDR -routines. -.TP -.BI \-D name [= value ] -Define a symbol -.IR name . -Equivalent to the -.B #define -directive in the source. -If no -.I value -is given, -.I name -is defined as 1. -This option may be called more than once. -.TP -.B \-h -Compile into C data-definitions (a header file). -The -.B \-T -option can be used in conjunction to produce a header file which supports -.SM RPC -dispatch tables. -.TP -.B \-I -Compile support for -.BR inetd (8C) -in the server side stubs. -Such servers can be self started or can be started by -.BR inetd . -When the server is self-started, it backgrounds itself by default. -A special define symbol -.SB RPC_SVC_FG -can be used to run the server process in foreground, or alternately the -user may just compile it without the -.B \-I -option. -If there are no pending client requests, the -.B inetd -servers exit after 120 seconds (default). -The default can be changed with the -.B \-K -option. -All the error messages for -.B inetd -servers are always logged in with -.BR syslog (3). -.TP -.BI \-K " seconds" -If the server was started by -.BR inetd , -specify the time in seconds after which the server should exit if there is -no further activity. -This option is useful for customization. -If -.I seconds -is 0, the server exits after serving that given request. -If -.I seconds -is -\-1, the server hangs around for ever after being started by -.BR inetd . -This option is valid only with the -.B \-I -option. -.TP -.B \-l -Compile into client side stubs. -.TP -.B \-L -When the servers are started in foreground, use -.B syslog(\|) -to log the server errors instead of printing them on the standard error. -.TP -.B \-m -Compile into server side stubs, but do not generate a \*(lqmain\*(rq routine. -This option is useful for doing callback-routines and for people who -need to write their own \*(lqmain\*(rq routine to do initialization. -For -.B inetd -support, they should be compiled with the -.B \-I -option. In such cases, it defines 2 global variables: -.B _rpcpmstart -and -.BR _rpcfdtype . -The value of -.B _rpcpmstart -should be 1 or 0 depending upon whether it was started by -.B inetd -or not. The value of -.B _rpcfdtype -should be -.SB SOCK_STREAM -or -.SB SOCK_DGRAM -depending upon the type of the connection. -.TP -.BI \-o " outfile" -Specify the name of the output file. -If none is specified, the standard output is used -.RB ( \-c , -.BR \-h , -.BR \-l , -.BR \-m , -.B \-s -and -.B \-t -modes only). -.TP -.BI \-s " transport" -Compile into server side stubs for the given transport. -The supported transports are -.B udp -and -.BR tcp . -This option may be called more than once -so as to compile a server that serves multiple transports. -For -.B inetd -support, they should be compiled with the -.B \-I -option. -.TP -.B \-t -Compile into -.SM RPC -dispatch table. -.TP -.B \-T -Generate the code to support -.SM RPC -dispatch tables. -.LP -The options -.BR \-c , -.BR \-h , -.BR \-l , -.BR \-m , -.B \-s -and -.B \-t -are used exclusively to generate a particular type of file, while the options -.BR \-D , -.BR \-I , -.B \-L -and -.B \-T -are global and can be used with the other options. -.br -.ne 5 -.SH EXAMPLES -.LP -The following example generates all the five files: -.BR prot.h, -.BR prot_clnt.c , -.BR prot_svc.c , -.B prot_xdr.c -and -.BR prot_tbl.i . -The server error messages are logged, instead of being sent -to the standard error. -.IP -.ft B -example% disgen \-LT prot.x -.ft R -.LP -The following example generates -.BR prot.h , -.BR prot_clnt.c , -.B prot_xdr.c -and -.BR prot_svc.c . -.B prot_svc.c -supports server invocation by -.BR inetd . -If the server is started by -.BR inetd , -the server exits after 20 seconds of inactivity. -.IP -.ft B -example% disgen \-I \-K 20 prot.x -.ft R -.LP -The following example sends the header file -(with support for dispatch tables) -on the standard output. -.IP -.ft B -example% disgen \-hT prot.x -.ft R -.LP -The following example sends the server side stubs -file for the transport -.B tcp -on the standard output. -.IP -.ft B -example% disgen \-s tcp prot.x -.ft R -.SH "SEE ALSO" -.BR cpp (1), -.BR rpc (3N), -.BR inetd (8C) -.LP -.RI ` disgen ' " Programming Guide" -in -.TX NETP -.br -.ne 7 -.SH BUGS -.LP -The -.SM RPC -Language does not support nesting of structures. -As a work-around, -structures can be declared at the top-level, -and their name used inside other structures in -order to achieve the same effect. -.LP -Name clashes can occur when using program definitions, since the apparent -scoping does not really apply. -Most of these can be avoided by giving -unique names for programs, versions, procedures and types. diff -Nru acm-5.0/dis/disgen/disgen.dsp acm-6.0+20200416/dis/disgen/disgen.dsp --- acm-5.0/dis/disgen/disgen.dsp 1998-12-06 23:41:31.000000000 +0000 +++ acm-6.0+20200416/dis/disgen/disgen.dsp 1970-01-01 00:00:00.000000000 +0000 @@ -1,197 +0,0 @@ -# Microsoft Developer Studio Project File - Name="disgen" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 5.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -CFG=disgen - Win32 Professional Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "disgen.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "disgen.mak" CFG="disgen - Win32 Professional Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "disgen - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "disgen - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE "disgen - Win32 Professional Release" (based on\ - "Win32 (x86) Console Application") -!MESSAGE "disgen - Win32 Professional Debug" (based on\ - "Win32 (x86) Console Application") -!MESSAGE - -# Begin Project -# PROP Scc_ProjName "disgen" -# PROP Scc_LocalPath "." -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "disgen - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir ".\Release" -# PROP BASE Intermediate_Dir ".\Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "..\..\Release" -# PROP Intermediate_Dir ".\Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /YX /c -# ADD CPP /nologo /MD /W3 /GX /O2 /I "c:\source\include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /YX /FD /c -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 - -!ELSEIF "$(CFG)" == "disgen - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir ".\Debug" -# PROP BASE Intermediate_Dir ".\Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "..\..\Debug" -# PROP Intermediate_Dir ".\Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /YX /c -# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "c:\source\include" /D "_CONSOLE" /D "_DEBUG" /D "WIN32" /YX /FD /c -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 - -!ELSEIF "$(CFG)" == "disgen - Win32 Professional Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "disgen__" -# PROP BASE Intermediate_Dir "disgen__" -# PROP BASE Ignore_Export_Lib 0 -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "disgen__" -# PROP Intermediate_Dir "disgen__" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /I "c:\source\include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /YX /FD /c -# ADD CPP /nologo /W3 /GX /O2 /I "c:\source\include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /YX /FD /c -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 - -!ELSEIF "$(CFG)" == "disgen - Win32 Professional Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "disgen_0" -# PROP BASE Intermediate_Dir "disgen_0" -# PROP BASE Ignore_Export_Lib 0 -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "disgen_0" -# PROP Intermediate_Dir "disgen_0" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /I "c:\source\include" /D "_CONSOLE" /D "_DEBUG" /D "WIN32" /YX /FD /c -# ADD CPP /nologo /W3 /Gm /GX /Zi /Od /I "c:\source\include" /D "_CONSOLE" /D "_DEBUG" /D "WIN32" /YX /FD /c -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 - -!ENDIF - -# Begin Target - -# Name "disgen - Win32 Release" -# Name "disgen - Win32 Debug" -# Name "disgen - Win32 Professional Release" -# Name "disgen - Win32 Professional Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;hpj;bat;for;f90" -# Begin Source File - -SOURCE=.\rpc_clntout.c -# End Source File -# Begin Source File - -SOURCE=.\rpc_cout.c -# End Source File -# Begin Source File - -SOURCE=.\rpc_hout.c -# End Source File -# Begin Source File - -SOURCE=.\rpc_main.c -# End Source File -# Begin Source File - -SOURCE=.\rpc_parse.c -# End Source File -# Begin Source File - -SOURCE=.\rpc_scan.c -# End Source File -# Begin Source File - -SOURCE=.\rpc_svcout.c -# End Source File -# Begin Source File - -SOURCE=.\rpc_util.c -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl;fi;fd" -# Begin Source File - -SOURCE=.\rpc_parse.h -# End Source File -# Begin Source File - -SOURCE=.\rpc_scan.h -# End Source File -# Begin Source File - -SOURCE=.\rpc_util.h -# End Source File -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe" -# End Group -# End Target -# End Project diff -Nru acm-5.0/dis/disgen/disgen.dsw acm-6.0+20200416/dis/disgen/disgen.dsw --- acm-5.0/dis/disgen/disgen.dsw 1998-08-14 21:16:30.000000000 +0000 +++ acm-6.0+20200416/dis/disgen/disgen.dsw 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ -Microsoft Developer Studio Workspace File, Format Version 5.00 -# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! - -############################################################################### - -Project: "disgen"=.\disgen.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Global: - -Package=<5> -{{{ -}}} - -Package=<3> -{{{ -}}} - -############################################################################### - diff -Nru acm-5.0/dis/disgen/disgen.mak acm-6.0+20200416/dis/disgen/disgen.mak --- acm-5.0/dis/disgen/disgen.mak 1997-03-30 22:21:32.000000000 +0000 +++ acm-6.0+20200416/dis/disgen/disgen.mak 1970-01-01 00:00:00.000000000 +0000 @@ -1,322 +0,0 @@ -# Microsoft Developer Studio Generated NMAKE File, Format Version 4.20 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -!IF "$(CFG)" == "" -CFG=disgen - Win32 Debug -!MESSAGE No configuration specified. Defaulting to disgen - Win32 Debug. -!ENDIF - -!IF "$(CFG)" != "disgen - Win32 Release" && "$(CFG)" != "disgen - Win32 Debug" -!MESSAGE Invalid configuration "$(CFG)" specified. -!MESSAGE You can specify a configuration when running NMAKE on this makefile -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "disgen.mak" CFG="disgen - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "disgen - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "disgen - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE -!ERROR An invalid configuration is specified. -!ENDIF - -!IF "$(OS)" == "Windows_NT" -NULL= -!ELSE -NULL=nul -!ENDIF -################################################################################ -# Begin Project -# PROP Target_Last_Scanned "disgen - Win32 Debug" -RSC=rc.exe -CPP=cl.exe - -!IF "$(CFG)" == "disgen - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Target_Dir "" -OUTDIR=.\Release -INTDIR=.\Release - -ALL : "$(OUTDIR)\disgen.exe" - -CLEAN : - -@erase "$(INTDIR)\rpc_clntout.obj" - -@erase "$(INTDIR)\rpc_cout.obj" - -@erase "$(INTDIR)\rpc_hout.obj" - -@erase "$(INTDIR)\rpc_main.obj" - -@erase "$(INTDIR)\rpc_parse.obj" - -@erase "$(INTDIR)\rpc_scan.obj" - -@erase "$(INTDIR)\rpc_svcout.obj" - -@erase "$(INTDIR)\rpc_util.obj" - -@erase "$(OUTDIR)\disgen.exe" - -"$(OUTDIR)" : - if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" - -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /YX /c -# ADD CPP /nologo /W3 /GX /O2 /I "c:\source\include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /YX /c -CPP_PROJ=/nologo /ML /W3 /GX /O2 /I "c:\source\include" /D "WIN32" /D "NDEBUG"\ - /D "_CONSOLE" /Fp"$(INTDIR)/disgen.pch" /YX /Fo"$(INTDIR)/" /c -CPP_OBJS=.\Release/ -CPP_SBRS=.\. -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -BSC32_FLAGS=/nologo /o"$(OUTDIR)/disgen.bsc" -BSC32_SBRS= \ - -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\ - advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib\ - odbccp32.lib /nologo /subsystem:console /incremental:no\ - /pdb:"$(OUTDIR)/disgen.pdb" /machine:I386 /out:"$(OUTDIR)/disgen.exe" -LINK32_OBJS= \ - "$(INTDIR)\rpc_clntout.obj" \ - "$(INTDIR)\rpc_cout.obj" \ - "$(INTDIR)\rpc_hout.obj" \ - "$(INTDIR)\rpc_main.obj" \ - "$(INTDIR)\rpc_parse.obj" \ - "$(INTDIR)\rpc_scan.obj" \ - "$(INTDIR)\rpc_svcout.obj" \ - "$(INTDIR)\rpc_util.obj" - -"$(OUTDIR)\disgen.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) - $(LINK32) @<< - $(LINK32_FLAGS) $(LINK32_OBJS) -<< - -!ELSEIF "$(CFG)" == "disgen - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Target_Dir "" -OUTDIR=.\Debug -INTDIR=.\Debug - -ALL : "$(OUTDIR)\disgen.exe" - -CLEAN : - -@erase "$(INTDIR)\rpc_clntout.obj" - -@erase "$(INTDIR)\rpc_cout.obj" - -@erase "$(INTDIR)\rpc_hout.obj" - -@erase "$(INTDIR)\rpc_main.obj" - -@erase "$(INTDIR)\rpc_parse.obj" - -@erase "$(INTDIR)\rpc_scan.obj" - -@erase "$(INTDIR)\rpc_svcout.obj" - -@erase "$(INTDIR)\rpc_util.obj" - -@erase "$(INTDIR)\vc40.idb" - -@erase "$(INTDIR)\vc40.pdb" - -@erase "$(OUTDIR)\disgen.exe" - -@erase "$(OUTDIR)\disgen.ilk" - -@erase "$(OUTDIR)\disgen.pdb" - -"$(OUTDIR)" : - if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" - -# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /YX /c -# ADD CPP /nologo /W3 /Gm /GX /Zi /Od /I "c:\source\include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /YX /c -CPP_PROJ=/nologo /MLd /W3 /Gm /GX /Zi /Od /I "c:\source\include" /D "WIN32" /D\ - "_DEBUG" /D "_CONSOLE" /Fp"$(INTDIR)/disgen.pch" /YX /Fo"$(INTDIR)/"\ - /Fd"$(INTDIR)/" /c -CPP_OBJS=.\Debug/ -CPP_SBRS=.\. -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -BSC32_FLAGS=/nologo /o"$(OUTDIR)/disgen.bsc" -BSC32_SBRS= \ - -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 -LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\ - advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib\ - odbccp32.lib /nologo /subsystem:console /incremental:yes\ - /pdb:"$(OUTDIR)/disgen.pdb" /debug /machine:I386 /out:"$(OUTDIR)/disgen.exe" -LINK32_OBJS= \ - "$(INTDIR)\rpc_clntout.obj" \ - "$(INTDIR)\rpc_cout.obj" \ - "$(INTDIR)\rpc_hout.obj" \ - "$(INTDIR)\rpc_main.obj" \ - "$(INTDIR)\rpc_parse.obj" \ - "$(INTDIR)\rpc_scan.obj" \ - "$(INTDIR)\rpc_svcout.obj" \ - "$(INTDIR)\rpc_util.obj" - -"$(OUTDIR)\disgen.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) - $(LINK32) @<< - $(LINK32_FLAGS) $(LINK32_OBJS) -<< - -!ENDIF - -.c{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.cpp{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.cxx{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.c{$(CPP_SBRS)}.sbr: - $(CPP) $(CPP_PROJ) $< - -.cpp{$(CPP_SBRS)}.sbr: - $(CPP) $(CPP_PROJ) $< - -.cxx{$(CPP_SBRS)}.sbr: - $(CPP) $(CPP_PROJ) $< - -################################################################################ -# Begin Target - -# Name "disgen - Win32 Release" -# Name "disgen - Win32 Debug" - -!IF "$(CFG)" == "disgen - Win32 Release" - -!ELSEIF "$(CFG)" == "disgen - Win32 Debug" - -!ENDIF - -################################################################################ -# Begin Source File - -SOURCE=.\rpc_util.c -DEP_CPP_RPC_U=\ - ".\rpc_parse.h"\ - ".\rpc_scan.h"\ - ".\rpc_util.h"\ - - -"$(INTDIR)\rpc_util.obj" : $(SOURCE) $(DEP_CPP_RPC_U) "$(INTDIR)" - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\rpc_cout.c -DEP_CPP_RPC_C=\ - ".\rpc_parse.h"\ - ".\rpc_util.h"\ - - -"$(INTDIR)\rpc_cout.obj" : $(SOURCE) $(DEP_CPP_RPC_C) "$(INTDIR)" - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\rpc_hout.c -DEP_CPP_RPC_H=\ - ".\rpc_parse.h"\ - ".\rpc_util.h"\ - - -"$(INTDIR)\rpc_hout.obj" : $(SOURCE) $(DEP_CPP_RPC_H) "$(INTDIR)" - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\rpc_main.c -DEP_CPP_RPC_M=\ - ".\rpc_parse.h"\ - ".\rpc_scan.h"\ - ".\rpc_util.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\fcntl.h"\ - "\source\include\sys\file.h"\ - "\source\include\sys\unistd.h"\ - {$(INCLUDE)}"\sys\types.h"\ - - -"$(INTDIR)\rpc_main.obj" : $(SOURCE) $(DEP_CPP_RPC_M) "$(INTDIR)" - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\rpc_parse.c -DEP_CPP_RPC_P=\ - ".\rpc_parse.h"\ - ".\rpc_scan.h"\ - ".\rpc_util.h"\ - - -"$(INTDIR)\rpc_parse.obj" : $(SOURCE) $(DEP_CPP_RPC_P) "$(INTDIR)" - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\rpc_scan.c -DEP_CPP_RPC_S=\ - ".\rpc_scan.h"\ - ".\rpc_util.h"\ - - -"$(INTDIR)\rpc_scan.obj" : $(SOURCE) $(DEP_CPP_RPC_S) "$(INTDIR)" - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\rpc_svcout.c -DEP_CPP_RPC_SV=\ - ".\rpc_parse.h"\ - ".\rpc_util.h"\ - - -"$(INTDIR)\rpc_svcout.obj" : $(SOURCE) $(DEP_CPP_RPC_SV) "$(INTDIR)" - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\rpc_clntout.c -DEP_CPP_RPC_CL=\ - ".\rpc_parse.h"\ - ".\rpc_util.h"\ - - -"$(INTDIR)\rpc_clntout.obj" : $(SOURCE) $(DEP_CPP_RPC_CL) "$(INTDIR)" - - -# End Source File -# End Target -# End Project -################################################################################ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/dis/disgen/disgen.mdp and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/dis/disgen/disgen.mdp differ diff -Nru acm-5.0/dis/disgen/Makefile.in acm-6.0+20200416/dis/disgen/Makefile.in --- acm-5.0/dis/disgen/Makefile.in 1998-05-12 03:43:01.000000000 +0000 +++ acm-6.0+20200416/dis/disgen/Makefile.in 1970-01-01 00:00:00.000000000 +0000 @@ -1,35 +0,0 @@ -srcdir = @srcdir@ - VPATH = @srcdir@ - - CC = @CC@ - CFLAGS = @CFLAGS@ @DEFS@ '-DCPPEXEC="@CPPEXEC@"' -LDFLAGS = @LDFLAGS@ - PROG = disgen - SRCS = rpc_clntout.c rpc_cout.c rpc_hout.c rpc_main.c rpc_parse.c \ - rpc_scan.c rpc_svcout.c rpc_util.c - OBJS = rpc_clntout.o rpc_cout.o rpc_hout.o rpc_main.o rpc_parse.o \ - rpc_scan.o rpc_svcout.o rpc_util.o - -# Programs to make tags files. - ETAGS = etags -tw - CTAGS = ctags -tw -tagsrcs = $(SRCS) - -all: $(PROG) - -$(PROG): $(OBJS) - $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(OBJS) - -clean: - rm -f *.o $(PROG) *~ *.bak TAGS tags - -distclean: clean - rm -f Makefile config.* - -check test: - -TAGS: $(tagsrcs) - $(ETAGS) $(tagsrcs) - -tags: $(tagsrcs) - $(CTAGS) $(tagsrcs) diff -Nru acm-5.0/dis/disgen/rpc_clntout.c acm-6.0+20200416/dis/disgen/rpc_clntout.c --- acm-5.0/dis/disgen/rpc_clntout.c 1998-08-14 21:16:34.000000000 +0000 +++ acm-6.0+20200416/dis/disgen/rpc_clntout.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,136 +0,0 @@ -/* @(#)rpc_clntout.c 2.1 88/08/01 4.0 RPCSRC */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -#ifndef lint -/*static char sccsid[] = "from: @(#)rpc_clntout.c 1.2 87/06/24 (C) 1987 SMI";*/ -static char rcsid[] = "$Id: rpc_clntout.c,v 1.2 1998/05/12 03:58:45 riley Exp $"; -#endif - -/* - * rpc_clntout.c, Client-stub outputter for the RPC protocol compiler - * Copyright (C) 1987, Sun Microsytsems, Inc. - */ -#include -#ifdef HAVE_STRINGS_H -#include -#else -#include -#endif -#include "rpc_parse.h" -#include "rpc_util.h" - -#define DEFAULT_TIMEOUT 25 /* in seconds */ - -static int write_program(), printbody(); - - -void -write_stubs() -{ - list *l; - definition *def; - - f_print(fout, - "\n/* Default timeout can be changed using clnt_control() */\n"); - f_print(fout, "static struct timeval TIMEOUT = { %d, 0 };\n", - DEFAULT_TIMEOUT); - for (l = defined; l != NULL; l = l->next) { - def = (definition *) l->val; - if (def->def_kind == DEF_PROGRAM) { - write_program(def); - } - } -} - - -static -write_program(def) - definition *def; -{ - version_list *vp; - proc_list *proc; - - for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) { - for (proc = vp->procs; proc != NULL; proc = proc->next) { - f_print(fout, "\n"); - ptype(proc->res_prefix, proc->res_type, 1); - f_print(fout, "*\n"); - pvname(proc->proc_name, vp->vers_num); - f_print(fout, "(argp, clnt)\n"); - f_print(fout, "\t"); - ptype(proc->arg_prefix, proc->arg_type, 1); - f_print(fout, "*argp;\n"); - f_print(fout, "\tCLIENT *clnt;\n"); - f_print(fout, "{\n"); - printbody(proc); - f_print(fout, "}\n\n"); - } - } - return 0; -} - -static char * -ampr(type) - char *type; -{ - if (isvectordef(type, REL_ALIAS)) { - return (""); - } else { - return ("&"); - } -} - -static -printbody(proc) - proc_list *proc; -{ - f_print(fout, "\tstatic "); - if (streq(proc->res_type, "void")) { - f_print(fout, "char "); - } else { - ptype(proc->res_prefix, proc->res_type, 0); - } - f_print(fout, "res;\n"); - f_print(fout, "\n"); - f_print(fout, "\tbzero((char *)%sres, sizeof(res));\n", - ampr(proc->res_type)); - f_print(fout, - "\tif (clnt_call(clnt, %s, xdr_%s, argp, xdr_%s, %sres, TIMEOUT) != RPC_SUCCESS) {\n", - proc->proc_name, stringfix(proc->arg_type), - stringfix(proc->res_type), ampr(proc->res_type)); - f_print(fout, "\t\treturn (NULL);\n"); - f_print(fout, "\t}\n"); - if (streq(proc->res_type, "void")) { - f_print(fout, "\treturn ((void *)%sres);\n", - ampr(proc->res_type)); - } else { - f_print(fout, "\treturn (%sres);\n", ampr(proc->res_type)); - } - return 0; -} diff -Nru acm-5.0/dis/disgen/rpc_cout.c acm-6.0+20200416/dis/disgen/rpc_cout.c --- acm-5.0/dis/disgen/rpc_cout.c 1998-08-14 21:16:37.000000000 +0000 +++ acm-6.0+20200416/dis/disgen/rpc_cout.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,425 +0,0 @@ -/* @(#)rpc_cout.c 2.1 88/08/01 4.0 RPCSRC */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -#ifndef lint -/*static char sccsid[] = "from: @(#)rpc_cout.c 1.8 87/06/24 (C) 1987 SMI";*/ -static char rcsid[] = "$Id: rpc_cout.c,v 1.2 1998/05/12 03:58:45 riley Exp $"; -#endif - -/* - * rpc_cout.c, XDR routine outputter for the RPC protocol compiler - * Copyright (C) 1987, Sun Microsystems, Inc. - */ -#include -#ifdef HAVE_STRINGS_H -#include -#else -#include -#endif -#include - -#include "rpc_util.h" -#include "rpc_parse.h" - -static void print_header(), print_trailer(), space(), emit_enum(), - emit_union(), emit_struct(), emit_typedef(), print_stat(); - - -/* - * Emit the C-routine for the given definition - */ -void -emit(def) - definition *def; -{ - if (def->def_kind == DEF_PROGRAM || def->def_kind == DEF_CONST) { - return; - } - print_header(def); - switch (def->def_kind) { - case DEF_UNION: - emit_union(def); - break; - case DEF_ENUM: - emit_enum(def); - break; - case DEF_STRUCT: - emit_struct(def); - break; - case DEF_TYPEDEF: - emit_typedef(def); - break; - } - print_trailer(); -} - -static -findtype(def, type) - definition *def; - char *type; -{ - if (def->def_kind == DEF_PROGRAM || def->def_kind == DEF_CONST) { - return (0); - } else { - return (streq(def->def_name, type)); - } -} - -static -undefined(type) - char *type; -{ - definition *def; - - def = (definition *) FINDVAL(defined, type, findtype); - return (def == NULL); -} - - -static void -print_header(def) - definition *def; -{ - space(); - f_print(fout, "bool_t\n"); - f_print(fout, "xdr_%s(xdrs, objp)\n", def->def_name); - f_print(fout, "\tXDR *xdrs;\n"); - f_print(fout, "\t%s ", def->def_name); - if (def->def_kind != DEF_TYPEDEF || - !isvectordef(def->def.ty.old_type, def->def.ty.rel)) { - f_print(fout, "*"); - } - f_print(fout, "objp;\n"); - f_print(fout, "{\n"); -} - -static void -print_trailer() -{ - f_print(fout, "\treturn (TRUE);\n"); - f_print(fout, "}\n"); - space(); -} - - -static void -print_ifopen(indent, name) - int indent; - char *name; -{ - tabify(fout, indent); - f_print(fout, "if (!xdr_%s(xdrs", name); -} - - -static void -print_ifarg(arg) - char *arg; -{ - f_print(fout, ", %s", arg); -} - - -static void -print_ifsizeof(prefix, type) - char *prefix; - char *type; -{ - if (streq(type, "bool")) { - f_print(fout, ", sizeof(bool_t), xdr_bool"); - } else { - f_print(fout, ", sizeof("); - if (undefined(type) && prefix) { - f_print(fout, "%s ", prefix); - } - f_print(fout, "%s), xdr_%s", type, type); - } -} - -static void -print_ifclose(indent) - int indent; -{ - f_print(fout, ")) {\n"); - tabify(fout, indent); - f_print(fout, "\treturn (FALSE);\n"); - tabify(fout, indent); - f_print(fout, "}\n"); -} - -static void -space() -{ - f_print(fout, "\n\n"); -} - -static void -print_ifstat(indent, prefix, type, rel, amax, objname, name) - int indent; - char *prefix; - char *type; - relation rel; - char *amax; - char *objname; - char *name; -{ - char *alt = NULL; - - switch (rel) { - case REL_POINTER: - print_ifopen(indent, "pointer"); - print_ifarg("(char **)"); - f_print(fout, "%s", objname); - print_ifsizeof(prefix, type); - break; - case REL_VECTOR: - if (streq(type, "string")) { - alt = "string"; - } else if (streq(type, "opaque")) { - alt = "opaque"; - } - if (alt) { - print_ifopen(indent, alt); - print_ifarg(objname); - } else { - print_ifopen(indent, "vector"); - print_ifarg("(char *)"); - f_print(fout, "%s", objname); - } - print_ifarg(amax); - if (!alt) { - print_ifsizeof(prefix, type); - } - break; - case REL_ARRAY: - if (streq(type, "string")) { - alt = "string"; - } else if (streq(type, "opaque")) { - alt = "bytes"; - } - if (streq(type, "string")) { - print_ifopen(indent, alt); - print_ifarg(objname); - } else { - if (alt) { - print_ifopen(indent, alt); - } else { - print_ifopen(indent, "array"); - } - print_ifarg("(char **)"); - if (*objname == '&') { - f_print(fout, "%s.%s_val, (u_int *)%s.%s_len", - objname, name, objname, name); - } else { - f_print(fout, "&%s->%s_val, (u_int *)&%s->%s_len", - objname, name, objname, name); - } - } - print_ifarg(amax); - if (!alt) { - print_ifsizeof(prefix, type); - } - break; - case REL_ARRAY2: - if (streq(type, "string")) { - alt = "string"; - } else if (streq(type, "opaque")) { - alt = "bytes"; - } - if (streq(type, "string")) { - print_ifopen(indent, alt); - print_ifarg(objname); - } else { - if (alt) { - print_ifopen(indent, alt); - } else { - print_ifopen(indent, "var_array"); - } - print_ifarg("(char **)"); - if (*objname == '&') { - f_print(fout, "%s,\n\t\tobjp->%s, objp->%s", - objname, amax, amax); - } else { - f_print(fout, "&%s,\n\t\tobjp->%s, objp->%s", - objname, amax, amax); - } - } - if (!alt) { - print_ifsizeof(prefix, type); - } - break; - case REL_ALIAS: - print_ifopen(indent, type); - print_ifarg(objname); - break; - } - print_ifclose(indent); -} - - -/* ARGSUSED */ -static void -emit_enum(def) - definition *def; -{ - print_ifopen(1, "enum"); - print_ifarg("(enum_t *)objp"); - print_ifclose(1); -} - - -static void -emit_union(def) - definition *def; -{ - declaration *dflt; - case_list *cl; - declaration *cs; - char *object; - char *format = "&objp->%s_u.%s"; - - print_stat(&def->def.un.enum_decl); - f_print(fout, "\tswitch (objp->%s) {\n", def->def.un.enum_decl.name); - for (cl = def->def.un.cases; cl != NULL; cl = cl->next) { - cs = &cl->case_decl; - f_print(fout, "\tcase %s:\n", cl->case_name); - if (!streq(cs->type, "void")) { - object = alloc(strlen(def->def_name) + strlen(format) + - strlen(cs->name) + 1); - s_print(object, format, def->def_name, cs->name); - print_ifstat(2, cs->prefix, cs->type, cs->rel, cs->array_max, - object, cs->name); - free(object); - } - f_print(fout, "\t\tbreak;\n"); - } - dflt = def->def.un.default_decl; - if (dflt != NULL) { - if (!streq(dflt->type, "void")) { - f_print(fout, "\tdefault:\n"); - object = alloc(strlen(def->def_name) + strlen(format) + - strlen(dflt->name) + 1); - s_print(object, format, def->def_name, dflt->name); - print_ifstat(2, dflt->prefix, dflt->type, dflt->rel, - dflt->array_max, object, dflt->name); - free(object); - f_print(fout, "\t\tbreak;\n"); - } - } else { - f_print(fout, "\tdefault:\n"); - f_print(fout, "\t\treturn (FALSE);\n"); - } - f_print(fout, "\t}\n"); -} - - - -static void -emit_struct(def) - definition *def; -{ - decl_list *dl; - int size = 0, szof; - definition *d; - char buf[128]; - - for (dl = def->def.st.decls; dl != NULL; dl = dl->next) { - print_stat(&dl->decl); - if (dl->decl.storage == -1) { - d = (definition *) FINDVAL(defined, dl->decl.type, findtype); - if (d) { - if (d->def_kind == DEF_TYPEDEF) { - szof = d->def.ty.old_storage; - } - else { - szof = d->def.st.storage; - } - if (szof != -1) { - if (dl->decl.rel == REL_ARRAY2) { - /* size += szof; */ - sprintf (buf , "( %s * %d )", dl->decl.array_max, szof); - } - else { - size += szof; - sprintf (buf, "%d", szof); - } - fprintf (stderr, " %s %s\n", dl->decl.type, buf); - } - else { - } - } - else { - fprintf (stderr, "* could not determine size of \"%s\"\n", dl->decl.type); - } - } - else { - size += dl->decl.storage; - fprintf (stderr, " %s %d\n", dl->decl.type, dl->decl.storage); - } - } - fprintf (stderr, "%s\t%d\n\n", def->def_name, size); - def->def.st.storage = size; -} - - - - -static void -emit_typedef(def) - definition *def; -{ - char *prefix = def->def.ty.old_prefix; - char *type = def->def.ty.old_type; - char *amax = def->def.ty.array_max; - relation rel = def->def.ty.rel; - - print_ifstat(1, prefix, type, rel, amax, "objp", def->def_name); -} - - - - - -static void -print_stat(dec) - declaration *dec; -{ - char *prefix = dec->prefix; - char *type = dec->type; - char *amax = dec->array_max; - relation rel = dec->rel; - char name[256]; - - if (isvectordef(type, rel)) { - s_print(name, "objp->%s", dec->name); - } else { - s_print(name, "&objp->%s", dec->name); - } - print_ifstat(1, prefix, type, rel, amax, name, dec->name); -} diff -Nru acm-5.0/dis/disgen/rpc_hout.c acm-6.0+20200416/dis/disgen/rpc_hout.c --- acm-5.0/dis/disgen/rpc_hout.c 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/dis/disgen/rpc_hout.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,397 +0,0 @@ -/* @(#)rpc_hout.c 2.1 88/08/01 4.0 RPCSRC */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -#ifndef lint -/*static char sccsid[] = "from: @(#)rpc_hout.c 1.6 87/07/28 (C) 1987 SMI";*/ -static char rcsid[] = "$Id: rpc_hout.c,v 1.2 1998/05/12 03:58:45 riley Exp $"; -#endif - -#include -#include -#include -#include - -static void pconstdef(), pstructdef(), puniondef(), pdefine(), pprogramdef(), - penumdef(), ptypedef(), pdeclaration(); - -static int undefined2(); - -extern void pprocdef(/*proc_list *, version_list **/); - -/* - * rpc_hout.c, Header file outputter for the RPC protocol compiler - * Copyright (C) 1987, Sun Microsystems, Inc. - */ -#include -#include -#include "rpc_util.h" -#include "rpc_parse.h" - - -/* - * Print the C-version of an xdr definition - */ -void -print_datadef(def) - definition *def; -{ - if (def->def_kind != DEF_CONST) { - f_print(fout, "\n"); - } - switch (def->def_kind) { - case DEF_STRUCT: - pstructdef(def); - break; - case DEF_UNION: - puniondef(def); - break; - case DEF_ENUM: - penumdef(def); - break; - case DEF_TYPEDEF: - ptypedef(def); - break; - case DEF_PROGRAM: - pprogramdef(def); - break; - case DEF_CONST: - pconstdef(def); - break; - } - if (def->def_kind != DEF_PROGRAM && def->def_kind != DEF_CONST) { - f_print(fout, "bool_t xdr_%s (XDR *, %s *);\n", - def->def_name, def->def_name); - } - if (def->def_kind != DEF_CONST) { - f_print(fout, "\n"); - } -} - -static void -pconstdef(def) - definition *def; -{ - pdefine(def->def_name, def->def.co); -} - -static void -pstructdef(def) - definition *def; -{ - decl_list *l; - char *name = def->def_name; - - f_print(fout, "struct %s {\n", name); - for (l = def->def.st.decls; l != NULL; l = l->next) { - pdeclaration(name, &l->decl, 1); - } - f_print(fout, "};\n"); - f_print(fout, "typedef struct %s %s;\n", name, name); -} - -static void -puniondef(def) - definition *def; -{ - case_list *l; - char *name = def->def_name; - declaration *decl; - - f_print(fout, "struct %s {\n", name); - decl = &def->def.un.enum_decl; - if (streq(decl->type, "bool")) { - f_print(fout, "\tbool_t %s;\n", decl->name); - } else { - f_print(fout, "\t%s %s;\n", decl->type, decl->name); - } - f_print(fout, "\tunion {\n"); - for (l = def->def.un.cases; l != NULL; l = l->next) { - pdeclaration(name, &l->case_decl, 2); - } - decl = def->def.un.default_decl; - if (decl && !streq(decl->type, "void")) { - pdeclaration(name, decl, 2); - } - f_print(fout, "\t} %s_u;\n", name); - f_print(fout, "};\n"); - f_print(fout, "typedef struct %s %s;\n", name, name); -} - - - -static void -pdefine(name, num) - char *name; - char *num; -{ - f_print(fout, "#define %s %s\n", name, num); -} - -static void -puldefine(name, num) - char *name; - char *num; -{ - f_print(fout, "#define %s ((u_long)%s)\n", name, num); -} - -static int -define_printed(stop, start) - proc_list *stop; - version_list *start; -{ - version_list *vers; - proc_list *proc; - - for (vers = start; vers != NULL; vers = vers->next) { - for (proc = vers->procs; proc != NULL; proc = proc->next) { - if (proc == stop) { - return (0); - } else if (streq(proc->proc_name, stop->proc_name)) { - return (1); - } - } - } - abort(); - /* NOTREACHED */ -} - -static void -pprogramdef(def) - definition *def; -{ - version_list *vers; - proc_list *proc; - - puldefine(def->def_name, def->def.pr.prog_num); - for (vers = def->def.pr.versions; vers != NULL; vers = vers->next) { - puldefine(vers->vers_name, vers->vers_num); - for (proc = vers->procs; proc != NULL; proc = proc->next) { - if (!define_printed(proc, def->def.pr.versions)) { - puldefine(proc->proc_name, proc->proc_num); - } - pprocdef(proc, vers); - } - } -} - -void -pprocdef(proc, vp) - proc_list *proc; - version_list *vp; -{ - f_print(fout, "extern "); - if (proc->res_prefix) { - if (streq(proc->res_prefix, "enum")) { - f_print(fout, "enum "); - } else { - f_print(fout, "struct "); - } - } - if (streq(proc->res_type, "bool")) { - f_print(fout, "bool_t *"); - } else if (streq(proc->res_type, "string")) { - f_print(fout, "char **"); - } else { - f_print(fout, "%s *", fixtype(proc->res_type)); - } - pvname(proc->proc_name, vp->vers_num); - f_print(fout, "();\n"); -} - -static void -penumdef(def) - definition *def; -{ - char *name = def->def_name; - enumval_list *l; - char *last = NULL; - int count = 0; - - f_print(fout, "enum %s {\n", name); - for (l = def->def.en.vals; l != NULL; l = l->next) { - f_print(fout, "\t%s", l->name); - if (l->assignment) { - f_print(fout, " = %s", l->assignment); - last = l->assignment; - count = 1; - } else { - if (last == NULL) { - f_print(fout, " = %d", count++); - } else { - f_print(fout, " = %s + %d", last, count++); - } - } - f_print(fout, ",\n"); - } - f_print(fout, "};\n"); - f_print(fout, "typedef enum %s %s;\n", name, name); -} - -static void -ptypedef(def) - definition *def; -{ - char *name = def->def_name; - char *old = def->def.ty.old_type; - char prefix[8]; /* enough to contain "struct ", including NUL */ - relation rel = def->def.ty.rel; - - if (strncmp (old, "byte_", 5) == 0) { - old += 5; - } - - if (!streq(name, old)) { - if (streq(old, "string")) { - old = "char"; - rel = REL_POINTER; - } else if (streq(old, "opaque")) { - old = "char"; - } else if (streq(old, "bool")) { - old = "bool_t"; - } - if (undefined2(old, name) && def->def.ty.old_prefix) { - s_print(prefix, "%s ", def->def.ty.old_prefix); - } else { - prefix[0] = 0; - } - f_print(fout, "typedef "); - switch (rel) { - case REL_ARRAY: - f_print(fout, "struct {\n"); - f_print(fout, "\tu_int %s_len;\n", name); - f_print(fout, "\t%s%s *%s_val;\n", prefix, old, name); - f_print(fout, "} %s", name); - break; - case REL_ARRAY2: - f_print(fout, "%s *%s\n", prefix, name); - break; - case REL_POINTER: - f_print(fout, "%s%s *%s", prefix, old, name); - break; - case REL_VECTOR: - f_print(fout, "%s%s %s[%s]", prefix, old, name, - def->def.ty.array_max); - break; - case REL_ALIAS: - f_print(fout, "%s%s %s", prefix, old, name); - break; - } - f_print(fout, ";\n"); - } -} - - -static void -pdeclaration(name, dec, tab) - char *name; - declaration *dec; - int tab; -{ - char buf[8]; /* enough to hold "struct ", include NUL */ - char *prefix; - char *type; - - if (streq(dec->type, "void")) { - return; - } - tabify(fout, tab); - if (streq(dec->type, name) && !dec->prefix) { - f_print(fout, "struct "); - } - if (streq(dec->type, "string")) { - f_print(fout, "char *%s", dec->name); - } else { - prefix = ""; - if (streq(dec->type, "bool")) { - type = "bool_t"; - } else if (streq(dec->type, "opaque")) { - type = "char"; - } else { - if (dec->prefix) { - s_print(buf, "%s ", dec->prefix); - prefix = buf; - } - if (strncmp(dec->type, "byte_", 5) == 0) { - type = dec->type + 5; - } - else { - type = dec->type; - } - } - switch (dec->rel) { - case REL_ALIAS: - f_print(fout, "%s%s %s", prefix, type, dec->name); - break; - case REL_VECTOR: - f_print(fout, "%s%s %s[%s]", prefix, type, dec->name, - dec->array_max); - break; - case REL_POINTER: - f_print(fout, "%s%s *%s", prefix, type, dec->name); - break; - case REL_ARRAY: - f_print(fout, "struct {\n"); - tabify(fout, tab); - f_print(fout, "\tu_int %s_len;\n", dec->name); - tabify(fout, tab); - f_print(fout, "\t%s%s *%s_val;\n", prefix, type, dec->name); - tabify(fout, tab); - f_print(fout, "} %s", dec->name); - break; - case REL_ARRAY2: - f_print(fout, "%s%s *%s", prefix, type, dec->name); - break; - } - } - f_print(fout, ";\n"); -} - - - -static int -undefined2(type, stop) - char *type; - char *stop; -{ - list *l; - definition *def; - - for (l = defined; l != NULL; l = l->next) { - def = (definition *) l->val; - if (def->def_kind != DEF_PROGRAM) { - if (streq(def->def_name, stop)) { - return (1); - } else if (streq(def->def_name, type)) { - return (0); - } - } - } - return (1); -} diff -Nru acm-5.0/dis/disgen/rpc_main.c acm-6.0+20200416/dis/disgen/rpc_main.c --- acm-5.0/dis/disgen/rpc_main.c 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/dis/disgen/rpc_main.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,521 +0,0 @@ -/* @(#)rpc_main.c 2.2 88/08/01 4.0 RPCSRC */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -#ifndef lint -/*static char sccsid[] = "from: @(#)rpc_main.c 1.7 87/06/24 (C) 1987 SMI";*/ -static char rcsid[] = "$Id: rpc_main.c,v 1.2 1998/05/12 03:58:45 riley Exp $"; -#endif - -/* - * rpc_main.c, Top level of the RPC protocol compiler. - * Copyright (C) 1987, Sun Microsystems, Inc. - */ - -#include -#include -#include -#include -#ifdef HAVE_SYS_FILE_H -#include -#endif -#include "rpc_util.h" -#include "rpc_parse.h" -#include "rpc_scan.h" -#ifdef WIN32 -#include -#include -#include -#endif -#include - -#define EXTEND 1 /* alias for TRUE */ - -struct commandline { - int cflag; - int hflag; - int lflag; - int sflag; - int mflag; - char *infile; - char *outfile; -}; - -static char *cmdname; -#ifdef WIN32 -static char CPP[] = "cl"; -static char CPPFLAGS[] = "/E"; -#else -#ifndef CPPEXEC -#define CPPEXEC "/lib/cpp" -#endif -static char CPP[] = CPPEXEC; -#ifdef __hpux -static char CPPFLAGS[] = "-PC"; -#else -static char CPPFLAGS[] = "-C"; -#endif -#endif -static char *allv[] = { - "rpcgen", "-s", "udp", "-s", "tcp", - -}; -static int allc = sizeof(allv)/sizeof(allv[0]); - - -static void h_output(), c_output(), s_output(), l_output(), do_registers(); -static int parseargs(); -extern void reinitialize(void), crash(), write_programs(); -static void open_output(char *infile, char *outfile); - -main(argc, argv) - int argc; - char *argv[]; - -{ - struct commandline cmd; - - if (!parseargs(argc, argv, &cmd)) { - f_print(stderr, - "usage: %s infile\n", cmdname); - f_print(stderr, - " %s [-c | -h | -l | -m] [-o outfile] [infile]\n", - cmdname); - f_print(stderr, - " %s [-s udp|tcp]* [-o outfile] [infile]\n", - cmdname); - exit(1); - } -#ifdef WIN32 - if (cmd.cflag) { - c_output(cmd.infile, "/D \"RPC_XDR\"", !EXTEND, cmd.outfile); - } else if (cmd.hflag) { - h_output(cmd.infile, "/D \"RPC_HDR\"", !EXTEND, cmd.outfile); - } else if (cmd.lflag) { - l_output(cmd.infile, "/D \"RPC_CLNT\"", !EXTEND, cmd.outfile); - } else if (cmd.sflag || cmd.mflag) { - s_output(argc, argv, cmd.infile, "/D \"RPC_SVC\"", !EXTEND, - cmd.outfile, cmd.mflag); - } else { - c_output(cmd.infile, "/D \"RPC_XDR\"", EXTEND, "_xdr.c"); - reinitialize(); - h_output(cmd.infile, "/D \"RPC_HDR\"", EXTEND, ".h"); - reinitialize(); - l_output(cmd.infile, "/D \"RPC_CLNT\"", EXTEND, "_clnt.c"); - reinitialize(); - s_output(allc, allv, cmd.infile, "/D \"RPC_SVC\"", EXTEND, - "_svc.c", cmd.mflag); - } -#else - if (cmd.cflag) { - c_output(cmd.infile, "-DRPC_XDR", !EXTEND, cmd.outfile); - } else if (cmd.hflag) { - h_output(cmd.infile, "-DRPC_HDR", !EXTEND, cmd.outfile); - } else if (cmd.lflag) { - l_output(cmd.infile, "-DRPC_CLNT", !EXTEND, cmd.outfile); - } else if (cmd.sflag || cmd.mflag) { - s_output(argc, argv, cmd.infile, "-DRPC_SVC", !EXTEND, - cmd.outfile, cmd.mflag); - } else { - c_output(cmd.infile, "-DRPC_XDR", EXTEND, "_xdr.c"); - reinitialize(); - h_output(cmd.infile, "-DRPC_HDR", EXTEND, ".h"); - reinitialize(); - l_output(cmd.infile, "-DRPC_CLNT", EXTEND, "_clnt.c"); - reinitialize(); - s_output(allc, allv, cmd.infile, "-DRPC_SVC", EXTEND, - "_svc.c", cmd.mflag); - } -#endif - exit(0); - return 0; -} - -/* - * strip path and add extension to filename - */ -static char * -extendfile(path, ext) - char *path; - char *ext; -{ - char *file; - char *res; - char *p; - - if ((file = (char *) strrchr(path, '/')) == NULL) - file = path; - else - file++; - - res = alloc(strlen(file) + strlen(ext) + 1); - if (res == NULL) { - abort(); - } - p = (char *) strrchr (file, '.'); - if (p == NULL) { - p = file + strlen(file); - } - (void) strcpy(res, file); - (void) strcpy(res + (p - file), ext); - return (res); -} - -/* - * Open output file with given extension - */ -static void -open_output(infile, outfile) - char *infile; - char *outfile; -{ - if (outfile == NULL) { - fout = stdout; - return; - } - if (infile != NULL && streq(outfile, infile)) { - f_print(stderr, "%s: output would overwrite %s\n", cmdname, - infile); - crash(); - } - fout = fopen(outfile, "w"); - if (fout == NULL) { - f_print(stderr, "%s: unable to open ", cmdname); - perror(outfile); - crash(); - } - record_open(outfile); -} - -/* - * Open input file with given define for C-preprocessor - */ -static void -open_input(infile, define) - char *infile; - char *define; -{ - int pd[2]; -#ifdef WIN32 - int s, my_stdout; -#endif - - infilename = (infile == NULL) ? "" : infile; -#ifdef WIN32 - if (_pipe (pd, 1024, _O_TEXT) == -1) { - perror ("_pipe"); - exit (1); - } - my_stdout = _dup (1); - _close (1); - _dup2 (pd[1], 1); - s = _spawnlp (_P_NOWAIT, CPP, CPP, CPPFLAGS, "/C", - "/nologo", define, infile, NULL); - _dup2 (my_stdout, 1); - _close (my_stdout); - if (s == -1) { - perror("_spawnl"); - exit(1); - } - _close(pd[1]); -#else - (void) pipe(pd); - switch (fork()) { - case 0: - (void) close(1); - (void) dup2(pd[1], 1); - (void) close(pd[0]); - execl(CPP, CPP, CPPFLAGS, define, infile, NULL); - perror("execl"); - exit(1); - case -1: - perror("fork"); - exit(1); - } - (void) close(pd[1]); -#endif - fin = fdopen(pd[0], "r"); - if (fin == NULL) { - f_print(stderr, "%s: ", cmdname); - perror(infilename); - crash(); - } -} - -/* - * Compile into an XDR routine output file - */ -static void -c_output(infile, define, extend, outfile) - char *infile; - char *define; - int extend; - char *outfile; -{ - definition *def; - char *include; - char *outfilename; - long tell; - - open_input(infile, define); - outfilename = extend ? extendfile(infile, outfile) : outfile; - open_output(infile, outfilename); -#ifndef __hpux - f_print(fout, "#include \n"); -#endif - if (infile && (include = extendfile(infile, ".h"))) { - f_print(fout, "#include \"%s\"\n", include); - free(include); - } - tell = ftell(fout); - while (def = get_definition()) { - emit(def); - } - if (extend && tell == ftell(fout)) { - (void) unlink(outfilename); - } -} - -/* - * Compile into an XDR header file - */ -static void -h_output(infile, define, extend, outfile) - char *infile; - char *define; - int extend; - char *outfile; -{ - definition *def; - char *outfilename; - long tell; - - open_input(infile, define); - outfilename = extend ? extendfile(infile, outfile) : outfile; - open_output(infile, outfilename); - tell = ftell(fout); - f_print(fout, "#include \n\n"); - while (def = get_definition()) { - print_datadef(def); - } - if (extend && tell == ftell(fout)) { - (void) unlink(outfilename); - } -} - -/* - * Compile into an RPC service - */ -static void -s_output(argc, argv, infile, define, extend, outfile, nomain) - int argc; - char *argv[]; - char *infile; - char *define; - int extend; - char *outfile; - int nomain; -{ - char *include; - definition *def; - int foundprogram; - char *outfilename; - - open_input(infile, define); - outfilename = extend ? extendfile(infile, outfile) : outfile; - open_output(infile, outfilename); - f_print(fout, "#include \n"); -#ifndef __hpux - f_print(fout, "#include \n"); -#endif - if (infile && (include = extendfile(infile, ".h"))) { - f_print(fout, "#include \"%s\"\n", include); - free(include); - } - foundprogram = 0; - while (def = get_definition()) { - foundprogram |= (def->def_kind == DEF_PROGRAM); - } - if (extend && !foundprogram) { - (void) unlink(outfilename); - return; - } - if (nomain) { - write_programs((char *)NULL); - } else { - write_most(); - do_registers(argc, argv); - write_rest(); - write_programs("static"); - } -} - -static void -l_output(infile, define, extend, outfile) - char *infile; - char *define; - int extend; - char *outfile; -{ - char *include; - definition *def; - int foundprogram; - char *outfilename; - - open_input(infile, define); - outfilename = extend ? extendfile(infile, outfile) : outfile; - open_output(infile, outfilename); -#ifndef __hpux - f_print(fout, "#include \n"); -#endif - if (infile && (include = extendfile(infile, ".h"))) { - f_print(fout, "#include \"%s\"\n", include); - free(include); - } - foundprogram = 0; - while (def = get_definition()) { - foundprogram |= (def->def_kind == DEF_PROGRAM); - } - if (extend && !foundprogram) { - (void) unlink(outfilename); - return; - } - write_stubs(); -} - -/* - * Perform registrations for service output - */ -static void -do_registers(argc, argv) - int argc; - char *argv[]; - -{ - int i; - - for (i = 1; i < argc; i++) { - if (streq(argv[i], "-s")) { - write_register(argv[i + 1]); - i++; - } - } -} - -/* - * Parse command line arguments - */ -static -parseargs(argc, argv, cmd) - int argc; - char *argv[]; - struct commandline *cmd; - -{ - int i; - int j; - char c; - char flag[(1 << 8 * sizeof(char))]; - int nflags; - - cmdname = argv[0]; - cmd->infile = cmd->outfile = NULL; - if (argc < 2) { - return (0); - } - flag['c'] = 0; - flag['h'] = 0; - flag['s'] = 0; - flag['o'] = 0; - flag['l'] = 0; - flag['m'] = 0; - for (i = 1; i < argc; i++) { - if (argv[i][0] != '-') { - if (cmd->infile) { - return (0); - } - cmd->infile = argv[i]; - } else { - for (j = 1; argv[i][j] != 0; j++) { - c = argv[i][j]; - switch (c) { - case 'c': - case 'h': - case 'l': - case 'm': - if (flag[c]) { - return (0); - } - flag[c] = 1; - break; - case 'o': - case 's': - if (argv[i][j - 1] != '-' || - argv[i][j + 1] != 0) { - return (0); - } - flag[c] = 1; - if (++i == argc) { - return (0); - } - if (c == 's') { - if (!streq(argv[i], "udp") && - !streq(argv[i], "tcp")) { - return (0); - } - } else if (c == 'o') { - if (cmd->outfile) { - return (0); - } - cmd->outfile = argv[i]; - } - goto nextarg; - - default: - return (0); - } - } - nextarg: - ; - } - } - cmd->cflag = flag['c']; - cmd->hflag = flag['h']; - cmd->sflag = flag['s']; - cmd->lflag = flag['l']; - cmd->mflag = flag['m']; - nflags = cmd->cflag + cmd->hflag + cmd->sflag + cmd->lflag + cmd->mflag; - if (nflags == 0) { - if (cmd->outfile != NULL || cmd->infile == NULL) { - return (0); - } - } else if (nflags > 1) { - return (0); - } - return (1); -} diff -Nru acm-5.0/dis/disgen/rpc_parse.c acm-6.0+20200416/dis/disgen/rpc_parse.c --- acm-5.0/dis/disgen/rpc_parse.c 1998-08-14 21:16:48.000000000 +0000 +++ acm-6.0+20200416/dis/disgen/rpc_parse.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,464 +0,0 @@ -/* @(#)rpc_parse.c 2.1 88/08/01 4.0 RPCSRC */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -#ifndef lint -/*static char sccsid[] = "from: @(#)rpc_parse.c 1.4 87/04/28 (C) 1987 SMI";*/ -static char rcsid[] = "$Id: rpc_parse.c,v 1.2 1998/05/12 03:58:45 riley Exp $"; -#endif - -/* - * rpc_parse.c, Parser for the RPC protocol compiler - * Copyright (C) 1987 Sun Microsystems, Inc. - */ -#include -#include "rpc_util.h" -#include "rpc_scan.h" -#include "rpc_parse.h" -#include -#ifdef HAVE_STRINGS_H -#include -#else -#include -#endif -#include - -static void isdefined(); -static void def_struct(), def_program(), def_enum(), def_const(), - def_union(), def_typedef(), get_declaration(), get_type(), - unsigned_dec(); -/* - * return the next definition you see - */ -definition * -get_definition() -{ - definition *defp; - token tok; - - defp = ALLOC(definition); - get_token(&tok); - switch (tok.kind) { - case TOK_STRUCT: - def_struct(defp); - break; - case TOK_UNION: - def_union(defp); - break; - case TOK_TYPEDEF: - def_typedef(defp); - break; - case TOK_ENUM: - def_enum(defp); - break; - case TOK_PROGRAM: - def_program(defp); - break; - case TOK_CONST: - def_const(defp); - break; - case TOK_EOF: - return (NULL); - break; - default: - error("definition keyword expected"); - } - scan(TOK_SEMICOLON, &tok); - isdefined(defp); - return (defp); -} - -static void -isdefined(defp) - definition *defp; -{ - STOREVAL(&defined, defp); -} - - -static void -def_struct(defp) - definition *defp; -{ - token tok; - declaration dec; - decl_list *decls; - decl_list **tailp; - - defp->def_kind = DEF_STRUCT; - - scan(TOK_IDENT, &tok); - defp->def_name = tok.str; - scan(TOK_LBRACE, &tok); - tailp = &defp->def.st.decls; - do { - get_declaration(&dec, DEF_STRUCT); - decls = ALLOC(decl_list); - decls->decl = dec; - *tailp = decls; - tailp = &decls->next; - scan(TOK_SEMICOLON, &tok); - peek(&tok); - } while (tok.kind != TOK_RBRACE); - get_token(&tok); - *tailp = NULL; -} - -static void -def_program(defp) - definition *defp; -{ - token tok; - version_list *vlist; - version_list **vtailp; - proc_list *plist; - proc_list **ptailp; - int dummy; - - defp->def_kind = DEF_PROGRAM; - scan(TOK_IDENT, &tok); - defp->def_name = tok.str; - scan(TOK_LBRACE, &tok); - vtailp = &defp->def.pr.versions; - scan(TOK_VERSION, &tok); - do { - scan(TOK_IDENT, &tok); - vlist = ALLOC(version_list); - vlist->vers_name = tok.str; - scan(TOK_LBRACE, &tok); - ptailp = &vlist->procs; - do { - plist = ALLOC(proc_list); - get_type(&plist->res_prefix, &plist->res_type, &dummy, DEF_PROGRAM); - if (streq(plist->res_type, "opaque")) { - error("illegal result type"); - } - scan(TOK_IDENT, &tok); - plist->proc_name = tok.str; - scan(TOK_LPAREN, &tok); - get_type(&plist->arg_prefix, &plist->arg_type, &dummy, DEF_PROGRAM); - if (streq(plist->arg_type, "opaque")) { - error("illegal argument type"); - } - scan(TOK_RPAREN, &tok); - scan(TOK_EQUAL, &tok); - scan_num(&tok); - scan(TOK_SEMICOLON, &tok); - plist->proc_num = tok.str; - *ptailp = plist; - ptailp = &plist->next; - peek(&tok); - } while (tok.kind != TOK_RBRACE); - *vtailp = vlist; - vtailp = &vlist->next; - scan(TOK_RBRACE, &tok); - scan(TOK_EQUAL, &tok); - scan_num(&tok); - vlist->vers_num = tok.str; - scan(TOK_SEMICOLON, &tok); - scan2(TOK_VERSION, TOK_RBRACE, &tok); - } while (tok.kind == TOK_VERSION); - scan(TOK_EQUAL, &tok); - scan_num(&tok); - defp->def.pr.prog_num = tok.str; - *vtailp = NULL; -} - -static void -def_enum(defp) - definition *defp; -{ - token tok; - enumval_list *elist; - enumval_list **tailp; - - defp->def_kind = DEF_ENUM; - scan(TOK_IDENT, &tok); - defp->def_name = tok.str; - scan(TOK_LBRACE, &tok); - tailp = &defp->def.en.vals; - do { - scan(TOK_IDENT, &tok); - elist = ALLOC(enumval_list); - elist->name = tok.str; - elist->assignment = NULL; - scan3(TOK_COMMA, TOK_RBRACE, TOK_EQUAL, &tok); - if (tok.kind == TOK_EQUAL) { - scan_num(&tok); - elist->assignment = tok.str; - scan2(TOK_COMMA, TOK_RBRACE, &tok); - } - *tailp = elist; - tailp = &elist->next; - } while (tok.kind != TOK_RBRACE); - *tailp = NULL; -} - -static void -def_const(defp) - definition *defp; -{ - token tok; - - defp->def_kind = DEF_CONST; - scan(TOK_IDENT, &tok); - defp->def_name = tok.str; - scan(TOK_EQUAL, &tok); - scan2(TOK_IDENT, TOK_STRCONST, &tok); - defp->def.co = tok.str; -} - -static void -def_union(defp) - definition *defp; -{ - token tok; - declaration dec; - case_list *cases; - case_list **tailp; - - defp->def_kind = DEF_UNION; - scan(TOK_IDENT, &tok); - defp->def_name = tok.str; - scan(TOK_SWITCH, &tok); - scan(TOK_LPAREN, &tok); - get_declaration(&dec, DEF_UNION); - defp->def.un.enum_decl = dec; - tailp = &defp->def.un.cases; - scan(TOK_RPAREN, &tok); - scan(TOK_LBRACE, &tok); - scan(TOK_CASE, &tok); - while (tok.kind == TOK_CASE) { - scan(TOK_IDENT, &tok); - cases = ALLOC(case_list); - cases->case_name = tok.str; - scan(TOK_COLON, &tok); - get_declaration(&dec, DEF_UNION); - cases->case_decl = dec; - *tailp = cases; - tailp = &cases->next; - scan(TOK_SEMICOLON, &tok); - scan3(TOK_CASE, TOK_DEFAULT, TOK_RBRACE, &tok); - } - *tailp = NULL; - if (tok.kind == TOK_DEFAULT) { - scan(TOK_COLON, &tok); - get_declaration(&dec, DEF_UNION); - defp->def.un.default_decl = ALLOC(declaration); - *defp->def.un.default_decl = dec; - scan(TOK_SEMICOLON, &tok); - scan(TOK_RBRACE, &tok); - } else { - defp->def.un.default_decl = NULL; - } -} - - -static void -def_typedef(defp) - definition *defp; -{ - declaration dec; - - defp->def_kind = DEF_TYPEDEF; - get_declaration(&dec, DEF_TYPEDEF); - defp->def_name = dec.name; - defp->def.ty.old_prefix = dec.prefix; - defp->def.ty.old_type = dec.type; - defp->def.ty.old_storage = dec.storage; - strncpy(defp->def.ty.old_pstorage, dec.pstorage, 128); - defp->def.ty.rel = dec.rel; - defp->def.ty.array_max = dec.array_max; -} - - -static void -get_declaration(dec, dkind) - declaration *dec; - defkind dkind; -{ - token tok; - int count; - - get_type(&dec->prefix, &dec->type, &dec->storage, dkind); - dec->rel = REL_ALIAS; - dec->pstorage[0] = '\0'; - if (streq(dec->type, "void")) { - return; - } - scan2(TOK_STAR, TOK_IDENT, &tok); - if (tok.kind == TOK_STAR) { - dec->rel = REL_POINTER; - scan(TOK_IDENT, &tok); - } - dec->name = tok.str; - if (peekscan(TOK_LBRACKET, &tok)) { - if (dec->rel == REL_POINTER) { - error("no array-of-pointer declarations -- use typedef"); - } - dec->rel = REL_VECTOR; - scan_num(&tok); - if (isdigit(*tok.str)) { - dec->rel = REL_VECTOR; - count = atoi(tok.str); - dec->storage *= count; - } - else { - dec->rel = REL_ARRAY2; - } - dec->array_max = tok.str; - scan(TOK_RBRACKET, &tok); - } else if (peekscan(TOK_LANGLE, &tok)) { - if (dec->rel == REL_POINTER) { - error("no array-of-pointer declarations -- use typedef"); - } - dec->rel = REL_ARRAY; - if (peekscan(TOK_RANGLE, &tok)) { - dec->array_max = "~0"; /* unspecified size, use max */ - } else { - scan_num(&tok); - dec->array_max = tok.str; - scan(TOK_RANGLE, &tok); - } - } - if (streq(dec->type, "opaque")) { - if (dec->rel != REL_ARRAY && dec->rel != REL_VECTOR) { - error("array declaration expected"); - } - } else if (streq(dec->type, "string")) { - if (dec->rel != REL_ARRAY) { - error("variable-length array declaration expected"); - } - } -} - - -static void -get_type(prefixp, typep, stg, dkind) - char **prefixp; - char **typep; - int *stg; - defkind dkind; -{ - token tok; - *stg = -1; - - *prefixp = NULL; - get_token(&tok); - switch (tok.kind) { - case TOK_IDENT: - *typep = tok.str; - break; - case TOK_STRUCT: - case TOK_ENUM: - case TOK_UNION: - *prefixp = tok.str; - scan(TOK_IDENT, &tok); - *typep = tok.str; - break; - case TOK_UNSIGNED: - unsigned_dec(typep, stg); - break; - case TOK_SHORT: - *typep = "byte_short"; - *stg = 2; - (void) peekscan(TOK_INT, &tok); - break; - case TOK_LONG: - *typep = "byte_long"; - *stg = 4; - (void) peekscan(TOK_INT, &tok); - break; - case TOK_VOID: - if (dkind != DEF_UNION && dkind != DEF_PROGRAM) { - error("voids allowed only inside union and program definitions"); - } - *typep = tok.str; - break; - case TOK_STRING: - case TOK_OPAQUE: - case TOK_CHAR: - case TOK_BOOL: - *typep = tok.str; - *stg = 1; - break; - case TOK_FLOAT: - *typep = "byte_float"; - *stg = 4; - break; - case TOK_DOUBLE: - *typep = "byte_double"; - *stg = 8; - break; - case TOK_INT: - *typep = "byte_int"; - *stg = 4; - break; - default: - error("expected type specifier"); - } -} - - -static void -unsigned_dec(typep, stg) - char **typep; - int *stg; -{ - token tok; - - peek(&tok); - switch (tok.kind) { - case TOK_CHAR: - get_token(&tok); - *typep = "byte_u_char"; - *stg = 1; - break; - case TOK_SHORT: - get_token(&tok); - *typep = "byte_u_short"; - *stg = 2; - (void) peekscan(TOK_INT, &tok); - break; - case TOK_LONG: - get_token(&tok); - *typep = "byte_u_long"; - *stg = 4; - (void) peekscan(TOK_INT, &tok); - break; - case TOK_INT: - get_token(&tok); - *typep = "byte_u_int"; - *stg = 4; - break; - default: - *typep = "byte_u_int"; - *stg = 4; - break; - } -} diff -Nru acm-5.0/dis/disgen/rpc_parse.h acm-6.0+20200416/dis/disgen/rpc_parse.h --- acm-5.0/dis/disgen/rpc_parse.h 1998-05-12 03:58:45.000000000 +0000 +++ acm-6.0+20200416/dis/disgen/rpc_parse.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,166 +0,0 @@ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - * - * from: @(#)rpc_parse.h 1.3 87/03/09 (C) 1987 SMI - * $Id: rpc_parse.h,v 1.2 1998/05/12 03:58:45 riley Exp $ - */ - -/* - * rpc_parse.h, Definitions for the RPCL parser - * Copyright (C) 1987, Sun Microsystems, Inc. - */ - -enum defkind { - DEF_CONST, - DEF_STRUCT, - DEF_UNION, - DEF_ENUM, - DEF_TYPEDEF, - DEF_PROGRAM -}; -typedef enum defkind defkind; - -typedef char *const_def; - -enum relation { - REL_VECTOR, /* fixed length array */ - REL_ARRAY, /* variable length array */ - REL_ARRAY2, /* variable length array, count based on variable */ - REL_POINTER, /* pointer */ - REL_ALIAS /* simple */ -}; -typedef enum relation relation; - -struct typedef_def { - char *old_prefix; - char *old_type; - int old_storage; - char old_pstorage[128]; - relation rel; - char *array_max; -}; -typedef struct typedef_def typedef_def; - - -struct enumval_list { - char *name; - char *assignment; - struct enumval_list *next; -}; -typedef struct enumval_list enumval_list; - -struct enum_def { - enumval_list *vals; -}; -typedef struct enum_def enum_def; - - -struct declaration { - char *prefix; - char *type; - int storage; - char pstorage[128]; - char *name; - relation rel; - char *array_max; -}; -typedef struct declaration declaration; - - -struct decl_list { - declaration decl; - struct decl_list *next; -}; -typedef struct decl_list decl_list; - -struct struct_def { - decl_list *decls; - int storage; - char pstorage[128]; -}; -typedef struct struct_def struct_def; - - -struct case_list { - char *case_name; - declaration case_decl; - struct case_list *next; -}; -typedef struct case_list case_list; - -struct union_def { - declaration enum_decl; - case_list *cases; - declaration *default_decl; -}; -typedef struct union_def union_def; - - - -struct proc_list { - char *proc_name; - char *proc_num; - char *arg_type; - char *arg_prefix; - char *res_type; - char *res_prefix; - struct proc_list *next; -}; -typedef struct proc_list proc_list; - - -struct version_list { - char *vers_name; - char *vers_num; - proc_list *procs; - struct version_list *next; -}; -typedef struct version_list version_list; - -struct program_def { - char *prog_num; - version_list *versions; -}; -typedef struct program_def program_def; - -struct definition { - char *def_name; - defkind def_kind; - union { - const_def co; - struct_def st; - union_def un; - enum_def en; - typedef_def ty; - program_def pr; - } def; -}; -typedef struct definition definition; - -/* @(#)rpc_parse.h 2.1 88/08/01 4.0 RPCSRC */ -definition *get_definition(); diff -Nru acm-5.0/dis/disgen/rpc_scan.c acm-6.0+20200416/dis/disgen/rpc_scan.c --- acm-5.0/dis/disgen/rpc_scan.c 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/dis/disgen/rpc_scan.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,484 +0,0 @@ -/* @(#)rpc_scan.c 2.1 88/08/01 4.0 RPCSRC */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -#ifndef lint -/*static char sccsid[] = "from: @(#)rpc_scan.c 1.6 87/06/24 (C) 1987 SMI";*/ -static char rcsid[] = "$Id: rpc_scan.c,v 1.2 1998/05/12 03:58:46 riley Exp $"; -#endif - -/* - * rpc_scan.c, Scanner for the RPC protocol compiler - * Copyright (C) 1987, Sun Microsystems, Inc. - */ -#include -#include -#include -#include -#include -#include "rpc_scan.h" -#include "rpc_util.h" - -#define startcomment(where) (where[0] == '/' && where[1] == '*') -#define endcomment(where) (where[-1] == '*' && where[0] == '/') - -static int pushed = 0; /* is a token pushed */ -static token lasttok; /* last token, if pushed */ - -static void unget_token(), findstrconst(), findconst(), findkind(), - printdirective(), docppline(); -static int cppline(), directive(); - -/* - * scan expecting 1 given token - */ -void -scan(expect, tokp) - tok_kind expect; - token *tokp; -{ - get_token(tokp); - if (tokp->kind != expect) { - expected1(expect); - } -} - -/* - * scan expecting 2 given tokens - */ -void -scan2(expect1, expect2, tokp) - tok_kind expect1; - tok_kind expect2; - token *tokp; -{ - get_token(tokp); - if (tokp->kind != expect1 && tokp->kind != expect2) { - expected2(expect1, expect2); - } -} - -/* - * scan expecting 3 given token - */ -void -scan3(expect1, expect2, expect3, tokp) - tok_kind expect1; - tok_kind expect2; - tok_kind expect3; - token *tokp; -{ - get_token(tokp); - if (tokp->kind != expect1 && tokp->kind != expect2 - && tokp->kind != expect3) { - expected3(expect1, expect2, expect3); - } -} - - -/* - * scan expecting a constant, possibly symbolic - */ -void -scan_num(tokp) - token *tokp; -{ - get_token(tokp); - switch (tokp->kind) { - case TOK_IDENT: - break; - default: - error("constant or identifier expected"); - } -} - - -/* - * Peek at the next token - */ -void -peek(tokp) - token *tokp; -{ - get_token(tokp); - unget_token(tokp); -} - - -/* - * Peek at the next token and scan it if it matches what you expect - */ -int -peekscan(expect, tokp) - tok_kind expect; - token *tokp; -{ - peek(tokp); - if (tokp->kind == expect) { - get_token(tokp); - return (1); - } - return (0); -} - - - -/* - * Get the next token, printing out any directive that are encountered. - */ -void -get_token(tokp) - token *tokp; -{ - int commenting; - - if (pushed) { - pushed = 0; - *tokp = lasttok; - return; - } - commenting = 0; - for (;;) { - if (*where == 0) { - for (;;) { - if (!fgets(curline, MAXLINESIZE, fin)) { - tokp->kind = TOK_EOF; - *where = 0; - return; - } - linenum++; - if (commenting) { - break; - } else if (cppline(curline)) { - docppline(curline, &linenum, - &infilename); - } else if (directive(curline)) { - printdirective(curline); - } else { - break; - } - } - where = curline; - } else if (isspace(*where)) { - while (isspace(*where)) { - where++; /* eat */ - } - } else if (commenting) { - where++; - if (endcomment(where)) { - where++; - commenting--; - } - } else if (startcomment(where)) { - where += 2; - commenting++; - } else { - break; - } - } - - /* - * 'where' is not whitespace, comment or directive Must be a token! - */ - switch (*where) { - case ':': - tokp->kind = TOK_COLON; - where++; - break; - case ';': - tokp->kind = TOK_SEMICOLON; - where++; - break; - case ',': - tokp->kind = TOK_COMMA; - where++; - break; - case '=': - tokp->kind = TOK_EQUAL; - where++; - break; - case '*': - tokp->kind = TOK_STAR; - where++; - break; - case '[': - tokp->kind = TOK_LBRACKET; - where++; - break; - case ']': - tokp->kind = TOK_RBRACKET; - where++; - break; - case '{': - tokp->kind = TOK_LBRACE; - where++; - break; - case '}': - tokp->kind = TOK_RBRACE; - where++; - break; - case '(': - tokp->kind = TOK_LPAREN; - where++; - break; - case ')': - tokp->kind = TOK_RPAREN; - where++; - break; - case '<': - tokp->kind = TOK_LANGLE; - where++; - break; - case '>': - tokp->kind = TOK_RANGLE; - where++; - break; - - case '"': - tokp->kind = TOK_STRCONST; - findstrconst(&where, &tokp->str); - break; - - case '-': - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - tokp->kind = TOK_IDENT; - findconst(&where, &tokp->str); - break; - - - default: - if (!(isalpha(*where) || *where == '_')) { - char buf[100]; - char *p; - - s_print(buf, "illegal character in file: "); - p = buf + strlen(buf); - if (isprint(*where)) { - s_print(p, "%c", *where); - } else { - s_print(p, "%d", *where); - } - error(buf); - } - findkind(&where, tokp); - break; - } -} - - - -static void -unget_token(tokp) - token *tokp; -{ - lasttok = *tokp; - pushed = 1; -} - - -static void -findstrconst(str, val) - char **str; - char **val; -{ - char *p; - int size; - - p = *str; - do { - *p++; - } while (*p && *p != '"'); - if (*p == 0) { - error("unterminated string constant"); - } - p++; - size = p - *str; - *val = alloc(size + 1); - (void) strncpy(*val, *str, size); - (*val)[size] = 0; - *str = p; -} - -static void -findconst(str, val) - char **str; - char **val; -{ - char *p; - int size; - - p = *str; - if (*p == '0' && *(p + 1) == 'x') { - p++; - do { - p++; - } while (isxdigit(*p)); - } else { - do { - p++; - } while (isdigit(*p)); - } - size = p - *str; - *val = alloc(size + 1); - (void) strncpy(*val, *str, size); - (*val)[size] = 0; - *str = p; -} - - - -static token symbols[] = { - {TOK_CONST, "const"}, - {TOK_UNION, "union"}, - {TOK_SWITCH, "switch"}, - {TOK_CASE, "case"}, - {TOK_DEFAULT, "default"}, - {TOK_STRUCT, "struct"}, - {TOK_TYPEDEF, "typedef"}, - {TOK_ENUM, "enum"}, - {TOK_OPAQUE, "opaque"}, - {TOK_BOOL, "bool"}, - {TOK_VOID, "void"}, - {TOK_CHAR, "char"}, - {TOK_INT, "int"}, - {TOK_UNSIGNED, "unsigned"}, - {TOK_SHORT, "short"}, - {TOK_LONG, "long"}, - {TOK_FLOAT, "float"}, - {TOK_DOUBLE, "double"}, - {TOK_STRING, "string"}, - {TOK_PROGRAM, "program"}, - {TOK_VERSION, "version"}, - {TOK_EOF, "??????"}, -}; - - -static void -findkind(mark, tokp) - char **mark; - token *tokp; -{ - - int len; - token *s; - char *str; - - str = *mark; - for (s = symbols; s->kind != TOK_EOF; s++) { - len = strlen(s->str); - if (strncmp(str, s->str, len) == 0) { - if (!isalnum(str[len]) && str[len] != '_') { - tokp->kind = s->kind; - tokp->str = s->str; - *mark = str + len; - return; - } - } - } - tokp->kind = TOK_IDENT; - for (len = 0; isalnum(str[len]) || str[len] == '_'; len++); - tokp->str = alloc(len + 1); - (void) strncpy(tokp->str, str, len); - tokp->str[len] = 0; - *mark = str + len; -} - -static int -cppline(line) - char *line; -{ - return (line == curline && *line == '#'); -} - -static int -directive(line) - char *line; -{ - return (line == curline && *line == '%'); -} - -static void -printdirective(line) - char *line; -{ - f_print(fout, "%s", line + 1); -} - -static void -docppline(line, lineno, fname) - char *line; - int *lineno; - char **fname; -{ - char *file; - int num; - char *p; - - if (strncmp (line, "#line", 5) == 0) { - line += 5; - } - - line++; - while (isspace(*line)) { - line++; - } - num = atoi(line); - while (isdigit(*line)) { - line++; - } - while (isspace(*line)) { - line++; - } - if (*line != '"') { - error("preprocessor error"); - } - line++; - p = file = alloc(strlen(line) + 1); - while (*line && *line != '"') { - *p++ = *line++; - } - if (*line == 0) { - error("preprocessor error"); - } - *p = 0; - if (*file == 0) { - *fname = NULL; - } else { - *fname = file; - } - *lineno = num - 1; -} diff -Nru acm-5.0/dis/disgen/rpc_scan.h acm-6.0+20200416/dis/disgen/rpc_scan.h --- acm-5.0/dis/disgen/rpc_scan.h 1998-05-12 03:58:46.000000000 +0000 +++ acm-6.0+20200416/dis/disgen/rpc_scan.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,103 +0,0 @@ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - * - * from: @(#)rpc_scan.h 1.3 87/03/09 (C) 1987 SMI - * from: @(#)rpc_scan.h 2.1 88/08/01 4.0 RPCSRC - * $Id: rpc_scan.h,v 1.2 1998/05/12 03:58:46 riley Exp $ - */ - -/* - * rpc_scan.h, Definitions for the RPCL scanner - * Copyright (C) 1987, Sun Microsystems, Inc. - */ - -/* - * kinds of tokens - */ -enum tok_kind { - TOK_IDENT, - TOK_STRCONST, - TOK_LPAREN, - TOK_RPAREN, - TOK_LBRACE, - TOK_RBRACE, - TOK_LBRACKET, - TOK_RBRACKET, - TOK_LANGLE, - TOK_RANGLE, - TOK_STAR, - TOK_COMMA, - TOK_EQUAL, - TOK_COLON, - TOK_SEMICOLON, - TOK_CONST, - TOK_STRUCT, - TOK_UNION, - TOK_SWITCH, - TOK_CASE, - TOK_DEFAULT, - TOK_ENUM, - TOK_TYPEDEF, - TOK_INT, - TOK_SHORT, - TOK_LONG, - TOK_UNSIGNED, - TOK_FLOAT, - TOK_DOUBLE, - TOK_OPAQUE, - TOK_CHAR, - TOK_STRING, - TOK_BOOL, - TOK_VOID, - TOK_PROGRAM, - TOK_VERSION, - TOK_EOF -}; -typedef enum tok_kind tok_kind; - -/* - * a token - */ -struct token { - tok_kind kind; - char *str; -}; -typedef struct token token; - - -/* - * routine interface - */ -void scanprint(); -void scan(); -void scan2(); -void scan3(); -void scan_num(); -void peek(); -int peekscan(); -void get_token(); diff -Nru acm-5.0/dis/disgen/rpc_svcout.c acm-6.0+20200416/dis/disgen/rpc_svcout.c --- acm-5.0/dis/disgen/rpc_svcout.c 1998-08-14 21:16:55.000000000 +0000 +++ acm-6.0+20200416/dis/disgen/rpc_svcout.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,283 +0,0 @@ -/* @(#)rpc_svcout.c 2.1 88/08/01 4.0 RPCSRC */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -#ifndef lint -/*static char sccsid[] = "from: @(#)rpc_svcout.c 1.6 87/06/24 (C) 1987 SMI";*/ -static char rcsid[] = "$Id: rpc_svcout.c,v 1.2 1998/05/12 03:58:46 riley Exp $"; -#endif - -/* - * rpc_svcout.c, Server-skeleton outputter for the RPC protocol compiler - * Copyright (C) 1987, Sun Microsytsems, Inc. - */ -#include -#ifdef HAVE_STRINGS_H -#include -#else -#include -#endif -#include "rpc_parse.h" -#include "rpc_util.h" - -static char RQSTP[] = "rqstp"; -static char TRANSP[] = "transp"; -static char ARG[] = "argument"; -static char RESULT[] = "result"; -static char ROUTINE[] = "local"; - -static void write_program(), printerr(), printif(); - -extern int nullproc(proc_list *proc); - -/* - * write most of the service, that is, everything but the registrations. - */ -void -write_most() -{ - list *l; - definition *def; - version_list *vp; - - for (l = defined; l != NULL; l = l->next) { - def = (definition *) l->val; - if (def->def_kind == DEF_PROGRAM) { - for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) { - f_print(fout, "\nstatic void "); - pvname(def->def_name, vp->vers_num); - f_print(fout, "();"); - } - } - } - f_print(fout, "\n\n"); - f_print(fout, "main()\n"); - f_print(fout, "{\n"); - f_print(fout, "\tSVCXPRT *%s;\n", TRANSP); - f_print(fout, "\n"); - for (l = defined; l != NULL; l = l->next) { - def = (definition *) l->val; - if (def->def_kind != DEF_PROGRAM) { - continue; - } - for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) { - f_print(fout, "\t(void)pmap_unset(%s, %s);\n", def->def_name, vp->vers_name); - } - } -} - - -/* - * write a registration for the given transport - */ -void -write_register(transp) - char *transp; -{ - list *l; - definition *def; - version_list *vp; - - f_print(fout, "\n"); - f_print(fout, "\t%s = svc%s_create(RPC_ANYSOCK", TRANSP, transp); - if (streq(transp, "tcp")) { - f_print(fout, ", 0, 0"); - } - f_print(fout, ");\n"); - f_print(fout, "\tif (%s == NULL) {\n", TRANSP); - f_print(fout, "\t\t(void)fprintf(stderr, \"cannot create %s service.\\n\");\n", transp); - f_print(fout, "\t\texit(1);\n"); - f_print(fout, "\t}\n"); - - for (l = defined; l != NULL; l = l->next) { - def = (definition *) l->val; - if (def->def_kind != DEF_PROGRAM) { - continue; - } - for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) { - f_print(fout, - "\tif (!svc_register(%s, %s, %s, ", - TRANSP, def->def_name, vp->vers_name); - pvname(def->def_name, vp->vers_num); - f_print(fout, ", IPPROTO_%s)) {\n", - streq(transp, "udp") ? "UDP" : "TCP"); - f_print(fout, - "\t\t(void)fprintf(stderr, \"unable to register (%s, %s, %s).\\n\");\n", - def->def_name, vp->vers_name, transp); - f_print(fout, "\t\texit(1);\n"); - f_print(fout, "\t}\n"); - } - } -} - - -/* - * write the rest of the service - */ -void -write_rest() -{ - f_print(fout, "\tsvc_run();\n"); - f_print(fout, "\t(void)fprintf(stderr, \"svc_run returned\\n\");\n"); - f_print(fout, "\texit(1);\n"); - f_print(fout, "}\n"); -} - -void -write_programs(storage) - char *storage; -{ - list *l; - definition *def; - - for (l = defined; l != NULL; l = l->next) { - def = (definition *) l->val; - if (def->def_kind == DEF_PROGRAM) { - write_program(def, storage); - } - } -} - - -static void -write_program(def, storage) - definition *def; - char *storage; -{ - version_list *vp; - proc_list *proc; - int filled; - - for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) { - f_print(fout, "\n"); - if (storage != NULL) { - f_print(fout, "%s ", storage); - } - f_print(fout, "void\n"); - pvname(def->def_name, vp->vers_num); - f_print(fout, "(%s, %s)\n", RQSTP, TRANSP); - f_print(fout, " struct svc_req *%s;\n", RQSTP); - f_print(fout, " SVCXPRT *%s;\n", TRANSP); - f_print(fout, "{\n"); - - filled = 0; - f_print(fout, "\tunion {\n"); - for (proc = vp->procs; proc != NULL; proc = proc->next) { - if (streq(proc->arg_type, "void")) { - continue; - } - filled = 1; - f_print(fout, "\t\t"); - ptype(proc->arg_prefix, proc->arg_type, 0); - pvname(proc->proc_name, vp->vers_num); - f_print(fout, "_arg;\n"); - } - if (!filled) { - f_print(fout, "\t\tint fill;\n"); - } - f_print(fout, "\t} %s;\n", ARG); - f_print(fout, "\tchar *%s;\n", RESULT); - f_print(fout, "\tbool_t (*xdr_%s)(), (*xdr_%s)();\n", ARG, RESULT); - f_print(fout, "\tchar *(*%s)();\n", ROUTINE); - f_print(fout, "\n"); - f_print(fout, "\tswitch (%s->rq_proc) {\n", RQSTP); - - if (!nullproc(vp->procs)) { - f_print(fout, "\tcase NULLPROC:\n"); - f_print(fout, "\t\t(void)svc_sendreply(%s, xdr_void, (char *)NULL);\n", TRANSP); - f_print(fout, "\t\treturn;\n\n"); - } - for (proc = vp->procs; proc != NULL; proc = proc->next) { - f_print(fout, "\tcase %s:\n", proc->proc_name); - f_print(fout, "\t\txdr_%s = xdr_%s;\n", ARG, - stringfix(proc->arg_type)); - f_print(fout, "\t\txdr_%s = xdr_%s;\n", RESULT, - stringfix(proc->res_type)); - f_print(fout, "\t\t%s = (char *(*)()) ", ROUTINE); - pvname(proc->proc_name, vp->vers_num); - f_print(fout, ";\n"); - f_print(fout, "\t\tbreak;\n\n"); - } - f_print(fout, "\tdefault:\n"); - printerr("noproc", TRANSP); - f_print(fout, "\t\treturn;\n"); - f_print(fout, "\t}\n"); - - f_print(fout, "\tbzero((char *)&%s, sizeof(%s));\n", ARG, ARG); - printif("getargs", TRANSP, "&", ARG); - printerr("decode", TRANSP); - f_print(fout, "\t\treturn;\n"); - f_print(fout, "\t}\n"); - - f_print(fout, "\t%s = (*%s)(&%s, %s);\n", RESULT, ROUTINE, ARG, - RQSTP); - f_print(fout, - "\tif (%s != NULL && !svc_sendreply(%s, xdr_%s, %s)) {\n", - RESULT, TRANSP, RESULT, RESULT); - printerr("systemerr", TRANSP); - f_print(fout, "\t}\n"); - - printif("freeargs", TRANSP, "&", ARG); - f_print(fout, "\t\t(void)fprintf(stderr, \"unable to free arguments\\n\");\n"); - f_print(fout, "\t\texit(1);\n"); - f_print(fout, "\t}\n"); - - f_print(fout, "}\n\n"); - } -} - -static void -printerr(err, transp) - char *err; - char *transp; -{ - f_print(fout, "\t\tsvcerr_%s(%s);\n", err, transp); -} - -static void -printif(proc, transp, prefix, arg) - char *proc; - char *transp; - char *prefix; - char *arg; -{ - f_print(fout, "\tif (!svc_%s(%s, xdr_%s, %s%s)) {\n", - proc, transp, arg, prefix, arg); -} - -int -nullproc(proc) - proc_list *proc; -{ - for (; proc != NULL; proc = proc->next) { - if (streq(proc->proc_num, "0")) { - return (1); - } - } - return (0); -} diff -Nru acm-5.0/dis/disgen/rpc_util.c acm-6.0+20200416/dis/disgen/rpc_util.c --- acm-5.0/dis/disgen/rpc_util.c 1998-08-14 21:16:59.000000000 +0000 +++ acm-6.0+20200416/dis/disgen/rpc_util.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,451 +0,0 @@ -/* @(#)rpc_util.c 2.1 88/08/01 4.0 RPCSRC */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -#ifndef lint -/*static char sccsid[] = "from: @(#)rpc_util.c 1.5 87/06/24 (C) 1987 SMI";*/ -static char rcsid[] = "$Id: rpc_util.c,v 1.2 1998/05/12 03:58:46 riley Exp $"; -#endif - -/* - * rpc_util.c, Utility routines for the RPC protocol compiler - * Copyright (C) 1987, Sun Microsystems, Inc. - */ -#include -#include "rpc_scan.h" -#include "rpc_parse.h" -#include "rpc_util.h" - -#include -#ifdef HAVE_STRINGS_H -#include -#else -#include -#endif -#include - -char curline[MAXLINESIZE]; /* current read line */ -char *where = curline; /* current point in line */ -int linenum = 0; /* current line number */ - -char *infilename; /* input filename */ - -#define NFILES 4 -char *outfiles[NFILES]; /* output file names */ -int nfiles; - -FILE *fout; /* file pointer of current output */ -FILE *fin; /* file pointer of current input */ - -list *defined; /* list of defined things */ - -static void printwhere(); -void crash(); - -/* - * Reinitialize the world - */ -void -reinitialize() -{ - memset (curline, 0, MAXLINESIZE); - where = curline; - linenum = 0; - defined = NULL; -} - -/* - * string equality - */ -streq(a, b) - char *a; - char *b; -{ - return (strcmp(a, b) == 0); -} - -/* - * find a value in a list - */ -char * -findval(lst, val, cmp) - list *lst; - char *val; - int (*cmp) (); - -{ - for (; lst != NULL; lst = lst->next) { - if ((*cmp) (lst->val, val)) { - return (lst->val); - } - } - return (NULL); -} - -/* - * store a value in a list - */ -void -storeval(lstp, val) - list **lstp; - char *val; -{ - list **l; - list *lst; - - for (l = lstp; *l != NULL; l = (list **) & (*l)->next); - lst = ALLOC(list); - lst->val = val; - lst->next = NULL; - *l = lst; -} - - -static -findit(def, type) - definition *def; - char *type; -{ - return (streq(def->def_name, type)); -} - - -static char * -fixit(type, orig) - char *type; - char *orig; -{ - definition *def; - - def = (definition *) FINDVAL(defined, type, findit); - if (def == NULL || def->def_kind != DEF_TYPEDEF) { - return (orig); - } - switch (def->def.ty.rel) { - case REL_VECTOR: - return (def->def.ty.old_type); - case REL_ALIAS: - return (fixit(def->def.ty.old_type, orig)); - default: - return (orig); - } -} - -char * -fixtype(type) - char *type; -{ - return (fixit(type, type)); -} - -char * -stringfix(type) - char *type; -{ - if (streq(type, "string")) { - return ("wrapstring"); - } else { - return (type); - } -} - -void -ptype(prefix, type, follow) - char *prefix; - char *type; - int follow; -{ - if (prefix != NULL) { - if (streq(prefix, "enum")) { - f_print(fout, "enum "); - } else { - f_print(fout, "struct "); - } - } - if (streq(type, "bool")) { - f_print(fout, "bool_t "); - } else if (streq(type, "string")) { - f_print(fout, "char *"); - } else { - f_print(fout, "%s ", follow ? fixtype(type) : type); - } -} - - -static -typedefed(def, type) - definition *def; - char *type; -{ - if (def->def_kind != DEF_TYPEDEF || def->def.ty.old_prefix != NULL) { - return (0); - } else { - return (streq(def->def_name, type)); - } -} - -isvectordef(type, rel) - char *type; - relation rel; -{ - definition *def; - - for (;;) { - switch (rel) { - case REL_VECTOR: - return (!streq(type, "string")); - case REL_ARRAY: - case REL_ARRAY2: - return (0); - case REL_POINTER: - return (0); - case REL_ALIAS: - def = (definition *) FINDVAL(defined, type, typedefed); - if (def == NULL) { - return (0); - } - type = def->def.ty.old_type; - rel = def->def.ty.rel; - } - } -} - - -static char * -locase(str) - char *str; -{ - char c; - static char buf[100]; - char *p = buf; - - while (c = *str++) { - *p++ = (c >= 'A' && c <= 'Z') ? (c - 'A' + 'a') : c; - } - *p = 0; - return (buf); -} - - -void -pvname(pname, vnum) - char *pname; - char *vnum; -{ - f_print(fout, "%s_%s", locase(pname), vnum); -} - - -/* - * print a useful (?) error message, and then die - */ -void -error(msg) - char *msg; -{ - printwhere(); - f_print(stderr, "%s, line %d: ", infilename, linenum); - f_print(stderr, "%s\n", msg); - crash(); -} - -/* - * Something went wrong, unlink any files that we may have created and then - * die. - */ -void -crash() -{ - int i; - - for (i = 0; i < nfiles; i++) { - (void) unlink(outfiles[i]); - } - exit(1); -} - - -void -record_open(file) - char *file; -{ - if (nfiles < NFILES) { - outfiles[nfiles++] = file; - } else { - f_print(stderr, "too many files!\n"); - crash(); - } -} - -static char expectbuf[100]; -static char *toktostr(); - -/* - * error, token encountered was not the expected one - */ -void -expected1(exp1) - tok_kind exp1; -{ - s_print(expectbuf, "expected '%s'", - toktostr(exp1)); - error(expectbuf); -} - -/* - * error, token encountered was not one of two expected ones - */ -void -expected2(exp1, exp2) - tok_kind exp1, exp2; -{ - s_print(expectbuf, "expected '%s' or '%s'", - toktostr(exp1), - toktostr(exp2)); - error(expectbuf); -} - -/* - * error, token encountered was not one of 3 expected ones - */ -void -expected3(exp1, exp2, exp3) - tok_kind exp1, exp2, exp3; -{ - s_print(expectbuf, "expected '%s', '%s' or '%s'", - toktostr(exp1), - toktostr(exp2), - toktostr(exp3)); - error(expectbuf); -} - -void -tabify(f, tab) - FILE *f; - int tab; -{ - while (tab--) { - (void) fputc('\t', f); - } -} - - - -static token tokstrings[] = { - {TOK_IDENT, "identifier"}, - {TOK_CONST, "const"}, - {TOK_RPAREN, ")"}, - {TOK_LPAREN, "("}, - {TOK_RBRACE, "}"}, - {TOK_LBRACE, "{"}, - {TOK_LBRACKET, "["}, - {TOK_RBRACKET, "]"}, - {TOK_STAR, "*"}, - {TOK_COMMA, ","}, - {TOK_EQUAL, "="}, - {TOK_COLON, ":"}, - {TOK_SEMICOLON, ";"}, - {TOK_UNION, "union"}, - {TOK_STRUCT, "struct"}, - {TOK_SWITCH, "switch"}, - {TOK_CASE, "case"}, - {TOK_DEFAULT, "default"}, - {TOK_ENUM, "enum"}, - {TOK_TYPEDEF, "typedef"}, - {TOK_INT, "int"}, - {TOK_SHORT, "short"}, - {TOK_LONG, "long"}, - {TOK_UNSIGNED, "unsigned"}, - {TOK_DOUBLE, "double"}, - {TOK_FLOAT, "float"}, - {TOK_CHAR, "char"}, - {TOK_STRING, "string"}, - {TOK_OPAQUE, "opaque"}, - {TOK_BOOL, "bool"}, - {TOK_VOID, "void"}, - {TOK_PROGRAM, "program"}, - {TOK_VERSION, "version"}, - {TOK_EOF, "??????"} -}; - -static char * -toktostr(kind) - tok_kind kind; -{ - token *sp; - - for (sp = tokstrings; sp->kind != TOK_EOF && sp->kind != kind; sp++); - return (sp->str); -} - - - -static void -printbuf() -{ - char c; - int i; - int cnt; - -# define TABSIZE 4 - - for (i = 0; c = curline[i]; i++) { - if (c == '\t') { - cnt = 8 - (i % TABSIZE); - c = ' '; - } else { - cnt = 1; - } - while (cnt--) { - (void) fputc(c, stderr); - } - } -} - - -static void -printwhere() -{ - int i; - char c; - int cnt; - - printbuf(); - for (i = 0; i < where - curline; i++) { - c = curline[i]; - if (c == '\t') { - cnt = 8 - (i % TABSIZE); - } else { - cnt = 1; - } - while (cnt--) { - (void) fputc('^', stderr); - } - } - (void) fputc('\n', stderr); -} diff -Nru acm-5.0/dis/disgen/rpc_util.h acm-6.0+20200416/dis/disgen/rpc_util.h --- acm-5.0/dis/disgen/rpc_util.h 1998-08-14 21:17:02.000000000 +0000 +++ acm-6.0+20200416/dis/disgen/rpc_util.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,112 +0,0 @@ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - * - * from: @(#)rpc_util.h 1.6 87/06/24 (C) 1987 SMI - * from: @(#)rpc_util.h 2.1 88/08/01 4.0 RPCSRC - * $Id: rpc_util.h,v 1.2 1998/05/12 03:58:46 riley Exp $ - */ - -/* - * rpc_util.h, Useful definitions for the RPC protocol compiler - * Copyright (C) 1987, Sun Microsystems, Inc. - */ - -#define alloc(size) malloc((unsigned)(size)) -#define ALLOC(object) (object *) malloc(sizeof(object)) - -#define s_print (void) sprintf -#define f_print (void) fprintf - -struct list { - char *val; - struct list *next; -}; -typedef struct list list; - -/* - * Global variables - */ -#define MAXLINESIZE 1024 -extern char curline[MAXLINESIZE]; -extern char *where; -extern int linenum; - -extern char *infilename; -extern FILE *fout; -extern FILE *fin; - -extern list *defined; - -/* - * rpc_util routines - */ -void storeval(); - -#define STOREVAL(list,item) \ - storeval(list,(char *)item) - -char *findval(); - -#define FINDVAL(list,item,finder) \ - findval(list, (char *) item, finder) - -char *fixtype(); -char *stringfix(); -void pvname(); -void ptype(); -int isvectordef(); -int streq(); -void error(); -void expected1(); -void expected2(); -void expected3(); -void tabify(); -void record_open(); - -/* - * rpc_cout routines - */ -void cprint(); -void emit(); - -/* - * rpc_hout routines - */ -void print_datadef(); - -/* - * rpc_svcout routines - */ -void write_most(); -void write_register(); -void write_rest(); - -/* - * rpc_clntout routines - */ -void write_stubs(); Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/dis/dislib1.doc and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/dis/dislib1.doc differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/dis/dislib.doc and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/dis/dislib.doc differ diff -Nru acm-5.0/dis/header acm-6.0+20200416/dis/header --- acm-5.0/dis/header 1997-04-11 17:19:56.000000000 +0000 +++ acm-6.0+20200416/dis/header 1970-01-01 00:00:00.000000000 +0000 @@ -1,28 +0,0 @@ -/* - * DIS/x : An implementation of the IEEE 1278.1 protocol - * - * Copyright (C) 1997, Riley Rainey (rrainey@ix.netcom.com) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of either: - * - * a) the GNU Library General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your - * option) any later version. A description of the terms and conditions - * of the GLPL may be found in the "COPYING.LIB" file. - * - * b) the "Artistic License" which comes with this Kit. Information - * about this license may be found in the "Artistic" file. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License or the Artistic License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the Free - * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * Information describing how to contact the author can be found in the - * README file. - */ diff -Nru acm-5.0/dis/lib/basic.c acm-6.0+20200416/dis/lib/basic.c --- acm-5.0/dis/lib/basic.c 1998-08-14 21:12:56.000000000 +0000 +++ acm-6.0+20200416/dis/lib/basic.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,167 +0,0 @@ -/* - * DIS/x : An implementation of the IEEE 1278.1 protocol - * - * Copyright (C) 1996, Riley Rainey (rainey@netcom.com) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of either: - * - * a) the GNU Library General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your - * option) any later version. A description of the terms and conditions - * of the GLPL may be found in the "COPYING.LIB" file. - * - * b) the "Artistic License" which comes with this Kit. Information - * about this license may be found in the "Artistic" file. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License or the Artistic License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the Free - * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * Information describing how to contact the author can be found in the - * README file. - */ -#include -#include -#ifdef HAVE_STDLIB_H -#include -#else -#ifdef HAVE_MALLOC_H -#include -#endif -#endif - -#ifdef WIN32 -typedef __int64 my_quad_t; - -#else -typedef long long my_quad_t; - -#endif - -/* - * The NPSNET code handles timestamps in a different way than the - * DIS protocol document describes. - */ - -#if defined(NPSNET_COMPAT) -int DIS_NPSNET_COMPAT = 1; - -#else -int DIS_NPSNET_COMPAT = 0; - -#endif - -#define MILLION 1000000 -#define dis_timestamp_const 2147483646L /* 2 ^ 31 - 1 */ - -#ifdef WIN32 -struct timezone { - int keep_compiler_happy; -}; - -#endif - -int -DISGetRealTime(dis_time * result) -{ - struct timeval t; - struct timezone tz; - my_quad_t i; - - if (gettimeofday(&t, &tz) != 0) { - return -1; - } - result->hour = t.tv_sec / 3600; - i = (t.tv_sec % 3600) * MILLION + t.tv_usec; - i = (i * dis_timestamp_const / 3600) / MILLION; - result->rel.time = (unsigned int) i; - result->rel.type = 0; - return 0; -} - -int -DISGetTimestamp(dis_timestamp * result) -{ - -#if defined(NPSNET_COMPAT) - time_t i = time(0); - - result->time = i >> 1; - result->type = i & 1; -#else - struct timeval t; - struct timezone tz; - my_quad_t i; - - if (gettimeofday(&t, &tz) != 0) { - return -1; - } - i = (t.tv_sec % 3600) * MILLION + t.tv_usec; - i = (i * dis_timestamp_const / 3600) / MILLION; - result->time = (unsigned int) i; - result->type = 0; -#endif - return 0; -} - -void -DISTimestampToTimeval(dis_timestamp * in, struct timeval *out) -{ -#if defined(NPSNET_COMPAT) - out->tv_sec = (in->time << 1) + in->type; - out->tv_usec = 0; -#else - my_quad_t i; - - i = (my_quad_t) in->time * MILLION * 3600 / dis_timestamp_const; - out->tv_sec = (long) ( i / MILLION); - out->tv_usec = (long) ( i % MILLION ); -#endif -} - -void -DISTimeToTimeval(dis_time * in, struct timeval *out) -{ - my_quad_t i; - - i = (my_quad_t) in->rel.time * MILLION / dis_timestamp_const; - out->tv_sec = (long) ( in->hour * 3600 + i / MILLION ); - out->tv_usec = (long) ( i % MILLION ); -} - -DISResult -DISAddArticulationParm(dis_pdu * p, dis_articulation_parm * parm, int *parmID) -{ - dis_entity_state_pdu *esp = (dis_entity_state_pdu *) p; - - int n = esp->art_parm_count + 1; - - if (esp->art_parm_count == 0) { - esp->art_parm = (dis_articulation_parm *) - malloc(sizeof(dis_articulation_parm)); - } - else { - esp->art_parm = (dis_articulation_parm *) - realloc(esp->art_parm, sizeof(dis_articulation_parm) * n); - } - -/* - * Return an error if the memory could not be allocated - */ - - if (esp->art_parm == (dis_articulation_parm *) NULL) { - esp->art_parm_count = 0; - return DISResultNoMemory; - } - - esp->art_parm[esp->art_parm_count] = *parm; - esp->art_parm_count = n; - *parmID = n; - return DISResultOK; -} diff -Nru acm-5.0/dis/lib/datum.c acm-6.0+20200416/dis/lib/datum.c --- acm-5.0/dis/lib/datum.c 1998-12-09 21:53:54.000000000 +0000 +++ acm-6.0+20200416/dis/lib/datum.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,65 +0,0 @@ -/* - * DIS/x : An implementation of the IEEE 1278.1 protocol - * - * Copyright (C) 1996, Riley Rainey (rainey@netcom.com) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of either: - * - * a) the GNU Library General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your - * option) any later version. A description of the terms and conditions - * of the GLPL may be found in the "COPYING.LIB" file. - * - * b) the "Artistic License" which comes with this Kit. Information - * about this license may be found in the "Artistic" file. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License or the Artistic License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the Free - * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * Information describing how to contact the author can be found in the - * README file. - */ -#include -#ifdef HAVE_MEMORY_H -#include -#endif -#ifdef HAVE_STDLIB_H -#include -#else -#include -#endif - -dis_variable_datum * -DISCreateVariableDatumString(dis_datum_type id, char *s, int str_len) -{ - dis_variable_datum *p; - int len = ((str_len + 7) / 8) * 8; - - p = (dis_variable_datum *) - malloc(sizeof(dis_variable_datum) + len); - - if (!p) { - return p; - } - - p->datum_id = id; - p->value_length = str_len * 8; - p->value.ptr_value = (unsigned char *) (p + 1); - - memset(p->value.ptr_value, 0, len); - memcpy(p->value.ptr_value, s, str_len); - return p; -} - -void -DISInitializeDatumInfo ( dis_datum_spec_record *pd ) -{ - memset (pd, 0, sizeof(dis_datum_spec_record)); -} diff -Nru acm-5.0/dis/lib/datum_table.c acm-6.0+20200416/dis/lib/datum_table.c --- acm-5.0/dis/lib/datum_table.c 1998-05-12 03:43:01.000000000 +0000 +++ acm-6.0+20200416/dis/lib/datum_table.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,49 +0,0 @@ -/* - * DIS/x : An implementation of the IEEE 1278.1 protocol - * - * Copyright (C) 1996, Riley Rainey (rainey@netcom.com) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of either: - * - * a) the GNU Library General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your - * option) any later version. A description of the terms and conditions - * of the GLPL may be found in the "COPYING.LIB" file. - * - * b) the "Artistic License" which comes with this Kit. Information - * about this license may be found in the "Artistic" file. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License or the Artistic License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the Free - * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * Information describing how to contact the author can be found in the - * README file. - */ -#include - -typedef struct { - dis_datum_type id; - char *name; -} dis_datum_info; - -#include "datumtbl.h" - -char * -DISLookupDatumIDName(dis_datum_type id) -{ - unsigned int i; - - for (i = 0; lookup[i].id != 0; ++i) { - if (lookup[i].id == id) { - return lookup[i].name; - } - } - return (char *) 0; -} diff -Nru acm-5.0/dis/lib/datumtbl.pl acm-6.0+20200416/dis/lib/datumtbl.pl --- acm-5.0/dis/lib/datumtbl.pl 1997-04-10 19:00:28.000000000 +0000 +++ acm-6.0+20200416/dis/lib/datumtbl.pl 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ -#!/usr/local/bin/perl -print "static dis_datum_info lookup[] = {\n"; -while () { - if (/^\s*Datum/) { - chop; - $front = substr($_, 0, index($_, '=') - 1); - $back = substr($_, index($_, '=') + 1); - $back =~ s/\/\*.*$//g; - $back =~ s/,//g; - $_ =~ s/^[ \t]+//; - ($datum) = split; - $datum =~ s/^Datum//; - $datum =~ s/([A-Z])/ $1/g; - $datum =~ s/^ //; - $datum =~ s/D I S/DIS/g; - $datum =~ s/I D/ID/g; - $datum =~ s/Alt /Alternate /g; - $datum =~ s/=$//g; - $datum =~ s/[0-9]mm([^ ])/mm $1/g; - $datum =~ s/quantity/Quantity/g; - $datum =~ s/H E A T/HEAT /g; - $datum =~ s/S A B O T/Sabot /g; - $_ = $back; - $_ =~ s/^[ \t]+//; - ($value) = split; - print "\t{ ",$value, ", \"", $datum, "\" },\n"; - } -} -print "};\n"; diff -Nru acm-5.0/dis/lib/dis.def acm-6.0+20200416/dis/lib/dis.def --- acm-5.0/dis/lib/dis.def 1998-12-09 21:53:57.000000000 +0000 +++ acm-6.0+20200416/dis/lib/dis.def 1970-01-01 00:00:00.000000000 +0000 @@ -1,142 +0,0 @@ -EXPORTS -; basic.c - DISGetRealTime - DISGetTimestamp - DISTimestampToTimeval - DISTimeToTimeval - DISAddArticulationParm -; datum.c - DISCreateVariableDatumString - DISInitializeDatumInfo -; datum_table.c - DISLookupDatumIDName -; dis_xdr1.c - xdr_dis_variable_datum - xdr_dis_articulation_parm - xdr_dis_timestamp - xdr_dis_pdu -; dis_xdr2.c - xdr_byte_long - xdr_byte_u_long - xdr_byte_short - xdr_byte_u_short - xdr_byte_char - xdr_byte_u_char - xdr_byte_opaque -; disx.c - DISxInitializeApplication - DISxGetSimulationAddress - DISxSetExerciseID - DISxWritePDU - DISxReadPDU - DISxCloseApplication -; entity.c - DISxIssueEntityID -; event.c - DISxIssueEventID -; io.c - DISReadPDU - DISWritePDU - DISOpenTransceiver - DISCloseTransceiver - DISSetNBIOState -; lookup.c - SIMxLookupEntityName - SIMxLookupEntityNames -; register.c - SIMxRegisterApplication -; sitename.c - SIMxGetSiteName -; xdr_var_array.c - xdr_var_array -; xdr_umem.c - xdrumem_create -; free.c - DISFreePDUComponents -; sizes.c - DISAddPDUSizes -; globe.c - DISUpdateWorldCoordinates - DISUpdateWorldCoordinatesEx - DISGeocentricToWorldCoordinates - DISWorldCoordinatesToGeocentric - DISLatitudeToString - DISLongitudeToString - DISStringToLatLong -; dis_xdr.c - xdr_dis_float_vector - xdr_dis_fixed_datum - xdr_dis_simulation_addr - xdr_dis_emitter_system - xdr_dis_entity_id - xdr_dis_entity_type - xdr_dis_entity_marking - xdr_dis_euler_angles - xdr_dis_event_id - xdr_dis_fundamental_parameters - xdr_dis_modulation_type - xdr_dis_pdu_header - xdr_dis_double_vector - xdr_dis_relative_coordinates - xdr_dis_antenna_location - xdr_dis_beam_antenna_pattern - xdr_dis_spherical_harmonic_antenna_pattern - xdr_dis_time - xdr_dis_burst_descriptor - xdr_dis_dead_reckoning - xdr_dis_capabilities - xdr_dis_supply_quantity - xdr_dis_entity_appearance - xdr_dis_entity_state_pdu - xdr_dis_collision_pdu - xdr_dis_fire_pdu - xdr_dis_detonation_pdu - xdr_dis_service_type - xdr_dis_repair_type - xdr_dis_repair_result - xdr_dis_service_request_pdu - xdr_dis_resupply_offer_pdu - xdr_dis_resupply_received_pdu - xdr_dis_resupply_cancel_pdu - xdr_dis_repair_complete_pdu - xdr_dis_repair_response_pdu - xdr_dis_request_id - xdr_dis_create_entity_pdu - xdr_dis_remove_entity_pdu - xdr_dis_start_pdu - xdr_dis_stop_pdu - xdr_dis_acknowledge_pdu - xdr_dis_data_query_pdu - xdr_dis_datum_spec_record - xdr_dis_set_data_pdu - xdr_dis_data_pdu - xdr_dis_event_report_pdu - xdr_dis_message_pdu - xdr_dis_track_info - xdr_dis_beam_info - xdr_dis_em_system_info - xdr_dis_em_emission_pdu - xdr_dis_designator_pdu - xdr_dis_variable_datum - xdr_dis_articulation_parm - xdr_dis_timestamp - xdr_dis_pdu -; dis_clnt.c -; dis_svc.c -; simmgr_xdr.c - xdr_simx_stat - xdr_simx_register_app_args - xdr_simx_register_app_result - xdr_simx_entity_type_attr - xdr_simx_lookup_entity_type_result - xdr_simx_lookup_complete_entity_type_result - xdr_simx_string - xdr_simx_session_handle - xdr_simx_startres -; dr.c - DISEulerToMatrix - DISProcessNewDRParameters - DISComputeDRPosition - DISTestDRThresholds - DISSetDRThresholds - DISGetDRThresholds diff -Nru acm-5.0/dis/lib/dis.dsp acm-6.0+20200416/dis/lib/dis.dsp --- acm-5.0/dis/lib/dis.dsp 1998-12-06 23:40:32.000000000 +0000 +++ acm-6.0+20200416/dis/lib/dis.dsp 1970-01-01 00:00:00.000000000 +0000 @@ -1,533 +0,0 @@ -# Microsoft Developer Studio Project File - Name="dis" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 5.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 - -CFG=dis - Win32 Professional Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "dis.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "dis.mak" CFG="dis - Win32 Professional Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "dis - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "dis - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "dis - Win32 Professional Debug" (based on\ - "Win32 (x86) Dynamic-Link Library") -!MESSAGE "dis - Win32 Professional Release" (based on\ - "Win32 (x86) Dynamic-Link Library") -!MESSAGE - -# Begin Project -# PROP Scc_ProjName "dis" -# PROP Scc_LocalPath "." -CPP=cl.exe -MTL=midl.exe -RSC=rc.exe - -!IF "$(CFG)" == "dis - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir ".\Release" -# PROP BASE Intermediate_Dir ".\Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "..\..\Release" -# PROP Intermediate_Dir ".\Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c -# ADD CPP /nologo /MD /W3 /GX /Ot /Oa /Ow /Oi /Op /Oy /Ob1 /I "c:\source\include" /I "." /I ".." /I "..\..\V\lib" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX"dis\dis.h" /FD /c -# SUBTRACT CPP /Ox -# ADD BASE MTL /nologo /D "NDEBUG" /win32 -# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386 -# ADD LINK32 ..\..\Release\oncrpc.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386 - -!ELSEIF "$(CFG)" == "dis - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir ".\Debug" -# PROP BASE Intermediate_Dir ".\Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "..\..\Debug" -# PROP Intermediate_Dir ".\Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c -# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "..\..\V\lib" /I "c:\source\include" /I "." /I ".." /D "_WINDOWS" /D "_DEBUG" /D "WIN32" /YX"dis\dis.h" /FD /c -# ADD BASE MTL /nologo /D "_DEBUG" /win32 -# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 -# ADD LINK32 ..\..\Debug\oncrpc.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /base:"0x11800000" /subsystem:windows /dll /debug /machine:I386 - -!ELSEIF "$(CFG)" == "dis - Win32 Professional Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "dis___Wi" -# PROP BASE Intermediate_Dir "dis___Wi" -# PROP BASE Ignore_Export_Lib 0 -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "dis___Wi" -# PROP Intermediate_Dir "dis___Wi" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /I "..\..\V\lib" /I "c:\source\include" /I "." /I ".." /D "_WINDOWS" /D "_DEBUG" /D "WIN32" /YX"dis\dis.h" /FD /c -# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /I "..\..\V\lib" /I "c:\source\include" /I "." /I ".." /D "_WINDOWS" /D "_DEBUG" /D "WIN32" /YX"dis\dis.h" /FD /c -# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 ..\..\Debug\oncrpc.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /base:"0x11800000" /subsystem:windows /dll /debug /machine:I386 -# ADD LINK32 ..\..\Debug\oncrpc.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /base:"0x11800000" /subsystem:windows /dll /debug /machine:I386 - -!ELSEIF "$(CFG)" == "dis - Win32 Professional Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "dis___W0" -# PROP BASE Intermediate_Dir "dis___W0" -# PROP BASE Ignore_Export_Lib 0 -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "dis___W0" -# PROP Intermediate_Dir "dis___W0" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MT /W3 /GX /Ot /Oa /Ow /Oi /Op /Oy /Ob1 /I "c:\source\include" /I "." /I ".." /I "..\..\V\lib" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX"dis\dis.h" /FD /c -# SUBTRACT BASE CPP /Ox -# ADD CPP /nologo /MT /W3 /GX /Ot /Oa /Ow /Oi /Op /Oy /Ob1 /I "c:\source\include" /I "." /I ".." /I "..\..\V\lib" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX"dis\dis.h" /FD /c -# SUBTRACT CPP /Ox -# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 ..\..\Release\oncrpc.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386 -# ADD LINK32 ..\..\Release\oncrpc.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386 - -!ENDIF - -# Begin Target - -# Name "dis - Win32 Release" -# Name "dis - Win32 Debug" -# Name "dis - Win32 Professional Debug" -# Name "dis - Win32 Professional Release" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;hpj;bat;for;f90" -# Begin Source File - -SOURCE=.\basic.c -# End Source File -# Begin Source File - -SOURCE=.\datum.c -# End Source File -# Begin Source File - -SOURCE=.\datum_table.c -# End Source File -# Begin Source File - -SOURCE=.\datumtbl.pl -USERDEP__DATUM="$(ProjDir)\..\dis\datum.h" - -!IF "$(CFG)" == "dis - Win32 Release" - -# Begin Custom Build - Generating Datum Table values ... -ProjDir=. -InputPath=.\datumtbl.pl - -"$(ProjDir)\datumtbl.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - perl $(ProjDir)\datumtbl.pl <$(ProjDir)\..\dis\datum.h >$(ProjDir)\datumtbl.h - -# End Custom Build - -!ELSEIF "$(CFG)" == "dis - Win32 Debug" - -# Begin Custom Build - Generating Datum Table values ... -ProjDir=. -InputPath=.\datumtbl.pl - -"$(ProjDir)\datumtbl.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - perl $(ProjDir)\datumtbl.pl <$(ProjDir)\..\dis\datum.h >$(ProjDir)\datumtbl.h - -# End Custom Build - -!ELSEIF "$(CFG)" == "dis - Win32 Professional Debug" - -# Begin Custom Build - Generating Datum Table values ... -ProjDir=. -InputPath=.\datumtbl.pl - -"$(ProjDir)\datumtbl.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - perl $(ProjDir)\datumtbl.pl <$(ProjDir)\..\dis\datum.h >$(ProjDir)\datumtbl.h - -# End Custom Build - -!ELSEIF "$(CFG)" == "dis - Win32 Professional Release" - -# Begin Custom Build - Generating Datum Table values ... -ProjDir=. -InputPath=.\datumtbl.pl - -"$(ProjDir)\datumtbl.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - perl $(ProjDir)\datumtbl.pl <$(ProjDir)\..\dis\datum.h >$(ProjDir)\datumtbl.h - -# End Custom Build - -!ENDIF - -# End Source File -# Begin Source File - -SOURCE=.\dis.def -# End Source File -# Begin Source File - -SOURCE=.\dis.x - -!IF "$(CFG)" == "dis - Win32 Release" - -USERDEP__DIS_X="dis_xdr.c" "..\..\Release\disgen.exe" -# Begin Custom Build - Generating protocol code -ProjDir=. -InputPath=.\dis.x - -BuildCmds= \ - ..\..\Release\disgen dis.x \ - copy dis.h ..\dis\disp.h \ - - -"$(ProjDir)\dis_xdr.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - $(BuildCmds) - -"$(ProjDir)\..\dis\disp.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - $(BuildCmds) -# End Custom Build - -!ELSEIF "$(CFG)" == "dis - Win32 Debug" - -USERDEP__DIS_X="..\..\Debug\disgen.exe" -# Begin Custom Build - Generating protocol code -ProjDir=. -InputPath=.\dis.x - -BuildCmds= \ - ..\..\Debug\disgen dis.x \ - copy dis.h ..\dis\disp.h \ - - -"$(ProjDir)\dis_xdr.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - $(BuildCmds) - -"$(ProjDir)\..\dis\disp.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - $(BuildCmds) -# End Custom Build - -!ELSEIF "$(CFG)" == "dis - Win32 Professional Debug" - -USERDEP__DIS_X="..\..\Debug\disgen.exe" -# Begin Custom Build - Generating protocol code -ProjDir=. -InputPath=.\dis.x - -BuildCmds= \ - ..\..\Debug\disgen dis.x \ - copy dis.h ..\dis\disp.h \ - - -"$(ProjDir)\dis_xdr.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - $(BuildCmds) - -"$(ProjDir)\..\dis\disp.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - $(BuildCmds) -# End Custom Build - -!ELSEIF "$(CFG)" == "dis - Win32 Professional Release" - -USERDEP__DIS_X="dis_xdr.c" "..\..\Release\disgen.exe" -# Begin Custom Build - Generating protocol code -ProjDir=. -InputPath=.\dis.x - -BuildCmds= \ - ..\..\Release\disgen dis.x \ - copy dis.h ..\dis\disp.h \ - - -"$(ProjDir)\dis_xdr.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - $(BuildCmds) - -"$(ProjDir)\..\dis\disp.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - $(BuildCmds) -# End Custom Build - -!ENDIF - -# End Source File -# Begin Source File - -SOURCE=.\dis_xdr.c -# End Source File -# Begin Source File - -SOURCE=.\dis_xdr1.c -# End Source File -# Begin Source File - -SOURCE=.\dis_xdr2.c -# End Source File -# Begin Source File - -SOURCE=.\disx.c -# End Source File -# Begin Source File - -SOURCE=.\dr.c -# End Source File -# Begin Source File - -SOURCE=.\entity.c -# End Source File -# Begin Source File - -SOURCE=.\event.c -# End Source File -# Begin Source File - -SOURCE=.\free.c -# End Source File -# Begin Source File - -SOURCE=.\globe.c -# End Source File -# Begin Source File - -SOURCE=.\io.c -# End Source File -# Begin Source File - -SOURCE=.\lookup.c -# End Source File -# Begin Source File - -SOURCE=.\register.c -# End Source File -# Begin Source File - -SOURCE=.\simmgr.x - -!IF "$(CFG)" == "dis - Win32 Release" - -# Begin Custom Build - Generating simmgr code -ProjDir=. -InputPath=.\simmgr.x - -BuildCmds= \ - rpcgen -h -o $(ProjDir)\simmgr.h $(ProjDir)\simmgr.x \ - rpcgen -c -o $(ProjDir)\simmgr_xdr.c $(ProjDir)\simmgr.x \ - - -"$(ProjDir)\simmgr.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - $(BuildCmds) - -"$(ProjDir)\simmgr_xdr.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - $(BuildCmds) -# End Custom Build - -!ELSEIF "$(CFG)" == "dis - Win32 Debug" - -# Begin Custom Build - Generating simmgr code -ProjDir=. -InputPath=.\simmgr.x - -BuildCmds= \ - rpcgen -h -o $(ProjDir)\simmgr.h $(ProjDir)\simmgr.x \ - rpcgen -c -o $(ProjDir)\simmgr_xdr.c $(ProjDir)\simmgr.x \ - - -"$(ProjDir)\simmgr.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - $(BuildCmds) - -"$(ProjDir)\simmgr_xdr.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - $(BuildCmds) -# End Custom Build - -!ELSEIF "$(CFG)" == "dis - Win32 Professional Debug" - -# Begin Custom Build - Generating simmgr code -ProjDir=. -InputPath=.\simmgr.x - -BuildCmds= \ - rpcgen -h -o $(ProjDir)\simmgr.h $(ProjDir)\simmgr.x \ - rpcgen -c -o $(ProjDir)\simmgr_xdr.c $(ProjDir)\simmgr.x \ - - -"$(ProjDir)\simmgr.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - $(BuildCmds) - -"$(ProjDir)\simmgr_xdr.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - $(BuildCmds) -# End Custom Build - -!ELSEIF "$(CFG)" == "dis - Win32 Professional Release" - -# Begin Custom Build - Generating simmgr code -ProjDir=. -InputPath=.\simmgr.x - -BuildCmds= \ - rpcgen -h -o $(ProjDir)\simmgr.h $(ProjDir)\simmgr.x \ - rpcgen -c -o $(ProjDir)\simmgr_xdr.c $(ProjDir)\simmgr.x \ - - -"$(ProjDir)\simmgr.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - $(BuildCmds) - -"$(ProjDir)\simmgr_xdr.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - $(BuildCmds) -# End Custom Build - -!ENDIF - -# End Source File -# Begin Source File - -SOURCE=.\simmgr_xdr.c -# End Source File -# Begin Source File - -SOURCE=.\sitename.c -# End Source File -# Begin Source File - -SOURCE=.\sizes.c -# End Source File -# Begin Source File - -SOURCE=.\xdr_umem.c -# End Source File -# Begin Source File - -SOURCE=.\xdr_var_array.c -# End Source File -# Begin Source File - -SOURCE=.\xdrhdr.pl -USERDEP__XDRHD="dis_xdr.c" - -!IF "$(CFG)" == "dis - Win32 Release" - -# Begin Custom Build - Generating XDR header -InputPath=.\xdrhdr.pl - -"..\dis\dis_xdr.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - copy dis_xdr.c+dis_xdr1.c x.tmp - echo perl executing - perl xdrhdr.pl ..\dis\dis_xdr.h - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name prologue - End Project Dependency -}}} - -############################################################################### - -Project: "prologue"=.\prologue\prologue.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Global: - -Package=<5> -{{{ -}}} - -Package=<3> -{{{ -}}} - -############################################################################### - diff -Nru acm-5.0/dis/lib/dis.mak acm-6.0+20200416/dis/lib/dis.mak --- acm-5.0/dis/lib/dis.mak 1997-04-10 19:29:52.000000000 +0000 +++ acm-6.0+20200416/dis/lib/dis.mak 1970-01-01 00:00:00.000000000 +0000 @@ -1,943 +0,0 @@ -# Microsoft Developer Studio Generated NMAKE File, Format Version 4.20 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) External Target" 0x0106 -# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 - -!IF "$(CFG)" == "" -CFG=prologue - Win32 Debug -!MESSAGE No configuration specified. Defaulting to prologue - Win32 Debug. -!ENDIF - -!IF "$(CFG)" != "dis - Win32 Release" && "$(CFG)" != "dis - Win32 Debug" &&\ - "$(CFG)" != "prologue - Win32 Release" && "$(CFG)" != "prologue - Win32 Debug" -!MESSAGE Invalid configuration "$(CFG)" specified. -!MESSAGE You can specify a configuration when running NMAKE on this makefile -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "dis.mak" CFG="prologue - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "dis - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "dis - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "prologue - Win32 Release" (based on "Win32 (x86) External Target") -!MESSAGE "prologue - Win32 Debug" (based on "Win32 (x86) External Target") -!MESSAGE -!ERROR An invalid configuration is specified. -!ENDIF - -!IF "$(OS)" == "Windows_NT" -NULL= -!ELSE -NULL=nul -!ENDIF -################################################################################ -# Begin Project -# PROP Target_Last_Scanned "dis - Win32 Debug" - -!IF "$(CFG)" == "dis - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Target_Dir "" -OUTDIR=.\Release -INTDIR=.\Release - -ALL : "prologue - Win32 Release" "..\..\Release\dis.dll" - -CLEAN : - -@erase "$(INTDIR)\basic.obj" - -@erase "$(INTDIR)\datum.obj" - -@erase "$(INTDIR)\datum_table.obj" - -@erase "$(INTDIR)\dis_xdr.obj" - -@erase "$(INTDIR)\dis_xdr2.obj" - -@erase "$(INTDIR)\disx.obj" - -@erase "$(INTDIR)\entity.obj" - -@erase "$(INTDIR)\event.obj" - -@erase "$(INTDIR)\free.obj" - -@erase "$(INTDIR)\globe.obj" - -@erase "$(INTDIR)\io.obj" - -@erase "$(INTDIR)\lookup.obj" - -@erase "$(INTDIR)\register.obj" - -@erase "$(INTDIR)\simmgr_xdr.obj" - -@erase "$(INTDIR)\sitename.obj" - -@erase "$(INTDIR)\sizes.obj" - -@erase "$(INTDIR)\xdr_umem.obj" - -@erase "$(INTDIR)\xdr_var_array.obj" - -@erase "$(OUTDIR)\dis.exp" - -@erase "$(OUTDIR)\dis.lib" - -@erase "..\..\Release\dis.dll" - -@erase "..\dis/dis_xdr.h" - -"$(OUTDIR)" : - if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" - -CPP=cl.exe -# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c -# ADD CPP /nologo /MT /W3 /GX /O2 /I "c:\msdev\include" /I "c:\source\include" /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX"dis\dis.h" /c -CPP_PROJ=/nologo /MT /W3 /GX /O2 /I "c:\msdev\include" /I "c:\source\include"\ - /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /Fp"$(INTDIR)/dis.pch"\ - /YX"dis\dis.h" /Fo"$(INTDIR)/" /c -CPP_OBJS=.\Release/ -CPP_SBRS=.\. - -.c{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.cpp{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.cxx{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.c{$(CPP_SBRS)}.sbr: - $(CPP) $(CPP_PROJ) $< - -.cpp{$(CPP_SBRS)}.sbr: - $(CPP) $(CPP_PROJ) $< - -.cxx{$(CPP_SBRS)}.sbr: - $(CPP) $(CPP_PROJ) $< - -MTL=mktyplib.exe -# ADD BASE MTL /nologo /D "NDEBUG" /win32 -# ADD MTL /nologo /D "NDEBUG" /win32 -MTL_PROJ=/nologo /D "NDEBUG" /win32 -RSC=rc.exe -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -BSC32_FLAGS=/nologo /o"$(OUTDIR)/dis.bsc" -BSC32_SBRS= \ - -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386 -# ADD LINK32 c:\source\oncrpc\Release\oncrpc.lib wsock32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386 /out:"..\..\Release\dis.dll" -LINK32_FLAGS=c:\source\oncrpc\Release\oncrpc.lib wsock32.lib kernel32.lib\ - user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib\ - ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo\ - /subsystem:windows /dll /incremental:no /pdb:"$(OUTDIR)/dis.pdb" /machine:I386\ - /def:".\dis.def" /out:"..\..\Release\dis.dll" /implib:"$(OUTDIR)/dis.lib" -DEF_FILE= \ - ".\dis.def" -LINK32_OBJS= \ - "$(INTDIR)\basic.obj" \ - "$(INTDIR)\datum.obj" \ - "$(INTDIR)\datum_table.obj" \ - "$(INTDIR)\dis_xdr.obj" \ - "$(INTDIR)\dis_xdr2.obj" \ - "$(INTDIR)\disx.obj" \ - "$(INTDIR)\entity.obj" \ - "$(INTDIR)\event.obj" \ - "$(INTDIR)\free.obj" \ - "$(INTDIR)\globe.obj" \ - "$(INTDIR)\io.obj" \ - "$(INTDIR)\lookup.obj" \ - "$(INTDIR)\register.obj" \ - "$(INTDIR)\simmgr_xdr.obj" \ - "$(INTDIR)\sitename.obj" \ - "$(INTDIR)\sizes.obj" \ - "$(INTDIR)\xdr_umem.obj" \ - "$(INTDIR)\xdr_var_array.obj" - -"..\..\Release\dis.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) - $(LINK32) @<< - $(LINK32_FLAGS) $(LINK32_OBJS) -<< - -!ELSEIF "$(CFG)" == "dis - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Target_Dir "" -OUTDIR=.\Debug -INTDIR=.\Debug - -ALL : "prologue - Win32 Debug" "..\..\Debug\dis.dll" - -CLEAN : - -@erase "$(INTDIR)\basic.obj" - -@erase "$(INTDIR)\datum.obj" - -@erase "$(INTDIR)\datum_table.obj" - -@erase "$(INTDIR)\dis_xdr.obj" - -@erase "$(INTDIR)\dis_xdr2.obj" - -@erase "$(INTDIR)\disx.obj" - -@erase "$(INTDIR)\entity.obj" - -@erase "$(INTDIR)\event.obj" - -@erase "$(INTDIR)\free.obj" - -@erase "$(INTDIR)\globe.obj" - -@erase "$(INTDIR)\io.obj" - -@erase "$(INTDIR)\lookup.obj" - -@erase "$(INTDIR)\register.obj" - -@erase "$(INTDIR)\simmgr_xdr.obj" - -@erase "$(INTDIR)\sitename.obj" - -@erase "$(INTDIR)\sizes.obj" - -@erase "$(INTDIR)\vc40.idb" - -@erase "$(INTDIR)\vc40.pdb" - -@erase "$(INTDIR)\xdr_umem.obj" - -@erase "$(INTDIR)\xdr_var_array.obj" - -@erase "$(OUTDIR)\dis.exp" - -@erase "$(OUTDIR)\dis.lib" - -@erase "$(OUTDIR)\dis.pdb" - -@erase "..\..\Debug\dis.dll" - -@erase "..\..\Debug\dis.ilk" - -@erase "..\dis/dis_xdr.h" - -"$(OUTDIR)" : - if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" - -CPP=cl.exe -# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c -# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /I "c:\msdev\include" /I "c:\source\include" /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX"dis\dis.h" /c -CPP_PROJ=/nologo /MTd /W3 /Gm /GX /Zi /Od /I "c:\msdev\include" /I\ - "c:\source\include" /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS"\ - /Fp"$(INTDIR)/dis.pch" /YX"dis\dis.h" /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c -CPP_OBJS=.\Debug/ -CPP_SBRS=.\. - -.c{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.cpp{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.cxx{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.c{$(CPP_SBRS)}.sbr: - $(CPP) $(CPP_PROJ) $< - -.cpp{$(CPP_SBRS)}.sbr: - $(CPP) $(CPP_PROJ) $< - -.cxx{$(CPP_SBRS)}.sbr: - $(CPP) $(CPP_PROJ) $< - -MTL=mktyplib.exe -# ADD BASE MTL /nologo /D "_DEBUG" /win32 -# ADD MTL /nologo /D "_DEBUG" /win32 -MTL_PROJ=/nologo /D "_DEBUG" /win32 -RSC=rc.exe -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -BSC32_FLAGS=/nologo /o"$(OUTDIR)/dis.bsc" -BSC32_SBRS= \ - -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 -# ADD LINK32 c:\source\oncrpc\Debug\oncrpc.lib wsock32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /base:0x11800000 /subsystem:windows /dll /debug /machine:I386 /out:"..\..\Debug\dis.dll" -LINK32_FLAGS=c:\source\oncrpc\Debug\oncrpc.lib wsock32.lib kernel32.lib\ - user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib\ - ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo\ - /base:0x11800000 /subsystem:windows /dll /incremental:yes\ - /pdb:"$(OUTDIR)/dis.pdb" /debug /machine:I386 /def:".\dis.def"\ - /out:"..\..\Debug\dis.dll" /implib:"$(OUTDIR)/dis.lib" -DEF_FILE= \ - ".\dis.def" -LINK32_OBJS= \ - "$(INTDIR)\basic.obj" \ - "$(INTDIR)\datum.obj" \ - "$(INTDIR)\datum_table.obj" \ - "$(INTDIR)\dis_xdr.obj" \ - "$(INTDIR)\dis_xdr2.obj" \ - "$(INTDIR)\disx.obj" \ - "$(INTDIR)\entity.obj" \ - "$(INTDIR)\event.obj" \ - "$(INTDIR)\free.obj" \ - "$(INTDIR)\globe.obj" \ - "$(INTDIR)\io.obj" \ - "$(INTDIR)\lookup.obj" \ - "$(INTDIR)\register.obj" \ - "$(INTDIR)\simmgr_xdr.obj" \ - "$(INTDIR)\sitename.obj" \ - "$(INTDIR)\sizes.obj" \ - "$(INTDIR)\xdr_umem.obj" \ - "$(INTDIR)\xdr_var_array.obj" - -"..\..\Debug\dis.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) - $(LINK32) @<< - $(LINK32_FLAGS) $(LINK32_OBJS) -<< - -!ELSEIF "$(CFG)" == "prologue - Win32 Release" - -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "prologue\Release" -# PROP BASE Intermediate_Dir "prologue\Release" -# PROP BASE Target_Dir "prologue" -# PROP BASE Cmd_Line "NMAKE /f prologue.mak" -# PROP BASE Rebuild_Opt "/a" -# PROP BASE Target_File "prologue\prologue.exe" -# PROP BASE Bsc_Name "prologue\prologue.bsc" -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "prologue\Release" -# PROP Intermediate_Dir "prologue\Release" -# PROP Target_Dir "prologue" -# PROP Cmd_Line "NMAKE /f ..\prologue.mak" -# PROP Rebuild_Opt "/a" -# PROP Target_File "prologue" -# PROP Bsc_Name "" -OUTDIR=.\prologue\Release -INTDIR=.\prologue\Release - -ALL : - -CLEAN : - -@erase - -"$(OUTDIR)" : - if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" - -!ELSEIF "$(CFG)" == "prologue - Win32 Debug" - -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "prologue\Debug" -# PROP BASE Intermediate_Dir "prologue\Debug" -# PROP BASE Target_Dir "prologue" -# PROP BASE Cmd_Line "NMAKE /f prologue.mak" -# PROP BASE Rebuild_Opt "/a" -# PROP BASE Target_File "prologue\prologue.exe" -# PROP BASE Bsc_Name "prologue\prologue.bsc" -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "prologue\Debug" -# PROP Intermediate_Dir "prologue\Debug" -# PROP Target_Dir "prologue" -# PROP Cmd_Line "NMAKE /f ..\prologue.mak" -# PROP Rebuild_Opt "/a" -# PROP Target_File "prologue" -# PROP Bsc_Name "" -OUTDIR=.\prologue\Debug -INTDIR=.\prologue\Debug - -ALL : - -CLEAN : - -@erase - -"$(OUTDIR)" : - if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" - -!ENDIF - -################################################################################ -# Begin Target - -# Name "dis - Win32 Release" -# Name "dis - Win32 Debug" - -!IF "$(CFG)" == "dis - Win32 Release" - -!ELSEIF "$(CFG)" == "dis - Win32 Debug" - -!ENDIF - -################################################################################ -# Begin Source File - -SOURCE=.\xdr_var_array.c -DEP_CPP_XDR_V=\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - - -"$(INTDIR)\xdr_var_array.obj" : $(SOURCE) $(DEP_CPP_XDR_V) "$(INTDIR)" - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\datum.c -DEP_CPP_DATUM=\ - "..\dis/datum.h"\ - "..\dis/dis.h"\ - "..\dis/disenum.h"\ - "..\dis/disenum2.h"\ - "..\dis/disenum3.h"\ - "..\dis/disp.h"\ - "..\dis/simx.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\datum.obj" : $(SOURCE) $(DEP_CPP_DATUM) "$(INTDIR)" - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\datum_table.c -DEP_CPP_DATUM_=\ - "..\dis/datum.h"\ - "..\dis/dis.h"\ - "..\dis/disenum.h"\ - "..\dis/disenum2.h"\ - "..\dis/disenum3.h"\ - "..\dis/disp.h"\ - "..\dis/simx.h"\ - ".\datumtbl.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\datum_table.obj" : $(SOURCE) $(DEP_CPP_DATUM_) "$(INTDIR)" - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\dis_xdr2.c -DEP_CPP_DIS_X=\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - - -"$(INTDIR)\dis_xdr2.obj" : $(SOURCE) $(DEP_CPP_DIS_X) "$(INTDIR)" - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\disx.c -DEP_CPP_DISX_=\ - "..\dis/datum.h"\ - "..\dis/dis.h"\ - "..\dis/disenum.h"\ - "..\dis/disenum2.h"\ - "..\dis/disenum3.h"\ - "..\dis/disp.h"\ - "..\dis/simx.h"\ - ".\simmgr.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\auth.h"\ - "\source\include\rpc\auth_unix.h"\ - "\source\include\rpc\clnt.h"\ - "\source\include\rpc\rpc.h"\ - "\source\include\rpc\rpc_msg.h"\ - "\source\include\rpc\svc.h"\ - "\source\include\rpc\svc_auth.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\disx.obj" : $(SOURCE) $(DEP_CPP_DISX_) "$(INTDIR)" - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\entity.c -DEP_CPP_ENTIT=\ - "..\dis/datum.h"\ - "..\dis/dis.h"\ - "..\dis/disenum.h"\ - "..\dis/disenum2.h"\ - "..\dis/disenum3.h"\ - "..\dis/disp.h"\ - "..\dis/simx.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\entity.obj" : $(SOURCE) $(DEP_CPP_ENTIT) "$(INTDIR)" - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\event.c -DEP_CPP_EVENT=\ - "..\dis/datum.h"\ - "..\dis/dis.h"\ - "..\dis/disenum.h"\ - "..\dis/disenum2.h"\ - "..\dis/disenum3.h"\ - "..\dis/disp.h"\ - "..\dis/simx.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\event.obj" : $(SOURCE) $(DEP_CPP_EVENT) "$(INTDIR)" - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\free.c -DEP_CPP_FREE_=\ - "..\dis/datum.h"\ - "..\dis/dis.h"\ - "..\dis/disenum.h"\ - "..\dis/disenum2.h"\ - "..\dis/disenum3.h"\ - "..\dis/disp.h"\ - "..\dis/simx.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\free.obj" : $(SOURCE) $(DEP_CPP_FREE_) "$(INTDIR)" - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\globe.c -DEP_CPP_GLOBE=\ - "..\dis/datum.h"\ - "..\dis/dis.h"\ - "..\dis/disenum.h"\ - "..\dis/disenum2.h"\ - "..\dis/disenum3.h"\ - "..\dis/disp.h"\ - "..\dis/simx.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\globe.obj" : $(SOURCE) $(DEP_CPP_GLOBE) "$(INTDIR)" - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\io.c -DEP_CPP_IO_C12=\ - "..\dis/datum.h"\ - "..\dis/dis.h"\ - "..\dis/disenum.h"\ - "..\dis/disenum2.h"\ - "..\dis/disenum3.h"\ - "..\dis/disp.h"\ - "..\dis/simx.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\ioctl.h"\ - "\source\include\sys\socket.h"\ - "\source\include\sys\time.h"\ - "\source\include\sys\uio.h"\ - - -"$(INTDIR)\io.obj" : $(SOURCE) $(DEP_CPP_IO_C12) "$(INTDIR)" - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\lookup.c -DEP_CPP_LOOKU=\ - "..\dis/datum.h"\ - "..\dis/dis.h"\ - "..\dis/disenum.h"\ - "..\dis/disenum2.h"\ - "..\dis/disenum3.h"\ - "..\dis/disp.h"\ - "..\dis/simx.h"\ - ".\simmgr.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\auth.h"\ - "\source\include\rpc\auth_unix.h"\ - "\source\include\rpc\clnt.h"\ - "\source\include\rpc\rpc.h"\ - "\source\include\rpc\rpc_msg.h"\ - "\source\include\rpc\svc.h"\ - "\source\include\rpc\svc_auth.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\lookup.obj" : $(SOURCE) $(DEP_CPP_LOOKU) "$(INTDIR)" - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\register.c -DEP_CPP_REGIS=\ - "..\dis/datum.h"\ - "..\dis/dis.h"\ - "..\dis/disenum.h"\ - "..\dis/disenum2.h"\ - "..\dis/disenum3.h"\ - "..\dis/disp.h"\ - "..\dis/simx.h"\ - ".\simmgr.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\auth.h"\ - "\source\include\rpc\auth_unix.h"\ - "\source\include\rpc\clnt.h"\ - "\source\include\rpc\rpc.h"\ - "\source\include\rpc\rpc_msg.h"\ - "\source\include\rpc\svc.h"\ - "\source\include\rpc\svc_auth.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\register.obj" : $(SOURCE) $(DEP_CPP_REGIS) "$(INTDIR)" - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\sitename.c -DEP_CPP_SITEN=\ - "\msdev\include\sys\stat.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\machine\endian.h"\ - "\source\include\machine\limits.h"\ - "\source\include\machine\param.h"\ - "\source\include\machine\signal.h"\ - "\source\include\machine\trap.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\errno.h"\ - "\source\include\sys\param.h"\ - "\source\include\sys\resource.h"\ - "\source\include\sys\signal.h"\ - "\source\include\sys\syslimits.h"\ - "\source\include\sys\time.h"\ - "\source\include\sys\ucred.h"\ - "\source\include\sys\uio.h"\ - - -"$(INTDIR)\sitename.obj" : $(SOURCE) $(DEP_CPP_SITEN) "$(INTDIR)" - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\sizes.c -DEP_CPP_SIZES=\ - "..\dis/datum.h"\ - "..\dis/dis.h"\ - "..\dis/disenum.h"\ - "..\dis/disenum2.h"\ - "..\dis/disenum3.h"\ - "..\dis/disp.h"\ - "..\dis/simx.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\auth.h"\ - "\source\include\rpc\auth_unix.h"\ - "\source\include\rpc\clnt.h"\ - "\source\include\rpc\rpc.h"\ - "\source\include\rpc\rpc_msg.h"\ - "\source\include\rpc\svc.h"\ - "\source\include\rpc\svc_auth.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\sizes.obj" : $(SOURCE) $(DEP_CPP_SIZES) "$(INTDIR)" - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\xdr_umem.c -DEP_CPP_XDR_U=\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - - -"$(INTDIR)\xdr_umem.obj" : $(SOURCE) $(DEP_CPP_XDR_U) "$(INTDIR)" - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\basic.c -DEP_CPP_BASIC=\ - "..\dis/datum.h"\ - "..\dis/dis.h"\ - "..\dis/disenum.h"\ - "..\dis/disenum2.h"\ - "..\dis/disenum3.h"\ - "..\dis/disp.h"\ - "..\dis/simx.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\basic.obj" : $(SOURCE) $(DEP_CPP_BASIC) "$(INTDIR)" - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\xdrhdr.pl - -!IF "$(CFG)" == "dis - Win32 Release" - -# Begin Custom Build - Generating XDR header -InputPath=.\xdrhdr.pl - -"..\dis\dis_xdr.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - copy dis_xdr.c+dis_xdr1.c x.tmp - perl xdrhdr.pl ..\dis\dis_xdr.h -#endif - -struct dis_float_vector { - float x; - float y; - float z; - }; - -struct dis_angular_vel_vector { - float x; - float y; - float z; - }; - -struct dis_linear_acc_vector { - float x; - float y; - float z; - }; - -struct dis_linear_vel_vector { - float x; - float y; - float z; - }; - -struct dis_entity_coord_vector { - float x; - float y; - float z; - }; - -struct dis_entity_type { - unsigned char kind; - unsigned char domain; - unsigned short country; - unsigned char category; - unsigned char subcategory; - unsigned char specific; - unsigned char extra; - }; - -struct dis_entity_marking { - unsigned char charset; - unsigned char marking[11]; - }; - -struct dis_fixed_datum { - unsigned long datum_id; - unsigned long ulong_value; - }; - -#ifdef RPC_HDR -%typedef struct { -% unsigned long datum_id; -% unsigned long value_length; -% union { -% double double_value; -% dis_entity_type entity_type_value; -% unsigned char *ptr_value; -% } value; -% } dis_variable_datum; -% -%typedef struct { -% unsigned time:31; /* 1.676... usec units */ -% unsigned type:1; /* type: 0=relative, 1=absolute */ -% } dis_timestamp; -#endif - -struct dis_simulation_addr { - unsigned short site_id; - unsigned short application_id; - }; - -struct dis_emitter_system { - unsigned short name; - unsigned char function; - unsigned char id; - }; - -struct dis_entity_id { - dis_simulation_addr sim_id; - unsigned short entity_id; - }; - -struct dis_euler_angles { - float psi; - float theta; - float phi; - }; - -struct dis_event_id { - dis_simulation_addr sim_id; - unsigned short event_id; - }; - -struct dis_fundamental_parameters { - float freq; - float freq_range; - float erp; - float prf; - float pulse_width; - float beam_azimuth_center; - float beam_azimuth_sweep; - float beam_elev_center; - float beam_elev_sweep; - float beam_sweep_sync; - }; - -struct dis_modulation_type { - unsigned short spread_spectrum; - unsigned short major_type; - unsigned short detail; - unsigned short system; - }; - -struct dis_pdu_header { - unsigned char protocol_version; - unsigned char exercise_id; - unsigned char pdu_type; - unsigned char protocol_family; - dis_timestamp time_stamp; - unsigned short length; - unsigned short padding; - }; - -struct dis_double_vector { - double x; - double y; - double z; - }; - -struct dis_world_coordinates { - double x; - double y; - double z; - }; - -struct dis_relative_coordinates { - float x; - float y; - float z; - }; - -struct dis_antenna_location { - dis_world_coordinates ant_location; - dis_relative_coordinates relative; - }; - -struct dis_beam_antenna_pattern { - dis_euler_angles direction; - float azimuth_width; - float elev_width; - unsigned char reference_system; - unsigned char pad[3]; - float Ez; - float Ex; - float phase; - }; - -struct dis_spherical_harmonic_antenna_pattern { - unsigned char pattern; - float coefficients; - unsigned char ref_system; - }; - -#ifdef RPC_HDR -%typedef union { -% double d; -% float f[2]; -% char c[8]; -% long l[2]; -% short s[4]; -% } dis_parm_value; -% -%typedef struct { -% unsigned char type; -% unsigned char change; -% unsigned short id; -% unsigned long parm_type; -% dis_parm_value value; -% } dis_articulation_parm; -#endif - -struct dis_time { - unsigned long hour; /* hours since 1 Jan, 1970 */ - dis_timestamp rel; - }; - -struct dis_burst_descriptor { - dis_entity_type munition; - unsigned short warhead; - unsigned short fuze; - unsigned short quantity; - unsigned short rate; - }; - -struct dis_dead_reckoning { - unsigned char algorithm; - unsigned char other[15]; - dis_linear_acc_vector linear_acc; - dis_angular_vel_vector angular_vel; - }; - -typedef unsigned long dis_capabilities; - -struct dis_supply_quantity { - dis_entity_type entity; - float quantity; - }; - -typedef unsigned long dis_entity_appearance; - -/* - * PDUs - */ - -struct dis_entity_state_pdu { - dis_pdu_header hdr; - dis_entity_id id; - unsigned char force_id; - unsigned char art_parm_count; - dis_entity_type type; - dis_entity_type alt_type; - dis_linear_vel_vector vel; - dis_world_coordinates pos; - dis_euler_angles orientation; - dis_entity_appearance appearance; - dis_dead_reckoning dr_parm; - dis_entity_marking marking; - dis_capabilities capabilities; - dis_articulation_parm art_parm[art_parm_count]; - }; - -struct dis_collision_pdu { - dis_pdu_header hdr; - dis_entity_id id; - dis_entity_id collision_id; - dis_event_id event; - dis_linear_vel_vector vel; - unsigned long mass; - dis_entity_coord_vector loc; - }; - -struct dis_fire_pdu { - dis_pdu_header hdr; - dis_entity_id firing_id; - dis_entity_id target_id; - dis_entity_id munition_id; - dis_event_id event; - unsigned long fire_mission_index; - dis_world_coordinates pos; - dis_burst_descriptor burst; - dis_linear_vel_vector vel; - float range; /* meters */ - }; - -struct dis_detonation_pdu { - dis_pdu_header hdr; - dis_entity_id firing_id; - dis_entity_id target_id; - dis_entity_id munition_id; - dis_event_id event; - dis_linear_vel_vector vel; - dis_world_coordinates pos; - dis_burst_descriptor burst; - dis_entity_coord_vector loc; - unsigned char result; - unsigned char num_art_parms; - unsigned short pad; - dis_articulation_parm art_parm[num_art_parms]; - }; - -/* - * Repair/Resupply - */ - -typedef unsigned char dis_service_type; -typedef unsigned short dis_repair_type; -typedef unsigned char dis_repair_result; - -struct dis_service_request_pdu { - dis_pdu_header hdr; - dis_entity_id requestor_id; - dis_entity_id server_id; - dis_service_type requested_service; - unsigned char num_supply_types; - unsigned short pad; - dis_supply_quantity supplies[num_supply_types]; - }; - -struct dis_resupply_offer_pdu { - dis_pdu_header hdr; - dis_entity_id receiver_id; - dis_entity_id supplier_id; - unsigned char num_supply_types; - unsigned char pad[3]; - dis_supply_quantity supplies[num_supply_types]; - }; - -struct dis_resupply_received_pdu { - dis_pdu_header hdr; - dis_entity_id receiver_id; - dis_entity_id supplier_id; - unsigned char num_supply_types; - unsigned char pad[3]; - dis_supply_quantity supplies[num_supply_types]; - }; - -struct dis_resupply_cancel_pdu { - dis_pdu_header hdr; - dis_entity_id receiver_id; - dis_entity_id supplier_id; - }; - -struct dis_repair_complete_pdu { - dis_pdu_header hdr; - dis_entity_id receiver_id; - dis_entity_id supplier_id; - dis_repair_type repair; - unsigned short pad; - }; - -struct dis_repair_response_pdu { - dis_pdu_header hdr; - dis_entity_id receiver_id; - dis_entity_id supplier_id; - dis_repair_result result; - unsigned char pad[3]; - }; - -/* - * Simulation Management - */ - -typedef unsigned long dis_request_id; - -struct dis_create_entity_pdu { - dis_pdu_header hdr; - dis_entity_id orig_id; - dis_entity_id recv_id; - dis_request_id request_id; - }; - -struct dis_remove_entity_pdu { - dis_pdu_header hdr; - dis_entity_id orig_id; - dis_entity_id recv_id; - dis_request_id request_id; - }; - -struct dis_start_pdu { - dis_pdu_header hdr; - dis_entity_id orig_id; - dis_entity_id recv_id; - dis_time real_time; - dis_time sim_time; - dis_request_id request_id; - }; - -struct dis_stop_pdu { - dis_pdu_header hdr; - dis_entity_id orig_id; - dis_entity_id recv_id; - dis_time real_time; - unsigned char reason; - unsigned char behavior; - unsigned char pad[2]; - dis_request_id request_id; - }; - -struct dis_acknowledge_pdu { - dis_pdu_header hdr; - dis_entity_id orig_id; - dis_entity_id recv_id; - unsigned short acknowledge_flag; - unsigned short resp_flag; - dis_request_id request_id; - }; - -struct dis_data_query_pdu { - dis_pdu_header hdr; - dis_entity_id orig_id; - dis_entity_id recv_id; - dis_time interval; - dis_request_id request_id; - unsigned long num_fixed_data; - unsigned long num_variable_data; - unsigned long fixed_datum_id[num_fixed_data]; - unsigned long variable_datum_id[num_variable_data]; - }; - -struct dis_datum_spec_record { - unsigned long num_fixed_data; - unsigned long num_variable_data; - dis_fixed_datum fixed_datum[num_fixed_data]; - dis_variable_datum variable_datum[num_variable_data]; - }; - -struct dis_set_data_pdu { - dis_pdu_header hdr; - dis_entity_id orig_id; - dis_entity_id recv_id; - dis_request_id request_id; - dis_datum_spec_record datum_info; - }; - -struct dis_data_pdu { - dis_pdu_header hdr; - dis_entity_id orig_id; - dis_entity_id recv_id; - dis_request_id request_id; - dis_datum_spec_record datum_info; - }; - -struct dis_event_report_pdu { - dis_pdu_header hdr; - dis_entity_id orig_id; - dis_entity_id recv_id; - dis_event_id event_type; - dis_datum_spec_record datum_info; - }; - -struct dis_message_pdu { - dis_pdu_header hdr; - dis_entity_id orig_id; - dis_entity_id recv_id; - unsigned long pad; - unsigned long num_variable_data; - dis_variable_datum variable_datum[num_variable_data]; - }; - -/* - * Distributed Emission Regeneration PDUs - */ - -struct dis_track_info { - dis_entity_id target; - unsigned char emitter_id; - unsigned char beam_id; - }; - -struct dis_beam_info { - unsigned char beam_data_length; - unsigned char beam_id; - unsigned short beam_parm_index; - dis_fundamental_parameters fundamental; - unsigned char beam_function; - unsigned char num_targets; - unsigned char high_density_track_jam; - unsigned char pad; - unsigned long jamming_mode; - dis_track_info tracked_target[num_targets]; - }; - -struct dis_em_system_info { - unsigned char sys_data_length; - unsigned char num_beams; - unsigned short pad; - dis_emitter_system emitter_system; - dis_entity_coord_vector location; - dis_beam_info beam[num_beams]; - }; - -struct dis_em_emission_pdu { - dis_pdu_header hdr; - dis_entity_id emitter_id; - dis_event_id event; - unsigned char state_update; - unsigned char num_systems; - unsigned short pad; - dis_em_system_info system[num_systems]; - }; - -struct dis_designator_pdu { - dis_pdu_header hdr; - dis_entity_id designating_id; - unsigned short code_name; - dis_entity_id designated_id; - unsigned char pad; - unsigned char code; - float power; /* watts */ - float wavelength; /* microns */ - dis_entity_coord_vector spot_rel; - dis_world_coordinates spot_pos; - }; - -/* - * These two PDUs came to me from CALSPAN; I have no idea where they - * actually originated. - */ - -struct dis_experimental_request_control_pdu { - dis_pdu_header hdr; - dis_entity_id requesting_id; - dis_entity_id control_target_id; -}; - -struct dis_experimental_grant_control_pdu { - dis_pdu_header hdr; - dis_entity_id granting_id; - dis_entity_id control_target_id; -}; - -struct dis_transfer_control_pdu { - dis_pdu_header hdr; - dis_entity_id orig_id; - dis_entity_id recv_id; - unsigned long request_id; - unsigned char reliability_service; - unsigned char transfer_type; - dis_entity_id target_id; - unsigned long num_record_sets; - }; - -#ifdef RPC_HDR -%typedef union { -% dis_pdu_header hdr; -% dis_entity_state_pdu entity_state; -% dis_collision_pdu collision; -% -% dis_fire_pdu fire; -% dis_detonation_pdu detonation; -% -% dis_create_entity_pdu create_entity; -% dis_remove_entity_pdu remove_entity; -% dis_start_pdu start; -% dis_stop_pdu stop; -% dis_acknowledge_pdu acknowledge; -% dis_data_query_pdu data_query; -% dis_set_data_pdu set_data; -% dis_data_pdu data; -% dis_event_report_pdu event_report; -% dis_message_pdu message; -% -% dis_em_emission_pdu em_emission; -% dis_designator_pdu designator; -% dis_transfer_control_pdu transfer_control; -% dis_experimental_request_control_pdu request_control; -% dis_experimental_grant_control_pdu grant_control; -% } dis_pdu; -#endif diff -Nru acm-5.0/dis/lib/disx.c acm-6.0+20200416/dis/lib/disx.c --- acm-5.0/dis/lib/disx.c 1998-12-09 21:54:06.000000000 +0000 +++ acm-6.0+20200416/dis/lib/disx.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,187 +0,0 @@ - -/* - * DIS/x : An implementation of the IEEE 1278.1 protocol - * - * Copyright (C) 1996, Riley Rainey (rainey@netcom.com) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of either: - * - * a) the GNU Library General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your - * option) any later version. A description of the terms and conditions - * of the GLPL may be found in the "COPYING.LIB" file. - * - * b) the "Artistic License" which comes with this Kit. Information - * about this license may be found in the "Artistic" file. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License or the Artistic License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the Free - * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * Information describing how to contact the author can be found in the - * README file. - */ -#include -#include -#include - -/* - * This table defines the correct protocol family based on the pdu type - */ - -static unsigned char pdu_family[256] = -{ - 0, 1, 2, 2, 1, 3, 3, 3, 3, 3, 3, 5, 5, 5, 5, 5, /* 0..15 */ - 5, 5, 5, 5, 5, 5, 5, 6, 6, 4, 4, 0, 0, 0, 0, 0, /* 16..31 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 32..47 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 48..63 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 64..79 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 80..95 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 96..111 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 112..127 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 128..143 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 144..159 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 160..175 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 176..191 */ -}; - -static int protocol_version = DISProtocolVersionIEEE1278_95; - -int -DISxSetProtocolVersion(int version) -{ - int result = protocol_version; - - protocol_version = version; - return result; -} - -int -DISxSetPDUProtocolFamily (int pdu_type, int protocol_family) -{ - int result; - - if (pdu_type < 0 || pdu_type > 255) { - return -1; - } - - result = pdu_family[pdu_type]; - pdu_family[pdu_type] = protocol_family; - return result; -} - -int DISxPortNumber = -1; - -DISxApplicationInfo * -DISxInitializeApplication(unsigned int exercise_id, - unsigned int site_id, - unsigned int application_id) -{ - char name[64]; - int result; - - DISxApplicationInfo *p = (DISxApplicationInfo *) - malloc(sizeof(DISxApplicationInfo)); - - if (!p) { - return p; - } - p->hdr.protocol_version = protocol_version; - p->hdr.exercise_id = exercise_id; - p->hdr.padding = 0; - - p->last_event = 0; - p->last_entity = 0; - p->last_request = 0; - - p->xcvr = DISOpenTransceiver(DISxPortNumber); - if (!p->xcvr) { - free(p); - return NULL; - } - if (DISSetNBIOState(p->xcvr, 1) != 0) { - free(p); - return NULL; - } - if (site_id != 0 && application_id != 0) { - p->id.site_id = site_id; - p->id.application_id = application_id; - result = SIMx_SUCCESS; - } - else { - -/* - * if the site_id is zero, then the site name can be looked-up - */ - if (site_id == 0) { - SIMxGetSiteName(name, sizeof(name)); - } - else { - sprintf(name, "0x%x", site_id); - } - - result = SIMxRegisterApplication((char *) NULL, - name, application_id, &p->id); - } - - return (result == SIMx_SUCCESS) ? p : NULL; -} - -void -DISxGetSimulationAddress(DISxApplicationInfo * info, - dis_simulation_addr * p) -{ - *p = info->id; -} - -void -DISxSetExerciseID(DISxApplicationInfo * info, - int id) -{ - info->hdr.exercise_id = id; -} - -int -DISxWritePDU(DISxApplicationInfo * info, dis_pdu * p) -{ - p->hdr.protocol_version = info->hdr.protocol_version; - p->hdr.exercise_id = info->hdr.exercise_id; - p->hdr.protocol_family = pdu_family[p->hdr.pdu_type]; - /* don't set time here until there is a function to set - the value (time) and type (relative/absolute) of the time - in the DISx library - DISGetTimestamp(&p->hdr.time_stamp); */ - return DISWritePDU(info->xcvr, p); -} - -int -DISxReadPDU(DISxApplicationInfo * info, dis_pdu * p) -{ - return DISReadPDU(info->xcvr, p); -} - -void -DISxCloseApplication(DISxApplicationInfo * info) -{ - DISCloseTransceiver(info->xcvr); - free(info); -} - -dis_request_id -DISxIssueRequestID( DISxApplicationInfo * info ) -{ - dis_request_id result; - - result = ++info->last_request; - if ( info->last_request == 0xfffffff ) { - info->last_request = 0; - } - return result; -} - diff -Nru acm-5.0/dis/lib/dis_xdr1.c acm-6.0+20200416/dis/lib/dis_xdr1.c --- acm-5.0/dis/lib/dis_xdr1.c 1998-12-09 21:54:09.000000000 +0000 +++ acm-6.0+20200416/dis/lib/dis_xdr1.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,206 +0,0 @@ - -/* - * DIS/x : An implementation of the IEEE 1278.1 protocol - * - * Copyright (C) 1996, Riley Rainey (rainey@netcom.com) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of either: - * - * a) the GNU Library General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your - * option) any later version. A description of the terms and conditions - * of the GLPL may be found in the "COPYING.LIB" file. - * - * b) the "Artistic License" which comes with this Kit. Information - * about this license may be found in the "Artistic" file. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License or the Artistic License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the Free - * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * Information describing how to contact the author can be found in the - * README file. - */ -/* - * This file was manually generated. It was NOT created by RPCGEN. - * It contains xdr definitions for structures that do not fit the - * convetional RPCGEN structure model for variable length vectors or - * union definitions. - */ - -#include -#include -#define _DIS_PRIVATE 1 -#include - -bool_t -xdr_dis_variable_datum(XDR * xdrs, dis_variable_datum * objp) -{ - static char pad[8]; /* force padding to be zeroes */ - int padbytes; - - if (!xdr_u_long(xdrs, &objp->datum_id)) { - return (FALSE); - } - if (!xdr_u_long(xdrs, &objp->value_length)) { - return (FALSE); - } - - switch (objp->datum_id) { - - /* - * Double variable data items - */ - - case DatumGeocentricCoordinatesX: - case DatumGeocentricCoordinatesY: - case DatumGeocentricCoordinatesZ: - if (!xdr_double(xdrs, &objp->value.double_value)) { - return (FALSE); - } - break; - - /* - * Datum type defaults to String - */ - - default: - if (!xdr_vector(xdrs, (char *) &objp->value.ptr_value, - (unsigned int) objp->value_length / 8, - sizeof(char), - (xdrproc_t) xdr_u_char)) { - return (FALSE); - } - break; - } - - padbytes = 8 - (objp->value_length % 8); - if (padbytes != 0) { - if (!xdr_vector(xdrs, pad, padbytes, sizeof(char), (xdrproc_t) xdr_char)) { - return (FALSE); - } - } - return TRUE; -} - -bool_t -xdr_dis_articulation_parm(XDR * xdrs, dis_articulation_parm * objp) -{ - if (!xdr_byte_u_char(xdrs, &objp->type)) { - return (FALSE); - } - if (!xdr_byte_u_char(xdrs, &objp->change)) { - return (FALSE); - } - if (!xdr_byte_short(xdrs, &objp->id)) { - return (FALSE); - } - if (!xdr_byte_long(xdrs, (char *) &objp->type)) { - return (FALSE); - } - switch (objp->type) { - default: - objp->value.l[0] = 0; - objp->value.l[1] = 0; - } - return TRUE; -} - -bool_t -xdr_dis_timestamp(XDR * xdrs, dis_timestamp * objp) -{ - if (!xdr_u_long(xdrs, (unsigned long *) objp)) { - return (FALSE); - } - return TRUE; -} - -bool_t -xdr_dis_pdu(XDR * xdrs, dis_pdu * objp) -{ - u_long pos; - - if (xdrs->x_op == XDR_DECODE) { - - pos = xdr_getpos(xdrs); - - if (!xdr_dis_pdu_header(xdrs, (dis_pdu_header *) objp)) { - return (FALSE); - } - - if (!xdr_setpos(xdrs, pos)) { - return (FALSE); - } - } - - switch (objp->hdr.pdu_type) { - case PDUTypeEntityState: - if (!xdr_dis_entity_state_pdu(xdrs, (dis_entity_state_pdu *) objp)) { - return (FALSE); - } - break; - case PDUTypeCollision: - if (!xdr_dis_collision_pdu(xdrs, (dis_collision_pdu *) objp)) { - return (FALSE); - } - break; - case PDUTypeFire: - if (!xdr_dis_fire_pdu(xdrs, (dis_fire_pdu *) objp)) { - return (FALSE); - } - break; - case PDUTypeDetonation: - if (!xdr_dis_detonation_pdu(xdrs, (dis_detonation_pdu *) objp)) { - return (FALSE); - } - break; - case PDUTypeCreateEntity: - if (!xdr_dis_create_entity_pdu(xdrs, - (dis_create_entity_pdu *) objp)) { - return (FALSE); - } - break; - case PDUTypeRemoveEntity: - if (!xdr_dis_remove_entity_pdu(xdrs, - (dis_remove_entity_pdu *) objp)) { - return (FALSE); - } - break; - case PDUTypeStopFreeze: - if (!xdr_dis_stop_pdu(xdrs, (dis_stop_pdu *) objp)) { - return (FALSE); - } - break; - case PDUTypeStartResume: - if (!xdr_dis_start_pdu(xdrs, (dis_start_pdu *) objp)) { - return (FALSE); - } - break; - case PDUTypeEmission: - if (xdrs->x_op == XDR_DECODE) { - ((dis_em_emission_pdu *) objp)->system = NULL; - } - if (!xdr_dis_em_emission_pdu(xdrs, - (dis_em_emission_pdu *) objp)) { - return (FALSE); - } - break; - case PDUTypeTransferControl: - if (!xdr_dis_transfer_control_pdu(xdrs, (dis_transfer_control_pdu *) objp)) { - return (FALSE); - } - break; - case PDUTypeAcknowledge: - if (!xdr_dis_acknowledge_pdu(xdrs, (dis_acknowledge_pdu *) objp)) { - return (FALSE); - } - break; - } - return TRUE; -} diff -Nru acm-5.0/dis/lib/dis_xdr2.c acm-6.0+20200416/dis/lib/dis_xdr2.c --- acm-5.0/dis/lib/dis_xdr2.c 1998-05-12 03:43:02.000000000 +0000 +++ acm-6.0+20200416/dis/lib/dis_xdr2.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,155 +0,0 @@ -/* - * DIS/x : An implementation of the IEEE 1278.1 protocol - * - * Copyright (C) 1996, Riley Rainey (rainey@netcom.com) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of either: - * - * a) the GNU Library General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your - * option) any later version. A description of the terms and conditions - * of the GLPL may be found in the "COPYING.LIB" file. - * - * b) the "Artistic License" which comes with this Kit. Information - * about this license may be found in the "Artistic" file. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License or the Artistic License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the Free - * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * Information describing how to contact the author can be found in the - * README file. - */ -#include -#include -#include -#ifndef WIN32 -#include -#endif - -bool_t xdr_byte_opaque(XDR * xdrs, caddr_t cp, u_int cnt); - -/* - * These xdr_byte_ routines act just as their xdr_ equivalents except that - * input data is not required to be aligned on a 4-byte boundary. This - * implies that data alignment is the responsibility of the protocol - * designer. - */ - -bool_t -xdr_byte_long(XDR * xdrs, void *vcp) -{ - long u; - long int *cp = (long int *) vcp; - - u = htonl(*cp); - if (!xdr_byte_opaque(xdrs, (caddr_t) & u, 4)) { - return (FALSE); - } - *cp = ntohl(u); - return (TRUE); -} - -bool_t -xdr_byte_u_long(XDR * xdrs, void * vcp) -{ - u_long u, *cp = (u_long *) vcp; - - u = htonl(*cp); - if (!xdr_byte_opaque(xdrs, (caddr_t) & u, 4)) { - return (FALSE); - } - *cp = ntohl(u); - return (TRUE); -} - -bool_t -xdr_byte_short(XDR * xdrs, void *vcp) -{ - short u; - short *cp = (short *) vcp; - - u = htons(*cp); - if (!xdr_byte_opaque(xdrs, (caddr_t) & u, 2)) { - return (FALSE); - } - *cp = ntohs(u); - return (TRUE); -} - -bool_t -xdr_byte_u_short(XDR * xdrs, void * vcp) -{ - u_short u; - u_short *cp = (u_short *) vcp; - - u = htons(*cp); - if (!xdr_byte_opaque(xdrs, (caddr_t) & u, 2)) { - return (FALSE); - } - *cp = ntohs(u); - return (TRUE); -} - -bool_t -xdr_byte_char(XDR * xdrs, void *vcp) -{ - char i, *cp = (char *) vcp; - - i = (*cp); - if (!xdr_byte_opaque(xdrs, &i, 1)) { - return (FALSE); - } - *cp = i; - return (TRUE); -} - -bool_t -xdr_byte_u_char(XDR * xdrs, void * vcp) -{ - u_char u, *cp = (u_char *) vcp; - - u = (*cp); - if (!xdr_byte_opaque(xdrs, &u, 1)) { - return (FALSE); - } - *cp = u; - return (TRUE); -} - -bool_t -xdr_byte_opaque(register XDR * xdrs, caddr_t cp, register u_int cnt) -{ - - /* - * if no data we are done - */ - if (cnt == 0) - return (TRUE); - - if (xdrs->x_op == XDR_DECODE) { - if (!XDR_GETBYTES(xdrs, cp, cnt)) { - return (FALSE); - } - return (TRUE); - } - - if (xdrs->x_op == XDR_ENCODE) { - if (!XDR_PUTBYTES(xdrs, cp, cnt)) { - return (FALSE); - } - return (TRUE); - } - - if (xdrs->x_op == XDR_FREE) { - return (TRUE); - } - - return (FALSE); -} diff -Nru acm-5.0/dis/lib/dr.c acm-6.0+20200416/dis/lib/dr.c --- acm-5.0/dis/lib/dr.c 1998-12-06 23:41:09.000000000 +0000 +++ acm-6.0+20200416/dis/lib/dr.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,323 +0,0 @@ - -/* - * DIS/x : An implementation of the IEEE 1278.1 protocol - * - * Copyright (C) 1997-1998, Riley Rainey (rainey@netcom.com) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of either: - * - * a) the GNU Library General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your - * option) any later version. A description of the terms and conditions - * of the GLPL may be found in the "COPYING.LIB" file. - * - * b) the "Artistic License" which comes with this Kit. Information - * about this license may be found in the "Artistic" file. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License or the Artistic License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the Free - * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * Information describing how to contact the author can be found in the - * README file. - */ - -#include -#include - -void -DISEulerToMatrix(dis_euler_angles * ea, VMatrix * m) -{ - - double sinPhi, cosPhi, sinTheta, cosTheta, sinPsi, cosPsi; - - sinPhi = sin(ea->phi); - cosPhi = cos(ea->phi); - sinTheta = sin(ea->theta); - cosTheta = cos(ea->theta); - sinPsi = sin(ea->psi); - cosPsi = cos(ea->psi); - - m->m[0][0] = cosTheta * cosPsi; - m->m[0][1] = sinPhi * sinTheta * cosPsi - cosPhi * sinPsi; - m->m[0][2] = cosPhi * sinTheta * cosPsi + sinPhi * sinPsi; - m->m[1][0] = cosTheta * sinPsi; - m->m[1][1] = sinPhi * sinTheta * sinPsi + cosPhi * cosPsi; - m->m[1][2] = cosPhi * sinTheta * sinPsi - sinPhi * cosPsi; - m->m[2][0] = -sinTheta; - m->m[2][1] = sinPhi * cosTheta; - m->m[2][2] = cosPhi * cosTheta; - m->m[0][3] = m->m[1][3] = m->m[2][3] = 0.0; - m->m[3][0] = m->m[3][1] = m->m[3][2] = 0.0; - m->m[3][3] = 1.0; -} - -void -DISProcessNewDRParameters(dis_entity_state_pdu * pdu, dis_dr_parameters * dr) -{ - switch (pdu->dr_parm.algorithm) { - case DISDRMethodRPB: - case DISDRMethodRVB: - case DISDRMethodRPW: - case DISDRMethodRVW: - DISGenerateDRParameters(pdu, dr); - break; - - case DISDRMethodStatic: - case DISDRMethodFPW: - case DISDRMethodFVW: - case DISDRMethodFPB: - case DISDRMethodFVB: - break; - - case DISDRMethodOther: - default: - break; - } - - dr->pdu = *pdu; - DISEulerToMatrix(&pdu->orientation, &dr->R0); -} - -void -DISGenerateDRParameters(dis_entity_state_pdu * pdu, dis_dr_parameters * dr) -{ - double ox, oy, oz; - double ax = 0.0, ay = 0.0, az = 0.0; - double omega; - - ox = pdu->dr_parm.angular_vel.x; - oy = pdu->dr_parm.angular_vel.y; - oz = pdu->dr_parm.angular_vel.z; - omega = sqrt(ox * ox + oy * oy + oz * oz); - - if (omega > 0.0) { - ax = ox / omega; - ay = oy / omega; - az = oz / omega; - } - - dr->omega = omega; - - dr->skew.m[0][0] = dr->skew.m[1][1] = dr->skew.m[2][2] = 0.0; - dr->skew.m[1][0] = -az; - dr->skew.m[0][1] = az; - dr->skew.m[2][0] = ay; - dr->skew.m[0][2] = -ay; - dr->skew.m[2][1] = -ax; - dr->skew.m[1][2] = ax; - - dr->aat.m[0][0] = ax * ax; - dr->aat.m[1][0] = ax * ay; - dr->aat.m[2][0] = ax * az; - dr->aat.m[0][1] = ay * ax; - dr->aat.m[1][1] = ay * ay; - dr->aat.m[2][1] = ay * az; - dr->aat.m[0][2] = az * ax; - dr->aat.m[1][2] = az * ay; - dr->aat.m[2][2] = az * az; -} - -void -DISComputeDRPosition(dis_dr_parameters * dr, - double dT, - dis_world_coordinates * pos, - dis_linear_vel_vector * vel, - VMatrix * orientation) -{ - VMatrix DR; - double hDTSqr; - dis_entity_state_pdu * pdu = &dr->pdu; - *vel = pdu->vel; - - /* Position */ - - switch (dr->pdu.dr_parm.algorithm) { - - case DISDRMethodRPB: - case DISDRMethodRVB: - /* todo: position */ - /* todo: orientation */ - break; - - case DISDRMethodFPB: - case DISDRMethodFVB: - /* todo: position */ - *orientation = dr->R0; - break; - - case DISDRMethodRPW: - pos->x = pdu->pos.x + pdu->vel.x * dT; - pos->y = pdu->pos.y + pdu->vel.y * dT; - pos->z = pdu->pos.z + pdu->vel.z * dT; - - DISComputeDRMatrix(dr, dT, &DR); - DISMatrixMultByRank(&DR, &dr->R0, orientation, 3); - break; - - case DISDRMethodRVW: - hDTSqr = 0.5 * dT * dT; - pos->x = pdu->pos.x + pdu->vel.x * dT + - pdu->dr_parm.linear_acc.x * hDTSqr; - pos->y = pdu->pos.y + pdu->vel.y * dT + - pdu->dr_parm.linear_acc.y * hDTSqr; - pos->z = pdu->pos.z + pdu->vel.z * dT + - pdu->dr_parm.linear_acc.z * hDTSqr; - vel->x = (float) (pdu->vel.x + pdu->dr_parm.linear_acc.x * dT); - vel->y = (float) (pdu->vel.y + pdu->dr_parm.linear_acc.y * dT); - vel->z = (float) (pdu->vel.z + pdu->dr_parm.linear_acc.z * dT); - - DISComputeDRMatrix(dr, dT, &DR); - DISMatrixMultByRank(&DR, &dr->R0, orientation, 3); - - break; - - case DISDRMethodStatic: - *pos = pdu->pos; - *orientation = dr->R0; - break; - - case DISDRMethodFPW: - pos->x = pdu->pos.x + pdu->vel.x * dT; - pos->y = pdu->pos.y + pdu->vel.y * dT; - pos->z = pdu->pos.z + pdu->vel.z * dT; - - *orientation = dr->R0; - - break; - - case DISDRMethodFVW: - hDTSqr = 0.5 * dT * dT; - pos->x = pdu->pos.x + pdu->vel.x * dT + - pdu->dr_parm.linear_acc.x * hDTSqr; - pos->y = pdu->pos.y + pdu->vel.y * dT + - pdu->dr_parm.linear_acc.y * hDTSqr; - pos->z = pdu->pos.z + pdu->vel.z * dT + - pdu->dr_parm.linear_acc.z * hDTSqr; - vel->x = (float) (pdu->vel.x + pdu->dr_parm.linear_acc.x * dT); - vel->y = (float) (pdu->vel.y + pdu->dr_parm.linear_acc.y * dT); - vel->z = (float) (pdu->vel.z + pdu->dr_parm.linear_acc.z * dT); - - *orientation = dr->R0; - - break; - - case DISDRMethodOther: - /* how on earth would we handle this? callbacks, perhaps? */ - break; - - default: - /* how on earth would we handle this? callbacks, perhaps? */ - break; - } - -} - -void -DISComputeDRMatrix(dis_dr_parameters * dr, double dT, VMatrix * m) -{ - double theta = dr->omega * dT; - double cosTheta = cos(theta); - double sinTheta = sin(theta); - double Icos, x = (1.0 - cosTheta); - int i, j; - - for (i = 0; i < 3; ++i) { - for (j = 0; j < 3; ++j) { - if (i == j) { - Icos = cosTheta; - } - else { - Icos = 0.0; - } - m->m[i][j] = Icos - - dr->skew.m[i][j] * sinTheta + - dr->aat.m[i][j] * x; - } - } - - m->m[0][3] = m->m[1][3] = m->m[2][3] = 0.0; - m->m[3][0] = m->m[3][1] = m->m[3][2] = 0.0; - m->m[3][3] = 1.0; -} - -void -DISGetDRThresholds(dis_dr_parameters * dr, double *time, double *location, double *orientation) -{ - *time = dr->timeThreshold; - *location = dr->locationThreshold; - *orientation = dr->orientationThreshold; -} - -void -DISSetDRThresholds(dis_dr_parameters * dr, double time, double location, double orientation) -{ - dr->timeThreshold = time; - dr->locationThreshold = location; - dr->orientationThreshold = orientation; -} - -int -DISTestDRThresholds(dis_dr_parameters *dr, double delta, - dis_world_coordinates *loc, - dis_euler_angles *current_orientation_ea) -{ - int result = 0; - dis_world_coordinates dr_loc, d_loc; - dis_linear_vel_vector dr_vel; - double d_squared, d1, d2, d3, orientation_error_squared; - VMatrix dr_orientation, cur_orientation; - - if (delta > dr->timeThreshold) { - result |= DR_TIME; - } - else { - - DISComputeDRPosition(dr, - delta, - &dr_loc, - &dr_vel, - &dr_orientation); - - d_loc.x = loc->x - dr_loc.x; - d_loc.y = loc->y - dr_loc.y; - d_loc.z = loc->z - dr_loc.z; - d_squared = d_loc.x * d_loc.x + d_loc.y * d_loc.y + d_loc.z * d_loc.z; - - if (d_squared > dr->locationThreshold * dr->locationThreshold) { - result |= DR_LOCATION; - } - - DISEulerToMatrix (current_orientation_ea, &cur_orientation); - - d1= dr_orientation.m[0][0] * cur_orientation.m[0][0] + - dr_orientation.m[0][1] * cur_orientation.m[0][1] + - dr_orientation.m[0][2] * cur_orientation.m[0][2] ; - d2= dr_orientation.m[1][0] * cur_orientation.m[1][0] + - dr_orientation.m[1][1] * cur_orientation.m[1][1] + - dr_orientation.m[1][2] * cur_orientation.m[1][2] ; - d3= dr_orientation.m[2][0] * cur_orientation.m[2][0] + - dr_orientation.m[2][1] * cur_orientation.m[2][1] + - dr_orientation.m[2][2] * cur_orientation.m[2][2] ; - - d1 = 1.0 - d1 * d1; - d2 = 1.0 - d2 * d2; - d3 = 1.0 - d3 * d3; - - orientation_error_squared = d1 * d1 + d2 * d2 + d3 * d3; - - if (orientation_error_squared > - dr-> orientationThreshold * dr-> orientationThreshold) { - result |= DR_ORIENTATION; - } - - } - - return result; -} diff -Nru acm-5.0/dis/lib/entity.c acm-6.0+20200416/dis/lib/entity.c --- acm-5.0/dis/lib/entity.c 1998-05-12 03:43:02.000000000 +0000 +++ acm-6.0+20200416/dis/lib/entity.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,41 +0,0 @@ - -/* - * DIS/x : An implementation of the IEEE 1278.1 protocol - * - * Copyright (C) 1996, Riley Rainey (rainey@netcom.com) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of either: - * - * a) the GNU Library General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your - * option) any later version. A description of the terms and conditions - * of the GLPL may be found in the "COPYING.LIB" file. - * - * b) the "Artistic License" which comes with this Kit. Information - * about this license may be found in the "Artistic" file. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License or the Artistic License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the Free - * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * Information describing how to contact the author can be found in the - * README file. - */ -#include - -dis_entity_id * -DISxIssueEntityID(DISxApplicationInfo * info, dis_entity_id * e) -{ - e->sim_id = info->id; - e->entity_id = ++info->last_entity; - if (info->last_event == 0xfffe) { - info->last_event = 0; - } - return e; -} diff -Nru acm-5.0/dis/lib/event.c acm-6.0+20200416/dis/lib/event.c --- acm-5.0/dis/lib/event.c 1998-05-12 03:43:02.000000000 +0000 +++ acm-6.0+20200416/dis/lib/event.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,40 +0,0 @@ -/* - * DIS/x : An implementation of the IEEE 1278.1 protocol - * - * Copyright (C) 1996, Riley Rainey (rainey@netcom.com) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of either: - * - * a) the GNU Library General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your - * option) any later version. A description of the terms and conditions - * of the GLPL may be found in the "COPYING.LIB" file. - * - * b) the "Artistic License" which comes with this Kit. Information - * about this license may be found in the "Artistic" file. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License or the Artistic License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the Free - * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * Information describing how to contact the author can be found in the - * README file. - */ -#include - -dis_event_id * -DISxIssueEventID(DISxApplicationInfo * info, dis_event_id * event) -{ - event->sim_id = info->id; - event->event_id = ++info->last_event; - if (info->last_event == 0xffff) { - info->last_event = 0; - } - return event; -} diff -Nru acm-5.0/dis/lib/exports.pl acm-6.0+20200416/dis/lib/exports.pl --- acm-5.0/dis/lib/exports.pl 1997-04-10 19:00:28.000000000 +0000 +++ acm-6.0+20200416/dis/lib/exports.pl 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ -opendir (dir, '.'); -print "exports\n"; -foreach $i (readdir(dir)) { - next if ($i eq '.' || $i eq '..'); - if ($i =~ /\.C/ || $i =~ /\.c/) { - print "; $i\n"; - open (file, $i) || die "unable to open $i: $!\n"; - $static = 0; - while () { - if (/^static/) { - $static = 1; - } - elsif (/^[a-z_A-Z].*\(/ ) { - ($name) = split ( /\s*\(/ ); - if ($static == 1) { - $static = 0; - next; - } - next if $name =~ /\s/; - print "\t$name\n"; - $static = 0; - } - else { - $static = 0; - } - } - close (file); - } - diff -Nru acm-5.0/dis/lib/free.c acm-6.0+20200416/dis/lib/free.c --- acm-5.0/dis/lib/free.c 1998-05-12 03:43:02.000000000 +0000 +++ acm-6.0+20200416/dis/lib/free.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,73 +0,0 @@ -/* - * DIS/x : An implementation of the IEEE 1278.1 protocol - * - * Copyright (C) 1996, Riley Rainey (rainey@netcom.com) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of either: - * - * a) the GNU Library General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your - * option) any later version. A description of the terms and conditions - * of the GLPL may be found in the "COPYING.LIB" file. - * - * b) the "Artistic License" which comes with this Kit. Information - * about this license may be found in the "Artistic" file. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License or the Artistic License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the Free - * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * Information describing how to contact the author can be found in the - * README file. - */ -#include - -void -DISFreePDUComponents(dis_pdu * p) -{ - int i, j; - - switch (p->hdr.pdu_type) { - case PDUTypeEmission: - { - dis_em_emission_pdu *pdu = (dis_em_emission_pdu *) p; - dis_em_system_info *s = pdu->system; - dis_beam_info *b; - - for (i = 0; i < pdu->num_systems; ++i, ++s) { - b = s->beam; - for (j = 0; j < s->num_beams; ++j, ++b) { - if (b->num_targets > 0) { - free((char *) b->tracked_target); - } - } - if (s->num_beams > 0) { - free((char *) s->beam); - } - } - if (pdu->num_systems > 0) { - free((char *) pdu->system); - } - } - break; - - case PDUTypeEntityState: - { - dis_entity_state_pdu *pdu = (dis_entity_state_pdu *) p; - - if (pdu->art_parm_count > 0) { - free(pdu->art_parm); - } - } - break; - - default: - break; - } -} diff -Nru acm-5.0/dis/lib/gen.pl acm-6.0+20200416/dis/lib/gen.pl --- acm-5.0/dis/lib/gen.pl 1998-08-14 21:13:25.000000000 +0000 +++ acm-6.0+20200416/dis/lib/gen.pl 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ -print "..\\..\\Debug\\disgen .\\dis.x\n"; -system ("..\\..\\Debug\\disgen .\\dis.x"); -system ("copy dis.h ..\\dis\\disp.h"); - - - diff -Nru acm-5.0/dis/lib/globe.c acm-6.0+20200416/dis/lib/globe.c --- acm-5.0/dis/lib/globe.c 1998-12-09 21:54:13.000000000 +0000 +++ acm-6.0+20200416/dis/lib/globe.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,685 +0,0 @@ -/* - * DIS/x : An implementation of the IEEE 1278.1 protocol - * - * Copyright (C) 1996,1998, Riley Rainey (rrainey@ix.netcom.com) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of either: - * - * a) the GNU Library General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your - * option) any later version. A description of the terms and conditions - * of the GLPL may be found in the "COPYING.LIB" file. - * - * b) the "Artistic License" which comes with this Kit. Information - * about this license may be found in the "Artistic" file. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License or the Artistic License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the Free - * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * Information describing how to contact the author can be found in the - * README file. - */ - -#include -#include -#include -#include -#ifdef HAVE_STDLIB_H -#include -#endif - -#ifndef M_PI_2 -#define M_PI_2 1.57079632679489661923 -#endif - -/* - * In the DIS 2.0 coordinate system: - * - * positive Z axis is North; - * positive X axis points to 0N, 0E; - * positive Y axis points to 0N 90E. - * - * So, North latitudes are positive; East longitudes are positive. - * - * The world is considered a perfect ellipsoid based on the WGS84 - * standard -- no correction is made to take into account height differences - * between the ellpsoid and the geoid. - * - * "The Surveying Handbook", edited by Brinker and Minnick contains a decent - * discussion of the technical issues required to understand what's - * going on in this code. - */ - -/* - * Shift location d meters on a given geodetic course (radians) - */ - -void -DISUpdateWorldCoordinates(WorldCoordinates * p, - double cos_course, double sin_course, double d_meters) -{ - double n1, n2, m1; - double sin_lat, sin_lat_sqr, tan_lat, sin_course_sqr; - double delta_latitude, delta_longitude, d_sqr, cos_lat; - double B, C, /* D, */ E, h, sin_newlat; - -/* Increase our height to the height above the reference ellipsoid */ - - double wgs84_a = WGS84_MAJOR + p->z; - - sin_lat = sin(p->latitude); - sin_lat_sqr = sin_lat * sin_lat; - cos_lat = cos(p->latitude); - tan_lat = sin_lat / cos_lat; - sin_course_sqr = sin_course * sin_course; - d_sqr = d_meters * d_meters; - - n1 = wgs84_a / sqrt(1.0 - WGS84_ECC_SQR * sin_lat_sqr); - m1 = (wgs84_a * (1.0 - WGS84_ECC_SQR)) / - pow(1.0 - WGS84_ECC_SQR * sin_lat_sqr, 1.5); - - B = 1.0 / m1; - - h = d_meters * B * cos_course; - - C = tan_lat / (2.0 * m1 * n1); - -#ifdef notdef - D = (3.0 * WGS84_ECC_SQR * sin_lat * cos_lat) / - (2.0 * (1.0 - WGS84_ECC_SQR * sin_lat_sqr)); -#endif - - E = (1.0 + 3.0 * tan_lat * tan_lat) * - (1.0 - WGS84_ECC_SQR * sin_lat_sqr) / (6.0 * wgs84_a * wgs84_a); - - delta_latitude = d_meters * B * cos_course - - d_sqr * C * sin_course_sqr - - h * d_sqr * E * sin_course_sqr; - - p->latitude += delta_latitude; - if (p->latitude > M_PI_2) { - p->latitude -= M_PI_2; - } - else if (p->latitude < -M_PI_2) { - p->latitude += M_PI_2; - } - - sin_newlat = sin(p->latitude); - - n2 = wgs84_a / sqrt(1.0 - WGS84_ECC_SQR * sin_newlat * sin_newlat); - - delta_longitude = (d_meters * sin_course) / (n2 * cos(p->latitude)); - - p->longitude += delta_longitude; - if (p->longitude > M_PI) { - p->longitude -= M_PI; - } - else if (p->longitude < -M_PI) { - p->longitude += M_PI; - } -} - -/* - * Shift location d_meters meters on a given geodetic course (radians) - * returns new outbound heading correct for the new location in delta_course_rad - */ - -void -DISUpdateWorldCoordinatesEx(WorldCoordinates * p, - double cos_course, double sin_course, double d_meters, - double * delta_course_rad ) -{ - double n1, n2, m1; - double sin_lat, sin_lat_sqr, tan_lat, sin_course_sqr; - double delta_latitude, delta_longitude, d_sqr, cos_lat; - double B, C, /* D, */ E, h, sin_newlat; - double old_latitude, phi_m, sin_phi_m, cos_phi_m; - -/* arc-seconds per rad */ - const double rho = 206264.8062470964; - -/* Increase our height to the height above the reference ellipsoid */ - - double wgs84_a = WGS84_MAJOR + p->z; - - sin_lat = sin(p->latitude); - sin_lat_sqr = sin_lat * sin_lat; - cos_lat = cos(p->latitude); - tan_lat = sin_lat / cos_lat; - sin_course_sqr = sin_course * sin_course; - d_sqr = d_meters * d_meters; - - n1 = wgs84_a / sqrt(1.0 - WGS84_ECC_SQR * sin_lat_sqr); - m1 = (wgs84_a * (1.0 - WGS84_ECC_SQR)) / - pow(1.0 - WGS84_ECC_SQR * sin_lat_sqr, 1.5); - - B = 1.0 / m1; - - h = d_meters * B * cos_course; - - C = tan_lat / (2.0 * m1 * n1); - -#ifdef notdef - D = (3.0 * WGS84_ECC_SQR * sin_lat * cos_lat) / - (2.0 * (1.0 - WGS84_ECC_SQR * sin_lat_sqr)); -#endif - - E = (1.0 + 3.0 * tan_lat * tan_lat) * - (1.0 - WGS84_ECC_SQR * sin_lat_sqr) / (6.0 * wgs84_a * wgs84_a); - - delta_latitude = d_meters * B * cos_course - - d_sqr * C * sin_course_sqr - - h * d_sqr * E * sin_course_sqr; - - old_latitude = p->latitude; - - p->latitude += delta_latitude; - if (p->latitude > M_PI_2) { - p->latitude -= M_PI_2; - } - else if (p->latitude < -M_PI_2) { - p->latitude += M_PI_2; - } - - phi_m = old_latitude + delta_latitude / 2.0; - sin_phi_m = sin(phi_m); - cos_phi_m = cos(phi_m); - - sin_newlat = sin(p->latitude); - - n2 = wgs84_a / sqrt(1.0 - WGS84_ECC_SQR * sin_newlat * sin_newlat); - - delta_longitude = (d_meters * sin_course) / (n2 * cos(p->latitude)); - - *delta_course_rad = delta_longitude * sin_phi_m / cos(delta_latitude / 2.0) + - delta_longitude * (sin_phi_m * cos_phi_m * cos_phi_m) / rho; - - p->longitude += delta_longitude; - if (p->longitude > M_PI) { - p->longitude -= M_PI; - } - else if (p->longitude < -M_PI) { - p->longitude += M_PI; - } -} - - -/* - * Convert cartesian geocentric coordinates into WGS84 geodetic lat/lon/z - */ - -void -DISGeocentricToWorldCoordinates(dis_world_coordinates * loc, - WorldCoordinates * p) -{ - double a_sqr = WGS84_MAJOR * WGS84_MAJOR, b_sqr = WGS84_MINOR * WGS84_MINOR; - double w, x, x_sqr, z, delta_x, cos_x; - double f, f_prime, w0, z0; - - w = sqrt(loc->x * loc->x + loc->y * loc->y); - z = loc->z; - -/* - * x is the sine of the parametric latitude. Use the sine of the geocentric - * latitude as the initial guess. - */ - - if (w == 0.0 && z == 0.0) { - p->latitude = 0.0; - p->longitude = 0.0; - p->z = 0.0; - return; - } - - x = z / sqrt(w * w + z * z); - -/* - * Compute x with accuracy that will yield a lat/lon accuracy of - * about 0.0001 arc-seconds (~ 0.10 foot). - */ - - for (delta_x = 1.0; fabs(delta_x) > 4.8E-10;) { - - x_sqr = x * x; - - cos_x = sqrt(1.0 - x_sqr); - - f = 2.0 * (WGS84_MAJOR * x * w - a_sqr * x * cos_x - WGS84_MINOR * cos_x * z + - b_sqr * cos_x * x); - - f_prime = 2.0 * (a_sqr + 2.0 * (a_sqr * x_sqr) - WGS84_MAJOR * w * x_sqr + - b_sqr - 2.0 * b_sqr * x_sqr + WGS84_MINOR * x * z); - - delta_x = f / f_prime; - x -= delta_x; - } - - z0 = WGS84_MINOR * x; - w0 = WGS84_MAJOR * sqrt(1.0 - x * x); - - p->z = sqrt((z - z0) * (z - z0) + (w - w0) * (w - w0)); - p->latitude = atan(z0 / (w0 * (1.0 - WGS84_ECC_SQR))); - p->longitude = atan2(loc->y, loc->x); -} - -/* - * Convert WGS84 geodetic lat/lon/z into cartesian geocentric coordinates - */ - -void -DISWorldCoordinatesToGeocentric(WorldCoordinates * w, - dis_world_coordinates * p) -{ - double N, N1; - double cos_latitude, sin_latitude; - - sin_latitude = sin(w->latitude); - cos_latitude = cos(w->latitude); - -/* - * N is the length of the normal line segment from the surface to the - * spin axis. - */ - - N = WGS84_MAJOR / sqrt(1.0 - (WGS84_ECC_SQR * sin_latitude * sin_latitude)); - -/* - * N1 lengthens the normal line to account for height above the surface - */ - - N1 = N + w->z; - - p->x = N1 * cos_latitude * cos(w->longitude); - p->y = N1 * cos_latitude * sin(w->longitude); - p->z = (((WGS84_MINOR * WGS84_MINOR) / (WGS84_MAJOR * WGS84_MAJOR)) * N + w->z) * sin_latitude; -} - -char * -DISLatitudeToString(char *s, double la, LatLongDisplayFormat mode) -{ - - int d, m; - double dla, dmin, dsec; - double round_dms = 1.0 / (36000.0 * 2.0); - double round_dm = 1.0 / (600.0 * 2.0); - char *ns; - - round_dms = round_dm = 0.0; - - switch (mode) { - - case LLM_DMS: - ns = (la >= 0.0) ? "N" : "S"; - dla = RADtoDEG(fabs(la)) + round_dms; - d = (int) dla; - dmin = (dla - (double) d) * 60.0; - m = (int) dmin; - dsec = (dmin - (double) m) * 60.0; - sprintf(s, "%d %d %.1f %s", d, m, dsec, ns); - break; - - case LLM_DM: - ns = (la >= 0.0) ? "N" : "S"; - dla = RADtoDEG(fabs(la)) + round_dm; - d = (int) dla; - dmin = (dla - (double) d) * 60.0; - sprintf(s, "%d %.1f %s", d, dmin, ns); - break; - - case LLM_D: - ns = (la >= 0.0) ? "N" : "S"; - dla = RADtoDEG(fabs(la)) + 0.05; - sprintf(s, "%.1f %s", dla, ns); - break; - - case LLM_SIGNED_D: - sprintf(s, "%.1f", RADtoDEG(la)); - break; - } - - return s; - -} - -char * -DISLongitudeToString(char *s, double lo, LatLongDisplayFormat mode) -{ - - int d, m; - double dlo, dmin, dsec; - double round_dms = 1.0 / (36000.0 * 2.0); - double round_dm = 1.0 / (600.0 * 2.0); - char *ew; - - round_dms = round_dm = 0.0; - - switch (mode) { - - case LLM_DMS: - ew = (lo >= 0.0) ? "E" : "W"; - dlo = RADtoDEG(fabs(lo)) + round_dms; - d = (int) dlo; - dmin = (dlo - (double) d) * 60.0; - m = (int) dmin; - dsec = (dmin - (double) m) * 60.0; - sprintf(s, "%d %d %.1f %s", d, m, dsec, ew); - break; - - case LLM_DM: - ew = (lo >= 0.0) ? "E" : "W"; - dlo = RADtoDEG(fabs(lo)) + round_dm; - d = (int) dlo; - dmin = (dlo - (double) d) * 60.0; - sprintf(s, "%d %.1f %s", d, dmin, ew); - break; - - case LLM_D: - ew = (lo >= 0.0) ? "E" : "W"; - dlo = RADtoDEG(fabs(lo)) + 0.05; - sprintf(s, "%.1f %s", dlo, ew); - break; - - case LLM_SIGNED_D: - sprintf(s, "%.1f", RADtoDEG(lo)); - break; - - } - - return s; - -} - -#define STATE_INITIAL 0 -#define STATE_WORD 1 -#define STATE_INTEGER 2 -#define STATE_FLOAT 3 - -typedef enum { - EndOfFile, - TOKEN_FLOAT, - TOKEN_LONG, - TOKEN_DASH, - TOKEN_NORTH, - TOKEN_SOUTH, - TOKEN_EAST, - TOKEN_WEST -} token_id; - -typedef union { - double double_value; - long long_value; -} lex_val; - -static lex_val lex_value; - -struct lex_record { - char *s; - FILE *f; - int lookahead_valid; - int lookahead; - int stack_top; - lex_val value_stack[16]; -}; - -static int -input(struct lex_record *p) -{ - int val; - - if (p->lookahead_valid) { - p->lookahead_valid = 0; - val = p->lookahead; - } - else if (p->s) { - val = *(p->s)++; - } - else { - val = fgetc(p->f); - } - return val; -} - -#define push_value(p, type, val) \ - p->value_stack[p->stack_top++].type = val - -#define pop_value(p, type) (p->value_stack[--p->stack_top].type) - -#define unput(p, c) { p->lookahead = c; p->lookahead_valid = 1; } - -#define InitializeLexRecord(p) { p->lookahead_valid = 0; } - -static char token[256]; -static int token_length = 0; - -static token_id -NextTokenx(struct lex_record *p) -{ - register int c, state = STATE_INITIAL; - -#ifndef HAVE_STDLIB_H -#ifndef linux - extern double atof(const char *); -#endif -#endif - - token_length = 0; - - while ((c = input(p)) != EOF) { - - switch (state) { - - case STATE_INITIAL: - - if (isspace(c)) { - continue; - } - else if (isdigit(c)) { - token[token_length++] = c; - state = STATE_INTEGER; - } - else if (c == '.') { - token[token_length++] = c; - state = STATE_FLOAT; - } - else { - token[0] = c; - token[1] = '\0'; -#ifdef DEBUG - printf("other %s\n", token); -#endif - switch (c) { - case '-': - return TOKEN_DASH; - case 'n': - case 'N': - return TOKEN_NORTH; - case 'e': - case 'E': - return TOKEN_EAST; - case 's': - case 'S': - return TOKEN_SOUTH; - case 'w': - case 'W': - return TOKEN_WEST; -/* - * invalid character - */ - default: - return EndOfFile; - } - } - break; - - case STATE_INTEGER: - case STATE_FLOAT: - if (isspace(c) || - c == '-' || - toupper(c) == 'N' || - toupper(c) == 'S' || - toupper(c) == 'W' || - toupper(c) == 'E') { - token[token_length] = '\0'; - unput(p, c); - if (state == STATE_INTEGER) { - lex_value.long_value = atoi(token); - return TOKEN_LONG; - } - else { - lex_value.double_value = atof(token); - return TOKEN_FLOAT; - } - } - else { - if (c == '.') { - state = STATE_FLOAT; - } - token[token_length++] = c; - } - break; - - default: - token[token_length++] = c; - break; - } - } - - return EndOfFile; -} - -static token_id -NextToken(struct lex_record *p) -{ - token_id t; - - t = NextTokenx(p); - -#ifdef DEBUG - printf("token %s\n", token); -#endif - return t; -} - -static int -ParseLatitude(struct lex_record *p) -{ - double x = 0.0; - double divider = 1.0; - int int_valid = 1; - token_id t; - - t = NextToken(p); - for (;;) { - switch (t) { - case TOKEN_NORTH: - lex_value.double_value = x; - return 0; - - case TOKEN_SOUTH: - lex_value.double_value = -x; - return 0; - - case TOKEN_LONG: - if (int_valid) { - x += lex_value.long_value / divider; - divider *= 60.0; - t = NextToken(p); - if (t == TOKEN_DASH) { - t = NextToken(p); - } - } - else { - return -1; - } - break; - - case TOKEN_FLOAT: - int_valid = 0; - x += lex_value.double_value / divider; - divider *= 60.0; - t = NextToken(p); - if (t == TOKEN_DASH) { - t = NextToken(p); - } - break; - default: - return -1; - } - } -} - -static int -ParseLongitude(struct lex_record *p) -{ - double x = 0.0; - double divider = 1.0; - int t, int_valid = 1; - - t = NextToken(p); - for (;;) { - switch (t) { - case TOKEN_EAST: - lex_value.double_value = x; - return 0; - - case TOKEN_WEST: - lex_value.double_value = -x; - return 0; - - case TOKEN_LONG: - if (int_valid) { - x += lex_value.long_value / divider; - divider *= 60.0; - t = NextToken(p); - if (t == TOKEN_DASH) { - t = NextToken(p); - } - } - else { - return -1; - } - break; - - case TOKEN_FLOAT: - int_valid = 0; - x += lex_value.double_value / divider; - divider *= 60.0; - t = NextToken(p); - if (t == TOKEN_DASH) { - t = NextToken(p); - } - break; - - default: - return -1; - } - } -} - -char * -DISStringToLatLong(char *s, WorldCoordinates * w) -{ - struct lex_record p; - - p.s = s; - p.lookahead_valid = 0; - - if (ParseLatitude(&p) != 0) { - return 0; - } - w->latitude = DEGtoRAD(lex_value.double_value); - - if (ParseLongitude(&p) != 0) { - return 0; - } - w->longitude = DEGtoRAD(lex_value.double_value); - w->z = 0.0; - return p.s; -} diff -Nru acm-5.0/dis/lib/io.c acm-6.0+20200416/dis/lib/io.c --- acm-5.0/dis/lib/io.c 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/dis/lib/io.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,459 +0,0 @@ -/* - * DIS/x : An implementation of the IEEE 1278.1 protocol - * - * Copyright (C) 1996-1997, Riley Rainey (rainey@netcom.com) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of either: - * - * a) the GNU Library General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your - * option) any later version. A description of the terms and conditions - * of the GLPL may be found in the "COPYING.LIB" file. - * - * b) the "Artistic License" which comes with this Kit. Information - * about this license may be found in the "Artistic" file. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License or the Artistic License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the Free - * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * Information describing how to contact the author can be found in the - * README file. - */ -#include -#include -#include -#ifndef WIN32 -#ifdef HAVE_RECVMSG -#include -#endif -#include -#define BSD_COMP /* keeps Solaris happy */ -#include -#include -#include -#endif /* ifndef WIN32 */ -#include -#ifdef HAVE_STDLIB_H -#include -#endif - -#ifndef WIN32 -#define INVALID_SOCKET -1 -#define SOCKET_ERROR -1 -#endif - -#if SYSCALL_PROTO -extern int recvmsg(int, struct msghdr *, int); -extern int sendmsg(int, struct msghdr *, int); -extern int socket(int domain, int type, int protocol); -extern int setsockopt(int s, int level, int optname, char *optval, int optlen); -extern int bind(int s, struct sockaddr *name, int namelen); -extern int ioctl(int, int,...); -extern void perror(const char *); -extern void bcopy(const void *, void *, int); - -#endif - -extern bool_t xdr_dis_pdu(XDR * xdrs, dis_pdu * objp); -extern void -xdrumem_create(register XDR * xdrs, caddr_t addr, u_int size, enum xdr_op op); - -int -DISReadPDU(DISTransceiver * xcvr, dis_pdu * pdu) -{ - char buffer[2048]; - int size; - XDR xdr; - -#ifdef HAVE_RECVMSG - struct sockaddr from; - struct msghdr msg; - struct iovec vec; - - msg.msg_name = (caddr_t) & from; - msg.msg_namelen = sizeof(from); - msg.msg_iov = &vec; - msg.msg_iovlen = 1; -#ifdef HAVE_MSG_ACCRIGHTS - msg.msg_accrights = (caddr_t) NULL; - msg.msg_accrightslen = 0; -#endif -#ifdef HAVE_MSG_CONTROL - msg.msg_control = (caddr_t) NULL; - msg.msg_controllen = 0; -#endif - vec.iov_base = (caddr_t) & buffer; - vec.iov_len = sizeof(buffer); - - size = recvmsg(xcvr->s, &msg, 0); -#else - size = recv(xcvr->s, buffer, sizeof(buffer), 0); -#endif - - if (size == -1) { - return size; - } - -/* - * XDR man pages say size must be a multiple of 4. - */ - - size = ((size + 3) / 4) * 4; - - xdrumem_create(&xdr, buffer, size, XDR_DECODE); - - xdr_dis_pdu(&xdr, pdu); - - return 0; -} - -int DISDisableWrite = 0; - -int -DISWritePDU(DISTransceiver * xcvr, dis_pdu * pdu) -{ - char buffer[2048], *p; - -#ifdef HAVE_RECVMSG - struct msghdr msg; - struct iovec vec; - -#endif - XDR xdr; - int i, result, len; - -/* - * Fill-out any length fields internal to the PDU (other than the length - * field in the header. - */ - - DISAddPDUSizes(pdu); - -/* - * Now normalize the packet. - */ - - xdrumem_create(&xdr, (char *) &buffer, sizeof(buffer), XDR_ENCODE); - - xdr_dis_pdu(&xdr, pdu); - - len = xdr_getpos(&xdr); - -/* - * Now for a hack. We need to insert the correct packet length into - * the PDU header. The header is somewhat stable from one protocol release - * to the next, so I've just hard-coded it here. - */ - - p = buffer + 8; - *((u_short *) p) = htons(len); - -#ifdef HAVE_RECVMSG - - msg.msg_namelen = sizeof(struct sockaddr); - - msg.msg_iov = &vec; - msg.msg_iovlen = 1; -#ifdef HAVE_MSG_ACCRIGHTS - msg.msg_accrights = (caddr_t) NULL; - msg.msg_accrightslen = 0; -#endif -#ifdef HAVE_MSG_CONTROL - msg.msg_control = (caddr_t) NULL; - msg.msg_controllen = 0; -#endif - msg.msg_flags = 0; - - vec.iov_base = (caddr_t) & buffer; - vec.iov_len = len; - - if (DISDisableWrite == 0) - for (i = 0; i < xcvr->num_dest; ++i) { - msg.msg_name = (caddr_t) & xcvr->dest[i].addr; - if ((result = sendmsg(xcvr->s, &msg, 0)) == -1) { - perror("on sendmsg"); - } - }; - -#else - - if (DISDisableWrite == 0) - for (i = 0; i < xcvr->num_dest; ++i) { - if ((result = sendto(xcvr->s, buffer, xdr_getpos(&xdr), 0, - (struct sockaddr *) &xcvr->dest[i].addr, - sizeof(struct sockaddr))) == -1) { -#ifdef WIN32 - result = WSAGetLastError(); -#else - perror("on sendto"); -#endif - } - }; - -#endif - - return 0; -} - -DISTransceiver * -DISOpenTransceiver(int port) -{ -#ifdef WIN32 - char Hostname[100]; - HOSTENT *pHostEnt; - char *ad; - -#else - struct ifconf ifc; - struct ifreq *ifr; - -#endif - struct sockaddr_in sin; - char buf[BUFSIZ]; - int s, n, i = 0; - int on = 1; - DISTransceiver *xcvr; - struct hostent *relay_hp; - char *relay; - -/* - * User requested the "default" UDP port? - */ - - if (port == -1) { - port = 3000; - } - -/* - * Allocate and initialize the DISTransceiver structure. - */ - - xcvr = (DISTransceiver *) malloc(sizeof(DISTransceiver)); - xcvr->s = 0; - xcvr->num_dest = 0; - - if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET) { -#ifdef WIN32 - errno = WSAGetLastError(); -#endif - perror("position update socket"); - exit(1); - } - - if (setsockopt(s, SOL_SOCKET, SO_BROADCAST, (char *) &on, - sizeof(on)) == SOCKET_ERROR) { -#ifdef WIN32 - errno = WSAGetLastError(); -#endif - perror("can't set broadcast flag"); - exit(1); - } - - if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *) &on, - sizeof(on)) == SOCKET_ERROR) { - perror("can't reuse broadcast port"); - } - - sin.sin_family = AF_INET; - sin.sin_addr.s_addr = htonl(INADDR_ANY); - sin.sin_port = htons(port); - bind(s, (struct sockaddr *) &sin, sizeof(sin)); - - xcvr->s = s; - -/* - * If the user has a DIS_RELAY environment variable set, then use that - * host as the only destination. This assumes a point-to-point connection - * to a relay site. - */ - - if ((relay = getenv("DIS_RELAY")) != (char *) NULL) { - if ((relay_hp = gethostbyname(relay)) == (struct hostent *) NULL) { - close(s); - return 0; - } - if (relay_hp->h_addrtype != AF_INET) { - close(s); - return 0; - } - xcvr->dest[0].addr.sin_family = relay_hp->h_addrtype; - bcopy((char *) relay_hp->h_addr, - (char *) &xcvr->dest[0].addr.sin_addr, - sizeof(relay_hp->h_addr)); - xcvr->dest[0].addr.sin_port = htons(port); - xcvr->dest[0].type = 1; - xcvr->num_dest = 1; - return xcvr; - } - -/* - * Determine how many interfaces are configured on the local system. - */ - -#ifdef WIN32 -#ifdef notdef - gethostname(Hostname, sizeof(Hostname)); - pHostEnt = gethostbyname(Hostname); - - i = 0; - while (pHostEnt->h_addr_list[i]) { - // pHostEnt->h_addr_list[i] - the current address in host order - ad = pHostEnt->h_addr_list[i]; - bcopy((char *) ad, - (char *) &xcvr->dest[i].addr.sin_addr, - sizeof(xcvr->dest[i].addr)); - bcopy((char *) ad, - (char *) x, - 4); - xcvr->dest[i].addr.sin_family = AF_INET; - xcvr->dest[i].addr.sin_port = htons(port); - xcvr->dest[i].type = 0; - i++; - } -#endif - xcvr->dest[0].addr.sin_family = AF_INET; - xcvr->dest[0].addr.sin_addr.S_un.S_addr = INADDR_BROADCAST; - xcvr->dest[0].addr.sin_port = htons(port); - xcvr->dest[0].type = 0; - i = 1; - -#else - - ifc.ifc_len = BUFSIZ; - ifc.ifc_buf = buf; - if (ioctl(s, SIOCGIFCONF, (char *) &ifc) < 0) { - perror("error getting interface configuration"); - close(s); - return NULL; - } - - n = ifc.ifc_len / sizeof(struct ifreq); - -/* - * Insure that there are enough elements in blist to accomodate all interfaces. - */ - - if (n > 32) { - return NULL; - } - - for (ifr = ifc.ifc_req; --n >= 0; ifr++) { - -/* - * We're only intrested in Internet domain interfaces - */ - - if (ifr->ifr_addr.sa_family != AF_INET) - continue; - - if (ioctl(s, SIOCGIFFLAGS, (char *) ifr) < 0) { - perror("error getting interface flags"); - close(s); - return NULL; - } - -/* - * Skip boring cases ... - */ - - if ((ifr->ifr_flags & IFF_UP) == 0 || - (ifr->ifr_flags & IFF_LOOPBACK) || - (ifr->ifr_flags & (IFF_BROADCAST | IFF_POINTOPOINT)) == 0) - continue; - -/* - * Get the appropriate broadcast address based on the interface type. - */ - - if (ifr->ifr_flags & IFF_POINTOPOINT) { - if (ioctl(s, SIOCGIFDSTADDR, (char *) ifr) < 0) { - close(s); - perror("error getting address"); - return NULL; - } - - bcopy((char *) &ifr->ifr_dstaddr, - (char *) &xcvr->dest[i].addr, - sizeof(ifr->ifr_dstaddr)); - - } - else if (ifr->ifr_flags & IFF_BROADCAST) { - if (ioctl(s, SIOCGIFBRDADDR, (char *) ifr) < 0) { - close(s); - perror("error getting broadcast address"); - return NULL; - } - - bcopy((char *) &ifr->ifr_broadaddr, - (char *) &xcvr->dest[i].addr, - sizeof(ifr->ifr_broadaddr)); - - } - - xcvr->dest[i].addr.sin_port = htons(port); - xcvr->dest[i].type = 0; - i++; - - } - -#endif /* not WIN32 */ - - xcvr->num_dest = i; - - return xcvr; -} - -void -DISCloseTransceiver(DISTransceiver * xcvr) -{ -#ifdef WIN32 - shutdown(xcvr->s, SD_BOTH); - closesocket(xcvr->s); -#else - close(xcvr->s); -#endif - free(xcvr); -} - -int -DISSetNBIOState(DISTransceiver * xcvr, int state) -{ - int i; - - i = (state) ? 1 : 0; - -#ifdef WIN32 - if (ioctlsocket(xcvr->s, FIONBIO, &i) != 0) { -#else - if (ioctl(xcvr->s, FIONBIO, &i) != 0) { -#endif - return -1; - } - return 0; -} - -#ifdef notdef -int -DISSetMulticastMode(DISTransceiver * xcvr, unsigned long maddress, unsigned long ointerface) -{ - int ttl = 8; - unsigned long addr = ointerface; - struct ip_mreq mreq; - - mreq.imr_multiaddr.s_addr = maddress; - mreq.imr_interface.s_addr = ointerface; - - setsockopt(xcvr->s, IPPROTO_IP, IP_MULTICAST_TTL, (char *) &ttl, sizeof(ttl)); - setsockopt(xcvr->s, IPPROTO_IP, IP_MULTICAST_IF, (char *) &addr, sizeof(addr)); - setsockopt(xcvr->s, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *) &mreq, sizeof(mreq)); - - return 0; -} -#endif diff -Nru acm-5.0/dis/lib/lookup.c acm-6.0+20200416/dis/lib/lookup.c --- acm-5.0/dis/lib/lookup.c 1998-05-12 03:43:02.000000000 +0000 +++ acm-6.0+20200416/dis/lib/lookup.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,193 +0,0 @@ -/* - * DIS/x : An implementation of the IEEE 1278.1 protocol - * - * Copyright (C) 1996, Riley Rainey (rainey@netcom.com) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of either: - * - * a) the GNU Library General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your - * option) any later version. A description of the terms and conditions - * of the GLPL may be found in the "COPYING.LIB" file. - * - * b) the "Artistic License" which comes with this Kit. Information - * about this license may be found in the "Artistic" file. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License or the Artistic License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the Free - * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * Information describing how to contact the author can be found in the - * README file. - */ -#include -#include -#include -#include "simmgr.h" - -static struct timeval TIMEOUT = -{25, 0}; - -extern CLIENT *simx_clnt; - -extern bool_t xdr_simx_lookup_complete_entity_type_result(register XDR * xdrs, simx_lookup_complete_entity_type_result * objp); - -typedef struct _client_names_cache_entry { - dis_entity_type key; - simx_lookup_complete_entity_type_result result; - struct _client_names_cache_entry *next; - struct _client_names_cache_entry *prev; -} client_names_cache_entry; - -static client_names_cache_entry *cache_list_head = 0, *cache_list_tail = 0; -static int cache_list_count = 0; -static int cache_list_max = 32; - -int -SIMxLookupEntityName(dis_entity_type * p, char *result, int size) -{ - simx_lookup_entity_type_result res; - - res.value = NULL; - - if (clnt_call(simx_clnt, SIMxLookupEntityNameP, - (xdrproc_t) xdr_dis_entity_type, (char *) p, - (xdrproc_t) xdr_simx_lookup_entity_type_result, (char *) &res, - TIMEOUT) != RPC_SUCCESS) { - return SIMx_TIMEOUT; - } - - strncpy(result, res.value, size); - free(res.value); - return res.status_code; -} - -int -SIMxLookupEntityNames(dis_entity_type * p, char *result[7], int size) -{ - simx_lookup_complete_entity_type_result res; - client_names_cache_entry *cp; - -/* - * First, check the client's local cache of query results. - */ - - for (cp = cache_list_head; cp; cp = cp->next) { - if (memcmp((char *) &cp->key, (char *) p, - sizeof(cp->key)) == 0) { - -/* - * Found a match in the cache, move it to the head of the cache list. - */ - - if (cache_list_head != cp) { - if (cache_list_tail == cp) { - cache_list_tail = cp->prev; - } - if (cp->prev) { - cp->prev->next = cp->next; - } - if (cp->next) { - cp->next->prev = cp->prev; - } - -/* - * There are always at least two entries in the cache if we get to here, - * so we can be a bit sloppy about how we insert the cache entry onto the - * head of the list - */ - cp->next = cache_list_head; - cp->prev = 0; - cp->next->prev = cp; - cache_list_head = cp; - } - -/* - * Return result - */ - - res = cp->result; - strncpy(result[0], res.kind_value, size); - strncpy(result[1], res.domain_value, size); - strncpy(result[2], res.country_value, size); - strncpy(result[3], res.category_value, size); - strncpy(result[4], res.subcategory_value, size); - strncpy(result[5], res.specific_value, size); - strncpy(result[6], res.extra_value, size); - return res.status_code; - } - } - -/* - * Wasn't in the cache -- consult the server via RPC - */ - - res.status_code = 0; - res.kind_value = NULL; - res.domain_value = NULL; - res.country_value = NULL; - res.category_value = NULL; - res.subcategory_value = NULL; - res.specific_value = NULL; - res.extra_value = NULL; - - if (clnt_call(simx_clnt, SIMxLookupEntityNamesP, - (xdrproc_t) xdr_dis_entity_type, (char *) p, - (xdrproc_t) xdr_simx_lookup_complete_entity_type_result, (char *) &res, - TIMEOUT) != RPC_SUCCESS) { - return SIMx_TIMEOUT; - } - - strncpy(result[0], res.kind_value, size); - strncpy(result[1], res.domain_value, size); - strncpy(result[2], res.country_value, size); - strncpy(result[3], res.category_value, size); - strncpy(result[4], res.subcategory_value, size); - strncpy(result[5], res.specific_value, size); - strncpy(result[6], res.extra_value, size); - -/* - * Add new cache entry (or replace the least used one) with the results - * of this query - */ - - if (cache_list_count == cache_list_max) { - cp = cache_list_tail; - free(cp->result.kind_value); - free(cp->result.domain_value); - free(cp->result.country_value); - free(cp->result.category_value); - free(cp->result.subcategory_value); - free(cp->result.specific_value); - free(cp->result.extra_value); - } - else { - cp = (client_names_cache_entry *) - malloc(sizeof(client_names_cache_entry)); - cp->next = 0; - cp->prev = cache_list_tail; - cache_list_tail = cp; - ++cache_list_count; - } - cp->key = *p; - cp->result = res; - -#ifdef notdef - cp->result.kind_value = strdup(cp->result.kind_value); - cp->result.domain_value = strdup(cp->result.domain_value); - cp->result.country_value = strdup(cp->result.country_value); - cp->result.category_value = strdup(cp->result.category_value); - cp->result.subcategory_value = strdup(cp->result.subcategory_value); - cp->result.specific_value = strdup(cp->result.specific_value); - cp->result.extra_value = strdup(cp->result.extra_value); - - xdr_free(xdr_simx_lookup_complete_entity_type_result, (char *) &res); -#endif - return res.status_code; -} diff -Nru acm-5.0/dis/lib/Makefile.in acm-6.0+20200416/dis/lib/Makefile.in --- acm-5.0/dis/lib/Makefile.in 1998-12-23 22:35:29.000000000 +0000 +++ acm-6.0+20200416/dis/lib/Makefile.in 1970-01-01 00:00:00.000000000 +0000 @@ -1,107 +0,0 @@ -srcdir = @srcdir@ - VPATH = @srcdir@ - - OBJS = \ - disx.o \ - event.o \ - entity.o \ - sitename.o \ - register.o \ - lookup.o \ - simmgr_xdr.o \ - basic.o \ - parse.o \ - io.o \ - free.o \ - sizes.o \ - globe.o\ - datum.o \ - dr.o \ - datum_table.o \ - dis_xdr.o \ - dis_xdr1.o \ - dis_xdr2.o \ - xdr_umem.o \ - xdr_var_array.o - - SRCS = \ - $(srcdir)/disx.c \ - $(srcdir)/event.c \ - $(srcdir)/entity.c \ - $(srcdir)/sitename.c \ - $(srcdir)/register.c \ - $(srcdir)/lookup.c \ - simmgr_xdr.c \ - $(srcdir)/basic.c \ - $(srcdir)/parse.c \ - $(srcdir)/io.c \ - $(srcdir)/free.c \ - $(srcdir)/sizes.c \ - $(srcdir)/globe.c \ - $(srcdir)/datum.c \ - $(srcdir)/dr.c \ - $(srcdir)/datum_table.c \ - dis_xdr.c \ - $(srcdir)/dis_xdr1.c \ - $(srcdir)/dis_xdr2.c \ - $(srcdir)/xdr_umem.c \ - $(srcdir)/xdr_var_array.c - DISGEN = ../disgen/disgen - RPCGEN = rpcgen -#CFLAGS = -I$(srcdir)/.. -I. -I.. -I../dis -DNPSNET_COMPAT @CFLAGS@ @DEFS@ - CFLAGS = -I$(srcdir)/.. -I. -I.. -I../dis @CFLAGS@ @DEFS@ - CC = @CC@ - PERL = perl - RANLIB = @RANLIB@ - AR = ar -ARFLAGS = cq - -all: libdis.a - -libdis.a: ../dis/disp.h simmgr.h $(OBJS) - rm -f $@ - $(AR) $(ARFLAGS) $@ $(OBJS) - $(RANLIB) $@ - -../dis/disp.h dis_xdr.c: dis.x - $(DISGEN) $(srcdir)/dis.x - mv dis.h ../dis/disp.h - mv dis_xdr.c tmp.c - perl -p -e 's/\#include "dis.h"/#include /' dis_xdr.c - rm -f tmp.c - -../dis/dis_xdr.h: dis_xdr.c dis_xdr1.c xdrhdr.pl - cat dis_xdr.c $(srcdir)/dis_xdr1.c | $(PERL) $(srcdir)/xdrhdr.pl $@ - -simmgr.h: simmgr.x - rm -f $@ - $(RPCGEN) -h -o $@ $(srcdir)/simmgr.x - -simmgr_xdr.c: simmgr.x - rm -f $@ - $(RPCGEN) -c -o $@ $(srcdir)/simmgr.x - mv $@ tmp.c - perl -p -e 's/\#include .*simmgr.*$$/#include "simmgr.h"/' $@ - rm -f tmp.c - -dis_xdr.o: ../dis/dis_xdr.h - -datum_table.o: datumtbl.h - -datumtbl.h: datumtbl.pl - $(PERL) $(srcdir)/datumtbl.pl <$(srcdir)/../dis/datum.h >datumtbl.h - -clean: - rm -rf *.o core datumtbl.h libdis.a \ - ../dis/disp.h ../dis/dis_xdr.h *.bak \ - dis_xdr.c simmgr.h simmgr_xdr.c - -depend: $(SRCS) - makedepend -- $(CFLAGS) -- $(SRCS) - -distclean: clean - rm -f Makefile - -tags TAGS check test: - -# DO NOT DELETE THIS LINE -- make depend depends on it. diff -Nru acm-5.0/dis/lib/parse.c acm-6.0+20200416/dis/lib/parse.c --- acm-5.0/dis/lib/parse.c 1998-12-30 20:23:50.000000000 +0000 +++ acm-6.0+20200416/dis/lib/parse.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,182 +0,0 @@ -/* - * DIS/x : An implementation of the IEEE 1278.1 protocol - * - * Copyright (C) 1996-1998, Riley Rainey (rrainey@ix.netcom.com) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of either: - * - * a) the GNU Library General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your - * option) any later version. A description of the terms and conditions - * of the GLPL may be found in the "COPYING.LIB" file. - * - * b) the "Artistic License" which comes with this Kit. Information - * about this license may be found in the "Artistic" file. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License or the Artistic License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the Free - * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * Information describing how to contact the author can be found in the - * README file. - */ - -#include -#include -#include - -#define DMAX 16 /* maximum number of delimiter chars */ -#define BMAX 64 /* maximum incoming string length */ - -/* - * Generate a DIS entity ID from a string - * - * C-style hexidecimal numbers may be used in the input stream: - * - * 1/1/0xfffe, and 0xff/0xff/0x1 are both valid - * - * Example invalid strings: - * - * 1/1/1,000 Entity ID field contains an invalid character - * 1/1/1000000 Entity ID field > 0xffff - * - * Return values: - * - * 0 success - * 1 parse error - * 2 incoming string buffer too large; (max is 64 characters) - * 3 one or more of the fields contains an invalid value (<0 or >0xffff) - * 4 invalid character in string - */ - -int -DISParseEntityID (dis_entity_id *p, - const char * buf, - int bufsize, - const char *delim) -{ - char pdelim[DMAX+1]; - char tbuf[BMAX+1]; - char *cur, *next, *endptr; - long rval; - int result = 1; - - memset ( p, 0, sizeof(dis_entity_id)); - - /* - * Buffer too large? - */ - - if (bufsize > BMAX ) { - return 2; - } - - strncpy ( tbuf, buf, BMAX ); - tbuf[BMAX] = '\0'; - - if (delim) { - strncpy(pdelim, delim, DMAX); - pdelim[DMAX] = '\0'; - } - else { - strcpy( pdelim, ":./" ); - } - - cur = tbuf; - - next = strpbrk ( cur, pdelim ); - - if ( next != NULL ) { - - /* - * Once we get a delimiter, all other delimeters must match - */ - - pdelim[0] = *next; - pdelim[1] = '\0'; - - /* - * Get Site ID - */ - - endptr = next; - rval = strtol ( cur, &endptr, 0 ); - - if (rval < 0 || rval > 0xffff) { - return 3; - } - else { - p->sim_id.site_id = (unsigned short) rval; - } - - /* - * Ensure strtol stopped parsing at the correct spot - */ - - if ( endptr != next ) { - return 4; - } - - cur = next+1; - - next = strpbrk ( cur, pdelim ); - - if ( next != NULL ) { - - /* - * Get application ID - */ - - endptr = next; - rval = strtol ( cur, &endptr, 0 ); - - if (rval < 0 || rval > 0xffff) { - return 3; - } - else { - p->sim_id.application_id = (unsigned short) rval; - } - - /* - * Ensure strtol stopped parsing at the correct spot - */ - - if ( endptr != next ) { - return 4; - } - - /* - * Get Entity ID - */ - - cur = next+1; - - rval = strtol ( cur, NULL, 0 ); - - if (rval < 0 || rval > 0xffff) { - return 3; - } - else { - p->entity_id = (unsigned short) rval; - } - - result = 0; - - } - } - - return result; -} - - - - - - - diff -Nru acm-5.0/dis/lib/prologue.mak acm-6.0+20200416/dis/lib/prologue.mak --- acm-5.0/dis/lib/prologue.mak 1997-04-10 19:10:14.000000000 +0000 +++ acm-6.0+20200416/dis/lib/prologue.mak 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -RPCGEN = rpcgen -PERL = perl -prologue: ..\simmgr.h ..\simmgr_xdr.c ..\datumtbl.h - -del prologue - copy ..\simmgr.h prologue - -..\simmgr.h: ..\simmgr.x - -del $@ - $(RPCGEN) -h -o $@ ..\simmgr.x - -..\simmgr_xdr.c: ..\simmgr.x - -del $@ - $(RPCGEN) -c -o $@ ..\simmgr.x - -..\datumtbl.h: ..\datumtbl.pl - @echo Generating datumtbl ... - $(PERL) ..\datumtbl.pl <..\..\dis/datum.h >$@ diff -Nru acm-5.0/dis/lib/register.c acm-6.0+20200416/dis/lib/register.c --- acm-5.0/dis/lib/register.c 1998-05-12 03:43:02.000000000 +0000 +++ acm-6.0+20200416/dis/lib/register.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,80 +0,0 @@ -/* - * DIS/x : An implementation of the IEEE 1278.1 protocol - * - * Copyright (C) 1996, Riley Rainey (rainey@netcom.com) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of either: - * - * a) the GNU Library General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your - * option) any later version. A description of the terms and conditions - * of the GLPL may be found in the "COPYING.LIB" file. - * - * b) the "Artistic License" which comes with this Kit. Information - * about this license may be found in the "Artistic" file. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License or the Artistic License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the Free - * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * Information describing how to contact the author can be found in the - * README file. - */ -#include -#include -#include "simmgr.h" -#ifdef HAVE_STDLIB_H -#include -#endif - -static struct timeval TIMEOUT = -{25, 0}; - -CLIENT *simx_clnt; -int simx_initialized; - -int -SIMxRegisterApplication(char *server_host, char *site_name, - unsigned int application_id, dis_simulation_addr * result) -{ - simx_register_app_args args; - simx_register_app_result res; - char *p; - - args.site_name = site_name; - args.application_id = application_id; - - if (!server_host) { - if ((p = getenv("SIMX_HOST")) != (char *) NULL) { - server_host = p; - } - else { - server_host = "localhost"; - } - } - - simx_clnt = - clnt_create(server_host, SIMx_PROGRAM, SIMx_VERSION, "udp"); - - if (simx_clnt == NULL) { - return SIMx_NO_SERVER; - } - - simx_initialized = 1; - - if (clnt_call(simx_clnt, SIMxRegisterApplicationP, - (xdrproc_t) xdr_simx_register_app_args, (char *) &args, - (xdrproc_t) xdr_simx_register_app_result, (char *) &res, - TIMEOUT) != RPC_SUCCESS) { - return SIMx_TIMEOUT; - } - - *result = res.result; - return res.status_code; -} diff -Nru acm-5.0/dis/lib/simmgr.x acm-6.0+20200416/dis/lib/simmgr.x --- acm-5.0/dis/lib/simmgr.x 1995-12-21 19:46:24.000000000 +0000 +++ acm-6.0+20200416/dis/lib/simmgr.x 1970-01-01 00:00:00.000000000 +0000 @@ -1,112 +0,0 @@ -/* - * DIS/x : An implementation of the IEEE 1278.1 protocol - * - * Copyright (C) 1996, Riley Rainey (rainey@netcom.com) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of either: - * - * a) the GNU Library General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your - * option) any later version. A description of the terms and conditions - * of the GLPL may be found in the "COPYING.LIB" file. - * - * b) the "Artistic License" which comes with this Kit. Information - * about this license may be found in the "Artistic" file. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License or the Artistic License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the Free - * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * Information describing how to contact the author can be found in the - * README file. - */ -#ifdef RPC_HDR -%#include -%#include -#endif - -#define SIMMGR_HANDLE_SIZE 4 - -enum simx_stat { - SIMx_SUCCESS = 0, - SIMx_ERROR = 1, - SIMx_NO_SERVER = 2, - SIMx_TIMEOUT = 4, - SIMx_NOT_FOUND = 5 - }; - -struct simx_register_app_args { - string site_name<64>; - unsigned short application_id; - }; - -struct simx_register_app_result { - simx_stat status_code; - dis_simulation_addr result; - }; - -struct simx_entity_type_attr { - dis_entity_type *type; - string attr<256>; - }; - -struct simx_lookup_entity_type_result { - simx_stat status_code; - string value<>; - }; - -struct simx_lookup_complete_entity_type_result { - simx_stat status_code; - string kind_value<>; - string domain_value<>; - string country_value<>; - string category_value<>; - string subcategory_value<>; - string specific_value<>; - string extra_value<>; - }; - -typedef string simx_string<256>; - -struct simx_session_handle { - opaque data[SIMMGR_HANDLE_SIZE]; - dis_simulation_addr address; - }; - -union simx_startres switch (simx_stat result) { - -case SIMx_SUCCESS: - simx_session_handle handle; - -default: - void; -}; - -program SIMx_PROGRAM { - - version SIMx_VERSION { - - simx_register_app_result - SIMxRegisterApplicationP (simx_register_app_args) = 1; - - simx_lookup_entity_type_result - SIMxLookupEntityNameP (dis_entity_type) = 2; - - dis_entity_type - SIMxLookupEntityTypeFromPatternP (simx_string) = 3; - - simx_lookup_entity_type_result - SIMxLookupEntityAttributeP (simx_entity_type_attr) = 4; - - simx_lookup_complete_entity_type_result - SIMxLookupEntityNamesP (dis_entity_type) = 5; - - } = 1; - -} = 300; diff -Nru acm-5.0/dis/lib/sitename.c acm-6.0+20200416/dis/lib/sitename.c --- acm-5.0/dis/lib/sitename.c 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/dis/lib/sitename.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,98 +0,0 @@ - -/* - * DIS/x : An implementation of the IEEE 1278.1 protocol - * - * Copyright (C) 1996, Riley Rainey (rainey@netcom.com) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of either: - * - * a) the GNU Library General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your - * option) any later version. A description of the terms and conditions - * of the GLPL may be found in the "COPYING.LIB" file. - * - * b) the "Artistic License" which comes with this Kit. Information - * about this license may be found in the "Artistic" file. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License or the Artistic License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the Free - * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * Information describing how to contact the author can be found in the - * README file. - */ -#include -#include -#include -#include -#include -#include - -char * -SIMxGetSiteName(char *result, int max_size) -{ - char *s; -#ifndef WIN32 - char *path; -#endif - static char line[64]; - FILE *f; - int n; - -/* - * First look for the environment variable "DIS_SITE_NAME" ... - */ - - s = getenv("DIS_SITE_NAME"); - if (s == (char *) NULL || strlen(s) == 0) { - -/* - * "Cyberspace" becomes the default answer if all these other tests fail ... - */ - - strcpy(line, "Cyberspace"); - s = line; - -/* - * Now check $HOME/.dis_site_name ... - */ -#ifndef WIN32 - if ((path = malloc(strlen(getenv("HOME") + strlen("/.dis_site_name") + 1))) != NULL) { - sprintf(path, "%s/.dis_site_name", getenv("HOME")); - if ((f = fopen(path, "r")) != NULL) { - fgets(line, sizeof(line), f); - n = strlen(line); - if (n > 0 && line[n - 1] == '\n') { - line[n - 1] = '\0'; - } - fclose(f); - } - free(path); - } - -/* - * See if /etc/dis_site_name exists ... - */ - - else -#endif - if ((f = fopen("/etc/dis_site_name", "r")) != NULL) { - fgets(line, sizeof(line), f); - n = strlen(line); - if (n > 0 && line[n - 1] == '\n') { - line[n - 1] = '\0'; - } - fclose(f); - } - } - - strncpy(result, s, max_size - 1); - result[max_size - 1] = '\0'; - return s; -} diff -Nru acm-5.0/dis/lib/sizes.c acm-6.0+20200416/dis/lib/sizes.c --- acm-5.0/dis/lib/sizes.c 1998-08-14 21:13:40.000000000 +0000 +++ acm-6.0+20200416/dis/lib/sizes.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,60 +0,0 @@ -/* - * DIS/x : An implementation of the IEEE 1278.1 protocol - * - * Copyright (C) 1996,1998, Riley Rainey (rainey@netcom.com) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of either: - * - * a) the GNU Library General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your - * option) any later version. A description of the terms and conditions - * of the GLPL may be found in the "COPYING.LIB" file. - * - * b) the "Artistic License" which comes with this Kit. Information - * about this license may be found in the "Artistic" file. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License or the Artistic License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the Free - * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * Information describing how to contact the author can be found in the - * README file. - */ -#include -#include - -void -DISAddPDUSizes(dis_pdu * p) -{ - int i, j; - - switch (p->hdr.pdu_type) { - case PDUTypeEmission: - { - dis_em_emission_pdu *pdu = (dis_em_emission_pdu *) p; - dis_em_system_info *s = pdu->system; - dis_beam_info *b; - unsigned long len; - - for (i = 0; i < pdu->num_systems; ++i, ++s) { - b = s->beam; - len = 0; - for (j = 0; j < pdu->system[i].num_beams; ++j, ++b) { - b->beam_data_length = 13 + b->num_targets * 2; - len += b->beam_data_length; - } - s->sys_data_length = (u_char) (5 + len); - } - } - break; - - default: - break; - } -} diff -Nru acm-5.0/dis/lib/xdrhdr.pl acm-6.0+20200416/dis/lib/xdrhdr.pl --- acm-5.0/dis/lib/xdrhdr.pl 1998-08-14 21:13:43.000000000 +0000 +++ acm-6.0+20200416/dis/lib/xdrhdr.pl 1970-01-01 00:00:00.000000000 +0000 @@ -1,43 +0,0 @@ -#! /usr/local/bin/perl -open (xdr_hdr, ">$ARGV[0]") || die ("unable to open $ARGV[0] : $!\n"); -print xdr_hdr "/*\n * Please do not edit this file by hand\n"; -print xdr_hdr " * It was generated by xdrhdr.pl\n */\n\n"; -print xdr_hdr "\n"; -print xdr_hdr "#if defined(_DIS_PRIVATE)\n"; -print xdr_hdr "#define xdr_short xdr_byte_short\n"; -print xdr_hdr "#define xdr_u_short xdr_byte_u_short\n"; -print xdr_hdr "#define xdr_char xdr_byte_char\n"; -print xdr_hdr "#define xdr_u_char xdr_byte_u_char\n"; -print xdr_hdr "#define xdr_byte_float xdr_float\n"; -print xdr_hdr "#define xdr_byte_double xdr_double\n"; -print xdr_hdr "\n"; -print xdr_hdr "typedef u_char byte_u_char;\n"; -print xdr_hdr "typedef u_short byte_u_short;\n"; -print xdr_hdr "typedef u_long byte_u_long;\n"; -print xdr_hdr "typedef u_int byte_u_int;\n"; -print xdr_hdr "typedef char byte_char;\n"; -print xdr_hdr "typedef short byte_short;\n"; -print xdr_hdr "typedef long byte_long;\n"; -print xdr_hdr "typedef int byte_int;\n"; -print xdr_hdr "#endif\n\n"; -print xdr_hdr "extern bool_t xdr_var_array(XDR * xdrs, - caddr_t * addrp, - u_int size, - u_int maxsize, - u_int elsize, - xdrproc_t elproc); -"; -print xdr_hdr "extern bool_t xdr_byte_long(XDR *, void *);\n"; -print xdr_hdr "extern bool_t xdr_byte_u_long(XDR *, void *);\n"; -print xdr_hdr "extern bool_t xdr_byte_short(XDR *, void *);\n"; -print xdr_hdr "extern bool_t xdr_byte_u_short(XDR *, void *);\n"; -print xdr_hdr "extern bool_t xdr_byte_char(XDR *, void *);\n"; -print xdr_hdr "extern bool_t xdr_byte_u_char(XDR *, void *);\n"; -print xdr_hdr "\n\n"; -while () { - if (/^xdr_/) { - $name = substr ($_, 0, index($_, '(')); - $name1 = substr ($name, 4); - print xdr_hdr "bool_t $name (XDR *, $name1 *);\n"; - } -} diff -Nru acm-5.0/dis/lib/xdr_umem.c acm-6.0+20200416/dis/lib/xdr_umem.c --- acm-5.0/dis/lib/xdr_umem.c 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/dis/lib/xdr_umem.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,213 +0,0 @@ -/* - * DIS/x : An implementation of the IEEE 1278.1 protocol - * - * Copyright (C) 1996, Riley Rainey (rainey@netcom.com) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of either: - * - * a) the GNU Library General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your - * option) any later version. A description of the terms and conditions - * of the GLPL may be found in the "COPYING.LIB" file. - * - * b) the "Artistic License" which comes with this Kit. Information - * about this license may be found in the "Artistic" file. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License or the Artistic License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the Free - * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * Information describing how to contact the author can be found in the - * README file. - */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ - -#if defined(LIBC_SCCS) && !defined(lint) -/*static char *sccsid = "from: @(#)xdr_mem.c 1.19 87/08/11 Copyr 1984 Sun Micro"; */ -/*static char *sccsid = "from: @(#)xdr_mem.c 2.1 88/07/29 4.0 RPCSRC"; */ -static char *rcsid = "$Id: xdr_umem.c,v 1.2 1998/05/12 03:58:55 riley Exp $"; - -#endif - -/* - * xdr_mem.h, XDR implementation using memory buffers. - * - * Copyright (C) 1984, Sun Microsystems, Inc. - * - * If you have some data to be interpreted as external data representation - * or to be converted to external data representation in a memory buffer, - * then this is the package for you. - * - */ - -#include -#include -#ifndef WIN32 -#include -#include -#endif - -static bool_t xdrumem_getlong(register XDR * xdrs, long int *lp); -static bool_t xdrumem_putlong(register XDR * xdrs, long int *lp); -static bool_t xdrumem_getbytes(register XDR * xdrs, caddr_t addr, register u_int len); -static bool_t xdrumem_putbytes(register XDR * xdrs, caddr_t addr, register u_int len); -static u_int xdrumem_getpos(register XDR * xdrs); -static bool_t xdrumem_setpos(register XDR * xdrs, u_int pos); -static long *xdrumem_inline(register XDR * xdrs, u_int len); -static void xdrumem_destroy(void); - -static struct xdr_ops xdrumem_ops = -{ - xdrumem_getlong, - xdrumem_putlong, - xdrumem_getbytes, - xdrumem_putbytes, - xdrumem_getpos, - xdrumem_setpos, - xdrumem_inline, - xdrumem_destroy -}; - -/* - * The procedure xdrumem_create initializes a stream descriptor for a - * memory buffer. - */ -void -xdrumem_create(register XDR * xdrs, caddr_t addr, u_int size, enum xdr_op op) -{ - - xdrs->x_op = op; - xdrs->x_ops = &xdrumem_ops; - xdrs->x_private = xdrs->x_base = addr; - xdrs->x_handy = size; -} - -static void -xdrumem_destroy(void) - /*XDR *xdrs; */ -{ -} - -static bool_t -xdrumem_getlong(register XDR * xdrs, long int *lp) -{ - long tmp; - - if (xdrs->x_handy < sizeof(long)) - return (FALSE); - xdrs->x_handy -= sizeof(long); - bcopy(xdrs->x_private, (char *) &tmp, sizeof(long)); - - *lp = (long) ntohl((u_long) tmp); - xdrs->x_private += sizeof(long); - - return (TRUE); -} - -static bool_t -xdrumem_putlong(register XDR * xdrs, long int *lp) -{ - long tmp; - - if (xdrs->x_handy < sizeof(long)) - return (FALSE); - xdrs->x_handy -= sizeof(long); - - tmp = (long) htonl((u_long) (*lp)); - bcopy((char *) &tmp, xdrs->x_private, sizeof(long)); - xdrs->x_private += sizeof(long); - - return (TRUE); -} - -static bool_t -xdrumem_getbytes(register XDR * xdrs, caddr_t addr, register u_int len) -{ - - if (xdrs->x_handy < len) - return (FALSE); - xdrs->x_handy -= len; - bcopy(xdrs->x_private, addr, len); - xdrs->x_private += len; - return (TRUE); -} - -static bool_t -xdrumem_putbytes(register XDR * xdrs, caddr_t addr, register u_int len) -{ - - if (xdrs->x_handy < len) - return (FALSE); - xdrs->x_handy -= len; - bcopy(addr, xdrs->x_private, len); - xdrs->x_private += len; - return (TRUE); -} - -static u_int -xdrumem_getpos(register XDR * xdrs) -{ - - return ((u_int) xdrs->x_private - (u_int) xdrs->x_base); -} - -static bool_t -xdrumem_setpos(register XDR * xdrs, u_int pos) -{ - register caddr_t newaddr = xdrs->x_base + pos; - register caddr_t lastaddr = xdrs->x_private + xdrs->x_handy; - - if ((long) newaddr > (long) lastaddr - || (UINT_MAX < LONG_MAX - && (long) UINT_MAX < (long) lastaddr - (long) newaddr)) - return (FALSE); - xdrs->x_private = newaddr; - xdrs->x_handy = (int) lastaddr - (int) newaddr; - return (TRUE); -} - -static long * -xdrumem_inline(register XDR * xdrs, u_int len) -{ - long *buf = 0; - - if (xdrs->x_handy >= len) { - xdrs->x_handy -= len; - buf = (long *) xdrs->x_private; - xdrs->x_private += len; - } - return (buf); -} diff -Nru acm-5.0/dis/lib/xdr_var_array.c acm-6.0+20200416/dis/lib/xdr_var_array.c --- acm-5.0/dis/lib/xdr_var_array.c 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/dis/lib/xdr_var_array.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,156 +0,0 @@ -/* - * DIS/x : An implementation of the IEEE 1278.1 protocol - * - * Copyright (C) 1996, Riley Rainey (rainey@netcom.com) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of either: - * - * a) the GNU Library General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your - * option) any later version. A description of the terms and conditions - * of the GLPL may be found in the "COPYING.LIB" file. - * - * b) the "Artistic License" which comes with this Kit. Information - * about this license may be found in the "Artistic" file. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License or the Artistic License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the Free - * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * Information describing how to contact the author can be found in the - * README file. - */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ - -#if defined(LIBC_SCCS) && !defined(lint) -/*static char *sccsid = "from: @(#)xdr_array.c 1.10 87/08/11 Copyr 1984 Sun Micro"; */ -/*static char *sccsid = "from: @(#)xdr_array.c 2.1 88/07/29 4.0 RPCSRC"; */ -static char *rcsid = "$Id: xdr_var_array.c,v 1.2 1998/05/12 03:58:55 riley Exp $"; - -#endif - -/* - * xdr_var_array.c from : - * - * xdr_array.c, Generic XDR routines implementation. - * - * Copyright (C) 1984, Sun Microsystems, Inc. - * - * These are the "non-trivial" xdr primitives used to serialize and de-serialize - * arrays. See xdr.h for more info on the interface to xdr. - */ - -#include -#include -#include -#include - -#define LASTUNSIGNED ((u_int)0-1) - -extern int fprintf(FILE *, const char *,...); - -/* - * XDR an array of arbitrary elements - * *addrp is a pointer to the array, size is the number of elements. - * If addrp is NULL (sizep * elsize) bytes are allocated. - * elsize is the size (in bytes) of each element, and elproc is the - * xdr procedure to call to handle each element of the array. - */ -bool_t -xdr_var_array(register XDR * xdrs, caddr_t * addrp, u_int size, u_int maxsize, u_int elsize, xdrproc_t elproc) - /* array pointer */ - /* number of elements */ - /* max numberof elements */ - /* size in bytes of each element */ - /* xdr routine to handle each element */ -{ - register u_int i; - register caddr_t target = *addrp; - register u_int c; /* the actual element count */ - register bool_t stat = TRUE; - register u_int nodesize; - - c = size; - /* Make sure that c * elsize doesn't overflow. */ - if ((c > maxsize || UINT_MAX/elsize < c) && (xdrs->x_op != XDR_FREE)) { - return (FALSE); - } - nodesize = c * elsize; - - /* - * if we are deserializing, we may need to allocate an array. - * We also save time by checking for a null array if we are freeing. - * - * * Always allocate storage when decoding. * - */ - if (target == NULL || xdrs->x_op == XDR_DECODE) - switch (xdrs->x_op) { - case XDR_DECODE: - if (c == 0) - return (TRUE); - *addrp = target = mem_alloc(nodesize); - if (target == NULL) { - (void) fprintf(stderr, - "xdr_array: out of memory\n"); - return (FALSE); - } - bzero(target, nodesize); - break; - - case XDR_FREE: - return (TRUE); - - case XDR_ENCODE: - break; - } - - /* - * now we xdr each element of array - */ - for (i = 0; (i < c) && stat; i++) { - stat = (*elproc) (xdrs, target, LASTUNSIGNED); - target += elsize; - } - - /* - * the array may need freeing - */ - if (xdrs->x_op == XDR_FREE) { - mem_free(*addrp, nodesize); - *addrp = NULL; - } - return (stat); -} diff -Nru acm-5.0/dis/Makefile.in acm-6.0+20200416/dis/Makefile.in --- acm-5.0/dis/Makefile.in 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/dis/Makefile.in 1970-01-01 00:00:00.000000000 +0000 @@ -1,33 +0,0 @@ - srcdir = @srcdir@ - VPATH = @srcdir@ - SHELL = /bin/sh -SUBDIRS = @subdirs@ @dsubdirs@ - -# This line is needed to force BSD-style makes to do the right target -# by default -- they get confused by the following target. -defaulttarget: all - -all clean mostlyclean realclean tags info dvi dist test TAGS check depend: - @(for i in $(SUBDIRS) ; do \ - echo Making $@ in ./$${i} ... ; \ - ( cd $$i ; $(MAKE) $(MFLAGS) $@ ) || exit 1; \ - if [ $$? != 0 ]; then exit 1; fi; \ - done) - -install uninstall: - -Makefile: Makefile.in config.status - $(SHELL) config.status - -config.status: - $(SHELL) $(srcdir)/configure --no-create - -configure: configure.in - cd $(srcdir); autoconf - -distclean: - @for i in $(SUBDIRS) ; do \ - echo Making $@ in ./$${i} ... ; \ - ( cd $$i ; $(MAKE) $(MFLAGS) $@ ) || exit 1; \ - done - rm -f Makefile config.status config.log config.cache sdbm/Makefile diff -Nru acm-5.0/dis/README acm-6.0+20200416/dis/README --- acm-5.0/dis/README 1995-12-20 18:10:02.000000000 +0000 +++ acm-6.0+20200416/dis/README 1970-01-01 00:00:00.000000000 +0000 @@ -1,37 +0,0 @@ -DIS Library, version 1.0 - -Copyright (C) 1996, Riley Rainey (rainey@netcom.com) - - -COPYING and USE - -Use and distribution of this software is governed by your choice of one of -two licensing schemes: the GNU Library Public License or the "Artistic" -license. See the COPYING.LIB and Artistic files for more information. - - -INSTALLATION - -If you are using the DIS/x library as distributed with ACM, no -special actions are required on your part. This library is intended -to be used independently of ACM, too. This section describes build -procedures in that event. - -Cd to the top-level directory (the one containing the README file that -you are currently viewing). Type: - - $ ./configure - $ make - -The SIM/x server software stores it's information in a dbm database. -Configure will attempt to use your system's native dbm library, provided it -can find it in one of the usual places. If not, it punts and uses "SDBM". -SDBM was written by Ozan "Oz" Yigit (oz@nexus.yorku.ca). It has been -integrated into this distribution in source form for your convenience. -If you feel like you'd want an updated copy of SDBM, try gatekeeper.dec.com. - -And, because I used strcasecmp.c from the NetBSD software release: - - Part of this software is: - Copyright (c) 1987 Regents of the University of California. - All rights reserved. diff -Nru acm-5.0/dis/sdbm/biblio acm-6.0+20200416/dis/sdbm/biblio --- acm-5.0/dis/sdbm/biblio 1995-09-26 18:01:18.000000000 +0000 +++ acm-6.0+20200416/dis/sdbm/biblio 1970-01-01 00:00:00.000000000 +0000 @@ -1,64 +0,0 @@ -%A R. J. Enbody -%A H. C. Du -%T Dynamic Hashing Schemes -%J ACM Computing Surveys -%V 20 -%N 2 -%D June 1988 -%P 85-113 -%K surveys - -%A P.-A. Larson -%T Dynamic Hashing -%J BIT -%V 18 -%P 184-201 -%D 1978 -%K dynamic - -%A W. Litwin -%T Linear Hashing: A new tool for file and table addressing -%J Proceedings of the 6th Conference on Very Large Dabatases (Montreal) -%I Very Large Database Foundation -%C Saratoga, Calif. -%P 212-223 -%D 1980 -%K linear - -%A R. Fagin -%A J. Nievergelt -%A N. Pippinger -%A H. R. Strong -%T Extendible Hashing - A Fast Access Method for Dynamic Files -%J ACM Trans. Database Syst. -%V 4 -%N 3 -%D Sept. 1979 -%P 315-344 -%K extend - -%A G. N. Martin -%T Spiral Storage: Incrementally Augmentable Hash Addressed Storage -%J Technical Report #27 -%I University of Varwick -%C Coventry, U.K. -%D 1979 -%K spiral - -%A Chris Torek -%T Re: dbm.a and ndbm.a archives -%B USENET newsgroup comp.unix -%D 1987 -%K torek - -%A Rich Wales -%T Discusson of "dbm" data base system -%B USENET newsgroup unix.wizards -%D Jan. 1984 -%K rich - - - - - - diff -Nru acm-5.0/dis/sdbm/CHANGES acm-6.0+20200416/dis/sdbm/CHANGES --- acm-5.0/dis/sdbm/CHANGES 1995-09-26 18:01:10.000000000 +0000 +++ acm-6.0+20200416/dis/sdbm/CHANGES 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -Changes from the earlier BETA releases. - -o dbm_prep does everything now, so dbm_open is just a simple - wrapper that builds the default filenames. dbm_prep no longer - requires a (DBM *) db parameter: it allocates one itself. It - returns (DBM *) db or (DBM *) NULL. - -o makroom is now reliable. In the common-case optimization of the page - split, the page into which the incoming key/value pair is to be inserted - is write-deferred (if the split is successful), thereby saving a cosly - write. BUT, if the split does not make enough room (unsuccessful), the - deferred page is written out, as the failure-window is now dependent on - the number of split attempts. - -o if -DDUFF is defined, hash function will also use the DUFF construct. - This may look like a micro-performance tweak (maybe it is), but in fact, - the hash function is the third most-heavily used function, after read - and write. diff -Nru acm-5.0/dis/sdbm/COMPARE acm-6.0+20200416/dis/sdbm/COMPARE --- acm-5.0/dis/sdbm/COMPARE 1995-09-26 18:01:14.000000000 +0000 +++ acm-6.0+20200416/dis/sdbm/COMPARE 1970-01-01 00:00:00.000000000 +0000 @@ -1,88 +0,0 @@ - -Script started on Thu Sep 28 15:41:06 1989 -% uname -a -titan titan 4_0 UMIPS mips -% make all x-dbm - cc -O -DSDBM -DDUFF -DDUPERROR -DSPLITFAIL -c dbm.c - cc -O -DSDBM -DDUFF -DDUPERROR -DSPLITFAIL -c sdbm.c - cc -O -DSDBM -DDUFF -DDUPERROR -DSPLITFAIL -c pair.c - cc -O -DSDBM -DDUFF -DDUPERROR -DSPLITFAIL -c hash.c - ar cr libsdbm.a sdbm.o pair.o hash.o - ranlib libsdbm.a - cc -o dbm dbm.o libsdbm.a - cc -O -DSDBM -DDUFF -DDUPERROR -DSPLITFAIL -c dba.c - cc -o dba dba.o - cc -O -DSDBM -DDUFF -DDUPERROR -DSPLITFAIL -c dbd.c - cc -o dbd dbd.o - cc -O -DSDBM -DDUFF -DDUPERROR -DSPLITFAIL -o x-dbm dbm.o -% -% -% wc history - 65110 218344 3204883 history -% -% /bin/time dbm build foo -#include -#include "sdbm.h" - -char *progname; -extern void oops(); - -int -main(argc, argv) -char **argv; -{ - int n; - char *p; - char *name; - int pagf; - - progname = argv[0]; - - if (p = argv[1]) { - name = (char *) malloc((n = strlen(p)) + 5); - strcpy(name, p); - strcpy(name + n, ".pag"); - - if ((pagf = open(name, O_RDONLY)) < 0) - oops("cannot open %s.", name); - - sdump(pagf); - } - else - oops("usage: %s dbname", progname); - - return 0; -} - -sdump(pagf) -int pagf; -{ - register b; - register n = 0; - register t = 0; - register o = 0; - register e; - char pag[PBLKSIZ]; - - while ((b = read(pagf, pag, PBLKSIZ)) > 0) { - printf("#%d: ", n); - if (!okpage(pag)) - printf("bad\n"); - else { - printf("ok. "); - if (!(e = pagestat(pag))) - o++; - else - t += e; - } - n++; - } - - if (b == 0) - printf("%d pages (%d holes): %d entries\n", n, o, t); - else - oops("read failed: block %d", n); -} - -pagestat(pag) -char *pag; -{ - register n; - register free; - register short *ino = (short *) pag; - - if (!(n = ino[0])) - printf("no entries.\n"); - else { - free = ino[n] - (n + 1) * sizeof(short); - printf("%3d entries %2d%% used free %d.\n", - n / 2, ((PBLKSIZ - free) * 100) / PBLKSIZ, free); - } - return n / 2; -} diff -Nru acm-5.0/dis/sdbm/dbd.c acm-6.0+20200416/dis/sdbm/dbd.c --- acm-5.0/dis/sdbm/dbd.c 1995-09-26 18:01:24.000000000 +0000 +++ acm-6.0+20200416/dis/sdbm/dbd.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,110 +0,0 @@ -/* - * dbd - dump a dbm data file - */ - -#include -#include -#include "sdbm.h" - -char *progname; -extern void oops(); - - -#define empty(page) (((short *) page)[0] == 0) - -int -main(argc, argv) -char **argv; -{ - int n; - char *p; - char *name; - int pagf; - - progname = argv[0]; - - if (p = argv[1]) { - name = (char *) malloc((n = strlen(p)) + 5); - strcpy(name, p); - strcpy(name + n, ".pag"); - - if ((pagf = open(name, O_RDONLY)) < 0) - oops("cannot open %s.", name); - - sdump(pagf); - } - else - oops("usage: %s dbname", progname); - return 0; -} - -sdump(pagf) -int pagf; -{ - register r; - register n = 0; - register o = 0; - char pag[PBLKSIZ]; - - while ((r = read(pagf, pag, PBLKSIZ)) > 0) { - if (!okpage(pag)) - fprintf(stderr, "%d: bad page.\n", n); - else if (empty(pag)) - o++; - else - dispage(pag); - n++; - } - - if (r == 0) - fprintf(stderr, "%d pages (%d holes).\n", n, o); - else - oops("read failed: block %d", n); -} - - -#ifdef OLD -dispage(pag) -char *pag; -{ - register i, n; - register off; - register short *ino = (short *) pag; - - off = PBLKSIZ; - for (i = 1; i < ino[0]; i += 2) { - printf("\t[%d]: ", ino[i]); - for (n = ino[i]; n < off; n++) - putchar(pag[n]); - putchar(' '); - off = ino[i]; - printf("[%d]: ", ino[i + 1]); - for (n = ino[i + 1]; n < off; n++) - putchar(pag[n]); - off = ino[i + 1]; - putchar('\n'); - } -} -#else -dispage(pag) -char *pag; -{ - register i, n; - register off; - register short *ino = (short *) pag; - - off = PBLKSIZ; - for (i = 1; i < ino[0]; i += 2) { - for (n = ino[i]; n < off; n++) - if (pag[n] != 0) - putchar(pag[n]); - putchar('\t'); - off = ino[i]; - for (n = ino[i + 1]; n < off; n++) - if (pag[n] != 0) - putchar(pag[n]); - putchar('\n'); - off = ino[i + 1]; - } -} -#endif diff -Nru acm-5.0/dis/sdbm/dbe.1 acm-6.0+20200416/dis/sdbm/dbe.1 --- acm-5.0/dis/sdbm/dbe.1 1995-09-26 18:01:26.000000000 +0000 +++ acm-6.0+20200416/dis/sdbm/dbe.1 1970-01-01 00:00:00.000000000 +0000 @@ -1,46 +0,0 @@ -.TH dbe 1 "ndbm(3) EDITOR" -.SH NAME -dbe \- Edit a ndbm(3) database -.SH USAGE -dbe [-m r|w|rw] [-crtvx] -a|-d|-f|-F|-s [ []] -.SH DESCRIPTION -\fIdbme\fP operates on ndbm(3) databases. -It can be used to create them, look at them or change them. -When specifying the value of a key or the content of its associated entry, -\\nnn, \\0, \\n, \\t, \\f and \\r are interpreted as usual. -When displaying key/content pairs, non-printable characters are displayed -using the \\nnn notation. -.SH OPTIONS -.IP -a -List all entries in the database. -.IP -c -Create the database if it does not exist. -.IP -d -Delete the entry associated with the specified key. -.IP -f -Fetch and display the entry associated with the specified key. -.IP -F -Fetch and display all the entries whose key match the specified -regular-expression -.IP "-m r|w|rw" -Open the database in read-only, write-only or read-write mode -.IP -r -Replace the entry associated with the specified key if it already exists. -See option -s. -.IP -s -Store an entry under a specific key. -An error occurs if the key already exists and the option -r was not specified. -.IP -t -Re-initialize the database before executing the command. -.IP -v -Verbose mode. -Confirm stores and deletions. -.IP -x -If option -x is used with option -c, then if the database already exists, -an error occurs. -This can be used to implement a simple exclusive access locking mechanism. -.SH SEE ALSO -ndbm(3) -.SH AUTHOR -janick@bnr.ca - diff -Nru acm-5.0/dis/sdbm/dbe.c acm-6.0+20200416/dis/sdbm/dbe.c --- acm-5.0/dis/sdbm/dbe.c 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/dis/sdbm/dbe.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,435 +0,0 @@ -#include -#ifndef VMS -#include -#include -#else -#include "file.h" -#include "ndbm.h" -#endif -#include - -/***************************************************************************\ -** ** -** Function name: getopt() ** -** Author: Henry Spencer, UofT ** -** Coding date: 84/04/28 ** -** ** -** Description: ** -** ** -** Parses argv[] for arguments. ** -** Works with Whitesmith's C compiler. ** -** ** -** Inputs - The number of arguments ** -** - The base address of the array of arguments ** -** - A string listing the valid options (':' indicates an ** -** argument to the preceding option is required, a ';' ** -** indicates an argument to the preceding option is optional) ** -** ** -** Outputs - Returns the next option character, ** -** '?' for non '-' arguments ** -** or ':' when there is no more arguments. ** -** ** -** Side Effects + The argument to an option is pointed to by 'optarg' ** -** ** -***************************************************************************** -** ** -** REVISION HISTORY: ** -** ** -** DATE NAME DESCRIPTION ** -** YY/MM/DD ------------------ ------------------------------------ ** -** 88/10/20 Janick Bergeron Returns '?' on unamed arguments ** -** returns '!' on unknown options ** -** and 'EOF' only when exhausted. ** -** 88/11/18 Janick Bergeron Return ':' when no more arguments ** -** 89/08/11 Janick Bergeron Optional optarg when ';' in optstring ** -** ** -\***************************************************************************/ - -char *optarg; /* Global argument pointer. */ - -#ifdef VMS -#define index strchr -#endif - -char -getopt(argc, argv, optstring) -int argc; -char **argv; -char *optstring; -{ - register int c; - register char *place; - extern char *index(); - static int optind = 0; - static char *scan = NULL; - - optarg = NULL; - - if (scan == NULL || *scan == '\0') { - - if (optind == 0) - optind++; - if (optind >= argc) - return ':'; - - optarg = place = argv[optind++]; - if (place[0] != '-' || place[1] == '\0') - return '?'; - if (place[1] == '-' && place[2] == '\0') - return '?'; - scan = place + 1; - } - - c = *scan++; - place = index(optstring, c); - if (place == NULL || c == ':' || c == ';') { - - (void) fprintf(stderr, "%s: unknown option %c\n", argv[0], c); - scan = NULL; - return '!'; - } - if (*++place == ':') { - - if (*scan != '\0') { - - optarg = scan; - scan = NULL; - - } - else { - - if (optind >= argc) { - - (void) fprintf(stderr, "%s: %c requires an argument\n", - argv[0], c); - return '!'; - } - optarg = argv[optind]; - optind++; - } - } - else if (*place == ';') { - - if (*scan != '\0') { - - optarg = scan; - scan = NULL; - - } - else { - - if (optind >= argc || *argv[optind] == '-') - optarg = NULL; - else { - optarg = argv[optind]; - optind++; - } - } - } - return c; -} - - -void -print_datum(db) -datum db; -{ - int i; - - putchar('"'); - for (i = 0; i < db.dsize; i++) { - if (isprint(db.dptr[i])) - putchar(db.dptr[i]); - else { - putchar('\\'); - putchar('0' + ((db.dptr[i] >> 6) & 0x07)); - putchar('0' + ((db.dptr[i] >> 3) & 0x07)); - putchar('0' + (db.dptr[i] & 0x07)); - } - } - putchar('"'); -} - - -datum -read_datum(s) -char *s; -{ - datum db; - char *p; - int i; - - db.dsize = 0; - db.dptr = (char *) malloc(strlen(s) * sizeof(char)); - for (p = db.dptr; *s != '\0'; p++, db.dsize++, s++) { - if (*s == '\\') { - if (*++s == 'n') - *p = '\n'; - else if (*s == 'r') - *p = '\r'; - else if (*s == 'f') - *p = '\f'; - else if (*s == 't') - *p = '\t'; - else if (isdigit(*s) && isdigit(*(s + 1)) && isdigit(*(s + 2))) { - i = (*s++ - '0') << 6; - i |= (*s++ - '0') << 3; - i |= *s - '0'; - *p = i; - } - else if (*s == '0') - *p = '\0'; - else - *p = *s; - } - else - *p = *s; - } - - return db; -} - - -char * -key2s(db) -datum db; -{ - char *buf; - char *p1, *p2; - - buf = (char *) malloc((db.dsize + 1) * sizeof(char)); - for (p1 = buf, p2 = db.dptr; *p2 != '\0'; *p1++ = *p2++); - *p1 = '\0'; - return buf; -} - - -main(argc, argv) -int argc; -char **argv; -{ - typedef enum { - YOW, FETCH, STORE, DELETE, SCAN, REGEXP - } commands; - char opt; - int flags; - int giveusage = 0; - int verbose = 0; - commands what = YOW; - char *comarg[3]; - int st_flag = DBM_INSERT; - int argn; - DBM *db; - datum key; - datum content; - - flags = O_RDWR; - argn = 0; - - while ((opt = getopt(argc, argv, "acdfFm:rstvx")) != ':') { - switch (opt) { - case 'a': - what = SCAN; - break; - case 'c': - flags |= O_CREAT; - break; - case 'd': - what = DELETE; - break; - case 'f': - what = FETCH; - break; - case 'F': - what = REGEXP; - break; - case 'm': - flags &= ~(000007); - if (strcmp(optarg, "r") == 0) - flags |= O_RDONLY; - else if (strcmp(optarg, "w") == 0) - flags |= O_WRONLY; - else if (strcmp(optarg, "rw") == 0) - flags |= O_RDWR; - else { - fprintf(stderr, "Invalid mode: \"%s\"\n", optarg); - giveusage = 1; - } - break; - case 'r': - st_flag = DBM_REPLACE; - break; - case 's': - what = STORE; - break; - case 't': - flags |= O_TRUNC; - break; - case 'v': - verbose = 1; - break; - case 'x': - flags |= O_EXCL; - break; - case '!': - giveusage = 1; - break; - case '?': - if (argn < 3) - comarg[argn++] = optarg; - else { - fprintf(stderr, "Too many arguments.\n"); - giveusage = 1; - } - break; - } - } - - if (giveusage | what == YOW | argn < 1) { - fprintf(stderr, "Usage: %s databse [-m r|w|rw] [-crtx] -a|-d|-f|-F|-s [key [content]]\n", argv[0]); - exit(-1); - } - - if ((db = dbm_open(comarg[0], flags, 0777)) == NULL) { - fprintf(stderr, "Error opening database \"%s\"\n", comarg[0]); - exit(-1); - } - - if (argn > 1) - key = read_datum(comarg[1]); - if (argn > 2) - content = read_datum(comarg[2]); - - switch (what) { - - case SCAN: - key = dbm_firstkey(db); - if (dbm_error(db)) { - fprintf(stderr, "Error when fetching first key\n"); - goto db_exit; - } - while (key.dptr != NULL) { - content = dbm_fetch(db, key); - if (dbm_error(db)) { - fprintf(stderr, "Error when fetching "); - print_datum(key); - printf("\n"); - goto db_exit; - } - print_datum(key); - printf(": "); - print_datum(content); - printf("\n"); - if (dbm_error(db)) { - fprintf(stderr, "Error when fetching next key\n"); - goto db_exit; - } - key = dbm_nextkey(db); - } - break; - - case REGEXP: - if (argn < 2) { - fprintf(stderr, "Missing regular expression.\n"); - goto db_exit; - } - if (re_comp(comarg[1])) { - fprintf(stderr, "Invalid regular expression\n"); - goto db_exit; - } - key = dbm_firstkey(db); - if (dbm_error(db)) { - fprintf(stderr, "Error when fetching first key\n"); - goto db_exit; - } - while (key.dptr != NULL) { - if (re_exec(key2s(key))) { - content = dbm_fetch(db, key); - if (dbm_error(db)) { - fprintf(stderr, "Error when fetching "); - print_datum(key); - printf("\n"); - goto db_exit; - } - print_datum(key); - printf(": "); - print_datum(content); - printf("\n"); - if (dbm_error(db)) { - fprintf(stderr, "Error when fetching next key\n"); - goto db_exit; - } - } - key = dbm_nextkey(db); - } - break; - - case FETCH: - if (argn < 2) { - fprintf(stderr, "Missing fetch key.\n"); - goto db_exit; - } - content = dbm_fetch(db, key); - if (dbm_error(db)) { - fprintf(stderr, "Error when fetching "); - print_datum(key); - printf("\n"); - goto db_exit; - } - if (content.dptr == NULL) { - fprintf(stderr, "Cannot find "); - print_datum(key); - printf("\n"); - goto db_exit; - } - print_datum(key); - printf(": "); - print_datum(content); - printf("\n"); - break; - - case DELETE: - if (argn < 2) { - fprintf(stderr, "Missing delete key.\n"); - goto db_exit; - } - if (dbm_delete(db, key) || dbm_error(db)) { - fprintf(stderr, "Error when deleting "); - print_datum(key); - printf("\n"); - goto db_exit; - } - if (verbose) { - print_datum(key); - printf(": DELETED\n"); - } - break; - - case STORE: - if (argn < 3) { - fprintf(stderr, "Missing key and/or content.\n"); - goto db_exit; - } - if (dbm_store(db, key, content, st_flag) || dbm_error(db)) { - fprintf(stderr, "Error when storing "); - print_datum(key); - printf("\n"); - goto db_exit; - } - if (verbose) { - print_datum(key); - printf(": "); - print_datum(content); - printf(" STORED\n"); - } - break; - } - -db_exit: - dbm_clearerr(db); - dbm_close(db); - if (dbm_error(db)) { - fprintf(stderr, "Error closing database \"%s\"\n", comarg[0]); - exit(-1); - } -} diff -Nru acm-5.0/dis/sdbm/dbm.c acm-6.0+20200416/dis/sdbm/dbm.c --- acm-5.0/dis/sdbm/dbm.c 1995-09-26 18:01:30.000000000 +0000 +++ acm-6.0+20200416/dis/sdbm/dbm.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,120 +0,0 @@ -/* - * Copyright (c) 1985 The Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms are permitted - * provided that the above copyright notice and this paragraph are - * duplicated in all such forms and that any documentation, - * advertising materials, and other materials related to such - * distribution and use acknowledge that the software was developed - * by the University of California, Berkeley. The name of the - * University may not be used to endorse or promote products derived - * from this software without specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef lint -static char sccsid[] = "@(#)dbm.c 5.4 (Berkeley) 5/24/89"; -#endif /* not lint */ - -#include "dbm.h" - -#define NODB ((DBM *)0) - -static DBM *cur_db = NODB; - -static char no_db[] = "dbm: no open database\n"; - -dbminit(file) - char *file; -{ - if (cur_db != NODB) - dbm_close(cur_db); - - cur_db = dbm_open(file, 2, 0); - if (cur_db == NODB) { - cur_db = dbm_open(file, 0, 0); - if (cur_db == NODB) - return (-1); - } - return (0); -} - -long -forder(key) -datum key; -{ - if (cur_db == NODB) { - printf(no_db); - return (0L); - } - return (dbm_forder(cur_db, key)); -} - -datum -fetch(key) -datum key; -{ - datum item; - - if (cur_db == NODB) { - printf(no_db); - item.dptr = 0; - return (item); - } - return (dbm_fetch(cur_db, key)); -} - -delete(key) -datum key; -{ - if (cur_db == NODB) { - printf(no_db); - return (-1); - } - if (dbm_rdonly(cur_db)) - return (-1); - return (dbm_delete(cur_db, key)); -} - -store(key, dat) -datum key, dat; -{ - if (cur_db == NODB) { - printf(no_db); - return (-1); - } - if (dbm_rdonly(cur_db)) - return (-1); - - return (dbm_store(cur_db, key, dat, DBM_REPLACE)); -} - -datum -firstkey() -{ - datum item; - - if (cur_db == NODB) { - printf(no_db); - item.dptr = 0; - return (item); - } - return (dbm_firstkey(cur_db)); -} - -datum -nextkey(key) -datum key; -{ - datum item; - - if (cur_db == NODB) { - printf(no_db); - item.dptr = 0; - return (item); - } - return (dbm_nextkey(cur_db, key)); -} diff -Nru acm-5.0/dis/sdbm/dbm.h acm-6.0+20200416/dis/sdbm/dbm.h --- acm-5.0/dis/sdbm/dbm.h 1995-09-26 18:01:34.000000000 +0000 +++ acm-6.0+20200416/dis/sdbm/dbm.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,33 +0,0 @@ -/* - * Copyright (c) 1983 The Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms are permitted - * provided that the above copyright notice and this paragraph are - * duplicated in all such forms and that any documentation, - * advertising materials, and other materials related to such - * distribution and use acknowledge that the software was developed - * by the University of California, Berkeley. The name of the - * University may not be used to endorse or promote products derived - * from this software without specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * @(#)dbm.h 5.2 (Berkeley) 5/24/89 - */ - -#ifndef NULL -/* - * this is lunacy, we no longer use it (and never should have - * unconditionally defined it), but, this whole file is for - * backwards compatability - someone may rely on this. - */ -#define NULL ((char *) 0) -#endif - -#include - -datum fetch(); -datum firstkey(); -datum nextkey(); diff -Nru acm-5.0/dis/sdbm/dbu.c acm-6.0+20200416/dis/sdbm/dbu.c --- acm-5.0/dis/sdbm/dbu.c 1995-09-26 18:01:36.000000000 +0000 +++ acm-6.0+20200416/dis/sdbm/dbu.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,262 +0,0 @@ -#include -#include -#ifdef SDBM -#include "sdbm.h" -#else -#include -#endif - -#if STDC_HEADERS || HAVE_STRING_H -#include -/* An ANSI string.h and pre-ANSI memory.h might conflict. */ -#if !STDC_HEADERS && HAVE_MEMORY_H -#include -#endif /* not STDC_HEADERS and HAVE_MEMORY_H */ -#define index strchr -#define rindex strrchr -#define bcopy(s, d, n) memcpy ((d), (s), (n)) -#define bcmp(s1, s2, n) memcmp ((s1), (s2), (n)) -#define bzero(s, n) memset ((s), 0, (n)) -#else /* not STDC_HEADERS and not HAVE_STRING_H */ -#include -/* memory.h and strings.h conflict on some systems. */ -#endif /* not STDC_HEADERS and not HAVE_STRING_H */ - -extern int getopt(); -extern void oops(); - -char *progname; - -static int rflag; -static char *usage = "%s [-R] cat | look |... dbmname"; - -#define DERROR 0 -#define DLOOK 1 -#define DINSERT 2 -#define DDELETE 3 -#define DCAT 4 -#define DBUILD 5 -#define DPRESS 6 -#define DCREAT 7 - -#define LINEMAX 8192 - -typedef struct { - char *sname; - int scode; - int flags; -} cmd; - -static cmd cmds[] = { - - "fetch", DLOOK, O_RDONLY, - "get", DLOOK, O_RDONLY, - "look", DLOOK, O_RDONLY, - "add", DINSERT, O_RDWR, - "insert", DINSERT, O_RDWR, - "store", DINSERT, O_RDWR, - "delete", DDELETE, O_RDWR, - "remove", DDELETE, O_RDWR, - "dump", DCAT, O_RDONLY, - "list", DCAT, O_RDONLY, - "cat", DCAT, O_RDONLY, - "creat", DCREAT, O_RDWR | O_CREAT | O_TRUNC, - "new", DCREAT, O_RDWR | O_CREAT | O_TRUNC, - "build", DBUILD, O_RDWR | O_CREAT, - "squash", DPRESS, O_RDWR, - "compact", DPRESS, O_RDWR, - "compress", DPRESS, O_RDWR -}; - -#define CTABSIZ (sizeof (cmds)/sizeof (cmd)) - -static cmd *parse(); -static void badk(), doit(), prdatum(); - -int -main(argc, argv) -int argc; -char *argv[]; -{ - int c; - register cmd *act; - extern int optind; - extern char *optarg; - - progname = argv[0]; - - while ((c = getopt(argc, argv, "R")) != EOF) - switch (c) { - case 'R': /* raw processing */ - rflag++; - break; - - default: - oops("usage: %s", usage); - break; - } - - if ((argc -= optind) < 2) - oops("usage: %s", usage); - - if ((act = parse(argv[optind])) == NULL) - badk(argv[optind]); - optind++; - doit(act, argv[optind]); - return 0; -} - -static void -doit(act, file) -register cmd *act; -char *file; -{ - datum key; - datum val; - register DBM *db; - register char *op; - register int n; - char *line; -#ifdef TIME - long start; - extern long time(); -#endif - - if ((db = dbm_open(file, act->flags, 0644)) == NULL) - oops("cannot open: %s", file); - - if ((line = (char *) malloc(LINEMAX)) == NULL) - oops("%s: cannot get memory", "line alloc"); - - switch (act->scode) { - - case DLOOK: - while (fgets(line, LINEMAX, stdin) != NULL) { - n = strlen(line) - 1; - line[n] = 0; - key.dptr = line; - key.dsize = n; - val = dbm_fetch(db, key); - if (val.dptr != NULL) { - prdatum(stdout, val); - putchar('\n'); - continue; - } - prdatum(stderr, key); - fprintf(stderr, ": not found.\n"); - } - break; - case DINSERT: - break; - case DDELETE: - while (fgets(line, LINEMAX, stdin) != NULL) { - n = strlen(line) - 1; - line[n] = 0; - key.dptr = line; - key.dsize = n; - if (dbm_delete(db, key) == -1) { - prdatum(stderr, key); - fprintf(stderr, ": not found.\n"); - } - } - break; - case DCAT: - for (key = dbm_firstkey(db); key.dptr != 0; - key = dbm_nextkey(db)) { - prdatum(stdout, key); - putchar('\t'); - prdatum(stdout, dbm_fetch(db, key)); - putchar('\n'); - } - break; - case DBUILD: -#ifdef TIME - start = time(0); -#endif - while (fgets(line, LINEMAX, stdin) != NULL) { - n = strlen(line) - 1; - line[n] = 0; - key.dptr = line; - if ((op = strchr(line, '\t')) != 0) { - key.dsize = op - line; - *op++ = 0; - val.dptr = op; - val.dsize = line + n - op; - } - else - oops("bad input; %s", line); - - if (dbm_store(db, key, val, DBM_REPLACE) < 0) { - prdatum(stderr, key); - fprintf(stderr, ": "); - oops("store: %s", "failed"); - } - } -#ifdef TIME - printf("done: %d seconds.\n", time(0) - start); -#endif - break; - case DPRESS: - break; - case DCREAT: - break; - } - - dbm_close(db); -} - -static void -badk(word) -char *word; -{ - register int i; - - if (progname) - fprintf(stderr, "%s: ", progname); - fprintf(stderr, "bad keywd %s. use one of\n", word); - for (i = 0; i < (int)CTABSIZ; i++) - fprintf(stderr, "%-8s%c", cmds[i].sname, - ((i + 1) % 6 == 0) ? '\n' : ' '); - fprintf(stderr, "\n"); - exit(1); - /*NOTREACHED*/ -} - -static cmd * -parse(str) -register char *str; -{ - register int i = CTABSIZ; - register cmd *p; - - for (p = cmds; i--; p++) - if (strcmp(p->sname, str) == 0) - return p; - return NULL; -} - -static void -prdatum(stream, d) -FILE *stream; -datum d; -{ - register int c; - register char *p = d.dptr; - register int n = d.dsize; - - fprintf (stream, "\""); - while (n--) { - c = *p++ & 0377; - if (c & 0200) { - fprintf(stream, "M-"); - c &= 0177; - } - if (c == 0177 || c < ' ') - fprintf(stream, "^%c", (c == 0177) ? '?' : c + '@'); - else - putc(c, stream); - } - fprintf (stream, "\""); -} - - diff -Nru acm-5.0/dis/sdbm/grind acm-6.0+20200416/dis/sdbm/grind --- acm-5.0/dis/sdbm/grind 1995-09-26 18:01:38.000000000 +0000 +++ acm-6.0+20200416/dis/sdbm/grind 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ -#!/bin/sh -rm -f /tmp/*.dir /tmp/*.pag -awk -e '{ - printf "%s\t", $0 - for (i = 0; i < 40; i++) - printf "%s.", $0 - printf "\n" -}' < /usr/dict/words | $1 build /tmp/$2 - diff -Nru acm-5.0/dis/sdbm/hash.c acm-6.0+20200416/dis/sdbm/hash.c --- acm-5.0/dis/sdbm/hash.c 1995-09-26 18:01:40.000000000 +0000 +++ acm-6.0+20200416/dis/sdbm/hash.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,47 +0,0 @@ -/* - * sdbm - ndbm work-alike hashed database library - * based on Per-Aake Larson's Dynamic Hashing algorithms. BIT 18 (1978). - * author: oz@nexus.yorku.ca - * status: public domain. keep it that way. - * - * hashing routine - */ - -#include "sdbm.h" -/* - * polynomial conversion ignoring overflows - * [this seems to work remarkably well, in fact better - * then the ndbm hash function. Replace at your own risk] - * use: 65599 nice. - * 65587 even better. - */ -long -dbm_hash(str, len) -register char *str; -register int len; -{ - register unsigned long n = 0; - -#ifdef DUFF - -#define HASHC n = *str++ + 65599 * n - - if (len > 0) { - register int loop = (len + 8 - 1) >> 3; - - switch(len & (8 - 1)) { - case 0: do { - HASHC; case 7: HASHC; - case 6: HASHC; case 5: HASHC; - case 4: HASHC; case 3: HASHC; - case 2: HASHC; case 1: HASHC; - } while (--loop); - } - - } -#else - while (len--) - n = *str++ + 65599 * n; -#endif - return n; -} diff -Nru acm-5.0/dis/sdbm/Makefile.in acm-6.0+20200416/dis/sdbm/Makefile.in --- acm-5.0/dis/sdbm/Makefile.in 1998-05-12 03:43:02.000000000 +0000 +++ acm-6.0+20200416/dis/sdbm/Makefile.in 1970-01-01 00:00:00.000000000 +0000 @@ -1,60 +0,0 @@ -srcdir = @srcdir@ - VPATH = @srcdir@ - -# makefile for public domain ndbm-clone: sdbm -# DUFF: use duff's device (loop unroll) in parts of the code - CC = @CC@ - CFLAGS = -DSDBM -DDUFF @DEFS@ @CFLAGS@ -LDFLAGS = @LDFLAGS@ - RANLIB = @RANLIB@ - - OBJS = sdbm.o pair.o hash.o - SRCS = sdbm.c pair.c hash.c dbu.c dba.c dbd.c util.c - HDRS = tune.h sdbm.h pair.h - MISC = README CHANGES COMPARE sdbm.3 dbe.c dbe.1 \ - dbm.c dbm.h biblio readme.ms readme.ps - LIB = libsdbm.a - -all: dbu dba dbd dbe - -dbu: dbu.o $(LIB) util.o - $(CC) $(LDFLAGS) -o dbu dbu.o util.o $(LIB) - -dba: dba.o util.o - $(CC) $(LDFLAGS) -o dba dba.o util.o - -dbd: dbd.o util.o - $(CC) $(LDFLAGS) -o dbd dbd.o util.o - -dbe: dbe.o $(LIB) - $(CC) $(LDFLAGS) -o dbe dbe.o $(LIB) - -$(LIB): $(OBJS) - $(AR) cr $@ $(OBJS) - $(RANLIB) $@ - -$(OBJS): sdbm.h tune.h pair.h - -# -# dbu using berkelezoid ndbm routines [if you have them] for testing -# -#x-dbu: dbu.o util.o -# $(CC) $(CFLAGS) -o x-dbu dbu.o util.o -lint: - lint -abchx $(SRCS) - -clean: - rm -f *.o mon.out core $(LIB) dbu dbd dbe dba *~ *.bak - -readme: - nroff -ms readme.ms | col -b >README - -distclean: clean - rm -f *.dir *.pag Makefile - -depend: - makedepend $(CFLAGS) $(SRCS) - -TAGS tags test check: - -# DO NOT DELETE THIS LINE -- make depend depends on it. diff -Nru acm-5.0/dis/sdbm/makefile.sdbm acm-6.0+20200416/dis/sdbm/makefile.sdbm --- acm-5.0/dis/sdbm/makefile.sdbm 1995-09-26 18:02:10.000000000 +0000 +++ acm-6.0+20200416/dis/sdbm/makefile.sdbm 1970-01-01 00:00:00.000000000 +0000 @@ -1,56 +0,0 @@ -# -# makefile for public domain ndbm-clone: sdbm -# DUFF: use duff's device (loop unroll) in parts of the code -# -CFLAGS = -O -DSDBM -DDUFF -DBSD42 -CC = gcc -#LDFLAGS = -p - -OBJS = sdbm.o pair.o hash.o -SRCS = sdbm.c pair.c hash.c dbu.c dba.c dbd.c util.c -HDRS = tune.h sdbm.h pair.h -MISC = README CHANGES COMPARE sdbm.3 dbe.c dbe.1 dbm.c dbm.h biblio \ - readme.ms readme.ps - -all: dbu dba dbd dbe - -dbu: dbu.o sdbm util.o - $(CC) $(LDFLAGS) -o dbu dbu.o util.o libsdbm.a - -dba: dba.o util.o - $(CC) $(LDFLAGS) -o dba dba.o util.o -dbd: dbd.o util.o - $(CC) $(LDFLAGS) -o dbd dbd.o util.o -dbe: dbe.o sdbm - $(CC) $(LDFLAGS) -o dbe dbe.o libsdbm.a - -sdbm: $(OBJS) - ar cr libsdbm.a $(OBJS) - ranlib libsdbm.a -### cp libsdbm.a /usr/lib/libsdbm.a - -dba.o: sdbm.h -dbu.o: sdbm.h -util.o:sdbm.h - -$(OBJS): sdbm.h tune.h pair.h - -# -# dbu using berkelezoid ndbm routines [if you have them] for testing -# -#x-dbu: dbu.o util.o -# $(CC) $(CFLAGS) -o x-dbu dbu.o util.o -lint: - lint -abchx $(SRCS) - -clean: - rm -f *.o mon.out core - -purge: clean - rm -f dbu libsdbm.a dbd dba dbe x-dbu *.dir *.pag - -shar: - shar $(MISC) makefile $(SRCS) $(HDRS) >SDBM.SHAR - -readme: - nroff -ms readme.ms | col -b >README diff -Nru acm-5.0/dis/sdbm/pair.c acm-6.0+20200416/dis/sdbm/pair.c --- acm-5.0/dis/sdbm/pair.c 1998-05-12 03:59:04.000000000 +0000 +++ acm-6.0+20200416/dis/sdbm/pair.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,304 +0,0 @@ -/* - * sdbm - ndbm work-alike hashed database library - * based on Per-Aake Larson's Dynamic Hashing algorithms. BIT 18 (1978). - * author: oz@nexus.yorku.ca - * status: public domain. - * - * page-level routines - */ - -#ifndef lint -static char rcsid[] = "$Id: pair.c,v 1.2 1998/05/12 03:59:04 riley Exp $"; -#endif - -#include "sdbm.h" -#include "tune.h" -#include "pair.h" - -#define exhash(item) dbm_hash((item).dptr, (item).dsize) - -/* - * forward - */ -static int seepair proto((char *, int, char *, int)); - -/* - * page format: - * +------------------------------+ - * ino | n | keyoff | datoff | keyoff | - * +------------+--------+--------+ - * | datoff | - - - ----> | - * +--------+---------------------+ - * | F R E E A R E A | - * +--------------+---------------+ - * | <---- - - - | data | - * +--------+-----+----+----------+ - * | key | data | key | - * +--------+----------+----------+ - * - * calculating the offsets for free area: if the number - * of entries (ino[0]) is zero, the offset to the END of - * the free area is the block size. Otherwise, it is the - * nth (ino[ino[0]]) entry's offset. - */ - -int -fitpair(pag, need) -char *pag; -int need; -{ - register int n; - register int off; - register int free; - register short *ino = (short *) pag; - - off = ((n = ino[0]) > 0) ? ino[n] : PBLKSIZ; - free = off - (n + 1) * sizeof(short); - need += 2 * sizeof(short); - - debug(("free %d need %d\n", free, need)); - - return need <= free; -} - -void -putpair(pag, key, val) -char *pag; -datum key; -datum val; -{ - register int n; - register int off; - register short *ino = (short *) pag; - - off = ((n = ino[0]) > 0) ? ino[n] : PBLKSIZ; -/* - * enter the key first - */ - off -= key.dsize; - (void) memcpy(pag + off, key.dptr, key.dsize); - ino[n + 1] = off; -/* - * now the data - */ - off -= val.dsize; - (void) memcpy(pag + off, val.dptr, val.dsize); - ino[n + 2] = off; -/* - * adjust item count - */ - ino[0] += 2; -} - -datum -getpair(pag, key) -char *pag; -datum key; -{ - register int i; - register int n; - datum val; - register short *ino = (short *) pag; - - if ((n = ino[0]) == 0) - return nullitem; - - if ((i = seepair(pag, n, key.dptr, key.dsize)) == 0) - return nullitem; - - val.dptr = pag + ino[i + 1]; - val.dsize = ino[i] - ino[i + 1]; - return val; -} - -#ifdef SEEDUPS -int -duppair(pag, key) -char *pag; -datum key; -{ - register short *ino = (short *) pag; - return ino[0] > 0 && seepair(pag, ino[0], key.dptr, key.dsize) > 0; -} -#endif - -datum -getnkey(pag, num) -char *pag; -int num; -{ - datum key; - register int off; - register short *ino = (short *) pag; - - num = num * 2 - 1; - if (ino[0] == 0 || num > ino[0]) - return nullitem; - - off = (num > 1) ? ino[num - 1] : PBLKSIZ; - - key.dptr = pag + ino[num]; - key.dsize = off - ino[num]; - - return key; -} - -int -delpair(pag, key) -char *pag; -datum key; -{ - register int n; - register int i; - register short *ino = (short *) pag; - - if ((n = ino[0]) == 0) - return 0; - - if ((i = seepair(pag, n, key.dptr, key.dsize)) == 0) - return 0; -/* - * found the key. if it is the last entry - * [i.e. i == n - 1] we just adjust the entry count. - * hard case: move all data down onto the deleted pair, - * shift offsets onto deleted offsets, and adjust them. - * [note: 0 < i < n] - */ - if (i < n - 1) { - register int m; - register char *dst = pag + (i == 1 ? PBLKSIZ : ino[i - 1]); - register char *src = pag + ino[i + 1]; - register int zoo = dst - src; - - debug(("free-up %d ", zoo)); -/* - * shift data/keys down - */ - m = ino[i + 1] - ino[n]; -#ifdef DUFF -#define MOVB *--dst = *--src - - if (m > 0) { - register int loop = (m + 8 - 1) >> 3; - - switch (m & (8 - 1)) { - case 0: do { - MOVB; case 7: MOVB; - case 6: MOVB; case 5: MOVB; - case 4: MOVB; case 3: MOVB; - case 2: MOVB; case 1: MOVB; - } while (--loop); - } - } -#else -#ifdef MEMMOVE - memmove(dst, src, m); -#else - while (m--) - *--dst = *--src; -#endif -#endif -/* - * adjust offset index up - */ - while (i < n - 1) { - ino[i] = ino[i + 2] + zoo; - i++; - } - } - ino[0] -= 2; - return 1; -} - -/* - * search for the key in the page. - * return offset index in the range 0 < i < n. - * return 0 if not found. - */ -static int -seepair(pag, n, key, siz) -char *pag; -register int n; -register char *key; -register int siz; -{ - register int i; - register int off = PBLKSIZ; - register short *ino = (short *) pag; - - for (i = 1; i < n; i += 2) { - if (siz == off - ino[i] && - memcmp(key, pag + ino[i], siz) == 0) - return i; - off = ino[i + 1]; - } - return 0; -} - -void -splpage(pag, new, sbit) -char *pag; -char *new; -long sbit; -{ - datum key; - datum val; - - register int n; - register int off = PBLKSIZ; - char cur[PBLKSIZ]; - register short *ino = (short *) cur; - - (void) memcpy(cur, pag, PBLKSIZ); - (void) memset(pag, 0, PBLKSIZ); - (void) memset(new, 0, PBLKSIZ); - - n = ino[0]; - for (ino++; n > 0; ino += 2) { - key.dptr = cur + ino[0]; - key.dsize = off - ino[0]; - val.dptr = cur + ino[1]; - val.dsize = ino[0] - ino[1]; -/* - * select the page pointer (by looking at sbit) and insert - */ - (void) putpair((exhash(key) & sbit) ? new : pag, key, val); - - off = ino[1]; - n -= 2; - } - - debug(("%d split %d/%d\n", ((short *) cur)[0] / 2, - ((short *) new)[0] / 2, - ((short *) pag)[0] / 2)); -} - -/* - * check page sanity: - * number of entries should be something - * reasonable, and all offsets in the index should be in order. - * this could be made more rigorous. - */ -int -chkpage(pag) -char *pag; -{ - register int n; - register int off; - register short *ino = (short *) pag; - - if ((n = ino[0]) < 0 || n > PBLKSIZ / sizeof(short)) - return 0; - - if (n > 0) { - off = PBLKSIZ; - for (ino++; n > 0; ino += 2) { - if (ino[0] > off || ino[1] > off || - ino[1] > ino[0]) - return 0; - off = ino[1]; - n -= 2; - } - } - return 1; -} diff -Nru acm-5.0/dis/sdbm/pair.h acm-6.0+20200416/dis/sdbm/pair.h --- acm-5.0/dis/sdbm/pair.h 1995-09-26 18:01:48.000000000 +0000 +++ acm-6.0+20200416/dis/sdbm/pair.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,10 +0,0 @@ -extern int fitpair proto((char *, int)); -extern void putpair proto((char *, datum, datum)); -extern datum getpair proto((char *, datum)); -extern int delpair proto((char *, datum)); -extern int chkpage proto((char *)); -extern datum getnkey proto((char *, int)); -extern void splpage proto((char *, char *, long)); -#ifdef SEEDUPS -extern int duppair proto((char *, datum)); -#endif diff -Nru acm-5.0/dis/sdbm/README acm-6.0+20200416/dis/sdbm/README --- acm-5.0/dis/sdbm/README 1995-09-26 18:01:16.000000000 +0000 +++ acm-6.0+20200416/dis/sdbm/README 1970-01-01 00:00:00.000000000 +0000 @@ -1,396 +0,0 @@ - - - - - - - sdbm - Substitute DBM - or - Berkeley ndbm for Every UN*X[1] Made Simple - - Ozan (oz) Yigit - - The Guild of PD Software Toolmakers - Toronto - Canada - - oz@nexus.yorku.ca - - - -Implementation is the sincerest form of flattery. - L. Peter -Deutsch - -A The Clone of the ndbm library - - The sources accompanying this notice - sdbm - consti- -tute the first public release (Dec. 1990) of a complete -clone of the Berkeley UN*X ndbm library. The sdbm library is -meant to clone the proven functionality of ndbm as closely -as possible, including a few improvements. It is practical, -easy to understand, and compatible. The sdbm library is not -derived from any licensed, proprietary or copyrighted -software. - - The sdbm implementation is based on a 1978 algorithm -[Lar78] by P.-A. (Paul) Larson known as ``Dynamic Hashing''. -In the course of searching for a substitute for ndbm, I pro- -totyped three different external-hashing algorithms [Lar78, -Fag79, Lit80] and ultimately chose Larson's algorithm as a -basis of the sdbm implementation. The Bell Labs dbm (and -therefore ndbm) is based on an algorithm invented by Ken -Thompson, [Tho90, Tor87] and predates Larson's work. - - The sdbm programming interface is totally compatible -with ndbm and includes a slight improvement in database ini- -tialization. It is also expected to be binary-compatible -under most UN*X versions that support the ndbm library. - - The sdbm implementation shares the shortcomings of the -ndbm library, as a side effect of various simplifications to -the original Larson algorithm. It does produce holes in the -page file as it writes pages past the end of file. (Larson's -paper include a clever solution to this problem that is a -result of using the hash value directly as a block address.) -On the other hand, extensive tests seem to indicate that -sdbm creates fewer holes in general, and the resulting page- -files are smaller. The sdbm implementation is also faster -than ndbm in database creation. Unlike the ndbm, the sdbm -_________________________ - - [1] UN*X is not a trademark of any (dis)organization. - - - - - - - - - - - 2 - - - -store operation will not ``wander away'' trying to split its -data pages to insert a datum that cannot (due to elaborate -worst-case situations) be inserted. (It will fail after a -pre-defined number of attempts.) - -Important Compatibility Warning - - The sdbm and ndbm libraries cannot share databases: one -cannot read the (dir/pag) database created by the other. -This is due to the differences between the ndbm and sdbm -algorithms[2], and the hash functions used. It is easy to -convert between the dbm/ndbm databases and sdbm by ignoring -the index completely: see dbd, dbu etc. - - -Notice of Intellectual Property - -The entire sdbm library package, as authored by me, Ozan S. -Yigit, is hereby placed in the public domain. As such, the -author is not responsible for the consequences of use of -this software, no matter how awful, even if they arise from -defects in it. There is no expressed or implied warranty for -the sdbm library. - - Since the sdbm library package is in the public domain, -this original release or any additional public-domain -releases of the modified original cannot possibly (by defin- -ition) be withheld from you. Also by definition, You (singu- -lar) have all the rights to this code (including the right -to sell without permission, the right to hoard[3] and the -right to do other icky things as you see fit) but those -rights are also granted to everyone else. - - Please note that all previous distributions of this -software contained a copyright (which is now dropped) to -protect its origins and its current public domain status -against any possible claims and/or challenges. - -Acknowledgments - - Many people have been very helpful and supportive. A -partial list would necessarily include Rayan Zacherissen -(who contributed the man page, and also hacked a MMAP -_________________________ - - [2] Torek's discussion [Tor87] indicates that -dbm/ndbm implementations use the hash value to traverse -the radix trie differently than sdbm and as a result, -the page indexes are generated in different order. For -more information, send e-mail to the author. - [3] You cannot really hoard something that is avail- -able to the public at large, but try if it makes you -feel any better. - - - - - - - - - - - - 3 - - - -version of sdbm), Arnold Robbins, Chris Lewis, Bill David- -sen, Henry Spencer, Geoff Collyer, Rich Salz (who got me -started in the first place), Johannes Ruschein (who did the -minix port) and David Tilbrook. I thank you all. - -Distribution Manifest and Notes - -This distribution of sdbm includes (at least) the following: - - CHANGES change log - README this file. - biblio a small bibliography on external hashing - dba.c a crude (n/s)dbm page file analyzer - dbd.c a crude (n/s)dbm page file dumper (for conversion) - dbe.1 man page for dbe.c - dbe.c Janick's database editor - dbm.c a dbm library emulation wrapper for ndbm/sdbm - dbm.h header file for the above - dbu.c a crude db management utility - hash.c hashing function - makefile guess. - pair.c page-level routines (posted earlier) - pair.h header file for the above - readme.ms troff source for the README file - sdbm.3 man page - sdbm.c the real thing - sdbm.h header file for the above - tune.h place for tuning & portability thingies - util.c miscellaneous - - dbu is a simple database manipulation program[4] that -tries to look like Bell Labs' cbt utility. It is currently -incomplete in functionality. I use dbu to test out the rou- -tines: it takes (from stdin) tab separated key/value pairs -for commands like build or insert or takes keys for commands -like delete or look. - - dbu dbmfile - - dba is a crude analyzer of dbm/sdbm/ndbm page files. It -scans the entire page file, reporting page level statistics, -and totals at the end. - - dbd is a crude dump program for dbm/ndbm/sdbm data- -bases. It ignores the bitmap, and dumps the data pages in -sequence. It can be used to create input for the dbu util- -ity. Note that dbd will skip any NULLs in the key and data -fields, thus is unsuitable to convert some peculiar -_________________________ - - [4] The dbd, dba, dbu utilities are quick hacks and -are not fit for production use. They were developed -late one night, just to test out sdbm, and convert some -databases. - - - - - - - - - - - 4 - - - -databases that insist in including the terminating null. - - I have also included a copy of the dbe (ndbm DataBase -Editor) by Janick Bergeron [janick@bnr.ca] for your pleas- -ure. You may find it more useful than the little dbu util- -ity. - - dbm.[ch] is a dbm library emulation on top of ndbm (and -hence suitable for sdbm). Written by Robert Elz. - - The sdbm library has been around in beta test for quite -a long time, and from whatever little feedback I received -(maybe no news is good news), I believe it has been func- -tioning without any significant problems. I would, of -course, appreciate all fixes and/or improvements. Portabil- -ity enhancements would especially be useful. - -Implementation Issues - - Hash functions: The algorithm behind sdbm implementa- -tion needs a good bit-scrambling hash function to be effec- -tive. I ran into a set of constants for a simple hash func- -tion that seem to help sdbm perform better than ndbm for -various inputs: - - /* - * polynomial conversion ignoring overflows - * 65599 nice. 65587 even better. - */ - long - dbm_hash(char *str, int len) { - register unsigned long n = 0; - - while (len--) - n = n * 65599 + *str++; - return n; - } - - There may be better hash functions for the purposes of -dynamic hashing. Try your favorite, and check the pagefile. -If it contains too many pages with too many holes, (in rela- -tion to this one for example) or if sdbm simply stops work- -ing (fails after SPLTMAX attempts to split) when you feed -your NEWS history file to it, you probably do not have a -good hashing function. If you do better (for different -types of input), I would like to know about the function you -use. - - Block sizes: It seems (from various tests on a few -machines) that a page file block size PBLKSIZ of 1024 is by -far the best for performance, but this also happens to limit -the size of a key/value pair. Depending on your needs, you -may wish to increase the page size, and also adjust PAIRMAX -(the maximum size of a key/value pair allowed: should always - - - - - - - - - - - 5 - - - -be at least three words smaller than PBLKSIZ.) accordingly. -The system-wide version of the library should probably be -configured with 1024 (distribution default), as this appears -to be sufficient for most common uses of sdbm. - -Portability - - This package has been tested in many different UN*Xes -even including minix, and appears to be reasonably portable. -This does not mean it will port easily to non-UN*X systems. - -Notes and Miscellaneous - - The sdbm is not a very complicated package, at least -not after you familiarize yourself with the literature on -external hashing. There are other interesting algorithms in -existence that ensure (approximately) single-read access to -a data value associated with any key. These are directory- -less schemes such as linear hashing [Lit80] (+ Larson varia- -tions), spiral storage [Mar79] or directory schemes such as -extensible hashing [Fag79] by Fagin et al. I do hope these -sources provide a reasonable playground for experimentation -with other algorithms. See the June 1988 issue of ACM Com- -puting Surveys [Enb88] for an excellent overview of the -field. - -References - - -[Lar78] - P.-A. Larson, ``Dynamic Hashing'', BIT, vol. 18, pp. - 184-201, 1978. - -[Tho90] - Ken Thompson, private communication, Nov. 1990 - -[Lit80] - W. Litwin, `` Linear Hashing: A new tool for file and - table addressing'', Proceedings of the 6th Conference on - Very Large Dabatases (Montreal), pp. 212-223, Very - Large Database Foundation, Saratoga, Calif., 1980. - -[Fag79] - R. Fagin, J. Nievergelt, N. Pippinger, and H. R. - Strong, ``Extendible Hashing - A Fast Access Method for - Dynamic Files'', ACM Trans. Database Syst., vol. 4, - no.3, pp. 315-344, Sept. 1979. - -[Wal84] - Rich Wales, ``Discussion of "dbm" data base system'', - USENET newsgroup unix.wizards, Jan. 1984. - -[Tor87] - Chris Torek, ``Re: dbm.a and ndbm.a archives'', - - - - - - - - - - - 6 - - - - USENET newsgroup comp.unix, 1987. - -[Mar79] - G. N. Martin, ``Spiral Storage: Incrementally Augment- - able Hash Addressed Storage'', Technical Report #27, - University of Varwick, Coventry, U.K., 1979. - -[Enb88] - R. J. Enbody and H. C. Du, ``Dynamic Hashing - Schemes'',ACM Computing Surveys, vol. 20, no. 2, pp. - 85-113, June 1988. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -Nru acm-5.0/dis/sdbm/readme.ms acm-6.0+20200416/dis/sdbm/readme.ms --- acm-5.0/dis/sdbm/readme.ms 1998-05-12 03:59:04.000000000 +0000 +++ acm-6.0+20200416/dis/sdbm/readme.ms 1970-01-01 00:00:00.000000000 +0000 @@ -1,353 +0,0 @@ -.\" tbl | readme.ms | [tn]roff -ms | ... -.\" note the "C" (courier) and "CB" fonts: you will probably have to -.\" change these. -.\" $Id: readme.ms,v 1.2 1998/05/12 03:59:04 riley Exp $ - -.de P1 -.br -.nr dT 4 -.nf -.ft C -.sp .5 -.nr t \\n(dT*\\w'x'u -.ta 1u*\\ntu 2u*\\ntu 3u*\\ntu 4u*\\ntu 5u*\\ntu 6u*\\ntu 7u*\\ntu 8u*\\ntu 9u*\\ntu 10u*\\ntu 11u*\\ntu 12u*\\ntu 13u*\\ntu 14u*\\ntu -.. -.de P2 -.br -.ft 1 -.br -.sp .5 -.br -.fi -.. -.\" CW uses the typewriter/courier font. -.de CW -\fC\\$1\\fP\\$2 -.. - -.\" Footnote numbering [by Henry Spencer] -.\" \*f for a footnote number.. -.\" .FS -.\" \*F -.\" .FE -.\" -.ds f \\u\\s-2\\n+f\\s+2\\d -.nr f 0 1 -.ds F \\n+F. -.nr F 0 1 - -.ND -.LP -.TL -\fIsdbm\fP \(em Substitute DBM -.br -or -.br -Berkeley \fIndbm\fP for Every UN*X\** Made Simple -.AU -Ozan (oz) Yigit -.AI -The Guild of PD Software Toolmakers -Toronto - Canada -.sp -oz@nexus.yorku.ca -.LP -.FS -UN*X is not a trademark of any (dis)organization. -.FE -.sp 2 -\fIImplementation is the sincerest form of flattery. \(em L. Peter Deutsch\fP -.SH -A The Clone of the \fIndbm\fP library -.PP -The sources accompanying this notice \(em \fIsdbm\fP \(em constitute -the first public release (Dec. 1990) of a complete clone of -the Berkeley UN*X \fIndbm\fP library. The \fIsdbm\fP library is meant to -clone the proven functionality of \fIndbm\fP as closely as possible, -including a few improvements. It is practical, easy to understand, and -compatible. -The \fIsdbm\fP library is not derived from any licensed, proprietary or -copyrighted software. -.PP -The \fIsdbm\fP implementation is based on a 1978 algorithm -[Lar78] by P.-A. (Paul) Larson known as ``Dynamic Hashing''. -In the course of searching for a substitute for \fIndbm\fP, I -prototyped three different external-hashing algorithms [Lar78, Fag79, Lit80] -and ultimately chose Larson's algorithm as a basis of the \fIsdbm\fP -implementation. The Bell Labs -\fIdbm\fP (and therefore \fIndbm\fP) is based on an algorithm invented by -Ken Thompson, [Tho90, Tor87] and predates Larson's work. -.PP -The \fIsdbm\fR programming interface is totally compatible -with \fIndbm\fP and includes a slight improvement in database initialization. -It is also expected to be binary-compatible under most UN*X versions that -support the \fIndbm\fP library. -.PP -The \fIsdbm\fP implementation shares the shortcomings of the \fIndbm\fP -library, as a side effect of various simplifications to the original Larson -algorithm. It does produce \fIholes\fP in the page file as it writes -pages past the end of file. (Larson's paper include a clever solution to -this problem that is a result of using the hash value directly as a block -address.) On the other hand, extensive tests seem to indicate that \fIsdbm\fP -creates fewer holes in general, and the resulting pagefiles are -smaller. The \fIsdbm\fP implementation is also faster than \fIndbm\fP -in database creation. -Unlike the \fIndbm\fP, the \fIsdbm\fP -.CW store -operation will not ``wander away'' trying to split its -data pages to insert a datum that \fIcannot\fP (due to elaborate worst-case -situations) be inserted. (It will fail after a pre-defined number of attempts.) -.SH -Important Compatibility Warning -.PP -The \fIsdbm\fP and \fIndbm\fP -libraries \fIcannot\fP share databases: one cannot read the (dir/pag) -database created by the other. This is due to the differences -between the \fIndbm\fP and \fIsdbm\fP algorithms\**, -.FS -Torek's discussion [Tor87] -indicates that \fIdbm/ndbm\fP implementations use the hash -value to traverse the radix trie differently than \fIsdbm\fP -and as a result, the page indexes are generated in \fIdifferent\fP order. -For more information, send e-mail to the author. -.FE -and the hash functions -used. -It is easy to convert between the \fIdbm/ndbm\fP databases and \fIsdbm\fP -by ignoring the index completely: see -.CW dbd , -.CW dbu -etc. -.R -.LP -.SH -Notice of Intellectual Property -.LP -\fIThe entire\fP sdbm \fIlibrary package, as authored by me,\fP Ozan S. Yigit, -\fIis hereby placed in the public domain.\fP As such, the author is not -responsible for the consequences of use of this software, no matter how -awful, even if they arise from defects in it. There is no expressed or -implied warranty for the \fIsdbm\fP library. -.PP -Since the \fIsdbm\fP -library package is in the public domain, this \fIoriginal\fP -release or any additional public-domain releases of the modified original -cannot possibly (by definition) be withheld from you. Also by definition, -You (singular) have all the rights to this code (including the right to -sell without permission, the right to hoard\** -.FS -You cannot really hoard something that is available to the public at -large, but try if it makes you feel any better. -.FE -and the right to do other icky things as -you see fit) but those rights are also granted to everyone else. -.PP -Please note that all previous distributions of this software contained -a copyright (which is now dropped) to protect its -origins and its current public domain status against any possible claims -and/or challenges. -.SH -Acknowledgments -.PP -Many people have been very helpful and supportive. A partial list would -necessarily include Rayan Zacherissen (who contributed the man page, -and also hacked a MMAP version of \fIsdbm\fP), -Arnold Robbins, Chris Lewis, -Bill Davidsen, Henry Spencer, Geoff Collyer, Rich Salz (who got me started -in the first place), Johannes Ruschein -(who did the minix port) and David Tilbrook. I thank you all. -.SH -Distribution Manifest and Notes -.LP -This distribution of \fIsdbm\fP includes (at least) the following: -.P1 - CHANGES change log - README this file. - biblio a small bibliography on external hashing - dba.c a crude (n/s)dbm page file analyzer - dbd.c a crude (n/s)dbm page file dumper (for conversion) - dbe.1 man page for dbe.c - dbe.c Janick's database editor - dbm.c a dbm library emulation wrapper for ndbm/sdbm - dbm.h header file for the above - dbu.c a crude db management utility - hash.c hashing function - makefile guess. - pair.c page-level routines (posted earlier) - pair.h header file for the above - readme.ms troff source for the README file - sdbm.3 man page - sdbm.c the real thing - sdbm.h header file for the above - tune.h place for tuning & portability thingies - util.c miscellaneous -.P2 -.PP -.CW dbu -is a simple database manipulation program\** that tries to look -.FS -The -.CW dbd , -.CW dba , -.CW dbu -utilities are quick hacks and are not fit for production use. They were -developed late one night, just to test out \fIsdbm\fP, and convert some -databases. -.FE -like Bell Labs' -.CW cbt -utility. It is currently incomplete in functionality. -I use -.CW dbu -to test out the routines: it takes (from stdin) tab separated -key/value pairs for commands like -.CW build -or -.CW insert -or takes keys for -commands like -.CW delete -or -.CW look . -.P1 - dbu dbmfile -.P2 -.PP -.CW dba -is a crude analyzer of \fIdbm/sdbm/ndbm\fP -page files. It scans the entire -page file, reporting page level statistics, and totals at the end. -.PP -.CW dbd -is a crude dump program for \fIdbm/ndbm/sdbm\fP -databases. It ignores the -bitmap, and dumps the data pages in sequence. It can be used to create -input for the -.CW dbu -utility. -Note that -.CW dbd -will skip any NULLs in the key and data -fields, thus is unsuitable to convert some peculiar databases that -insist in including the terminating null. -.PP -I have also included a copy of the -.CW dbe -(\fIndbm\fP DataBase Editor) by Janick Bergeron [janick@bnr.ca] for -your pleasure. You may find it more useful than the little -.CW dbu -utility. -.PP -.CW dbm.[ch] -is a \fIdbm\fP library emulation on top of \fIndbm\fP -(and hence suitable for \fIsdbm\fP). Written by Robert Elz. -.PP -The \fIsdbm\fP -library has been around in beta test for quite a long time, and from whatever -little feedback I received (maybe no news is good news), I believe it has been -functioning without any significant problems. I would, of course, appreciate -all fixes and/or improvements. Portability enhancements would especially be -useful. -.SH -Implementation Issues -.PP -Hash functions: -The algorithm behind \fIsdbm\fP implementation needs a good bit-scrambling -hash function to be effective. I ran into a set of constants for a simple -hash function that seem to help \fIsdbm\fP perform better than \fIndbm\fP -for various inputs: -.P1 - /* - * polynomial conversion ignoring overflows - * 65599 nice. 65587 even better. - */ - long - dbm_hash(char *str, int len) { - register unsigned long n = 0; - - while (len--) - n = n * 65599 + *str++; - return n; - } -.P2 -.PP -There may be better hash functions for the purposes of dynamic hashing. -Try your favorite, and check the pagefile. If it contains too many pages -with too many holes, (in relation to this one for example) or if -\fIsdbm\fP -simply stops working (fails after -.CW SPLTMAX -attempts to split) when you feed your -NEWS -.CW history -file to it, you probably do not have a good hashing function. -If you do better (for different types of input), I would like to know -about the function you use. -.PP -Block sizes: It seems (from various tests on a few machines) that a page -file block size -.CW PBLKSIZ -of 1024 is by far the best for performance, but -this also happens to limit the size of a key/value pair. Depending on your -needs, you may wish to increase the page size, and also adjust -.CW PAIRMAX -(the maximum size of a key/value pair allowed: should always be at least -three words smaller than -.CW PBLKSIZ .) -accordingly. The system-wide version of the library -should probably be -configured with 1024 (distribution default), as this appears to be sufficient -for most common uses of \fIsdbm\fP. -.SH -Portability -.PP -This package has been tested in many different UN*Xes even including minix, -and appears to be reasonably portable. This does not mean it will port -easily to non-UN*X systems. -.SH -Notes and Miscellaneous -.PP -The \fIsdbm\fP is not a very complicated package, at least not after you -familiarize yourself with the literature on external hashing. There are -other interesting algorithms in existence that ensure (approximately) -single-read access to a data value associated with any key. These are -directory-less schemes such as \fIlinear hashing\fP [Lit80] (+ Larson -variations), \fIspiral storage\fP [Mar79] or directory schemes such as -\fIextensible hashing\fP [Fag79] by Fagin et al. I do hope these sources -provide a reasonable playground for experimentation with other algorithms. -See the June 1988 issue of ACM Computing Surveys [Enb88] for an -excellent overview of the field. -.PG -.SH -References -.LP -.IP [Lar78] 4m -P.-A. Larson, -``Dynamic Hashing'', \fIBIT\fP, vol. 18, pp. 184-201, 1978. -.IP [Tho90] 4m -Ken Thompson, \fIprivate communication\fP, Nov. 1990 -.IP [Lit80] 4m -W. Litwin, -`` Linear Hashing: A new tool for file and table addressing'', -\fIProceedings of the 6th Conference on Very Large Dabatases (Montreal)\fP, -pp. 212-223, Very Large Database Foundation, Saratoga, Calif., 1980. -.IP [Fag79] 4m -R. Fagin, J. Nievergelt, N. Pippinger, and H. R. Strong, -``Extendible Hashing - A Fast Access Method for Dynamic Files'', -\fIACM Trans. Database Syst.\fP, vol. 4, no.3, pp. 315-344, Sept. 1979. -.IP [Wal84] 4m -Rich Wales, -``Discussion of "dbm" data base system'', \fIUSENET newsgroup unix.wizards\fP, -Jan. 1984. -.IP [Tor87] 4m -Chris Torek, -``Re: dbm.a and ndbm.a archives'', \fIUSENET newsgroup comp.unix\fP, -1987. -.IP [Mar79] 4m -G. N. Martin, -``Spiral Storage: Incrementally Augmentable Hash Addressed Storage'', -\fITechnical Report #27\fP, University of Varwick, Coventry, U.K., 1979. -.IP [Enb88] 4m -R. J. Enbody and H. C. Du, -``Dynamic Hashing Schemes'',\fIACM Computing Surveys\fP, -vol. 20, no. 2, pp. 85-113, June 1988. diff -Nru acm-5.0/dis/sdbm/readme.ps acm-6.0+20200416/dis/sdbm/readme.ps --- acm-5.0/dis/sdbm/readme.ps 1998-05-12 03:59:04.000000000 +0000 +++ acm-6.0+20200416/dis/sdbm/readme.ps 1970-01-01 00:00:00.000000000 +0000 @@ -1,2225 +0,0 @@ -%!PS-Adobe-1.0 -%%Creator: yetti:oz (Ozan Yigit) -%%Title: stdin (ditroff) -%%CreationDate: Thu Dec 13 15:56:08 1990 -%%EndComments -% lib/psdit.pro -- prolog for psdit (ditroff) files -% Copyright (c) 1984, 1985 Adobe Systems Incorporated. All Rights Reserved. -% last edit: shore Sat Nov 23 20:28:03 1985 -% RCSID: $Header: /usr/home/riley/cvsroot/websim/acm/dis/sdbm/readme.ps,v 1.2 1998/05/12 03:59:04 riley Exp $ - -/$DITroff 140 dict def $DITroff begin -/fontnum 1 def /fontsize 10 def /fontheight 10 def /fontslant 0 def -/xi {0 72 11 mul translate 72 resolution div dup neg scale 0 0 moveto - /fontnum 1 def /fontsize 10 def /fontheight 10 def /fontslant 0 def F - /pagesave save def}def -/PB{save /psv exch def currentpoint translate - resolution 72 div dup neg scale 0 0 moveto}def -/PE{psv restore}def -/arctoobig 90 def /arctoosmall .05 def -/m1 matrix def /m2 matrix def /m3 matrix def /oldmat matrix def -/tan{dup sin exch cos div}def -/point{resolution 72 div mul}def -/dround {transform round exch round exch itransform}def -/xT{/devname exch def}def -/xr{/mh exch def /my exch def /resolution exch def}def -/xp{}def -/xs{docsave restore end}def -/xt{}def -/xf{/fontname exch def /slotno exch def fontnames slotno get fontname eq not - {fonts slotno fontname findfont put fontnames slotno fontname put}if}def -/xH{/fontheight exch def F}def -/xS{/fontslant exch def F}def -/s{/fontsize exch def /fontheight fontsize def F}def -/f{/fontnum exch def F}def -/F{fontheight 0 le {/fontheight fontsize def}if - fonts fontnum get fontsize point 0 0 fontheight point neg 0 0 m1 astore - fontslant 0 ne{1 0 fontslant tan 1 0 0 m2 astore m3 concatmatrix}if - makefont setfont .04 fontsize point mul 0 dround pop setlinewidth}def -/X{exch currentpoint exch pop moveto show}def -/N{3 1 roll moveto show}def -/Y{exch currentpoint pop exch moveto show}def -/S{show}def -/ditpush{}def/ditpop{}def -/AX{3 -1 roll currentpoint exch pop moveto 0 exch ashow}def -/AN{4 2 roll moveto 0 exch ashow}def -/AY{3 -1 roll currentpoint pop exch moveto 0 exch ashow}def -/AS{0 exch ashow}def -/MX{currentpoint exch pop moveto}def -/MY{currentpoint pop exch moveto}def -/MXY{moveto}def -/cb{pop}def % action on unknown char -- nothing for now -/n{}def/w{}def -/p{pop showpage pagesave restore /pagesave save def}def -/abspoint{currentpoint exch pop add exch currentpoint pop add exch}def -/distance{dup mul exch dup mul add sqrt}def -/dstroke{currentpoint stroke moveto}def -/Dl{2 copy gsave rlineto stroke grestore rmoveto}def -/arcellipse{/diamv exch def /diamh exch def oldmat currentmatrix pop - currentpoint translate 1 diamv diamh div scale /rad diamh 2 div def - currentpoint exch rad add exch rad -180 180 arc oldmat setmatrix}def -/Dc{dup arcellipse dstroke}def -/De{arcellipse dstroke}def -/Da{/endv exch def /endh exch def /centerv exch def /centerh exch def - /cradius centerv centerv mul centerh centerh mul add sqrt def - /eradius endv endv mul endh endh mul add sqrt def - /endang endv endh atan def - /startang centerv neg centerh neg atan def - /sweep startang endang sub dup 0 lt{360 add}if def - sweep arctoobig gt - {/midang startang sweep 2 div sub def /midrad cradius eradius add 2 div def - /midh midang cos midrad mul def /midv midang sin midrad mul def - midh neg midv neg endh endv centerh centerv midh midv Da - currentpoint moveto Da} - {sweep arctoosmall ge - {/controldelt 1 sweep 2 div cos sub 3 sweep 2 div sin mul div 4 mul def - centerv neg controldelt mul centerh controldelt mul - endv neg controldelt mul centerh add endh add - endh controldelt mul centerv add endv add - centerh endh add centerv endv add rcurveto dstroke} - {centerh endh add centerv endv add rlineto dstroke}ifelse}ifelse}def - -/Barray 200 array def % 200 values in a wiggle -/D~{mark}def -/D~~{counttomark Barray exch 0 exch getinterval astore /Bcontrol exch def pop - /Blen Bcontrol length def Blen 4 ge Blen 2 mod 0 eq and - {Bcontrol 0 get Bcontrol 1 get abspoint /Ycont exch def /Xcont exch def - Bcontrol 0 2 copy get 2 mul put Bcontrol 1 2 copy get 2 mul put - Bcontrol Blen 2 sub 2 copy get 2 mul put - Bcontrol Blen 1 sub 2 copy get 2 mul put - /Ybi /Xbi currentpoint 3 1 roll def def 0 2 Blen 4 sub - {/i exch def - Bcontrol i get 3 div Bcontrol i 1 add get 3 div - Bcontrol i get 3 mul Bcontrol i 2 add get add 6 div - Bcontrol i 1 add get 3 mul Bcontrol i 3 add get add 6 div - /Xbi Xcont Bcontrol i 2 add get 2 div add def - /Ybi Ycont Bcontrol i 3 add get 2 div add def - /Xcont Xcont Bcontrol i 2 add get add def - /Ycont Ycont Bcontrol i 3 add get add def - Xbi currentpoint pop sub Ybi currentpoint exch pop sub rcurveto - }for dstroke}if}def -end -/ditstart{$DITroff begin - /nfonts 60 def % NFONTS makedev/ditroff dependent! - /fonts[nfonts{0}repeat]def - /fontnames[nfonts{()}repeat]def -/docsave save def -}def - -% character outcalls -/oc {/pswid exch def /cc exch def /name exch def - /ditwid pswid fontsize mul resolution mul 72000 div def - /ditsiz fontsize resolution mul 72 div def - ocprocs name known{ocprocs name get exec}{name cb} - ifelse}def -/fractm [.65 0 0 .6 0 0] def -/fraction - {/fden exch def /fnum exch def gsave /cf currentfont def - cf fractm makefont setfont 0 .3 dm 2 copy neg rmoveto - fnum show rmoveto currentfont cf setfont(\244)show setfont fden show - grestore ditwid 0 rmoveto} def -/oce {grestore ditwid 0 rmoveto}def -/dm {ditsiz mul}def -/ocprocs 50 dict def ocprocs begin -(14){(1)(4)fraction}def -(12){(1)(2)fraction}def -(34){(3)(4)fraction}def -(13){(1)(3)fraction}def -(23){(2)(3)fraction}def -(18){(1)(8)fraction}def -(38){(3)(8)fraction}def -(58){(5)(8)fraction}def -(78){(7)(8)fraction}def -(sr){gsave 0 .06 dm rmoveto(\326)show oce}def -(is){gsave 0 .15 dm rmoveto(\362)show oce}def -(->){gsave 0 .02 dm rmoveto(\256)show oce}def -(<-){gsave 0 .02 dm rmoveto(\254)show oce}def -(==){gsave 0 .05 dm rmoveto(\272)show oce}def -end - -% an attempt at a PostScript FONT to implement ditroff special chars -% this will enable us to -% cache the little buggers -% generate faster, more compact PS out of psdit -% confuse everyone (including myself)! -50 dict dup begin -/FontType 3 def -/FontName /DIThacks def -/FontMatrix [.001 0 0 .001 0 0] def -/FontBBox [-260 -260 900 900] def% a lie but ... -/Encoding 256 array def -0 1 255{Encoding exch /.notdef put}for -Encoding - dup 8#040/space put %space - dup 8#110/rc put %right ceil - dup 8#111/lt put %left top curl - dup 8#112/bv put %bold vert - dup 8#113/lk put %left mid curl - dup 8#114/lb put %left bot curl - dup 8#115/rt put %right top curl - dup 8#116/rk put %right mid curl - dup 8#117/rb put %right bot curl - dup 8#120/rf put %right floor - dup 8#121/lf put %left floor - dup 8#122/lc put %left ceil - dup 8#140/sq put %square - dup 8#141/bx put %box - dup 8#142/ci put %circle - dup 8#143/br put %box rule - dup 8#144/rn put %root extender - dup 8#145/vr put %vertical rule - dup 8#146/ob put %outline bullet - dup 8#147/bu put %bullet - dup 8#150/ru put %rule - dup 8#151/ul put %underline - pop -/DITfd 100 dict def -/BuildChar{0 begin - /cc exch def /fd exch def - /charname fd /Encoding get cc get def - /charwid fd /Metrics get charname get def - /charproc fd /CharProcs get charname get def - charwid 0 fd /FontBBox get aload pop setcachedevice - 2 setlinejoin 40 setlinewidth - newpath 0 0 moveto gsave charproc grestore - end}def -/BuildChar load 0 DITfd put -%/UniqueID 5 def -/CharProcs 50 dict def -CharProcs begin -/space{}def -/.notdef{}def -/ru{500 0 rls}def -/rn{0 840 moveto 500 0 rls}def -/vr{0 800 moveto 0 -770 rls}def -/bv{0 800 moveto 0 -1000 rls}def -/br{0 750 moveto 0 -1000 rls}def -/ul{0 -140 moveto 500 0 rls}def -/ob{200 250 rmoveto currentpoint newpath 200 0 360 arc closepath stroke}def -/bu{200 250 rmoveto currentpoint newpath 200 0 360 arc closepath fill}def -/sq{80 0 rmoveto currentpoint dround newpath moveto - 640 0 rlineto 0 640 rlineto -640 0 rlineto closepath stroke}def -/bx{80 0 rmoveto currentpoint dround newpath moveto - 640 0 rlineto 0 640 rlineto -640 0 rlineto closepath fill}def -/ci{500 360 rmoveto currentpoint newpath 333 0 360 arc - 50 setlinewidth stroke}def - -/lt{0 -200 moveto 0 550 rlineto currx 800 2cx s4 add exch s4 a4p stroke}def -/lb{0 800 moveto 0 -550 rlineto currx -200 2cx s4 add exch s4 a4p stroke}def -/rt{0 -200 moveto 0 550 rlineto currx 800 2cx s4 sub exch s4 a4p stroke}def -/rb{0 800 moveto 0 -500 rlineto currx -200 2cx s4 sub exch s4 a4p stroke}def -/lk{0 800 moveto 0 300 -300 300 s4 arcto pop pop 1000 sub - 0 300 4 2 roll s4 a4p 0 -200 lineto stroke}def -/rk{0 800 moveto 0 300 s2 300 s4 arcto pop pop 1000 sub - 0 300 4 2 roll s4 a4p 0 -200 lineto stroke}def -/lf{0 800 moveto 0 -1000 rlineto s4 0 rls}def -/rf{0 800 moveto 0 -1000 rlineto s4 neg 0 rls}def -/lc{0 -200 moveto 0 1000 rlineto s4 0 rls}def -/rc{0 -200 moveto 0 1000 rlineto s4 neg 0 rls}def -end - -/Metrics 50 dict def Metrics begin -/.notdef 0 def -/space 500 def -/ru 500 def -/br 0 def -/lt 416 def -/lb 416 def -/rt 416 def -/rb 416 def -/lk 416 def -/rk 416 def -/rc 416 def -/lc 416 def -/rf 416 def -/lf 416 def -/bv 416 def -/ob 350 def -/bu 350 def -/ci 750 def -/bx 750 def -/sq 750 def -/rn 500 def -/ul 500 def -/vr 0 def -end - -DITfd begin -/s2 500 def /s4 250 def /s3 333 def -/a4p{arcto pop pop pop pop}def -/2cx{2 copy exch}def -/rls{rlineto stroke}def -/currx{currentpoint pop}def -/dround{transform round exch round exch itransform} def -end -end -/DIThacks exch definefont pop -ditstart -(psc)xT -576 1 1 xr -1(Times-Roman)xf 1 f -2(Times-Italic)xf 2 f -3(Times-Bold)xf 3 f -4(Times-BoldItalic)xf 4 f -5(Helvetica)xf 5 f -6(Helvetica-Bold)xf 6 f -7(Courier)xf 7 f -8(Courier-Bold)xf 8 f -9(Symbol)xf 9 f -10(DIThacks)xf 10 f -10 s -1 f -xi -%%EndProlog - -%%Page: 1 1 -10 s 0 xH 0 xS 1 f -8 s -2 f -12 s -1778 672(sdbm)N -3 f -2004(\320)X -2124(Substitute)X -2563(DBM)X -2237 768(or)N -1331 864(Berkeley)N -2 f -1719(ndbm)X -3 f -1956(for)X -2103(Every)X -2373(UN*X)X -1 f -10 s -2628 832(1)N -3 f -12 s -2692 864(Made)N -2951(Simple)X -2 f -10 s -2041 1056(Ozan)N -2230(\(oz\))X -2375(Yigit)X -1 f -1658 1200(The)N -1803(Guild)X -2005(of)X -2092(PD)X -2214(Software)X -2524(Toolmakers)X -2000 1296(Toronto)N -2278(-)X -2325(Canada)X -1965 1488(oz@nexus.yorku.ca)N -2 f -555 1804(Implementation)N -1078(is)X -1151(the)X -1269(sincerest)X -1574(form)X -1745(of)X -1827(\257attery.)X -2094(\320)X -2185(L.)X -2269(Peter)X -2463(Deutsch)X -3 f -555 1996(A)N -633(The)X -786(Clone)X -1006(of)X -1093(the)X -2 f -1220(ndbm)X -3 f -1418(library)X -1 f -755 2120(The)N -903(sources)X -1167(accompanying)X -1658(this)X -1796(notice)X -2015(\320)X -2 f -2118(sdbm)X -1 f -2309(\320)X -2411(constitute)X -2744(the)X -2864(\256rst)X -3010(public)X -3232(release)X -3478(\(Dec.)X -3677(1990\))X -3886(of)X -3975(a)X -555 2216(complete)N -874(clone)X -1073(of)X -1165(the)X -1288(Berkeley)X -1603(UN*X)X -2 f -1842(ndbm)X -1 f -2045(library.)X -2304(The)X -2 f -2454(sdbm)X -1 f -2648(library)X -2887(is)X -2965(meant)X -3186(to)X -3273(clone)X -3472(the)X -3594(proven)X -3841(func-)X -555 2312(tionality)N -846(of)X -2 f -938(ndbm)X -1 f -1141(as)X -1233(closely)X -1485(as)X -1576(possible,)X -1882(including)X -2208(a)X -2268(few)X -2413(improvements.)X -2915(It)X -2988(is)X -3065(practical,)X -3386(easy)X -3553(to)X -3639(understand,)X -555 2408(and)N -691(compatible.)X -1107(The)X -2 f -1252(sdbm)X -1 f -1441(library)X -1675(is)X -1748(not)X -1870(derived)X -2131(from)X -2307(any)X -2443(licensed,)X -2746(proprietary)X -3123(or)X -3210(copyrighted)X -3613(software.)X -755 2532(The)N -2 f -910(sdbm)X -1 f -1109(implementation)X -1641(is)X -1723(based)X -1935(on)X -2044(a)X -2109(1978)X -2298(algorithm)X -2638([Lar78])X -2913(by)X -3022(P.-A.)X -3220(\(Paul\))X -3445(Larson)X -3697(known)X -3944(as)X -555 2628(``Dynamic)N -934(Hashing''.)X -1326(In)X -1424(the)X -1553(course)X -1794(of)X -1892(searching)X -2231(for)X -2355(a)X -2421(substitute)X -2757(for)X -2 f -2881(ndbm)X -1 f -3059(,)X -3109(I)X -3166(prototyped)X -3543(three)X -3734(different)X -555 2724(external-hashing)N -1119(algorithms)X -1490([Lar78,)X -1758(Fag79,)X -2007(Lit80])X -2236(and)X -2381(ultimately)X -2734(chose)X -2946(Larson's)X -3256(algorithm)X -3596(as)X -3692(a)X -3756(basis)X -3944(of)X -555 2820(the)N -2 f -680(sdbm)X -1 f -875(implementation.)X -1423(The)X -1574(Bell)X -1733(Labs)X -2 f -1915(dbm)X -1 f -2079(\(and)X -2248(therefore)X -2 f -2565(ndbm)X -1 f -2743(\))X -2796(is)X -2875(based)X -3084(on)X -3190(an)X -3292(algorithm)X -3629(invented)X -3931(by)X -555 2916(Ken)N -709(Thompson,)X -1091([Tho90,)X -1367(Tor87])X -1610(and)X -1746(predates)X -2034(Larson's)X -2335(work.)X -755 3040(The)N -2 f -903(sdbm)X -1 f -1095(programming)X -1553(interface)X -1857(is)X -1932(totally)X -2158(compatible)X -2536(with)X -2 f -2700(ndbm)X -1 f -2900(and)X -3038(includes)X -3327(a)X -3385(slight)X -3584(improvement)X -555 3136(in)N -641(database)X -942(initialization.)X -1410(It)X -1483(is)X -1560(also)X -1713(expected)X -2023(to)X -2109(be)X -2208(binary-compatible)X -2819(under)X -3025(most)X -3203(UN*X)X -3440(versions)X -3730(that)X -3873(sup-)X -555 3232(port)N -704(the)X -2 f -822(ndbm)X -1 f -1020(library.)X -755 3356(The)N -2 f -909(sdbm)X -1 f -1107(implementation)X -1638(shares)X -1868(the)X -1995(shortcomings)X -2455(of)X -2551(the)X -2 f -2678(ndbm)X -1 f -2885(library,)X -3148(as)X -3244(a)X -3309(side)X -3467(effect)X -3680(of)X -3775(various)X -555 3452(simpli\256cations)N -1046(to)X -1129(the)X -1248(original)X -1518(Larson)X -1762(algorithm.)X -2114(It)X -2183(does)X -2350(produce)X -2 f -2629(holes)X -1 f -2818(in)X -2900(the)X -3018(page)X -3190(\256le)X -3312(as)X -3399(it)X -3463(writes)X -3679(pages)X -3882(past)X -555 3548(the)N -680(end)X -823(of)X -917(\256le.)X -1066(\(Larson's)X -1400(paper)X -1605(include)X -1867(a)X -1929(clever)X -2152(solution)X -2435(to)X -2523(this)X -2664(problem)X -2957(that)X -3103(is)X -3182(a)X -3244(result)X -3448(of)X -3541(using)X -3740(the)X -3864(hash)X -555 3644(value)N -758(directly)X -1032(as)X -1128(a)X -1193(block)X -1400(address.\))X -1717(On)X -1844(the)X -1971(other)X -2165(hand,)X -2370(extensive)X -2702(tests)X -2873(seem)X -3067(to)X -3158(indicate)X -3441(that)X -2 f -3590(sdbm)X -1 f -3787(creates)X -555 3740(fewer)N -762(holes)X -954(in)X -1039(general,)X -1318(and)X -1456(the)X -1576(resulting)X -1878(page\256les)X -2185(are)X -2306(smaller.)X -2584(The)X -2 f -2731(sdbm)X -1 f -2922(implementation)X -3446(is)X -3521(also)X -3672(faster)X -3873(than)X -2 f -555 3836(ndbm)N -1 f -757(in)X -843(database)X -1144(creation.)X -1467(Unlike)X -1709(the)X -2 f -1831(ndbm)X -1 f -2009(,)X -2053(the)X -2 f -2175(sdbm)X -7 f -2396(store)X -1 f -2660(operation)X -2987(will)X -3134(not)X -3259(``wander)X -3573(away'')X -3820(trying)X -555 3932(to)N -642(split)X -804(its)X -904(data)X -1063(pages)X -1271(to)X -1358(insert)X -1561(a)X -1622(datum)X -1847(that)X -2 f -1992(cannot)X -1 f -2235(\(due)X -2403(to)X -2490(elaborate)X -2810(worst-case)X -3179(situations\))X -3537(be)X -3637(inserted.)X -3935(\(It)X -555 4028(will)N -699(fail)X -826(after)X -994(a)X -1050(pre-de\256ned)X -1436(number)X -1701(of)X -1788(attempts.\))X -3 f -555 4220(Important)N -931(Compatibility)X -1426(Warning)X -1 f -755 4344(The)N -2 f -904(sdbm)X -1 f -1097(and)X -2 f -1237(ndbm)X -1 f -1439(libraries)X -2 f -1726(cannot)X -1 f -1968(share)X -2162(databases:)X -2515(one)X -2654(cannot)X -2891(read)X -3053(the)X -3174(\(dir/pag\))X -3478(database)X -3778(created)X -555 4440(by)N -657(the)X -777(other.)X -984(This)X -1148(is)X -1222(due)X -1359(to)X -1442(the)X -1561(differences)X -1940(between)X -2229(the)X -2 f -2348(ndbm)X -1 f -2547(and)X -2 f -2684(sdbm)X -1 f -2874(algorithms)X -8 s -3216 4415(2)N -10 s -4440(,)Y -3289(and)X -3426(the)X -3545(hash)X -3713(functions)X -555 4536(used.)N -769(It)X -845(is)X -925(easy)X -1094(to)X -1182(convert)X -1449(between)X -1743(the)X -2 f -1867(dbm/ndbm)X -1 f -2231(databases)X -2565(and)X -2 f -2707(sdbm)X -1 f -2902(by)X -3008(ignoring)X -3305(the)X -3429(index)X -3633(completely:)X -555 4632(see)N -7 f -706(dbd)X -1 f -(,)S -7 f -918(dbu)X -1 f -1082(etc.)X -3 f -555 4852(Notice)N -794(of)X -881(Intellectual)X -1288(Property)X -2 f -555 4976(The)N -696(entire)X -1 f -904(sdbm)X -2 f -1118(library)X -1361(package,)X -1670(as)X -1762(authored)X -2072(by)X -2169(me,)X -1 f -2304(Ozan)X -2495(S.)X -2580(Yigit,)X -2 f -2785(is)X -2858(hereby)X -3097(placed)X -3331(in)X -3413(the)X -3531(public)X -3751(domain.)X -1 f -555 5072(As)N -670(such,)X -863(the)X -987(author)X -1218(is)X -1297(not)X -1425(responsible)X -1816(for)X -1936(the)X -2060(consequences)X -2528(of)X -2621(use)X -2754(of)X -2847(this)X -2988(software,)X -3310(no)X -3415(matter)X -3645(how)X -3808(awful,)X -555 5168(even)N -727(if)X -796(they)X -954(arise)X -1126(from)X -1302(defects)X -1550(in)X -1632(it.)X -1716(There)X -1924(is)X -1997(no)X -2097(expressed)X -2434(or)X -2521(implied)X -2785(warranty)X -3091(for)X -3205(the)X -2 f -3323(sdbm)X -1 f -3512(library.)X -8 s -10 f -555 5316(hhhhhhhhhhhhhhhhhh)N -6 s -1 f -635 5391(1)N -8 s -691 5410(UN*X)N -877(is)X -936(not)X -1034(a)X -1078(trademark)X -1352(of)X -1421(any)X -1529(\(dis\)organization.)X -6 s -635 5485(2)N -8 s -691 5504(Torek's)N -908(discussion)X -1194([Tor87])X -1411(indicates)X -1657(that)X -2 f -1772(dbm/ndbm)X -1 f -2061(implementations)X -2506(use)X -2609(the)X -2705(hash)X -2840(value)X -2996(to)X -3064(traverse)X -3283(the)X -3379(radix)X -3528(trie)X -3631(dif-)X -555 5584(ferently)N -772(than)X -2 f -901(sdbm)X -1 f -1055(and)X -1166(as)X -1238(a)X -1285(result,)X -1462(the)X -1559(page)X -1698(indexes)X -1912(are)X -2008(generated)X -2274(in)X -2 f -2343(different)X -1 f -2579(order.)X -2764(For)X -2872(more)X -3021(information,)X -3357(send)X -3492(e-mail)X -3673(to)X -555 5664(the)N -649(author.)X - -2 p -%%Page: 2 2 -8 s 0 xH 0 xS 1 f -10 s -2216 384(-)N -2263(2)X -2323(-)X -755 672(Since)N -971(the)X -2 f -1107(sdbm)X -1 f -1314(library)X -1566(package)X -1868(is)X -1959(in)X -2058(the)X -2193(public)X -2430(domain,)X -2727(this)X -2 f -2879(original)X -1 f -3173(release)X -3434(or)X -3538(any)X -3691(additional)X -555 768(public-domain)N -1045(releases)X -1323(of)X -1413(the)X -1534(modi\256ed)X -1841(original)X -2112(cannot)X -2348(possibly)X -2636(\(by)X -2765(de\256nition\))X -3120(be)X -3218(withheld)X -3520(from)X -3698(you.)X -3860(Also)X -555 864(by)N -659(de\256nition,)X -1009(You)X -1170(\(singular\))X -1505(have)X -1680(all)X -1783(the)X -1904(rights)X -2109(to)X -2194(this)X -2332(code)X -2507(\(including)X -2859(the)X -2980(right)X -3154(to)X -3239(sell)X -3373(without)X -3640(permission,)X -555 960(the)N -679(right)X -856(to)X -944(hoard)X -8 s -1127 935(3)N -10 s -1185 960(and)N -1327(the)X -1451(right)X -1628(to)X -1716(do)X -1821(other)X -2011(icky)X -2174(things)X -2394(as)X -2486(you)X -2631(see)X -2759(\256t\))X -2877(but)X -3004(those)X -3198(rights)X -3405(are)X -3529(also)X -3683(granted)X -3949(to)X -555 1056(everyone)N -870(else.)X -755 1180(Please)N -997(note)X -1172(that)X -1329(all)X -1446(previous)X -1759(distributions)X -2195(of)X -2298(this)X -2449(software)X -2762(contained)X -3110(a)X -3182(copyright)X -3525(\(which)X -3784(is)X -3873(now)X -555 1276(dropped\))N -868(to)X -953(protect)X -1199(its)X -1297(origins)X -1542(and)X -1681(its)X -1779(current)X -2030(public)X -2253(domain)X -2516(status)X -2721(against)X -2970(any)X -3108(possible)X -3392(claims)X -3623(and/or)X -3850(chal-)X -555 1372(lenges.)N -3 f -555 1564(Acknowledgments)N -1 f -755 1688(Many)N -966(people)X -1204(have)X -1380(been)X -1556(very)X -1723(helpful)X -1974(and)X -2114(supportive.)X -2515(A)X -2596(partial)X -2824(list)X -2944(would)X -3167(necessarily)X -3547(include)X -3806(Rayan)X -555 1784(Zacherissen)N -963(\(who)X -1152(contributed)X -1541(the)X -1663(man)X -1824(page,)X -2019(and)X -2158(also)X -2310(hacked)X -2561(a)X -2620(MMAP)X -2887(version)X -3146(of)X -2 f -3236(sdbm)X -1 f -3405(\),)X -3475(Arnold)X -3725(Robbins,)X -555 1880(Chris)N -763(Lewis,)X -1013(Bill)X -1166(Davidsen,)X -1523(Henry)X -1758(Spencer,)X -2071(Geoff)X -2293(Collyer,)X -2587(Rich)X -2772(Salz)X -2944(\(who)X -3143(got)X -3279(me)X -3411(started)X -3659(in)X -3755(the)X -3887(\256rst)X -555 1976(place\),)N -792(Johannes)X -1106(Ruschein)X -1424(\(who)X -1609(did)X -1731(the)X -1849(minix)X -2055(port\))X -2231(and)X -2367(David)X -2583(Tilbrook.)X -2903(I)X -2950(thank)X -3148(you)X -3288(all.)X -3 f -555 2168(Distribution)N -992(Manifest)X -1315(and)X -1463(Notes)X -1 f -555 2292(This)N -717(distribution)X -1105(of)X -2 f -1192(sdbm)X -1 f -1381(includes)X -1668(\(at)X -1773(least\))X -1967(the)X -2085(following:)X -7 f -747 2436(CHANGES)N -1323(change)X -1659(log)X -747 2532(README)N -1323(this)X -1563(file.)X -747 2628(biblio)N -1323(a)X -1419(small)X -1707(bibliography)X -2331(on)X -2475(external)X -2907(hashing)X -747 2724(dba.c)N -1323(a)X -1419(crude)X -1707(\(n/s\)dbm)X -2139(page)X -2379(file)X -2619(analyzer)X -747 2820(dbd.c)N -1323(a)X -1419(crude)X -1707(\(n/s\)dbm)X -2139(page)X -2379(file)X -2619(dumper)X -2955(\(for)X -3195(conversion\))X -747 2916(dbe.1)N -1323(man)X -1515(page)X -1755(for)X -1947(dbe.c)X -747 3012(dbe.c)N -1323(Janick's)X -1755(database)X -2187(editor)X -747 3108(dbm.c)N -1323(a)X -1419(dbm)X -1611(library)X -1995(emulation)X -2475(wrapper)X -2859(for)X -3051(ndbm/sdbm)X -747 3204(dbm.h)N -1323(header)X -1659(file)X -1899(for)X -2091(the)X -2283(above)X -747 3300(dbu.c)N -1323(a)X -1419(crude)X -1707(db)X -1851(management)X -2379(utility)X -747 3396(hash.c)N -1323(hashing)X -1707(function)X -747 3492(makefile)N -1323(guess.)X -747 3588(pair.c)N -1323(page-level)X -1851(routines)X -2283(\(posted)X -2667(earlier\))X -747 3684(pair.h)N -1323(header)X -1659(file)X -1899(for)X -2091(the)X -2283(above)X -747 3780(readme.ms)N -1323(troff)X -1611(source)X -1947(for)X -2139(the)X -2331(README)X -2667(file)X -747 3876(sdbm.3)N -1323(man)X -1515(page)X -747 3972(sdbm.c)N -1323(the)X -1515(real)X -1755(thing)X -747 4068(sdbm.h)N -1323(header)X -1659(file)X -1899(for)X -2091(the)X -2283(above)X -747 4164(tune.h)N -1323(place)X -1611(for)X -1803(tuning)X -2139(&)X -2235(portability)X -2811(thingies)X -747 4260(util.c)N -1323(miscellaneous)X -755 4432(dbu)N -1 f -924(is)X -1002(a)X -1063(simple)X -1301(database)X -1603(manipulation)X -2050(program)X -8 s -2322 4407(4)N -10 s -2379 4432(that)N -2524(tries)X -2687(to)X -2774(look)X -2941(like)X -3086(Bell)X -3244(Labs')X -7 f -3480(cbt)X -1 f -3649(utility.)X -3884(It)X -3958(is)X -555 4528(currently)N -867(incomplete)X -1245(in)X -1329(functionality.)X -1800(I)X -1849(use)X -7 f -2006(dbu)X -1 f -2172(to)X -2255(test)X -2387(out)X -2510(the)X -2629(routines:)X -2930(it)X -2995(takes)X -3181(\(from)X -3385(stdin\))X -3588(tab)X -3707(separated)X -555 4624(key/value)N -898(pairs)X -1085(for)X -1210(commands)X -1587(like)X -7 f -1765(build)X -1 f -2035(or)X -7 f -2160(insert)X -1 f -2478(or)X -2575(takes)X -2770(keys)X -2947(for)X -3071(commands)X -3448(like)X -7 f -3626(delete)X -1 f -3944(or)X -7 f -555 4720(look)N -1 f -(.)S -7 f -747 4864(dbu)N -939()X -2715(dbmfile)X -755 5036(dba)N -1 f -927(is)X -1008(a)X -1072(crude)X -1279(analyzer)X -1580(of)X -2 f -1675(dbm/sdbm/ndbm)X -1 f -2232(page)X -2412(\256les.)X -2593(It)X -2670(scans)X -2872(the)X -2998(entire)X -3209(page)X -3389(\256le,)X -3538(reporting)X -3859(page)X -555 5132(level)N -731(statistics,)X -1046(and)X -1182(totals)X -1375(at)X -1453(the)X -1571(end.)X -7 f -755 5256(dbd)N -1 f -925(is)X -1004(a)X -1066(crude)X -1271(dump)X -1479(program)X -1777(for)X -2 f -1897(dbm/ndbm/sdbm)X -1 f -2452(databases.)X -2806(It)X -2881(ignores)X -3143(the)X -3267(bitmap,)X -3534(and)X -3675(dumps)X -3913(the)X -555 5352(data)N -717(pages)X -928(in)X -1018(sequence.)X -1361(It)X -1437(can)X -1576(be)X -1679(used)X -1853(to)X -1942(create)X -2162(input)X -2353(for)X -2474(the)X -7 f -2627(dbu)X -1 f -2798(utility.)X -3055(Note)X -3238(that)X -7 f -3413(dbd)X -1 f -3584(will)X -3735(skip)X -3895(any)X -8 s -10 f -555 5432(hhhhhhhhhhhhhhhhhh)N -6 s -1 f -635 5507(3)N -8 s -691 5526(You)N -817(cannot)X -1003(really)X -1164(hoard)X -1325(something)X -1608(that)X -1720(is)X -1779(available)X -2025(to)X -2091(the)X -2185(public)X -2361(at)X -2423(large,)X -2582(but)X -2680(try)X -2767(if)X -2822(it)X -2874(makes)X -3053(you)X -3165(feel)X -3276(any)X -3384(better.)X -6 s -635 5601(4)N -8 s -691 5620(The)N -7 f -829(dbd)X -1 f -943(,)X -7 f -998(dba)X -1 f -1112(,)X -7 f -1167(dbu)X -1 f -1298(utilities)X -1508(are)X -1602(quick)X -1761(hacks)X -1923(and)X -2032(are)X -2126(not)X -2225(\256t)X -2295(for)X -2385(production)X -2678(use.)X -2795(They)X -2942(were)X -3081(developed)X -3359(late)X -3467(one)X -3575(night,)X -555 5700(just)N -664(to)X -730(test)X -835(out)X -2 f -933(sdbm)X -1 f -1068(,)X -1100(and)X -1208(convert)X -1415(some)X -1566(databases.)X - -3 p -%%Page: 3 3 -8 s 0 xH 0 xS 1 f -10 s -2216 384(-)N -2263(3)X -2323(-)X -555 672(NULLs)N -821(in)X -903(the)X -1021(key)X -1157(and)X -1293(data)X -1447(\256elds,)X -1660(thus)X -1813(is)X -1886(unsuitable)X -2235(to)X -2317(convert)X -2578(some)X -2767(peculiar)X -3046(databases)X -3374(that)X -3514(insist)X -3702(in)X -3784(includ-)X -555 768(ing)N -677(the)X -795(terminating)X -1184(null.)X -755 892(I)N -841(have)X -1052(also)X -1240(included)X -1575(a)X -1670(copy)X -1885(of)X -2011(the)X -7 f -2195(dbe)X -1 f -2397(\()X -2 f -2424(ndbm)X -1 f -2660(DataBase)X -3026(Editor\))X -3311(by)X -3449(Janick)X -3712(Bergeron)X -555 988([janick@bnr.ca])N -1098(for)X -1212(your)X -1379(pleasure.)X -1687(You)X -1845(may)X -2003(\256nd)X -2147(it)X -2211(more)X -2396(useful)X -2612(than)X -2770(the)X -2888(little)X -7 f -3082(dbu)X -1 f -3246(utility.)X -7 f -755 1112(dbm.[ch])N -1 f -1169(is)X -1252(a)X -2 f -1318(dbm)X -1 f -1486(library)X -1730(emulation)X -2079(on)X -2188(top)X -2319(of)X -2 f -2415(ndbm)X -1 f -2622(\(and)X -2794(hence)X -3011(suitable)X -3289(for)X -2 f -3412(sdbm)X -1 f -3581(\).)X -3657(Written)X -3931(by)X -555 1208(Robert)N -793(Elz.)X -755 1332(The)N -2 f -901(sdbm)X -1 f -1090(library)X -1324(has)X -1451(been)X -1623(around)X -1866(in)X -1948(beta)X -2102(test)X -2233(for)X -2347(quite)X -2527(a)X -2583(long)X -2745(time,)X -2927(and)X -3063(from)X -3239(whatever)X -3554(little)X -3720(feedback)X -555 1428(I)N -609(received)X -909(\(maybe)X -1177(no)X -1284(news)X -1476(is)X -1555(good)X -1741(news\),)X -1979(I)X -2032(believe)X -2290(it)X -2360(has)X -2493(been)X -2671(functioning)X -3066(without)X -3336(any)X -3478(signi\256cant)X -3837(prob-)X -555 1524(lems.)N -752(I)X -805(would,)X -1051(of)X -1144(course,)X -1400(appreciate)X -1757(all)X -1863(\256xes)X -2040(and/or)X -2271(improvements.)X -2774(Portability)X -3136(enhancements)X -3616(would)X -3841(espe-)X -555 1620(cially)N -753(be)X -849(useful.)X -3 f -555 1812(Implementation)N -1122(Issues)X -1 f -755 1936(Hash)N -944(functions:)X -1288(The)X -1437(algorithm)X -1772(behind)X -2 f -2014(sdbm)X -1 f -2207(implementation)X -2733(needs)X -2939(a)X -2998(good)X -3181(bit-scrambling)X -3671(hash)X -3841(func-)X -555 2032(tion)N -702(to)X -787(be)X -886(effective.)X -1211(I)X -1261(ran)X -1387(into)X -1534(a)X -1593(set)X -1705(of)X -1795(constants)X -2116(for)X -2233(a)X -2292(simple)X -2528(hash)X -2698(function)X -2988(that)X -3130(seem)X -3317(to)X -3401(help)X -2 f -3561(sdbm)X -1 f -3752(perform)X -555 2128(better)N -758(than)X -2 f -916(ndbm)X -1 f -1114(for)X -1228(various)X -1484(inputs:)X -7 f -747 2272(/*)N -795 2368(*)N -891(polynomial)X -1419(conversion)X -1947(ignoring)X -2379(overflows)X -795 2464(*)N -891(65599)X -1179(nice.)X -1467(65587)X -1755(even)X -1995(better.)X -795 2560(*/)N -747 2656(long)N -747 2752(dbm_hash\(char)N -1419(*str,)X -1707(int)X -1899(len\))X -2139({)X -939 2848(register)N -1371(unsigned)X -1803(long)X -2043(n)X -2139(=)X -2235(0;)X -939 3040(while)N -1227(\(len--\))X -1131 3136(n)N -1227(=)X -1323(n)X -1419(*)X -1515(65599)X -1803(+)X -1899(*str++;)X -939 3232(return)N -1275(n;)X -747 3328(})N -1 f -755 3500(There)N -975(may)X -1145(be)X -1253(better)X -1467(hash)X -1645(functions)X -1974(for)X -2099(the)X -2228(purposes)X -2544(of)X -2642(dynamic)X -2949(hashing.)X -3269(Try)X -3416(your)X -3594(favorite,)X -3895(and)X -555 3596(check)N -766(the)X -887(page\256le.)X -1184(If)X -1261(it)X -1328(contains)X -1618(too)X -1743(many)X -1944(pages)X -2150(with)X -2315(too)X -2440(many)X -2641(holes,)X -2853(\(in)X -2965(relation)X -3233(to)X -3318(this)X -3456(one)X -3595(for)X -3712(example\))X -555 3692(or)N -656(if)X -2 f -739(sdbm)X -1 f -942(simply)X -1193(stops)X -1391(working)X -1692(\(fails)X -1891(after)X -7 f -2101(SPLTMAX)X -1 f -2471(attempts)X -2776(to)X -2872(split\))X -3070(when)X -3278(you)X -3432(feed)X -3604(your)X -3784(NEWS)X -7 f -555 3788(history)N -1 f -912(\256le)X -1035(to)X -1118(it,)X -1203(you)X -1344(probably)X -1650(do)X -1751(not)X -1874(have)X -2047(a)X -2104(good)X -2285(hashing)X -2555(function.)X -2883(If)X -2958(you)X -3099(do)X -3200(better)X -3404(\(for)X -3545(different)X -3842(types)X -555 3884(of)N -642(input\),)X -873(I)X -920(would)X -1140(like)X -1280(to)X -1362(know)X -1560(about)X -1758(the)X -1876(function)X -2163(you)X -2303(use.)X -755 4008(Block)N -967(sizes:)X -1166(It)X -1236(seems)X -1453(\(from)X -1657(various)X -1914(tests)X -2077(on)X -2178(a)X -2235(few)X -2377(machines\))X -2727(that)X -2867(a)X -2923(page)X -3095(\256le)X -3217(block)X -3415(size)X -7 f -3588(PBLKSIZ)X -1 f -3944(of)X -555 4104(1024)N -738(is)X -814(by)X -917(far)X -1030(the)X -1150(best)X -1301(for)X -1417(performance,)X -1866(but)X -1990(this)X -2127(also)X -2278(happens)X -2563(to)X -2647(limit)X -2819(the)X -2939(size)X -3086(of)X -3175(a)X -3233(key/value)X -3567(pair.)X -3734(Depend-)X -555 4200(ing)N -681(on)X -785(your)X -956(needs,)X -1183(you)X -1327(may)X -1489(wish)X -1663(to)X -1748(increase)X -2035(the)X -2156(page)X -2331(size,)X -2499(and)X -2638(also)X -2790(adjust)X -7 f -3032(PAIRMAX)X -1 f -3391(\(the)X -3539(maximum)X -3886(size)X -555 4296(of)N -648(a)X -710(key/value)X -1048(pair)X -1199(allowed:)X -1501(should)X -1740(always)X -1989(be)X -2090(at)X -2173(least)X -2345(three)X -2531(words)X -2752(smaller)X -3013(than)X -7 f -3204(PBLKSIZ)X -1 f -(.\))S -3612(accordingly.)X -555 4392(The)N -706(system-wide)X -1137(version)X -1399(of)X -1492(the)X -1616(library)X -1856(should)X -2095(probably)X -2406(be)X -2508(con\256gured)X -2877(with)X -3044(1024)X -3229(\(distribution)X -3649(default\),)X -3944(as)X -555 4488(this)N -690(appears)X -956(to)X -1038(be)X -1134(suf\256cient)X -1452(for)X -1566(most)X -1741(common)X -2041(uses)X -2199(of)X -2 f -2286(sdbm)X -1 f -2455(.)X -3 f -555 4680(Portability)N -1 f -755 4804(This)N -917(package)X -1201(has)X -1328(been)X -1500(tested)X -1707(in)X -1789(many)X -1987(different)X -2284(UN*Xes)X -2585(even)X -2757(including)X -3079(minix,)X -3305(and)X -3441(appears)X -3707(to)X -3789(be)X -3885(rea-)X -555 4900(sonably)N -824(portable.)X -1127(This)X -1289(does)X -1456(not)X -1578(mean)X -1772(it)X -1836(will)X -1980(port)X -2129(easily)X -2336(to)X -2418(non-UN*X)X -2799(systems.)X -3 f -555 5092(Notes)N -767(and)X -915(Miscellaneous)X -1 f -755 5216(The)N -2 f -913(sdbm)X -1 f -1115(is)X -1201(not)X -1336(a)X -1405(very)X -1581(complicated)X -2006(package,)X -2323(at)X -2414(least)X -2594(not)X -2729(after)X -2910(you)X -3063(familiarize)X -3444(yourself)X -3739(with)X -3913(the)X -555 5312(literature)N -879(on)X -993(external)X -1286(hashing.)X -1589(There)X -1811(are)X -1944(other)X -2143(interesting)X -2514(algorithms)X -2889(in)X -2984(existence)X -3316(that)X -3469(ensure)X -3712(\(approxi-)X -555 5408(mately\))N -825(single-read)X -1207(access)X -1438(to)X -1525(a)X -1586(data)X -1745(value)X -1944(associated)X -2299(with)X -2466(any)X -2607(key.)X -2768(These)X -2984(are)X -3107(directory-less)X -3568(schemes)X -3864(such)X -555 5504(as)N -2 f -644(linear)X -857(hashing)X -1 f -1132([Lit80])X -1381(\(+)X -1475(Larson)X -1720(variations\),)X -2 f -2105(spiral)X -2313(storage)X -1 f -2575([Mar79])X -2865(or)X -2954(directory)X -3265(schemes)X -3558(such)X -3726(as)X -2 f -3814(exten-)X -555 5600(sible)N -731(hashing)X -1 f -1009([Fag79])X -1288(by)X -1393(Fagin)X -1600(et)X -1683(al.)X -1786(I)X -1838(do)X -1943(hope)X -2124(these)X -2314(sources)X -2579(provide)X -2848(a)X -2908(reasonable)X -3276(playground)X -3665(for)X -3783(experi-)X -555 5696(mentation)N -907(with)X -1081(other)X -1277(algorithms.)X -1690(See)X -1837(the)X -1966(June)X -2144(1988)X -2335(issue)X -2526(of)X -2624(ACM)X -2837(Computing)X -3227(Surveys)X -3516([Enb88])X -3810(for)X -3935(an)X -555 5792(excellent)N -865(overview)X -1184(of)X -1271(the)X -1389(\256eld.)X - -4 p -%%Page: 4 4 -10 s 0 xH 0 xS 1 f -2216 384(-)N -2263(4)X -2323(-)X -3 f -555 672(References)N -1 f -555 824([Lar78])N -875(P.-A.)X -1064(Larson,)X -1327(``Dynamic)X -1695(Hashing'',)X -2 f -2056(BIT)X -1 f -(,)S -2216(vol.)X -2378(18,)X -2518(pp.)X -2638(184-201,)X -2945(1978.)X -555 948([Tho90])N -875(Ken)X -1029(Thompson,)X -2 f -1411(private)X -1658(communication)X -1 f -2152(,)X -2192(Nov.)X -2370(1990)X -555 1072([Lit80])N -875(W.)X -992(Litwin,)X -1246(``)X -1321(Linear)X -1552(Hashing:)X -1862(A)X -1941(new)X -2096(tool)X -2261(for)X -2396(\256le)X -2539(and)X -2675(table)X -2851(addressing'',)X -2 f -3288(Proceedings)X -3709(of)X -3791(the)X -3909(6th)X -875 1168(Conference)N -1269(on)X -1373(Very)X -1548(Large)X -1782(Dabatases)X -2163(\(Montreal\))X -1 f -2515(,)X -2558(pp.)X -2701(212-223,)X -3031(Very)X -3215(Large)X -3426(Database)X -3744(Founda-)X -875 1264(tion,)N -1039(Saratoga,)X -1360(Calif.,)X -1580(1980.)X -555 1388([Fag79])N -875(R.)X -969(Fagin,)X -1192(J.)X -1284(Nievergelt,)X -1684(N.)X -1803(Pippinger,)X -2175(and)X -2332(H.)X -2451(R.)X -2544(Strong,)X -2797(``Extendible)X -3218(Hashing)X -3505(-)X -3552(A)X -3630(Fast)X -3783(Access)X -875 1484(Method)N -1144(for)X -1258(Dynamic)X -1572(Files'',)X -2 f -1821(ACM)X -2010(Trans.)X -2236(Database)X -2563(Syst.)X -1 f -2712(,)X -2752(vol.)X -2894(4,)X -2994(no.3,)X -3174(pp.)X -3294(315-344,)X -3601(Sept.)X -3783(1979.)X -555 1608([Wal84])N -875(Rich)X -1055(Wales,)X -1305(``Discussion)X -1739(of)X -1835("dbm")X -2072(data)X -2235(base)X -2406(system'',)X -2 f -2730(USENET)X -3051(newsgroup)X -3430(unix.wizards)X -1 f -3836(,)X -3884(Jan.)X -875 1704(1984.)N -555 1828([Tor87])N -875(Chris)X -1068(Torek,)X -1300(``Re:)X -1505(dbm.a)X -1743(and)X -1899(ndbm.a)X -2177(archives'',)X -2 f -2539(USENET)X -2852(newsgroup)X -3223(comp.unix)X -1 f -3555(,)X -3595(1987.)X -555 1952([Mar79])N -875(G.)X -974(N.)X -1073(Martin,)X -1332(``Spiral)X -1598(Storage:)X -1885(Incrementally)X -2371(Augmentable)X -2843(Hash)X -3048(Addressed)X -3427(Storage'',)X -2 f -3766(Techni-)X -875 2048(cal)N -993(Report)X -1231(#27)X -1 f -(,)S -1391(University)X -1749(of)X -1836(Varwick,)X -2153(Coventry,)X -2491(U.K.,)X -2687(1979.)X -555 2172([Enb88])N -875(R.)X -977(J.)X -1057(Enbody)X -1335(and)X -1480(H.)X -1586(C.)X -1687(Du,)X -1833(``Dynamic)X -2209(Hashing)X -2524(Schemes'',)X -2 f -2883(ACM)X -3080(Computing)X -3463(Surveys)X -1 f -3713(,)X -3761(vol.)X -3911(20,)X -875 2268(no.)N -995(2,)X -1075(pp.)X -1195(85-113,)X -1462(June)X -1629(1988.)X - -4 p -%%Trailer -xt - -xs diff -Nru acm-5.0/dis/sdbm/README.simx acm-6.0+20200416/dis/sdbm/README.simx --- acm-5.0/dis/sdbm/README.simx 1995-09-26 18:02:08.000000000 +0000 +++ acm-6.0+20200416/dis/sdbm/README.simx 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -The files in this directory came from -ftp://gatekeeper.dec.com on 21 April, 1995. - diff -Nru acm-5.0/dis/sdbm/sdbm.3 acm-6.0+20200416/dis/sdbm/sdbm.3 --- acm-5.0/dis/sdbm/sdbm.3 1998-05-12 03:59:05.000000000 +0000 +++ acm-6.0+20200416/dis/sdbm/sdbm.3 1970-01-01 00:00:00.000000000 +0000 @@ -1,290 +0,0 @@ -.\" $Id: sdbm.3,v 1.2 1998/05/12 03:59:05 riley Exp $ -.TH SDBM 3 "1 March 1990" -.SH NAME -sdbm, dbm_open, dbm_prep, dbm_close, dbm_fetch, dbm_store, dbm_delete, dbm_firstkey, dbm_nextkey, dbm_hash, dbm_rdonly, dbm_error, dbm_clearerr, dbm_dirfno, dbm_pagfno \- data base subroutines -.SH SYNOPSIS -.nf -.ft B -#include -.sp -typedef struct { - char *dptr; - int dsize; -} datum; -.sp -datum nullitem = { NULL, 0 }; -.sp -\s-1DBM\s0 *dbm_open(char *file, int flags, int mode) -.sp -\s-1DBM\s0 *dbm_prep(char *dirname, char *pagname, int flags, int mode) -.sp -void dbm_close(\s-1DBM\s0 *db) -.sp -datum dbm_fetch(\s-1DBM\s0 *db, key) -.sp -int dbm_store(\s-1DBM\s0 *db, datum key, datum val, int flags) -.sp -int dbm_delete(\s-1DBM\s0 *db, datum key) -.sp -datum dbm_firstkey(\s-1DBM\s0 *db) -.sp -datum dbm_nextkey(\s-1DBM\s0 *db) -.sp -long dbm_hash(char *string, int len) -.sp -int dbm_rdonly(\s-1DBM\s0 *db) -int dbm_error(\s-1DBM\s0 *db) -dbm_clearerr(\s-1DBM\s0 *db) -int dbm_dirfno(\s-1DBM\s0 *db) -int dbm_pagfno(\s-1DBM\s0 *db) -.ft R -.fi -.SH DESCRIPTION -.IX "database library" sdbm "" "\fLsdbm\fR" -.IX dbm_open "" "\fLdbm_open\fR \(em open \fLsdbm\fR database" -.IX dbm_prep "" "\fLdbm_prep\fR \(em prepare \fLsdbm\fR database" -.IX dbm_close "" "\fLdbm_close\fR \(em close \fLsdbm\fR routine" -.IX dbm_fetch "" "\fLdbm_fetch\fR \(em fetch \fLsdbm\fR database data" -.IX dbm_store "" "\fLdbm_store\fR \(em add data to \fLsdbm\fR database" -.IX dbm_delete "" "\fLdbm_delete\fR \(em remove data from \fLsdbm\fR database" -.IX dbm_firstkey "" "\fLdbm_firstkey\fR \(em access \fLsdbm\fR database" -.IX dbm_nextkey "" "\fLdbm_nextkey\fR \(em access \fLsdbm\fR database" -.IX dbm_hash "" "\fLdbm_hash\fR \(em string hash for \fLsdbm\fR database" -.IX dbm_rdonly "" "\fLdbm_rdonly\fR \(em return \fLsdbm\fR database read-only mode" -.IX dbm_error "" "\fLdbm_error\fR \(em return \fLsdbm\fR database error condition" -.IX dbm_clearerr "" "\fLdbm_clearerr\fR \(em clear \fLsdbm\fR database error condition" -.IX dbm_dirfno "" "\fLdbm_dirfno\fR \(em return \fLsdbm\fR database bitmap file descriptor" -.IX dbm_pagfno "" "\fLdbm_pagfno\fR \(em return \fLsdbm\fR database data file descriptor" -.IX "database functions \(em \fLsdbm\fR" dbm_open "" \fLdbm_open\fP -.IX "database functions \(em \fLsdbm\fR" dbm_prep "" \fLdbm_prep\fP -.IX "database functions \(em \fLsdbm\fR" dbm_close "" \fLdbm_close\fP -.IX "database functions \(em \fLsdbm\fR" dbm_fetch "" \fLdbm_fetch\fP -.IX "database functions \(em \fLsdbm\fR" dbm_store "" \fLdbm_store\fP -.IX "database functions \(em \fLsdbm\fR" dbm_delete "" \fLdbm_delete\fP -.IX "database functions \(em \fLsdbm\fR" dbm_firstkey "" \fLdbm_firstkey\fP -.IX "database functions \(em \fLsdbm\fR" dbm_nextkey "" \fLdbm_nextkey\fP -.IX "database functions \(em \fLsdbm\fR" dbm_rdonly "" \fLdbm_rdonly\fP -.IX "database functions \(em \fLsdbm\fR" dbm_error "" \fLdbm_error\fP -.IX "database functions \(em \fLsdbm\fR" dbm_clearerr "" \fLdbm_clearerr\fP -.IX "database functions \(em \fLsdbm\fR" dbm_dirfno "" \fLdbm_dirfno\fP -.IX "database functions \(em \fLsdbm\fR" dbm_pagfno "" \fLdbm_pagfno\fP -.LP -This package allows an application to maintain a mapping of pairs -in disk files. This is not to be considered a real database system, but is -still useful in many simple applications built around fast retrieval of a data -value from a key. This implementation uses an external hashing scheme, -called Dynamic Hashing, as described by Per-Aake Larson in BIT 18 (1978) pp. -184-201. Retrieval of any item usually requires a single disk access. -The application interface is compatible with the -.IR ndbm (3) -library. -.LP -An -.B sdbm -database is kept in two files usually given the extensions -.B \.dir -and -.BR \.pag . -The -.B \.dir -file contains a bitmap representing a forest of binary hash trees, the leaves -of which indicate data pages in the -.B \.pag -file. -.LP -The application interface uses the -.B datum -structure to describe both -.I keys -and -.IR value s. -A -.B datum -specifies a byte sequence of -.I dsize -size pointed to by -.IR dptr . -If you use -.SM ASCII -strings as -.IR key s -or -.IR value s, -then you must decide whether or not to include the terminating -.SM NUL -byte which sometimes defines strings. Including it will require larger -database files, but it will be possible to get sensible output from a -.IR strings (1) -command applied to the data file. -.LP -In order to allow a process using this package to manipulate multiple -databases, the applications interface always requires a -.IR handle , -a -.BR "DBM *" , -to identify the database to be manipulated. Such a handle can be obtained -from the only routines that do not require it, namely -.BR dbm_open (\|) -or -.BR dbm_prep (\|). -Either of these will open or create the two necessary files. The -difference is that the latter allows explicitly naming the bitmap and data -files whereas -.BR dbm_open (\|) -will take a base file name and call -.BR dbm_prep (\|) -with the default extensions. -The -.I flags -and -.I mode -parameters are the same as for -.BR open (2). -.LP -To free the resources occupied while a database handle is active, call -.BR dbm_close (\|). -.LP -Given a handle, one can retrieve data associated with a key by using the -.BR dbm_fetch (\|) -routine, and associate data with a key by using the -.BR dbm_store (\|) -routine. -.LP -The values of the -.I flags -parameter for -.BR dbm_store (\|) -can be either -.BR \s-1DBM_INSERT\s0 , -which will not change an existing entry with the same key, or -.BR \s-1DBM_REPLACE\s0 , -which will replace an existing entry with the same key. -Keys are unique within the database. -.LP -To delete a key and its associated value use the -.BR dbm_delete (\|) -routine. -.LP -To retrieve every key in the database, use a loop like: -.sp -.nf -.ft B -for (key = dbm_firstkey(db); key.dptr != NULL; key = dbm_nextkey(db)) - ; -.ft R -.fi -.LP -The order of retrieval is unspecified. -.LP -If you determine that the performance of the database is inadequate or -you notice clustering or other effects that may be due to the hashing -algorithm used by this package, you can override it by supplying your -own -.BR dbm_hash (\|) -routine. Doing so will make the database unintelligable to any other -applications that do not use your specialized hash function. -.sp -.LP -The following macros are defined in the header file: -.IP -.BR dbm_rdonly (\|) -returns true if the database has been opened read\-only. -.IP -.BR dbm_error (\|) -returns true if an I/O error has occurred. -.IP -.BR dbm_clearerr (\|) -allows you to clear the error flag if you think you know what the error -was and insist on ignoring it. -.IP -.BR dbm_dirfno (\|) -returns the file descriptor associated with the bitmap file. -.IP -.BR dbm_pagfno (\|) -returns the file descriptor associated with the data file. -.SH SEE ALSO -.IR open (2). -.SH DIAGNOSTICS -Functions that return a -.B "DBM *" -handle will use -.SM NULL -to indicate an error. -Functions that return an -.B int -will use \-1 to indicate an error. The normal return value in that case is 0. -Functions that return a -.B datum -will return -.B nullitem -to indicate an error. -.LP -As a special case of -.BR dbm_store (\|), -if it is called with the -.B \s-1DBM_INSERT\s0 -flag and the key already exists in the database, the return value will be 1. -.LP -In general, if a function parameter is invalid, -.B errno -will be set to -.BR \s-1EINVAL\s0 . -If a write operation is requested on a read-only database, -.B errno -will be set to -.BR \s-1ENOPERM\s0 . -If a memory allocation (using -.IR malloc (3)) -failed, -.B errno -will be set to -.BR \s-1ENOMEM\s0 . -For I/O operation failures -.B errno -will contain the value set by the relevant failed system call, either -.IR read (2), -.IR write (2), -or -.IR lseek (2). -.SH AUTHOR -.IP "Ozan S. Yigit" (oz@nexus.yorku.ca) -.SH BUGS -The sum of key and value data sizes must not exceed -.B \s-1PAIRMAX\s0 -(1008 bytes). -.LP -The sum of the key and value data sizes where several keys hash to the -same value must fit within one bitmap page. -.LP -The -.B \.pag -file will contain holes, so its apparent size is larger than its contents. -When copied through the filesystem the holes will be filled. -.LP -The contents of -.B datum -values returned are in volatile storage. If you want to retain the values -pointed to, you must copy them immediately before another call to this package. -.LP -The only safe way for multiple processes to (read and) update a database at -the same time, is to implement a private locking scheme outside this package -and open and close the database between lock acquisitions. It is safe for -multiple processes to concurrently access a database read-only. -.SH APPLICATIONS PORTABILITY -For complete source code compatibility with the Berkeley Unix -.IR ndbm (3) -library, the -.B sdbm.h -header file should be installed in -.BR /usr/include/ndbm.h . -.LP -The -.B nullitem -data item, and the -.BR dbm_prep (\|), -.BR dbm_hash (\|), -.BR dbm_rdonly (\|), -.BR dbm_dirfno (\|), -and -.BR dbm_pagfno (\|) -functions are unique to this package. diff -Nru acm-5.0/dis/sdbm/sdbm.c acm-6.0+20200416/dis/sdbm/sdbm.c --- acm-5.0/dis/sdbm/sdbm.c 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/dis/sdbm/sdbm.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,543 +0,0 @@ -/* - * sdbm - ndbm work-alike hashed database library - * based on Per-Aake Larson's Dynamic Hashing algorithms. BIT 18 (1978). - * author: oz@nexus.yorku.ca - * status: public domain. - * - * core routines - */ - -#ifndef lint -static char rcsid[] = "$Id: sdbm.c,v 1.2 1998/05/12 03:59:05 riley Exp $"; -#endif - -#include "sdbm.h" -#include "tune.h" -#include "pair.h" - -#include -#include -#include - -#if HAVE_FCNTL_H -#include -#else -#include -#endif - -#if STDC_HEADERS || HAVE_STRING_H -#include -/* An ANSI string.h and pre-ANSI memory.h might conflict. */ -#if !STDC_HEADERS && HAVE_MEMORY_H -#include -#endif /* not STDC_HEADERS and HAVE_MEMORY_H */ -#define index strchr -#define rindex strrchr -#define bcopy(s, d, n) memcpy ((d), (s), (n)) -#define bcmp(s1, s2, n) memcmp ((s1), (s2), (n)) -#define bzero(s, n) memset ((s), 0, (n)) -#else /* not STDC_HEADERS and not HAVE_STRING_H */ -#include -/* memory.h and strings.h conflict on some systems. */ -#endif /* not STDC_HEADERS and not HAVE_STRING_H */ - -#ifdef __STDC__ -#include -#endif - -#ifndef NULL -#define NULL 0 -#endif - -/* - * externals - */ -#ifndef sun -extern int errno; -#endif - -/* extern char *malloc proto((unsigned int)); */ -extern void free proto((void *)); -#ifdef HAVE_UNISTD_H -#include -#else -extern long lseek(); -#endif - -/* - * forward - */ -static int getdbit proto((DBM *, long)); -static int setdbit proto((DBM *, long)); -static int getpage proto((DBM *, long)); -static datum getnext proto((DBM *)); -static int makroom proto((DBM *, long, int)); - -/* - * useful macros - */ -#define bad(x) ((x).dptr == NULL || (x).dsize <= 0) -#define exhash(item) dbm_hash((item).dptr, (item).dsize) -#define ioerr(db) ((db)->flags |= DBM_IOERR) - -#define OFF_PAG(off) (long) (off) * PBLKSIZ -#define OFF_DIR(off) (long) (off) * DBLKSIZ - -static long masks[] = { - 000000000000, 000000000001, 000000000003, 000000000007, - 000000000017, 000000000037, 000000000077, 000000000177, - 000000000377, 000000000777, 000000001777, 000000003777, - 000000007777, 000000017777, 000000037777, 000000077777, - 000000177777, 000000377777, 000000777777, 000001777777, - 000003777777, 000007777777, 000017777777, 000037777777, - 000077777777, 000177777777, 000377777777, 000777777777, - 001777777777, 003777777777, 007777777777, 017777777777 -}; - -datum nullitem = {NULL, 0}; - -DBM * -dbm_open(file, flags, mode) -register char *file; -register int flags; -register int mode; -{ - register DBM *db; - register char *dirname; - register char *pagname; - register int n; - - if (file == NULL || !*file) - return errno = EINVAL, (DBM *) NULL; -/* - * need space for two seperate filenames - */ - n = strlen(file) * 2 + strlen(DIRFEXT) + strlen(PAGFEXT) + 2; - - if ((dirname = malloc((unsigned) n)) == NULL) - return errno = ENOMEM, (DBM *) NULL; -/* - * build the file names - */ - dirname = strcat(strcpy(dirname, file), DIRFEXT); - pagname = strcpy(dirname + strlen(dirname) + 1, file); - pagname = strcat(pagname, PAGFEXT); - - db = dbm_prep(dirname, pagname, flags, mode); - free((char *) dirname); - return db; -} - -DBM * -dbm_prep(dirname, pagname, flags, mode) -char *dirname; -char *pagname; -int flags; -int mode; -{ - register DBM *db; - struct stat dstat; - - if ((db = (DBM *) malloc(sizeof(DBM))) == NULL) - return errno = ENOMEM, (DBM *) NULL; - - db->flags = 0; - db->hmask = 0; - db->blkptr = 0; - db->keyptr = 0; -/* - * adjust user flags so that WRONLY becomes RDWR, - * as required by this package. Also set our internal - * flag for RDONLY if needed. - */ - if (flags & O_WRONLY) - flags = (flags & ~O_WRONLY) | O_RDWR; - - else if ((flags & 03) == O_RDONLY) - db->flags = DBM_RDONLY; -/* - * open the files in sequence, and stat the dirfile. - * If we fail anywhere, undo everything, return NULL. - */ - if ((db->pagf = open(pagname, flags, mode)) > -1) { - if ((db->dirf = open(dirname, flags, mode)) > -1) { -/* - * need the dirfile size to establish max bit number. - */ - if (fstat(db->dirf, &dstat) == 0) { -/* - * zero size: either a fresh database, or one with a single, - * unsplit data page: dirpage is all zeros. - */ - db->dirbno = (!dstat.st_size) ? 0 : -1; - db->pagbno = -1; - db->maxbno = dstat.st_size * BYTESIZ; - - (void) memset(db->pagbuf, 0, PBLKSIZ); - (void) memset(db->dirbuf, 0, DBLKSIZ); - /* - * success - */ - return db; - } - (void) close(db->dirf); - } - (void) close(db->pagf); - } - free((char *) db); - return (DBM *) NULL; -} - -void -dbm_close(db) -register DBM *db; -{ - if (db == NULL) - errno = EINVAL; - else { - (void) close(db->dirf); - (void) close(db->pagf); - free((char *) db); - } -} - -datum -dbm_fetch(db, key) -register DBM *db; -datum key; -{ - if (db == NULL || bad(key)) - return errno = EINVAL, nullitem; - - if (getpage(db, exhash(key))) - return getpair(db->pagbuf, key); - - return ioerr(db), nullitem; -} - -int -dbm_delete(db, key) -register DBM *db; -datum key; -{ - if (db == NULL || bad(key)) - return errno = EINVAL, -1; - if (dbm_rdonly(db)) - return errno = EPERM, -1; - - if (getpage(db, exhash(key))) { - if (!delpair(db->pagbuf, key)) - return -1; -/* - * update the page file - */ - if (lseek(db->pagf, OFF_PAG(db->pagbno), SEEK_SET) < 0 - || write(db->pagf, db->pagbuf, PBLKSIZ) < 0) - return ioerr(db), -1; - - return 0; - } - - return ioerr(db), -1; -} - -int -dbm_store(db, key, val, flags) -register DBM *db; -datum key; -datum val; -int flags; -{ - int need; - register long hash; - - if (db == NULL || bad(key)) - return errno = EINVAL, -1; - if (dbm_rdonly(db)) - return errno = EPERM, -1; - - need = key.dsize + val.dsize; -/* - * is the pair too big (or too small) for this database ?? - */ - if (need < 0 || need > PAIRMAX) - return errno = EINVAL, -1; - - if (getpage(db, (hash = exhash(key)))) { -/* - * if we need to replace, delete the key/data pair - * first. If it is not there, ignore. - */ - if (flags == DBM_REPLACE) - (void) delpair(db->pagbuf, key); -#ifdef SEEDUPS - else if (duppair(db->pagbuf, key)) - return 1; -#endif -/* - * if we do not have enough room, we have to split. - */ - if (!fitpair(db->pagbuf, need)) - if (!makroom(db, hash, need)) - return ioerr(db), -1; -/* - * we have enough room or split is successful. insert the key, - * and update the page file. - */ - (void) putpair(db->pagbuf, key, val); - - if (lseek(db->pagf, OFF_PAG(db->pagbno), SEEK_SET) < 0 - || write(db->pagf, db->pagbuf, PBLKSIZ) < 0) - return ioerr(db), -1; - /* - * success - */ - return 0; - } - - return ioerr(db), -1; -} - -/* - * makroom - make room by splitting the overfull page - * this routine will attempt to make room for SPLTMAX times before - * giving up. - */ -static int -makroom(db, hash, need) -register DBM *db; -long hash; -int need; -{ - long newp; - char twin[PBLKSIZ]; - char *pag = db->pagbuf; - char *new = twin; - register int smax = SPLTMAX; - - do { -/* - * split the current page - */ - (void) splpage(pag, new, db->hmask + 1); -/* - * address of the new page - */ - newp = (hash & db->hmask) | (db->hmask + 1); - -/* - * write delay, read avoidence/cache shuffle: - * select the page for incoming pair: if key is to go to the new page, - * write out the previous one, and copy the new one over, thus making - * it the current page. If not, simply write the new page, and we are - * still looking at the page of interest. current page is not updated - * here, as dbm_store will do so, after it inserts the incoming pair. - */ - if (hash & (db->hmask + 1)) { - if (lseek(db->pagf, OFF_PAG(db->pagbno), SEEK_SET) < 0 - || write(db->pagf, db->pagbuf, PBLKSIZ) < 0) - return 0; - db->pagbno = newp; - (void) memcpy(pag, new, PBLKSIZ); - } - else if (lseek(db->pagf, OFF_PAG(newp), SEEK_SET) < 0 - || write(db->pagf, new, PBLKSIZ) < 0) - return 0; - - if (!setdbit(db, db->curbit)) - return 0; -/* - * see if we have enough room now - */ - if (fitpair(pag, need)) - return 1; -/* - * try again... update curbit and hmask as getpage would have - * done. because of our update of the current page, we do not - * need to read in anything. BUT we have to write the current - * [deferred] page out, as the window of failure is too great. - */ - db->curbit = 2 * db->curbit + - ((hash & (db->hmask + 1)) ? 2 : 1); - db->hmask |= db->hmask + 1; - - if (lseek(db->pagf, OFF_PAG(db->pagbno), SEEK_SET) < 0 - || write(db->pagf, db->pagbuf, PBLKSIZ) < 0) - return 0; - - } while (--smax); -/* - * if we are here, this is real bad news. After SPLTMAX splits, - * we still cannot fit the key. say goodnight. - */ -#ifdef BADMESS - (void) write(2, "sdbm: cannot insert after SPLTMAX attempts.\n", 44); -#endif - return 0; - -} - -/* - * the following two routines will break if - * deletions aren't taken into account. (ndbm bug) - */ -datum -dbm_firstkey(db) -register DBM *db; -{ - if (db == NULL) - return errno = EINVAL, nullitem; -/* - * start at page 0 - */ - if (lseek(db->pagf, OFF_PAG(0), SEEK_SET) < 0 - || read(db->pagf, db->pagbuf, PBLKSIZ) < 0) - return ioerr(db), nullitem; - db->pagbno = 0; - db->blkptr = 0; - db->keyptr = 0; - - return getnext(db); -} - -datum -dbm_nextkey(db) -register DBM *db; -{ - if (db == NULL) - return errno = EINVAL, nullitem; - return getnext(db); -} - -/* - * all important binary trie traversal - */ -static int -getpage(db, hash) -register DBM *db; -register long hash; -{ - register int hbit; - register long dbit; - register long pagb; - - dbit = 0; - hbit = 0; - while (dbit < db->maxbno && getdbit(db, dbit)) - dbit = 2 * dbit + ((hash & (1 << hbit++)) ? 2 : 1); - - debug(("dbit: %d...", dbit)); - - db->curbit = dbit; - db->hmask = masks[hbit]; - - pagb = hash & db->hmask; -/* - * see if the block we need is already in memory. - * note: this lookaside cache has about 10% hit rate. - */ - if (pagb != db->pagbno) { -/* - * note: here, we assume a "hole" is read as 0s. - * if not, must zero pagbuf first. - */ - if (lseek(db->pagf, OFF_PAG(pagb), SEEK_SET) < 0 - || read(db->pagf, db->pagbuf, PBLKSIZ) < 0) - return 0; - if (!chkpage(db->pagbuf)) - return 0; - db->pagbno = pagb; - - debug(("pag read: %d\n", pagb)); - } - return 1; -} - -static int -getdbit(db, dbit) -register DBM *db; -register long dbit; -{ - register long c; - register long dirb; - - c = dbit / BYTESIZ; - dirb = c / DBLKSIZ; - - if (dirb != db->dirbno) { - if (lseek(db->dirf, OFF_DIR(dirb), SEEK_SET) < 0 - || read(db->dirf, db->dirbuf, DBLKSIZ) < 0) - return 0; - db->dirbno = dirb; - - debug(("dir read: %d\n", dirb)); - } - - return db->dirbuf[c % DBLKSIZ] & (1 << dbit % BYTESIZ); -} - -static int -setdbit(db, dbit) -register DBM *db; -register long dbit; -{ - register long c; - register long dirb; - - c = dbit / BYTESIZ; - dirb = c / DBLKSIZ; - - if (dirb != db->dirbno) { - if (lseek(db->dirf, OFF_DIR(dirb), SEEK_SET) < 0 - || read(db->dirf, db->dirbuf, DBLKSIZ) < 0) - return 0; - db->dirbno = dirb; - - debug(("dir read: %d\n", dirb)); - } - - db->dirbuf[c % DBLKSIZ] |= (1 << dbit % BYTESIZ); - - if (dbit >= db->maxbno) - db->maxbno += DBLKSIZ * BYTESIZ; - - if (lseek(db->dirf, OFF_DIR(dirb), SEEK_SET) < 0 - || write(db->dirf, db->dirbuf, DBLKSIZ) < 0) - return 0; - - return 1; -} - -/* - * getnext - get the next key in the page, and if done with - * the page, try the next page in sequence - */ -static datum -getnext(db) -register DBM *db; -{ - datum key; - - for (;;) { - db->keyptr++; - key = getnkey(db->pagbuf, db->keyptr); - if (key.dptr != NULL) - return key; -/* - * we either run out, or there is nothing on this page.. - * try the next one... If we lost our position on the - * file, we will have to seek. - */ - db->keyptr = 0; - if (db->pagbno != db->blkptr++) - if (lseek(db->pagf, OFF_PAG(db->blkptr), SEEK_SET) < 0) - break; - db->pagbno = db->blkptr; - if (read(db->pagf, db->pagbuf, PBLKSIZ) <= 0) - break; - if (!chkpage(db->pagbuf)) - break; - } - - return ioerr(db), nullitem; -} diff -Nru acm-5.0/dis/sdbm/sdbm.h acm-6.0+20200416/dis/sdbm/sdbm.h --- acm-5.0/dis/sdbm/sdbm.h 1995-09-26 18:02:00.000000000 +0000 +++ acm-6.0+20200416/dis/sdbm/sdbm.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,79 +0,0 @@ -/* - * sdbm - ndbm work-alike hashed database library - * based on Per-Ake Larson's Dynamic Hashing algorithms. BIT 18 (1978). - * author: oz@nexus.yorku.ca - * status: public domain. - */ -#define DBLKSIZ 4096 -#define PBLKSIZ 1024 -#define PAIRMAX 1008 /* arbitrary on PBLKSIZ-N */ -#define SPLTMAX 10 /* maximum allowed splits */ - /* for a single insertion */ -#define DIRFEXT ".dir" -#define PAGFEXT ".pag" - -typedef struct { - int dirf; /* directory file descriptor */ - int pagf; /* page file descriptor */ - int flags; /* status/error flags, see below */ - long maxbno; /* size of dirfile in bits */ - long curbit; /* current bit number */ - long hmask; /* current hash mask */ - long blkptr; /* current block for nextkey */ - int keyptr; /* current key for nextkey */ - long blkno; /* current page to read/write */ - long pagbno; /* current page in pagbuf */ - char pagbuf[PBLKSIZ]; /* page file block buffer */ - long dirbno; /* current block in dirbuf */ - char dirbuf[DBLKSIZ]; /* directory file block buffer */ -} DBM; - -#define DBM_RDONLY 0x1 /* data base open read-only */ -#define DBM_IOERR 0x2 /* data base I/O error */ - -/* - * utility macros - */ -#define dbm_rdonly(db) ((db)->flags & DBM_RDONLY) -#define dbm_error(db) ((db)->flags & DBM_IOERR) - -#define dbm_clearerr(db) ((db)->flags &= ~DBM_IOERR) /* ouch */ - -#define dbm_dirfno(db) ((db)->dirf) -#define dbm_pagfno(db) ((db)->pagf) - -typedef struct { - char *dptr; - int dsize; -} datum; - -extern datum nullitem; - -#ifdef __STDC__ -#define proto(p) p -#else -#define proto(p) () -#endif - -/* - * flags to dbm_store - */ -#define DBM_INSERT 0 -#define DBM_REPLACE 1 - -/* - * ndbm interface - */ -extern DBM *dbm_open proto((char *, int, int)); -extern void dbm_close proto((DBM *)); -extern datum dbm_fetch proto((DBM *, datum)); -extern int dbm_delete proto((DBM *, datum)); -extern int dbm_store proto((DBM *, datum, datum, int)); -extern datum dbm_firstkey proto((DBM *)); -extern datum dbm_nextkey proto((DBM *)); - -/* - * other - */ -extern DBM *dbm_prep proto((char *, char *, int, int)); -extern long dbm_hash proto((char *, int)); diff -Nru acm-5.0/dis/sdbm/tune.h acm-6.0+20200416/dis/sdbm/tune.h --- acm-5.0/dis/sdbm/tune.h 1995-09-26 18:02:04.000000000 +0000 +++ acm-6.0+20200416/dis/sdbm/tune.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,47 +0,0 @@ -/* - * sdbm - ndbm work-alike hashed database library - * tuning and portability constructs [not nearly enough] - * author: oz@nexus.yorku.ca - */ - -#define BYTESIZ 8 - -#if HAVE_UNISTD_H -#include -#endif - -#ifdef BSD42 -#define SEEK_SET L_SET -#endif - -#if STDC_HEADERS || HAVE_STRING_H -#include -/* An ANSI string.h and pre-ANSI memory.h might conflict. */ -#if !STDC_HEADERS && HAVE_MEMORY_H -#include -#endif /* not STDC_HEADERS and HAVE_MEMORY_H */ -#define index strchr -#define rindex strrchr -#define bcopy(s, d, n) memcpy ((d), (s), (n)) -#define bcmp(s1, s2, n) memcmp ((s1), (s2), (n)) -#define bzero(s, n) memset ((s), 0, (n)) -#else /* not STDC_HEADERS and not HAVE_STRING_H */ -#include -/* memory.h and strings.h conflict on some systems. */ -#endif /* not STDC_HEADERS and not HAVE_STRING_H */ - -/* - * important tuning parms (hah) - */ - -#define SEEDUPS /* always detect duplicates */ -#define BADMESS /* generate a message for worst case: - cannot make room after SPLTMAX splits */ -/* - * misc - */ -#ifdef DEBUG -#define debug(x) printf x -#else -#define debug(x) -#endif diff -Nru acm-5.0/dis/sdbm/util.c acm-6.0+20200416/dis/sdbm/util.c --- acm-5.0/dis/sdbm/util.c 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/dis/sdbm/util.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,51 +0,0 @@ -#include -#include -#include -#ifdef SDBM -#include "sdbm.h" -#else -#include "ndbm.h" -#endif - -void -oops(s1, s2) -register char *s1; -register char *s2; -{ - extern int errno, sys_nerr; - extern char *progname; - - if (progname) - fprintf(stderr, "%s: ", progname); - fprintf(stderr, s1, s2); - if (errno > 0) - perror("Error"); - fprintf(stderr, "\n"); - exit(1); -} - -int -okpage(pag) -char *pag; -{ - register unsigned n; - register off; - register short *ino = (short *) pag; - - if ((n = ino[0]) > PBLKSIZ / sizeof(short)) - return 0; - - if (!n) - return 1; - - off = PBLKSIZ; - for (ino++; n; ino += 2) { - if (ino[0] > off || ino[1] > off || - ino[1] > ino[0]) - return 0; - off = ino[1]; - n -= 2; - } - - return 1; -} diff -Nru acm-5.0/dis/server/db.c acm-6.0+20200416/dis/server/db.c --- acm-5.0/dis/server/db.c 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/dis/server/db.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,120 +0,0 @@ -/* - * DIS/x : An implementation of the IEEE 1278.1 protocol - * - * Copyright (C) 1996, Riley Rainey (rainey@netcom.com) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of either: - * - * a) the GNU Library General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your - * option) any later version. A description of the terms and conditions - * of the GLPL may be found in the "COPYING.LIB" file. - * - * b) the "Artistic License" which comes with this Kit. Information - * about this license may be found in the "Artistic" file. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License or the Artistic License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the Free - * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * Information describing how to contact the author can be found in the - * README file. - */ -#ifdef HAVE_NDBM -#include -#else -#include -#endif -#include -#include -#ifdef HAVE_FCNTL_H -#include -#endif -#include -#include -#include - -DBM *entities; - -int -OpenDatabase () -{ - entities = dbm_open ("dis-entities", O_RDONLY, 0644); - if (!entities) { - entities = dbm_open ("../data/dis-entities", O_RDONLY, 0644); - if (!entities) { - fprintf (stderr, "Unable to open dis-entities database\n"); - fprintf (stderr, "Perhaps simxd was run from the wrong directory\n"); - exit (1); - } - } - return 0; -} - -int -FetchEntity (dis_entity_type *id, char *s, int size) -{ - datum key, value; - int i; - - key.dptr = (char *) id; - key.dsize = sizeof (dis_entity_type); - - value = dbm_fetch (entities, key); - if (value.dptr) { - memcpy (s, value.dptr, size); - -- size; - i = value.dsize > size ? size : value.dsize; - s[i] = '\0'; - return 0; - } - return -1; -} - -/* - * Under construction. - */ - -int -FindEntity (char * pattern, dis_entity_type * match, - char * s, int size) -{ - datum key, value; - char *p; - int len; - static char *pat; - - if (pattern) { - key = dbm_firstkey (entities); - if (pat) { - free (pat); - } - pat = strdup (pattern); - } - else { - key = dbm_nextkey (entities); - } - - len = strlen(pat); - - for ( ; key.dptr ; key = dbm_nextkey(entities)) { - value = dbm_fetch (entities, key); - if ((p = strchr (value.dptr, *pattern)) != NULL) { - if (strncasecmp (p, pattern, len) == 0) { - memcpy (key.dptr, match, - sizeof (dis_entity_type)); - strncpy (s, value.dptr, size); - return 1; - } - } - } - - *s = '\0'; - return 0; -} diff -Nru acm-5.0/dis/server/dis_relay.c acm-6.0+20200416/dis/server/dis_relay.c --- acm-5.0/dis/server/dis_relay.c 1998-05-22 17:56:07.000000000 +0000 +++ acm-6.0+20200416/dis/server/dis_relay.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,154 +0,0 @@ -/* - * DIS/x : An implementation of the IEEE 1278.1 protocol - * - * Copyright (C) 1996, Riley Rainey (rainey@netcom.com) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of either: - * - * a) the GNU Library General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your - * option) any later version. A description of the terms and conditions - * of the GLPL may be found in the "COPYING.LIB" file. - * - * b) the "Artistic License" which comes with this Kit. Information - * about this license may be found in the "Artistic" file. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License or the Artistic License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the Free - * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * Information describing how to contact the author can be found in the - * README file. - */ -#include -#include -#include -#include -#include -#define BSD_COMP /* keeps Solaris happy */ -#include -#include -#include -#include - -SwitchClient *client_list = 0; - -#if SYSCALL_PROTO -extern int recvmsg(int, struct msghdr *, int); -extern int sendmsg(int, struct msghdr *, int); -extern int socket(int domain, int type, int protocol); -extern int setsockopt(int s, int level, int optname, char *optval, int optlen); -extern int bind(int s, struct sockaddr *name, int namelen); -extern int ioctl(int, int,...); -extern void perror(const char *); -extern void bcopy(const void *, void *, int); -#endif - -int -ReadPDUFrame(DISTransceiver * xcvr, char *pdu, int pdu_max, struct sockaddr *from) -{ - int size; - struct msghdr msg; - struct iovec vec; - - msg.msg_name = (caddr_t) from; - msg.msg_namelen = sizeof(struct sockaddr); - msg.msg_iov = &vec; - msg.msg_iovlen = 1; -#ifdef HAVE_MSG_CONTROL - msg.msg_control = (caddr_t) NULL; - msg.msg_controllen = 0; -#endif -#ifdef HAVE_MSG_ACCRIGHTS - msg.msg_accrights = (caddr_t) NULL; - msg.msg_accrightslen = 0; -#endif - vec.iov_base = (caddr_t) pdu; - vec.iov_len = pdu_max; - - size = recvmsg(xcvr->s, &msg, 0); - - return size; -} - -int -WritePDU(DISTransceiver * xcvr, char *buffer, int length, struct sockaddr *to) -{ - char *p; - struct msghdr msg; - struct iovec vec; - int i, result; - - - msg.msg_namelen = sizeof(struct sockaddr); - msg.msg_iov = &vec; - msg.msg_iovlen = 1; -#ifdef HAVE_MSG_CONTROL - msg.msg_control = (caddr_t) NULL; - msg.msg_controllen = 0; -#endif -#ifdef HAVE_MSG_ACCRIGHTS - msg.msg_accrights = (caddr_t) NULL; - msg.msg_accrightslen = 0; -#endif - vec.iov_base = (caddr_t) & buffer; - vec.iov_len = length; - - msg.msg_name = (caddr_t) to; - if ((result = sendmsg(xcvr->s, &msg, 0)) == -1) { - perror("on sendmsg"); - } - - return 0; -} - -void -RelayPDUFrame(DISTransceiver * xcvr, char *buffer, int size, struct sockaddr *from) -{ - SwitchClient *p, *new; - int found = 0; - - for (p = client_list; p; p=p->next) { - if (memcmp(from, &p->addr, sizeof(struct sockaddr)) == 0) { - found = 1; - p->frame_count += 1; - } - else { - WritePDU(xcvr, buffer, size, &p->addr); - } - } - if (found == 0) { - if ((new = malloc(sizeof(SwitchClient)))) { - new->frame_count = 1; - memcpy(&new->addr, from, sizeof(struct sockaddr)); - new->next = client_list; - client_list = new; - } - else { - fprintf(stderr, "memory allocation error\n"); - exit(1); - } - } -} - -int -main(int argc, char **argv) -{ - DISTransceiver *xcvr; - struct sockaddr from; - int size; - char buf[2048]; - - xcvr = DISOpenTransceiver(-1); - while (1) { - if ((size = ReadPDUFrame(xcvr, buf, sizeof(buf), &from)) > 0) { - RelayPDUFrame(xcvr, buf, size, &from); - } - } -} diff -Nru acm-5.0/dis/server/dis_relay.h acm-6.0+20200416/dis/server/dis_relay.h --- acm-5.0/dis/server/dis_relay.h 1995-12-21 19:48:42.000000000 +0000 +++ acm-6.0+20200416/dis/server/dis_relay.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ -typedef struct _SwitchClient { - struct sockaddr addr; - unsigned long frame_count; - struct _SwitchClient *next; - } SwitchClient; - -extern SwitchClient *client_list; diff -Nru acm-5.0/dis/server/Makefile.in acm-6.0+20200416/dis/server/Makefile.in --- acm-5.0/dis/server/Makefile.in 1998-05-12 03:43:02.000000000 +0000 +++ acm-6.0+20200416/dis/server/Makefile.in 1970-01-01 00:00:00.000000000 +0000 @@ -1,53 +0,0 @@ -srcdir = @srcdir@ -prefix = @prefix@ -bindir = $(prefix)/bin - VPATH = @srcdir@ - SHELL = /bin/sh - - OBJS = simxd.o server.o sites.o db.o - SRCS = simxd.c server.c sites.c db.c - OBJS2 = dis_relay.o - CC = @CC@ -CFLAGS = -I$(srcdir)/.. -I.. -I../lib -I$(srcdir) -I. @SIMX_INCLUDES@ @CFLAGS@ @DEFS@ -LDFLAGS = @LDFLAGS@ - LIBS = -L../lib -ldis @DBM@ -RPCGEN = rpcgen - -# Programs to make tags files. - ETAGS = etags -tw - CTAGS = ctags -tw -tagsrcs = $(SRCS) - -all: simxd dis_relay - -simxd.c: ../lib/simmgr.h ../lib/simmgr.x - rm -f $@ - $(RPCGEN) -s udp -o $@ $(srcdir)/../lib/simmgr.x - mv $@ tmp.c - perl -p -e 's/\#include .*simmgr.h"$$/#include "simmgr.h"/' $@ - rm -f tmp.c - -simxd: $(OBJS) ../lib/libdis.a - $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(OBJS) $(LIBS) - -dis_relay: $(OBJS2) ../lib/libdis.a - $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(OBJS2) $(LIBS) - -clean: - rm -rf simxd *.o core simxd.c ../lib/simmgr.h TAGS tags *.bak dis_relay - -distclean: clean - rm -f Makefile - -depend: - makedepend $(CFLAGS) $(SRCS) - -TAGS: $(tagsrcs) - $(ETAGS) $(tagsrcs) - -tags: $(tagsrcs) - $(CTAGS) $(tagsrcs) - -check test: - -# DO NOT DELETE THIS LINE -- make depend depends on it. diff -Nru acm-5.0/dis/server/server.c acm-6.0+20200416/dis/server/server.c --- acm-5.0/dis/server/server.c 1998-05-12 03:43:02.000000000 +0000 +++ acm-6.0+20200416/dis/server/server.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,236 +0,0 @@ -/* - * DIS/x : An implementation of the IEEE 1278.1 protocol - * - * Copyright (C) 1996, Riley Rainey (rainey@netcom.com) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of either: - * - * a) the GNU Library General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your - * option) any later version. A description of the terms and conditions - * of the GLPL may be found in the "COPYING.LIB" file. - * - * b) the "Artistic License" which comes with this Kit. Information - * about this license may be found in the "Artistic" file. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License or the Artistic License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the Free - * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * Information describing how to contact the author can be found in the - * README file. - */ -#include -#include -#include "simmgr.h" -#include -#include - -#define SIMX_TOP_APPL_ID 0xfffd; - -unsigned short site_id = 1; -unsigned short application_id = SIMX_TOP_APPL_ID; - - -extern int FetchEntity (dis_entity_type *, char *, int); -extern int OpenDatabase(void); -extern simx_site_info *LocateSiteByName(char *); - -static int init = 0; - -simx_lookup_entity_type_result * -#ifdef HAVE_NEW_RPCGEN -simxlookupentitynamep_1_svc -#else -simxlookupentitynamep_1 -#endif -(dis_entity_type *p, struct svc_req *req) -{ - static simx_lookup_entity_type_result res; - char s[1024]; - -#ifdef DEBUG - printf ("Entity lookup : "); - PrintEntityType (p); - printf ("\n"); -#endif - - if (init == 0) { - if (OpenDatabase() != 0) { - exit (1); - } - init = 1; - } - - res.status_code = SIMx_SUCCESS; - res.value = s; - s[0] = '\0'; - if (FetchEntity(p, s, sizeof(s)) != 0) { - res.status_code = SIMx_NOT_FOUND; - } - return &res; -} - -simx_lookup_complete_entity_type_result * -#ifdef HAVE_NEW_RPCGEN -simxlookupentitynamesp_1_svc -#else -simxlookupentitynamesp_1 -#endif -(dis_entity_type *p, struct svc_req *req) -{ - static simx_lookup_complete_entity_type_result res; - char s[1024]; - int i = 6; - dis_entity_type e = *p, e1; - -#ifdef DEBUG - printf ("Entity Names lookup : "); - PrintEntityType (p); - printf ("\n"); -#endif - - if (init == 0) { - if (OpenDatabase() != 0) { - exit (1); - } - init = 1; - } - - s[0] = '\0'; - if (e.extra != 0 && FetchEntity(&e, s, sizeof(s)) == 0) { - res.extra_value = strdup(s); - } - else { - res.extra_value = strdup(""); - } - e.extra = 0; - - s[0] = '\0'; - if (e.specific != 0 && FetchEntity(&e, s, sizeof(s)) == 0) { - res.specific_value = strdup(s); - } - else { - res.specific_value = strdup(""); - } - e.specific = 0; - - s[0] = '\0'; - if (e.subcategory != 0 && FetchEntity(&e, s, sizeof(s)) == 0) { - res.subcategory_value = strdup(s); - } - else { - res.subcategory_value = strdup(""); - } - e.subcategory = 0; - - s[0] = '\0'; - if (e.category != 0 && FetchEntity(&e, s, sizeof(s)) == 0) { - res.category_value = strdup(s); - } - else { - res.category_value = strdup(""); - } - e.category = 0; - -/* - * Country names are stored in the entity database, as well. - * Their keys have the country code set with everything else zeroed. - */ - - e1 = e; - e1.kind = 0; - e1.domain = 0; - res.country_value = strdup(""); - s[0] = '\0'; - if (e1.country != 0 && FetchEntity(&e1, s, sizeof(s)) == 0) { - res.country_value = strdup(s); - } - else { - res.country_value = strdup(""); - } - e.country = 0; - - s[0] = '\0'; - if (e.domain != 0 && FetchEntity(&e, s, sizeof(s)) == 0) { - res.domain_value = strdup(s); - } - else { - res.domain_value = strdup(""); - } - e.domain = 0; - - s[0] = '\0'; - if (e.kind != 0 && FetchEntity(&e, s, sizeof(s)) == 0) { - res.kind_value = strdup(s); - } - else { - res.kind_value = strdup(""); - } - - res.status_code = SIMx_SUCCESS; - return &res; -} - - -dis_entity_type * -#ifdef HAVE_NEW_RPCGEN -simxlookupentitytypefrompatternp_1_svc (simx_string *foo, struct svc_req *bar) -#else -simxlookupentitytypefrompatternp_1 (simx_string *foo, struct svc_req *bar) -#endif -{ - return 0; -} - -simx_lookup_entity_type_result * -#ifdef HAVE_NEW_RPCGEN -simxlookupentityattributep_1_svc(simx_entity_type_attr *foo, struct svc_req *bar) -#else -simxlookupentityattributep_1(simx_entity_type_attr *foo, struct svc_req *bar) -#endif -{ return 0; } - -simx_register_app_result * -#ifdef HAVE_NEW_RPCGEN -simxregisterapplicationp_1_svc -#else -simxregisterapplicationp_1 -#endif -(simx_register_app_args *p, struct svc_req *req) -{ - static simx_register_app_result r; - simx_site_info *p1; - - r.status_code = SIMx_SUCCESS; - if (strcmp(p->site_name, "0x") == 0) { - r.result.site_id = atoi(p->site_name); - } - else { - p1 = LocateSiteByName (p->site_name); - r.result.site_id = p1->site_id; - r.result.application_id = p1->application_id--; - } - - if (r.result.application_id == 0) { - r.result.application_id = - p1->application_id = 0xfffd; - } - return &r; -} - -#ifdef DEBUG -void -PrintEntityType (dis_entity_type *p) -{ - printf ("%d.%d.%d.%d.%d.%d.%d", p->kind, p->domain, - p->country, p->category, p->subcategory, - p->specific, p->extra); -} -#endif diff -Nru acm-5.0/dis/server/server.h acm-6.0+20200416/dis/server/server.h --- acm-5.0/dis/server/server.h 1995-09-26 18:02:22.000000000 +0000 +++ acm-6.0+20200416/dis/server/server.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,8 +0,0 @@ -typedef struct _site { - struct _site *next; - char *name; - unsigned short site_id; - unsigned short application_id; - } simx_site_info; - -extern simx_site_info *head, *tail; diff -Nru acm-5.0/dis/server/sites.c acm-6.0+20200416/dis/server/sites.c --- acm-5.0/dis/server/sites.c 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/dis/server/sites.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,71 +0,0 @@ -/* - * DIS/x : An implementation of the IEEE 1278.1 protocol - * - * Copyright (C) 1996, Riley Rainey (rainey@netcom.com) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of either: - * - * a) the GNU Library General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your - * option) any later version. A description of the terms and conditions - * of the GLPL may be found in the "COPYING.LIB" file. - * - * b) the "Artistic License" which comes with this Kit. Information - * about this license may be found in the "Artistic" file. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License or the Artistic License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the Free - * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * Information describing how to contact the author can be found in the - * README file. - */ -#include -#include -#include -#ifdef HAVE_NDBM -#include -#else -#include -#endif - -DBM *sites; -static unsigned short site = 0xfffd; - -simx_site_info *head = 0, *tail = 0; - -simx_site_info * -LocateSiteByName (char * name) -{ - simx_site_info *p; - - for (p = head; p; p = p->next) { - if (strcmp (p->name, name) == 0) { - return p; - } - } - -/* - * Not found. Allocate a new information node. - */ - - p = (simx_site_info *) malloc (sizeof (simx_site_info)); - p->next = NULL; - if (tail) { - tail->next = p; - } - tail = p; - if (!head) { - head = p; - } - p->name = strdup (name); - p->application_id = 0xfffd; - p->site_id = site--; - return p; -} diff -Nru acm-5.0/dis/server/strcasecmp.c acm-6.0+20200416/dis/server/strcasecmp.c --- acm-5.0/dis/server/strcasecmp.c 1998-05-12 03:59:12.000000000 +0000 +++ acm-6.0+20200416/dis/server/strcasecmp.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,143 +0,0 @@ -/* - * DIS/x : An implementation of the IEEE 1278.1 protocol - * - * Copyright (C) 1996, Riley Rainey (rainey@netcom.com) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of either: - * - * a) the GNU Library General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your - * option) any later version. A description of the terms and conditions - * of the GLPL may be found in the "COPYING.LIB" file. - * - * b) the "Artistic License" which comes with this Kit. Information - * about this license may be found in the "Artistic" file. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License or the Artistic License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the Free - * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * Information describing how to contact the author can be found in the - * README file. - */ -/* - * Copyright (c) 1987 Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include - -#if defined(LIBC_SCCS) && !defined(lint) -/*static const char sccsid[] = "from: @(#)strcasecmp.c 5.10 (Berkeley) 1/26/91";*/ -static char *rcsid = "$Id: strcasecmp.c,v 1.2 1998/05/12 03:59:12 riley Exp $"; -#endif /* LIBC_SCCS and not lint */ - -typedef unsigned char u_char; - -/* - * This array is designed for mapping upper and lower case letter - * together for a case independent comparison. The mappings are - * based upon ascii character sequences. - */ -static const u_char charmap[] = { - '\000', '\001', '\002', '\003', '\004', '\005', '\006', '\007', - '\010', '\011', '\012', '\013', '\014', '\015', '\016', '\017', - '\020', '\021', '\022', '\023', '\024', '\025', '\026', '\027', - '\030', '\031', '\032', '\033', '\034', '\035', '\036', '\037', - '\040', '\041', '\042', '\043', '\044', '\045', '\046', '\047', - '\050', '\051', '\052', '\053', '\054', '\055', '\056', '\057', - '\060', '\061', '\062', '\063', '\064', '\065', '\066', '\067', - '\070', '\071', '\072', '\073', '\074', '\075', '\076', '\077', - '\100', '\141', '\142', '\143', '\144', '\145', '\146', '\147', - '\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157', - '\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167', - '\170', '\171', '\172', '\133', '\134', '\135', '\136', '\137', - '\140', '\141', '\142', '\143', '\144', '\145', '\146', '\147', - '\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157', - '\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167', - '\170', '\171', '\172', '\173', '\174', '\175', '\176', '\177', - '\200', '\201', '\202', '\203', '\204', '\205', '\206', '\207', - '\210', '\211', '\212', '\213', '\214', '\215', '\216', '\217', - '\220', '\221', '\222', '\223', '\224', '\225', '\226', '\227', - '\230', '\231', '\232', '\233', '\234', '\235', '\236', '\237', - '\240', '\241', '\242', '\243', '\244', '\245', '\246', '\247', - '\250', '\251', '\252', '\253', '\254', '\255', '\256', '\257', - '\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267', - '\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277', - '\300', '\301', '\302', '\303', '\304', '\305', '\306', '\307', - '\310', '\311', '\312', '\313', '\314', '\315', '\316', '\317', - '\320', '\321', '\322', '\323', '\324', '\325', '\326', '\327', - '\330', '\331', '\332', '\333', '\334', '\335', '\336', '\337', - '\340', '\341', '\342', '\343', '\344', '\345', '\346', '\347', - '\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357', - '\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367', - '\370', '\371', '\372', '\373', '\374', '\375', '\376', '\377', -}; - -int -strcasecmp(s1, s2) - const char *s1, *s2; -{ - register const u_char *cm = charmap, - *us1 = (const u_char *)s1, - *us2 = (const u_char *)s2; - - while (cm[*us1] == cm[*us2++]) - if (*us1++ == '\0') - return (0); - return (cm[*us1] - cm[*--us2]); -} - -int -strncasecmp(s1, s2, n) - const char *s1, *s2; - register size_t n; -{ - if (n != 0) { - register const u_char *cm = charmap, - *us1 = (const u_char *)s1, - *us2 = (const u_char *)s2; - - do { - if (cm[*us1] != cm[*us2++]) - return (cm[*us1] - cm[*--us2]); - if (*us1++ == '\0') - break; - } while (--n != 0); - } - return (0); -} diff -Nru acm-5.0/dis/test/decoy.c acm-6.0+20200416/dis/test/decoy.c --- acm-5.0/dis/test/decoy.c 1998-12-23 22:29:19.000000000 +0000 +++ acm-6.0+20200416/dis/test/decoy.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,394 +0,0 @@ -#include -#include -#include -#include -#include -#include - -/* - * GNU C library includes getopt_long() - */ - -#ifdef __GNU_LIBRARY__ -#include -#endif - -#include -#include - -void MatrixToEuler(VMatrix * mt, double *heading, double *pitch, double *roll); -void BuildEulerMatrix(double roll, double pitch, double heading, VMatrix * m); -void GenerateWorldToLocalMatrix(WorldCoordinates * w, VMatrix * m); -dis_timestamp TimeDoubleToDIS(double time, int reference); -void transpose(VMatrix * m, VMatrix * r); - -static struct itimerval it, ot; - -#define FEETtoMETERS(x) ((x) * 0.3048) - -void -timer_alarm (int val) -{ -} - -#define OPT_SITE 1 -#define OPT_APPL 2 -#define OPT_ENTITY 3 -#define OPT_LATITUDE 4 -#define OPT_LONGITUDE 5 -#define OPT_ALTITUDE 6 -#define OPT_ETYPE 7 - -#ifdef __GNU_LIBRARY__ - -/* - * long command line options - */ - -static struct option long_options[] = -{ - { "site-id", 1, 0, 's' }, - { "appl-id", 1, 0, 'a' }, - { "entity-id", 1, 0, 'e' }, - { "latitude", 1, 0, 'l' }, - { "longitude", 1, 0, 'L' }, - { "altitude", 1, 0, 'A' }, - { "entity-type", 1, 0, 't' }, - { "exercise-id", 1, 0, 'E' }, - { "force-id", 1, 0, 'f' }, -}; - -#endif - -int -main(int argc, char **argv) -{ - - struct sigaction sa, old_sa; - struct timeval curtime; - int status; - pid_t pid; - int c; - int exercise_id = 1; - double unix_time_sec; - int option_index = 0; - - - VMatrix XYZtoNED, NEDtoXYZ, trihedral, ABCtoXYZ; - double orientation[3]; - VPoint velocity = { 0, 0, 0 }; - - dis_pdu estate, em; - dis_entity_state_pdu *esPDU; - DISxApplicationInfo * app; - WorldCoordinates pos; - - memset (&estate, 0, sizeof(dis_pdu)); - memset (&em, 0, sizeof(dis_pdu)); - - /* - * Fill out PDUs - */ - - esPDU = (dis_entity_state_pdu *) &estate; - esPDU->id.sim_id.site_id = 1; - esPDU->id.sim_id.application_id = 1; - esPDU->id.entity_id = 1; - esPDU->force_id = 1; - - esPDU->hdr.protocol_version; - esPDU->hdr.exercise_id = 1; - esPDU->hdr.pdu_type = PDUTypeEntityState; - esPDU->hdr.protocol_family; - esPDU->hdr.time_stamp; - esPDU->hdr.length; - esPDU->hdr.padding; - - /* - * SA-13 SAM launcher - */ - - esPDU->type.kind = 1; - esPDU->type.domain = 1; - esPDU->type.country = 222; - esPDU->type.category = 4; - esPDU->type.subcategory = 21; - esPDU->type.specific = 1; - - /* - * process command line arguments - */ - - while (1) { - -#ifdef __GNU_LIBRARY__ - c = getopt_long ( argc, argv, "f:a:s:bc:d:012", - long_options, &option_index ); -#else - c = getopt ( argc, argv, "f:a:s:bc:d:" ); -#endif - - if (c == -1) { - break; - } - - switch (c) { - case 'f': - estate.entity_state.force_id = atoi(optarg); - break; - case 'a': - estate.entity_state.id.sim_id.application_id = atoi(optarg); - break; - case 's': - estate.entity_state.id.sim_id.site_id = atoi(optarg); - break; - case 'e': - estate.entity_state.id.entity_id = atoi(optarg); - break; - case 'E': - exercise_id = atoi(optarg); - break; - case 'l': - pos.latitude = DEGtoRAD(atof(optarg)); - break; - case 'L': - pos.longitude = DEGtoRAD(atof(optarg)); - break; - case 'A': - pos.z = FEETtoMETERS(atof(optarg)); - break; - case 't': - break; - } - } - - memset ( &sa, 0, sizeof(sa) ); - sa.sa_handler = timer_alarm; -#ifdef linux - sa.sa_flags = SA_NOMASK; -#endif - - it.it_interval.tv_sec = 3; - it.it_interval.tv_usec = 0; - it.it_value.tv_sec = 3; - it.it_value.tv_usec = 0; - - if (sigaction( SIGALRM, &sa, &old_sa )) { - perror( "sigaction failed" ); - exit ( 1 ); - } - - if (setitimer( ITIMER_REAL, &it, &ot )) { - perror ( "setitimer failed" ); - exit ( 1 ); - } - - app = DISxInitializeApplication( 1, - estate.entity_state.id.sim_id.site_id, - estate.entity_state.id.sim_id.application_id ); - - /* - * loop until interrupted ... - */ - - while (1) { - - gettimeofday( &curtime, NULL ); - - unix_time_sec = (double) curtime.tv_sec + - (double) curtime.tv_usec / 1000000.0; - - esPDU->hdr.time_stamp = TimeDoubleToDIS( unix_time_sec, 1 ); - - /* esPDU->id already set */ - - esPDU->force_id = DISForceOpposing; - - esPDU->art_parm_count = 0; - - DISWorldCoordinatesToGeocentric( &pos, &esPDU->pos ); - BuildEulerMatrix (0.0, 0.0, 0.0, &trihedral); - GenerateWorldToLocalMatrix ( &pos, &XYZtoNED ); - - /* - * Derive ECI [Geocentric] heading, pitch, roll - */ - transpose(&XYZtoNED, &NEDtoXYZ); - /* the trihedral is an "ABCtoNED" transformation */ - VMatrixMultByRank(&trihedral, &NEDtoXYZ, &ABCtoXYZ, 3); - MatrixToEuler(&ABCtoXYZ, - &orientation[0], - &orientation[1], - &orientation[2]); - - esPDU->vel.x = velocity.x; - esPDU->vel.y = velocity.y; - esPDU->vel.z = velocity.z; - - esPDU->orientation.psi = orientation[0]; - esPDU->orientation.theta = orientation[1]; - esPDU->orientation.phi = orientation[2]; - - esPDU->appearance = ( DISAppearancePaintUniform | - DISAppearanceFirepowerNormal | - DISAppearanceHatchClosed | - DISAppearanceLandLauncherRaised ); - - esPDU->dr_parm.algorithm = DISDRMethodRVW; - - esPDU->dr_parm.linear_acc.x = 0.0f; - esPDU->dr_parm.linear_acc.y = 0.0f; - esPDU->dr_parm.linear_acc.z = 0.0f; - - esPDU->dr_parm.angular_vel.x = 0.0f; - esPDU->dr_parm.angular_vel.y = 0.0f; - esPDU->dr_parm.angular_vel.z = 0.0f; - - esPDU->marking.charset = DISCharSetASCII; - memset(esPDU->marking.marking, 0, sizeof(esPDU->marking.marking)); - strcpy(esPDU->marking.marking, "HI THERE"); - esPDU->capabilities = 0; - esPDU->art_parm = NULL; - - if (DISxWritePDU(app, (dis_pdu *) esPDU) != 0) { - printf ( "error writing PDU\n" ); - } - else { - printf ( "." ); - fflush ( stdout ); - } - - pause(); - } -} - -/* - * Generate a transform matrix to get from geocentric to local NED coordinates - */ - -void -GenerateWorldToLocalMatrix(WorldCoordinates * w, VMatrix * m) -{ - dis_world_coordinates gc; - VPoint p; - - VIdentMatrix(m); - VRotate(m, ZRotation, -w->longitude); - VRotate(m, YRotation, -w->latitude); - VRotate(m, YRotation, -DEGtoRAD(90.0)); - DISWorldCoordinatesToGeocentric(w, &gc); - VTransform((VPoint *) & gc, m, &p); - m->m[0][3] = -p.x; - m->m[1][3] = -p.y; - m->m[2][3] = -p.z; -} - -void -BuildEulerMatrix(double roll, double pitch, double heading, VMatrix * m) -{ - - register double sinPhi, cosPhi, sinTheta, cosTheta, sinPsi, cosPsi; - - sinPhi = sin(roll); - cosPhi = cos(roll); - sinTheta = sin(pitch); - cosTheta = cos(pitch); - sinPsi = sin(heading); - cosPsi = cos(heading); - - m->m[0][0] = cosTheta * cosPsi; - m->m[0][1] = sinPhi * sinTheta * cosPsi - cosPhi * sinPsi; - m->m[0][2] = cosPhi * sinTheta * cosPsi + sinPhi * sinPsi; - m->m[1][0] = cosTheta * sinPsi; - m->m[1][1] = sinPhi * sinTheta * sinPsi + cosPhi * cosPsi; - m->m[1][2] = cosPhi * sinTheta * sinPsi - sinPhi * cosPsi; - m->m[2][0] = -sinTheta; - m->m[2][1] = sinPhi * cosTheta; - m->m[2][2] = cosPhi * cosTheta; - m->m[0][3] = m->m[1][3] = m->m[2][3] = 0.0; - m->m[3][0] = m->m[3][1] = m->m[3][2] = 0.0; - m->m[3][3] = 1.0; - -} - -/* - * Convert a transformation matrix into the equivalent - * heading, pitch and roll angles. - */ - -#define EPSILON 1.0e-6 - -void -MatrixToEuler(VMatrix * mt, double *heading, double *pitch, double *roll) -{ - double sin_theta; - - sin_theta = -mt->m[2][0]; - - if (fabs(sin_theta) > 1.0 - EPSILON) { - /* we have the nose pointing very close to straight up or straight down, - set roll to zero and compute the resulting heading */ - - *heading = atan2(-mt->m[0][1], mt->m[1][1]); - if (*heading < 0.0) - *heading += 2.0 * M_PI; - - if (sin_theta > 0.0) - *pitch = M_PI / 2.0; - else - *pitch = -M_PI / 2.0; - - *roll = 0.0; - } - else { - *heading = atan2(mt->m[1][0], mt->m[0][0]); - if (*heading < 0.0) - *heading += 2.0 * M_PI; - - *pitch = asin(sin_theta); - - *roll = atan2(mt->m[2][1], mt->m[2][2]); - } -} - -/* - * T i m e D o u b l e T o D I S - * - * Convert a double in UNIX format (seconds since 1970) to a DIS timestamp. - * If reference is 0, the time will be marked relative. - * If reference is 1, the time will be marked absolute, i.e. true UTC time. - */ - -dis_timestamp -TimeDoubleToDIS(double time, int reference) -{ - unsigned long tmp; - dis_timestamp res; - - tmp = (unsigned long) (fmod(time, 3600.0)); - if (tmp > 2147483647L) /* 2^31 - 1 */ - res.time = 2147483647L; - else - res.time = tmp; - res.type = reference; - - return res; -} - -void -transpose(VMatrix * m, VMatrix * r) -{ - - int i, j; - - for (i = 0; i < 4; ++i) - for (j = 0; j < 4; ++j) - r->m[i][j] = m->m[j][i]; -} - - - - - - - diff -Nru acm-5.0/dis/test/disscope.c acm-6.0+20200416/dis/test/disscope.c --- acm-5.0/dis/test/disscope.c 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/dis/test/disscope.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,366 +0,0 @@ -/* - * DIS/x : An implementation of the IEEE 1278.1 protocol - * - * Copyright (C) 1996, Riley Rainey (rainey@netcom.com) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of either: - * - * a) the GNU Library General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your - * option) any later version. A description of the terms and conditions - * of the GLPL may be found in the "COPYING.LIB" file. - * - * b) the "Artistic License" which comes with this Kit. Information - * about this license may be found in the "Artistic" file. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License or the Artistic License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the Free - * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * Information describing how to contact the author can be found in the - * README file. - */ -#include -#ifdef _DEBUG -#include -#endif -#ifndef WIN32 -#include -#endif -#include - -char * PDUName (dis_pdu *pdu); -void PrintEntityType (); -void PrintEntityTypeName (); -void PrintEntityID (); -void PrintEmitterSystem (); - -int -main () -{ - DISTransceiver *xcvr; - dis_pdu pdu; - struct timeval tm; - char buf[32]; - int i, count; - dis_simulation_addr my_addr; - dis_entity_type type; - char site[64]; - int code; -#ifdef WIN32 - WORD wVersionRequested; - WSADATA wsaData; - int err; - wVersionRequested = MAKEWORD(1, 1); - - err = WSAStartup(wVersionRequested, &wsaData); - - if (err != 0) { - fprintf (stderr, "Windows Sockets initialization failed.\n"); - exit (2); - } -#endif - - xcvr = DISOpenTransceiver(-1); - -#ifndef WIN32 - code = SIMxRegisterApplication ((char *) NULL, - SIMxGetSiteName(site, sizeof(site)), - 0, &my_addr); - if (code != 0) { - fprintf (stderr, "Error connecting to SIMx server: %d\n", code); - exit (1); - } -#endif - - printf ("%d broadcast interface(s) detected\n", xcvr->num_dest); - - count = 0; - while (1) { - DISReadPDU (xcvr, &pdu); - printf ("\npacket; type %d -- \"%s\" (%d bytes)\n", - pdu.hdr.pdu_type, PDUName(&pdu), pdu.hdr.length); - printf (" Version %d\n", pdu.hdr.protocol_version); - printf (" Family %d\n", pdu.hdr.protocol_family); - printf (" Exercise id %d\n", pdu.hdr.exercise_id); - DISTimestampToTimeval (&pdu.hdr.time_stamp, &tm); - printf (" Time stamp %d.%d\n", tm.tv_sec, - tm.tv_usec / 1000); - switch (pdu.hdr.pdu_type) { - case PDUTypeEntityState: - printf (" Entity (sim.app.eid) : %d/%d/%d\n", - pdu.entity_state.id.sim_id.site_id, - pdu.entity_state.id.sim_id.application_id, - pdu.entity_state.id.entity_id); - printf (" Entity type: "); - PrintEntityType (&pdu.entity_state.type); - printf (" ("); - PrintEntityTypeName (&pdu.entity_state.type); - printf (")\n"); - printf (" Geocentric Position (meters) : %.1f, %.1f, %.1f\n", - pdu.entity_state.pos.x, - pdu.entity_state.pos.y, - pdu.entity_state.pos.z); - printf (" Geocentric Velocity (meters/sec) : %.1f, %.1f, %.1f\n", - pdu.entity_state.vel.x, - pdu.entity_state.vel.y, - pdu.entity_state.vel.z); - printf (" Articulation parameters: %d\n", - pdu.entity_state.art_parm_count); - printf ("\n"); - break; - case PDUTypeDetonation: - printf (" Firing Entity (sim.app.eid) : "); - PrintEntityID (&pdu.detonation.firing_id); - printf ("\n Target Entity (sim.app.eid) : "); - PrintEntityID (&pdu.detonation.target_id); - printf ("\n Munition Entity (sim.app.eid) : "); - PrintEntityID (&pdu.detonation.munition_id); - printf ("\n\n"); - break; - case PDUTypeEmission: - printf (" Emitting Entity (sim.app.eid) : "); - PrintEntityID (&pdu.em_emission.emitter_id); - printf ("\n State Update Indicator : %d", - pdu.em_emission.state_update); - printf ("\n Number of Systems : %d\n", - pdu.em_emission.num_systems); - for (i=0; ihdr.pdu_type) { - case PDUTypeOther: - s = "Other"; - break; - case PDUTypeEntityState: - s = "Entity State"; - break; - case PDUTypeFire: - s = "Fire"; - break; - case PDUTypeDetonation: - s = "Detonation"; - break; - case PDUTypeCollision: - s = "Collision"; - break; - case PDUTypeServiceRequest: - s = "Service Request"; - break; - case PDUTypeResupplyOffer: - s = "Resupply Offer"; - break; - case PDUTypeResupplyReceived: - s = "Resupply Received"; - break; - case PDUTypeResupplyCancel: - s = "Resupply Cancel"; - break; - case PDUTypeRepairComplete: - s = "Repair Complete"; - break; - case PDUTypeRepairResponse: - s = "Repair Response"; - break; - case PDUTypeCreateEntity: - s = "Create Entity"; - break; - case PDUTypeRemoveEntity: - s = "Remove Entity"; - break; - case PDUTypeStartResume: - s = "Start/Resume"; - break; - case PDUTypeStopFreeze: - s = "Stop/Freeze"; - break; - case PDUTypeAcknowledge: - s = "Acknowledge"; - break; - case PDUTypeActionRequest: - s = "Action Request"; - break; - case PDUTypeActionResponse: - s = "Action Response"; - break; - case PDUTypeDataQuery: - s = "Data Query"; - break; - case PDUTypeSetData: - s = "Set Data"; - break; - case PDUTypeData: - s = "Data"; - break; - case PDUTypeEventReport: - s = "Event Report"; - break; - case PDUTypeMessage: - s = "Message"; - break; - case PDUTypeEmission: - s = "EM Emission"; - break; - case PDUTypeLaser: - s = "Designator"; - break; - case PDUTypeTransmitter: - s = "Transmitter"; - break; - case PDUTypeSignal: - s = "Signal"; - break; - case PDUTypeReceiver: - s = "Receiver"; - break; - case PDUTypeTransferControl: - s = "Transfer Control"; - break; - } - return s; -} - -void -PrintEntityType (dis_entity_type *p) -{ - printf ("%d.%d.%d.%d.%d.%d.%d", p->kind, p->domain, - p->country, p->category, p->subcategory, - p->specific, p->extra); -} - -void -PrintEntityID (dis_entity_id *p) -{ - printf ("%d.%d.%d", p->sim_id.site_id, - p->sim_id.application_id, - p->entity_id); -} - -void -PrintEntityTypeName (dis_entity_type *p) -{ -#ifndef WIN32 - char res[8][64]; - char *r[8]; - r[0] = &res[0][0]; - r[1] = &res[1][0]; - r[2] = &res[2][0]; - r[3] = &res[3][0]; - r[4] = &res[4][0]; - r[5] = &res[5][0]; - r[6] = &res[6][0]; - r[7] = &res[7][0]; - - SIMxLookupEntityNames(p, r, 64); - printf ("%s/%s/%s/%s/%s/%s", r[0], r[1], r[2], r[3], r[4], r[5]); -#endif -} - -void -PrintEmitterSystem (dis_em_system_info *p) -{ - dis_emitter_system *p1 = &p->emitter_system; - char *s; - int i; - - switch (p1->function) { - case DISEmitterFuncUnknown: - s = "Unknown"; - break; - case DISEmitterFuncLandBasedAirDefense: - s = "Land Based Air Defense"; - break; - case DISEmitterFuncBattlefieldAndGroundSurveillance: - s = "Battlefield And Ground Surveillance"; - break; - case DISEmitterFuncNavalSurveillanceAndNavigation: - s = "Naval Surveillance And Navigation"; - break; - case DISEmitterFuncNavalFireControl: - s = "Naval Fire Control"; - break; - case DISEmitterFuncAirborneSurveillance: - s = "Airborne Surveillance"; - break; - case DISEmitterFuncAirborneFireControl: - s = "Airborne Fire Control"; - break; - case DISEmitterFuncSpaceborne: - s = "Spaceborne"; - break; - case DISEmitterFuncATCInstrumentationAndRanging: - s = "ATC Instrumentation And Ranging"; - break; - case DISEmitterFuncWeather: - s = "Weather"; - break; - case DISEmitterFuncMissileGuidance: - s = "Missile Guidance"; - break; - case DISEmitterFuncJamming: - s = "Jamming"; - break; - default: - s = "Unknown*"; - break; - } - printf (" %s (%d, %d) (system data length = %d)\n", s, p1->name, p1->id, - p->sys_data_length); - for (i=0; inum_beams; ++i) { - printf (" beam %d: length %d; targets %d\n", p->beam[i].beam_id, - p->beam[i].beam_data_length, p->beam[i].num_targets); - } -} - - diff -Nru acm-5.0/dis/test/disscope.mak acm-6.0+20200416/dis/test/disscope.mak --- acm-5.0/dis/test/disscope.mak 1996-10-17 03:01:50.000000000 +0000 +++ acm-6.0+20200416/dis/test/disscope.mak 1970-01-01 00:00:00.000000000 +0000 @@ -1,212 +0,0 @@ -# Microsoft Developer Studio Generated NMAKE File, Format Version 4.10 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -!IF "$(CFG)" == "" -CFG=disscope - Win32 Debug -!MESSAGE No configuration specified. Defaulting to disscope - Win32 Debug. -!ENDIF - -!IF "$(CFG)" != "disscope - Win32 Release" && "$(CFG)" !=\ - "disscope - Win32 Debug" -!MESSAGE Invalid configuration "$(CFG)" specified. -!MESSAGE You can specify a configuration when running NMAKE on this makefile -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "disscope.mak" CFG="disscope - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "disscope - Win32 Release" (based on\ - "Win32 (x86) Console Application") -!MESSAGE "disscope - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE -!ERROR An invalid configuration is specified. -!ENDIF - -!IF "$(OS)" == "Windows_NT" -NULL= -!ELSE -NULL=nul -!ENDIF -################################################################################ -# Begin Project -# PROP Target_Last_Scanned "disscope - Win32 Debug" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "disscope - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Target_Dir "" -OUTDIR=.\Release -INTDIR=.\Release - -ALL : "$(OUTDIR)\disscope.exe" - -CLEAN : - -@erase "$(INTDIR)\disscope.obj" - -@erase "$(OUTDIR)\disscope.exe" - -"$(OUTDIR)" : - if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" - -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /YX /c -# ADD CPP /nologo /W3 /GX /O2 /I "d:\msdev\include" /I "c:\include" /I ".." /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /YX /c -CPP_PROJ=/nologo /ML /W3 /GX /O2 /I "d:\msdev\include" /I "c:\include" /I ".."\ - /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /Fp"$(INTDIR)/disscope.pch" /YX\ - /Fo"$(INTDIR)/" /c -CPP_OBJS=.\Release/ -CPP_SBRS=.\. -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -BSC32_FLAGS=/nologo /o"$(OUTDIR)/disscope.bsc" -BSC32_SBRS= \ - -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 ..\lib\Release\dis.lib c:\rpc\Release\oncrpc.lib wsock32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -LINK32_FLAGS=..\lib\Release\dis.lib c:\rpc\Release\oncrpc.lib wsock32.lib\ - kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib\ - shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo\ - /subsystem:console /incremental:no /pdb:"$(OUTDIR)/disscope.pdb" /machine:I386\ - /out:"$(OUTDIR)/disscope.exe" -LINK32_OBJS= \ - "$(INTDIR)\disscope.obj" - -"$(OUTDIR)\disscope.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) - $(LINK32) @<< - $(LINK32_FLAGS) $(LINK32_OBJS) -<< - -!ELSEIF "$(CFG)" == "disscope - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Target_Dir "" -OUTDIR=.\Debug -INTDIR=.\Debug - -ALL : "$(OUTDIR)\disscope.exe" - -CLEAN : - -@erase "$(INTDIR)\disscope.obj" - -@erase "$(INTDIR)\vc40.idb" - -@erase "$(INTDIR)\vc40.pdb" - -@erase "$(OUTDIR)\disscope.exe" - -@erase "$(OUTDIR)\disscope.ilk" - -@erase "$(OUTDIR)\disscope.pdb" - -"$(OUTDIR)" : - if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" - -# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /YX /c -# ADD CPP /nologo /W3 /Gm /GX /Zi /Od /I "d:\msdev\include" /I "c:\include" /I ".." /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /YX /c -CPP_PROJ=/nologo /MLd /W3 /Gm /GX /Zi /Od /I "d:\msdev\include" /I "c:\include"\ - /I ".." /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /Fp"$(INTDIR)/disscope.pch" /YX\ - /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c -CPP_OBJS=.\Debug/ -CPP_SBRS=.\. -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -BSC32_FLAGS=/nologo /o"$(OUTDIR)/disscope.bsc" -BSC32_SBRS= \ - -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 -# ADD LINK32 ..\lib\Debug\dis.lib c:\rpc\Debug\oncrpc.lib wsock32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 -LINK32_FLAGS=..\lib\Debug\dis.lib c:\rpc\Debug\oncrpc.lib wsock32.lib\ - kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib\ - shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo\ - /subsystem:console /incremental:yes /pdb:"$(OUTDIR)/disscope.pdb" /debug\ - /machine:I386 /out:"$(OUTDIR)/disscope.exe" -LINK32_OBJS= \ - "$(INTDIR)\disscope.obj" - -"$(OUTDIR)\disscope.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) - $(LINK32) @<< - $(LINK32_FLAGS) $(LINK32_OBJS) -<< - -!ENDIF - -.c{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.cpp{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.cxx{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.c{$(CPP_SBRS)}.sbr: - $(CPP) $(CPP_PROJ) $< - -.cpp{$(CPP_SBRS)}.sbr: - $(CPP) $(CPP_PROJ) $< - -.cxx{$(CPP_SBRS)}.sbr: - $(CPP) $(CPP_PROJ) $< - -################################################################################ -# Begin Target - -# Name "disscope - Win32 Release" -# Name "disscope - Win32 Debug" - -!IF "$(CFG)" == "disscope - Win32 Release" - -!ELSEIF "$(CFG)" == "disscope - Win32 Debug" - -!ENDIF - -################################################################################ -# Begin Source File - -SOURCE=.\disscope.c -DEP_CPP_DISSC=\ - "..\dis/datum.h"\ - "..\dis/dis.h"\ - "..\dis/disenum.h"\ - "..\dis/disenum2.h"\ - "..\dis/disenum3.h"\ - "..\dis/disp.h"\ - "..\dis/simx.h"\ - "\include\byte.h"\ - "\include\netinet\in.h"\ - "\include\rpc\types.h"\ - "\include\rpc\xdr.h"\ - "\include\sys\cdefs.h"\ - "\include\sys\time.h"\ - "d:\msdev\include\sys\types.h"\ - - -"$(INTDIR)\disscope.obj" : $(SOURCE) $(DEP_CPP_DISSC) "$(INTDIR)" - - -# End Source File -# End Target -# End Project -################################################################################ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/dis/test/disscope.mdp and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/dis/test/disscope.mdp differ diff -Nru acm-5.0/dis/test/Makefile.in acm-6.0+20200416/dis/test/Makefile.in --- acm-5.0/dis/test/Makefile.in 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/dis/test/Makefile.in 1970-01-01 00:00:00.000000000 +0000 @@ -1,40 +0,0 @@ - srcdir = @srcdir@ - VPATH = @srcdir@ - CFLAGS = -I$(srcdir)/.. -I.. -I../lib -I$(srcdir)/../../V/lib @CFLAGS@ - CC = @CC@ - SRCS = disscope.c simxtest.c tglobe.c - PTEST_OBJS = disscope.o -SIMXTEST_OBJS = simxtest.o - TGLOBE_OBJS = tglobe.o -DECOY_OBJS = decoy.o - LIBS = -L../lib -ldis -L../../V/lib -lV @LIBS@ - -all: disscope simxtest tglobe decoy - -disscope: $(PTEST_OBJS) ../lib/libdis.a - $(CC) $(CFLAGS) -o $@ $(PTEST_OBJS) $(LIBS) - -simxtest: $(SIMXTEST_OBJS) ../lib/libdis.a - $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(SIMXTEST_OBJS) $(LIBS) - -tglobe: $(TGLOBE_OBJS) ../lib/libdis.a - $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(TGLOBE_OBJS) $(LIBS) - -decoy: $(DECOY_OBJS) ../lib/libdis.a ../../V/lib/libV.a - $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(DECOY_OBJS) $(LIBS) - -depend: $(SRCS) - makedepend $(CFLAGS) $(SRCS) - -clean: - rm -rf *.bak *.o disscope simxtest core *~ tglobe decoy - -distclean: clean - rm -f Makefile - -test check: - @echo "All DIS/X tests are intended to be run manually" - -TAGS tags: - -# DO NOT DELETE THIS LINE -- make depend depends on it. diff -Nru acm-5.0/dis/test/run-tests acm-6.0+20200416/dis/test/run-tests --- acm-5.0/dis/test/run-tests 1996-01-04 17:27:06.000000000 +0000 +++ acm-6.0+20200416/dis/test/run-tests 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -#! /bin/sh - -cd ../data - -../server/simxd & - -pid=$! - -cd ../test - -if simxtest; then - echo test passed. - kill -9 $pid >/dev/null -else - echo test failed. - kill -9 $pid >/dev/null - exit 1 -fi diff -Nru acm-5.0/dis/test/simxtest.c acm-6.0+20200416/dis/test/simxtest.c --- acm-5.0/dis/test/simxtest.c 1995-12-21 19:46:28.000000000 +0000 +++ acm-6.0+20200416/dis/test/simxtest.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,74 +0,0 @@ -/* - * DIS/x : An implementation of the IEEE 1278.1 protocol - * - * Copyright (C) 1996, Riley Rainey (rainey@netcom.com) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of either: - * - * a) the GNU Library General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your - * option) any later version. A description of the terms and conditions - * of the GLPL may be found in the "COPYING.LIB" file. - * - * b) the "Artistic License" which comes with this Kit. Information - * about this license may be found in the "Artistic" file. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License or the Artistic License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the Free - * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * Information describing how to contact the author can be found in the - * README file. - */ -#include -#include -#include - -main () -{ - dis_simulation_addr my_addr; - dis_entity_type type; - int code; - char site[64]; - char name[256]; - char *names[7]; - int i; - - code = SIMxRegisterApplication ((char *) NULL, - SIMxGetSiteName(site, sizeof(site)), - 0, &my_addr); - if (code != 0) { - fprintf (stderr, "Error: %d\n", code); - exit (1); - } - printf ("address: %04x.%04x\n", my_addr.site_id, - my_addr.application_id); - - type.kind = 1; - type.domain = 2; - type.country = 225; - type.category = 2; - type.subcategory = 6; - type.specific = 2; - type.extra = 0; - - code = SIMxLookupEntityName (&type, name, sizeof(name)); - printf ("\nShould be an EA6-B : \"%s\" code = %d\n", name, code); - - for (i=0; i<7; ++i) { - names[i] = malloc(256); - } - code = SIMxLookupEntityNames (&type, names, 256); - printf ("\nShould be an EA6-B : code = %d\n", code); - for (i=0; i<7; ++i) { - printf ("\"%s\"\n", names[i]); - } - exit (0); - -} diff -Nru acm-5.0/dis/test/tglobe.c acm-6.0+20200416/dis/test/tglobe.c --- acm-5.0/dis/test/tglobe.c 1996-03-04 17:18:30.000000000 +0000 +++ acm-6.0+20200416/dis/test/tglobe.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,192 +0,0 @@ -#include -#include - -#define FEETtoMETERS(x) ((x) * 0.3048) -#define METERStoFEET(x) ((x) / 0.3048) -#define NM 6076.115 -#define WGS84_A 6378137.0 -#define WGS84_B 6356752.3141403558478 - - -void Height(), MyHeight(); - -main() -{ - WorldCoordinates loc, loc1; - dis_world_coordinates p; - char *sx, s1[64], s2[64]; - double geodetic_azimuth, c, s; - - /* base of KDEO tower on Oahu, HI */ - loc.latitude = DEGtoRAD(21.0 + (26 / 60.0) + (44 / 3600.0)); - loc.longitude = -DEGtoRAD(157.0 + (13 / 60.0) + (47 / 3600.0)); - loc.z = METERStoFEET(1047.0); - - DISWorldCoordinatesToGeocentric(&loc, &p); - printf(" Coordinates : %s %s\n", DISLatitudeToString(s1, loc.latitude, - LLM_DMS), DISLongitudeToString(s2, loc.longitude, LLM_DMS)); - printf("Geocentric Coordinates : %f %f %f\n\n", p.x, p.y, p.z); - DISGeocentricToWorldCoordinates (&p, &loc1); - printf("ICoordinates : %s %s\n", DISLatitudeToString(s1, loc1.latitude, - LLM_DMS), DISLongitudeToString(s2, loc1.longitude, LLM_DMS)); - - geodetic_azimuth = DEGtoRAD(0.0); - c = cos(geodetic_azimuth); - s = sin(geodetic_azimuth); - DISUpdateWorldCoordinates(&loc, c, s, FEETtoMETERS(1.0 * NM)); - - DISWorldCoordinatesToGeocentric(&loc, &p); - printf("North one nm\n"); - printf("Coordinates : %s %s\n", DISLatitudeToString(s1, loc.latitude, - LLM_DMS), DISLongitudeToString(s2, loc.longitude, LLM_DMS)); - printf("Geocentric Coordinates : %f %f %f\n\n", p.x, p.y, p.z); - - geodetic_azimuth = DEGtoRAD(90.0); - c = cos(geodetic_azimuth); - s = sin(geodetic_azimuth); - DISUpdateWorldCoordinates(&loc, c, s, FEETtoMETERS(1.0 * NM)); - - DISWorldCoordinatesToGeocentric(&loc, &p); - printf("East one nm\n"); - printf("Coordinates : %s %s\n", DISLatitudeToString(s1, loc.latitude, - LLM_DMS), DISLongitudeToString(s2, loc.longitude, LLM_DMS)); - printf("Geocentric Coordinates : %f %f %f\n\n", p.x, p.y, p.z); - - printf("\n---\n\n"); - - /* base of KDEO tower on Oahu, HI */ - - loc.latitude = DEGtoRAD(21.0 + (26 / 60.0) + (44 / 3600.0)); - loc.longitude = DEGtoRAD(157.0 + (13 / 60.0) + (47 / 3600.0)); - loc.z = FEETtoMETERS(1047.0); - - DISWorldCoordinatesToGeocentric(&loc, &p); - printf("Coordinates : %s %s\n", DISLatitudeToString(s1, loc.latitude, - LLM_DMS), DISLongitudeToString(s2, loc.longitude, LLM_DMS)); - printf("Geocentric Coordinates : %f %f %f\n\n", p.x, p.y, p.z); - - geodetic_azimuth = DEGtoRAD(0.0); - c = cos(geodetic_azimuth); - s = sin(geodetic_azimuth); - DISUpdateWorldCoordinates(&loc, c, s, FEETtoMETERS(1.0 * NM)); - - DISWorldCoordinatesToGeocentric(&loc, &p); - printf("North one nm\n"); - printf("Coordinates : %s %s\n", DISLatitudeToString(s1, loc.latitude, - LLM_DMS), DISLongitudeToString(s2, loc.longitude, LLM_DMS)); - printf("Geocentric Coordinates : %f %f %f\n\n", p.x, p.y, p.z); - - geodetic_azimuth = DEGtoRAD(90.0); - c = cos(geodetic_azimuth); - s = sin(geodetic_azimuth); - DISUpdateWorldCoordinates(&loc, c, s, FEETtoMETERS(1.0 * NM)); - - DISWorldCoordinatesToGeocentric(&loc, &p); - printf("East one nm\n"); - printf("Coordinates : %s %s\n", DISLatitudeToString(s1, loc.latitude, - LLM_DMS), DISLongitudeToString(s2, loc.longitude, LLM_DMS)); - printf("Geocentric Coordinates : %f %f %f\n\n", p.x, p.y, p.z); - - printf("\n---\n\n"); - - loc.latitude = DEGtoRAD(21.0 + (26 / 60.0) + (44 / 3600.0)); - loc.longitude = DEGtoRAD(57.0 + (13 / 60.0) + (47 / 3600.0)); - loc.z = FEETtoMETERS(1047.0); - - DISWorldCoordinatesToGeocentric(&loc, &p); - printf("Coordinates : %s %s\n", DISLatitudeToString(s1, loc.latitude, - LLM_DMS), DISLongitudeToString(s2, loc.longitude, LLM_DMS)); - printf("Geocentric Coordinates : %f %f %f\n\n", p.x, p.y, p.z); - - geodetic_azimuth = DEGtoRAD(0.0); - c = cos(geodetic_azimuth); - s = sin(geodetic_azimuth); - DISUpdateWorldCoordinates(&loc, c, s, FEETtoMETERS(1.0 * NM)); - - DISWorldCoordinatesToGeocentric(&loc, &p); - printf("North one nm\n"); - printf("Coordinates : %s %s\n", DISLatitudeToString(s1, loc.latitude, - LLM_DMS), DISLongitudeToString(s2, loc.longitude, LLM_DMS)); - printf("Geocentric Coordinates : %f %f %f\n\n", p.x, p.y, p.z); - - geodetic_azimuth = DEGtoRAD(90.0); - c = cos(geodetic_azimuth); - s = sin(geodetic_azimuth); - DISUpdateWorldCoordinates(&loc, c, s, FEETtoMETERS(1.0 * NM)); - - DISWorldCoordinatesToGeocentric(&loc, &p); - printf("East one nm\n"); - printf("Coordinates : %s %s\n", DISLatitudeToString(s1, loc.latitude, - LLM_DMS), DISLongitudeToString(s2, loc.longitude, LLM_DMS)); - printf("Geocentric Coordinates : %f %f %f\n\n", p.x, p.y, p.z); - - printf("\n---\n\n"); - - /* North Pole */ - - loc.latitude = DEGtoRAD(90.0); - loc.longitude = DEGtoRAD(0.0); - loc.z = 0.0; - - DISWorldCoordinatesToGeocentric(&loc, &p); - printf("Coordinates : %s %s\n", DISLatitudeToString(s1, loc.latitude, - LLM_DMS), DISLongitudeToString(s2, loc.longitude, LLM_DMS)); - printf("Geocentric Coordinates : %f %f %f\n\n", p.x, p.y, p.z); - - geodetic_azimuth = DEGtoRAD(180.0); - c = cos(geodetic_azimuth); - s = sin(geodetic_azimuth); - DISUpdateWorldCoordinates(&loc, c, s, FEETtoMETERS(1.0 * NM)); - - DISWorldCoordinatesToGeocentric(&loc, &p); - printf("South one nm\n"); - printf("Coordinates : %s %s\n", DISLatitudeToString(s1, loc.latitude, - LLM_DMS), DISLongitudeToString(s2, loc.longitude, LLM_DMS)); - printf("Geocentric Coordinates : %f %f %f\n\n", p.x, p.y, p.z); - - geodetic_azimuth = DEGtoRAD(90.0); - c = cos(geodetic_azimuth); - s = sin(geodetic_azimuth); - DISUpdateWorldCoordinates(&loc, c, s, FEETtoMETERS(1.0 * NM)); - - DISWorldCoordinatesToGeocentric(&loc, &p); - printf("East one nm\n"); - printf("Coordinates : %s %s\n", DISLatitudeToString(s1, loc.latitude, - LLM_DMS), DISLongitudeToString(s2, loc.longitude, LLM_DMS)); - printf("Geocentric Coordinates : %f %f %f\n\n", p.x, p.y, p.z); - - geodetic_azimuth = DEGtoRAD(0.0); - c = cos(geodetic_azimuth); - s = sin(geodetic_azimuth); - DISUpdateWorldCoordinates(&loc, c, s, FEETtoMETERS(1.0 * NM)); - - DISWorldCoordinatesToGeocentric(&loc, &p); - printf("North one nm\n"); - printf("Coordinates : %s %s\n", DISLatitudeToString(s1, loc.latitude, - LLM_DMS), DISLongitudeToString(s2, loc.longitude, LLM_DMS)); - printf("Geocentric Coordinates : %f %f %f\n\n", p.x, p.y, p.z); - - sx = "32-24-23.1N157-33-33.3W"; - printf ("Converting \"%s\":\n", sx); - DISStringToLatLong(sx, &loc); - printf("Coordinates : %s %s\n", DISLatitudeToString(s1, loc.latitude, - LLM_DMS), DISLongitudeToString(s2, loc.longitude, LLM_DMS)); - - sx = "32-24-23.5N157-33-33.5W"; - printf ("Converting \"%s\":\n", sx); - DISStringToLatLong(sx, &loc); - printf("Coordinates : %s %s\n", DISLatitudeToString(s1, loc.latitude, - LLM_DMS), DISLongitudeToString(s2, loc.longitude, LLM_DMS)); - - sx = "32-24-23.9N157-33-33.9W"; - printf ("Converting \"%s\":\n", sx); - DISStringToLatLong(sx, &loc); - printf("Coordinates : %s %s\n", DISLatitudeToString(s1, loc.latitude, - LLM_DMS), DISLongitudeToString(s2, loc.longitude, LLM_DMS)); - - sx = "32-24.25N157-33.3W"; - printf ("Converting \"%s\":\n", sx); - DISStringToLatLong(sx, &loc); - printf("Coordinates : %s %s\n", DISLatitudeToString(s1, loc.latitude, - LLM_DMS), DISLongitudeToString(s2, loc.longitude, LLM_DMS)); -} diff -Nru acm-5.0/doc/ACM-Bibliography acm-6.0+20200416/doc/ACM-Bibliography --- acm-5.0/doc/ACM-Bibliography 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/doc/ACM-Bibliography 2006-02-02 04:51:59.000000000 +0000 @@ -0,0 +1,40 @@ +Here is a list of my references for those looking for more detailed information +about modern air combat and the technical basis for this software. + +Good General References: [Spick87], [Sweet87] + +Air Combat Tactics: [Shaw85] + +Aerodynamics: [Huenecke87, [Blake91] + +Aircraft Performance Data: [Spick87], [AirI Aug92], [Blake91], + [Gunston80], [Chant81] + +Modern Air-to-Air Missiles: [Blake91], [Shaw85] + +--------- + +[Spick87] Spick, Mike. An Illustrated Guide to Modern Fighter Combat. + New York: Prentice Hall, 1987. + +[Sweet87] Sweetman, Bill, et al. The Great Book of Modern Warplanes. + New York: Portland House, 1987. + +[Shaw85] Shaw, Robert L. Fighter Combat. + Annapolis: Naval Institute Press, 1985. + +[Huenecke87] Huenecke, Klaus. Modern Combat Aircraft Design. + Trans. Airlife Publishing Ltd. Annapolis: Naval Institute + Press, 1987. + +[Blake91] Blakelock, John H. Automatic Control of Aircraft and Missiles. + New York: John Wiley and Sons, 1991. + +[Gunston80] Gunston, Bill. An Illustrated Guide to Modern Fighters and + Attack Aircraft. New York: Arco Publishing Inc., 1980. + +[Chant81] Chant, Chris (editor). Concise Guide to Military Aircraft of + the World. Feltham: Temple Press, 1981. + +[AirI Aug92] Braybrook, Roy. ``Rapidly Going Nowhere?'', Air International, + 43, No. 2 (1992), 67-74. diff -Nru acm-5.0/doc/acm.man acm-6.0+20200416/doc/acm.man --- acm-5.0/doc/acm.man 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/doc/acm.man 2017-10-30 02:45:06.000000000 +0000 @@ -0,0 +1,185 @@ +.TH ACM l "Oct 30, 2017" +.SH NAME +acm-5.0-ico \- an aerial combat simulator for X +.SH SYNOPSIS +.B acm +[ +.I options +] +.LP + +.SH DESCRIPTION + +acm-5.0-ico is a generic flight simulator and a distributed air combat +simulator that runs on the X window system. Players can engage in +simultaneous air combat from different computers. Players fly +jet aircraft equipped with radar, heat seeking missiles and cannon. + +Please read the complete manual in HTML format that comes with this +package, where more commands and more options are described. + + +.SH USAGE REFERENCE +.LP +The following command line options are recognized by acm (see full list in the +reference manual): +.LP +.TP +-version +Displays program version and copyright, then exit. +.TP +-plane MODEL +Select the aircraft type that you'd like to fly. Enter an invalid name (for +example "xxx") to see the list of the available models. +.TP +-frame-rate N +Limits the displayed frame rate to N frames per second. +.TP +-geometry GEOMETRY +An X compatible window geometry specification, typically something like +800x600+0+0. + +.SS Exit status: + +.TP +0 +Normal termination of the program. The reason for the termination of the program +is sent to standard output; nothing is written if the program terminated by +player's request. Some diagnostic message might be sent to standard error, +for example invalid DIS packet received or too many entities generated, but these +events are not fatal and do not indicate an error in the program. + +.TP +1 +Internal error, or invalid command line parameters, or system failure in providing +some service. Appropriate description of the error occurred is sent to standard error. + + + + +.SH ENGINE CONTROLS + + +The following keys control your engine thrust: + +.LP + 4 Full Power +.LP + 3 Increase Power (about 2 percent) +.LP + 2 Decrease Power (about the same amount) +.LP + 1 Idle Power +.LP + a Toggle Afterburner + +Your engine gauge displays the power that you are generating. Below that, +you have displays showing your total fuel remaining as well as your current +fuel consumption rate. + + +.SH KEYBOARD COMMAND LIST + +Stick and Rudder Controls + +.LP +The Mouse is your stick. It controls pitch and roll. +.LP +z -- Rudder Left +.LP +c -- Rudder Right +.LP +x -- Center the Rudder +.LP +SHIFT-E -- Toggle between stick direct control mode (default) and stick rate +control mode. + + + +Engine Controls + +.LP +4 -- Full Power +.LP +3 -- Increase Power +.LP +2 -- Decrease Power +.LP +1 -- Idle +.LP +a -- Toggle Afterburner State + + + +Radar Controls + +.LP +r -- Toggle Radar State (On/Standby) +.LP +q -- Target Designator + + + +Flaps + +.LP +h -- Extend 10 degrees +.LP +y -- Retract 10 degrees + + + +Speed Brakes + +.LP +s -- Extend +.LP +w -- Retract + + +Weapon Controls + +.LP +Mouse Button 1 -- Fire the selected weapon +.LP +Mouse Button 3 -- Select another weapon + + +Pitch Trim Controls + +.LP +u -- Set Take-off pitch trim +.LP +j -- Set pitch trim to the control stick's current pitch setting + + +Other Controls + +.LP +g -- Retract/Extend landing gear +.LP +l -- Launch a target drone +.LP +Shift-Q Shift-Q -- Self-Destruct (Quit the game) + + + +View Controls (Numeric Keypad) + +.LP +8 -- Forward +.LP +2 -- Aft +.LP +4 -- Left +.LP +6 -- Right +.LP +5 -- Up + + +.SH AUTHOR +Riley Rainey is the original author of acm-5.0. +Umberto Salsi made the enhancements published as +`acm-5.0-ico'. + Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/europe/france/degaulle.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/europe/france/degaulle.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/europe/france/france-ne.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/europe/france/france-ne.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/europe/france/france-nw.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/europe/france/france-nw.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/europe/france/france-se.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/europe/france/france-se.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/europe/france/france-sw.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/europe/france/france-sw.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/europe/france/lebourget.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/europe/france/lebourget.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/europe/france/paris.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/europe/france/paris.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/europe/germany/dusseldorf.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/europe/germany/dusseldorf.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/europe/germany/frankfurt.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/europe/germany/frankfurt.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/europe/germany/munich.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/europe/germany/munich.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/europe/italy/alghero-fertilia.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/europe/italy/alghero-fertilia.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/europe/italy/ancona-falconara.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/europe/italy/ancona-falconara.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/europe/italy/A.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/europe/italy/A.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/europe/italy/bari-palese.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/europe/italy/bari-palese.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/europe/italy/bergamo-orio-al-serio.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/europe/italy/bergamo-orio-al-serio.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/europe/italy/bologna-borgopanigale.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/europe/italy/bologna-borgopanigale.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/europe/italy/B.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/europe/italy/B.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/europe/italy/brindisi-casale.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/europe/italy/brindisi-casale.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/europe/italy/cagliari-elmas.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/europe/italy/cagliari-elmas.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/europe/italy/catania-fontanarossa.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/europe/italy/catania-fontanarossa.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/europe/italy/C.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/europe/italy/C.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/europe/italy/D.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/europe/italy/D.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/europe/italy/firenze-peretola.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/europe/italy/firenze-peretola.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/europe/italy/genova-sestri.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/europe/italy/genova-sestri.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/europe/italy/italy.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/europe/italy/italy.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/europe/italy/milano-linate.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/europe/italy/milano-linate.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/europe/italy/milano-malpensa.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/europe/italy/milano-malpensa.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/europe/italy/napoli-capodichino.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/europe/italy/napoli-capodichino.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/europe/italy/palermo-puntaraisi.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/europe/italy/palermo-puntaraisi.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/europe/italy/reggiocalabria.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/europe/italy/reggiocalabria.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/europe/italy/roma-ciampino.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/europe/italy/roma-ciampino.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/europe/italy/roma-fiumicino.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/europe/italy/roma-fiumicino.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/europe/italy/torino-caselle.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/europe/italy/torino-caselle.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/europe/italy/venezia-tessera.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/europe/italy/venezia-tessera.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/europe/italy/verona-villafranca.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/europe/italy/verona-villafranca.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/europe/spain/barcelona-elprat.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/europe/spain/barcelona-elprat.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/europe/spain/madrid-barajas.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/europe/spain/madrid-barajas.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/europe/spain/malaga.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/europe/spain/malaga.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/europe/spain/palmademallorca.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/europe/spain/palmademallorca.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/europe/united-kingdom/Gatwick.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/europe/united-kingdom/Gatwick.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/europe/united-kingdom/Heathrow.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/europe/united-kingdom/Heathrow.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/europe/united-kingdom/Manchester.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/europe/united-kingdom/Manchester.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/europe/united-kingdom/Stansted.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/europe/united-kingdom/Stansted.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/usa/dallas/AA.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/usa/dallas/AA.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/usa/dallas/AB.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/usa/dallas/AB.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/usa/dallas/A.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/usa/dallas/A.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/usa/dallas/BA.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/usa/dallas/BA.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/usa/dallas/BB.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/usa/dallas/BB.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/usa/dallas/BC.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/usa/dallas/BC.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/usa/dallas/B.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/usa/dallas/B.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/usa/dallas/CA.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/usa/dallas/CA.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/usa/dallas/CB.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/usa/dallas/CB.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/usa/dallas/C.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/usa/dallas/C.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/usa/dallas/DA.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/usa/dallas/DA.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/usa/dallas/D.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/usa/dallas/D.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/usa/losangeles/los-angeles-area.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/usa/losangeles/los-angeles-area.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/usa/losangeles/los-angeles.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/usa/losangeles/los-angeles.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/usa/newyork/boston.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/usa/newyork/boston.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/charts/usa/newyork/new-york.pdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/charts/usa/newyork/new-york.pdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/manual/acmdoc_al.png and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/manual/acmdoc_al.png differ diff -Nru acm-5.0/doc/manual/acmdoc-basic.html acm-6.0+20200416/doc/manual/acmdoc-basic.html --- acm-5.0/doc/manual/acmdoc-basic.html 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/doc/manual/acmdoc-basic.html 2020-04-16 12:05:38.000000000 +0000 @@ -0,0 +1,1240 @@ + + + +ACM - First look and basic usage + + +

ACM - First look and basic usage

+

+ by Riley Rainey +
updated by Umberto Salsi +

+ +

Contents

+
Back to general contents +
+Introduction
+Features
+Limitations
+Support
+Acknowledgments
+Launcher interface
+Command line options
+Keyboard Commands
+Abbreviations
+Units of measurement
+
+ + +

Introduction

+ +

+ACM is a distributed multi-player air combat simulation program that runs +on Linux and Windows. Players engage in air-to-air +combat with infrared missiles and cannon, but civil aircraft are available +too. Users can add more aircraft models and more sceneries, and this manual +explains how to do that. +

+ +

+Aircraft are simulated as 6 degrees of freedom bodies, and every model gets +described by its aerodynamic properties. Landing gear dynamics, engines, +atmosphere properties and wind are also simulated, so you can experiment +the different behaviors of the aircraft in different flight conditions. +

+ +

+The "world" of ACM is round, but the terrain is uniformly green and lacking of +any detail apart the fog and some runway here and there. This poor rendering +is intentional because it makes the program so light and fast, performing +25 frames per second with a CPU load nearly zero, without the need for an +accelerated video-card nor specialized graphical library. ACM is +also suitable for instrumental flight, since it provides many airports and +related radio-navigation aids, including NDB, VOR, DME and ILS. +

+ + +
+ +

+Screen shot (landing with the C-172 RG). +

+
+ + + + +

Features

+ +

+Summary of the main features currently implemented: +

+ + +
+
    + +
  • Multiplayer interaction via DIS protocol.
  • +
  • The Earth is the WGS-84 ellipsoid.
  • +
  • Current Earth magnetic field (NOAA World Magnetic Model).
  • +
  • Environment: Sun ephemeris, standard atmosphere with fog, wind, gusts, clouds.
  • +
  • Simulation with 6 degrees of freedom.
  • +
  • Landing gear simulation.
  • +
  • Limited vertical positive/negative load.
  • +
  • Classic instruments: magnetic compass, +turn and slip indicator, +airspeed indicator, +attitude indicator, +altitude indicator, +vertical speed indicator. +
  • +
  • Navigation: HSI with RNAV calculator, ADF.
  • + +
+
+
    + +
  • Head-up display (HUD) and inertial reference system.
  • +
  • Auto-pilots: hold altitude, hold climb rate, hold speed, follow VOR +radial, follow ILS glide path, rudder/ailerons coordination.
  • +
  • Several aircraft models implemented, both civil and military.
  • +
  • Several sceneries provided with PDF navigation charts.
  • +
  • Source code provided with GPL license.
  • + +
+
+ + +

Limitations

+ +
    +
  • The source code of ACM is known to compile and run on these platforms: Linux Slackware 14.1 32-bits; Linux Slackware 14.2 64-bits; Windows 7 32-bits with MinGW; Windows 7 64-bits with MinGW. A binary executable package for Windows 32-bits is also available; that package runs on Windows 64-bits in compatibility mode.

  • + +
  • The maximum number of local and remote players at any given time is 32. Beyond this limit, the program warns it cannot store nor display further remote players and cannot generate further drones.
  • + +
  • The maximum number of local and remote munitions and explosion at any given time is 32, including missiles, cannon bursts, drop bombs and explosions. Beyond this limit, the program warns it cannot store nor display further munitions. In spite of this limitation, explosions of missiles and bombs are effective although these might not be displayed on the screen.
  • + +
  • Although the DIS specifications enumerates more than 6000 entity types, only a tiny subset of these are actually supported by ACM -- see the inventory files in the objects directory for the current list. Only the aircraft currently defined can be generated and simulated as local entities. Unknown remote entities that might enter the simulation through the DIS protocol from other applications are displayed as "UFO".
  • +
+ + + +

Support

+ +

+News, bugs and updates for ACM are available +at www.icosaedro.it/acm/download.html. +

+ + + +

Acknowledgments

+ +

+The original version of this program, ACM-5.0, was developed by Riley Rainey +and distributed under the GPL license. +

+ +

+The first version of ACM was released in +1991 via the venerable Usenet comp.sources.unix newsgroup. Since then, +ACM has been upgraded to support the IEEE 1278 Distributed Interactive +Simulation (DIS) protocol. +

+ +

+ACM's DIS glue code was created by Mats Loftkvist. +

+ +

+Many others have generously supplied bug fixes and other changes to ACM-5.0 +since it was originally released. In particular, Brad Bass and Tim Tessin +contributed with their encouragement and continued support. Charlie Briggs +and Tom Giertz have helped out a lot, too. +

+ +

+This manual documents ACM version 6, basically the +ACM-5.0 version with some additions and corrections, more aircraft models +both military and civil and more instrumentation for the pilot, and several other new features. +

+ + + + +

Launcher interface

+ +

+You can start the program either from the command line or from the +graphical interface. The ACM distribution package includes a +simple launcher program to start ACM. +

+ +

+Windows users need to install the TCL/TK language interpreter from +www.tcl.tk in order to execute +this launcher interface. There are several implementations +of the binary executable TCL/TK; one I found very +easy to install is that provided by Magicsplat available at www.magicsplat.com/tcl-installer/index.html. +Often these packages provide very advanced libraries and programs along +with the basic Tcl/tk, but for our needs only a basic installation +is enough. +

+ +

+Run the program acm.tcl by either double clicking on the icon or +issuing the command +

+ +
+ +$ ./acm.tcl + +
+ +

+If your computer complains about the invalid path of the "wish" +interpreter (the Tcl/Tk window shell), simply open the file +acm.tcl with your text editor and change the first line so +that the file path will match the location of the "wish" interpreter on +your system. The windows can display several panels: select the desired +panel pressing the button at the top of the window. +

+ +
+Start from the Configuration panel. If this this is the first time you run the launcher, it is mandatory to check the correct configuration in the Configure panel as described below. Usually the launcher can figure out by itself the correct paths of the ACM executable program and of the objects directory, but in some cases human assistance is required :-) +
+ +

+The preferences you set in this mask are saved in the file +.acmtkrc in your home directory, and restored every time +you restart the program. The button Run starts ACM. The button +Default sets the default values into all the panels. The +Quit button (or the keyboard Esc key) exits the program saving the +contents of all panels; you may also click on the close window button. +

+ + +

The Plane panel

+ +

+ This panel lets you to select your aircraft Model among those defined in the objects/aircraft.txt file. +

+ +
+ +
+ +

+The Payload entry box allows to set the total payload of your craft; at least 200 lb should be accounted for the pilot and for each passenger; if left empty, the default is 150 lb.
+The Fuel entry box allows to set how much fuel to load; if left empty, the default is the maximum allowed by the specific aircraft model.
+The Panel radio buttons allows to choose among the classic instruments panel and HUD mode; once started, you can however switch between the two modes by pressing SHIFT-H.
+The Eye dist. from screen allows to set the distance of your head from the screen, so an appropriate zoom factor can be calculated (more about this next).
+The Downward view angle allows to set your downward visibility angle from the cockpit; usual values are about 10 degrees for civil aircraft and 15 degrees or more for modern jet fighters. The picture below illustrates these parameters: +

+ +
+ +

+Scale factor and cockpit view layout. +

+ +

+From the distance of the eye from the screen the program compute a +proper scale factor so that the landscape visible outside the cockpit can +be rendered realistically and without distortion, a feature particularly +useful in visual flight mode. +

+ +

+The downward angle of view (DAV) allows the pilot to see below the +horizontal axis of the aircraft. This angle can range from 7 to 10° +for civil aircraft, up to 15 or even 18° on fighters. Flying at low +speed the angle of attack (AoA) reduces the visibility even more, and the +effective downward angle of view becomes the difference DAV−AoA. To +fully display the HUD graphics a DAV of at least 12° is required. +

+ + + +

The Departure panel

+ +

+ From this panel you may choose the departure location at the end of some runway, or enter a location by hand at an arbitrary geographical location.
+

+ +
+ +
+ +

+ You may select the airport and the runway among the zones defined in the objects/zones.txt file and listed in the zones menu. Once the zone of your interest has been chosen, the full list of airports and runways is updated accordingly. By clicking on a runway, the latitude, longitude and heading fields below are set and a Description field is automatically generated. The altitude and initial speed gets blanked so that the aircraft can be gently deployed on the selected runway. +

+ +

+The initial location can also be entered manually and a corresponding description field can be freely edited. By entering a specific altitude, speed and heading, the aircraft starts airborne with the landing gear up and a pitch of 2 degrees nose up. +

+ +

+ If all fields are left blank, the starting location is 0N 0S at sea level altitude... +

+ +

+ The Time field allows to enter the departure date and time in ISO 8601 format, for example "2017-10-26T09:00". The time is "zulu", that is UT; there is no way to specify a time zone. For a complete list of other abbreviated syntaxes, type a random string and let the program complain: the error message will explain all the possible alternatives. +

+ +

+By leaving checked the now box, the program reads the current UT from the clock of your computer. +

+ + +
+ It is very important to correctly set the date and the time of the departure. In fact, the program calculates the Sun ephemeris for the day and adjusts the brightness of the scene accordingly. Moreover, the magnetic field on the Earth is calculated for the given date; you may experience how much the the magnetic field changes over time at any location of the Earth by entering different dates. +
+ + +
+ Use SHIFT-D to display state informations. At any time while you are flying, by pressing this keys combination, the state page is displayed with several useful informations, including: the aircraft model you are currently using; the current simulated zulu date and time; the current position; the current magnetic field variation VAR respect to the geographical north. Several other informations are there mostly for debugging and may not be of much interest for you. +
+ + +

The Environment panel

+ +

+This panel allows to set the weather conditions and some other environmental and rendering options. +

+ +
+ +
+ +

+The Terrain radio buttons allows to choose among the flat terrain rendering (faster, but boring) and the tiled terrain rendering (nicer, but possibly slow on some very old computer with shared built-in video memory). The tiled mode is recommended as it gives a simple but still useful speed and orientation feedback while flying at low altitude. At high altitudes, or for combat maneuvering, probably the faster flat terrain rendering is preferable. +

+ +

+ The Clouds base and top entry fields allow to set a tick layer of clouds. Clouds are opaque both to visible light and to the infra-red seekers of your missiles and those of the drones. No clouds are rendered if the top level is less or equal to the base level. +

+ + +
+The current implementation of the DIS protocol ignores the clouds. ACM does not currently manages the environmental parameters over the DIS protocol, so daylight, wind and clouds have only a local effect and are not shared among the participants into the simulation. Then, for example, trying to hide yourself inside the clouds to escape an hostile missile aiming at you fired by a remote player, does not work because the remote missiles are guided by the remote program where probably the player has set a clear sky... +
+ +

+The Wind direction if the geographic (NOT magnetic) direction from which the wind blows. The Wind velocity parameter is self explanatory. The Wind gust max intensity adds some horizontal random, rapidly varying, component to the wind velocity to make things more interesting. +

+ + +

The Drones panel

+ +

+You may practice with ACM (air combat maneuvering) techniques also alone by fighting against the robots driven by the program itself. Up to 31 drones can be generated by simply pressing the l key, but typically just one is challenging enough. +

+ +
+ +
+ +

+Drones can be generated in either "dog fight" or "hunting" mode. In dog fight mode, drones are placed just in front of you. In hunting mode, drones are placed up to 50 NM away from you in a random direction and altitude. +

+ +

+This panel allows also to set the drones aggressiveness, that is how much "G"s they will pull to escape from you or to attack you. For example, by selecting 50% aggressiveness, drones will maneuver up to the 50% of their maximum structural vertical load, both positive and negative. Your airplane undergoes to the same structural limitations, so always put an eye on the G-LOAD light of the warning panel or you will loose your plane! +

+ + +

The DIS panel

+ +

+The distributed interactive simulation protocol (DIS) is a standard network protocol born to simulate war sceneries involving any type of known submarine, ship, land vehicle, aircraft, missile, space vehicle and munition, both civil or military. The ACM program uses that same protocol to share its local entities with other ACM programs running on other computers, or even among several instances of the ACM program running on the same computer. +

+ +

+The DIS protocol feature can be disabled, or operating on a local network (LAN) using the broadcast protocol, or operating on a wide area network (WAN) like Internet. If disabled, ACM works in stand-alone mode, that is it does not send nor accepts anything from the network. +

+ +
+ +
+ +

+The Force menu allows to choose the force your plane belongs to among Other, Friendly, Opposing and Neutral. By choosing Friendly, drones generated by you will be Opposing using MiG-29 and will attack any other force (including Neutral...). By choosing any other force, drones generated by you will be Friendly using F-16 (and still will continue attacking any craft of any other force...). Your radar and radar warning receiver (RWR) will display as friendly any craft radar emission corresponding to your force, and as hostile any radar emission from other forces. +

+ +

+To play on a LAN in broadcast mode, all the participants must share the exact same subnet mask, for example 255.255.255.0, otherwise the IP broadcast protocol does not work. Participants must also share the same UDP port number (typically 3000) and the same exercise number (in a range from 1 to 255). The Relay server field must be left empty. +

+ +

+ To play on a WAN, a relay server is necessary. The ACM package comes with its own relay server program src/dis/server/dis_relay.exe; this relay server must be launched from the command line of some computer having a statically assigned IP address. To start the relay server, type a command like: +

+ +
dis_relay.exe --port 3000
+ +

+ Other options are available; try with --help. All the participants must then enter the address or the network name of that shared relay server in their Relay server entry field. +

+ +

+ Before to explain what to enter in the Site ID and Application ID fields, a note about how the DIS protocol works may help. Every aircraft, + missile, cannon burst and, in general, every entity the simulator program + generates must have an unique DIS entity ID; this ID is generated + combining a sequential counter managed by the program (the serial entity ID), + the application ID, and the + site ID: +

+ +
+ DIS_Entity_ID = Site_ID, Application_ID, Serial_Entity_ID +
+ +

+ This DIS_Entity_ID must be unique of the entity among all the entities involved in the exercise. +

+ +

+ But how to assign an unique application ID and site ID? + The ACM program allows to set -1 for both these values, in which case them are chosen by the program itself using the algorithm explained below. +

+ +

+ If the the Application ID is set to -1, then its value is set as the process ID of the program. In this way it is guaranteed several instances of the program on the computer will have distinct DIS entity IDs. +

+ +

+ If the Site ID is set to -1, then a random Site ID number is generated and the program enters a validation + period that last 15 seconds. During the validation period the program + listens for incoming packets looking for collisions with already + used site IDs. Normally no collision is detected, and the program successfully + completes the validation and starts sending its packets. Instead, if a + collision is detected, a new random site ID is generated and + the validation period restarts. +

+ + + +

The Configure panel

+ +
+ +
+ +

+The entry box Program contains the file-name of the ACM executable +program, normally located in src/acm/acm.exe. This is the program launched when you press the "Run" button. The acm.tcl launcher invokes that same program to get the list of aircraft models it displays in the Plane panel we explained above, so it is very important to set correctly this path. +

+ +

+The entry box Objects directory contains the directory-name of the +directory containing the scenes, the aircraft inventory and other resources +the ACM program needs. +

+ +

+The Frame rate is the number of times per second the program will +update the image on the screen. 20 is probably a good choice for civil +aviation, 30 is better in combat. +

+ +

+Mouse movements are translated to ailerons and elevator movements. +The Mouse mode menu allows to choose among fast, normal or precise +movements. "Fast" may be useful in dog fight combat. "Normal" and "precise" +modes are recommended for the normal flight. +

+ +

+Sound effects can be enable and disabled at runtime with CTRL-M. +

+ +

+The remaining options of this panel are quite self-explanatory. +

+ + + + +

Command line options

+ +

The ACM program can also be started directly from the command line. By default the aircraft model is a C-172 located at latitude zero and longitude zero, which might not be a so interesting place where to start from. So, you may try with another model and some other departure location for which a runway and a scenery is available. Historically, up to the version 5 of ACM the default starting location was the Addison airport at Dallas, Texas, runway 15:

+ +
src/acm/acm.exe -plane F-16 -latitude 32-58-40N -longitude 096-50-26W -heading 156
+ + +
+On Windows, the back-slash character \ must be used instead. +
+ +

The general syntax of the command is

+ +
acm.exe [OPTIONS]
+ +

where [OPTIONS] is any combination of the following:

+ + +
+ +
+-help
+-version
+-copyright
+
+
+

+ Displays program version, copyright informations and then exit. +

+
+ +
-init command-file-name
+
+

Take +extra command options, in command line format, from the specified +text file. For example, say there is a file in your home directory +named ‘.acmrc’. Its contents look like this:

+
-dis-site 34
+-dis-appl  4
+

New lines are treated as normal white space, so feel free to separate +command line options onto multiple lines. From a shell, you enter +the command:

+$ acm.exe -geometry 800x600 -init ~/.acmrc + +

This would be equivalent to:

+ +$ acm.exe -geometry 800x600 -dis-site 34 -dis-appl 4 +
+ +
-objects path1:path2:...
+
+

+Scenes, audio effects, aircraft shapes, aircraft data files and other +resources are stored as files inside the objects/ directory. +ACM will look for its data files inside these directories: the current +directory, objects/, ../objects/. So, if you +try to start ACM from outside its base directory, it will complain not to +be able to load these files. This option lets you to specify where these +files actually are. You may specify one or more directories separated +by a colon (Linux) or semicolon (Windows). +

+
+ +
-stealth
+
+

+Start ACM in stealth mode. ACM allows users to monitor out-the-window +views for any aircraft active in an exercise. Additionally, ACM supports +an experimental DIS Request/Grant Control protocol that would permit ACM +to “take over” aircraft of similarly enabled applications. +See the “Stealth Mode” section for detailed information on +this capability. +

+
+ +
-subject-entity-id site-id.appl-id.entity-id
+
+

This option can be used in conjunction with the -stealth flag +to identify the initial DIS entity to be “stealthed”:

+

+$ acm.exe -stealth -subject-entity-id 32.1.1 +

+
+ +
-geometry x11-geometry-specification
+
+Specify precise location and size settings for the main ACM window. +
+ + +
-frame-rate target-frame-rate-hertz
+
+

+Specifies a not-to-exceed rate at which ACM will attempt to render the +cockpit scene. The default is 20 Hz, which is quite low; 30 Hz is recommended. +

+
+ +
-plane MODEL
+
+Allows the user to select the aircraft model to be flown chosen among those +defined in the objects/aircraft.txt file, that is one of: +AMX, C-172 (default), F-16, MiG-29, Su-30, B-747, MD-81, P-51A, UFO. Note that the +C-172 simulated is the RG version with retractable gear; +UFO is mostly intended for debugging of the sceneries, as it may fly very fast. +To know which models are currently available, simply start the program with an +invalid model, for example "xxx" then look at the error message. +
+ +
-fuel fuel-lb
+
+

Allows the user to set the amount of fuel loaded (lb). +If left empty, the max amount of fuel allowed by the aircraft is loaded. +

+
+ +
-payload payload-lb
+
+

+The payload = passengers + cargo (lb). The default is 150 lb, a rough +estimation of pilot's weight. +

+
+ +
-force FORCE
+
+

+Tells to the DIS protocol to which force you belong among Other (default), Friendly, Opposing or Neutral. Fiendly and Opposing forces are special because the scenery may define a resupply location (that is, your air force base airport) where you may get fuel, munitions and repairs automatically by simply staying still: operations completes within few minutes! These locations are identified respectively as team 1 and team 2 and are read from the departure scenery (see the scenery team record definitions). The force you belongs to also affects how incoming radar beams are displayed (see radar warning receiver) and how drones behave (see drone). +

+
+ +
-departure-time TIMEDATE
+
+

+Allows to set the simulated departure date and time. The ISO 8601 date-time format must be used, for example "2017-10-23T12:30". By entering an invalid value, the programs lists all the supported formats along with the error message. The current computer date and time is the default if this option is missing. The state page (SHIFT-E) displays the updated date and time the program is simulating. Sun position, general scene illumination, and Earth magnetic field are calculated based on this simulated date and time. +

+
+ +
-latitude DD-PP-SS.SSSQ +
-longitude DDD-PP-SS.SSSQ +
-altitude altitude-msl-feet +
-heading initial-magnetic-heading-degrees +
-airspeed-kt initial-airspeed-knots
+
+
+

+These options may be combined to tailor the startup location of the +ACM aircraft. The exact syntax of the latitude and of the longitude is: +

+ +
+ degrees[-primes[-seconds]](N|S|E|W) +
+ +

+Seconds and degrees can take a fractional part. Examples: +

+ +
+ + -latitude 3.54N -longitude 123-4W
+ -latitude 1-2-3.4S -longitude 45-59-22.2E +
+
+ +

+If the -altitude option is not supplied, ACM automatically +sets the aircraft on the ground at the specified location. Starting airborne +(i.e. specifying an altitude grater that the local terrain altitude) the +initial pitch is set to 2° and the landing gear is retracted. Care should +be taken not to specify an altitude too close to the ground. +

+
+ +
+ +-dis-exercise DIS-exercise-id +
-dis-site DIS-site-id +
-dis-appl DIS-application-id +
+
+
+

+ By specifying any of these options, the program activates the DIS protocol + and prepares for communicate over the network in multiplayers mode. + It is very important to set properly these values because because each entity generated by the simulator (aircraft, missile or munition) must be univocally identified through its site ID, application ID and a sequential number generated by the program. These 3 numbers form the DIS entity ID that univocally identified each specific entity. + +
The exercise ID identifies network packets for the specific simulation we want to participate to; the program will simply ignore packets for any other exercise. The allowed range of the exercise ID is from 0 up to 255; the default value is 1. + +
The site ID identifies your computer and should be unique among + all the participants to the specified exercise. If not specified, or set to -1, a random value is generated and then validated on a period of 15 seconds; if no collisions are detected during this validation period, the randomly generated site ID is confirmed and the program starts sending packets; if a collision is detected, a new random value is generated and the validation period starts again. The allowed range of the site ID is from -1 up to 65535; the default value is -1. + +
The application ID identifies the specific instance of the ACM program running on a specific site/host. If you are running 2 or more applications on the same host, you may assign them the numbers 1, 2, 3, ... If the special value -1 is assigned, ACM uses the current process number instead. The allowed range of the application ID is from -1 up to 65535; the default value is -1. +

+
+ +
-no-sound
+
+Disable sounds. Sounds can still be enabled at runtime with CTRL-M. +
+ +
-visibility flight-visibility-nm
+
+

+Set the clouds/fog density. Runways farther than that are difficult +to see or are totally invisible. The default is 50 nautical miles. +

+
+ +
-ground-mode MODE
+
+

+Allows to choose the terrain rendering mode among "flat" (default) or "tiled". +The flat mode is faster, but the terrain is displayed as a boring uniform color. +The tiled mode is slower, but the player may feel some speed and scenery depth +feedback. +

+
+ +
-clouds-range BASE TOP
+
+

+Allows to set a tick layer of clouds, being BASE the bottom altitude and TOP the top altitude of this layer (ft). The sky is clear if this option is not set or BASE is equal or greater then TOP, which is the default. Clouds are completely opaque to the visible light and to the infrared seekers of the missiles; visibility inside is zero. +

+
+ + +
-mouse-mode fast|normal|precise
+
+

+Movements of the mouse are mapped to the corresponding movements of the +ailerons and of the elevator. "Fast" uses linear relation, so the aircraft +reacts promptly to the commands but it is difficult to pilot with precision. +"Normal" and "precise" are the recommended modes. The default is "normal". +

+
+ +
-end-game
+
+

+This flag is only valid in stealth mode. Hostile aircraft near the +subject aircraft are tracked. If any of these aircraft moves within +the subject aircraft’s radar locking range, then ACM will request +control of subject aircraft. Control is requested using a variant of +the proposed DIS 2.1.4++ transfer control protocol sequence. +

+
+ +
-threshold-range threshold-nautical-miles
+
+This +flag is only valid in the end-game mode. If a hostile aircraft moves +within the specified threshold distance of the stealthed (subject) +aircraft, ACM will attempt to take control and engage the hostile +target. If threshold range is not specified, then the subject +aircraft’s radar lock range is used as the distance threshold. +
+ +
-wind WD/WV
+
+Sets the wind direction (WD, degrees) and the wind velocity (WV, knots). +
+ +
-gust GUST_MAX
+
+Sets the wind gust maximum intensity (ft/s). Default: 0 (no wind gusts). +
+ +
-eye_to_screen_cm CM
+
+

+Sets the distance between your eyes and the screen, expressed in cm (1 inch += 2.54 cm). This parameter allows the program to computer the proper scale +factor needed to render the outside view without distortions. Default: 50 cm. +

+
+ +
-downward_view_angle_deg DEG
+
+

+Sets the downward view angle (DAV, degrees) below the horizontal axis of +the aircraft. The instruments panel and the engine cover above the pilot, +usually limit its capability to view downward toward the ground, as explained +above describing the acm.tcl program. To +fully display the HUD graphics a DAV of at least 12° is required. +Default: 15° +

+
+ +
-drone-mode mode
+
+Set how drones are generated. Allowed values are "DOG_FIGHT" (default) and +"HUNTING". +
+ +
-da FACTOR
+
+Set drone aggressiveness, default 0.5. +See below the paragraph about drones. +
+ +
-hud-mode
+
+By default the program starts displaying the classic instruments panel. +This option allows to start in HUD mode instead. +
+ +
+ +

Mandatory initialization files

+ +

+ The program looks for the following files under any directory specified along with the -objects command line option. +

+ +

object-map.txt +
This +file defines a mapping from DIS entity types to 3D object definition +files. The object files are used to render an image of the entity.

+ +

munition-map.txt +
This +file defines the explosion and damage producing characteristics of +DIS munition entity type and warhead combinations.

+ +

aircraft.txt +
This +file defines the performance characteristics of all aircraft types +modeled by ACM. The layout of this file is defined in the section +titled Defining New Aircraft.

+ + +

Exit status

+ +

+Exit status 0 indicates a normal termination of the program. +The specific reason for the termination of the program +is sent to standard output; nothing is written if the program terminated by +player's request. Some diagnostic message might be sent to standard error, +for example invalid DIS packet received or too many entities generated, but these +events are not fatal and do not indicate an error in the program. +

+ +

+Exit status 1 indicates a fatal error occurred: +internal error, or invalid command line parameters, or system failure in providing +some service. Appropriate description of the error occurred is sent to standard error. +

+ + + + +

Keyboard Commands

+ + +

General

+ +
+

g Landing gear up/down

+

b Wheel brakes on/off

+

h Flaps down 1 step

+

y Flaps up 1 step

+

s Deploy speed brakes 1 step (one or more steps, depending on the aircraft model)

+

w Retract speed brakes 1 step (one or more steps, depending on the aircraft model)

+

t Start/stop/reset the timer display

+

z Rudder step left

+

x Rudder centered

+

c Rudder step right

+

l Create a drone opponent aircraft. For Friendly force player, an Opposing drone is created; if the player belongs to any other force, a Friendly drone is created instead. Drones attack crafts belonging to any other force but their own.

+

d Detach commands from the ACM window, so that you can leave the ACM window in background.

+

+ Zoom in.

+

Zoom out.

+

Shift-D Displays a state page with several useful informations; among +these: +current aircraft model; +current simulated date and time in ISO 8601 format, zulu time; +latitude, longitude and altitude over the WGS-84 ellipsoid; +characteristics of the air at the altitude (standard model). +

+

Shift-H Toggle between HUD and "classic instruments".

+

Shift-M Switch between MH (default) and TH indication (see HUD and HSI sections).

+

Shift-P Print screen shot to the file /tmp/acm-dump-* (not available under Windows)

+

Shift-K Calibrate joystick

+

Shift-$ Play like a drone (toggle).

+

Ctrl-M Mute/unmute sounds (toggle).

+

Shift-Q Shift-Q Quit the simulation. NOTE: press two times!

+
+ + + + +

Auto-Pilot System (APS)

+ +
+

Shift-A Engage/disengage the auto-pilot in hold altitude mode or in +hold climb rate mode (see The Auto-pilot for details).

+

Shift-Z Engage/disengage the auto-pilot in hold altitude mode (see The Auto-pilot for details).

+

Shift-T Engage/disengage the auto-throttle (see The Auto-throttle for details).

+

Shift-X Engage/disengage the rudder/aileron auto-coordinator +(see The Auto-coordinator for details). +

Shift-N Engage/disengage the auto-navigator +(see The Auto-navigator for details). +

Shift-L Engage/disengage the auto-landing +(see The Auto-landing for details). +

Shift-( Decrease maximum bank angle. +

Shift-) Increase maximum bank angle. +

Home Release all the auto-pilot sub-systems, with the only exception of the auto-coordinator.

+

Shift-E Engages/disengages the rate control mode rather than the direct control mode. In direct control mode, the mouse position relative to the center of the window directly sets the position of the ailerons and of the elevator. In rate control mode the mouse position relative to the center of the window sets the roll rate and the pitch rate. +

+ +

Views

+ +

+View buttons are located on the PC’s numeric keypad. +

+ +
+

KP8 Forward +view

+

KP2 Rear +view

+

KP4 Look +Left

+

KP6 Look +Right

+

KP5 Look +Up

+

KP0 Look Down

+

n Chase view (this view button is not located on the numeric +keypad)

+
+ + +

Mouse and Mouse Buttons

+ +
+

Move left/right ailerons deflection and nose wheel steering.

+

Move forward/backward move elevator to control the pitch.

+

Left button fire currently selected weapon.

+

Right button select a weapon.

+
+ + +

Joystick Buttons

+ +
+

Button2 (top) Select weapon (Sidewinder IR missile or 20mm cannon)

+

Button1 (front) Fire selected weapon

+
+ + +

Classic instruments

+
+

Shift-H Toggle between HUD and "classic instruments".

+

F7,F8 Adjust altimeter isobaric reference level from 28 to 31 inHg.

+

F9 "Caging" button: forces alignment of attitude gyro with its case.

+

F11,F12 Adjust pitch of the symbolic airplane in the attitude indicator.

+
+ + +

Radar

+ +
+

r Select radar/HSI/ADF/off mode

+

Shift-R Toggle between radar modes: Normal, ACM 20x30, STT, Standby. Also Button3 on Microsoft Sidewinder Joysticks.

+

q Break Lock -- track a different target (also Button4)

+
+ + +

Engine control

+ +

+The meaning of these keys changes when the the auto-throttle is enabled. +See The Auto-throttle for details. +

+ +
+

1 Engine Idle

+

2 Decrease Power

+

3 Increase Power

+

4 Full Power

+

a Toggle Afterburner (if available)

+

SHIFT-! Deploy/retract thrust reverse (if available)

+
+ +
+IMPORTANT. +The thrust reverse device can be deployed only with engine commanded idle +(throttle lever below 25%). +
+ + +

Auto-turn

+ +

+The auto-turn automatism helps the pilot to keep the desired standard rate of +turn of 1.5 or 3.0°/s. Enabling the auto-turn, also the AC is enabled. This +is an experimental feature mainly intended for flight test purposes. It might +be removed or otherwise changed in future releases of the program. +

+ +
+

< (less than) Set left turn rate 3.0°/s

+

, (comma) Set left turn rate 1.5°/s

+

> (greater than) Set right turn rate 3.0°/s

+

. (period) Set right turn rate 1.5°/s

+

| (vertical bar) Set turn rate 0°/s

+

/ (slash) Disable auto-turn (see also key Home)

+
+ + +

Trim

+ +Trim buttons may be pressed until the desired trim is attained + +
+

j Adjust elevator trim to the current pitch command

+

Ctrl-Shift-UpArrow Forward (down) pitch trim +

Ctrl-Shift-DownArrow Aft (up) pitch trim

+

Ctrl-Shift-LeftArrow Left roll trim

+

Ctrl-Shift-RightArrow Right roll trim

+

Home Reset elevator and ailerons trim, disable auto-pilot, auto-throttle, auto-navigator, auto-landing and auto-turn

+
+ + +

HSI receiver control

+ +

+Press r until the HSI gets displayed. +

+ +
+

SPACE Switch between NAV1/NAV2/RNAV1/.../RNAV5 receivers.

+

9,0 Set station frequency

+

7,8 Set OBS

+

F3,F4 Set RNAV radial of the WP (only in RNAV mode)

+

F5,F6 Set RNAV distance of the WP (only in RNAV mode)

+
+ + +

ADF receiver control

+ +

+Press r until the ADF gets displayed. +

+ +
+

9,0 Set station frequency

+

7,8 Move rotatable heading needle

+
+ + + +

Abbreviations

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ACM Air Combat Maneuvering
AAM Air-to-Air Missile
AOA Angle Of Attack
DME Distance Measurement Equipment
DIS Distributed Interactive Simulation
ECM Electronic Countermeasures
HSI Horizontal Situation Indicator
HUD Head-Up Display
IAS Indicated Airspeed
IFR Instrumental Flight Rules
ILS Instrumental Landing System
IR Infrared
KIAS Knots Indicated Airspeed
KT Nautical Miles per Hour, NM/h.
LOC Localizer
MH Magnetic Heading, the direction referred to the magnetic north pole (see also TH, VAR)
NAV Navigation
NDB Nondirectional Radio Beacon
OBS Omni Bearing Selector
RWR Radar Warning Receiver
TAA Target Aspect Angle
TACAN Tactical Air Navigation System
TAS True Airspeed
TEWS Threat Early Warning System − a form of radar warning receiver also known as radard warning receiver (RWR)
RWR See TEWS
TH True Heading, the direction referred to the geographic north pole (see also MH, VAR)
VAR Magnetic variation, the difference between the geographic north +and the magnetic north: VAR = TH - MH. For example, VAR=+6=6°E means that +the local magnetic north points toward 6° geographic.
VFR Visual Flight Rules
VOR VHF Omnidirectional Radio Range
WP Waypoint
+ + + +

Units of measurement

+
+ +

+Numbers are indicated with 4 significant digits. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameSymbolValue(1)Equivalences
Time
Seconds  
Minutemin60 s 
Hourh3600 s 
Length
Meterm 3.281 ft = 0.0005400 NM
Footft 0.3048 m = 0.0001646 NM
Nautical Mile(2)NM 1853 m = 1.853 Km = 6076 ft
Speed
KnotKT1 NM/h0.5144 m/s = 1.853 Km/h
Feet per minutefpm1 ft/min0.3048 m/min = 0.005080 m/s
Mass
Poundlb 0.4536 Kg
KilogramKg 2.205 lb
Slugslug1 lbf / (1 ft/s2)32.17 lb = 14.59 Kg
Acceleration
Earth acceleration
at sea level(3)
g 9.806 m/s2 = 32.17 ft/s2
Force
NewtonN1 kg m / s20.1020 Kgf = 0.2248 lbf
Kilogram-force(4)Kgf1 kg g9.806 N = 2.205 lbf
Pound-force(4)lbf1 lb g4.448 N = 0.4536 Kgf
Slug-force(4)slugfslug g143.1 N = 32.17 lbf
+ +

+1. A value is given only for those units that are defined in terms of other +base units. +

+ +

+2. Nautical miles are a practical length unit used in naval and aerial +navigation, as its value is is very close to the length of a arc-minute +measured along a meridian, or the length of a arc-minute measured along the +equatorial line. +

+ +

+3. As Isaac Newton explained, on the Earth at sea level every body fall +under its weight with the same acceleration, here indicated with the +slanted letter g, not to be confused with the gram unit of mass "g". +

+ +

+4. The weight is the force with which the Earth attracts bodies toward +its center. So it is useful for practical calculations to associate to every +mass unit (kg, lb, ...) its corresponding weight-force unit whose +symbol is the same as the mass unit with "f" added. Then, for example, 1 lbf is +the weight of 1 lb mass measured on the Earth at sea level. +

+ + + + diff -Nru acm-5.0/doc/manual/acmdoc-ellipsoid.svg acm-6.0+20200416/doc/manual/acmdoc-ellipsoid.svg --- acm-5.0/doc/manual/acmdoc-ellipsoid.svg 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/doc/manual/acmdoc-ellipsoid.svg 2017-10-28 07:54:47.000000000 +0000 @@ -0,0 +1,386 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + Northpole + P + + localhorizon + localvertical + + + z + x + A + B + lat + + + y + + terrain + sea + a + b + + diff -Nru acm-5.0/doc/manual/acmdoc.html acm-6.0+20200416/doc/manual/acmdoc.html --- acm-5.0/doc/manual/acmdoc.html 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/doc/manual/acmdoc.html 2020-04-16 12:42:26.000000000 +0000 @@ -0,0 +1,23 @@ + + + +ACM Reference Manual + + + + +

ACM Reference Manual

+

+ by Riley Rainey +
2020-04-16 updated by Umberto Salsi +

+ + +

Contents

+
+

First look and basic usage

+

Pilot's Operating Handbook

+

Inside the program

+
+ + Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/manual/acmdoc_html-adf.png and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/manual/acmdoc_html-adf.png differ diff -Nru acm-5.0/doc/manual/acmdoc_html-an_approach.obj acm-6.0+20200416/doc/manual/acmdoc_html-an_approach.obj --- acm-5.0/doc/manual/acmdoc_html-an_approach.obj 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/doc/manual/acmdoc_html-an_approach.obj 2007-07-09 06:53:04.000000000 +0000 @@ -0,0 +1,127 @@ +%TGIF 4.1.43-QPL +state(0,37,100.000,59,10,1,4,0,9,1,1,0,0,1,0,1,0,'Helvetica',0,63360,0,5,0,10,0,1,1,1,0,16,0,0,1,1,1,1,1088,1408,1,0,2880,0). +% +% @(#)$Header$ +% %W% +% +unit("1 pixel/pixel"). +color_info(11,65535,0,[ + "magenta", 65535, 0, 65535, 65535, 0, 65535, 1, + "red", 65535, 0, 0, 65535, 0, 0, 1, + "green", 0, 65535, 0, 0, 65535, 0, 1, + "blue", 0, 0, 65535, 0, 0, 65535, 1, + "yellow", 65535, 65535, 0, 65535, 65535, 0, 1, + "pink", 65535, 49344, 52171, 65535, 49344, 52171, 1, + "cyan", 0, 65535, 65535, 0, 65535, 65535, 1, + "CadetBlue", 24415, 40606, 41120, 24415, 40606, 41120, 1, + "white", 65535, 65535, 65535, 65535, 65535, 65535, 1, + "black", 0, 0, 0, 0, 0, 0, 1, + "DarkSlateGray", 12079, 20303, 20303, 12079, 20303, 20303, 1 +]). +script_frac("0.6"). +fg_bg_colors('black','white'). +dont_reencode("FFDingbests:ZapfDingbats"). +page(1,"",1,''). +poly('black','',2,[ + 192,32,192,234],2,2,1,0,0,0,0,0,0,0,0,'2',0,0, + "0","",[ + 0,10,4,0,'10','4','0'],[0,10,4,0,'10','4','0'],[ +]). +poly('black','',2,[ + 100,204,132,172],1,3,1,3,0,0,0,0,0,0,0,'3',0,0, + "0","",[ + 0,12,5,0,'12','5','0'],[0,12,5,0,'12','5','0'],[ +]). +poly('black','',2,[ + 284,204,252,172],1,3,1,7,0,0,0,0,0,0,0,'3',0,0, + "0","",[ + 0,12,5,0,'12','5','0'],[0,12,5,0,'12','5','0'],[ +]). +polygon('black','',14,[ + 104,200,96,203,87,196,84,200,93,208,88,216,80,216,91,225, + 90,218,98,212,107,220,111,216,102,208,104,200],2,1,1,0,16,0,0,0,0,0,'1',0, + "0000",[ +]). +polygon('black','',14,[ + 279,200,287,203,296,196,299,200,290,208,295,216,303,216,292,225, + 293,218,285,212,276,220,272,216,281,208,279,200],2,1,1,0,28,0,0,0,0,0,'1',0, + "0000",[ +]). +text('black',88,172,1,0,1,11,17,31,14,3,2,0,0,0,2,11,17,0,0,"",0,0,0,0,186,'',[ +minilines(11,17,0,0,0,0,0,[ +mini_line(11,14,3,0,0,0,[ +str_block(0,11,14,3,0,-1,0,0,0,[ +str_seg('black','Helvetica',0,80640,11,14,3,0,-1,0,0,0,0,0, + "A")]) +]) +])]). +text('black',288,174,1,0,1,9,17,33,14,3,2,0,0,0,2,9,17,0,0,"",0,0,0,0,188,'',[ +minilines(9,17,0,0,0,0,0,[ +mini_line(9,14,3,0,0,0,[ +str_block(0,9,14,3,0,-1,0,0,0,[ +str_seg('black','Helvetica',0,80640,9,14,3,0,-1,0,0,0,0,0, + "B")]) +]) +])]). +text('black',200,46,1,0,1,29,17,42,14,3,2,0,0,0,2,29,17,0,0,"",0,0,0,0,60,'',[ +minilines(29,17,0,0,0,0,0,[ +mini_line(29,14,3,0,0,0,[ +str_block(0,29,14,3,0,-1,0,0,0,[ +str_seg('black','Helvetica',0,80640,29,14,3,0,-1,0,0,0,0,0, + "OBS")]) +]) +])]). +arc('black','',0,1,1,0,128,48,192,112,192,176,148,156,1,128,128,-5760,-2880,44,0,1,8,3,0,0,0,'1','8','3',0,[ +]). +arc('black','',0,1,1,0,128,48,192,112,192,176,236,156,0,128,128,-5760,2880,55,0,1,8,3,0,0,0,'1','8','3',0,[ +]). +text('black',156,178,1,0,1,16,17,56,14,3,0,0,0,0,2,16,17,0,0,"",0,0,0,0,192,'',[ +minilines(16,17,0,0,0,0,0,[ +mini_line(16,14,3,0,0,0,[ +str_block(0,16,14,3,0,-1,0,0,0,[ +str_seg('black','Helvetica',0,80640,16,14,3,0,-1,0,0,0,0,0, + "45")]) +]) +])]). +text('black',208,178,1,0,1,16,17,58,14,3,0,0,0,0,2,16,17,0,0,"",0,0,0,0,192,'',[ +minilines(16,17,0,0,0,0,0,[ +mini_line(16,14,3,0,0,0,[ +str_block(0,16,14,3,0,-1,0,0,0,[ +str_seg('black','Helvetica',0,80640,16,14,3,0,-1,0,0,0,0,0, + "45")]) +]) +])]). +text('black',172,173,1,0,1,6,13,60,11,2,0,0,0,0,2,6,13,0,0,"",0,0,0,0,184,'',[ +minilines(6,13,0,0,0,0,0,[ +mini_line(6,11,2,0,0,0,[ +str_block(0,6,11,2,0,-1,0,0,0,[ +str_seg('black','Helvetica',0,63360,6,11,2,0,-1,0,0,0,0,0, + "o")]) +]) +])]). +text('black',224,173,1,0,1,6,13,64,11,2,0,0,0,0,2,6,13,0,0,"",0,0,0,0,184,'',[ +minilines(6,13,0,0,0,0,0,[ +mini_line(6,11,2,0,0,0,[ +str_block(0,6,11,2,0,-1,0,0,0,[ +str_seg('black','Helvetica',0,63360,6,11,2,0,-1,0,0,0,0,0, + "o")]) +]) +])]). +group([ +poly('black','',2,[ + 158,147,112,192],0,1,1,1,0,0,5,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]), +poly('black','',2,[ + 226,146,272,192],0,1,1,2,0,0,5,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]), +arc('black','',0,1,1,5,192,-52,308,64,226,146,196,97,1,232,232,-8640,-1792,74,0,1,8,3,0,0,0,'1','8','3',0,[ +]), +arc('black','',0,1,1,5,-40,-52,76,64,158,146,188,97,0,232,232,-2880,1792,89,0,1,8,3,0,0,0,'1','8','3',0,[ +]) +], +96,0,0,[ +]). Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/manual/acmdoc_html-an_approach.png and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/manual/acmdoc_html-an_approach.png differ diff -Nru acm-5.0/doc/manual/acmdoc_html-ap-blocks.obj acm-6.0+20200416/doc/manual/acmdoc_html-ap-blocks.obj --- acm-5.0/doc/manual/acmdoc_html-ap-blocks.obj 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/doc/manual/acmdoc_html-ap-blocks.obj 2007-07-09 06:53:04.000000000 +0000 @@ -0,0 +1,199 @@ +%TGIF 4.1.43-QPL +state(0,37,100.000,0,0,0,8,1,9,1,1,1,0,1,0,1,1,'Helvetica-Bold',1,97920,0,0,0,10,0,0,1,1,0,16,0,0,1,1,1,1,1088,1408,1,0,2880,0). +% +% @(#)$Header$ +% %W% +% +unit("1 pixel/pixel"). +color_info(11,65535,0,[ + "magenta", 65535, 0, 65535, 65535, 0, 65535, 1, + "red", 65535, 0, 0, 65535, 0, 0, 1, + "green", 0, 65535, 0, 0, 65535, 0, 1, + "blue", 0, 0, 65535, 0, 0, 65535, 1, + "yellow", 65535, 65535, 0, 65535, 65535, 0, 1, + "pink", 65535, 49344, 52171, 65535, 49344, 52171, 1, + "cyan", 0, 65535, 65535, 0, 65535, 65535, 1, + "CadetBlue", 24415, 40606, 41120, 24415, 40606, 41120, 1, + "white", 65535, 65535, 65535, 65535, 65535, 65535, 1, + "black", 0, 0, 0, 0, 0, 0, 1, + "DarkSlateGray", 12079, 20303, 20303, 12079, 20303, 20303, 1 +]). +script_frac("0.6"). +fg_bg_colors('black','white'). +dont_reencode("FFDingbests:ZapfDingbats"). +page(1,"",1,''). +text('black',176,89,1,1,1,59,15,0,12,3,0,0,0,0,2,59,15,0,0,"",0,0,0,0,101,'',[ +minilines(59,15,0,0,1,0,0,[ +mini_line(59,12,3,0,0,0,[ +str_block(0,59,12,3,0,-1,0,0,0,[ +str_seg('black','Helvetica-Bold',1,69120,59,12,3,0,-1,0,0,0,0,0, + "VOR Nav.")]) +]) +])]). +text('black',176,153,1,1,1,45,15,6,12,3,0,0,0,0,2,45,15,0,0,"",0,0,0,0,165,'',[ +minilines(45,15,0,0,1,0,0,[ +mini_line(45,12,3,0,0,0,[ +str_block(0,45,12,3,0,-1,0,0,0,[ +str_seg('black','Helvetica-Bold',1,69120,45,12,3,0,-1,0,0,0,0,0, + "Landing")]) +]) +])]). +text('black',368,89,1,1,1,27,15,8,12,3,0,0,0,0,2,27,15,0,0,"",0,0,0,0,101,'',[ +minilines(27,15,0,0,1,0,0,[ +mini_line(27,12,3,0,0,0,[ +str_block(0,27,12,3,0,-1,0,0,0,[ +str_seg('black','Helvetica-Bold',1,69120,27,12,3,0,-1,0,0,0,0,0, + "Turn")]) +]) +])]). +text('black',368,154,1,1,1,56,15,10,12,3,0,0,0,0,2,56,15,0,0,"",0,0,0,0,166,'',[ +minilines(56,15,0,0,1,0,0,[ +mini_line(56,12,3,0,0,0,[ +str_block(0,56,12,3,0,-1,0,0,0,[ +str_seg('black','Helvetica-Bold',1,69120,56,12,3,0,-1,0,0,0,0,0, + "Alt./Climb")]) +]) +])]). +text('black',368,217,1,1,1,69,15,12,12,3,0,0,0,0,2,69,15,0,0,"",0,0,0,0,229,'',[ +minilines(69,15,0,0,1,0,0,[ +mini_line(69,12,3,0,0,0,[ +str_block(0,69,12,3,0,-1,0,0,0,[ +str_seg('black','Helvetica-Bold',1,69120,69,12,3,0,-1,0,0,0,0,0, + "Turn Coord.")]) +]) +])]). +text('black',368,281,1,1,1,47,15,14,12,3,0,0,0,0,2,47,15,0,0,"",0,0,0,0,293,'',[ +minilines(47,15,0,0,1,0,0,[ +mini_line(47,12,3,0,0,0,[ +str_block(0,47,12,3,0,-1,0,0,0,[ +str_seg('black','Helvetica-Bold',1,69120,47,12,3,0,-1,0,0,0,0,0, + "Throttle")]) +]) +])]). +box('black','',128,64,224,112,0,2,1,82,0,0,0,0,0,'2',0,[ +]). +box('black','',128,128,224,176,0,2,1,83,0,0,0,0,0,'2',0,[ +]). +box('black','',320,128,416,176,0,2,1,84,0,0,0,0,0,'2',0,[ +]). +box('black','',320,64,416,112,0,2,1,85,0,0,0,0,0,'2',0,[ +]). +box('black','',320,192,416,240,0,2,1,86,0,0,0,0,0,'2',0,[ +]). +box('black','',320,256,416,304,0,2,1,87,0,0,0,0,0,'2',0,[ +]). +text('black',481,80,1,0,1,47,15,88,12,3,0,0,0,0,2,47,15,0,0,"",0,0,0,0,92,'',[ +minilines(47,15,0,0,0,0,0,[ +mini_line(47,12,3,0,0,0,[ +str_block(0,47,12,3,0,-1,0,0,0,[ +str_seg('black','Helvetica-Bold',1,69120,47,12,3,0,-1,0,0,0,0,0, + "Ailerons")]) +]) +])]). +text('black',481,144,1,0,1,50,15,90,12,3,0,0,0,0,2,50,15,0,0,"",0,0,0,0,156,'',[ +minilines(50,15,0,0,0,0,0,[ +mini_line(50,12,3,0,0,0,[ +str_block(0,50,12,3,0,0,0,0,0,[ +str_seg('black','Helvetica-Bold',1,69120,50,12,3,0,0,0,0,0,0,0, + "Elevator")]) +]) +])]). +text('black',481,208,1,0,1,42,15,92,12,3,0,0,0,0,2,42,15,0,0,"",0,0,0,0,220,'',[ +minilines(42,15,0,0,0,0,0,[ +mini_line(42,12,3,0,0,0,[ +str_block(0,42,12,3,0,0,0,0,0,[ +str_seg('black','Helvetica-Bold',1,69120,42,12,3,0,0,0,0,0,0,0, + "Rudder")]) +]) +])]). +text('black',481,272,1,0,1,46,15,94,12,3,0,0,0,0,2,46,15,0,0,"",0,0,0,0,284,'',[ +minilines(46,15,0,0,0,0,0,[ +mini_line(46,12,3,0,0,0,[ +str_block(0,46,12,3,0,-1,0,0,0,[ +str_seg('black','Helvetica-Bold',1,69120,46,12,3,0,-1,0,0,0,0,0, + "Engines")]) +]) +])]). +text('black',176,72,1,1,1,24,20,117,16,4,0,0,0,0,2,24,20,0,0,"",0,0,0,0,88,'',[ +minilines(24,20,0,0,1,0,0,[ +mini_line(24,16,4,0,0,0,[ +str_block(0,24,16,4,0,-1,0,0,0,[ +str_seg('black','Helvetica-Bold',1,97920,24,16,4,0,-1,0,0,0,0,0, + "AN")]) +]) +])]). +text('black',176,136,1,1,1,22,20,122,16,4,0,0,0,0,2,22,20,0,0,"",0,0,0,0,152,'',[ +minilines(22,20,0,0,1,0,0,[ +mini_line(22,16,4,0,0,0,[ +str_block(0,22,16,4,0,-1,0,0,0,[ +str_seg('black','Helvetica-Bold',1,97920,22,16,4,0,-1,0,0,0,0,0, + "AL")]) +]) +])]). +text('black',368,72,1,1,1,27,20,124,16,4,0,0,0,0,2,27,20,0,0,"",0,0,0,0,88,'',[ +minilines(27,20,0,0,1,0,0,[ +mini_line(27,16,4,0,0,0,[ +str_block(0,27,16,4,0,-1,0,0,0,[ +str_seg('black','Helvetica-Bold',1,97920,27,16,4,0,-1,0,0,0,0,0, + "AW")]) +]) +])]). +text('black',368,136,1,1,1,23,20,126,16,4,0,0,0,0,2,23,20,0,0,"",0,0,0,0,152,'',[ +minilines(23,20,0,0,1,0,0,[ +mini_line(23,16,4,0,0,0,[ +str_block(0,23,16,4,0,-1,0,0,0,[ +str_seg('black','Helvetica-Bold',1,97920,23,16,4,0,-1,0,0,0,0,0, + "AP")]) +]) +])]). +text('black',368,200,1,1,1,24,20,128,16,4,0,0,0,0,2,24,20,0,0,"",0,0,0,0,216,'',[ +minilines(24,20,0,0,1,0,0,[ +mini_line(24,16,4,0,0,0,[ +str_block(0,24,16,4,0,-1,0,0,0,[ +str_seg('black','Helvetica-Bold',1,97920,24,16,4,0,-1,0,0,0,0,0, + "AC")]) +]) +])]). +text('black',368,264,1,1,1,22,20,130,16,4,0,0,0,0,2,22,20,0,0,"",0,0,0,0,280,'',[ +minilines(22,20,0,0,1,0,0,[ +mini_line(22,16,4,0,0,0,[ +str_block(0,22,16,4,0,0,0,0,0,[ +str_seg('black','Helvetica-Bold',1,97920,22,16,4,0,0,0,0,0,0,0, + "AT")]) +]) +])]). +poly('black','',2,[ + 224,88,320,88],1,2,1,140,0,0,0,0,0,0,0,'2',0,0, + "0","",[ + 0,10,4,0,'10','4','0'],[0,10,4,0,'10','4','0'],[ +]). +poly('black','',2,[ + 224,152,320,104],1,2,1,141,0,0,0,0,0,0,0,'2',0,0, + "0","",[ + 0,10,4,0,'10','4','0'],[0,10,4,0,'10','4','0'],[ +]). +poly('black','',2,[ + 224,152,320,152],1,2,1,142,0,0,0,0,0,0,0,'2',0,0, + "0","",[ + 0,10,4,0,'10','4','0'],[0,10,4,0,'10','4','0'],[ +]). +poly('black','',2,[ + 416,88,472,88],1,2,1,143,0,0,0,0,0,0,0,'2',0,0, + "0","",[ + 0,10,4,0,'10','4','0'],[0,10,4,0,'10','4','0'],[ +]). +poly('black','',2,[ + 416,152,472,152],1,2,1,144,0,0,0,0,0,0,0,'2',0,0, + "0","",[ + 0,10,4,0,'10','4','0'],[0,10,4,0,'10','4','0'],[ +]). +poly('black','',2,[ + 416,216,472,216],1,2,1,145,0,0,0,0,0,0,0,'2',0,0, + "0","",[ + 0,10,4,0,'10','4','0'],[0,10,4,0,'10','4','0'],[ +]). +poly('black','',2,[ + 416,280,472,280],1,2,1,146,0,0,0,0,0,0,0,'2',0,0, + "0","",[ + 0,10,4,0,'10','4','0'],[0,10,4,0,'10','4','0'],[ +]). Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/manual/acmdoc_html-ap-blocks.png and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/manual/acmdoc_html-ap-blocks.png differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/manual/acmdoc_html_assuming-ownership.gif and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/manual/acmdoc_html_assuming-ownership.gif differ diff -Nru acm-5.0/doc/manual/acmdoc_html-aw.obj acm-6.0+20200416/doc/manual/acmdoc_html-aw.obj --- acm-5.0/doc/manual/acmdoc_html-aw.obj 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/doc/manual/acmdoc_html-aw.obj 2007-07-09 06:53:04.000000000 +0000 @@ -0,0 +1,255 @@ +%TGIF 4.1.43-QPL +state(0,37,100.000,177,48,2,4,0,8,1,1,0,0,0,0,1,2,'Helvetica-Bold',1,46080,0,0,0,10,0,1,1,1,0,16,0,0,1,1,1,1,1088,1408,1,0,2880,1). +% +% @(#)$Header$ +% %W% +% +unit("1 pixel/pixel"). +color_info(129,65535,0,[ + "magenta", 65535, 0, 65535, 65535, 0, 65535, 1, + "red", 65535, 0, 0, 65535, 0, 0, 1, + "green", 0, 65535, 0, 0, 65535, 0, 1, + "blue", 0, 0, 65535, 0, 0, 65535, 1, + "yellow", 65535, 65535, 0, 65535, 65535, 0, 1, + "pink", 65535, 49344, 52171, 65535, 49344, 52171, 1, + "cyan", 0, 65535, 65535, 0, 65535, 65535, 1, + "CadetBlue", 24415, 40606, 41120, 24415, 40606, 41120, 1, + "white", 65535, 65535, 65535, 65535, 65535, 65535, 1, + "black", 0, 0, 0, 0, 0, 0, 1, + "DarkSlateGray", 12079, 20303, 20303, 12079, 20303, 20303, 1, + "#7B9493", 31611, 38036, 37779, 31488, 37888, 37632, 1, + "#8AA2A8", 35466, 41634, 43176, 35328, 41472, 43008, 1, + "#9AB0BE", 39578, 45232, 48830, 39424, 45056, 48640, 1, + "#7F9799", 32639, 38807, 39321, 32512, 38656, 39168, 1, + "#7C99B6", 31868, 39321, 46774, 31744, 39168, 46592, 1, + "#9EB4C3", 40606, 46260, 50115, 40448, 46080, 49920, 1, + "#6F8984", 28527, 35209, 33924, 28416, 35072, 33792, 1, + "#839B9E", 33667, 39835, 40606, 33536, 39680, 40448, 1, + "#92A9B3", 37522, 43433, 46003, 37376, 43264, 45824, 1, + "#A6BBCD", 42662, 48059, 52685, 42496, 47872, 52480, 1, + "#77908E", 30583, 37008, 36494, 30464, 36864, 36352, 1, + "#8EA6AE", 36494, 42662, 44718, 36352, 42496, 44544, 1, + "#6B857E", 27499, 34181, 32382, 27392, 34048, 32256, 1, + "#738D89", 29555, 36237, 35209, 29440, 36096, 35072, 1, + "#879FA3", 34695, 40863, 41891, 34560, 40704, 41728, 1, + "#96ADB8", 38550, 44461, 47288, 38400, 44288, 47104, 1, + "#B1B1B1", 45489, 45489, 45489, 45312, 45312, 45312, 1, + "gray68", 44461, 44461, 44461, 44461, 44461, 44461, 1, + "#7C99B5", 31868, 39321, 46517, 31744, 39168, 46336, 1, + "dark grey", 43433, 43433, 43433, 43433, 43433, 43433, 1, + "#A7A7A7", 42919, 42919, 42919, 42752, 42752, 42752, 1, + "#A5A5A5", 42405, 42405, 42405, 42240, 42240, 42240, 1, + "#B4B7B7", 46260, 47031, 47031, 46080, 46848, 46848, 1, + "gray64", 41891, 41891, 41891, 41891, 41891, 41891, 1, + "#8EA1A5", 36494, 41377, 42405, 36352, 41216, 42240, 1, + "#869DB4", 34438, 40349, 46260, 34304, 40192, 46080, 1, + "#8FA2A5", 36751, 41634, 42405, 36608, 41472, 42240, 1, + "#FEFEFE", 65278, 65278, 65278, 65024, 65024, 65024, 1, + "#95A8AE", 38293, 43176, 44718, 38144, 43008, 44544, 1, + "#B2B6BA", 45746, 46774, 47802, 45568, 46592, 47616, 1, + "gray99", 64764, 64764, 64764, 64764, 64764, 64764, 1, + "gray98", 64250, 64250, 64250, 64250, 64250, 64250, 1, + "#F8F8F8", 63736, 63736, 63736, 63488, 63488, 63488, 1, + "#F6F6F6", 63222, 63222, 63222, 62976, 62976, 62976, 1, + "#F4F4F4", 62708, 62708, 62708, 62464, 62464, 62464, 1, + "gray95", 62194, 62194, 62194, 62194, 62194, 62194, 1, + "gray94", 61680, 61680, 61680, 61680, 61680, 61680, 1, + "#EEEEEE", 61166, 61166, 61166, 60928, 60928, 60928, 1, + "#ECECEC", 60652, 60652, 60652, 60416, 60416, 60416, 1, + "#EAEAEA", 60138, 60138, 60138, 59904, 59904, 59904, 1, + "gray91", 59624, 59624, 59624, 59624, 59624, 59624, 1, + "#E6E6E6", 59110, 59110, 59110, 58880, 58880, 58880, 1, + "#E2E2E2", 58082, 58082, 58082, 57856, 57856, 57856, 1, + "gray88", 57568, 57568, 57568, 57568, 57568, 57568, 1, + "#798D88", 31097, 36237, 34952, 30976, 36096, 34816, 1, + "gray87", 57054, 57054, 57054, 57054, 57054, 57054, 1, + "#788D87", 30840, 36237, 34695, 30720, 36096, 34560, 1, + "gainsboro", 56540, 56540, 56540, 56540, 56540, 56540, 1, + "#D8D8D8", 55512, 55512, 55512, 55296, 55296, 55296, 1, + "#8EA6AD", 36494, 42662, 44461, 36352, 42496, 44288, 1, + "gray84", 54998, 54998, 54998, 54998, 54998, 54998, 1, + "gray83", 54484, 54484, 54484, 54484, 54484, 54484, 1, + "#D2D2D2", 53970, 53970, 53970, 53760, 53760, 53760, 1, + "#D0D0D0", 53456, 53456, 53456, 53248, 53248, 53248, 1, + "#A3AEB1", 41891, 44718, 45489, 41728, 44544, 45312, 1, + "#CECECE", 52942, 52942, 52942, 52736, 52736, 52736, 1, + "#A1ACAF", 41377, 44204, 44975, 41216, 44032, 44800, 1, + "gray80", 52428, 52428, 52428, 52428, 52428, 52428, 1, + "#C8C8C8", 51400, 51400, 51400, 51200, 51200, 51200, 1, + "#C6C6C6", 50886, 50886, 50886, 50688, 50688, 50688, 1, + "#91A5A9", 37265, 42405, 43433, 37120, 42240, 43264, 1, + "gray77", 50372, 50372, 50372, 50372, 50372, 50372, 1, + "#6C857E", 27756, 34181, 32382, 27648, 34048, 32256, 1, + "gray76", 49858, 49858, 49858, 49858, 49858, 49858, 1, + "gray", 48830, 48830, 48830, 48830, 48830, 48830, 1, + "gray73", 47802, 47802, 47802, 47802, 47802, 47802, 1, + "#B4B4B4", 46260, 46260, 46260, 46080, 46080, 46080, 1, + "#B2B2B2", 45746, 45746, 45746, 45568, 45568, 45568, 1, + "#859DB4", 34181, 40349, 46260, 34048, 40192, 46080, 1, + "gray69", 45232, 45232, 45232, 45232, 45232, 45232, 1, + "#ACACAC", 44204, 44204, 44204, 44032, 44032, 44032, 1, + "#A4A4A4", 42148, 42148, 42148, 41984, 41984, 41984, 1, + "#A2A2A2", 41634, 41634, 41634, 41472, 41472, 41472, 1, + "#9BA8B5", 39835, 43176, 46517, 39680, 43008, 46336, 1, + "#B0B3B2", 45232, 46003, 45746, 45056, 45824, 45568, 1, + "#8AA2A7", 35466, 41634, 42919, 35328, 41472, 42752, 1, + "#A0AAAC", 41120, 43690, 44204, 40960, 43520, 44032, 1, + "#A6BACC", 42662, 47802, 52428, 42496, 47616, 52224, 1, + "#FDFDFD", 65021, 65021, 65021, 64768, 64768, 64768, 1, + "#94A7AD", 38036, 42919, 44461, 37888, 42752, 44288, 1, + "#FBFBFB", 64507, 64507, 64507, 64256, 64256, 64256, 1, + "#F9F9F9", 63993, 63993, 63993, 63744, 63744, 63744, 1, + "gray97", 63479, 63479, 63479, 63479, 63479, 63479, 1, + "white smoke", 62965, 62965, 62965, 62965, 62965, 62965, 1, + "#F3F3F3", 62451, 62451, 62451, 62208, 62208, 62208, 1, + "#F1F1F1", 61937, 61937, 61937, 61696, 61696, 61696, 1, + "#EFEFEF", 61423, 61423, 61423, 61184, 61184, 61184, 1, + "gray93", 60909, 60909, 60909, 60909, 60909, 60909, 1, + "gray92", 60395, 60395, 60395, 60395, 60395, 60395, 1, + "#E9E9E9", 59881, 59881, 59881, 59648, 59648, 59648, 1, + "#E7E7E7", 59367, 59367, 59367, 59136, 59136, 59136, 1, + "gray90", 58853, 58853, 58853, 58853, 58853, 58853, 1, + "#939F9B", 37779, 40863, 39835, 37632, 40704, 39680, 1, + "#E1E1E1", 57825, 57825, 57825, 57600, 57600, 57600, 1, + "#DFDFDF", 57311, 57311, 57311, 57088, 57088, 57088, 1, + "#DDDDDD", 56797, 56797, 56797, 56576, 56576, 56576, 1, + "#B5B8B9", 46517, 47288, 47545, 46336, 47104, 47360, 1, + "gray86", 56283, 56283, 56283, 56283, 56283, 56283, 1, + "gray85", 55769, 55769, 55769, 55769, 55769, 55769, 1, + "#D7D7D7", 55255, 55255, 55255, 55040, 55040, 55040, 1, + "#D5D5D5", 54741, 54741, 54741, 54528, 54528, 54528, 1, + "light grey", 54227, 54227, 54227, 54227, 54227, 54227, 1, + "gray82", 53713, 53713, 53713, 53713, 53713, 53713, 1, + "gray81", 53199, 53199, 53199, 53199, 53199, 53199, 1, + "#CDCDCD", 52685, 52685, 52685, 52480, 52480, 52480, 1, + "gray79", 51657, 51657, 51657, 51657, 51657, 51657, 1, + "gray78", 51143, 51143, 51143, 51143, 51143, 51143, 1, + "#C5C5C5", 50629, 50629, 50629, 50432, 50432, 50432, 1, + "#91A4A9", 37265, 42148, 43433, 37120, 41984, 43264, 1, + "#C3C3C3", 50115, 50115, 50115, 49920, 49920, 49920, 1, + "#C1C1C1", 49601, 49601, 49601, 49408, 49408, 49408, 1, + "gray75", 49087, 49087, 49087, 49087, 49087, 49087, 1, + "gray74", 48573, 48573, 48573, 48573, 48573, 48573, 1, + "#BBBBBB", 48059, 48059, 48059, 47872, 47872, 47872, 1, + "#B9B9B9", 47545, 47545, 47545, 47360, 47360, 47360, 1, + "#B7B7B7", 47031, 47031, 47031, 46848, 46848, 46848, 1, + "gray71", 46517, 46517, 46517, 46517, 46517, 46517, 1, + "gray70", 46003, 46003, 46003, 46003, 46003, 46003, 1 +]). +script_frac("0.6"). +fg_bg_colors('white','white'). +dont_reencode("FFDingbests:ZapfDingbats"). +page(1,"",1,''). +box('#7C99B5','',138,68,350,156,1,1,1,47,0,0,0,0,0,'1',0,[ +]). +text('black',228,20,2,2,1,52,30,4,12,3,0,0,0,0,2,52,30,0,0,"",0,0,0,0,32,'',[ +minilines(52,30,0,0,2,0,0,[ +mini_line(44,12,3,0,0,0,[ +str_block(0,44,12,3,0,0,0,0,0,[ +str_seg('black','Helvetica-Bold',1,69120,44,12,3,0,0,0,0,0,0,0, + "Current")]) +]), +mini_line(52,12,3,0,0,0,[ +str_block(0,52,12,3,0,-1,0,0,0,[ +str_seg('black','Helvetica-Bold',1,69120,52,12,3,0,-1,0,0,0,0,0, + "turn rate")]) +]) +])]). +text('black',252,180,2,2,1,78,30,10,12,3,0,0,0,0,2,78,30,0,0,"",0,0,0,0,192,'',[ +minilines(78,30,0,0,2,0,0,[ +mini_line(58,12,3,0,0,0,[ +str_block(0,58,12,3,0,0,0,0,0,[ +str_seg('black','Helvetica-Bold',1,69120,58,12,3,0,0,0,0,0,0,0, + "AW target")]) +]), +mini_line(78,12,3,0,0,0,[ +str_block(0,78,12,3,0,-1,0,0,0,[ +str_seg('black','Helvetica-Bold',1,69120,78,12,3,0,-1,0,0,0,0,0, + "turn rate 3 /s")]) +]) +])]). +poly('white','',2,[ + 172,116,316,116],0,1,1,26,0,0,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]). +poly('white','',2,[ + 172,108,172,116],0,1,1,28,0,0,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]). +poly('white','',2,[ + 208,108,208,116],0,1,1,29,0,0,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]). +poly('white','',2,[ + 244,108,244,116],0,1,1,30,0,0,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]). +poly('white','',2,[ + 280,108,280,116],0,1,1,31,0,0,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]). +poly('white','',2,[ + 316,108,316,116],0,1,1,32,0,0,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]). +poly('white','',4,[ + 261,111,256,104,276,104,271,111],0,1,1,34,0,0,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]). +oval('white','',311,111,321,121,0,1,1,35,0,0,0,0,0,'1',0,[ +]). +text('black',237,192,1,0,1,5,11,62,9,2,0,0,0,0,2,5,11,0,0,"",0,0,0,0,201,'',[ +minilines(5,11,0,0,0,0,0,[ +mini_line(5,9,2,0,0,0,[ +str_block(0,5,9,2,0,-1,0,0,0,[ +str_seg('black','Helvetica-Bold',1,46080,5,9,2,0,-1,0,0,0,0,0, + "o")]) +]) +])]). +poly('black','',2,[ + 232,24,232,48],0,1,1,73,0,0,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]). +poly('black','',2,[ + 256,208,256,184],0,1,1,74,0,0,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]). +poly('black','',4,[ + 256,196,288,192,316,164,316,124],1,1,1,75,1,0,0,0,0,0,0,'1',0,0, + "6","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]). +poly('black','',4,[ + 232,36,268,44,280,76,272,100],1,1,1,78,1,0,0,0,0,0,0,'1',0,0, + "6","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]). +poly('white','',2,[ + 244,118,244,126],0,1,1,105,0,0,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]). +poly('white','',3,[ + 171,130,175,120,179,130],0,1,1,106,0,0,0,0,0,0,0,'1',1,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]). +poly('white','',2,[ + 172,127,178,127],0,1,1,126,0,0,0,0,0,0,0,'1',1,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]). +poly('white','',6,[ + 190,123,187,120,183,121,182,126,184,130,190,129],0,1,1,128,0,0,0,0,0,0,0,'1',1,0, + "00","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]). Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/manual/acmdoc_html-aw.png and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/manual/acmdoc_html-aw.png differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/manual/acmdoc_html_bank.gif and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/manual/acmdoc_html_bank.gif differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/manual/acmdoc_html_bank_vs_tas.png and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/manual/acmdoc_html_bank_vs_tas.png differ diff -Nru acm-5.0/doc/manual/acmdoc_html-classic-panel.obj acm-6.0+20200416/doc/manual/acmdoc_html-classic-panel.obj --- acm-5.0/doc/manual/acmdoc_html-classic-panel.obj 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/doc/manual/acmdoc_html-classic-panel.obj 2008-04-17 06:10:51.000000000 +0000 @@ -0,0 +1,260 @@ +%TGIF 4.1.43 +state(0,37,100.000,0,28,0,4,1,9,1,1,0,1,0,0,1,0,'Helvetica-Bold',1,63360,0,0,0,10,0,0,1,1,0,16,0,0,1,1,1,1,1088,1408,1,0,2880,0). +% +% @(#)$Header$ +% %W% +% +unit("1 pixel/pixel"). +color_info(17,65535,0,[ + "magenta", 65535, 0, 65535, 65535, 0, 65535, 1, + "red", 65535, 0, 0, 65535, 0, 0, 1, + "green", 0, 65535, 0, 0, 65535, 0, 1, + "blue", 0, 0, 65535, 0, 0, 65535, 1, + "yellow", 65535, 65535, 0, 65535, 65535, 0, 1, + "pink", 65535, 49344, 52171, 65535, 49344, 52171, 1, + "cyan", 0, 65535, 65535, 0, 65535, 65535, 1, + "CadetBlue", 24415, 40606, 41120, 24415, 40606, 41120, 1, + "white", 65535, 65535, 65535, 65535, 65535, 65535, 1, + "black", 0, 0, 0, 0, 0, 0, 1, + "DarkSlateGray", 12079, 20303, 20303, 12079, 20303, 20303, 1, + "#103000", 4112, 12336, 0, 4096, 12288, 0, 1, + "#70462D", 28784, 17990, 11565, 28672, 17920, 11520, 1, + "#C0C0C0", 49344, 49344, 49344, 49152, 49152, 49152, 1, + "#333638", 13107, 13878, 14392, 13056, 13824, 14336, 1, + "#305030", 12336, 20560, 12336, 12288, 20480, 12288, 1, + "#32B6E7", 12850, 46774, 59367, 12800, 46592, 59136, 1 +]). +script_frac("0.6"). +fg_bg_colors('black','white'). +page(1,"",1,''). +text('black',552,393,1,0,1,73,13,1,11,2,0,0,0,0,2,73,13,0,0,"",0,0,0,0,404,'',[ +minilines(73,13,0,0,0,0,0,[ +mini_line(73,11,2,0,0,0,[ +str_block(0,73,11,2,0,-1,0,0,0,[ +str_seg('black','Helvetica-Bold',1,63360,73,11,2,0,-1,0,0,0,0,0, + "Vertical Speed")]) +]) +])]). +text('black',184,393,1,0,1,45,13,3,11,2,0,0,0,0,2,45,13,0,0,"",0,0,0,0,404,'',[ +minilines(45,13,0,0,0,0,0,[ +mini_line(45,11,2,0,0,0,[ +str_block(0,45,11,2,0,-1,0,0,0,[ +str_seg('black','Helvetica-Bold',1,63360,45,11,2,0,-1,0,0,0,0,0, + "Airspeed")]) +]) +])]). +text('black',292,393,1,0,1,90,13,5,11,2,0,0,0,0,2,90,13,0,0,"",0,0,0,0,404,'',[ +minilines(90,13,0,0,0,0,0,[ +mini_line(90,11,2,0,0,0,[ +str_block(0,90,11,2,0,0,0,0,0,[ +str_seg('black','Helvetica-Bold',1,63360,90,11,2,0,0,0,0,0,0,0, + "Attitude and Bank")]) +]) +])]). +text('black',444,393,1,0,1,40,13,9,11,2,0,0,0,0,2,40,13,0,0,"",0,0,0,0,404,'',[ +minilines(40,13,0,0,0,0,0,[ +mini_line(40,11,2,0,0,0,[ +str_block(0,40,11,2,0,-1,0,0,0,[ +str_seg('black','Helvetica-Bold',1,63360,40,11,2,0,-1,0,0,0,0,0, + "Altitude")]) +]) +])]). +text('black',52,393,1,0,1,66,13,11,11,2,0,0,0,0,2,66,13,0,0,"",0,0,0,0,404,'',[ +minilines(66,13,0,0,0,0,0,[ +mini_line(66,11,2,0,0,0,[ +str_block(0,66,11,2,0,-1,0,0,0,[ +str_seg('black','Helvetica-Bold',1,63360,66,11,2,0,-1,0,0,0,0,0, + "Turn and Slip")]) +]) +])]). +text('black',352,205,1,0,1,93,13,13,11,2,0,0,0,0,2,93,13,0,0,"",0,0,0,0,216,'',[ +minilines(93,13,0,0,0,0,0,[ +mini_line(93,11,2,0,0,0,[ +str_block(0,93,11,2,0,-1,0,0,0,[ +str_seg('black','Helvetica-Bold',1,63360,93,11,2,0,-1,0,0,0,0,0, + "Auto-Pilot System")]) +]) +])]). +text('black',64,205,1,0,1,29,13,42,11,2,0,0,0,0,2,29,13,0,0,"",0,0,0,0,216,'',[ +minilines(29,13,0,0,0,0,0,[ +mini_line(29,11,2,0,0,0,[ +str_block(0,29,11,2,0,0,0,0,0,[ +str_seg('black','Helvetica-Bold',1,63360,29,11,2,0,0,0,0,0,0,0, + "Timer")]) +]) +])]). +poly('black','',7,[ + 180,236,188,228,392,228,400,220,408,228,600,228,608,236],0,1,1,44,1,0,0,0,0,0,0,'1',0,0, + "7c","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]). +poly('black','',7,[ + 24,236,32,228,72,228,80,220,88,228,120,228,136,236],0,1,1,58,1,0,0,0,0,0,0,'1',0,0, + "7c","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]). +xpm('black','',20,244,650,386,0,6,1,0,63,0,630,142,0,0,0,0,0,0,[ + " ", "black", 0, 0, 0, + ".", "#103000", 627, 1882, 0, + "X", "#70462D", 4392, 2745, 1764, + "o", "magenta", 10000, 0, 10000, + "O", "white", 10000, 10000, 10000, + "+", "#32B6E7", 1960, 7137, 9058],[ + "..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... ", + "...............................................................................................................................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.......................................................................................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo. ", + "...............................................................................................................................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.......................................................................................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo. ", + "...............................................................................................................................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.......................................................................................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo. ", + "...............................................................................................................................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.......................................................................................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo. ", + "...............................................................................................................................ooooooooooooooooooooooooooo ooo ooooo oooooooooo oooooooooooooooooooooooooooo.................................... .. ..............................................oooooooooooooooooooooooooooooo oooooooooooooooooooo ooooooooooooooooooooooooooooo...oooooooooooooooooooooooooooooo oooooooooooooooooooooooooooooooooooooooooooooo...ooooooooooooooooooooooooooooooooo o ooooooooooooooooooooooooooooooooooooooooo...oooooooooooooooooooooooooooo ooooooooooooooooooooooo oooooooooooooooooooooooooo. ", + "...............................................................................................................................ooooooooooooooooooooooooooo oo ooo ooooo oooooooooo oooooooooooooooooooooooooooo.................................... .. ..............................................oooooooooooooooooooooooooooooo oooooooooooooooooooo ooooooooooooooooooooooooooooo...oooooooooooooooooooooooooooooooo oooooooooooooooooooooooooooooooooooooooooooooooo...ooooooooooooooooooooooooooooooooooo ooo ooooooooooooooooooooooooooooooooooooooooo...ooooooooooooooooooooooooooo o oooooooooooooooooooooo oooooooooooooooooooooooooo. ", + "...............................................................................................................................ooooooooooooooooooooooooooo ooo ooooooooo oooooooooo oooooooooooooooooooooooooooo.................................... . .... .........................................oooooooooooooooooooooooooooooo oooooooo ooooooooooo ooooooooooooooooooooooooooooo...oooooooooooooooooooooooooooooooo oooooooooooooooooooooooooooooooooooooooooooooooo...ooooooooooooooooooooooooooooooooooo ooo ooooooooooooooooooooooooooooooooooooooooo...oooooooooooooooooooooooooo oooooooooooooooooooooooooo oooooooooooooooooooooooooo. ", + "...............................................................................................................................ooooooooooooooooooooooooooo o ooo ooooo ooo oo ooooooooooooooooooooooooooo.................................... . . .. . ...................................oooooooooooooooooooooooooooooo ooooo oo oo ooooooooooooooooooooooooooooo...oooooooooooooooooooooooooooooooo ooo oo oo oo ooooooooooooooooooooooooooooo...ooooooooooooooooooooooooooooooooooo ooo oo oooooooooooooooooooooooooooooooo...oooooooooooooooooooooooooo oooooo oo oo oo oooooooooooooooooooooooooo. ", + "...............................................................................................................................ooooooooooooooooooooooooooo ooooo ooooo ooo oo ooo oooooooooooooooooooooooooooo.................................... .. . .. ... ...................................oooooooooooooooooooooooooooooo ooooo oo oo oo oo oo ooooooooooooooooooooooooooooo...oooooooooooooooooooooooooooooooo ooo oo oo ooooo oo ooooooooooooooooooooooooooooo...ooooooooooooooooooooooooooooooooooo ooo oo oo ooooooooooooooooooooooooooooooooooo...oooooooooooooooooooooooooo ooooo oo oo oo oo ooooo oo oooooooooooooooooooooooooo. ", + "...............................................................................................................................ooooooooooooooooooooooooooo ooooooo ooooo ooo oo ooo ooooooooooooooooooooooooooo.................................... .. . .. ... ....................................oooooooooooooooooooooooooooooo ooooo oo oo oo oo oo ooooooooooooooooooooooooooooo...oooooooooooooooooooooooooooooooo ooo o oo ooooo oo ooooooooooooooooooooooooooooo...ooooooooooooooooooooooooooooooooooo ooo oo oo ooooooooooooooooooooooooooooooooooo...ooooooooooooooooooooooooooo oo o oo oo oo oo ooooo oo oooooooooooooooooooooooooo. ", + "...............................................................................................................................ooooooooooooooooooooooooooo ooooooo ooooo ooo oooo oooooooooooooooooooooooooo.................................... ... . .........................................oooooooooooooooooooooooooooooo oo oo oo oo ooooooooooooooooooooooooooooo...oooooooooooooooooooooooooooooooo ooo oo ooooo oo ooooooooooooooooooooooooooooo...ooooooooooooooooooooooooooooooooooo ooo oo oo ooooooooooooooooooooooooooooooooooo...ooooooooooooooooooooooooooo oo oo oo ooooo oooooooooooooooooooooooooo. ", + "...............................................................................................................................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.......................................................................................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo. ", + "..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... ", + "..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... ", + "..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... ", + "..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... ", + ".......................................................OOOOOOOOOOOOOOOOO.............................................................................................................OOOOOOOOOOOOOOOOO.............................................................................................................OOOOOOOOOOOOOOOOO.............................................................................................................OOOOOOOOOOOOOOOOO.............................................................................................................OOOOOOOOOOOOOOOOO..................................................... ", + "...............................................OOOOOOOOO...............OOOOOOOOO.............................................................................................OOOOOOOOO...............OOOOOOOOO.............................................................................................OOOOOOOOO.......O.......OOOOOOOOO.............................................................................................OOOOOOOOO.......O.......OOOOOOOOO.............................................................................................OOOOOOOOO...............OOOOOOOOO............................................. ", + ".............................................OOO...............................OOO.........................................................................................OOO...............................OOO.........................................................................................OOO....O..........O..........O....OOO.........................................................................................OOO...............O...............OOO.........................................................................................OOO...............................OOO........................................... ", + "..........................................OOOO...................................OOOO...................................................................................OOOO...................................OOOO...................................................................................OOOO......OO.........O.........OO......OOOO...................................................................................OOOO.................O.................OOOO...................................................................................OOOO...................................OOOO........................................ ", + "........................................OOO.........................................OOO...............................................................................OOO.........................................OOO...............................................................................OOO..........O.........O.........O..........OOO...............................................................................OOO.OO.................O.................OO.OOO...............................................................................OOO......................................O..OOO...................................... ", + "......................................OOO.............................................OOO...........................................................................OOO.............................................OOO...........................................................................OOO.OO.........O.........O.........O.........OO.OOO...........................................................................OOO....O.................O.................O....OOO...........................................................................OOO.......................................OO....OOO.................................... ", + "...................................OOOO.................................................OOOO.....................................................................OOOO.................................................OOOO.....................................................................OOOO....O...................O...................O....OOOO.....................................................................OOOO......OO................O................OO......OOOO.....................................................................OOOOOO.......................................O.......OOOO................................. ", + ".................................OOO.......................................................OOO.................................................................OOO.......................................................OOO.................................................................OOO.......OO..................O..................OO.......OOO.................................................................OOO..........O................O................O..........OOO.................................................................OOO....O.......................................O..........OOO............................... ", + "................................OO...........................................................OO...............................................................OO...........................................................OO...............................................................OO..........O..................O..................O..........OO...............................................................OO.............................O.............................OO...............................................................OO......OO......................................O............OO.............................. ", + "..............................OOO.............................................................OOO...........................................................OOO.............................................................OOO...........................................................OOOOO............................O............................OOOOO...........................................................OOO..............................O..............................OOO...........................................................OOO........O.....................................OO.............OOO............................ ", + ".............................OO.................................................................OO.........................................................OO.................................................................OO.........................................................OO...O............................O............................O...OO.........................................................OO................................O................................OO.........................................................OO..........O.....................................O................OO........................... ", + "............................OO...................................................................OO.......................................................OO...................................................................OO.......................................................OO....OO.......................................................OO....OO.......................................................OO...................................................................OO.......................................................OO...........OO......................................................OO.......................... ", + "...........................OO.....................................................................OO.....................................................OO....................................................................OOO.....................................................OO......O.......................................................O......OO.....................................................OO.....................................................................OO.....................................................OO.............O.......................................................OO......................... ", + ".........................OOO.......................................................................OOO.................................................OOO....................................................................OO.OOO.................................................OOO.......OO.........................OOO.........................OO.......OOO.................................................OOOOO...................................................................OOOOO.................................................OOO.......................................................................OOO....................... ", + "........................OO...........................................................................OO...............................................OO......................................................................O....OO...............................................OO..........O.........................O.O.........................O..........OO...............................................OO...OO..............................OOOOO..............................OO...OO...............................................OO...........................................................................OO...................... ", + ".......................OO.............................................................................OO.............................................OOO.....................................................................OO.....OO.............................................OO...........OO.......................OO.OO.......................OO...........OO.............................................OO.....O..............................O...OO.............................O.....OO.............................................OO.............................................................................OO..................... ", + ".....................OOO.......................................O.......................................OOO.........................................OOO.OO...................................................................OO.......OOO.........................................OOO.....................................O...O.....................................OOO.........................................OOO......OO.............................O....O............................OO......OOO.........................................OOO...............................................................................OOO................... ", + "....................OO.........................................O.........................................OO.......................................OO....OO..................................................................O..........OO.......................................OO......................................OO...OO......................................OO.......................................OO.........OO...........................OO....O...........................OO.........OO.......................................OO.................................................OOO....OOO........................OO.................. ", + "...................OO..........................O...............O...............O..........................OO.....................................OO......O.................................................................OO...........OO.....................................OO.......................................O.....O.......................................OO.....................................OO...........OO..........................O.....O..........................OO...........OO.....................................OO.................................................OO.OO..OO.OO........................OO................. ", + "..................OO...........................OO..............O..............OO...........................OO...................................OO.......OO..............................................................................OO...................................OO.......................................OO.....OO.......................................OO...................................OO........................................O.....O........................................OO...................................OO.......................O....OOO...................O...O..O...O.........................OO................ ", + "..................O.............................O..............O..............O.............................O...................................O.........OO..............................................................................O...................................O........................................OOOOOOOOO........................................O...................................O.........................................OO....O.........................................O...................................O.......................OO...OO.OO.....................OO..O...O..........................O................ ", + ".................OO.............................O..............O..............O.............................OO.................................OO..........OO............................................................................OOO.................................OO.........................................................................................OO.................................OO..........................................O....O.........................................OO.................................OO......................OOO...O...O....................OO...O...O..........................OO............... ", + "................OO..............................OO.............O.............OO..............................OO...............................OO........................................................................................OO.OO...............................OO...........................................................................................OO...............................OO...................OOOO....................O...OO.....................O....................OO...............................OOO........................O...O...O...................OO....O...O..........................OOO.............. ", + "...............OO................................O...........................O................................OO.............................OO..................................................................OO...OOOO..................OO.............................OO.............................................................................................OO.............................OO...................OO..OO...................OOOOO.....................OO.....................OO.............................OO.OO.......................O...O...O..................OO.....OO.OO.........................OO.OO............. ", + "...............O.................OO............................O............................OO.................O.............................O...................................................................OO...O..O...................O.............................O...............................................................................................O.............................O...................OO....O............................................OOO......................O.............................O...OOO.....................O...O...O..................OOOOO...OOO........................OOO...O............. ", + "..............OO..................O............................O............................O..................OO...........................OO..................................................................OOO...O..OO..................OO...........................OO...............................................................................................OO...........................OO...................O.....O..............................................O......................OO...........................OO.....OO....................O...OO.OO....................................................OO.....OO............ ", + ".............OO...................OO...........................O...........................OO...................OO.........................OO.............OOOO..OOOO..OOOO......................................O.O...O...O...................OO.........................OO.................................................................................................OO.........................OOOOO.................OO....O..............................................O....................OOOOO.........................OO.......OO...................O....OOO....................................................OO.......OO........... ", + "............OO.....................O...........................O...........................O.....................OO.......................OO..............O.....O..O..O..O.....................................OO.O...O..OO....................OO.......................OO...................................................................................................OO.......................OO...OO.................OO..OO..............................................O...................OO...OO.......................OO...................................................................................................OO.......... ", + "............O......................OO..........................O..........................OO......................O.......................O...............O.....O..OO.O..OO....................................OOOOOO.O..O......................O.......................O.....................................................................................................O.......................O........................OOOOO..........OOOO..OOOO..OOOO..OOOOO.............O.........................O.......................OOOO..................................................................................................O.......... ", + "...........OO.................................................OOO.................................................OO.....................OO...............OOOOO.O...O.O...O.......................................O...OOOO......................OO.....................OO............+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++..............OO.....................OO............................O..........O.....O.....O.......O...............O.........................OO.....................OO..OOO................................................................................................OO......... ", + "..........OO..................................................O.O..................................................OO...................OO....................O.O..OO.O..OO......................................................................OO...................OO.............+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++...............OO...................OO........................O...OO..........O.....O.....O.......O...............O..........................OO...................OO................OOOOO........................................................OOOOO...OOO...............OO........ ", + "..........O...................................................O.O...................................................O...................OOOO..............O..OO.O..O..O..O........................................................................O...................OOOO...........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.............OOOO...................O.........................OOOOO...........OOO...OOO...OOO.....O...............O...........................O...................O.................O...............................................................O...OO.OO...............O........ ", + ".........OO...................................................O.O...................................................OO.................OO.................OOOO..OOOO..OOOO......................................................................OOOO.................OO..OOO.........++++++++++++++++++OOO+++OOOOOOOOOOOOOOOOOOOOOOOOOOOOO++++OO++++++++++++++++............OO..OO.................OO.........................................O.....O.....O.......O...........................................OO.................OO.................O..............................................................OO...O...O...............OO....... ", + ".........O....................................................O.O....................................................O.................O......................................................................................................OOO..O.................O.....OO........+++++++++++++++OOOO+O++++++++++++++++++++++++++++++++++++OOOOO+++++++++++++..........OOO....O.................O..........................................O.....O.....O.......O............................................O.................O..................OOOOO..........................................................OOO..O...O................O....... ", + "........OO....................................................O.O....................................................OO...............OO....................................................................................................OOO....OO...............OO......OOO......++++++++++++++++OOOOO+++++++++++++++++++++++++++++++++++OOOO+O+++++++++++++........OOO......OO...............OO..........................................O.....OOOO..OOOO....O............................................OO...............OOOO................O...O............................................................O..O...O................OO...... ", + "........O.....................................................O.O.....................................................O...............O...................................................................................................OOO.......O...............O................+++++++++++++++OOOOO+++++++++++++++++++++++++++++++++++++OOOOO+++++++++++++..................O...............O.............................................................................................................O...............O..OOO..................O............................................................O..O...O.................O...... ", + ".......OO.....................................................O.O.....................................................OO.............OO.............................................................................................................OO.............OO................+++++++++++++++OO+++++++++++++++++++++++++++++++++++++++++++OO+++++++++++++..................OO.............OO.............................................................................................................OO.............OO...................O...O........................................................O...O..OO.OO.................OO..... ", + ".......O......................................................O.O......................................................O.............O........................................................................................OOO..OOOO..............O.............O.................++++++++++++++++++++++++++++++++++++OOOOO++++++++++++++++++++++++++++++++++...................O.............O...............................................................................................................O.............O....................OOOOO........................................................OOOOO...OOO...................O..... ", + ".......O......................................................O.O......................................................O.............O.......................................................................................OO.O..O..O..............O.............O.................+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++...................O.............O....................................OOOOO......OOOOO......OOOOOO...............................................O.............O...........................................OOOOOOO..OOOOOO...O......O..........................................O..... ", + "......OO.....................................................OO.OO.....................................................OO...........OO.......................................................................................O.....O..OO.............OO...........OO.................+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++...................OO...........OO....................................O...OO.....O...OO....OO....O...............................................OO...........OO...........................................O........O....OO..OO....OO..........................................OO.... ", + "......O......................................................O...O......................................................O...........O........................................................................................OOOO..O...O..............O...........O..................+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++....................O...........O....................................OO....O....OO....O....O.....O................................................O...........O............................................O........O.....O..OO....OO...........................................O.... ", + ".....OO......................................................O...O......................................................OO.........OO........................................................................................O..O..O..OO..............OO.........OO..................++++++++++++++++++++OOOOOO+++++++++++++++++++++++++OOOOOO++++++++++++++++++....................OO.........OO....................................O.....OO...O.....OO...OO....O................................................OO.........OOOO..........................................O........O.....O..OO...OOO...........................................OO... ", + ".....O.......................................................O...O.......................................................O.........O.........................................................................................O..O..O..O................O.........O...................++++++++++++++++++++OOOO+O++OOOOOOOOOOOOOOOOOOOOO++O+OO+O++++++++++++++++++.....................O.........OOOO..................................O......O...O......O....OO..OO....OOO....OOO................................OOOO.........O..OOO........................................O........O....OO..OOO..O.O............................................O... ", + "....OO.......................................................O...O.......................................................OO.......OO.........................................................................................OOOO..OOOO.............OOOOO.......OO...................++++++++++++++++++++OO+O+O+++++++++++++++++++++++++OOOO+O++++++++++++++++++.....................OO.......OO..OOOO........OOOOO..................O......O...O......O....OOOOO....OO.OO..OO.OO..............OOOOO.........OOOO..OO.......OO.............................................OOOOO....OOOOOO...O.O.OO.O............................................OO.. ", + "....O........................................................O...O........................................................O.......O.....................................................................................................................O.......O....................++++++++++++++++++++OOOOOO+++++++++++++++++++++++++OOOOOO++++++++++++++++++......................O.......O......OOOO.....O...OO.................O......O...O......O...OO...OO...O...O..O...O..............O...OO.....OOOO......O.......O..............................................O........O........O.O.O..O.............................................O.. ", + "....O........................................................O...O........................................................O.......O.....................................................................................................................O.......O....................+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++......................O.......O...............O....O....O.OO.........O......O...O......O...O.....OO.....OO..O...O..............O....O...............O.......O..............................................O........O........O.OOO..O.............................................O.. ", + "....O........................................................O...O........................................................O.......O.....................................................................................................................O.......O....................+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++......................O.......O...............O...OO......OOOO.......O.....OO...O.....OO...O......O....OO...O...O..............O...OO...............O.......O..............................................O........O........O..O...O.............................................O.. ", + "....O........................................................O...O........................................................O.......O.....................................................................................................................O.......O....................++++++++++++++++++++++++++++++++++++OOOOO++++++++++++++++++++++++++++++++++......................O.......O...............OOOOO........OOOOOO....OO....O....OO....O....O.....OO...OO....O...O.................OO................O.......O..............................................O........O........O......O.............................................O.. ", + "....O........................................................O...O........................................................OO......O.....................................................................................................................OO......O....................+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++......................OO......O...............O...OO.........OOOOOO...O...OO.....O...OO....OO....O...OO.....OO.OO................OO.................OO......O...............................................................................................OO....OOO.........OOOOOO. ", + "...OO........................................................O...O.........................................................O.....OO......................................................................................................................O.....OO....................+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.......................O.....OO..............OO....O...........OOOOOOOOOOOO......OOOOO......OOOOOO...OOOOO...OOO................OO...................O.....OO...............................................................................................OO...OO.OO....OOOOO....O. ", + "...O........................................................OO...OO........................................................O.....O.......................................................................................................................O.....O.....................+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.......................O.....O...............O.....O.............OO..OOO.......................................................OO....................O.....OOOOOO..........................................................................................OOO...O...O.............O. ", + "...O........................................................O.....O........................................................O.....O..................................................................................................OOOOOO..O............O.....O.....................++++++++++++++++++++++++++O+OOO++++++++++++++++O+OOO+++++++++++++++++++++++.......................O.....O...............OO....O..............OOO..OOOO...................................................OO.....................O.....O...............................................................................................O.O...O...O.............O. ", + "...O........................................................O.....O........................................................O.....OOOOOOOOOO.OO...OOOO..OOOO.................................................................OOOOOOOOOOOOOO...............O.....O.....................++++++++++++++++++++++++++O+O+O++OOOOOOOOOOO+++O+O+O+++++++++++++++++++++++.......................O.....O................OOOOOO................OOO...OOO.................................................OOOOOOO................O.....O..............................................................................................OO.O...O...O.............O. ", + "...O........................................................O.....O........................................................O.....O..........OO...O..O..O..O..........................................................OOOOOOOO.....OOOO..OOOO....OOOOOOOOOO.....O.....................++++++++++++++++++++++++++O+OOO++++++++++++++++O+OOO+++++++++++++++++++++++.......................O.....O........................................OOO...OOOO.....................................................................O.....O..............................................................................................OOOOOO.O...O.............O. ", + "...O........................................................O.....O........................................................O.....O.........OOO...O..OO.O..OO.................................................OOOOOOOOO.........OOOO..O..O..O.............O.....O.....................++++++++++++++++++++++++++O++OO++++++++++++++++O++OO+++++++++++++++++++++++.......................O.....O..........................................OO.....OOO...................................................................O.....O.................................................................................................O...OO.OO.............O. ", + "...O........................................................O.....O........................................................O.....O.........O.O...O...O.O...O.........................................OOOOOOOOO.............OOOOO..O..O..O..OO............O.....O.....................+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.......................O.....O...........................................OOO.....OOOO................................................................O.....O.................................................................................................O....OOO..............O. ", + "...O........................................................O.....O........................................................OO....O........OO.O...O..OO.O..OO.........................................O..................OOOO......OOOO..O...O............OO....O.....................+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.......................OO....O.............................................OOO......O................................................................OO....O.......................................................................................................................OO ", + "..OO........................................................O.....O.........................................................O...OO........OOOOOO.O..O..O..O..........................................OO.............OOOOO.........O..OO.O..OO.............O...OO.....................++++++++++++++++++++++++++++++++++++OOOOO++++++++++++++++++++++++++++++++++........................O...OO...............................................OOO...OO.................................................................O...OO........................................................................................................................O ", + "..O.........................................................O.....O.........................................................O...O............O...OOOO..OOOO...........................................O..........OOOO.............O..OO.O..O..............O...O......................+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++........................O...O..................................................OO..O..................................................................O...O................OOO......................................................................................................O ", + "..O.........................................................O.....O.........................................................O...O.....................................................................O.......OOOO................OOOO..OOOO..............O...O......................++++++++++++++++++++++++++++++++++++ + ++++++++++++++++++++++++++++++++++........................O...O...................................................OOOO..................................................................O...O...............OO.OO.....................................................................................................O ", + "..O........................................................OO.....OO........................................................O...O.....................................................................OO..OOOOO...........................................O...O......................++++++++ ++++++++++ ++++++++++ ++++++........................O...O.........................................................................................................................O...O...............O...O.....................................................................................................O ", + "..O........................................................O.......O........................................................O...O......................................................................OOOO...............................................O...OOOOOOOOOOO............++++++++ ++++++++++ ++++++++++ ++++++..............OOOOOOOOOOO...OOOOOO...............................................................................................................OOOOOO...OOOOOOOOO.......O...O.....................................................................................................O ", + "..O........................................................O.......O........................................................O...O.........................................................................................................................O...O......................OOOOOOOO +++++++++ + +++++++++ OOOOOO........................O...O.........................................................................................................................O...O...............O...O.....................................................................................................O ", + "..O........................................................O.......O........................................................O...O.....................................................................................................................OOOOO...O......................XXXXXXXXXOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOXXXXXXX........................O...O.........................................................................................................................O...O...............O...O..............................OOO....................................................................O ", + "..OO.......................................................O.......O........................................................O...OO........................................................................................................................O...OO.....................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX........................O...OO...............................OO.........O...O.........................O.....OOOO......................................O...OO..............OO.OO.............................OO.O....................................................................O ", + "...O.......................................................O.......O.......................................................OO....O.......................................................................................................................OO....O.....................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.......................OO....O................................O.........O...O.........................O.....O..OO....................................OO....O...............OOO............................OOO..OO..................................................................OO ", + "...O.......................................................OOOOOOOOO.......................................................O.....O..............................................................................................O...OOOO..OOOO...........O.....O.....................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.......................O.....O..........................................O...O.........................O.....O...O....O...............................O.....O.............................................OO.....O..................................................................O. ", + "...O.......................................................................................................................O.....O.............................................................................................OO...O..O..O..O...........O.....O.....................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.......................O.....O................................O...OOOO..OOOOO.OOOO....................OOOO..O.OOO.OOOO...............................O.....O............................................OO......OO..........................................OO....OOO..............O. ", + "...O.......................................................................................................................O.....O..............................................................................................O...O..OO.O..OO..........O.....O.....................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXOOOOOXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.......................O.....O................................O...O..O..O...O.O..O....................O..O..OOO...O..O...............................O.....O...........................................OO........O..........................................OO...OO.OO.............O. ", + "...O.......................................................................................................................O.....O..............................................................................................O...O...O.O...O..........O.....O.....................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.......................O.....O................................O...O..O..O...O.O..O....................O..O..O.....O..O...............................O.....O.........................................OOO.......OOO.........................................OOO...O...O.............O. ", + "...O.......................................................................................................................O.....O..............................................................................................O...O..OO.O..OO..........O.....O.....................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.......................O.....O...............OOOOOOO..........O...O..O..O...O.OOOO....................O..O..O.....OOOO.........OOOOOO................O.....O........................................OO.......OOO...........................................O.O...O...O.............O. ", + "...O.......................................................................................................................O.....O..............................................................................................O...O..O..O..O.OOOOOO....O.....O.....................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.......................O.....O....................OO...........................OOO.................................................O.................O.....OOOOOO..................................OO.......OO............................................OO.O...O...O.............O. ", + "...OO......................................................................................................................O.....OO.............................................................................................O...OOOO..OOOO......OOOOOO.....OO....................XXXXXXXXXXXXXXXXXXXXXXXXXXOXOOOXXXXXXXXXXXXXXXXOXOOOXXXXXXXXXXXXXXXXXXXXXXX.......................O.....OO...................O...............................................................................OO.................O.....OO.....................................OO......OOO.............................................OOOOOO.O...O....OOOOO....O. ", + "....O.....................................................................................................................OO......O.....................................................................................................................OO......O....................XXXXXXXXXXXXXXXXXXXXXXXXXXOXOXOXXOOOOOOOOOOOXXXOXOXOXXXXXXXXXXXXXXXXXXXXXXX......................OO......O..................OO..............................................................................OO.................OO......O...................................OOO.....OOO..................................................O...OO.OO........OOOOOO. ", + "....O.....................................................................................................................O.......O.....................................................................................................................O.......O....................XXXXXXXXXXXXXXXXXXXXXXXXXXOXOOOXXXXXXXXXXXXXXXXOXOOOXXXXXXXXXXXXXXXXXXXXXXX......................O.......O..................O...............................................................................OOOO...............O.......O..................................OO.....OOO....................................................O....OOO.............O.. ", + "....O.....................................................................................................................O.......OOOO...............................................O....OO..OOOOOOO...................................................O.......O....................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXOXXXXXXXXXXXXXXXXXOXXXXXXXXXXXXXXXXXXXXXXXXXXX......................O.......O.................OO..................................................................................O...............O.......O.................................OO....OOO...........................................................................O.. ", + "....O.....................................................................................................................O.......O..................................................O...OO......O......................................................O.......O....................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX......................O.......O.................O...........OOOO...OOO.........OOO..OOOO..........O...OOOO....O...OOOO..............O...............O.......O................................OO....OO...............O....OOO....OOO...............................................O.. ", + "....O.....................................................................................................................O.......O..................................................O..OO.......O......................................................O.......O....................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX......................O.......O......OOOO......OO...........O..O..OO.O........OO.O..O..O.........OO...O..O...OO.....OO..............O.....OOOO......O.......O..............................OOO...OOO...............OO...OO.OO..OO.OO..............................................O.. ", + "....OO...................................................................................................................OO.......OO.................................................O..O........O..........................O...OOOO..OOOO.............OO.......OO...................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXOOOOOXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.....................OO.......OO..OOOO.........O............O..O..O..O........O..O..O..O..........O...O..OO...O.....O.........OO...OO........OOOO..OO.......OO............................OO...OOO................OOO...O...O..O...O.............................................OO.. ", + ".....O...................................................................................................................O.........O.................................................O.OO........O.........................OO...O..O..O..O.............O.........O...................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.....................O.........OOOO...........................OO..OO.O........OO.O....OO..........O...O...O...O.....OOO........OOOOO............OOOO.........O..OOO......................OO..OOO..........OO.OO.....O...O...O..O...O.............................................O... ", + ".....OO.................................................................................................................OO.........OO................................................OOOOO.......O..........................O...O..O..O..OO...........OO.........OO..................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX....................OO.........OO............................OO....OOO.........OOO...OO...........O...O..OO...O.......O...........................OO.........OOOO.......................OO..OO.............OOO......O...O...O..O...O............................................OO... ", + "......O.................................................................................................................O...........O................................................OO..O.......O..........................O.....OO..O...O........OOOO...........O..................XXXXXXXXXXXXXXXXXXXXOOOOOOXXXXXXXXXXXXXXXXXXXXXXXXXXOOOOOXXXXXXXXXXXXXXXXXX....................O...........O...........................OO.......O...........O..OO............O...O..O....O...O..OO...........................O...........O.......................OOO.OOO..............OOO......O...O...O..O...O............................................O.... ", + "......OO...............................................................................................................OO...........OO...............................................O...OO......O..........................O....OO...O..OO..........OO...........OO.................XXXXXXXXXXXXXXXXXXXXOOOOXOXXXXXXXXXXXXXXXXXXXXXXXXXOOOOXOXXXXXXXXXXXXXXXXXX...................OO...........OO..........................OOOOO.OOOO...OO...OOOO..OOOOO.........O...OOOO....O...OOOO...........................OO...........OO.....................OO.OOO...............OO.OO.....O...OO.OO..OO.OO...........................................OO.... ", + ".......O...............................................................................................................O.............O...............................................O....OO.....O..........................O...OO....O..O...........O.............O.................XXXXXXXXXXXXXXXXXXXXOOXOXOXXOOOOOOXXXXXXXXXOOOOOOXXOOOOOOXXXXXXXXXXXXXXXXXX...................O.............O...............................................................................................................O.............O....................OOOOO...........................O....OOO....OOO............................................O..... ", + ".......O...............................................................................................................O.............O..............OOOO..OOOO..OOOO.................O...........O..........................O...OOOOO.OOOO...........O.............O.................XXXXXXXXXXXXXXXXXXXXOOOOOOXXXXXXXOOOOOOOOOOOXXXXXXXOOOXOOXXXXXXXXXXXXXXXXXX...................O.............O...............................................................................................................O.............O...................OOOO........................................................................................O..... ", + ".......OO.............................................................................................................OO.............OO...............OO..O..O..O..O................................................................................OO.............OO................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX..................OO.............OO.............................................................................................................OO.............OO................OOOOOOOO........................................................OOOOO...OOO..................OO..... ", + "........O.............................................................................................................O...............O...............O...O..OO.O..OO.....................................................................OOO.......O...............O................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX..................O...............O.............................................................................................................O...............O..OOO..........OOOOO...............................................................O...OO.OO.................O...... ", + "........OO......................OOOOOO...................................................OOOOOO......................OO...............OO..............OOO.O...O.O...O.......................................................................OOO....OO...............OO...............XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.................OO...............OO...........................................................................................................OO...............OOOO...........OOO..O..............................................................OO...O...O................OO...... ", + ".........O.....................OO....OOOOOO.........................................OOOOOO....OO.....................O.................O................O.O..OO.O..OO................................................O....OO...OOOO...........OOO..O.................O...............XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXOOOOOXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.................O.................O...........................................................................................................O.................O..................OOOOO..........................................................OOO..O...O................O....... ", + ".........OO....................O..........OOOOOO...............................OOOOOO..........O....................OO.................OO...........O..OO.O..O..O..O................................................OO....OO...O..O.............OOOO.................OO..............XXXXXXXXXXXXXXXOOOXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXOOOXXXXXXXXXXXXX................OO.................OO.........................................................................................................OO.................OO.................O...O............................................................O..O...O...............OO....... ", + "..........O....................O...............OOOOOO.....................OOOOOO...............O....................O...................O...........OOOO..OOOO..OOOO.................................................O...OOO...O..OO..............O...................O..............XXXXXXXXXXXXXXXXOOOOOXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXOOOXOXXXXXXXXXXXXX................O...................O.........................................................................................................O...................O.....................O............................................................O..O...O...............O........ ", + "..........OO...................O....................OOOOOOOO....O.OOOOOOOOO....................O...................OO...................OO...........................................................................O...O.O...O...O.............OO...................OO.............XXXXXXXXXXXXXXXOXOOXOXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXOOOXOXXXXXXXXXXXXX...............OO...................OO.........................OOOO..............................................OO..........................OO...................OO................O...O........................................................O...O..OO.OO..............OO........ ", + "...........OO.................OO.......................O..OO......OOO..O.......................OO.................OO.....................OO..........................................................................O..OO.O...O..OO............OO.....................OO.....................................................................................................OO.....................OO.......................OO..OO.............................................OO.........................OO.....................OO..OOO..........OOOOO........................................................OOOOO...OOO..............OO......... ", + "............O.................O........................O.OO.........OO.O........................O.................O.......................O.........OO...............................................................O..OOOOOO.O..O.............O.......................O.....................................................................................................O.......................O.......................O.................................................OOO.........................O.......................OOOO..................................................................................................O.......... ", + "............OO................O........................OOO...........O.O........................O................OO.......................OO.......OO................................................................O.....O...OOOO............OO.......................OO...................................................................................................OO.......................OO...OO................OO.................................................O.O...................OO...OO.......................OO...................................................................................................OO.......... ", + ".............OO...............O........................OO............OOO........................O...............OO.........................OO.....OO.......................................................................................OOOOO.........................OO.................................................................................................OO.........................OOOOO.................OOOOOOO...........................................OO.O....................OOOOO.........................OO.......OO...............................................................................OO.......OO........... ", + "..............OO.............OO........................OO.............OO........................OO.............OO...........................OO..OOO..........................................................................................OO...........................OO...............................................................................................OO...........................OO...................OO....O...........................................O..O......................OO...........................OO.....OO....................O....OOO.....................................................OO.....OO............ ", + "...............O.............O.........................OO.............OO.........................O.............O.............................O.OO.................................................................................OO.........O.............................O...............................................................................................O.............................O...................OO....O..........................................OO..O......................O.............................O...OOO....................OO...OO.OO.....................................................OOO...O............. ", + "...............OO............O........................OO...............OO........................O............OO.............................OOO...................................................................................OO.......OO.............................OO.............................................................................................OO.............................OO..................OO....O..........................................OOOOOOO...................OO.............................OO.OO.....................OOO...O...O...................OOO....OOO..........................OO.OO............. ", + "................OO...........O........................OOO..............OO........................O...........OO...............................OO....................................................................................OO.....OO...............................OO...........................................................................................OO...............................OO..................OO..OO...................OOOOO......................O....................OO...............................OOO........................O...O...O..................OO.OO..OO.OO..........................OOO.............. ", + ".................OO.........OO........................O.O.............OOO........................OO.........OO.................................OO........................................OOOO..OOOO..OOOO............................OO...OO.................................OO.........................................................................................OO.................................OO..................OOOO....................O..........................O...................OO.................................OO........................O...O...O..................O...O..O...O..........................OO............... ", + "..................O.........O.........................O.OO............O.O.........................O.........O...................................O........................................O..O..O..O..O..O.............................OO..O...................................O.........................................................................................O...................................O..........................................O..............................................O...................................O........................O...O...O.....................OO..O...O..........................O................ ", + "..................OO........OOOOOOO...................O..O...........OO.O...................OOOOOOO........OO...................................OO.......................................O..O..O..OO.O..OO.............................OOOO...................................OO.......................................................................................OO...................................OO.........................................O.............................................OO...................................OO.......................O...OO.OO....................OO...O...O.........................OO................ ", + "...................OO.............OOOOOOO.............O..OO.........OO..O..............OOOOOO.............OO.....................................OO........................................OO..O...O.O...O..............................OO.....................................OO.....................................................................................OO.....................................OO...........OO...........................OOOOOO..........................OO...........OO.....................................OO......................O....OOO....................OO....O...O........................OO................. ", + "....................OO..................OOOOOO........O...OO.......OO...O........OOOOOOO.................OO.......................................OO......................................OO...O..OO.O..OO.............................OO.......................................OO...................................................................................OO.......................................OO.........OO.................................O...........................OO.........OO.......................................OO................................................OO.....OO.OO.......................OO.................. ", + ".....................OOO.....................OOOOOOO..O....OO....OOO....O..OOOOOOO.....................OOO.........................................OOO...................................OO....O..O..O..O............................OOO.........................................OOO...............................................................................OOO.........................................OOO......OO..................................O............................OO......OOO.........................................OOO..............................................OOOOO...OOO......................OOO................... ", + ".......................OO..........................OOOOOOOOOO....OOOOOOOOOOO..........................OO.............................................OO..................................OOOOO.OOOO..OOOO........................OO.OO.............................................OO.............................................................................OO.............................................OO.....O...................................O.............................O.....OO.............................................OO.............................................................................OO..................... ", + "........................OO...........................................................................OO...............................................OO..........................................................................OOO...............................................OO...........................................................................OO...............................................OO...OO.............................OO...OO.............................OO...OO...............................................OO...........................................................................OO...................... ", + ".........................OO.........................................................................OO.................................................OO.........................................................................OO.................................................OO.........................................................................OO.................................................OO.OO...............................OOOOO...............................OO.OO.................................................OO.........................................................................OO....................... ", + "..........................OOO.....................................................................OOO...................................................OOO.....................................................................OOO...................................................OOO.....................................................................OOO...................................................OOO.....................................................................OOO...................................................OOO.............O.......................................................OOO........................ ", + "............................OO...................................................................OO.......................................................OO...............................................................O...OO.......................................................OO...................................................................OO.......................................................OO...................................................................OO.......................................................OO...........OO......................................................OO.......................... ", + ".............................OO.................................................................OO.........................................................OO..............................................................OO.OO.........................................................OO.................................................................OO.........................................................OO.................................................................OO.........................................................OO..........O.....................................O................OO........................... ", + "..............................OOO.............................................................OOO...........................................................OOO..................................O..........................OOO...........................................................OOO.............................................................OOO...........................................................OOO..............................O..............................OOO...........................................................OOO........O.....................................OO.............OOO............................ ", + "................................OO...........................................................OO...............................................................OO.....O...........................O...................O.....OO...............................................................OO...........................................................OO...............................................................OO.............................O.............................OO...............................................................OO......OO......................................O............OO.............................. ", + ".................................OOO.......................................................OOO.................................................................OOO..OO...........................O...................OO..OOO.................................................................OOO.......................................................OOO.................................................................OOO..........O................O................O..........OOO.................................................................OOO....O.......................................O..........OOO............................... ", + "...................................OOOO.................................................OOOO.....................................................................OOOO.....O......................O....................OOOO.....................................................................OOOO.................................................OOOO.....................................................................OOOO......OO................O................OO......OOOO.....................................................................OOOOOO.......................................O.......OOOO................................. ", + "......................................OOO.............................................OOO...........................................................................OOO..OO......................OO...........O.....OOO...........................................................................OOO.............................................OOO...........................................................................OOO....O.................O.................O....OOO...........................................................................OOO.......................................OO....OOO.................................... ", + "........................................OOO.........................................OOO...............................................................................OOOO......O.................O.....O.....OO..OOO...............................................................................OOO.........................................OOO...............................................................................OOO.OO.................O.................OO.OOO...............................................................................OOO......................................O..OOO...................................... ", + "..........................................OOOO...................................OOOO...................................................................................OOOO...OO.....O.....O.....O.....OO.....OOOO...................................................................................OOOO...................................OOOO...................................................................................OOOO.................O.................OOOO...................................................................................OOOO...................................OOOO........................................ ", + ".............................................OOO...............................OOO.........................................................................................OOO.O.....OO.....O.....O......O...OOO.........................................................................................OOO...............................OOO.........................................................................................OOO...............O...............OOO.........................................................................................OOO...............................OOO........................................... ", + "...............................................OOOOOOOOO...............OOOOOOOOO.............................................................................................OOOOOOOOO......O.....O..OOOOOOOOO.............................................................................................OOOOOOOOO...............OOOOOOOOO.............................................................................................OOOOOOOOO.......O.......OOOOOOOOO.............................................................................................OOOOOOOOO...............OOOOOOOOO............................................. ", + ".......................................................OOOOOOOOOOOOOOOOO.............................................................................................................OOOOOOOOOOOOOOOOO.............................................................................................................OOOOOOOOOOOOOOOOO.............................................................................................................OOOOOOOOOOOOOOOOO.............................................................................................................OOOOOOOOOOOOOOOOO..................................................... ", + "..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... ", + "..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... ", + "....................................................................................................OOOOOOOOOOOOOOOOOOOOOOOOOO....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... "],[ +]). +xpm('black','',92,248,135,259,0,2,1,0,67,0,43,11,0,0,0,0,0,0,[ + " ", "#103000", 627, 1882, 0, + ".", "white", 10000, 10000, 10000],[ + " ", + " .. ..... .... ...... ", + " .. . .. .. . ", + " ... .. . . .. ", + " . . .. . . . ", + " . ... .. . . . ", + " . . . . .. ", + " . . . . . ", + " . . .. .. .. . ", + " . ..... .. .... ", + " "],[ +]). Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/manual/acmdoc_html-classic-panel.png and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/manual/acmdoc_html-classic-panel.png differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/manual/acmdoc_html_hsi-ils.png and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/manual/acmdoc_html_hsi-ils.png differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/manual/acmdoc_html_hsi-nav.png and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/manual/acmdoc_html_hsi-nav.png differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/manual/acmdoc_html_hsi-rnav.png and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/manual/acmdoc_html_hsi-rnav.png differ diff -Nru acm-5.0/doc/manual/acmdoc_html_hsi_rnav-usage.obj acm-6.0+20200416/doc/manual/acmdoc_html_hsi_rnav-usage.obj --- acm-5.0/doc/manual/acmdoc_html_hsi_rnav-usage.obj 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/doc/manual/acmdoc_html_hsi_rnav-usage.obj 2007-08-31 12:19:25.000000000 +0000 @@ -0,0 +1,115 @@ +%TGIF 4.1.43-QPL +state(0,37,100.000,260,160,1,4,0,9,1,1,1,0,1,6,1,1,'Times-Bold',1,46080,0,0,0,10,0,1,1,1,0,16,0,0,1,1,1,1,1088,1408,1,0,5760,0). +% +% @(#)$Header$ +% %W% +% +unit("1 pixel/pixel"). +color_info(11,65535,0,[ + "magenta", 65535, 0, 65535, 65535, 0, 65535, 1, + "red", 65535, 0, 0, 65535, 0, 0, 1, + "green", 0, 65535, 0, 0, 65535, 0, 1, + "blue", 0, 0, 65535, 0, 0, 65535, 1, + "yellow", 65535, 65535, 0, 65535, 65535, 0, 1, + "pink", 65535, 49344, 52171, 65535, 49344, 52171, 1, + "cyan", 0, 65535, 65535, 0, 65535, 65535, 1, + "CadetBlue", 24415, 40606, 41120, 24415, 40606, 41120, 1, + "white", 65535, 65535, 65535, 65535, 65535, 65535, 1, + "black", 0, 0, 0, 0, 0, 0, 1, + "DarkSlateGray", 12079, 20303, 20303, 12079, 20303, 20303, 1 +]). +script_frac("0.6"). +fg_bg_colors('black','white'). +dont_reencode("FFDingbests:ZapfDingbats"). +page(1,"",1,''). +group([ +box('black','',244,307,268,331,2,1,1,330,0,0,0,0,0,'1',0,[ +]), +polygon('black','',7,[ + 244,319,250,307,262,307,268,319,262,331,250,331,244,319],2,1,1,0,331,0,0,0,0,0,'1',0, + "00",[ +]) +], +344,0,0,[ +]). +group([ +box('black','',468,244,492,268,2,1,7,348,0,0,0,0,0,'1',0,[ +]), +polygon('black','',7,[ + 468,256,474,244,486,244,492,256,486,268,474,268,468,256],2,1,7,0,349,0,0,0,0,0,'1',0, + "00",[ +]) +], +347,0,0,[ +]). +poly('black','',3,[ + 520,356,480,256,368,188],0,2,1,357,0,0,0,0,0,0,0,'2',0,0, + "0","",[ + 0,10,4,0,'10','4','0'],[0,10,4,0,'10','4','0'],[ +]). +text('black',504,251,1,0,1,126,16,40,12,4,2,0,0,0,2,126,16,0,0,"",0,0,0,0,263,'',[ +minilines(126,16,0,0,0,0,0,[ +mini_line(126,12,4,0,0,0,[ +str_block(0,126,12,4,0,0,0,0,0,[ +str_seg('black','Courier-Bold',1,80640,126,12,4,0,0,0,0,0,0,0, + "WP=75 /24.5 NM")]) +]) +])]). +text('black',550,246,1,0,1,6,11,100,9,2,2,0,0,0,2,6,11,0,0,"",0,0,0,0,255,'',[ +minilines(6,11,0,0,0,0,0,[ +mini_line(6,9,2,0,0,0,[ +str_block(0,6,9,2,0,-1,0,0,0,[ +str_seg('black','Courier-Bold',1,57600,6,9,2,0,-1,0,0,0,0,0, + "o")]) +]) +])]). +poly('black','',2,[ + 256,320,480,256],0,1,1,311,0,6,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]). +oval('black','',364,184,372,192,2,1,1,360,0,0,0,0,0,'1',0,[ +]). +oval('black','',516,352,524,360,2,1,1,361,0,0,0,0,0,'1',0,[ +]). +text('black',536,348,1,1,1,9,15,362,12,3,2,0,0,0,2,9,15,-1,0,"",0,0,0,0,360,'',[ +minilines(9,15,-1,0,1,0,0,[ +mini_line(9,12,3,-1,0,0,[ +str_block(0,9,12,3,-1,-1,0,0,0,[ +str_seg('black','Times-Bold',1,69120,9,12,3,-1,-1,0,0,0,0,0, + "A")]) +]) +])]). +text('black',384,180,1,1,1,9,15,364,12,3,2,0,0,0,2,9,15,0,0,"",0,0,0,0,192,'',[ +minilines(9,15,0,0,1,0,0,[ +mini_line(9,12,3,0,0,0,[ +str_block(0,9,12,3,0,-1,0,0,0,[ +str_seg('black','Times-Bold',1,69120,9,12,3,0,-1,0,0,0,0,0, + "B")]) +]) +])]). +text('black',307,315,1,1,1,59,15,370,12,3,2,0,0,0,2,59,15,0,0,"",0,0,0,0,327,'',[ +minilines(59,15,0,0,1,0,0,[ +mini_line(59,12,3,0,0,0,[ +str_block(0,59,12,3,0,-1,0,0,0,[ +str_seg('black','Times-Bold',1,69120,59,12,3,0,-1,0,0,0,0,0, + "VOR/DME")]) +]) +])]). +poly('black','',2,[ + 510,331,492,287],1,2,1,383,0,6,0,0,0,0,0,'2',0,0, + "0","",[ + 0,10,4,0,'10','4','0'],[0,10,4,0,'10','4','0'],[ +]). +poly('black','',2,[ + 460,244,420,220],1,2,1,384,0,6,0,0,0,0,0,'2',0,0, + "0","",[ + 0,10,4,0,'10','4','0'],[0,10,4,0,'10','4','0'],[ +]). +polygon('black','',18,[ + 504,307,502,310,502,313,493,314,493,317,502,317,502,321,500,321, + 500,323,508,323,508,321,506,321,506,317,515,317,515,314,506,313, + 506,310,504,307],2,1,1,0,406,0,0,0,1,0,'1',0, + "00000",[ + 493,307,493,307,515,323,918.036,-396.497,396.497,918.036,-2,6],[ +]). Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/manual/acmdoc_html_hsi_rnav-usage.png and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/manual/acmdoc_html_hsi_rnav-usage.png differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/manual/acmdoc_html_hud.png and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/manual/acmdoc_html_hud.png differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/manual/acmdoc_html-ils.png and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/manual/acmdoc_html-ils.png differ diff -Nru acm-5.0/doc/manual/acmdoc_html-landing-gear.obj acm-6.0+20200416/doc/manual/acmdoc_html-landing-gear.obj --- acm-5.0/doc/manual/acmdoc_html-landing-gear.obj 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/doc/manual/acmdoc_html-landing-gear.obj 2008-03-09 22:53:53.000000000 +0000 @@ -0,0 +1,430 @@ +%TGIF 4.1.43 +state(0,37,100.000,174,128,1,4,0,9,1,1,0,0,1,1,1,0,'Helvetica',0,69120,0,4,0,10,0,1,1,1,0,16,0,0,1,1,1,1,1088,1408,1,0,2880,0). +% +% @(#)$Header$ +% %W% +% +unit("1 pixel/pixel"). +color_info(12,65535,0,[ + "magenta", 65535, 0, 65535, 65535, 0, 65535, 1, + "red", 65535, 0, 0, 65535, 0, 0, 1, + "green", 0, 65535, 0, 0, 65535, 0, 1, + "blue", 0, 0, 65535, 0, 0, 65535, 1, + "yellow", 65535, 65535, 0, 65535, 65535, 0, 1, + "pink", 65535, 49344, 52171, 65535, 49344, 52171, 1, + "cyan", 0, 65535, 65535, 0, 65535, 65535, 1, + "CadetBlue", 24415, 40606, 41120, 24415, 40606, 41120, 1, + "white", 65535, 65535, 65535, 65535, 65535, 65535, 1, + "black", 0, 0, 0, 0, 0, 0, 1, + "DarkSlateGray", 12079, 20303, 20303, 12079, 20303, 20303, 1, + "gray", 48830, 48830, 48830, 48830, 48830, 48830, 1 +]). +script_frac("0.6"). +fg_bg_colors('black','white'). +page(1,"",1,''). +group([ +box('gray','',305,242,309,263,0,1,1,485,0,0,0,0,0,'1',0,[ +]), +oval('gray','',303,261,311,269,1,1,1,486,0,0,0,0,0,'1',0,[ +]), +poly('gray','',2,[ + 304,257,310,259],0,1,1,487,0,0,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]), +poly('gray','',2,[ + 304,254,310,256],0,1,1,488,0,0,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]), +poly('gray','',2,[ + 304,251,310,253],0,1,1,489,0,0,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]), +poly('gray','',2,[ + 304,248,310,250],0,1,1,490,0,0,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]), +oval('gray','',306,264,308,266,2,1,2,491,0,0,0,0,0,'1',0,[ +]), +box('gray','',303,228,311,248,2,1,1,492,0,0,0,0,0,'1',0,[ +]) +], +484,0,0,[ +]). +group([ +box('black','',321,250,325,271,0,1,1,362,0,0,0,0,0,'1',0,[ +]), +oval('black','',319,269,327,277,1,1,1,363,0,0,0,0,0,'1',0,[ +]), +poly('black','',2,[ + 320,265,326,267],0,1,1,364,0,0,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]), +poly('black','',2,[ + 320,262,326,264],0,1,1,365,0,0,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]), +poly('black','',2,[ + 320,259,326,261],0,1,1,366,0,0,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]), +poly('black','',2,[ + 320,256,326,258],0,1,1,367,0,0,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]), +oval('black','',322,272,324,274,2,1,2,368,0,0,0,0,0,'1',0,[ +]), +box('black','',319,236,327,256,2,1,1,369,0,0,0,0,0,'1',0,[ +]) +], +361,0,0,[ +]). +group([ +box('gray','',238,244,242,265,0,1,1,334,0,0,0,0,0,'1',0,[ +]), +oval('gray','',236,263,244,271,1,1,1,317,0,0,0,0,0,'1',0,[ +]), +poly('gray','',2,[ + 237,259,243,261],0,1,1,329,0,0,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]), +poly('gray','',2,[ + 237,256,243,258],0,1,1,330,0,0,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]), +poly('gray','',2,[ + 237,253,243,255],0,1,1,331,0,0,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]), +poly('gray','',2,[ + 237,250,243,252],0,1,1,332,0,0,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]), +oval('gray','',239,266,241,268,2,1,2,338,0,0,0,0,0,'1',0,[ +]), +box('gray','',236,230,244,250,2,1,1,336,0,0,0,0,0,'1',0,[ +]) +], +351,0,0,[ +]). +group([ +polygon('gray','',14,[ + 456,216,328,243,253,243,234,234,221,219,234,208,260,205,282,187, + 315,190,340,208,421,205,437,169,460,169,456,216],2,2,1,0,260,0,0,0,0,0,'2',0, + "0000",[ +]), +polygon('gray','',6,[ + 434,208,411,210,431,213,466,213,447,208,434,208],2,2,1,1,273,0,0,0,0,0,'2',0, + "fc",[ +]), +polygon('gray','',7,[ + 221,190,218,202,224,240,221,249,218,240,224,202,221,190],2,2,1,1,277,0,0,0,0,0,'2',0, + "fe",[ +]), +polygon('gray','',6,[ + 282,190,270,187,270,181,292,181,363,190,282,190],2,2,1,1,280,0,0,0,0,0,'2',0, + "fc",[ +]) +], +413,0,0,[ +]). +box('black','',520,352,768,376,26,1,0,182,0,0,0,0,0,'1',0,[ +]). +polygon('black','',6,[ + 628,176,632,156,640,148,648,156,652,176,628,176],2,2,1,0,91,0,0,0,0,0,'2',0, + "00",[ +]). +polygon('black','',9,[ + 600,148,620,152,636,168,644,168,660,152,680,148,680,136,600,136, + 600,148],2,2,1,0,98,0,0,0,0,0,'2',0, + "000",[ +]). +oval('black','',636,156,644,164,2,2,1,102,0,0,0,0,0,'2',0,[ +]). +group([ +box('black','',632,224,648,288,0,2,1,0,0,0,0,0,0,'2',0,[ +]), +poly('black','',6,[ + 632,224,628,225,632,226,648,228,651,229,648,230],0,3,1,37,1,0,0,0,0,0,0,'3',0,0, + "78","",[ + 0,12,5,0,'12','5','0'],[0,12,5,0,'12','5','0'],[ +]), +poly('black','',6,[ + 632,232,628,233,632,234,648,236,651,237,648,238],0,3,1,39,1,0,0,0,0,0,0,'3',0,0, + "78","",[ + 0,12,5,0,'12','5','0'],[0,12,5,0,'12','5','0'],[ +]), +poly('black','',6,[ + 632,240,628,241,632,242,648,244,651,245,648,246],0,3,1,42,1,0,0,0,0,0,0,'3',0,0, + "78","",[ + 0,12,5,0,'12','5','0'],[0,12,5,0,'12','5','0'],[ +]), +poly('black','',6,[ + 632,248,628,249,632,250,648,252,651,253,648,254],0,3,1,43,1,0,0,0,0,0,0,'3',0,0, + "78","",[ + 0,12,5,0,'12','5','0'],[0,12,5,0,'12','5','0'],[ +]), +poly('black','',6,[ + 632,256,628,257,632,258,648,260,651,261,648,262],0,3,1,44,1,0,0,0,0,0,0,'3',0,0, + "78","",[ + 0,12,5,0,'12','5','0'],[0,12,5,0,'12','5','0'],[ +]), +poly('black','',6,[ + 632,264,628,265,632,266,648,268,651,269,648,270],0,3,1,45,1,0,0,0,0,0,0,'3',0,0, + "78","",[ + 0,12,5,0,'12','5','0'],[0,12,5,0,'12','5','0'],[ +]), +poly('black','',6,[ + 632,272,628,273,632,274,648,276,651,277,648,278],0,3,1,46,1,0,0,0,0,0,0,'3',0,0, + "78","",[ + 0,12,5,0,'12','5','0'],[0,12,5,0,'12','5','0'],[ +]), +poly('black','',6,[ + 632,280,628,281,632,282,648,284,651,285,648,286],0,3,1,47,1,0,0,0,0,0,0,'3',0,0, + "78","",[ + 0,12,5,0,'12','5','0'],[0,12,5,0,'12','5','0'],[ +]), +box('black','',628,288,652,292,0,2,1,72,0,0,0,0,0,'2',0,[ +]), +group([ +oval('black','',624,292,656,324,1,2,1,73,0,0,0,0,0,'2',0,[ +]), +oval('white','',636,304,644,312,2,2,1,74,0,0,0,0,0,'2',0,[ +]) +], +90,0,0,[ +]) +], +117,0,0,[ +]). +poly('black','',2,[ + 652,240,714,240],0,1,1,119,0,2,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]). +poly('black','',2,[ + 652,288,713,288],0,1,1,120,0,2,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]). +poly('black','',2,[ + 640,160,745,160],0,1,1,124,0,2,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]). +poly('black','',2,[ + 640,324,744,324],0,1,1,125,0,2,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]). +poly('black','',2,[ + 713,240,713,288],3,1,1,131,0,2,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]). +poly('black','',2,[ + 745,160,745,324],3,1,1,132,0,2,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]). +poly('black','',3,[ + 632,260,580,276,544,276],0,1,1,134,0,0,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]). +text('black',713,270,1,0,1,15,42,147,12,3,0,0,0,0,2,42,15,0,0,"",0,1,0,0,282,'',[ + 713,270,713,270,755,285,-1.83691e-13,-1000,1000,-1.83691e-13,-16,16,712,269,756,286],[ +minilines(42,15,0,0,0,0,0,[ +mini_line(42,12,3,0,0,0,[ +str_block(0,42,12,3,0,0,0,0,0,[ +str_seg('black','Helvetica',0,69120,42,12,3,0,0,0,0,0,0,0, + "CmMax")]) +]) +])]). +text('black',746,262,1,0,1,15,75,149,12,3,0,0,0,0,2,75,15,0,0,"",0,1,0,0,274,'',[ + 746,262,746,262,821,277,-1.83691e-13,-1000,1000,-1.83691e-13,-16,16,745,261,822,278],[ +minilines(75,15,0,0,0,0,0,[ +mini_line(75,12,3,0,0,0,[ +str_block(0,75,12,3,0,0,0,0,0,[ +str_seg('black','Helvetica',0,69120,75,12,3,0,0,0,0,0,0,0, + "Gm + CmMax")]) +]) +])]). +text('black',544,260,1,0,1,38,15,167,12,3,0,0,0,0,2,38,15,0,0,"",0,0,0,0,272,'',[ +minilines(38,15,0,0,0,0,0,[ +mini_line(38,12,3,0,0,0,[ +str_block(0,38,12,3,0,-1,0,0,0,[ +str_seg('black','Helvetica',0,69120,38,12,3,0,-1,0,0,0,0,0, + "0.5 Km")]) +]) +])]). +poly('black','',2,[ + 520,352,768,352],0,2,1,181,0,0,0,0,0,0,0,'2',0,0, + "0","",[ + 0,10,4,0,'10','4','0'],[0,10,4,0,'10','4','0'],[ +]). +text('black',528,337,1,0,1,31,13,189,11,2,0,0,0,0,2,31,13,0,0,"",0,0,0,0,348,'',[ +minilines(31,13,0,0,0,0,0,[ +mini_line(31,11,2,0,0,0,[ +str_block(0,31,11,2,0,-1,0,0,0,[ +str_seg('black','Helvetica',0,57600,31,11,2,0,-1,0,0,0,0,0, + "Terrain")]) +]) +])]). +text('black',544,164,1,0,1,17,15,218,12,3,0,0,0,0,2,17,15,0,0,"",0,0,0,0,176,'',[ +minilines(17,15,0,0,0,0,0,[ +mini_line(17,12,3,0,0,0,[ +str_block(0,17,12,3,0,-1,0,0,0,[ +str_seg('black','Helvetica',0,69120,17,12,3,0,-1,0,0,0,0,0, + "Rm")]) +]) +])]). +box('black','',628,176,652,240,2,2,1,68,0,0,0,0,0,'2',0,[ +]). +poly('black','',3,[ + 636,208,596,224,544,224],0,1,1,133,0,0,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]). +oval('black','',634,206,638,210,1,1,1,137,0,0,0,0,0,'1',0,[ +]). +text('black',544,208,1,0,1,39,15,165,12,3,0,0,0,0,2,39,15,0,0,"",0,0,0,0,220,'',[ +minilines(39,15,0,0,0,0,0,[ +mini_line(39,12,3,0,0,0,[ +str_block(0,39,12,3,0,-1,0,0,0,[ +str_seg('black','Helvetica',0,69120,39,12,3,0,-1,0,0,0,0,0, + "0.5 Dm")]) +]) +])]). +polygon('black','',5,[ + 628,292,636,316,644,316,652,292,628,292],2,2,1,0,258,0,0,0,0,0,'2',0, + "00",[ +]). +oval('black','',636,304,644,312,2,2,1,259,0,0,0,0,0,'2',0,[ +]). +oval('black','',291,217,297,222,1,2,1,274,0,0,0,0,0,'2',0,[ +]). +poly('black','',2,[ + 190,220,470,220],2,1,1,275,0,2,4,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]). +poly('black','',2,[ + 294,165,294,290],1,1,1,276,0,2,4,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]). +text('gray',180,211,1,0,1,6,15,393,12,3,2,0,0,0,2,6,15,0,0,"",0,0,0,0,223,'',[ +minilines(6,15,0,0,0,0,0,[ +mini_line(6,12,3,0,0,0,[ +str_block(0,6,12,3,0,0,0,0,0,[ +str_seg('black','Helvetica',0,69120,6,12,3,0,0,0,0,0,0,0, + "x")]) +]) +])]). +text('gray',291,290,1,0,1,6,15,395,12,3,2,0,0,0,2,6,15,0,0,"",0,0,0,0,302,'',[ +minilines(6,15,0,0,0,0,0,[ +mini_line(6,12,3,0,0,0,[ +str_block(0,6,12,3,0,-1,0,0,0,[ +str_seg('black','Helvetica',0,69120,6,12,3,0,-1,0,0,0,0,0, + "z")]) +]) +])]). +text('black',228,304,2,0,1,27,30,437,12,3,2,0,0,0,2,27,30,0,0,"",0,0,0,0,316,'',[ +minilines(27,30,0,0,0,0,0,[ +mini_line(27,12,3,0,0,0,[ +str_block(0,27,12,3,0,-1,0,0,0,[ +str_seg('black','Helvetica',0,69120,27,12,3,0,-1,0,0,0,0,0, + "nose")]) +]), +mini_line(25,12,3,0,0,0,[ +str_block(0,25,12,3,0,0,0,0,0,[ +str_seg('black','Helvetica',0,69120,25,12,3,0,0,0,0,0,0,0, + "gear")]) +]) +])]). +text('black',308,304,2,0,1,63,30,439,12,3,2,0,0,0,2,63,30,0,0,"",0,0,0,0,316,'',[ +minilines(63,30,0,0,0,0,0,[ +mini_line(55,12,3,0,0,0,[ +str_block(0,55,12,3,0,0,0,0,0,[ +str_seg('black','Helvetica',0,69120,55,12,3,0,0,0,0,0,0,0, + "main gear")]) +]), +mini_line(63,12,3,0,0,0,[ +str_block(0,63,12,3,0,-1,0,0,0,[ +str_seg('black','Helvetica',0,69120,63,12,3,0,-1,0,0,0,0,0, + "(left + right)")]) +]) +])]). +box('black','',592,124,688,140,2,1,0,451,0,0,0,0,0,'1',0,[ +]). +poly('black','',3,[ + 636,160,581,180,545,180],0,1,1,216,0,0,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]). +poly('black','',2,[ + 584,140,700,140],0,1,1,470,0,2,5,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]). +text('black',300,200,1,0,1,20,15,474,12,3,2,0,0,0,2,20,15,0,0,"",0,0,0,0,212,'',[ +minilines(20,15,0,0,0,0,0,[ +mini_line(20,12,3,0,0,0,[ +str_block(0,20,12,3,0,-1,0,0,0,[ +str_seg('black','Helvetica',0,69120,20,12,3,0,-1,0,0,0,0,0, + "CM")]) +]) +])]). +oval('black','',304,240,344,280,0,2,1,502,0,0,0,0,0,'2',0,[ +]). +group([ +oval('black','',484,96,796,408,0,7,2,511,0,0,0,0,0,'7',0,[ +]), +oval('black','',484,96,796,408,0,2,1,514,0,0,0,0,0,'2',0,[ +]), +polygon('black','',7,[ + 542,377,528,365,519,354,513,359,514,382,534,382,542,377],2,2,2,0,523,0,0,0,0,0,'2',0, + "00",[ +]), +polygon('black','',6,[ + 767,348,751,366,737,379,776,383,773,348,767,348],2,2,2,0,526,0,0,0,0,0,'2',0, + "00",[ +]) +], +537,0,0,[ +]). +poly('black','',2,[ + 568,113,317,241],0,2,1,557,0,2,0,0,0,0,0,'2',0,0, + "0","",[ + 0,10,4,0,'10','4','0'],[0,10,4,0,'10','4','0'],[ +]). +poly('black','',2,[ + 315,278,567,390],0,2,1,559,0,2,0,0,0,0,0,'2',0,0, + "0","",[ + 0,10,4,0,'10','4','0'],[0,10,4,0,'10','4','0'],[ +]). +poly('black','',2,[ + 310,228,242,192],1,1,1,560,0,2,4,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]). +text('black',233,178,1,0,1,7,15,562,12,3,2,0,0,0,2,7,15,0,0,"",0,0,0,0,190,'',[ +minilines(7,15,0,0,0,0,0,[ +mini_line(7,12,3,0,0,0,[ +str_block(0,7,12,3,0,-1,0,0,0,[ +str_seg('black','Helvetica',0,69120,7,12,3,0,-1,0,0,0,0,0, + "y")]) +]) +])]). Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/manual/acmdoc_html-landing-gear.png and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/manual/acmdoc_html-landing-gear.png differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/manual/acmdoc_html-magnetic_compass.png and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/manual/acmdoc_html-magnetic_compass.png differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/manual/acmdoc_html_radar-coverage.png and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/manual/acmdoc_html_radar-coverage.png differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/manual/acmdoc_html_radar-display.png and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/manual/acmdoc_html_radar-display.png differ diff -Nru acm-5.0/doc/manual/acmdoc_html-reference-frame.obj acm-6.0+20200416/doc/manual/acmdoc_html-reference-frame.obj --- acm-5.0/doc/manual/acmdoc_html-reference-frame.obj 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/doc/manual/acmdoc_html-reference-frame.obj 2007-07-09 06:53:04.000000000 +0000 @@ -0,0 +1,220 @@ +%TGIF 4.1.43-QPL +state(0,37,100.000,0,0,1,4,1,9,1,1,4,1,2,2,1,2,'Times-Bold',1,195840,0,0,0,10,0,0,1,1,0,16,0,0,1,1,1,1,1088,1408,1,0,2880,0). +% +% @(#)$Header$ +% %W% +% +unit("1 pixel/pixel"). +color_info(13,65535,0,[ + "magenta", 65535, 0, 65535, 65535, 0, 65535, 1, + "red", 65535, 0, 0, 65535, 0, 0, 1, + "green", 0, 65535, 0, 0, 65535, 0, 1, + "blue", 0, 0, 65535, 0, 0, 65535, 1, + "yellow", 65535, 65535, 0, 65535, 65535, 0, 1, + "pink", 65535, 49344, 52171, 65535, 49344, 52171, 1, + "cyan", 0, 65535, 65535, 0, 65535, 65535, 1, + "CadetBlue", 24415, 40606, 41120, 24415, 40606, 41120, 1, + "white", 65535, 65535, 65535, 65535, 65535, 65535, 1, + "black", 0, 0, 0, 0, 0, 0, 1, + "DarkSlateGray", 12079, 20303, 20303, 12079, 20303, 20303, 1, + "#dddddd", 56797, 56797, 56797, 56576, 56576, 56576, 1, + "#888888", 34952, 34952, 34952, 34816, 34816, 34816, 1 +]). +script_frac("0.6"). +fg_bg_colors('black','white'). +dont_reencode("FFDingbests:ZapfDingbats"). +page(1,"",1,''). +group([ +polygon('#888888','',5,[ + 688,136,668,144,760,188,784,180,688,136],2,4,1,0,262,0,0,0,0,0,'4',0, + "00",[ +]), +polygon('#888888','',6,[ + 664,28,684,16,684,116,664,128,664,36,664,28],2,4,1,0,256,0,0,0,0,0,'4',0, + "00",[ +]), +oval('#888888','',452,404,480,436,1,4,1,104,0,0,0,0,0,'4',0,[ +]), +polygon('#888888','',8,[ + 440,420,448,428,464,428,504,404,496,396,464,388,448,404,440,420],2,4,1,1,105,0,0,0,0,0,'4',0, + "ff",[ +]), +oval('#888888','',236,436,264,468,1,4,1,55,0,0,0,0,0,'4',0,[ +]), +polygon('#888888','',8,[ + 224,452,232,460,248,460,288,436,280,428,248,420,232,436,224,452],2,4,1,1,37,0,0,0,0,0,'4',0, + "ff",[ +]), +poly('#888888','',7,[ + 248,316,184,364,176,380,184,428,208,452,256,444,416,364],0,4,1,15,1,2,0,0,0,0,0,'4',0,0, + "7c","",[ + 0,14,6,0,'14','6','0'],[0,14,6,0,'14','6','0'],[ +]), +polygon('#888888','',7,[ + 184,124,56,144,632,468,728,404,580,320,308,172,184,124],2,4,1,0,9,0,0,0,0,0,'4',0, + "00",[ +]), +poly('#888888','',4,[ + 56,144,40,148,632,484,632,468],0,4,1,10,1,2,0,0,0,0,0,'4',0,0, + "6","",[ + 0,14,6,0,'14','6','0'],[0,14,6,0,'14','6','0'],[ +]), +poly('#888888','',7,[ + 288,260,264,276,240,324,272,332,304,356,336,316,360,300],0,4,1,12,1,2,0,0,0,0,0,'4',0,0, + "7c","",[ + 0,14,6,0,'14','6','0'],[0,14,6,0,'14','6','0'],[ +]), +poly('#888888','',2,[ + 288,260,360,300],0,4,1,28,1,2,0,0,0,0,0,'4',0,0, + "0","",[ + 0,14,6,0,'14','6','0'],[0,14,6,0,'14','6','0'],[ +]), +poly('#888888','',4,[ + 204,372,240,388,248,396,236,428],0,2,1,31,1,2,0,0,0,0,0,'2',0,0, + "6","",[ + 0,10,4,0,'10','4','0'],[0,10,4,0,'10','4','0'],[ +]), +poly('#888888','',5,[ + 344,324,320,348,320,356,328,356,376,340],0,4,1,32,1,2,0,0,0,0,0,'4',0,0, + "70","",[ + 0,14,6,0,'14','6','0'],[0,14,6,0,'14','6','0'],[ +]), +poly('#888888','',4,[ + 292,168,268,176,364,224,380,212],0,4,1,69,0,2,0,0,0,0,0,'4',0,0, + "0","",[ + 0,14,6,0,'14','6','0'],[0,14,6,0,'14','6','0'],[ +]), +poly('#888888','',2,[ + 684,16,684,132],0,4,1,80,0,0,0,0,0,0,0,'4',0,0, + "0","",[ + 0,14,6,0,'14','6','0'],[0,14,6,0,'14','6','0'],[ +]), +poly('#888888','',2,[ + 516,284,644,180],0,4,1,87,0,2,0,0,0,0,0,'4',0,0, + "0","",[ + 0,14,6,0,'14','6','0'],[0,14,6,0,'14','6','0'],[ +]), +poly('#888888','',6,[ + 412,224,460,224,624,148,628,64,656,28,684,16],0,4,1,27,1,0,0,0,0,0,0,'4',0,0, + "78","",[ + 0,14,6,0,'14','6','0'],[0,14,6,0,'14','6','0'],[ +]), +poly('#888888','',10,[ + 680,132,640,152,628,160,624,168,704,208,712,212,720,212,728,212, + 784,180,680,132],0,4,1,97,0,0,0,0,0,0,0,'4',0,0, + "000","",[ + 0,14,6,0,'14','6','0'],[0,14,6,0,'14','6','0'],[ +]), +poly('#888888','',7,[ + 628,112,564,80,528,104,524,108,524,112,524,120,596,156],0,4,1,99,0,0,0,0,0,0,0,'4',0,0, + "00","",[ + 0,14,6,0,'14','6','0'],[0,14,6,0,'14','6','0'],[ +]), +poly('#888888','',7,[ + 408,372,448,400,456,396,408,360,404,364,404,368,412,376],0,4,1,108,0,2,0,0,0,0,0,'4',0,0, + "00","",[ + 0,14,6,0,'14','6','0'],[0,14,6,0,'14','6','0'],[ +]), +polygon('#888888','',9,[ + 372,228,400,220,428,228,452,240,472,256,456,252,420,260,368,236, + 372,228],2,4,1,0,115,0,0,0,0,0,'4',0, + "000",[ +]), +polygon('#888888','',5,[ + 564,80,544,92,620,128,624,112,564,80],2,4,1,0,261,0,0,0,0,0,'4',0, + "00",[ +]), +polygon('#888888','',5,[ + 588,324,568,340,664,392,684,380,588,324],2,4,1,0,419,0,0,0,0,0,'4',0, + "00",[ +]), +polygon('#888888','',5,[ + 280,160,252,168,188,136,200,128,280,160],2,4,1,0,425,0,0,0,0,0,'4',0, + "00",[ +]), +poly('#888888','',4,[ + 468,260,448,272,552,332,572,316],0,4,1,63,0,2,0,0,0,0,0,'4',0,0, + "0","",[ + 0,14,6,0,'14','6','0'],[0,14,6,0,'14','6','0'],[ +]), +polygon('#888888','',5,[ + 688,136,680,140,704,152,712,148,688,136],0,3,1,0,471,0,0,0,0,0,'3',0, + "00",[ +]), +poly('#888888','',3,[ + 608,104,600,108,624,120],0,3,1,474,0,0,0,0,0,0,0,'3',0,0, + "0","",[ + 0,12,5,0,'12','5','0'],[0,12,5,0,'12','5','0'],[ +]), +poly('#888888','',7,[ + 192,428,208,468,224,500,232,500,240,500,232,476,208,428],0,4,1,30,1,2,0,0,0,0,0,'4',0,0, + "7c","",[ + 0,14,6,0,'14','6','0'],[0,14,6,0,'14','6','0'],[ +]), +poly('#888888','',7,[ + 192,388,176,404,176,428,200,428,224,420,216,388,192,388],0,4,1,17,1,2,0,0,0,0,0,'4',0,0, + "7c","",[ + 0,14,6,0,'14','6','0'],[0,14,6,0,'14','6','0'],[ +]), +poly('#888888','',8,[ + 184,404,160,364,144,300,160,316,200,404,200,412,192,412,184,404],0,4,1,29,1,2,0,0,0,0,0,'4',0,0, + "7e","",[ + 0,14,6,0,'14','6','0'],[0,14,6,0,'14','6','0'],[ +]), +oval('#888888','',280,272,296,288,2,2,2,552,0,0,0,0,0,'2',0,[ +]) +], +862,0,0,[ +]). +text('black',44,514,1,0,1,80,37,355,30,7,0,0,0,0,2,80,37,0,0,"",0,0,0,0,544,'',[ +minilines(80,37,0,0,0,0,0,[ +mini_line(80,30,7,0,0,0,[ +str_block(0,80,30,7,0,-2,0,0,0,[ +str_seg('black','Times-Bold',1,195840,80,30,7,0,-2,0,0,0,0,0, + "x axis")]) +]) +])]). +text('black',116,218,1,2,1,80,37,357,30,7,0,0,0,0,2,80,37,0,0,"",0,0,0,0,248,'',[ +minilines(80,37,0,0,2,0,0,[ +mini_line(80,30,7,0,0,0,[ +str_block(0,80,30,7,0,-2,0,0,0,[ +str_seg('black','Times-Bold',1,195840,80,30,7,0,-2,0,0,0,0,0, + "y axis")]) +]) +])]). +poly('black','',2,[ + 344,80,344,520],1,7,1,303,0,4,4,0,0,0,0,'7',0,0, + "0","",[ + 0,22,9,0,'22','9','0'],[0,22,9,0,'22','9','0'],[ +]). +poly('black','',2,[ + 720,116,96,488],1,7,1,300,0,4,4,0,0,0,0,'7',0,0, + "0","",[ + 0,22,9,0,'22','9','0'],[0,22,9,0,'22','9','0'],[ +]). +poly('black','',2,[ + 68,184,660,516],2,7,1,302,0,4,4,0,0,0,0,'7',0,0, + "0","",[ + 0,22,9,0,'22','9','0'],[0,22,9,0,'22','9','0'],[ +]). +text('black',308,514,1,0,1,78,37,630,30,7,0,0,0,0,2,78,37,0,0,"",0,0,0,0,544,'',[ +minilines(78,37,0,0,0,0,0,[ +mini_line(78,30,7,0,0,0,[ +str_block(0,78,30,7,0,-2,0,0,0,[ +str_seg('black','Times-Bold',1,195840,78,30,7,0,-2,0,0,0,0,0, + "z axis")]) +]) +])]). +poly('black','',3,[ + 360,340,564,336,636,288],2,5,1,770,1,0,0,0,0,0,0,'5',0,0, + "4","",[ + 0,18,7,0,'18','7','0'],[0,18,7,0,'18','7','0'],[ +]). +text('black',644,258,1,0,1,55,37,780,30,7,0,0,0,0,2,55,37,0,0,"",0,0,0,0,288,'',[ +minilines(55,37,0,0,0,0,0,[ +mini_line(55,30,7,0,0,0,[ +str_block(0,55,30,7,0,-2,0,0,0,[ +str_seg('black','Times-Bold',1,195840,55,30,7,0,-2,0,0,0,0,0, + "CM")]) +]) +])]). Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/manual/acmdoc_html-reference-frame.png and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/manual/acmdoc_html-reference-frame.png differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/manual/acmdoc_html-runway_step.png and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/manual/acmdoc_html-runway_step.png differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/manual/acmdoc_html_scale.png and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/manual/acmdoc_html_scale.png differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/manual/acmdoc_html-shot.png and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/manual/acmdoc_html-shot.png differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/manual/acmdoc_html-steer.png and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/manual/acmdoc_html-steer.png differ diff -Nru acm-5.0/doc/manual/acmdoc_html-steer.svg acm-6.0+20200416/doc/manual/acmdoc_html-steer.svg --- acm-5.0/doc/manual/acmdoc_html-steer.svg 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/doc/manual/acmdoc_html-steer.svg 2018-09-10 13:15:45.000000000 +0000 @@ -0,0 +1,586 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + R + r + + + + + + MinRadius + + + Q + + + + + + + + + + + + + + + + + MaxNWDef + + diff -Nru acm-5.0/doc/manual/acmdoc_html-vor-line-sigth.obj acm-6.0+20200416/doc/manual/acmdoc_html-vor-line-sigth.obj --- acm-5.0/doc/manual/acmdoc_html-vor-line-sigth.obj 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/doc/manual/acmdoc_html-vor-line-sigth.obj 2007-09-05 21:21:24.000000000 +0000 @@ -0,0 +1,99 @@ +%TGIF 4.1.43-QPL +state(0,37,100.000,0,0,0,8,0,9,1,1,0,1,0,0,1,0,'Helvetica-Bold',1,80640,0,0,0,10,0,0,1,1,0,16,0,0,1,1,1,1,1088,1408,1,0,2880,0). +% +% @(#)$Header$ +% %W% +% +unit("1 pixel/pixel"). +color_info(11,65535,0,[ + "magenta", 65535, 0, 65535, 65535, 0, 65535, 1, + "red", 65535, 0, 0, 65535, 0, 0, 1, + "green", 0, 65535, 0, 0, 65535, 0, 1, + "blue", 0, 0, 65535, 0, 0, 65535, 1, + "yellow", 65535, 65535, 0, 65535, 65535, 0, 1, + "pink", 65535, 49344, 52171, 65535, 49344, 52171, 1, + "cyan", 0, 65535, 65535, 0, 65535, 65535, 1, + "CadetBlue", 24415, 40606, 41120, 24415, 40606, 41120, 1, + "white", 65535, 65535, 65535, 65535, 65535, 65535, 1, + "black", 0, 0, 0, 0, 0, 0, 1, + "DarkSlateGray", 12079, 20303, 20303, 12079, 20303, 20303, 1 +]). +script_frac("0.6"). +fg_bg_colors('black','white'). +dont_reencode("FFDingbests:ZapfDingbats"). +page(1,"",1,''). +arc('black','',0,4,1,0,-64,128,128,320,128,128,288,432,1,384,384,5760,-7936,0,0,0,14,6,0,0,0,'4','14','6',0,[ +]). +poly('black','',2,[ + 196,79,351,304],0,2,1,2,0,0,0,0,0,0,0,'2',0,0, + "0","",[ + 0,10,4,0,'10','4','0'],[0,10,4,0,'10','4','0'],[ +]). +poly('black','',2,[ + 128,320,196,79],0,2,1,3,0,0,0,0,0,0,0,'2',0,0, + "0","",[ + 0,10,4,0,'10','4','0'],[0,10,4,0,'10','4','0'],[ +]). +poly('black','',2,[ + 128,320,353,305],0,2,1,4,0,0,0,0,0,0,0,'2',0,0, + "0","",[ + 0,10,4,0,'10','4','0'],[0,10,4,0,'10','4','0'],[ +]). +poly('black','',2,[ + 128,320,317,307],1,2,1,9,0,0,0,0,0,0,0,'2',0,0, + "0","",[ + 0,10,4,0,'10','4','0'],[0,10,4,0,'10','4','0'],[ +]). +poly('black','',5,[ + 183,113,142,95,136,51,196,24,258,57],2,2,1,12,1,0,0,0,0,0,0,'2',0,0, + "70","",[ + 0,10,4,0,'10','4','0'],[0,10,4,0,'10','4','0'],[ +]). +poly('black','',3,[ + 334,307,340,340,368,350],2,2,1,16,1,0,0,0,0,0,0,'2',0,0, + "4","",[ + 0,10,4,0,'10','4','0'],[0,10,4,0,'10','4','0'],[ +]). +text('black',261,42,2,0,1,52,34,19,14,3,0,0,0,0,2,52,34,0,0,"",0,0,0,0,56,'',[ +minilines(52,34,0,0,0,0,0,[ +mini_line(49,14,3,0,0,0,[ +str_block(0,49,14,3,0,0,0,0,0,[ +str_seg('black','Helvetica-Bold',1,80640,49,14,3,0,0,0,0,0,0,0, + "aircraft")]) +]), +mini_line(52,14,3,0,0,0,[ +str_block(0,52,14,3,0,-1,0,0,0,[ +str_seg('black','Helvetica-Bold',1,80640,52,14,3,0,-1,0,0,0,0,0, + "altitude")]) +]) +])]). +text('black',371,333,2,0,1,52,34,21,14,3,0,0,0,0,2,52,34,0,0,"",0,0,0,0,347,'',[ +minilines(52,34,0,0,0,0,0,[ +mini_line(48,14,3,0,0,0,[ +str_block(0,48,14,3,0,-1,0,0,0,[ +str_seg('black','Helvetica-Bold',1,80640,48,14,3,0,-1,0,0,0,0,0, + "station")]) +]), +mini_line(52,14,3,0,0,0,[ +str_block(0,52,14,3,0,-1,0,0,0,[ +str_seg('black','Helvetica-Bold',1,80640,52,14,3,0,-1,0,0,0,0,0, + "altitude")]) +]) +])]). +oval('black','',193,76,199,82,1,1,1,27,0,0,0,0,0,'1',0,[ +]). +oval('black','',349,302,355,308,1,1,1,29,0,0,0,0,0,'1',0,[ +]). +text('black',216,286,1,0,1,11,17,37,14,3,0,0,0,0,2,11,17,0,0,"",0,0,0,0,300,'',[ +minilines(11,17,0,0,0,0,0,[ +mini_line(11,14,3,0,0,0,[ +str_block(0,11,14,3,0,-1,0,0,0,[ +str_seg('black','Helvetica-Bold',1,80640,11,14,3,0,-1,0,0,0,0,0, + "R")]) +]) +])]). +poly('black','',2,[ + 128,320,287,209],0,1,1,38,1,0,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]). Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/manual/acmdoc_html-vor-line-sigth.png and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/manual/acmdoc_html-vor-line-sigth.png differ diff -Nru acm-5.0/doc/manual/acmdoc-inside.html acm-6.0+20200416/doc/manual/acmdoc-inside.html --- acm-5.0/doc/manual/acmdoc-inside.html 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/doc/manual/acmdoc-inside.html 2020-04-16 12:05:38.000000000 +0000 @@ -0,0 +1,2192 @@ + + + +ACM - Inside the program + + +

ACM - Inside the program

+

+ by Riley Rainey +
updated by Umberto Salsi +

+ + +

Contents

+Back to general contents +
+Geodetic coordinates and the WGS-84 ellipsoid
+Defining new zones
+Defining new scenes
+Defining new aircraft
+
+Frame and aerodynamics
+Engine
+Landing gear
+Armament
+
+Defining new objects
+IEEE 1278.1 (DIS) compliance
+Suggested further reading
+
+ + + +

Geodetic coordinates and the WGS-84 ellipsoid

+ +

+ The WGS-84 defines a reference shape for the Earth which is very close to the real shape of our planet; the concepts of local vertical, local horizontal plane, altitude and longitude are all referred to this ideal shape named geodetic ellipsoid. The figure below illustrates the right-handed Cartesian reference centered on the geodetic ellipsoid: +

+ + +
+ +
The WGS-84 geodetic ellipsoid. In this figure, P=[x,0,z]. +
+ +

+ The surface of this ellipsoid are the solutions of the equation + x2/a2 + y2/a2 + z2/b2 = 1 where "a" is the length of the major semi-axis (or equatorial semi-axis) and "b" is the length of the minor semi-axis (or polar semi-axis): +

+ +
+ a = 6378137.0000 m
+ b = 6356752.3142 m +
+ +

+ These values, although very close to the real size of the Earth, are by definition of the WGS-84 model. Although very accurate measurements of the Earth are available and the actual shape of the Earth, named geoid, is known with very high precision, such an accuracy does not make much difference in most practical applications and is negligible. So in general any measurement of latitude, longitude and altitude, if not otherwise stated, is to be intended as geodetic, that is refereed to the WGS-84 ellipsoid. +

+ +

+The north pole is located at Cartesian coordinates [0,0,b] and the south pole is located at [0,0,-b]. The rightmost point [a,0,0] has latitude zero and longitude zero; the Greenwich meridian crosses this point joining the two poles. +

+ +

+ For any point P=[x,y,z] in the Cartesian reference, a corresponding mapping to the geographic coordinates [lat,lon,alt] has to be defined. First, the local vertical is the line crossing P and perpendicular to the surface of the ellipsoid in its point A; the tangent plane to this point is the local horizontal plane at altitude zero. The local vertical line is the local plumb line. Note that the vertical line in this model, just like on our real planet, does not cross the center of the ellipsoid but intersects the x axis at some point B. +

+ +

+ The latitude is defined as the angle between the local vertical and the xy plane. Calculating this latitude given the Cartesian coordinates is not simple; curious may look at the module src/dis/dis/earth in the sources of ACM. Latitudes range from 90S at the south pole, up to 90N at the north pole. The 0N latitude (or 0S if you prefer) is the equator. +

+ +

+The longitude is defined as the angle between the point P and the xz plane measured around the z axis: lon=atan(y/x). No surprises here. Longitudes range from 180 degrees west up to 180 degrees east; obviously the 180W meridian coincides with the 180E meridian. The 0E meridian (or 0W if you prefer) is named Greenwich meridian. +

+ +

+ The mean sea level (MSL) is the surface of the ellipsoid; altitudes are measured as distance of the point P from the local horizon beneath it. All altitudes under ACM are intended referred to this MSL. +

+ +

+The local terrain altitude (measured vs. the MSL, of course) varies from point to point. ACM looks at the altitude of the nearest runway within 100 NM to determine the terrain altitude; if none found, it assumes zero. Negative altitudes are also possible. +

+ + + +

Defining new zones

+ +

+ A zone is a range of longitude and latitude bound to the scenery file where the items inside the zone are listed. Sceneries are dynamically loaded and un-loaded by the program as necessary as the plane moves around the globe. +

+ +

+As the program starts and initializes, it looks for a zones file named zones.txt normally located under the objects/ directory. The zones files lists all the zones that are available to the program along with the range of geodetic coordinates the scene covers, for example: +

+ +
+# zones.txt file:
+35N  40N  125W  120W  zones/usa/sfrancisco.txt
+30N  35N  120W  115W  zones/usa/losangeles.txt
+35N  40N  120W  115W  zones/usa/lasvegaswest.txt
+#35N  40N  115W  110W  zones/usa/lasvegaseast.txt
+30N  35N  115W  110W  zones/usa/tucson.txt
+30N  35N  100W  095W  zones/usa/dallas.txt
+40N  45N  075W  070W  zones/usa/newyork.txt
+35N  47N  006E  019E  zones/europe/italy.txt
+30N  35N  040E  045E  zones/middleeast/iraq.txt
+
+ +

+ The Italy scenery file has been compiled by hand. + The Iraq scenery only contains some sample runways and it is otherwise incomplete. + All the USA sceneries have been generated automatically from the FAA data base using the the program available under tools/faaairports; further zones covering the USA territory can be added in the same way. +

+ +

+The image below summarizes the currently defines zones, but other might be added in future release and others can be added by the player itself: +

+ +
+ +
Zones defined by the sample zones file contents above. +
+ +

+ As the simulated aircraft flies, any zone within 200 NM from the aircraft is loaded and made available to the simulation, so runways, radio stations and features therein defined enter the simulation: runways can be seen, radio stations can be tuned, etc. Zones left behind or too far away are un-loaded from memory. +

+ +

+The zones file is a simple text file organized by lines, each line representing a zone with 5 fields: +

+ +
    +
  1. Minimum latitude covered.
  2. +
  3. Maximum latitude covered.
  4. +
  5. Minimum longitude covered.
  6. +
  7. Maximum longitude covered.
  8. +
  9. File name of the scenery as path relative to this file. Example: + "../../myscene.txt". The extension of the file does not + really matter. White spaces are not allowed inside the path.
  10. +
+ +

+Latitude and longitudes can be indicated in several ways, here are some +examples: +

+ +
+10N     10-20-30.400S     30.500S
+10E     10-20-30.400W     30.500W
+
+ +

+Fields must be separated by at least one white space. Apart from that, white +spaces are ignored. Empty lines and lines beginning with '#' are ignored. +

+ +

+Notes and restrictions +

+ +
    +
  • The program gives error is the latitude or longitude fields are + not valid or out of the range.
  • +
  • The program gives error if the file path of a scenery file cannot + be resolved. The existence and readability of each scenery file + is checked as the program starts; their content is checked only whenever + the scenery file is loaded.
  • +
  • The program gives error if any two zones overlap.
  • +
  • The right and upper edge of the range does not belong to the zone, so a new zone can safely be defined next to the other.
  • +
  • Items defined in the scenery of a zone must lie inside the range of + geographical coordinates of the zone. The points in the right and upper edges does not belong to the zone. The program gives a non-fatal error if an item lies outside the zone. For runways, the reference point is their center; for ILS, the reference point is the locator.
  • +
+ +

+ Note that for extended items, some of their points may lie outside the zone. For example, although the center of the runway must be in, one or both of its ends can be out; the locator of the ILS must be in, but the corresponding glide slope antenna can be out. +

+ +

+ Note that the maximum latitude is 90N, the north pole; if a zone extends + up to this limit, its upper edge is a point. Due to the rules above, the north pole does not belong to the zone, and there is no way to put an + item at that exact location; this does not seem to be a severe + limitation, though. +

+ +
+ Don't try to fly over the poles! + There is a know bug in the program that prevents to fly over the poles. + Near to these locations (below 1 NM), the computation of the aircraft's next step fails and the aircraft tilts unpredictably, mostly crashing -- look at the comments in the src/dis/dis/earth for more. +
+ +

+There is no limit to the number of zones that can be defined. If each zone covers a 5x5 DEG range of latitude and longitude, considering only the range of latitudes [80S,80N], and since 70% of the Earth is covered by water, one may expect the maximum number of zone that might be needed to cover all the globe be about 692. +

+ + + +

Defining new scenes

+ +

+The scene file defines the contents of a zone. It should be stored as a ASCII +text file. Every record occupies exactly one line, with leading and trailing +spaces ignored. Fields in a record are separated by one or more spaces or +tabulation characters. Empty lines and lines beginning with the character '#' +are ignored. +

+ +

Team Locations

+ +

+Friendly and Opposing DIS participants may have a resupply base where to get fuel, munitions a repairs. Servicing starts as the aircraft stops close enough to the specified location. Typically, these location will be positioned and oriented at the end of a runway at the player's air force base airport. Example: +

+ +
+
+# Friendly air force base:
+TEAM1_LOC 32-58-18.798N 096-50-16.604W 0 0
+# Opposing air force base:
+TEAM2_LOC 33-58-00.000N 097-50-00.000W 0 0
+
+
+ +Fields: + +
+0 Type: TEAM1_LOC, TEAM2_LOC
+1 Latitude
+2 Longitude
+3 Initial Altitude MSL (ft) (this value ignored)
+4 Initial Heading (degrees, true) (this value ignored) +
+ + + +

Ground Color

+ +

+An X11-style #RRGGBB color specification defining +the color of the ground. Red, green and blue color components are +hexadecimal value from 00 to FF. Example: +

+ +
+ +GROUND_COLOR #305030 + +
+ +Fields: +
+0 Type: GROUND_COLOR
+1 Color +
+ + +

Runway record

+ +

+The record entry of the ACM scene describing a runway can take two forms, +depending on the available informations: the old one (RWY) and the new +one (RWY2). The RWY format requires the geographic coordinates of both +the ends of the runway. The RWY2 requires only the center of the runway +and its true heading. The syntax of the runway identifier (field no. 2) +must be of the form: +

+ +
+H[S]/H[S] +
+ +

+where H is the heading (an integral number between 1 and 36) +and S is a capital letter ("L", "C" or "R"). The S part +of the identifier is optional. +A leading "0" in an identifier is allowed. +The runway identifiers can be specified in any order. +

+ + + +Example of the RWY record format: + +
+ +RWY ADS 15/33 644 7202 100 32-58-40.245N 096-50-25.820W 32-57-33.383N 096-49-56.608W + +
+ +Fields of the RWY record: +
+0 Record Identifier: RWY
+1 Three/Four letter airport code
+2 Runway identifier
+3 Runway Altitude (ft, MSL)
+4 Runway Length (ft)
+5 Runway Width (ft)
+6 Near End Latitude
+7 Near End Longitude
+8 Reciprocal End Latitude
+9 Reciprocal End Longitude
+
+ + +Example of the RWY2 record format (same runway): + +
+ +RWY2 ADS 15/33 644 7202 100 32-58-06.81N 096-50-11.21W 160.0 + +
+ +Fields of the RWY2 record: +
+0 Record Identifier: RWY2
+1 Three/Four letter airport code
+2 Runway identifier
+3 Runway Altitude of the Center (ft, MSL)
+4 Runway Length (ft)
+5 Runway Width (ft)
+6 Latitude of the Center
+7 Longitude of the Center
+8 Runway geographical heading (DEG) +
+ +

+The model of the terrain simulated by ACM is very simple and efficient: +the elevation of the nearest runway gives the local terrain altitude, +the distance being calculated relatively to the center of the runway. +Nevertheless, this behavior has a strange implication: between two runways +at different altitudes there is a step line where the local +altitude suddenly change. Crossing this step line taxing on the ground, +the aircraft would crash its landing gear. +

+ +

+In the figure below the terrain to the left side of the step line has +elevation 500 feet, while the terrain in the other side has elevation +510 feet. Unfortunately in this case we have a problem, since the step +line crosses both the runways. +

+ +
+
+
+
+ +

+The problem of the step line crossing the runways. +

+
+
+
+ +

+The only practical solution to this problem is to keep all the runways +of a given airport at the same exact altitude. +

+ + +

Navaid Record

+ +

+A "NAV" record may be a VOR, a DME or a NDB. The TACAN stations of the +ACM world behave simply as VOR/DME stations. +VOR and ILS stations frequency ranges from 108.00 MHz up to 117.95 MHz. +

+ +

+OMARKER, MMARKER and IMARKER are just like NDB stations but with limited +range (20 NM rather than 100 NM). NDB station frequency ranges from 200 +KHz up to 529 KHz. This latter upper limit is a rather arbitrary value +set in ACM, but most of the stations do not exceed 415 KHz. +

+ +Example: + +
+
+NAV TTT VOR/DME 32-52-08.98N 097-02-25.81W 540 113.10 -
+NAV FWH TACAN   32-46-17.46N 097-26-22.07W 663 108.7  024X
+NAV RBD NDB     32-40-36.98N 096-52-15.91W 670 287    -
+
+
+ +Fields: + +
+0 Record Identifier: NAV
+1 Up to four letters identifier
+2 NAVAID Type: VOR, DME, VOR/DME, VORTAC (=VOR+DME), TACAN (=VOR+DME), NDB, + OMARKER (=NDB), MMARKER (=NDB), IMARKER (=NDB)
+3 Transmitter Latitude
+4 Transmitter Longitude
+5 Transmitter Altitude (ft, MSL)
+6 VHF Frequency (MHz for VOR/DME/ILS stations and KHz for NDB)
+7 TACAN channel number, or '-' if not available. Ignored by ACM anyway. +
+ + + +

ILS Record

+ +

+An ILS (instrumental landing system) is a LOCALIZER antenna (emitting the signal +giving the right heading toward the runway) that may include also a glide slope +antenna (GS, giving the deviation from the glide plane) and a DME antenna. +

+ +
+
+
+
+ +

+Typical ILS arrangement around the runway. +

+
+
+
+ +

+In the real world, each antenna has its latitude, longitude and elevation, +but under ACM the simplified ILS record does not allow to specify the +location of the DME antenna and provides only one elevation field whose value is +shared among the LOCALIZER, the GS and the DME antenna; the distance displayed +by ACM actually is the distance from the LOCALIZER. +The recommended workaround is to indicate the elevation of the GS antenna to allow +precise landing at the expected distance from the threshold; +if not available, the elevation of the DME antenna should be indicated for closer +match between displayed distance and the expected value; +finally, the elevation of the LOCALIZER antenna can be indicated. +Limitations and recommendations are detailed below. +

+ +

+The LOCALIZER antenna is normally located near the reciprocal end of the runway +and the signal is normally aligned with the centerline of the runway. +The exceptions are the LDA and SDF antennas which may deviate from the centerline +of the runway or even be completely unrelated with any runway at all. +

+ +

+The GS antenna, when available, is normally located near the side of the runway threshold. +The elevation of this antenna is critical in order to land at the specified +spot on the runway, so its value should be indicated when available. +

+ +

+The DME antenna, when available, is always assumed to be +coincident with the LOCALIZER antenna; there is no way to specify another +location, so the distance displayed in the program may differ from the +official navigation charts. +

+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + +
TypeDescription
+ LOCALIZER
+ LDA
+ SDF +
+ LOCALIZER antenna only available. LDA and SDF are handled just like + a LOCALIZER, the only difference is that the chart generator program + is advised a corresponding runway end may not be available for this ILS + and so no error should be emitted. The elevation field should be set + with the elevation of the locator antenna. +
+ ILS
+ LOC/GS +
+ LOCALIZER and GS antennas both available. The elevation field should + specify the elevation of the GS antenna, when available. +
+ LOC/DME
+ LDA/DME
+ SDF/DME +
+ LOCALIZER and DME antennas both available. LDA and SDF are handled just like + a LOCALIZER, the only difference is that the chart generator program + is advised a corresponding runway end may not be available for this ILS + and so no error should be emitted. The elevation field should + specify the elevation of the DME antenna, when available, or the + elevation of the LOCALIZER otherwise. +
+ ILS/DME + + LOCALIZER, GS and DME antennas available. The elevation field should + specify the elevation of the GS antenna when available, or the + elevation of the DME or of the LOCALIZER (in this order of preference). +
+ Types of ILS record. +
+
+
+
+ + + + +Example: +
+ +ILS 30 ILS IAIW 108.9 34-18-47.161N 097-01-38.280W 34-17-59.533N +097-00-35.018W 729.2 4.92 315.5 3.00 + +
+ +Fields: + +
+0 Record Identifier: 'ILS'
+1 Runway Identifier:
+2 ILS Type: see table above
+3 Four letter Identifier
+4 VHF Frequency (MHz)
+5 Localizer Transmitter Latitude
+6 Localizer Transmitter Longitude
+7 Glide Slope Transmitter Latitude ('-' for Localizer-only approaches)
+8 Glide Slope Transmitter Longitude ('-' for Localizer-only +approaches)
+9 Glide slope antenna elevation when available, or localizer antenna elevation +(ft, MSL)
+10 Localizer beam width (DEG)
+11 Localizer geographic bearing (DEG)
+12 Glide slope angle (DEG) ('-' for Localizer-only +approaches) +
+ + +

Features

+ +Use feature records to place objects in an ACM scene. Example: + +
+FEATURE features/tower.obv 32-58-04.800N 096-50-16.800W 644 0 + +
+ +Fields: + +
+0 Record identifier: FEATURE
+1 Object filename, either absolute or relative to the scene file
+2 Latitude
+3 Longitude
+4 Altitude (ft, MSL)
+5 Orientation angle (degrees, true) +
+ + + + + +

Defining new aircraft

+ +

+ The ACM program loads all the aircraft models defined in the aircraft.txt file; this file is searched in all the specified object directories. Lines beginning with # are ignored by the program and can be used to add comments. +

+ +

+ The inventory file may contain several include and aircraft records. The include record has syntax +

+ +
+ include "some/other/file" +
+ +

+ and allows to include the content of other inventory files in a more structured way. The path can be relative to the current inventory file. The aircraft record is described below in detail. +

+ +

+The stout-of-heart may be interested in creating new aircraft types. Some +of this information must be generated by hand, but I did create a program +to help me generate aircraft objects: GEDIT. GEDIT is a rudimentary +Motif program that allows you to create 3-dimensional objects. It is +available in the directory gedit of the distributed package. +

+ +

+The syntax of the aircraft record is more articulated. The program does not complain about missing numeric values, +and they are assumed to be zero. +

+ +
+# Aircraft Inventory for ACM-6
+# See ACM-Bibliography for further information about the sources of this
+# information.
+# MiG-29 Fulcrum
+# MiG-29M information was derived from two sources: [Spick87] and [AirI Aug92].
+
+aircraft "MiG-29" {
+    Description "Mikoyan-Guryevich MiG-29M Fulcrum"
+    Object "mig29.obj"
+
+ + +

+The visual description of an ACM aircraft is stored separately in +V-library format and specified in the Object field. The name of the file may include a relative path which is resolved against the directory of the current file. This file describes a set of polygons that roughly +approximates the shape of the actual aircraft. I used GEDIT to create +most of the ACM aircraft objects. If not available, you may leave this parameter commented-out, but the UFO object will be displayed instead... +

+ + +

Frame and aerodynamics

+ +
+    WingArea     400.0     # (wingS) Wing surface area (ft2)
+    WingHalfSpan 18.87     # (wings) Wing half-span (ft)
+    WingHeight    0.0      # (wingh) Height of the wing aerodynamic center
+                           #    above the CM (ft)
+    Chord        9.61      # (c) Mean geometric chord of wing (ft)
+    AspectRatio  3.56      # (aspectRatio) aspect ratio
+    EmptyWeight  22500.0   # (emptyWeight) Empty mass (lb)
+
+ + +

+These values are usually quoted with an aircraft's performance figures. +The WingHeight is used to estimate the ground effect, and +its value is positive for wings above the center of mass. +

+ +
+    # Max. wing load (lb):
+    MaxLoadZPositive    273000  # 10*(EmptyWeight+50%*MaxFuel) (+10 g)
+    MaxLoadZNegative    137000  # 5*(EmptyWeight+50%*MaxFuel) (-5 g)
+
+ +

+The maximum vertical load, either positive climbing (MaxLoadZPositive) +or negative diving (MaxLoadZNegative). If the weight the wings have +to sustain is greater than that, the structure suddenly breaks and the +aircraft gets destroyed. +

+ +

+For civil aircraft you may guess these values as 2.5*MTOW and +1.0*MTOW. Military aircraft, and fighters expecially, are reported to +sustain up to some number N of positive "g" and some other number Q of +negative "g". If not indicated, you should suppose at least 60% of the fuel +contributing to the mass: +

+ +
+MaxLoadZPositive = N * (EmptyWeight + 60%*MaxFuel)
+MaxLoadZNegative = Q * (EmptyWeight + 60%*MaxFuel) +
+ +

+where typical values for N range from 7 to 10, and Q=3. +

+ + +
+
+
+
+ +

+The reference frame of the aircraft, with main inertial axes
+and center of mass (CM) indicated.
+

+
+
+
+
+ + +
+    # (I(x,y,z)) Moments of inertia (lb ft2)
+    Ixx 10000
+    Iyy 75000
+    Izz 80000
+
+ +

+These are hard values to simple guess. I have grabbed values where they +were available and simply guessed sometimes, too. Moments of inertia +in an actual aircraft are not constant. Most notably, as an aircraft +burns fuel, it's weight distribution, center-of-gravity, and moments of +inertia change. In ACM, however, moments of inertia and CM do not change. +

+ +
+    # (cFlap) Lift due to flaps (yields Clift of 1.0 at max extension)
+    CFlap 0.64279
+    BetaStall     15.0    # (deg) Stall angle for rudder
+    CFlapDrag     0.0467  # (cFlapDrag) Drag due to Flaps
+    CGearDrag     0.03    # (cGearDrag) Drag due to Gear
+    CSpeedBrake   0.03    # (cSpeedBrake) Drag due to Speed Brake
+                          # at 90 degrees
+
+
+    # (CDb) Drag Characteristic equation [Wave+body]
+    # independent variable is mach number
+
+    CDb {                 # (CDb) Drag Characteristic equation [Wave+body]
+        # independent variable is mach number
+        0.0, 0.020,
+        0.2, 0.020,
+        0.95, 0.015,
+        1.05, 0.045,
+        2.00, 0.030,
+        10.0, 0.030
+    }
+
+ + +

+In ACM, wave/body drag coefficient is a function of the airspeed expressed +as a Mach number. Less drag makes for a faster aircraft. This function +generally has a maximum near Mach 1.0. You probably should not change +this table unless you really know what you're doing. +
+For the CFlap coefficient see below. +

+ +
+    CLift {               # (CLift) Lift-slope curve (vs alpha)
+        -3.0, 0.0,
+        -1.05, 0.0,
+        -0.576, -2.199,
+        -0.556, -2.23,
+        -0.524, -2.199,
+        0.524, 2.199,
+        0.556, 2.23,
+        0.576, 2.199,
+        1.05, 0.0,
+        2.0, 0.0
+    }
+
+ + +

+In ACM, the coefficient of lift is purely a function of angle of attack (alpha). +The CLift table gives the coefficient of lift for some values +of the AoA "alpha". In the example above, the maximum coefficient of lift is +2.23 at 0.556 RAD = 32 DEG of AoA. Above this angle, the lift drops abruptly +and the plane stalls. The coefficient of lift also depends on the current +flap deflection angle according to the function: +

+ +
+CL = CLift(alpha) + sin(flaps) * CFlap +
+ +

+being CLift(alpha) the interpolated value given by the CLift +table above. +The total lift force is given by the equation: +

+ +
+L = 1/2 r WingArea V2 CL +
+ +

+where r is the air density (r=1.225 Kg/m3 at sea level), V is the +airspeed and CL is the coefficient of lift. +

+ +
+    CnBeta { # (CnBeta) Yaw moment due to sideslip equation
+        0, -0.08125,
+        0.523540, -0.078125,
+        0.785340, -0.0609375,
+        1.047198, 0.125,
+        1.58, 0.0
+    }
+
+ +

+In ACM negative yaw due to sideslip means that the aircraft is +"weathercock stable", that is, the aircraft tends to yaw in a way that +reduces the sideslip component. +

+ + +
+    ClBeta { # (ClBeta) Roll moment due to sideslip equation
+        0, -0.0125,
+        0.43633, -0.015,
+        0.78540, 0.125,
+        1.58, 0.0,
+        3.142, 0.125,
+    }
+
+ + + +

+A negative value means that the aircraft will roll in the opposite direction +of the sideslip component, tending to make the aircraft more stable. +

+ + +
+    CDBOrigin   0       # (CDBOrigin, CDBFactor) Drag due to sideslip
+    CDBFactor   0.5
+    CDBPhase    0       # (CDBPhase) sideslip drag phase (deg)
+
+ +CDB values define the body drag added by sideslip on the aircraft. + +
+    CYBeta      -0.85   # (CYbeta) Side-force from side-slip [dCY/dBeta]
+
+ +

+CYBeta is the "lift" due to sideslip. This is the factor that allows +to roll 90 degrees from level, kick the rudder a lot, and still stay +level. Not all simulators take this into account. +

+ +
+    EffElevator   0.60 # (effElevator) Elevator effectiveness
+    CmAlpha      -0.30 # (cmSlope) CmAlpha curve slope
+    EffRudder     0.35 # (effRudder) Rudder effectiveness
+    MaxRudder     20   # (maxRudder) max Rudder (deg)
+    MaxAileron    20   # (maxAileron) max Aileron (deg)
+    MaxFlap       20   # (maxFlap) max flap setting (deg)
+
+    # (flapRate) flap extension rate (about 2 secs to fully extend flaps)
+    FlapRate      10   # (deg/s)
+
+    MaxSpeedBrake 80   # (maxSpeedBrake) max Speed Brake setting (deg)
+
+    # (speedBrakeRate) rate of speed brake extension (2 secs to full ext)
+    SpeedBrakeRate 40  # (deg/s)
+
+    # (speedBrakeIncr) speed Brake increment per keystroke
+    SpeedBrakeIncr 80  # (deg)
+
+ +

+These values determine the characteristics of the aircraft's speed +brakes (speed brakes are used in the air, wheel brakes are used on the +ground). MaxSpeedBrake determines the maximum extension of the speed +brake panels. SpeedBrakeIncr determines how far one press of the s +key will increase the speed brake extension. It does not need to be an +even increment of MaxSpeedBrake. SpeedBrakeRate determines how fast +the brakes will deploy or retract. +

+ +
+    Clda  0.048 # (Clda) roll moment from aileron offset
+    Cldr  0.004 # (Cldr) roll moment from rudder offset
+    Clp   -0.27 # (Clp) roll damping
+    Cmq   -8.0  # (Cmq) pitch damping factor
+    Cnr   -2.0  # (Cnr) yaw damping factor
+
+ +

+These factors characterize some of the roll, pitch and yaw characteristics +of the aircraft. They are in the NACA form. Damping factors determine how +quickly an aircraft returns to a steady state after some change in control +input. Larger negative damping factors make for a more stable aircraft. +

+ + +
+    # Speed limits at MTOW. Leave undefined or set to 0 if unknown.
+    MTOW  32250.0    # maximum takeoff weight (lb)
+    #Vs0     42.0    # stall speed, full flaps (kt)
+    #Vs1     50.0    # stall speed, no flaps (kt)
+    #Vfe    100.0    # max speed with flaps extended (kt)
+    #Vno    145.0    # normal operation speed (kt)
+    #Vne    164.0    # never exceed speed (kt)
+
+ +

+These parameters allow the program to set or calculate several speed limits (IAS). +These speed limits are used to draw the colored arcs on the air speed +indicator. Every arc is displayed only if its start and end are known, and +it is now drawn otherwise. +These speed limits are also considered to simulate structural failures +when exceeded, as detailed below. +Leave commented-out or set to 0 the parameters that are unknown: the program +will try to guess the missing values or simply will left them undefined +if this guess is not possible. +

+ +

+MTOW is the maximum take off weight (lb). +

+ +

+Vs0 is the stall speed at MTOW, full flaps, at sea level. +It is indicated by the beginning of the white arc in the anemometer. +If undefined or set to zero, the program tries to calculate this value +with the following formula: +

+ +
+Vs0 = sqrt( 2 MTOW earth_g / (r WingArea CL) ) +
+ +where: + +
+earth_g is the gravity acceleration at sea level.
+r is the air density at sea level.
+CL is the lift coefficient calculated with:
+CL = maxCLift + CFlap sin(MaxFlap)
+being maxCLift the maximum coefficient of lift as given by the CLift curve. +
+ +

+Vs1 is the stall speed at MTOW, without flaps, at sea level. +It is indicated by the end of the short white arc in the anemometer. +If undefined or set to zero, the program calculates this value with +the following formula: +

+ +
+Vs1 = sqrt( 2 MTOW earth_g / (r WingArea maxCLift) ) +
+ +

+Vfe is the maximum speed with flaps extended. +It is indicated by the end of the longer white arc in the anemometer. +Exceeding this speed with flaps deployed, also partially, causes a flaps +failure that makes them unusable. +If undefined or set to 0, the Vfe is unlimited. +

+ +

+Vno is the normal operation speed, that is the maximum speed in +turbolent air conditions. +It is indicated by the beginning of the yellow arc in the anemometer. +Flying above this speed in turbulent air, a vertical wind gust of 30 ft/s +would cause a vertical positive or negative acceleration above the +maximum structural load capacity of the wings. +If undefined or set to 0, the Vno is estimated with the following formula: +

+ +
+Vno = 2 earth_g (MaxLoadZNegative + EmptyWeight) / (r WingArea * b * MAX_GUST) +
+ +where: + +
+b = 6.302 is the slope of the CLift curve in its linear range; this value was +actually calculated for the C-172RG but it is also very close to that of the +other aircraft models, so it is assumed as constant.
+MAX_GUST = 30 ft/s is the conventional maximum vertical wind gust intensity +assumed as reference to calculate Vno. +
+ +

+Vne is the speed that must never be exceeded. +It is indicated by a short red line. +Flying above this speed limit the aircraft may suffer a catastrophic structural +failure. +If undefined or set to zero, this limit does not apply. +

+ + +
+    # (viewPoint) pilot's viewing location
+    ViewPoint { 14.75, 0, -5.375 }
+
+ +

+This is the location of the pilot's eye view outside of the cockpit. +

+ + +
+    # (tailExtent) as we rotate, this part may drag
+    TailExtent { -18.165, 0.0, 1.191 }
+
+ +

+This defines where the aft-most lower part of the aircraft is +located. This is the part of the aircraft that may scrape the ground as +we rotate. This value is not currently used. Instead we simply limit +up-pitch on the ground to 20 degrees. +

+ + +

Engine

+ +
+    EngineType "GenericJetEngine"
+
+    MaxFuel  9750  # (maxFuel) maximum internal fuel (lb)
+
+    # engine lag factor (how fast does it respond to throttle changes
+    EngineLag -3.0
+
+    # Engine data based on updated RD-33K engines cited in [AirI Aug89].
+    # (maxThrust) max static thrust, military power (lbf)
+    MaxThrust 27000
+
+    # (maxABThrust) max static thrust, afterburner on (lbf)
+    MaxABThrust 44000
+
+    HasThrustReverser 0 # 0=no (default), 1=yes
+
+ + +

+This section describes the engine and its performances. One among these +types of engine can be chosen: +

+ +
+ +
EngineType "NoEngine"
+
Basically, a glider. The remaining engines parameters are then +ignored. This is the default.
+ +
EngineType "GenericPistonEngine"
+
Propeller driven aircraft with pistons engine. Its +thrust is proportional to the current RPM and to the factor +(ρh0)1.6, being +ρh the air density at the current altitude and +ρ0 the air density at sea level.
+ +
EngineType "GenericJetEngine"
+
Jet engine. Its thrust is proportional to the square of the current RPM +and to the ratio between air density at the given altitude and air density +at sea level.
+ +
EngineType "GenericRocketEngine"
+
Rocket engine. Its thrust is proportional to the indicated fuel pump +RPM. Thrust does not depend on altitude, so this aircraft can fly up to +the edge of the space before loosing directional control.
+ +
+ + +

+Maximum static military and afterburner thrust values can usually be +found in documents that describe aircraft performance. +Setting MaxABThrust to the same value of MaxThrust +disable the AB for those aircraft that lack this device. +For the conversions, remember that 1 pound = 1 lb g = 4.448 N = 0.4536 Kgf. +

+ +

+The HasThrustReverser parameter tells if the aircraft has a thrust +reverse device. Set to 1 if available or 0 if not. If this parameter is missing +the default is "no". With thrust reverse deployed and engine at the max power, +the resulting reverse thrust is calculated as 50% of the max forward thrust. +

+ +
+    Thrust {        # (Thrust) Mach Number vs. thrust
+        0,   1,
+        1.7, 1.5,
+        2.0, 0.84,
+        5,   0.5
+    }
+
+    ABThrust {      # (ABThrust) afterburner thrust table
+        0,   1,
+        0.5, 1,
+        1,   1.21,
+        1.7, 1.7,
+        5,   1.64
+    }
+
+ +

+The Thrust and ABThrust corrects the static thrust value for the +aircraft's Mach number. Unless you have hard information about this, +leave these fields alone. The ABThrust table is ignored when +the AB device is disabled. +

+ +
+    # (spFuelConsump) specific fuel consump(lb fuel/lb T x hr)
+    SpFuelConsump    0.68
+
+    # (spABFuelConsump) AB specific fuel consump(lb fuel/lb T x hr)
+    SpABFuelConsump  2.55
+
+ +

+These fields define the specific fuel consumption (fuel consumed per +pound of thrust per hour). +

+ + +

Landing gear

+ +
+    # Landing Gear control parameters
+    GearRate   30   # (gearRate) gear extension rate from 0 to 90 DEG (DEG/s)
+    MuStatic   0.08 # (muStatic) static coeff of friction no-brakes
+    MuKinetic  0.05 # (muKinetic) moving coeff of friction no-brakes
+    MuBStatic  0.7  # (muBStatic) static brakes-on
+    MuBKinetic 0.6  # (muBKinetic) moving brakes-on
+
+ +

+These four values characterize the amount of friction that the wheels +generate when in contact with the ground. If F is the force (usually a weight) +that load a wheel, then F*MuStatic is the friction force when the wheel is +at rest; F*MuKinetic when the wheel is rolling. MuBStatic and MuBKinetic +have the same meaning with the only difference that the brakes are on. +The maximum theoretical value of any of these is 1.0. +

+ +

+NOTE 1. In our landing gear, only the wheels of the main gear have +brakes; the nose wheel can't brake. +

+ +

+NOTE 2. The MuKinetic and MuBKinetic are probably misnomers as +these coefficients are more commonly known as "MuRolling" instead. Proper +"kinetic" coefficients are involved when the wheel skids over the runway, +either longitudinally (blocked brakes) or laterally. In ACM brakes +never block, but still wheels can skid laterally over the runway. The +coefficient involved in the skidding behavior is currently hard-coded +in the gear.c module. Moreover, the gear breaks when the +lateral force applied to the wheel exceeds the empty weight +of the aircraft. This limit too is hard-coded into the source program. +

+ +
+    MaxNWDef   72   # (maxNWDef) maximum nosewheel deflection (deg)
+
+ +

+The MaxNWDef is the maximum deflection angle of the nose wheel. If this figure is available from the characteristics of the airplane, the figure and the formulas below allows to calculate the minimum turning radius. +

+ +
+
+
+
+ +

+Minimum turn radius of turn on the ground. +

+
+
+
+
+ +

+ If Q is the distance between the contact point with ground of the nose wheel and the middle point between the contact points of the main landing gear, then this latter middle point draws a circle or radius: +

+ +
+ r = Q / tan(MaxNWDef) +
+ +

+ while the contact point of the nose wheel draws a circle of radius: +

+ +
+ R = Q / sin(MaxNWDef) +
+ + +

+ Sometimes the maximum deflection of the nose wheel is not reported, but a minimum turning radius is provided instead. Normally this is defined as the radius of the smallest cylinder inside which the aircraft can perform a full 360 degrees turn. From the figure above we see the this value could be estimated as the turn radius of the center of the main landing gear (r) plus the half-wings length: +

+ +
+ MinRadius = WingsLength/2 + r +
+ + +

from which:

+ +
+ MaxNWDef = atan( Q / (MinRadius - WingsLength/2) ) +
+ + +

+Several "minimum turning radius" could be indicated for a given aircraft referring to: +
 1. the pilot using the pedals only; +
 2. the pilot using both pedals and differential brakes; +
 3. the pilot using the steering crank handle (where available); +
 4. the ground crew with the nose wheel hooked-up. +
Obviously, we are interested to the case 1 only. +

+ + + +
+    # (rm) location of right main gear attachments {x,y,z} (ft)
+    Rm { -2.2, 4, 1.702 }
+
+    # (rn) location of nose gear attachments {x,y,z} (ft)
+    Rn { 9.395000, 0, 1.807 }
+
+    Km    18220.7 # main oleo spring factor (lbf/ft)
+    Kn    4278.34 # nose oleo spring factor (lbf/ft)
+    Dm    10000   # main oleo damping factor (lbf s/ft)
+    Dn    80      # nose oleo damping factor (lbf s/ft)
+    Gm    1.5     # main strut length with tire (ft)
+    Gn    1.5     # nose strut length with tire (ft)
+    CmMax 1.0     # (cmMax) main max oleo extension distance (ft)
+    CnMax 1.5     # (cnMax) nose max oleo extension distance (ft)
+
+ + +
+
+
+
+ +

+Parameters of the landing gear. +

+
+
+
+
+ +

+The parameters Rn and Rm give the positions of the +nose and main gear attachments, while Gn and Gm +are their total length including the tire but excluding the oleo extension +CnMax and CmMax. As a first approximation of these +parameters, you can take these values (all the distances are measured in feet, +1 ft = 0.3048 m): +

+ +
+ +
+ +
Rn.x
+
+Attachment point of the nose landing gear strut, x coordinate (ft). Positive for +tricycle landing gear, negative for bicycle landing gear. +
+ +
Rn.y
+
Always zero. +
+ +
Rn.z
+
+Attachment point of the nose landing gear strut, z coordinate (ft). +
+ +
CnMax
+
+The oleo + spring part of the nose gear extends from zero up to this length (ft). +
+ +
Gn
+
+Length of the rigid part of the nose landing gear strut (ft). The total +length of the nose gear strut including tire is then this value plus +the current extension of the oleo part. +
+ +
Rm.x
+
+Attachment point of the right main landing gear strut, x coordinate (ft). +Negative for tricycle landing gear, positive for bicycle landing gear. +
+ +
Rm.y
+
+Attachment point of the right main landing gear strut, y coordinate (ft). +Always positive; the left main gear it is assumed to be at -Rm.y but with +the same Rm.x and Rm.z components of the right main gear. +
+ +
Rm.z
+
+Attachment point of the right main landing gear, z coordinate (ft). +
+ +
CmMax
+
+The oleo + spring part of each main gear strut extends from zero up to +this length (ft). About half foot for light planes, and up to 1.5 feet +for larger ones. +
+ +
Gm
+
+Length of the rigid part of the each main landing gear strut (ft). The total +length of each main gear strut including tire is then this value plus +the current extension of the oleo part. +
+ +
+ +
+ +

+Every wheel of the landing gear is attached to the aircraft through a spring +(K) and a damper (D). The parameters referring to the main landing gear are the +sum for the left and right gear, so the actual parameter for each wheel strut +is half the value reported in the inventory (see the picture above). +

+ +

+The landing gear parameters are difficult to estimate. We will give some +simple rule to set good starting values based on reasonable assumptions. +

+ +
+
+ +
Km
+
+ Total spring factor for the left+right main landing gear (lbf/ft), + then each spring is half this value. +The main landing gear must sustain most of the weight of the aircraft, +so a reasonable rule is to set this spring (left + right) so that +the strut be half compressed with the aircraft in its empty weight: +

+Km = 2 * EmptyWeight / CmMax +

+For example, if the empty weight is 10000 lbf and the strut maximum extension +is 1.5 ft, we have Km = 13300 lbf/ft. +

+ +
Kn
+
+Nose spring factor (lbf/ft). +The nose spring must sustain the static weight that depends on its distance +from the CM. Moreover, on bicycle landing gears the nose must sustain also the +braking. Here to we will assume the oleo damper be half compressed while the +aircraft is braking at its empty weight. The resulting quite complex +formula is: +

+Kn = 2 * EmptyWeight * (-Rm.x / (Rn.x - Rm.x) + MuBKinetic * (Rm.z + Gm + CmMax)/Rn.x) / CnMax +

+Note that the distances that appear in this formula have their sign, +so usually Rm.x is negative while Rn.x is positive. For bicycle landing +gear we can neglect the braking effect by assuming MuBKinetic=0 in the +formula above, but consider that these aircraft usually have an higher +static pitch for which this simple formula is not valid anymore. +

+ +
Dm
+
+Total damping factor for the left + right landing gear strut (lbf s/ft). +The principal role of the damping factor in the main gear is to adsorb +harder landings at high descending speed, when the spring cannot help +because is still not compressed at all. 600 fpm is usually the maximum +allowed vertical speed for which aircraft are tested. That means that +the force produced by the damper when the wheels of the main gear hits +the ground is F=Dm*600 fpm. Since in ACM there is an hard-coded +vertical limit to the main gear equal to 1.5 times the empty weight for +each leg of the main landing gear, the following formula gives a safe +value for Dm: +

+Dm <= 0.2 * EmptyWeight +

+For example, if the empty weight is 10000 lbf, then the damping factor should not +exceed 2000 lbf s/ft. +

+ + +
Dn
+
+Damping factor for the nose landing gear strut (lbf s/ft). +A good starting value might be Dm calculated above. +
+ +
+
+ + +

+The program GEDIT can be used to determine correct landing gear +locations. I then use the program tools/balance.c to generate +the appropriate values for the spring factors for each new aircraft type that +I create. Note that neither GEDIT nor balance.c currently +calculate oleo damping factors. +

+ +

+Choosing the right values for the landing gear is difficult, and the program +may terminate abruptly with one of the following messages related to the +landing gear: +

+ +
+ +
Nose/left/right gear smash.
+
An excessive vertical load has fully compressed the suspension + transferring that load directly to the aircraft frame and causing + a permanent, fatal damage. Possible fixes: increase the spring factor; + increase damping factor.
+ +
Nose/left/right gear collapsed under too hight vertical load.
+
The landing gear transferred an excessive vertical load to the aircraft's + frame causing a permanent, fatal damage. The maximum vertical load the + each leg of the landing gear can sustain is hard-coded in the source to be + the empty weight for the nose, and 1.5 times the empty weight for each + of the left and right legs. Possible fixes: decrease the spring factor; + decrease the damping factor.
+ +
Nose/left/right gear broken under too high lateral force.
+
The wheel transferred an excessive torque due to a lateral force. + This is typically caused by an excessive landing pitch, or excessive bank + angle, or by steering at high speed. The maximum lateral force each wheel + can transfer to the frame is hard-coded in the source to be the empty + weight. Fix: touchdown should always be performed at low vertical speed + with zero bank angle and reasonable low pitch; do not brake while + steering.
+ +
+ + +

Armament


+ +
+    StructurePoints 15 # (structurePts) maximum structural damage
+
+ +

+This value characterizes how much damage can be absorbed by the aircraft +before it starts falling to the ground (drones simply explode). A detailed description +of the meaning of this field is available as a comment to the +objects/munition-map.txt file, where all the recognized warheads are +listed along with their effectiveness. +

+ +
+    # Radar data based on N-019 Pulse Doppler radar cited in [AirI Aug89].
+    RadarOutput   15000 # (radarOutput) radar output (watts)
+    RadarTRange   38    # (radarTRange) tracking radar range (NM)
+    RadarDRange   55    # (radarDRange) detection radar range (NM)
+    TEWSThreshold 0     # Radar Warning Receiver threshold (watts)
+
+ +

+If you have any information about the radar capabilities of the aircraft, +here's the place for them. The detection range is the maximum range that +a target can be seen on radar. No attempt is made to take into account +the radar cross section of the target. The tracking range is the range +required to get a lock onto the target. +

+ +
+    # Weapons
+    WeaponCount 9
+
+ +

+Number of weapon hard-points. The following fields are ignored if this value is +set to zero, so they can be omitted if the aircraft does not carry weapons at +all. +

+ +
+    HardPoint0 { 7.0, -4.0, 0.0 }
+    HardPoint1 { 0.357, 15.6, 0.0 }
+    HardPoint2 { 0.357, -15.6, 0.0 }
+    HardPoint3 { 1.5, 9.0, 2.0 }
+    HardPoint4 { 1.5, -9.0, 2.0 }
+    HardPoint5 { 1.5, 8.0, 1.5 }
+    HardPoint6 { 1.5, -8.0, 1.5 }
+    HardPoint7 { 1.5, 10.0, 1.5 }
+    HardPoint8 { 1.5, -10.0, 1.5 }
+
+ +

+These are the XYZ locations relative to the aircraft CM of each weapon. By +defining these, each missile or cannon fires from its appropriate location +on the aircraft. +

+ +
+    WeaponStation   0 "M61A1"   500 0   0
+    WeaponStation   1 "AIM-9M"   0   0   0
+    WeaponStation   2 "AIM-9M"   0   0   0
+    WeaponStation   3 "AIM-9M"   0   0   0
+    WeaponStation   4 "AIM-9M"   0   0   0
+    WeaponStation   5 "AIM-9M"   0   0   0
+    WeaponStation   6 "AIM-9M"   0   0   0
+    WeaponStation   7 "AIM-120"  0   0   0
+    WeaponStation   8 "AIM-120"  0   0   0
+}
+
+ +

+The WeaponStation directive defines the type of weapon located at +each hard point. The first argument is the number of the hard point, that +ranges from 0 up to WeaponCount−1. The second argument is +the name of the weapon. Then three integer numbers follow whose meaning depends +on the specific weapon. The table below summarizes by examples all the +available weapons: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ExampleNotes
+
WeaponStation 0 "M61A1" 500 0 0
+
+M-61A1 "Vulcan" cannon. 500 is the number of rounds initially supplied to +the cannon. The other two numbers are ignored. +
+
WeaponStation 1 "AIM9M" 0 0 0
+
+AIM9M "Sidewinder", infra-red guided, short range, air-to-air missile. +The other 3 numbers are ignored. +
+
WeaponStation 2 "AIM120" 0 0 0
+
+AIM-120 "AMRAAM", radar guided, medium-range, air-to-air missile. +The other 3 numbers are ignored. +
+
WeaponStation 6 "MK82" 0 0 0
+
+Mark 82 250 lb standard drop bomb. +The other 3 numbers are ignored. +
+ + +

+Remote aircraft may submit detonation PDUs claiming you have been hit by something. The objects/munition-map.txt lists all the recognized munitions by their DIS entity type, along with their effectiveness. +

+ + + +

Defining new objects

+ +

+An "object" can be the shape of an aircraft (field "Object" of the +aircraft inventory file) or a feature of the scene file (record +"FEATURE"). The format of the object file, described here, is copied +from the ACM Flight Simulator Frequently-Asked Questions List +maintained by Brad Bass (bass@convex.com). +

+ +

+The first line is the object name. +

+

+The 2nd line has two integers which represent the number of points +and the number of polygons in the object. +

+

+Then, the points are listed, one per line, with the point id number +followed by the X, Y and Z coordinate (North, East, Down). The +units are feet. +

+

+Finally, the polygons are listed as color, number of corners, +and the list of point id numbers. The color may be expressed +as a single color or as a front and back color. Also, the polygon +can be flagged as "one-sided" -- that is visible only +from the front. +

+

+For example: +

+
+
+pyramid                  # the object name
+5 4                      # the point count and polygon count
+1 28000 0 0              # the
+2 0 16000 0              #   points that
+3 -35000 0 0             #     describe
+4 0 -14000 0             #       the
+5 0 0 -8200              #         corners
+#788b63      3  1 2 5    # side 1 - color (X-style), cornercount,
+                         #   corner list
+violet       3  2 3 5    # side 2
+(blue red)   3  3 4 5    # side 3 - front is blue, back is red
+(green clip) 3  4 1 5    # side 4 - one-sided polygon
+
+
+ + + + +

IEEE 1278.1 (DIS) compliance

+ +

ACM emits and recognizes the following DIS PDU Types:

+



+

+

Entity +State

+

Fire

+

Detonation

+

Electromagnetic +Emission

+



+

+ +

+The ACM program may simulate several entities, including the aircraft + the +user is flying on, each missile it fires and possibly other + entities. For +each entity it simulates, the program sends a state + packet to all the +other participants every 4.8 seconds along with the + dead reckoning +algorithm each remote program must apply in the + meanwhile. The program +also sends an updated state packet when it detects the actual + state of +the entity deviates from the stated dead reckoning method for + more than +a given amount. +

+ +

The following dead reckoning methods are recognized:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDIS enumerationDescription
Other0NOT SUPPORTED.
Static1Entity does not move.
FPW2Entity moves at constant speed.
RPW3Entity moves at constant speed and rotates at constant speed.
RVW4Entity moves at constant acceleration and rotates at constant speed.
FVW5Entity moves at constant acceleration and does not rotate.
FPB6NOT SUPPORTED.
RPB7NOT SUPPORTED.
RVB8NOT SUPPORTED.
FVB9NOT SUPPORTED.
RPW10NOT SUPPORTED.
RVW11NOT SUPPORTED.
+ + +

+For methods not supported, the state is not updated and the remote entity looks moving by steps. +

+ + +

Entities +managed by ACM emit entity state PDU’s specifying the RPW(3) +dead reckoning method. No articulation parameters are currently sent +by entities managed by ACM. As with most current DIS-based +simulations, altitudes are expressed as heights above the WGS-84 +ellipsoid, not as heights above the geoid. Dead reckoning threshold +values are hard-coded in the src/acm/manifest.h file:

+ + + + + + +
DescriptionValue
Maximum time between Entity State PDUs4.8 seconds
Dead Reckoning Cartesian distance error3 meters
Dead Reckoning angular orientation error2 degrees
+ + +

When +operating in IEEE 1278 mode, the default UDP port number for PDU +transmission is 3000.

+ + +

The Transfer Control Protocol

+ +

ACM +supports an experimental DIS 2.1.4++ control request protocol. It +permits it to “take over” aircraft of similarly enabled +applications. For ACM to take over an aircraft, it must have model +information in the “inventory” file describing the +characteristics of that aircraft type. Those aircraft entities will +be marked with an asterisk (*) in the left margin of the stealth +browser display. Double click an aircraft entity id to take control. +

+ +

Transfer Control Request PDU

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Field
+ Size
+ (bits) +
+ Transfer Control Request PDU fields +
+ 96 + + PDU Header + +

Protocol Version—8-bit enumeration

+
+

Exercise ID—8-bit unsigned integer

+
+

PDU Type —8-bit unsigned integer

+

Protocol Family—8-bit enumeration

+

Timestamp—32-bit unsigned integer

+

Length—16-bit unsigned integer

+
+

Padding—16-bits unused

+
+ 48 + + Originating Entity ID + +

Site—16-bit unsigned integer

+
+

Application—16-bit unsigned integer

+
+

Entity—16-bit unsigned integer

+
+ 48 + + Receiving Entity ID + + Site—16-bit unsigned integer +
+

Application—16-bit unsigned integer

+

Entity—16-bit unsigned integer

+
+ 32 + + Request ID + + 32-bit unsigned integer +
+ 8 + + Required Reliability Service + + 8-bit enumeration +
+ 8 + + Transfer Type + + 8-bit enumeration +
+ 48 + + Entity ID to be Transferred + + Site—16-bit unsigned integer +
+

Application—16-bit unsigned integer

+

Entity—16-bit unsigned integer

+
+ 32 + + Number of Record Sets (R) + + 32-bit unsigned integer +
+ 96 +
+ (L1 x Q1)
+ + P1 +
+ Record Set #1 + + Datum ID—32-bit enumeration +
+

Record + Set Serial Number—32-bit unsigned integer

+
+

Record + Length—16-bit unsigned integer (L1)

+
+

Record + Count—16-bit unsigned integer (Q1)

+
+

Record + Values—(L1 x Q1) bits

+
+

Padding—P1 + bits

+
+

·

+

·

+

·

+
+ 96 +
+ (LR x QR)
+ + PR +
+ Record Set #R + +

Datum + ID—32-bit enumeration

+
+

Record + Set Serial Number—32-bit unsigned integer

+
+

Record + Length—16-bit unsigned integer (LR)

+
+

Record + Count—16-bit unsigned integer (QR)

+
+

Record + Values—(LR x QR) bits

+
+

Padding—PR + bits

+
+
+ + +

+Total Transfer Control Request PDU size: +

+ +
+320 + Sumi=1..R(96 ++ (Li x Qi) + Pi) bits +
+ +

+where R is the number of Record Sets. +

+ +

ACM currently ignores record sets in a transfer control PDU.

+ + + + + +

Transfer Type

+ +

This +section specifies the 8-bit enumeration for the Transfer Type field +of the Transfer Control PDU.

+



+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field ValueNature
0Other
+ 1 + + Controlling + application requests transfer of an entity +
+ 2 + + Application + desiring control requests transfer of an entity +
+ 3 + + Mutual + exchange / swap of an entity +
+ 4 + + Controlling + application requests transfer of an environmental process +
+ 5 + + Application + desiring controls request transfer of an environmental process +
+ 6 + + Mutual exchange of an environmental +
+



+

+

+Assuming Ownership

+

+



+

+

+Accepting Ownership +by Request

+

Another +feature of ACM’s transfer control protocol support is that +other applications may request that ACM take control of an aircraft +that the other application controls.

+ + + +

Suggested further reading

+ +
    + +
  • 3D Graphics Programming for Windows 95
    +by Nigel Thompson ISBN 1-57231-345-5
  • + +
  • Fighter Combat
    +by Robert L. Shaw ISBN 0-87021-059-9
  • + +
  • Aircraft Control and Simulation
    +by Brian L. Stevens and Frank L. Lewis ISBN 0-471-61397-5
  • + +
  • 1278.1-1995 IEEE Standard for Distributed Interactive +Simulation--Application Protocols ISBN 1-55937-572-8
  • + +
  • The Surveying Handbook, second edition
    +edited by Russel Brinker and Roy Minnick ISBN 0-412-98511-X
  • + +
+ +

+...and the source code of ACM which contains lots of interesting comments! +

+ + + diff -Nru acm-5.0/doc/manual/acmdoc-poh.html acm-6.0+20200416/doc/manual/acmdoc-poh.html --- acm-5.0/doc/manual/acmdoc-poh.html 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/doc/manual/acmdoc-poh.html 2020-04-16 12:05:38.000000000 +0000 @@ -0,0 +1,1749 @@ + + + +ACM - Pilot's Operating Handbook + + +

ACM - Pilot's Operating Handbook

+

+ by Riley Rainey +
updated by Umberto Salsi +

+ +

Contents

+Back to general contents +
+Tutorial
+
+ Take-off
+ Landing
+
+The Magnetic Compass
+The Classic Instruments Panel
+The Head-Up Display
+The HSI
+The ADF
+ +The Auto Pilot System
+
+ The Auto-pilot
+ The Auto-throttle
+ The Auto-coordinator
+ The Auto-navigator
+ The Auto-landing
+ The Auto-turn
+
+ +Lights Panel
+The Radar System
+Electronic Countermeasures
+Weapon Systems
+Drones
+Stealth Mode
+
+ + + +

Tutorial

+ + + +

Take-off

+ +

+Start the launcher program acm.tcl. The first thing to do is checking +the whole program be properly configured. Open the Configure panel +and make sure the executable program and the objects directory be set. +Set a frame rate of 20 Hz, mouse mode normal, window size of 700 x 500. +It may need to exit the launcher (press the the Quit button) and start it +again in order to see the list of the available planes in the You panel. +

+ +

+ In the Plane panel choose the Cessna 172 retractable gear + C-172 with about 200 lb of fuel and 200 lb of payload (your + body). Select the classic instruments panel view. Set the eye to + screen distance to something like 50 cm and 10 degrees of downward + view angle. +

+ +

+ In the Departure panel choose the Dallas scene + and the ADS airport, runway 15. +

+ +

+ In the DIS panel disable the DIS protocol. +

+ +

+Press the Run button to start the actual ACM program. Your mouse is +the control stick. The neutral position is the center of the window. +Moving the mouse away from you pitches the plane down, moving it back +pitches the plane up. Left and right inputs roll the aircraft in the +corresponding direction and turn the nose wheel. +

+ +

+Press F9 to cage the attitude indicator: this will speed-up the alignment process +that would take several minutes otherwise. +

+ +
+Hint. Controlling the aircraft is much simpler by enabling the +rate control mode (press SHIFT-E). +
+ + +

+Press the full throttle key (the "4" key on the main keyboard, NOT the +numeric keypad!). Keep the mouse in the neutral position until you +are moving at about 55 KT, then gently pull the mouse about two-thirds +of the way down the view window. You should pitch up and lift off the +ground fairly easily. Maintain a pitch angle between 7 and 10 degrees +by gently moving the mouse and leave your airspeed build. +

+ +

+When the vertical speed indicator indicates a stable positive climb rate +(500 fpm or so), you may retract the landing gear by pressing the "g" key. +Level the plane at a safe altitude of about 2000 ft and throttle down +to about 80% of the engine RPM (use the "2" and "3" keys of the main +keyboard, NOT those of the numeric keypad). +

+ +
+ Hint. Move the mouse very gently around the center of + the window, looking at the attitude indicator for changes. For + normal level flight you should keep about +3 degrees of pitch + and zero bank angle. +
+ +

Congratulation, you successfully made your first take-off!

+ + + + +

Landing

+ +

+ We are still flying the C-172 and now it's time to land. + Set engine RPM to about 50% (keys "2" and "3") and deploy the + landing gear by pressing the "g" key. Reduce the pitch and try + to keep the airspeed at 75 kt and the descending rate at -400 + fpm. Keep wings level. In this our first attempt we will land + randomly somewhere on the green field and will not attempt to + actually land on a runway. +

+ +
+ Rule. The normal glide slope for landing should be around + -3 degrees. In order to keep a glide slope near to this value, + the descent speed should be about 5 times the airspeed. For + example, if the airspeed is 100 kt, then the descent rate should + be around 5 x 100 = 500 fpm. +
+ +

+ Look at the radar altimeter. When it indicates 50 ft from + ground it's time to start the flare maneuver by reducing the + sink rate to about -200 fpm or less, trying to touch the ground + as gently as you can. But do not hesitate to much because the + speed decreases very rapidly and you risk to stall! As the radar + altimeter indicates zero, put the engine to idle power (key "1") + and gently lower the nose gear. Leave the plane to slow down, + or press "b" to engage the brakes. +

+ +

Congratulation, you successfully made your first landing!

+ + + + +

The Magnetic Compass

+ +

+The upper-right corner of the window displays the magnetic compass, +simulated by the program mostly for didactical purposes. The +compass card contains the magnets and it is mounted on a small pivot +point located above its center of mass. This allows the compass card to +rotate freely and to float as a pendulum by a maximum of +/−18° +in pitch and roll following the direction of the apparent vertical line. +Above this angular limit the compass hits violently the side of the +casing and its indication becomes unreliable for some time. +

+ +
+
+
+
+ +

+The magnetic compass. +

+
+
+
+
+ +

+The magnetic compass does not simply indicate the magnetic heading (MH) of +the aircraft, but instead it moves and rotates under the dynamic and magnetic +effects. By definition, the magnetic north is the direction of the +magnetic field vector projected over the local horizontal plane. That's why +the magnetic compass card has to be as close as possible to the horizontal +plane in order to align its magnets with the horizontal component of the +magnetic field. +

+ +

+When the aircraft is at rest on the runway, or it is flying +in straight, level flight at constant speed, the compass card is perfectly +parallel to the horizon and it rotates until it is perfectly aligned with +the horizontal component of the Earth magnetic field. On the contrary, +when the aircraft is turning or otherwise accelerating, the compass card +deviates from the expected MH even more than 30 degrees under the effect +of the vertical component of the magnetic field. +The compass cards displayed by the others instruments (HSI, ADF and HUD) +are feed by the flux gate sensor and each stabilized by its own +gyroscope. The MH indicated by these instruments does not suffer from the +the deviations of the magnetic compass. +

+ +

+In case of instruments failure, turns based on the magnetic compass +have to be timed, because the magnetic compass cannot provide a valid +reference for the final heading. For example, starting from MH=east and +having to rotate at MH=north, the pilot shall perform a timed standard +left turn at 3°/s for exactly 30 seconds. +

+ +

+The magnetic field on the Earth is calculated using the World Magnetic +Model library from NOAA (https://www.ngdc.noaa.gov/geomag/WMM/soft.shtml) +and it is used to display the current magnetic heading of the aircraft, +to rotate the magnetic compass, and to calculate the magnetic bearing at +each VOR station. The file of the coefficients objects/WMM.COF provided +along the package is valid for dates in the range from year 2015 up to +year 2019 included; beyond this range, a warning is displayed and a new +updated file coefficients should be installed. +

+ +

+It is important to note that the components of the Earth's magnetic field +are calculated respect to the current year and day, so updated navigation +charts may be needed. The navigation charts provided along this package +are outdated, so magnetic bearings there indicated may differ more or +less from the calculated values. +

+ + + + +

The Classic Instruments Panel

+ +

+Press Shift-H to alternate between the HUD and the classic instruments +panel. The classic instruments panel mimics the instrumental equipment of +a typical light aircraft, as the Cessna 172-RG. The program does not simply +reproduce the same informations already shown by the HUD, but it tries to +emulate also errors and limitations introduced by these instruments and +that make the job of the pilot harder (and then, more interesting for us). +In the following we will describe each instrument and its properties. The +interested reader should refer to the aeronautical literature for more +informations about their proper usage. +

+ +
+
+
+
+ +

+Instruments of the classic panel. +

+
+
+
+ +

+In the classic instrument mode the HSI and ADF always indicate the MH, as the +compass card of these instruments is driven by the flux gate sensor. In the HUD +mode, on the contrary, the HSI and ADF are driven by the inertial platform and +are able to indicate both TH and MH. +

+ + + +

Turn and slip indicator

+ +

+The pointer moves indicating the rate of turn around the vertical axis of the +aircraft. Normally the aircraft z axis is very close to the geodetic vertical, +so that the indicated value is nearly equal to the actual yaw rate. +At high roll angles or high bank angles, this is not strictly true and small +differences between the actual yaw rate and the indicated value may arise. +

+ +

+The central mark of the turn indicator indicates zero turn rate, while the +other marks indicates 1.5°/s and 3°/s turn to the left or to the right. +

+ +

+Below the turn rate indicator there is a curved glass containing a little +ball. This ball moves from the central position under the action of a +lateral acceleration, typically as a consequence of an uncoordinated turn. +

+ + +

Airspeed indicator

+ +

+It indicates IAS on a non-linear scale (kt). This value is calculated using the +formula below: +

+ +
+ IAS = TAS * sqrt(rho/rho0) * (1 + 1/8*(1 - delta)*M^2) +
+ +

+ being TAS the true airspeed along the x axis, rho is the air density at the current altitude, rho0 the air density at sea level, delta is the ratio P/P0 between the current air pressure and the pressure at sea level, and M is the Mach number. +

+ +

+The digital number indicates the Mach number in the range 0.00 - 9.99. +

+ + +

Attitude indicator

+ +

+Also known as artificial horizon, it provides to the pilot +the pitch and the bank angles. Inside this instrument there is a gyro +whose axis is parallel to the local apparent vertical direction. +

+ +

+An erection system (slowly) forces the axis to follow this +vertical, but this alignment process can take some time, typically from 2 to 5 +minutes, depending on the amplitude of the misalignment. Accelerations produced +by speed changes (takeoff) and prolonged turns can misalign the gyro. To +prevent that misalignment, the erection system gets disabled if the measured +acceleration differs from the expected "g" value +/-2%. That it means, for +example, that turning with angles of bank greater than 12° will not disturb +the alignment. +

+ +

+The gyro can follow the aircraft movements up to +/-70° angles of +bank and pitch. Above this limit the gyro will hit the internal lock, +tumbling abruptly and loosing its alignment. For this reason the pilots +has also a "cage" knob (F9) that forces the alignment of the gyro with its +case, speeding-up the following fine alignment performed by the erection +system. The "cage" knob is also useful to fast align the gyro at the +start of the program. +

+ +

+The orientation of the gyro is represented to the pilot as a ball. Over this +ball are drawn the horizon line and several pitch marks separated by 5° up +to +/-30°. The stylized figure of a little aircraft's wings can be moved up +and down by the pilot (F11, F12) so that it becomes aligned with the line of +the horizon. This adjustment should be performed in level flight at constant +speed so to indicate zero pitch. Once so adjusted, the indicated pitch will +match the angle of climb as indicated by the flight path marker of the HUD, +provided that these maneuvers are performed at the same airspeed at which that +adjustments was made. +

+ +

+A triangle indicates the angle of bank, at steps of 10, 20, 30, 60 and +90 degrees. This triangle moves in the opposite direction of the horizon, +so to indicate the actual direction of the turn. +

+ +

+Flying with the classic instruments panel may be challenging at first because +there is some delay between pilot's input and the actual feedback from the +instruments. Things get simpler if you accurately plan every maneuver before +starting any action. The two rules below should help: +

+ +
+

+Bank rule. +To attain the standard rate of turn of 3°/s in a coordinated turn, first +calculate the required angle of bank as given by this approximated formula: +

+ +
+bank = 0.15 * airspeed +
+
+ + + +
+
+
+
+ +

+Bank angle versus TAS. +

+
+
+
+ +

+For example, at 100 kt the angle of bank is 15°. You can calculate easily +this value taking the airspeed, dropping the last digit and then adding half of +its value. Then roll-in at this angle of bank looking at the attitude +indicator: once the aircraft starts to turn, adjust the rate looking at the +turn indicator. +

+ +
+

+Pitch rule. +At constant airspeed, changes in vertical speed are related to changes +in pitch angle by this approximated formula: +

+ +
+vertical_speed_change = 2 * pitch_change * airspeed +
+
+ +

+For example, flying at 100 kt, every degree of pitch change will result in a +change of about 200 fpm of vertical speed. Use the pitch scale of the attitude +indicator to move the aircraft's nose to the expected pitch angle. Then, some +seconds later, the VSI will indicate the actual vertical speed so achieved +allowing to fine-tuning the pitch. +

+ + + +

Altitude indicator

+ +

+This instruments indicates the altitude. The digital display shows the flight +level (bigger digits) followed by the two less significant +digits of the current altitude. The pointer indicated tens feet. Since in +ACM the atmospheric conditions are always stable and equal to the +standard atmosphere, the indicated altitude is also the actual altitude +above the sea level (MSL). +

+ +

+By default the altimeter indicates the standard pressure altitude (29.92 inHg) +but you can change the isobaric level of reference pressing F7 and F8. +

+ +

+For negative altitudes, the instrument passes from 0 to 99990 ft, then +99980 ft and so on. +

+ + + +

Vertical speed indicator (VSI)

+ +

+It indicates the rate of change of the altitude from −4000 ft/min up to ++4000 ft/min. This instrument has a lag of about 3 seconds, so it takes +some time before it stabilizes to the actual vertical speed. Changes +in altitude should then be made with the aid of the attitude indicator: +first, move the aircraft to the expected pitch, then look at the VSI +for fine adjustment of the desired vertical speed rate. +

+ + + + +

The Head-Up Display

+ +

The +Head-Up Display (HUD) is a collection of indicators that permits +pilots to focus their attention on what's going on outside of the +cockpit. These indicators are projected onto a flat pane of glass +located near the windscreen. Much of the information is displayed +graphically to give the pilot a quicker understanding of the +immediate situation. +

+ +
+
+
+
+ +

The Heads-Up Display.

+
+
+
+
+ +

Ladders

+

+Four tape-style "ladders" display basic flight information. On the left, +is the aircraft true airspeed (TAS). Each minor tick on the airspeed +ladder represents 10 nautical miles per hour (also known as knots and +abbreviated "kt"). +

+

+On the right is the altitude over the sea level (MSL). Each tick +represents 100 feet. A rate-of-climb readout is located just below this +ladder; rate-of-climb is expressed in feet per minute. +

+

In +the lower center is a horizontal heading ladder. Each tick represents +five degrees. +

+

In +the center is an attitude ladder. Each line corresponds to ten +degrees of aircraft pitch. The ladder rolls as the aircraft does, +providing an artificial horizon. +

+ + +

HUD Compass

+

+The compass displays the the true heading (TH, default) or the magnetic +heading (MH). Press Shift-M to switch between the two modes. +The HSI displays the mode currently selected. Implementation note: +the local magnetic variation is that of the nearest NAVAID station or +ILS station. +

+ + +

Angle of Attack

+ +

+The +ACM HUD has two indicators to give the pilot cues as to the planes +current angle of attack and sideslip. First, above the altitude +ladder, is a readout of the plane's current angle of attack in +degrees. The ACM F-16 will stall at a positive angle of 30 degrees +and a negative angle of -30 degrees.
+
+Additionally, +a plane-shaped "flight path marker" indicates the +aircraft's current direction of travel. Level flight occurs when the +flight path marker is aligned with the zero- degree artificial +horizon line. +

+ +

The G-Meter

+

+A readout of the current vertical G-force on the pilot is located above +the airspeed ladder. +

+ +

Weapon State

+

+Below the throttle indicator are discretes that show the state of the +currently selected weapon system. +

+ + +

Turn and slip indicator

+ +
+
+
+
+ +

The turn and slip indicator.

+
+
+
+
+ +

+The turn and slip indicator displays the yaw rate and the lateral +acceleration. The triangle indicates the standard rates of turn of 1.5°/s +and 3°/s. The vertical bar indicates the lateral acceleration, +every tick being 0.25 g. The left part of the figure above illustrates +a left turn at 3°/s with about 0.4 g of lateral acceleration +(uncoordinated turn). The right part of the figure illustrates a +coordinated turn without lateral acceleration. Coordinated turns +are obtained combining ailerons and rudder. +

+ +

Mach-meter

+ +

+The Mach number is the ratio between the airspeed and the speed of the sound +at the current altitude. The table below shows the speed of the sound at +some typical altitudes: +

+ +
+
+
+
+ + + + + + + + + +
Altitude (ft)Speed of the sound (kt)
0659
10000640
20000615
30000590
+
+
+
+
+ +

+The Mach number appears only when the speed is at least 0.20 Mach at the +current altitude. +

+ + +

Radar altimeter

+ +

+At low altitude, below 2500 ft over the terrain, the radar altimeter +scale is displayed. The radar altimeter shows the distance in hundreds +of feet between the terrain and the wheels of the main gear. +

+ + + + + +

The HSI

+ +

+The Horizontal Situation Indicator, or HSI, is a nifty device to aid in +instrument flying. It receives and displays VOR/DME stations and ILS stations. +The compass card of the instrument gets automatically oriented toward the +magnetic north. +A sensor of the earth magnetic field (also known as flux gate) detects +the orientation of the magnetic north. +A gyroscope provides short term stability while the aircraft is +maneuvering and, when in level flight, the flux gate provides the correction +to the gyroscope drift. +The result is an instrument that provides highly accurate aircraft heading +in both turning and straight flight, without a requirement for the pilot to +manually adjust for drift as in a standard directional gyro. +

+ +
+NOTE. Instruments mounted on the real aircraft have both the +slave mode (as described here) and the free mode. When the +pilot selects this latter mode, the flux gate gets disabled (for example +because a failure) and the HSI operates simply as a directional gyro that +needs to be manually aligned with the magnetic compass. +
+ +

+In ACM the HSI system occupies two slots of the instrument panel: the +left slot is the control panel and the right slot is the HSI display. The HSI +panel receives radio signals from VOR, DME, LOCATOR and GS stations, +it elaborates all these informations and then it feed the HSI display. +

+ +

+To save space on the screen, these two panels share the same area with +the ADF receiver and the radar system. +Use the r key to change radar/ADF modes until the HSI is displayed. +

+ + +
+ +

+The HSI control panel. +It displays several informations. Mode can be NAV1, NAV2, RNAV1, +..., RNAV5. These modes will be described below in separated paragraph. +There are two independent NAV1 and NAV2 receivers and five RNAV calculators. +Use the SPACE to switch between NAV and RNAV modes. +

+ +

+FRQ is the frequency of the station, as selected by pilot (9, +0). +

+ +

+Once the station has been selected and properly tuned, the receiver +starts listening for the signal emitted from the station that can provide +also its name displayed in STA (station name). +

+ +

+If the station provides also +a distance measurement equipment (DME) this distance gets displayed. +

+ +

+The RAD and DST fields are meaningful only in RNAV mode and are described +in the respective paragraph. +

+ + +

+The HSI display. +In the TH mode (the default, as shown in the figures below) the indicated +north is the geographic north. In the MH mode (Shift-M) the +indicated north is the magnetic north. The TH mode is mainly useful +for estimated navigation based on geographic charts, since these maps +are always oriented toward the geographic north pole. The MH mode is +the preferred mode for aeronautical navigation, since all the angular +indications (VOR, ILS and runways headings) are always referred to the +local magnetic north. +

+ +

+The curse deviation indicator (the purple segment at the center of the +display) gets displayed only if the corresponding radio signal is +correctly received. The slope deviation indicator (the purple arrow +to the right of the display) gets displayed only if the corresponding +signal is correctly received. +

+ +

+Use the 7 and 8 keys to orient the Omni Bearing Selector +(OBS). The OBS displays the digital value of the selected direction. +

+ + +
+ + + +

HSI for VOR stations

+ +

+In NAV mode the HSI displays the VOR/DME bearing, angular deviation (CDI) +from the selected radial (OBS) and distance DME. +

+ +
+
+
+
+ +

The HSI tuned on a VOR/DME station in NAV mode.

+
+
+
+
+ +

+Having two NAV receivers is very useful, both for navigation +and to approach the runway. For example, we can tune NAV1 on the VOR +station we are leaving and NAV2 on the station we are going to. Or, +we can tune NAV1 on the terminal-VOR of the airport, and NAV2 on the +ILS station. +

+ +

+The frequency of a VOR station ranges from 108.x0 MHz up to 111.x5 +MHz with x being an even digit 0, 2, 4, 6, 8 for terminal VOR, +and from 112.00 MHz to 117.95 MHz for en-route VOR. +

+ +

+The signal range of a terminal VOR is about 40 NM, and the range of +an en-route VOR is about 200 NM due to the limited power emitted by these +stations. Moreover, electromagnetic signals at hight frequency (100 MHz and +more, as those emitted from VOR stations are) propagates in a direct line +of sight. Because of the curvature of the Earth, the range at which the +signal can be received may be even more limited depending on the current +altitude of the aircraft: +

+ +
+range = K * (sqrt(station_altitude) + sqrt(aircraft_altitude)) +
+ +

+where the altitudes are expressed in feet and the resulting distance in NM. +The value of the constant K in the formula above is K=1.064 as you can +easily prove with simple geometrical considerations assuming the Earth to +be a sphere of radius R=3438 NM. Then, for example, if the altitude of the +station is 500 ft and the altitude of the aircraft is 4000 ft, the signal +cannot be received beyond the distance of 91 NM. +

+ +
+
+
+
+ +
+The Earth is round and radio signals at high frequency (100+ MHz) +propagate in stright line. +
+
+
+
+
+ +

+Every dot of the CDI scale indicates a deviation of 1.7° from the +selected radial. For stations providing a DME, the distance from the +selected radial is given by this simple formula: +

+ +
+distance_from_radial = distance_from_DME / 100 * 3 * CDI +
+ +

+For example, if the distance from the DME station is 20.0 NM and the +CDI indicates 2 dots, then the distance from the selected radial is +20/100*3*2=1.2 NM. +

+ + + +

HSI for ILS stations

+ +

+In NAV mode, also ILS stations can be tuned. +

+ +
+
+
+
+ +

The HSI tuned on a ILS station.

+
+
+
+
+ +

+The frequency of ILS stations ranges from 108.x0 MHz up to 111.x5 MHz, +with x being an odd digit 1, 3, 5, 7, 9. +

+ +

+An ILS station can be received up to the distance of about 18 NM and in +a range of +/-50° from its bearing angle. +

+ +

+Every dot of the CDI scale indicates a deviation of 0.4° from the +LOCATOR plane (not the deviation from the OBS, but the pilot can +still select an OBS for its own reference). Every tick of the glide slope +scale indicates a deviation of 1° from the glide path angle of the +ILS station (typically 3°). +

+ + +

HSI for RNAV calculator

+ +

+The RNAV calculator can store up to 5 waypoints (WP). The pilot enters +the WP in the RNAV calculator in polar coordinates (radial RAD and +distance DST) referred to some VOR/DME station, along the frequency +of the VOR/DME station itself. +

+ +
+
+
+
+ +

The HSI tuned on a VOR/DME station in RNAV mode.
+The waypoint is set at radial 75, distance 24.5 NM from the VOR/DME. +

+
+
+
+
+ +
+NOTE: bare VOR stations and ILS stations cannot be tuned in RNAV mode. +
+ +

+Once the control panel has been set, the RNAV calculator feeds the HSI display +with angular deviation and distance from the selected waypoint (WP). Then the +pilot can fly toward the WP just like if it were a "phantom" VOR/DME station. +The DME field of the control panel displays the distance from the WP +(not the distance from the VOR/DME station used as a reference). +

+ + +
+
+
+
+ +

+A "phantom" VOR/DME guides the aircraft along the route from A to WP +and then from WP to B. +

+
+
+
+ + + +

The ADF

+ +

+Press the r several times until the ADF receiver gets displayed. +The compass card of this instrument is automatically aligned with the magnetic +north tanks to the signal provided by the flux gate, and stabilized with +a gyroscope. +

+ +

+The ADF occupies two slots of the instrument panel: the left slot is the +ADF panel were the frequency and the ID of the NDB station gets displayed; +the right slot is the ADF display that shows the magnetic bearing of the +NDB station. +

+ + +
+
+
+
+ +

+The ADF control panel (left) and bearing indicator (right). +

+
+
+
+
+ +

+Tune the desired station pressing 9 and 0. +

+ +

+In the real world the range of the NDB signal depends on many factors. +In ACM this range is set to 100 NM for navigation NDB stations, and 20 +NM for instrumental approach stations (OMARKER, MMARKER, IMARKER). +

+ + + + +

The Auto Pilot System

+ +

+The auto-pilot system (APS) consists of several functional blocks, each one +taking control of some flight parameter. The relations between blocks are +indicated in the diagram below. Every block can be engaged or disengaged +by the pilot independently from the others blocks, with the only exception +of AW and AP that might be required by AN and AL. +

+ +

+In a emergency, the APS can be disabled pressing the key Home. +

+ +
+
+
+
+ +

+Block diagram of the Auto Pilot System (APS). +

+
+
+
+
+ +

+A note about the terminology: "APS" is the whole system of auto-piloting, +while the "AP" is the sub-block that control the altitude or the climb rate. +Perhaps the AP should had been split in two independent blocks performing +"hold altitude" and "hold climb rate", so resolving the ambiguity. +This can be a change left to the future releases of the program. +

+ + + + + +

The Auto-pilot

+ +

+The auto-pilot (AP) helps the pilot keeping a given rate of climb or a +given altitude. When engaged, the AP adds a correction term to the current +elevator control that can grow up to the 50% of the full elevator control +range: +

+ +
+ elevator_setting = pilot_setting + AP_correction_term +
+ +

+Even when the AP is engaged, the pilot preserve the ability to +control the aircraft, while the AP will try to do its best to keep constant +the controlled parameter. Press Shift-A to engage/disengage +the AP. When engaged, the "AUTOPILOT" word is displayed on the HUD. +

+ +
+ +

+Engaging the AP to hold the rate of climb. +Once the desired rate of climb has been attained, engage the AP. The +AP will grab the current rate of climb and will use this value as a +reference to calculate the elevator correction. The rate of climb must be +greater than +100 ft/min or less that −100 ft/min. +

+ +

+Engaging the AP to hold the altitude. +Once the desired altitude has been attained, engage the AP. The AP will +capture the current altitude and will use this value as a reference to +calculate the elevator correction. The rate of climb must be near to zero ++/− 100 ft/min. As an alternative, press Shift-Z: in +this case the AP grabs the current altitude and keeps this value as reference. +

+ +

+Disengaging the AP. +Press Shift-A or Shift-Z. The elevator correction term will +be released smoothly within 3 seconds, restoring the full control of +the elevator. +

+ +

+AP alarm. +When the AP correction grow beyond the 25% of the full elevator control +range, the "AUTOPILOT" displayed in the HUD (or the "Pilot" +light in classic instruments mode) will blink. In this +case the intervention of the pilot is required. Adjust the pitch or the +engine power until the alarm disappear. +

+ +
+ +

+AP limitations: +

+ +
+- max vertical acceleration: +/- 0.1 g
+- hold altitude mode, max vertical speed: +100 fpm
+- hold altitude mode, min vertical speed: -1000 fpm
+- disengaging the AP, smooth release of the elevator within 3 s +
+ + + +

The Auto-throttle

+ +

+The auto-throttle (AT) controls the engine thrust in order to hold a +given IAS limiting the acceleration to the range -0.5g +.. +0.1g. When the selected TAS cannot be attained, the pilot is warned +by the blinking "ATxxx" in the HUD (or the blinking light "Thr" in classic +instruments mode). +

+ +

+The AT can be engaged/disengaged pressing Shift-T. When enabled, +the current TAS is grabbed and used by the AT as the target speed. +The value of the current target speed is displayed in the HUD to the +right of the speed scale. For example, the indication "AT120" means that +the target TAS is 120 kt. +

+ +

+When the AT is enabled, the buttons that normally control the engine +change their meaning as follow: +

+ +
+ +1 disable the AT device and sets the minimum thrust (20% RPM). +

+ +2 decrease the target TAS by 5 kt. +

+ +3 increase the target TAS by 5 kt. +

+ +4 disable the AT device and the AP and sets the maximum +thrust (100% RPM). + +

+ +

+Press Shift-T again to disengage the AT keeping the current +throttle setting. +

+ + + + +

The Auto-coordinator

+ +

+Controlling the rudder through the keyboard and without a physical feedback +of the lateral acceleration is really difficult, so often compromising +the precision of the maneuver on coordinated standard turns. +

+ +

+The auto-coordinator (AC) feature allows the rudder to be controlled by the +program in order to cancel the lateral acceleration, indicated by the slip +indicator. The AC can be enabled/disabled pressing Shift-X. Once +enabled, a little "AC" gets displayed to the side of the slip indicator +(or the "Coord" light in classic instruments mode) +and all the turns are automatically coordinated. +

+ +

+A good way to do a standard turn in AC mode is bringing the aircraft to +the expected bank angle, then checking the turn rate indicator for the +expected turn rate. The figure below plots the expected bank angle +vs. the current true air speed for 1.5°/s and 3.0°/s standard +rates of turn. +

+ +

+The arrows keys are very useful to do little heading corrections in +AC mode, for example to align the aircraft to the runway. Larger turns +can be done simply moving the mouse. +

+ +

+The keys z c that control the rudder are still enabled, but not +really effective. You may use them for even finer heading corrections. +

+ + + +

The Auto-navigator

+ +

+The auto-navigator (AN) allows to follow the radial indicated by the +OBS set into the HSI panel. Once enabled, the AN automatically compute a +proper approaching route bringing to the radial, then it maintain this radial. +Ailerons and rudder are controlled in order to correct the magnetic heading +of the aircraft according to an algorithm explained below. +

+ +

+Enabling the AN. +To enable the AN follow these steps: +

+ +
    +
  1. Tune the HSI on the chosen VOR station or WP.
  2. +
  3. Turn the OBS to the chosen VOR radial.
  4. +
  5. Enable the AN (Shift-N). The word "AutoNav" gets displayed in the HUD +(or the "Nav" light in the classic instruments panel).
  6. +
+ + +

+ +The approaching path. +The AN computes the path bringing to the chosen radial. Normally +an approaching angle of OBS+45° gets chosen if the aircraft is located +to the left of the radial (point A of the figure) otherwise an heading of +OBS−45° gets chosen (point B of the figure). The aircraft then turns +toward the heading so computed, either clockwise +or counter-clockwise depending on the current heading. For example, if +the target heading is 360° (north) and the aircraft is currently directed +toward east, then the aircraft will begin to turn counter-clockwise 90°; +if the current heading is west, then the aircraft will turn clock-wise. +Every turn gets performed with angular speed up to +/−3°/s and +a bank angle up to +/−25°. +

+ +

+When the CDI (angular deviation from the OBS) becomes less than 2°, or +when the CDI starts moving (indicating that we are very close to the VOR +station) the approaching angle gets diminished smoothly so that the aircraft +reach the radial with a single turn. This simple strategy works well when +the aircraft is far from the VOR, but for short distances (say, 5 NM or less) +the aircraft gets forced in a sequence of rough turns, waving around the +radial. Because of this limitation the AN should always be disabled +below 5 NM from the VOR. +

+ +

+Disabling the AN. +The AN can be disabled intentionally pressing Shift-N again. The AN +gets also disabled if any of these events occurs: +

+ +
    +
  • The auto-pilot system gets disabled.
  • +
  • Engine shoot-off of engine max power.
  • +
  • The HSI frequency gets changed.
  • +
  • The OBS setting gets changed.
  • +
  • Switching between NAV/RNAV receivers.
  • +
  • Switching between HSI/ADF/radar display.
  • +
  • Loosing the signal from the VOR station.
  • +
+ + + +

The Auto-landing

+ +

+The auto-landing takes control of the aircraft controlling heading and pitch +following the approaching path to the LOC+GS station currently tuned. The +heading gets corrected in order to smoothly reach the LOCATOR plane. If also +the GS is available, then the pitch gets controlled in order to attain the +indicated descending path. The AL also performs the flare maneuver, deploys the +thrust reverse (if available), deploys the speed brakes, enable the wheel +brakes and finally stops the aircraft on the runway. +

+ +

+Enabling the AL. +To enable the AL follow these steps: +

+ +
    +
  1. Tune a LOC or LOC+GS=ILS station.
  2. +
  3. Turn the aircraft so that it is roughly oriented toward the runway. +An approaching angle of no more than 30° from a distance of at least +5 NM gives the better results. +
  4. +
  5. Enable the AL (Shift-L). The word "AutoLanding" gets displayed in the HUD +(or the "Land" light will lighted in classic instruments mode).
  6. +
+ +

+Once enabled, the AL compute a proper, smooth approach to the plane of +the LOCATOR, then it will attain this route up to the runway threshold. +Turns are performed with a maximum bank angle of +/-25°. +

+ +

+For ILS stations providing also the GS signal, the AL can follow the glide +path. In this case, the AL takes control of the elevator, maintaining +the current altitude until the glide slope plane is reached. Once the +GS has being reached, the AL sets a descending rate suitable to maintain +the alignment with the glide slope plane (typically -3°). +

+ +

+The AL behave pretty well and it can recover from situations +that would be very hard for an human to handle. However, in order to +ensure the best results, these restrictions should be respected: +

+ +
    +
  • Initial distance from the runway: greater than 5 NM.
  • + +
  • Angle of incidence with the LOCATOR plane: less than 90°.
  • + +
  • Initial distance d from the locator plane: possibly not less +than the distance required to attain the LOCATOR alignment with a single turn +at the rate of 1.5°/s. +
  • + +
+ +
+
+
+
+ +

+Requirements of the auto-landing. +

+
+
+
+ +

+The figure above illustrate the final approach to the runway. The optimal +distance from the LOCATOR plane should be large enough to allow to the +aircraft to attain the alignment to the LOCATOR with only a turn at the +rate of 1.5°/s: +

+ +
+d ≥ (1 - cos(A)) v / 94 +
+ +

+where v is the current TAS (knots). For example, with an angle +of incidence of A=30° and v=170 kt the distance +would be 0.24 NM. By the contrary, crossing the LOCATOR plane with an +angle near to 90° at little distance from the runway, would force +the AL to do several turn maneuvers, often ending with a misalignment +and a missing approach. +

+ +

+Disabling the AL. +The AL can be disabled intentionally pressing Shift-L again. +The AL gets also disabled automatically when any of these events occurs: +

+ +
    +
  • Engine shut-down or engine max power required.
  • +
  • Loosing signal from the radio station (too far or outside the allowed +cone).
  • +
  • Changing the frequency on the HSI.
  • +
  • Switching between NAV/RNAV receivers.
  • +
  • Switching between HSI/ADF/radar display.
  • +
+ +

+Detailed description on how the AL works. +The exact sequence of the events depends on several factors. For brevity +we will indicate with FLARE_ALT the altitude over the runway at which the +flare maneuver starts, V is the current speed, : +

+ +
+FLARE_ALT = 0.375 ft/kt * V
+
+ +

+so, for example, landing at 160 kt the flare maneuver starts when the +radar altimeter indicates 60 ft from the terrain. +We will also indicate with V_TOUCHDOWN the airspeed indicated when the +main gear hit the runway. The exact sequence of events is as follow: +

+ +
+ +

+ 1. Keep current altitude until the GS path is intercepted. + Adjust heading according to the CDI. +

+ +

+ 2. Once the GS has been intercepted, start descending at the standard + rate of −3 DEG. If the GS has a different angle, the resulting GS + error will guide the AL to the correct descending ratio. Continue to + follow the LOCATOR, adjusting the heading. +

+ +

+ 3. When the altitude as indicated by the radar altimeter becomes less + than 250 ft, the GS signal is assumed to be unreliable and the aircraft keeps its attitude and continues following a ballistic descent at the standard descending rate of −3 DEG. +

+ +

+ 4. When the altitude indicated by the radar altimeter becomes + less than FLARE_ALT, the flare maneuver starts. Raise nose so to + keep a descending rate of −1 DEG. + Ensure wheel brakes are disabled. +

+ +

+ 5. When the altitude as indicated by the radar altimeter + is less than 0.5*FLARE_ALT disable engine auto-throttle + and hold current power setting. The speed begins to reduce. +

+ +

+ 6. When both the wheels of the main landing gear hit the ground, + grab current airspeed V_TOUCHDOWN, as it will used for reference + in the rest of the procedure. + The speed brakes are fully extended, if available. + If the thrust reverse device is available, deploy and set engine + power to 75%. + Otherwise, set engine idle. Disable auto-pilot and keep current + pitch angle. +

+ +

+ 7. For tricycle landing gear, immediately lower nose wheel. For bicycle + landing gear, hold current pitch until speed drops under 85% + V_TOUCHDOWN, then begins lowering the tail wheel. +

+ +

+ 8. For tricycle landing gears, when all the wheels are in contact with + the terrain, enable wheel brakes. If thrust reverse available, + brakes are enabled only below 50% V_TOUCHDOWN. +

+ +

+ 9. At 40% V_TOUCHDOWN, if thrust reverse device available, set engine + idle. +

+ +

+ 10. At 20% V_TOUCHDOWN disable AP, AL, AW and retract thrust reverser, + leaving only the brakes on. +

+ +
+ + + +

The Auto-turn

+ +

+ +The auto-turn block (AW) control the rate of the turn and it is mostly +used by the AN and AL. The pilot can engage manually the AW to perform +standard turns at 1.5 and 3°/s or also 0°/s to keep the current +heading. The involved keys are: +

+ +
+ +

+< +turn left at 3°/s +

+ +

+, +(comma) turn left at 1.5°/s +

+ +

+| +(vertical bar) stop turning and hold heading +

+ +

+. +(dot) turn right at 1.5°/s +

+ +

+> +turn right at 3°/s +

+ +

+/ +disengage the AW +

+ +
+ +

+The "MAX BANK" knob set the maximum bank limiter, chosen between 5, 10, 15, 20 +and 25 degrees. The AW will never exceed this value. +

+ +

+When the AW is enabled, a little round circle gets displays into the +turn-and-sleep indicator giving the feedback of the turn speed the AW is +aiming to (see the figure to the right). +

+ + + + +

Lights Panel

+ +

+The status panel displays 14 lights. The alarm lights blinks alerting the pilot +about some serius sub-system failure or other urgent danger: +

+ +
+OIL, HYD1, HYD2: hydraulic subsystem failures. +
GEN1, GEN2: power sources failure. +
FLAP: flaps failure. +
SPBRK: speed brake failure. +
RADAR: radar failure. +
TEWS: TEWS failure. +
HUD: HUD failure. +
G-LOAD: above 75% maximum positive or negative wings load. +
+ +

+Status and warning lights does not blink and are alerts to the pilot: +

+ + +
+FUEL: fuel tank below 15% maximum capacity. +
SPD BRK: speed brakes engaged. +
BRAKES: wheel brakes are on. +
+ + + + + + +

The Radar System

+ +

The +ACM radar system has a field of view in Normal mode of 120 degrees +laterally and vertically from the front of the aircraft. The F-16 +radar set's range is about 80 NM. All aircraft within that range and +field of view will appear as a box on the radar display +

+ +
+
+
+
+ +

Radar coverage.

+
+
+
+
+ +

The +ACM radar display presents a forward looking view of radar targets. +Think of it as a television monitor connected to a forward-pointing +TV camera that has a very wide angle lens. +

+

If +any objects are close enough to be radar-visible, the set will +automatically lock onto the nearest threat. With radar lock acquired, +your display will provide detailed information about the locked, or +"primary", target's disposition. A primary target appears +as a filled diamond +on the radar display -- the display provides information on the +primary target's range and altitude, as well as it's current heading, +your desired relative heading to intercept and the rate of closure of +your two aircraft. +

+ +
+
+
+
+

The ACM radar display. +

+
+
+
+ +

The +radar set's ability to establish a positive lock on a target extends +for a shorter range than the radar's maximum detection range -- radar +lock is limited to about 60 NM on the F-16 and 30 NM on the MiG-29. +

+

If +multiple targets are plotted on your radar display, you can lock onto +other targets by pressing the target reject key (q). +

+

The +radar on/standby key (R) can be used to toggle your radar set between +its normal operating mode and a standby state. When your radar is in +standby mode, your aircraft emits no radar energy and can be more +difficult to detect. +

+ + + +

Electronic Countermeasures

+ +

+

Fighters are +Equipped with a special device called a Radar Warning +Receiver (RWR). It's display is the round "CRT" to the left +of the radar display. It works much like a radar detector that you +can buy for your car. The receiver can detect radar emissions from +other aircraft and will plot a box on the RWR display representing +the relative direction of that radar threat. Opposing team’s +radar emissions appear as filled boxes. Friendly aircraft appear as +open boxes. This receiver cannot detect aircraft that have their +radar emissions directed away from your aircraft, nor is it capable +of detecting aircraft that have their radar sets turned completely +off. +

+ + + +

Weapon Systems

+ +

Your +aircraft is equipped with heat-seeking missiles and a 20-millimeter +cannon. Weapon information is displayed in the lower left-hand corner +of your HUD. Different weapons may be selected by pressing mouse +button 3. The currently selected weapon is fired by pressing mouse +button 2. +

+ + + +

Air-to-Air Missiles

+ +

The +missiles are patterned after U.S. AIM-9M Sidewinders and AIM-120 AMRAAM. They can detect +infrared (IR) targets at any aspect (not just from the rear). +

+ +

The range of these missiles varies dramatically with the altitude and closure rate. The +missile subsystem couples with your radar set to provide +time-to-impact information. +

+

This +missile has a solid rocket motor that burns for about 8 seconds (AIM-9M) or 15 seconds (AIM-120). After burn-out, it will still track towards its intended target but may lose speed too rapidly to catch it. Your heat seeking missiles don't arm themselves until one second (AIM9M) or three seconds (AIM-120) after launch. Because of that, you should not fire at a target for which the flight time is less than the arm time. +

+ +
+ Beware! clouds are opaque to IR. If the target hides + in the clouds, the missile loses lock and continues flying + ballistically, possibly missing the target. +
+ +

Missile status discretes and their meanings: +

+ +
+

+ ARM --
+ No target acquired on the radar.

+ +

+ ARM 125
+ Missile's seeker has not yet acquired the target in its field of view; time to target 125 seconds. +

+ + +

+ LOCKED 18
+ Missile locked on target and ready to fire; time to target 18 seconds. +

+ +

+ IN RANGE 2
+ Target too close; time to target smaller than arm time. +

+
+ + + +

Cannon

+

+Cannon +can be used to engage targets at closer range. Your cannon is modeled +after the U.S. M61-A1 Vulcan. Aircraft typically begin a mission with +500 rounds of ammunition; the cannon fires at 3000 rounds per minute +so you only have enough ammunition for a ten-second continuous burst +-- use it carefully. +

+ +

+When +cannons are selected, the HUD is in Lead Computing Optical Sight +(LCOS) mode. On the HUD, a circular aiming reticle is displayed. The +HUD couples with the radar set to provide a visible cue of the +target's current range. The aiming reticle is surrounded by 12 ticks. +An inner arc represents the current range to the target: each arc +tick represents 1000 feet of distance. The aiming reticle moves +across the HUD to show a good aiming point based on the target's +range and your aircraft's pitch and turn rate. If the range is large +and or your pitch and turn rates are fast, you may see no reticle at +all: the aiming point is simply out of the HUD's field of view. +

+ +

+An unmoving cross (a "+") will be displayed on the HUD in LCOS mode. This +marker denotes the boresight of the cannon -- the direction that the +cannon's barrel is actually pointing. +

+ +

+Figure 6 (missing!) shows another example of what you might see in a +dogfight. All planes are turning hard to the left at a relatively low +speed. You are in LCOS mode and see that the reticle is positioned +ahead of the intended target. To get the kill, simply relax the turn +long enough to get into position and then take the shot. +

+ + +

Drop bombs

+ +

+You fighter may be equipped with one or more standard Mark 82 (MK-82) +drop bombs. If so, then selecting that weapon with the right mouse button +displays the CCIP sighter. The circle indicates the estimated hit point +if the bomb get dropped right now with the left button of the mouse. +A line joinging the flight path marker to the circle helps aligning the +target point while the aircraft dives. +

+ +

+Currently only the SU-30 model is equipped with drop bombs; you may change +this setting by adding drop bombs to any other fighter by changing its +configuration file as explained in this manual. +

+ + + + + +

Drones

+ +

+Drones are automated opponent aircraft. They are created by pressing the +l key. Drones aggressiveness setting (see option -da) +controls how hard a drone aircraft will attempt to maneuver to attack +other planes. For example, a setting of 0.7 means the drone will maneuver +pulling "G" up to the 70% of its maximum structural vertical limit (see +the parameters MaxLoadZPositive and MaxLoadZNegative); if +the fighter supports up to 10g of positive vertical acceleration with nearly +empty tank, it will reach 7g of positive vertical acceleration. +

+ +

+With an aggressiveness factor too low (probably 0.2 or less) the aircraft +will hardly sustain its own weight and will crash on the ground without +even try to fly. With a value near 1.0 or greater your opponent drone will +fly very close to its structural limit and may suffer a sudden +tragic fatal structural failure... Values between +0.7 and 0.9 will usually make for an interesting opponent. +

+ + + + +

Stealth Mode

+ +
+I don't really know what this "stealth" mode is and what it is intended to +do, but apparently it is not working anymore. Any help appreciated. - U.S. +
+ +

ACM’s +stealth mode allows users to monitor out-the-window views for any +aircraft active in an exercise. +

+ +
$ acm -stealth
+ +

In +stealth mode, the radar display is used to display DIS entity id’s +of aircraft participating in the exercise. To select and aircraft to +follow, use the mouse to click on one of these identifiers. The +entity id of the aircraft you are following will be highlighted in +magenta. +

+ +
+DIS Entity ID
+  50,1,1
+  50,1,2
+* 50,6,1
+
+ +

+If there is a large number of entities in an exercise, use the PAGE UP +and PAGE DOWN keys to scroll through the list. +

+ + + diff -Nru acm-5.0/doc/manual/acmdoc-styles.css acm-6.0+20200416/doc/manual/acmdoc-styles.css --- acm-5.0/doc/manual/acmdoc-styles.css 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/doc/manual/acmdoc-styles.css 2017-10-28 07:54:47.000000000 +0000 @@ -0,0 +1,37 @@ +BODY { + line-height: 1.5em; +} +H2 { + margin-top: 2.0em; + margin-bottom: 0.5em; + padding-bottom: 0.3em; + font-family: sans-serif; + color: rgb(120,120,120); + border-bottom-color: rgb(192,192,192); + border-bottom-style: solid; + border-bottom-width: 0.1em; +} + +H3 { + margin-top: 1.5em; + margin-bottom: 0.0em; + padding-bottom: 0.0em; + font-family: sans-serif; + color: rgb(120,120,120); +} +P { + margin-top: 0.5em; + margin-bottom: 0.5em; + line-height: 1.5em; +} +LI { + margin-top: 0.5em; + margin-bottom: 0.5em; +} +DT { + margin-top: 1.5em; +} +DD { + margin-top: 0.5em; + margin-bottom: 1.5em; +} Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/manual/acmdoc-zones.jpeg and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/manual/acmdoc-zones.jpeg differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/manual/acmtcl-configure.png and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/manual/acmtcl-configure.png differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/manual/acmtcl-departure.png and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/manual/acmtcl-departure.png differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/manual/acmtcl-dis.png and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/manual/acmtcl-dis.png differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/manual/acmtcl-drones.png and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/manual/acmtcl-drones.png differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/manual/acmtcl-environment.png and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/manual/acmtcl-environment.png differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/doc/manual/acmtcl-plane.png and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/doc/manual/acmtcl-plane.png differ diff -Nru acm-5.0/gedit/actions.c acm-6.0+20200416/gedit/actions.c --- acm-5.0/gedit/actions.c 1994-01-20 14:11:33.000000000 +0000 +++ acm-6.0+20200416/gedit/actions.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,266 +0,0 @@ -/* - * Copyright (c) 1994, Riley Rainey, riley@netcon.com - * - * Permission to use, copy, modify and distribute (without charge) this - * software, documentation, images, etc. is granted, provided that this - * comment and the author's name is retained. - * - * This software is provided by the author as is, and without any expressed - * or implied warranties, including, but not limited to, the implied - * warranties of merchantability and fitness for a particular purpose. In no - * event shall the author be liable for any direct, indirect, incidental, or - * consequential damages arising in any way out of the use of this software. - */ - -#include -#include -#include "gedit.h" - -static String normal_translations = - ": point-begin() \n\ - : point-end()"; - -static String extra_translations = - "Shift: point-begin(extend) \n\ - : point-begin() \n\ - : point-motion() \n\ - : point-end() \n\ - : close-polygon()"; - -static XtTranslations normal, extra; - -static void PointBegin(), PointMotion(), PointEnd(), DeleteCurrent(), - ClosePolygon(); - -static XtActionsRec action_list[] = { - { "point-begin", PointBegin }, - { "point-motion", PointMotion }, - { "point-end", PointEnd }, - { "close-polygon", ClosePolygon }, - { "delete-selection", DeleteCurrent } - }; - -extern void BeginPolygonPoint(), CompletePolygon(), CompleteDrag(); -extern void CompleteMarker(); -extern void BeginCirclePoint(), DragCirclePoint(), CompleteCircle(); - -void -InitializeTranslations (app, w1, w2) -XtAppContext app; -Widget w1, w2; -{ - - XtAppAddActions (app, action_list, XtNumber(action_list)); - - normal = XtParseTranslationTable (normal_translations); - extra = XtParseTranslationTable (extra_translations); - - XtVaSetValues (w1, - XmNtranslations, extra, - NULL); - - XtVaSetValues (w2, - XmNtranslations, extra, - NULL); - -} - -void InstallNormalTranslations (w) -Widget w; -{ - view_info_t *p; - - XtVaGetValues (w, - XmNuserData, &p, - NULL); - - XtVaSetValues (w, - XmNtranslations, normal, - NULL); - - XtVaSetValues (p->other_widget, - XmNtranslations, normal, - NULL); -} - -void InstallExtraTranslations (w) -Widget w; -{ - view_info_t *p; - - XtVaGetValues (w, - XmNuserData, &p, - NULL); - - XtVaSetValues (w, - XmNtranslations, extra, - NULL); - - XtVaSetValues (p->other_widget, - XmNtranslations, extra, - NULL); -} - -/* - * The next action procedure is typically associated with Button 1 down. - * - * The action taken here depends on the value of edit_state. But we may: - * - * Determine the polygon nearest the click -- within reason. - * - * Begin the process of entering a 3-D point. - * - * Begin the process of relocating the origin. - * - */ - -static void -PointBegin (w, event, params, num_params) -Widget w; -XEvent *event; -String *params; -Cardinal *num_params; -{ - XButtonEvent *ev = (XButtonEvent *) event; - view_info_t *p; - Boolean extend = False; - - if ((*num_params > 0) && (strcmp (*params, "extend") == 0)) - extend = True; - - XtVaGetValues (w, - XmNuserData, &p, - NULL); - - switch (edit_state) { - case STATE_POINT: - BeginPick (w, p, ev->x, ev->y, extend); - break; - - case STATE_POLYGON: - BeginPolygonPoint(w, p, ev->x, ev->y); - break; - - case STATE_MOVE_ORIGIN: - break; - - case STATE_CIRCLE: - BeginCirclePoint (w, p, ev->x, ev->y); - break; - - case STATE_MARKER: - BeginPolygonPoint(w, p, ev->x, ev->y); - break; - - } -} - -/* - * Move the selected polygon in point mode. - * - * Slide the new point along the perpedicular-axis line. - * - * Move the origin locator. - */ - -static void -PointMotion (w, event, params, num_params) -Widget w; -XEvent *event; -String *params; -Cardinal *num_params; -{ - XMotionEvent *ev = (XMotionEvent *) event; - view_info_t *p; - - XtVaGetValues (w, - XmNuserData, &p, - NULL); - - switch (edit_state) { - case STATE_POINT: - DragSelection (w, p, ev->x, ev->y); - break; - - case STATE_POLYGON: - case STATE_MARKER: - DragPolygonPoint(w, p, ev->x, ev->y); - break; - - case STATE_CIRCLE: - DragCirclePoint (w, p, ev->x, ev->y); - break; - - case STATE_MOVE_ORIGIN: - break; - } -} - -/* - * Lock in a polygon selection. - * - * The point has been positioned and is ready to be registered. - * - * Relocate the origin. - */ - -static void -PointEnd (w, event, params, num_params) -Widget w; -XEvent *event; -String *params; -Cardinal *num_params; -{ - XButtonEvent *ev = (XButtonEvent *) event; - view_info_t *p; - - XtVaGetValues (w, - XmNuserData, &p, - NULL); - - switch (edit_state) { - case STATE_POINT: - CompleteDrag(w, p, ev->x, ev->y); - break; - - case STATE_POLYGON: - CompletePolygonPoint (w, p, ev->x, ev->y); - break; - - case STATE_CIRCLE: - CompleteCirclePoint (w, p, ev->x, ev->y); - break; - - case STATE_MOVE_ORIGIN: - break; - - case STATE_MARKER: - CompleteMarker (w, p, ev->x, ev->y); - break; - } -} - -/* - * Delete the currently selected object. - */ - -static void -DeleteCurrent (w, event, params, num_params) -Widget w; -XEvent *event; -String *params; -Cardinal *num_params; -{ - ClearSelection (); -} - -static void -ClosePolygon (w, event, params, num_params) -Widget w; -XEvent *event; -String *params; -Cardinal *num_params; -{ - if (cur_polygon != (polygon_t *) NULL) - CompletePolygon (w, cur_polygon); -} diff -Nru acm-5.0/gedit/balance.c acm-6.0+20200416/gedit/balance.c --- acm-5.0/gedit/balance.c 1995-09-22 21:02:51.000000000 +0000 +++ acm-6.0+20200416/gedit/balance.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,158 +0,0 @@ -/* - * Copyright (c) 1994, Riley Rainey, riley@netcon.com - * - * Permission to use, copy, modify and distribute (without charge) this - * software, documentation, images, etc. is granted, provided that this - * comment and the author's name is retained. - * - * This software is provided by the author as is, and without any expressed - * or implied warranties, including, but not limited to, the implied - * warranties of merchantability and fitness for a particular purpose. In no - * event shall the author be liable for any direct, indirect, incidental, or - * consequential damages arising in any way out of the use of this software. - */ - -#include -#include -#include - -/* - * ---------------- z = 0 in body coordinates - * ^ - * | r{m,n}.z (constant) - * v - * o gear attachment point - * ^ - * | c{m,n}.z strut extension (0 - c{m,n}Max) - * v - * ^ - * | G{m,n} strut + tire length (constant) - * v - * ---------------- ground - * - */ - - -struct balance_data { - double weight; /* weight for this test */ - VPoint rm; /* rest main gear ground contact point (input), - rest main gear attachment point (output) */ - VPoint rn; /* rest nose gear ground contact point (input), - rest nose gear attachment point (output) */ - double cm, cn; /* rest extension values of each strut */ - double cmMax, cnMax; /* maximum extension values of each strut */ - double Gm, Gn; /* strut + tire lengths */ - double Km, Kn; /* string constants (output) */ - double Gpz; /* the old "grounding point" Z value */ - }; - -void -balance (s) -struct balance_data *s; -{ - - double theta, cosTheta, sinTheta; - double Fmz, Fnz; - -/* - * Determine the rest pitch angle of the aircraft body - */ - - theta = - atan2 (s->rn.z - s->rm.z, s->rn.x - s->rm.x); - cosTheta = cos(theta); - sinTheta = sin(theta); - - printf ("Theta = %f degrees (positive down)\n", theta * 180.0 / M_PI); - -/* - * Determine correct rm/rn values - */ - s->rn.z = s->rn.z - s->Gn - s->cn; - s->rm.z = s->rm.z - s->Gm - s->cm; - -/* - * Determine spring constants - */ - - Fmz = (s->weight * s->rn.x) / (s->rn.x - s->rm.x); - Fnz = s->weight - Fmz; - - s->Km = Fmz / (s->cmMax - s->cm); - s->Kn = Fnz / (s->cnMax - s->cn); - -/* - * Determine the initial grounding point - */ - - s->Gpz = s->rm.x * sinTheta + (s->rm.z + s->Gm + s->cm) * cosTheta; - -} - -#ifdef notdef -main() -{ - - struct balance_data s; - -/* - * Wheel contact locations for the aircraft fully loaded at rest. - */ - - VSetPoint (s.rn, 14.0, 0, 6.5); - VSetPoint (s.rm, -1.0, 0, 6.5); - -/* - * Gross weight - */ - - s.weight = 24326.0; - -/* - * Maximum oleo extension lengths - */ - - s.cnMax = 1.5; - s.cmMax = 1.5; - -/* - * The length of the wheel and lower landing gear strut - */ - s.Gm = 1.5; - s.Gn = 1.5; - -/* - * Rest oleo extension; must be less than cnMax or cmMax; usually about - * half the max value. - */ - - s.cm = 1.0; - s.cn = 1.0; - - printf ("Input:\n"); - printf ("nose contact = %lf %lf %lf\n", s.rn.x, s.rn.y, s.rn.z); - printf ("main's contact = %lf %lf %lf\n", s.rm.x, s.rm.y, s.rm.z); - printf ("Weight = %lf\n", s.weight); - - balance(&s); - - printf ("\nOutput:\n"); - printf ("rm = %lf, %lf, %lf\n", s.rm.x, s.rm.y, s.rm.z); - printf ("rn = %lf, %lf, %lf\n", s.rn.x, s.rn.y, s.rn.z); - printf ("Km = %lf\n", s.Km); - printf ("Kn = %lf\n", s.Kn); - printf ("Grounding point (z) = %lf\n", s.Gpz); - printf ("\n\"inventory\" form:\n\n"); - printf ("\tRm\t\t{%lg, %lg, %lg}\n", s.rm.x, s.rm.y, s.rm.z); - printf ("\tRn\t\t{%lg, %lg, %lg}\n", s.rn.x, s.rn.y, s.rn.z); - printf ("\tKm\t\t%lg\n", s.Km); - printf ("\tKn\t\t%lg\n", s.Kn); - printf ("\tGm\t\t%lg\n", s.Gm); - printf ("\tGn\t\t%lg\n", s.Gn); - printf ("\tCmMax\t\t%lg\n", s.cmMax); - printf ("\tCnMax\t\t%lg\n", s.cnMax); - printf ("\tGroundingPoint\t{0.0, 0.0, %lg}\n", s.Gpz); - - exit (0); -} -#endif - diff -Nru acm-5.0/gedit/cell.c acm-6.0+20200416/gedit/cell.c --- acm-5.0/gedit/cell.c 1994-01-20 14:12:32.000000000 +0000 +++ acm-6.0+20200416/gedit/cell.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,162 +0,0 @@ -/* - * Copyright (c) 1994, Riley Rainey, riley@netcon.com - * - * Permission to use, copy, modify and distribute (without charge) this - * software, documentation, images, etc. is granted, provided that this - * comment and the author's name is retained. - * - * This software is provided by the author as is, and without any expressed - * or implied warranties, including, but not limited to, the implied - * warranties of merchantability and fitness for a particular purpose. In no - * event shall the author be liable for any direct, indirect, incidental, or - * consequential damages arising in any way out of the use of this software. - */ - -#include "XrMisc.h" -#include -#include -#include -#include -#include -#include "cell.h" - -extern Widget CreateExtendedFormDialog(); -extern void MenuCB(); - -Widget -CreatePanelDialog (name, parent, p, count, calc_fn, cancel) -char *name; -Widget parent; -struct cell *p; -int count; -int calc_fn, cancel; -{ - Arg args[10]; - char s1[32], s2[32]; - static ActionAreaButton action_items[] = { - { "Calculate", MenuCB, (XtPointer) NULL }, - { "Dismiss", MenuCB, (XtPointer) NULL }, - { "Help", NULL, NULL }, - }; - Widget dialog, form, label; - int i, n; - XmString s; - - count --; - - action_items[0].client_data = (XtPointer) calc_fn; - action_items[1].client_data = (XtPointer) cancel; - - dialog = CreateExtendedFormDialog (name, parent, &form, action_items, - XtNumber (action_items), 0); - - for (i=0; iid >= 0; n++, p++) { - if (id == p->id) { - return n; - } - } - - fprintf (stderr, "Unable to locate cell %d\n \ -Cell zero will contain invalid data\n", id); - return 0; -} - -double -GetCellValueDouble (p, n, value) -struct cell *p; -int n; -double *value; -{ - char *s; - - s = XmTextFieldGetString (p[LocateCell(p, n)].field); - *value = atof(s); - XtFree (s); - return *value; -} - -void -SetCellValueDouble (p, n, value) -struct cell *p; -int n; -double value; -{ - char s[64]; - - sprintf (s, "%.8lg", value); - XmTextFieldSetString (p[LocateCell(p, n)].field, s); -} - -char * -GetCellValueString (p, n, value) -struct cell *p; -int n; -char *value; -{ - char *s; - - s = XmTextFieldGetString (p[LocateCell(p, n)].field); - strcpy (value, s); - XtFree (s); - return value; -} - -void -SetCellValueString (p, n, value) -struct cell *p; -int n; -char *value; -{ - XmTextFieldSetString (p[LocateCell(p, n)].field, value); -} diff -Nru acm-5.0/gedit/cell.h acm-6.0+20200416/gedit/cell.h --- acm-5.0/gedit/cell.h 1994-01-05 20:05:14.000000000 +0000 +++ acm-6.0+20200416/gedit/cell.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,8 +0,0 @@ -struct cell { - int id; - char *prompt; - char *initial_value; - int field_width; - Widget field; - Widget label; - }; diff -Nru acm-5.0/gedit/circle_32.xbm acm-6.0+20200416/gedit/circle_32.xbm --- acm-5.0/gedit/circle_32.xbm 1993-12-28 14:23:56.000000000 +0000 +++ acm-6.0+20200416/gedit/circle_32.xbm 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ -#define circle_32_width 32 -#define circle_32_height 32 -static char circle_32_bits[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x98, 0x19, 0x00, - 0x00, 0x02, 0x40, 0x00, 0x80, 0x00, 0x00, 0x01, 0x30, 0x00, 0x00, 0x0e, - 0x30, 0x00, 0x00, 0x0c, 0x10, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x40, - 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, - 0x02, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x70, 0x00, 0x00, 0x0c, - 0x70, 0x00, 0x00, 0x0e, 0x80, 0x00, 0x00, 0x01, 0x00, 0x02, 0x40, 0x00, - 0x00, 0x98, 0x19, 0x00, 0x00, 0x80, 0x01, 0x00}; diff -Nru acm-5.0/gedit/circle_64.xbm acm-6.0+20200416/gedit/circle_64.xbm --- acm-5.0/gedit/circle_64.xbm 1992-04-10 18:28:05.000000000 +0000 +++ acm-6.0+20200416/gedit/circle_64.xbm 1970-01-01 00:00:00.000000000 +0000 @@ -1,46 +0,0 @@ -#define polygon_width 64 -#define polygon_height 64 -static char polygon_bits[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xfc, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xe3, - 0xe3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x30, 0xe0, 0x03, 0x06, 0x00, 0x00, - 0x00, 0x00, 0x0c, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, - 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xfa, 0x00, 0x80, 0x0f, 0x00, 0x00, - 0x00, 0x00, 0xfc, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, - 0x80, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x80, 0x0f, 0x00, 0x00, - 0x00, 0x00, 0xf8, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, - 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, - 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, - 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x1f, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x7c, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, - 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x1f, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x7c, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, - 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x1f, 0x00, 0x00, - 0x00, 0x00, 0xf8, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, - 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x3f, 0x00, 0x00, - 0x00, 0x00, 0xfa, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, - 0x00, 0x00, 0x03, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, - 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x30, 0xe0, 0x03, 0x06, 0x00, 0x00, - 0x00, 0x00, 0xc0, 0xe3, 0xe3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, - 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0x00}; diff -Nru acm-5.0/gedit/circle.c acm-6.0+20200416/gedit/circle.c --- acm-5.0/gedit/circle.c 1994-01-05 20:05:08.000000000 +0000 +++ acm-6.0+20200416/gedit/circle.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,105 +0,0 @@ -#include "gedit.h" -#include - -#define NUM_POINTS 12 - -extern polygon_t *BeginPolygon(); -extern void PointToXYZ(); - -static point_t drag; - -void -ScaleCircle(p, poly, scale) -view_info_t *p; -polygon_t *poly; -double scale; -{ - double a = 0.0, a_incr = M_PI * 2.0 / NUM_POINTS; - double other = 0.0, ocos, osin; - int i; - - for (i=0; ipoint[i] = drag; - switch (p->layout) { - case VL_NYX: - case VL_NXNY: - poly->point[i].point.x += osin * scale; - poly->point[i].point.y += ocos * scale; - poly->point[i].point.z += other; - break; - case VL_NYZ: - poly->point[i].point.x += other; - poly->point[i].point.y += ocos * scale; - poly->point[i].point.z += osin * scale; - break; - case VL_NXZ: - poly->point[i].point.x += osin * scale; - poly->point[i].point.y += other; - poly->point[i].point.z += ocos * scale; - break; - default: - poly->point[i].point.x += osin * scale; - poly->point[i].point.y += ocos * scale; - poly->point[i].point.z += other; - break; - } - a += a_incr; - PointToXYZ (p, &poly->point[i]); - } - - if (scale > 0.0) { - ComputePlaneEquation (poly); - } -} - -void -BeginCirclePoint (w, p, x, y) -Widget w; -view_info_t *p; -int x, y; -{ - polygon_t *poly; - - poly = BeginPolygon(); - poly->num_points = NUM_POINTS; - drag_origin.x = x; - drag_origin.y = y; - PointXY (w, p, x, y, &drag); - ScaleCircle (p, poly, 0.0); -} - -void -DragCirclePoint(w, p, x, y) -Widget w; -view_info_t *p; -int x, y; -{ - double dx = x - drag_origin.x, dy = y - drag_origin.y; - double scale = sqrt (dx * dx + dy * dy) * pixel_scale; - Display *dpy = XtDisplay(w); - - XSetFunction (dpy, p->gc, GXxor); - XSetFunction (dpy, p->other_view->gc, GXxor); - - DrawPolygon (w, cur_polygon, True); - DrawPolygon (p->other_widget, cur_polygon, True); - - ScaleCircle (p, cur_polygon, scale); - DrawPolygon (w, cur_polygon, True); - DrawPolygon (p->other_widget, cur_polygon, True); - - XSetFunction (dpy, p->gc, GXcopy); - XSetFunction (dpy, p->other_view->gc, GXcopy); -} - -void -CompleteCirclePoint(w, p, x, y) -Widget w; -view_info_t *p; -int x, y; -{ - CompletePolygon (w, cur_polygon); -} diff -Nru acm-5.0/gedit/configure acm-6.0+20200416/gedit/configure --- acm-5.0/gedit/configure 1998-08-10 02:45:31.000000000 +0000 +++ acm-6.0+20200416/gedit/configure 1970-01-01 00:00:00.000000000 +0000 @@ -1,1629 +0,0 @@ -#! /bin/sh - -# Guess values for system-dependent variables and create Makefiles. -# Generated automatically using autoconf version 2.12 -# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. -# -# This configure script is free software; the Free Software Foundation -# gives unlimited permission to copy, distribute and modify it. - -# Defaults: -ac_help= -ac_default_prefix=/usr/local -# Any additions from configure.in: -ac_help="$ac_help - --with-x use the X Window System" - -# Initialize some variables set by options. -# The variables have the same names as the options, with -# dashes changed to underlines. -build=NONE -cache_file=./config.cache -exec_prefix=NONE -host=NONE -no_create= -nonopt=NONE -no_recursion= -prefix=NONE -program_prefix=NONE -program_suffix=NONE -program_transform_name=s,x,x, -silent= -site= -srcdir= -target=NONE -verbose= -x_includes=NONE -x_libraries=NONE -bindir='${exec_prefix}/bin' -sbindir='${exec_prefix}/sbin' -libexecdir='${exec_prefix}/libexec' -datadir='${prefix}/share' -sysconfdir='${prefix}/etc' -sharedstatedir='${prefix}/com' -localstatedir='${prefix}/var' -libdir='${exec_prefix}/lib' -includedir='${prefix}/include' -oldincludedir='/usr/include' -infodir='${prefix}/info' -mandir='${prefix}/man' - -# Initialize some other variables. -subdirs= -MFLAGS= MAKEFLAGS= -# Maximum number of lines to put in a shell here document. -ac_max_here_lines=12 - -ac_prev= -for ac_option -do - - # If the previous option needs an argument, assign it. - if test -n "$ac_prev"; then - eval "$ac_prev=\$ac_option" - ac_prev= - continue - fi - - case "$ac_option" in - -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; - *) ac_optarg= ;; - esac - - # Accept the important Cygnus configure options, so we can diagnose typos. - - case "$ac_option" in - - -bindir | --bindir | --bindi | --bind | --bin | --bi) - ac_prev=bindir ;; - -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) - bindir="$ac_optarg" ;; - - -build | --build | --buil | --bui | --bu) - ac_prev=build ;; - -build=* | --build=* | --buil=* | --bui=* | --bu=*) - build="$ac_optarg" ;; - - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - cache_file="$ac_optarg" ;; - - -datadir | --datadir | --datadi | --datad | --data | --dat | --da) - ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ - | --da=*) - datadir="$ac_optarg" ;; - - -disable-* | --disable-*) - ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then - { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } - fi - ac_feature=`echo $ac_feature| sed 's/-/_/g'` - eval "enable_${ac_feature}=no" ;; - - -enable-* | --enable-*) - ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then - { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } - fi - ac_feature=`echo $ac_feature| sed 's/-/_/g'` - case "$ac_option" in - *=*) ;; - *) ac_optarg=yes ;; - esac - eval "enable_${ac_feature}='$ac_optarg'" ;; - - -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ - | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ - | --exec | --exe | --ex) - ac_prev=exec_prefix ;; - -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ - | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ - | --exec=* | --exe=* | --ex=*) - exec_prefix="$ac_optarg" ;; - - -gas | --gas | --ga | --g) - # Obsolete; use --with-gas. - with_gas=yes ;; - - -help | --help | --hel | --he) - # Omit some internal or obsolete options to make the list less imposing. - # This message is too long to be a string in the A/UX 3.1 sh. - cat << EOF -Usage: configure [options] [host] -Options: [defaults in brackets after descriptions] -Configuration: - --cache-file=FILE cache test results in FILE - --help print this message - --no-create do not create output files - --quiet, --silent do not print \`checking...' messages - --version print the version of autoconf that created configure -Directory and file names: - --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] - --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - [same as prefix] - --bindir=DIR user executables in DIR [EPREFIX/bin] - --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] - --libexecdir=DIR program executables in DIR [EPREFIX/libexec] - --datadir=DIR read-only architecture-independent data in DIR - [PREFIX/share] - --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] - --sharedstatedir=DIR modifiable architecture-independent data in DIR - [PREFIX/com] - --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] - --libdir=DIR object code libraries in DIR [EPREFIX/lib] - --includedir=DIR C header files in DIR [PREFIX/include] - --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] - --infodir=DIR info documentation in DIR [PREFIX/info] - --mandir=DIR man documentation in DIR [PREFIX/man] - --srcdir=DIR find the sources in DIR [configure dir or ..] - --program-prefix=PREFIX prepend PREFIX to installed program names - --program-suffix=SUFFIX append SUFFIX to installed program names - --program-transform-name=PROGRAM - run sed PROGRAM on installed program names -EOF - cat << EOF -Host type: - --build=BUILD configure for building on BUILD [BUILD=HOST] - --host=HOST configure for HOST [guessed] - --target=TARGET configure for TARGET [TARGET=HOST] -Features and packages: - --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) - --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] - --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --x-includes=DIR X include files are in DIR - --x-libraries=DIR X library files are in DIR -EOF - if test -n "$ac_help"; then - echo "--enable and --with options recognized:$ac_help" - fi - exit 0 ;; - - -host | --host | --hos | --ho) - ac_prev=host ;; - -host=* | --host=* | --hos=* | --ho=*) - host="$ac_optarg" ;; - - -includedir | --includedir | --includedi | --included | --include \ - | --includ | --inclu | --incl | --inc) - ac_prev=includedir ;; - -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ - | --includ=* | --inclu=* | --incl=* | --inc=*) - includedir="$ac_optarg" ;; - - -infodir | --infodir | --infodi | --infod | --info | --inf) - ac_prev=infodir ;; - -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) - infodir="$ac_optarg" ;; - - -libdir | --libdir | --libdi | --libd) - ac_prev=libdir ;; - -libdir=* | --libdir=* | --libdi=* | --libd=*) - libdir="$ac_optarg" ;; - - -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ - | --libexe | --libex | --libe) - ac_prev=libexecdir ;; - -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ - | --libexe=* | --libex=* | --libe=*) - libexecdir="$ac_optarg" ;; - - -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst \ - | --locals | --local | --loca | --loc | --lo) - ac_prev=localstatedir ;; - -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* \ - | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) - localstatedir="$ac_optarg" ;; - - -mandir | --mandir | --mandi | --mand | --man | --ma | --m) - ac_prev=mandir ;; - -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) - mandir="$ac_optarg" ;; - - -nfp | --nfp | --nf) - # Obsolete; use --without-fp. - with_fp=no ;; - - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c) - no_create=yes ;; - - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) - no_recursion=yes ;; - - -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ - | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ - | --oldin | --oldi | --old | --ol | --o) - ac_prev=oldincludedir ;; - -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ - | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ - | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) - oldincludedir="$ac_optarg" ;; - - -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) - ac_prev=prefix ;; - -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix="$ac_optarg" ;; - - -program-prefix | --program-prefix | --program-prefi | --program-pref \ - | --program-pre | --program-pr | --program-p) - ac_prev=program_prefix ;; - -program-prefix=* | --program-prefix=* | --program-prefi=* \ - | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) - program_prefix="$ac_optarg" ;; - - -program-suffix | --program-suffix | --program-suffi | --program-suff \ - | --program-suf | --program-su | --program-s) - ac_prev=program_suffix ;; - -program-suffix=* | --program-suffix=* | --program-suffi=* \ - | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) - program_suffix="$ac_optarg" ;; - - -program-transform-name | --program-transform-name \ - | --program-transform-nam | --program-transform-na \ - | --program-transform-n | --program-transform- \ - | --program-transform | --program-transfor \ - | --program-transfo | --program-transf \ - | --program-trans | --program-tran \ - | --progr-tra | --program-tr | --program-t) - ac_prev=program_transform_name ;; - -program-transform-name=* | --program-transform-name=* \ - | --program-transform-nam=* | --program-transform-na=* \ - | --program-transform-n=* | --program-transform-=* \ - | --program-transform=* | --program-transfor=* \ - | --program-transfo=* | --program-transf=* \ - | --program-trans=* | --program-tran=* \ - | --progr-tra=* | --program-tr=* | --program-t=*) - program_transform_name="$ac_optarg" ;; - - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - silent=yes ;; - - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) - ac_prev=sbindir ;; - -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ - | --sbi=* | --sb=*) - sbindir="$ac_optarg" ;; - - -sharedstatedir | --sharedstatedir | --sharedstatedi \ - | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ - | --sharedst | --shareds | --shared | --share | --shar \ - | --sha | --sh) - ac_prev=sharedstatedir ;; - -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ - | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ - | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ - | --sha=* | --sh=*) - sharedstatedir="$ac_optarg" ;; - - -site | --site | --sit) - ac_prev=site ;; - -site=* | --site=* | --sit=*) - site="$ac_optarg" ;; - - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - srcdir="$ac_optarg" ;; - - -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ - | --syscon | --sysco | --sysc | --sys | --sy) - ac_prev=sysconfdir ;; - -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ - | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) - sysconfdir="$ac_optarg" ;; - - -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target ;; - -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target="$ac_optarg" ;; - - -v | -verbose | --verbose | --verbos | --verbo | --verb) - verbose=yes ;; - - -version | --version | --versio | --versi | --vers) - echo "configure generated by autoconf version 2.12" - exit 0 ;; - - -with-* | --with-*) - ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then - { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } - fi - ac_package=`echo $ac_package| sed 's/-/_/g'` - case "$ac_option" in - *=*) ;; - *) ac_optarg=yes ;; - esac - eval "with_${ac_package}='$ac_optarg'" ;; - - -without-* | --without-*) - ac_package=`echo $ac_option|sed -e 's/-*without-//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then - { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } - fi - ac_package=`echo $ac_package| sed 's/-/_/g'` - eval "with_${ac_package}=no" ;; - - --x) - # Obsolete; use --with-x. - with_x=yes ;; - - -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ - | --x-incl | --x-inc | --x-in | --x-i) - ac_prev=x_includes ;; - -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ - | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) - x_includes="$ac_optarg" ;; - - -x-libraries | --x-libraries | --x-librarie | --x-librari \ - | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) - ac_prev=x_libraries ;; - -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ - | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries="$ac_optarg" ;; - - -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } - ;; - - *) - if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then - echo "configure: warning: $ac_option: invalid host type" 1>&2 - fi - if test "x$nonopt" != xNONE; then - { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } - fi - nonopt="$ac_option" - ;; - - esac -done - -if test -n "$ac_prev"; then - { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } -fi - -trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 - -# File descriptor usage: -# 0 standard input -# 1 file creation -# 2 errors and warnings -# 3 some systems may open it to /dev/tty -# 4 used on the Kubota Titan -# 6 checking for... messages and results -# 5 compiler messages saved in config.log -if test "$silent" = yes; then - exec 6>/dev/null -else - exec 6>&1 -fi -exec 5>./config.log - -echo "\ -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. -" 1>&5 - -# Strip out --no-create and --no-recursion so they do not pile up. -# Also quote any args containing shell metacharacters. -ac_configure_args= -for ac_arg -do - case "$ac_arg" in - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c) ;; - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; - *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) - ac_configure_args="$ac_configure_args '$ac_arg'" ;; - *) ac_configure_args="$ac_configure_args $ac_arg" ;; - esac -done - -# NLS nuisances. -# Only set these to C if already set. These must not be set unconditionally -# because not all systems understand e.g. LANG=C (notably SCO). -# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! -# Non-C LC_CTYPE values break the ctype check. -if test "${LANG+set}" = set; then LANG=C; export LANG; fi -if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi -if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi -if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi - -# confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -rf conftest* confdefs.h -# AIX cpp loses on an empty file, so make sure it contains at least a newline. -echo > confdefs.h - -# A filename unique to this package, relative to the directory that -# configure is in, which we can look for to find out if srcdir is correct. -ac_unique_file=gedit.c - -# Find the source files, if location was not specified. -if test -z "$srcdir"; then - ac_srcdir_defaulted=yes - # Try the directory containing this script, then its parent. - ac_prog=$0 - ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` - test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. - srcdir=$ac_confdir - if test ! -r $srcdir/$ac_unique_file; then - srcdir=.. - fi -else - ac_srcdir_defaulted=no -fi -if test ! -r $srcdir/$ac_unique_file; then - if test "$ac_srcdir_defaulted" = yes; then - { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } - else - { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } - fi -fi -srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` - -# Prefer explicitly selected file to automatically selected ones. -if test -z "$CONFIG_SITE"; then - if test "x$prefix" != xNONE; then - CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" - else - CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" - fi -fi -for ac_site_file in $CONFIG_SITE; do - if test -r "$ac_site_file"; then - echo "loading site script $ac_site_file" - . "$ac_site_file" - fi -done - -if test -r "$cache_file"; then - echo "loading cache $cache_file" - . $cache_file -else - echo "creating cache $cache_file" - > $cache_file -fi - -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - -if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then - # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. - if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then - ac_n= ac_c=' -' ac_t=' ' - else - ac_n=-n ac_c= ac_t= - fi -else - ac_n= ac_c='\c' ac_t= -fi - - - -# Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:528: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_CC="gcc" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:557: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - ac_prog_rejected=no - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - break - fi - done - IFS="$ac_save_ifs" -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $# -gt 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - set dummy "$ac_dir/$ac_word" "$@" - shift - ac_cv_prog_CC="$@" - fi -fi -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } -fi - -echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:605: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 - -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then - ac_cv_prog_cc_works=yes - # If we can't run a trivial program, we are probably using a cross compiler. - if (./conftest; exit) 2>/dev/null; then - ac_cv_prog_cc_cross=no - else - ac_cv_prog_cc_cross=yes - fi -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - ac_cv_prog_cc_works=no -fi -rm -fr conftest* - -echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 -if test $ac_cv_prog_cc_works = no; then - { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } -fi -echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 -echo "configure:639: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 -echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 -cross_compiling=$ac_cv_prog_cc_cross - -echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 -echo "configure:644: checking whether we are using GNU C" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then - ac_cv_prog_gcc=yes -else - ac_cv_prog_gcc=no -fi -fi - -echo "$ac_t""$ac_cv_prog_gcc" 1>&6 - -if test $ac_cv_prog_gcc = yes; then - GCC=yes - ac_test_CFLAGS="${CFLAGS+set}" - ac_save_CFLAGS="$CFLAGS" - CFLAGS= - echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 -echo "configure:668: checking whether ${CC-cc} accepts -g" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - echo 'void f(){}' > conftest.c -if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then - ac_cv_prog_cc_g=yes -else - ac_cv_prog_cc_g=no -fi -rm -f conftest* - -fi - -echo "$ac_t""$ac_cv_prog_cc_g" 1>&6 - if test "$ac_test_CFLAGS" = set; then - CFLAGS="$ac_save_CFLAGS" - elif test $ac_cv_prog_cc_g = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-O2" - fi -else - GCC= - test "${CFLAGS+set}" = set || CFLAGS="-g" -fi - -ac_aux_dir= -for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do - if test -f $ac_dir/install-sh; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f $ac_dir/install.sh; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - fi -done -if test -z "$ac_aux_dir"; then - { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; } -fi -ac_config_guess=$ac_aux_dir/config.guess -ac_config_sub=$ac_aux_dir/config.sub -ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. - -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# ./install, which can be erroneously created by make from ./install.sh. -echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 -echo "configure:725: checking for a BSD compatible install" >&5 -if test -z "$INSTALL"; then -if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - # Account for people who put trailing slashes in PATH elements. - case "$ac_dir/" in - /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - for ac_prog in ginstall installbsd scoinst install; do - if test -f $ac_dir/$ac_prog; then - if test $ac_prog = install && - grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - # OSF/1 installbsd also uses dspmsg, but is usable. - : - else - ac_cv_path_install="$ac_dir/$ac_prog -c" - break 2 - fi - fi - done - ;; - esac - done - IFS="$ac_save_IFS" - -fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL="$ac_cv_path_install" - else - # As a last resort, use the slow shell script. We don't cache a - # path for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the path is relative. - INSTALL="$ac_install_sh" - fi -fi -echo "$ac_t""$INSTALL" 1>&6 - -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' - -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' - -echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 -echo "configure:775: checking how to run the C preprocessor" >&5 -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then -if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - # This must be in double quotes, not single quotes, because CPP may get - # substituted into the Makefile and "${CC-cc}" will confuse make. - CPP="${CC-cc} -E" - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. - cat > conftest.$ac_ext < -Syntax Error -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:796: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out` -if test -z "$ac_err"; then - : -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - CPP="${CC-cc} -E -traditional-cpp" - cat > conftest.$ac_ext < -Syntax Error -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:813: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out` -if test -z "$ac_err"; then - : -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - CPP=/lib/cpp -fi -rm -f conftest* -fi -rm -f conftest* - ac_cv_prog_CPP="$CPP" -fi - CPP="$ac_cv_prog_CPP" -else - ac_cv_prog_CPP="$CPP" -fi -echo "$ac_t""$CPP" 1>&6 - -# If we find X, set shell vars x_includes and x_libraries to the -# paths, otherwise set no_x=yes. -# Uses ac_ vars as temps to allow command line to override cache and checks. -# --without-x overrides everything else, but does not touch the cache. -echo $ac_n "checking for X""... $ac_c" 1>&6 -echo "configure:840: checking for X" >&5 - -# Check whether --with-x or --without-x was given. -if test "${with_x+set}" = set; then - withval="$with_x" - : -fi - -# $have_x is `yes', `no', `disabled', or empty when we do not yet know. -if test "x$with_x" = xno; then - # The user explicitly disabled X. - have_x=disabled -else - if test "x$x_includes" != xNONE && test "x$x_libraries" != xNONE; then - # Both variables are already set. - have_x=yes - else -if eval "test \"`echo '$''{'ac_cv_have_x'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - # One or both of the vars are not set, and there is no cached value. -ac_x_includes=NO ac_x_libraries=NO -rm -fr conftestdir -if mkdir conftestdir; then - cd conftestdir - # Make sure to not put "make" in the Imakefile rules, since we grep it out. - cat > Imakefile <<'EOF' -acfindx: - @echo 'ac_im_incroot="${INCROOT}"; ac_im_usrlibdir="${USRLIBDIR}"; ac_im_libdir="${LIBDIR}"' -EOF - if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then - # GNU make sometimes prints "make[1]: Entering...", which would confuse us. - eval `${MAKE-make} acfindx 2>/dev/null | grep -v make` - # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. - for ac_extension in a so sl; do - if test ! -f $ac_im_usrlibdir/libX11.$ac_extension && - test -f $ac_im_libdir/libX11.$ac_extension; then - ac_im_usrlibdir=$ac_im_libdir; break - fi - done - # Screen out bogus values from the imake configuration. They are - # bogus both because they are the default anyway, and because - # using them would break gcc on systems where it needs fixed includes. - case "$ac_im_incroot" in - /usr/include) ;; - *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes="$ac_im_incroot" ;; - esac - case "$ac_im_usrlibdir" in - /usr/lib | /lib) ;; - *) test -d "$ac_im_usrlibdir" && ac_x_libraries="$ac_im_usrlibdir" ;; - esac - fi - cd .. - rm -fr conftestdir -fi - -if test "$ac_x_includes" = NO; then - # Guess where to find include files, by looking for this one X11 .h file. - test -z "$x_direct_test_include" && x_direct_test_include=X11/Intrinsic.h - - # First, try using that file with no special directory specified. -cat > conftest.$ac_ext < -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:907: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out` -if test -z "$ac_err"; then - rm -rf conftest* - # We can compile using X headers with no special include directory. -ac_x_includes= -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - # Look for the header file in a standard set of common directories. -# Check X11 before X11Rn because it is often a symlink to the current release. - for ac_dir in \ - /usr/X11/include \ - /usr/X11R6/include \ - /usr/X11R5/include \ - /usr/X11R4/include \ - \ - /usr/include/X11 \ - /usr/include/X11R6 \ - /usr/include/X11R5 \ - /usr/include/X11R4 \ - \ - /usr/local/X11/include \ - /usr/local/X11R6/include \ - /usr/local/X11R5/include \ - /usr/local/X11R4/include \ - \ - /usr/local/include/X11 \ - /usr/local/include/X11R6 \ - /usr/local/include/X11R5 \ - /usr/local/include/X11R4 \ - \ - /usr/X386/include \ - /usr/x386/include \ - /usr/XFree86/include/X11 \ - \ - /usr/include \ - /usr/local/include \ - /usr/unsupported/include \ - /usr/athena/include \ - /usr/local/x11r5/include \ - /usr/lpp/Xamples/include \ - \ - /usr/openwin/include \ - /usr/openwin/share/include \ - ; \ - do - if test -r "$ac_dir/$x_direct_test_include"; then - ac_x_includes=$ac_dir - break - fi - done -fi -rm -f conftest* -fi # $ac_x_includes = NO - -if test "$ac_x_libraries" = NO; then - # Check for the libraries. - - test -z "$x_direct_test_library" && x_direct_test_library=Xt - test -z "$x_direct_test_function" && x_direct_test_function=XtMalloc - - # See if we find them without any special options. - # Don't add to $LIBS permanently. - ac_save_LIBS="$LIBS" - LIBS="-l$x_direct_test_library $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then - rm -rf conftest* - LIBS="$ac_save_LIBS" -# We can link X programs with no special library path. -ac_x_libraries= -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - LIBS="$ac_save_LIBS" -# First see if replacing the include by lib works. -# Check X11 before X11Rn because it is often a symlink to the current release. -for ac_dir in `echo "$ac_x_includes" | sed s/include/lib/` \ - /usr/X11/lib \ - /usr/X11R6/lib \ - /usr/X11R5/lib \ - /usr/X11R4/lib \ - \ - /usr/lib/X11 \ - /usr/lib/X11R6 \ - /usr/lib/X11R5 \ - /usr/lib/X11R4 \ - \ - /usr/local/X11/lib \ - /usr/local/X11R6/lib \ - /usr/local/X11R5/lib \ - /usr/local/X11R4/lib \ - \ - /usr/local/lib/X11 \ - /usr/local/lib/X11R6 \ - /usr/local/lib/X11R5 \ - /usr/local/lib/X11R4 \ - \ - /usr/X386/lib \ - /usr/x386/lib \ - /usr/XFree86/lib/X11 \ - \ - /usr/lib \ - /usr/local/lib \ - /usr/unsupported/lib \ - /usr/athena/lib \ - /usr/local/x11r5/lib \ - /usr/lpp/Xamples/lib \ - /lib/usr/lib/X11 \ - \ - /usr/openwin/lib \ - /usr/openwin/share/lib \ - ; \ -do - for ac_extension in a so sl; do - if test -r $ac_dir/lib${x_direct_test_library}.$ac_extension; then - ac_x_libraries=$ac_dir - break 2 - fi - done -done -fi -rm -f conftest* -fi # $ac_x_libraries = NO - -if test "$ac_x_includes" = NO || test "$ac_x_libraries" = NO; then - # Didn't find X anywhere. Cache the known absence of X. - ac_cv_have_x="have_x=no" -else - # Record where we found X for the cache. - ac_cv_have_x="have_x=yes \ - ac_x_includes=$ac_x_includes ac_x_libraries=$ac_x_libraries" -fi -fi - fi - eval "$ac_cv_have_x" -fi # $with_x != no - -if test "$have_x" != yes; then - echo "$ac_t""$have_x" 1>&6 - no_x=yes -else - # If each of the values was on the command line, it overrides each guess. - test "x$x_includes" = xNONE && x_includes=$ac_x_includes - test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries - # Update the cache value to reflect the command line values. - ac_cv_have_x="have_x=yes \ - ac_x_includes=$x_includes ac_x_libraries=$x_libraries" - echo "$ac_t""libraries $x_libraries, headers $x_includes" 1>&6 -fi - - -test "$x_includes" != "NONE" -a "$x_includes" != "" && CFLAGS="$CFLAGS -I${x_includes}" -test "$x_libraries" != "NONE" -a "$x_libraries" != "" && LIBS="$LIBS -L${x_libraries}" - -LIBS="$LIBS -lXt -lXext -lX11" - -echo $ac_n "checking for XpSetAttributes in -lXp""... $ac_c" 1>&6 -echo "configure:1076: checking for XpSetAttributes in -lXp" >&5 -ac_lib_var=`echo Xp'_'XpSetAttributes | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-lXp $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_lib=HAVE_LIB`echo Xp | sed -e 's/[^a-zA-Z0-9_]/_/g' \ - -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` - cat >> confdefs.h <&6 -fi - -echo $ac_n "checking for XmCreateBulletinBoard in -lXm""... $ac_c" 1>&6 -echo "configure:1123: checking for XmCreateBulletinBoard in -lXm" >&5 -ac_lib_var=`echo Xm'_'XmCreateBulletinBoard | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-lXm $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_lib=HAVE_LIB`echo Xm | sed -e 's/[^a-zA-Z0-9_]/_/g' \ - -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` - cat >> confdefs.h <&6 -fi - - -echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 -echo "configure:1171: checking for ANSI C header files" >&5 -if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -#include -#include -#include -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1184: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out` -if test -z "$ac_err"; then - rm -rf conftest* - ac_cv_header_stdc=yes -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_cv_header_stdc=no -fi -rm -f conftest* - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. -cat > conftest.$ac_ext < -EOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "memchr" >/dev/null 2>&1; then - : -else - rm -rf conftest* - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. -cat > conftest.$ac_ext < -EOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "free" >/dev/null 2>&1; then - : -else - rm -rf conftest* - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. -if test "$cross_compiling" = yes; then - : -else - cat > conftest.$ac_ext < -#define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int main () { int i; for (i = 0; i < 256; i++) -if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); -exit (0); } - -EOF -if { (eval echo configure:1251: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null -then - : -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -fr conftest* - ac_cv_header_stdc=no -fi -rm -fr conftest* -fi - -fi -fi - -echo "$ac_t""$ac_cv_header_stdc" 1>&6 -if test $ac_cv_header_stdc = yes; then - cat >> confdefs.h <<\EOF -#define STDC_HEADERS 1 -EOF - -fi - -for ac_hdr in fcntl.h -do -ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` -echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:1278: checking for $ac_hdr" >&5 -if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1288: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out` -if test -z "$ac_err"; then - rm -rf conftest* - eval "ac_cv_header_$ac_safe=yes" -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_header_$ac_safe=no" -fi -rm -f conftest* -fi -if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` - cat >> confdefs.h <&6 -fi -done - - - -for ac_func in strdup -do -echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:1319: checking for $ac_func" >&5 -if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -$ac_func(); -#endif - -; return 0; } -EOF -if { (eval echo configure:1347: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then - rm -rf conftest* - eval "ac_cv_func_$ac_func=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_$ac_func=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` - cat >> confdefs.h <&6 -fi -done - - -trap '' 1 2 15 -cat > confcache <<\EOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs. It is not useful on other systems. -# If it contains results you don't want to keep, you may remove or edit it. -# -# By default, configure uses ./config.cache as the cache file, -# creating it if it does not exist already. You can give configure -# the --cache-file=FILE option to use a different cache file; that is -# what configure does when it calls configure scripts in -# subdirectories, so they share the cache. -# Giving --cache-file=/dev/null disables caching, for debugging configure. -# config.status only pays attention to the cache file if you give it the -# --recheck option to rerun configure. -# -EOF -# The following way of writing the cache mishandles newlines in values, -# but we know of no workaround that is simple, portable, and efficient. -# So, don't put newlines in cache variables' values. -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -(set) 2>&1 | - case `(ac_space=' '; set) 2>&1` in - *ac_space=\ *) - # `set' does not quote correctly, so add quotes (double-quote substitution - # turns \\\\ into \\, and sed turns \\ into \). - sed -n \ - -e "s/'/'\\\\''/g" \ - -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" - ;; - *) - # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' - ;; - esac >> confcache -if cmp -s $cache_file confcache; then - : -else - if test -w $cache_file; then - echo "updating cache $cache_file" - cat confcache > $cache_file - else - echo "not updating unwritable cache $cache_file" - fi -fi -rm -f confcache - -trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 - -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - -# Any assignment to VPATH causes Sun make to only execute -# the first set of double-colon rules, so remove it if not needed. -# If there is a colon in the path, we need to keep it. -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' -fi - -trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 - -# Transform confdefs.h into DEFS. -# Protect against shell expansion while executing Makefile rules. -# Protect against Makefile macro expansion. -cat > conftest.defs <<\EOF -s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g -s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g -s%\[%\\&%g -s%\]%\\&%g -s%\$%$$%g -EOF -DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '` -rm -f conftest.defs - - -# Without the "./", some shells look in PATH for config.status. -: ${CONFIG_STATUS=./config.status} - -echo creating $CONFIG_STATUS -rm -f $CONFIG_STATUS -cat > $CONFIG_STATUS </dev/null | sed 1q`: -# -# $0 $ac_configure_args -# -# Compiler output produced by configure, useful for debugging -# configure, is in ./config.log if it exists. - -ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" -for ac_option -do - case "\$ac_option" in - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" - exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; - -version | --version | --versio | --versi | --vers | --ver | --ve | --v) - echo "$CONFIG_STATUS generated by autoconf version 2.12" - exit 0 ;; - -help | --help | --hel | --he | --h) - echo "\$ac_cs_usage"; exit 0 ;; - *) echo "\$ac_cs_usage"; exit 1 ;; - esac -done - -ac_given_srcdir=$srcdir -ac_given_INSTALL="$INSTALL" - -trap 'rm -fr `echo "Makefile" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 -EOF -cat >> $CONFIG_STATUS < conftest.subs <<\\CEOF -$ac_vpsub -$extrasub -s%@CFLAGS@%$CFLAGS%g -s%@CPPFLAGS@%$CPPFLAGS%g -s%@CXXFLAGS@%$CXXFLAGS%g -s%@DEFS@%$DEFS%g -s%@LDFLAGS@%$LDFLAGS%g -s%@LIBS@%$LIBS%g -s%@exec_prefix@%$exec_prefix%g -s%@prefix@%$prefix%g -s%@program_transform_name@%$program_transform_name%g -s%@bindir@%$bindir%g -s%@sbindir@%$sbindir%g -s%@libexecdir@%$libexecdir%g -s%@datadir@%$datadir%g -s%@sysconfdir@%$sysconfdir%g -s%@sharedstatedir@%$sharedstatedir%g -s%@localstatedir@%$localstatedir%g -s%@libdir@%$libdir%g -s%@includedir@%$includedir%g -s%@oldincludedir@%$oldincludedir%g -s%@infodir@%$infodir%g -s%@mandir@%$mandir%g -s%@CC@%$CC%g -s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g -s%@INSTALL_DATA@%$INSTALL_DATA%g -s%@CPP@%$CPP%g - -CEOF -EOF - -cat >> $CONFIG_STATUS <<\EOF - -# Split the substitutions into bite-sized pieces for seds with -# small command number limits, like on Digital OSF/1 and HP-UX. -ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. -ac_file=1 # Number of current file. -ac_beg=1 # First line for current file. -ac_end=$ac_max_sed_cmds # Line after last line for current file. -ac_more_lines=: -ac_sed_cmds="" -while $ac_more_lines; do - if test $ac_beg -gt 1; then - sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file - else - sed "${ac_end}q" conftest.subs > conftest.s$ac_file - fi - if test ! -s conftest.s$ac_file; then - ac_more_lines=false - rm -f conftest.s$ac_file - else - if test -z "$ac_sed_cmds"; then - ac_sed_cmds="sed -f conftest.s$ac_file" - else - ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" - fi - ac_file=`expr $ac_file + 1` - ac_beg=$ac_end - ac_end=`expr $ac_end + $ac_max_sed_cmds` - fi -done -if test -z "$ac_sed_cmds"; then - ac_sed_cmds=cat -fi -EOF - -cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF -for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then - # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". - case "$ac_file" in - *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` - ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; - *) ac_file_in="${ac_file}.in" ;; - esac - - # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. - - # Remove last slash and all that follows it. Not all systems have dirname. - ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` - if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then - # The file is in a subdirectory. - test ! -d "$ac_dir" && mkdir "$ac_dir" - ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" - # A "../" for each directory in $ac_dir_suffix. - ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` - else - ac_dir_suffix= ac_dots= - fi - - case "$ac_given_srcdir" in - .) srcdir=. - if test -z "$ac_dots"; then top_srcdir=. - else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; - /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; - *) # Relative path. - srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" - top_srcdir="$ac_dots$ac_given_srcdir" ;; - esac - - case "$ac_given_INSTALL" in - [/$]*) INSTALL="$ac_given_INSTALL" ;; - *) INSTALL="$ac_dots$ac_given_INSTALL" ;; - esac - - echo creating "$ac_file" - rm -f "$ac_file" - configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." - case "$ac_file" in - *Makefile*) ac_comsub="1i\\ -# $configure_input" ;; - *) ac_comsub= ;; - esac - - ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` - sed -e "$ac_comsub -s%@configure_input@%$configure_input%g -s%@srcdir@%$srcdir%g -s%@top_srcdir@%$top_srcdir%g -s%@INSTALL@%$INSTALL%g -" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file -fi; done -rm -f conftest.s* - -EOF -cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF - -exit 0 -EOF -chmod +x $CONFIG_STATUS -rm -fr confdefs* $ac_clean_files -test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 - diff -Nru acm-5.0/gedit/configure.in acm-6.0+20200416/gedit/configure.in --- acm-5.0/gedit/configure.in 1998-08-10 02:38:23.000000000 +0000 +++ acm-6.0+20200416/gedit/configure.in 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ -dnl Process this file with autoconf to produce a configure script. -AC_INIT(gedit.c) - -dnl Checks for programs. -AC_PROG_CC -AC_PROG_INSTALL -AC_PATH_X - -test "$x_includes" != "NONE" -a "$x_includes" != "" && CFLAGS="$CFLAGS -I${x_includes}" -test "$x_libraries" != "NONE" -a "$x_libraries" != "" && LIBS="$LIBS -L${x_libraries}" - -LIBS="$LIBS -lXt -lXext -lX11" - -dnl Checks for libraries. -AC_CHECK_LIB(Xp, XpSetAttributes) -AC_CHECK_LIB(Xm, XmCreateBulletinBoard) - -dnl Checks for header files. -AC_HEADER_STDC -AC_CHECK_HEADERS(fcntl.h) - -dnl Checks for typedefs, structures, and compiler characteristics. - -dnl Checks for library functions. -AC_CHECK_FUNCS(strdup) - -AC_OUTPUT(Makefile) diff -Nru acm-5.0/gedit/COPYRIGHT acm-6.0+20200416/gedit/COPYRIGHT --- acm-5.0/gedit/COPYRIGHT 1994-01-20 14:08:33.000000000 +0000 +++ acm-6.0+20200416/gedit/COPYRIGHT 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ -GEDIT - A 3-D object editor - -Copyright(c) 1994, Riley Rainey, rainey@netcom.com - -Permission to use, copy, modify and distribute (without charge) this -software, documentation, images, etc. is granted, provided that this -comment and the author's name is retained. - -This software is provided by the author as is, and without any expressed -or implied warranties, including, but not limited to, the implied -warranties of merchantability and fitness for a particular purpose. In no -event shall the author be liable for any direct, indirect, incidental, or -consequential damages arising in any way out of the use of this software. diff -Nru acm-5.0/gedit/CrExFormDlg.c acm-6.0+20200416/gedit/CrExFormDlg.c --- acm-5.0/gedit/CrExFormDlg.c 1994-01-05 20:05:05.000000000 +0000 +++ acm-6.0+20200416/gedit/CrExFormDlg.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,168 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#include "XrMisc.h" - -/* ARGSUSED */ -static void -DestroyParentCallback (w, client_data, call_data) -Widget w; -XtPointer client_data, call_data; -{ - XtDestroyWidget (XtParent (w)); -} - -/* ARGSUSED */ -static void -SetDialogPosition(w, client_data, call_data) -Widget w; -XtPointer client_data, call_data; -{ - Position x, y, x1, y1; - Dimension twidth, width, theight, height; - Widget top = XtParent(w); - - XtVaGetValues (top, - XmNx, &x, - XmNy, &y, - XmNwidth, &twidth, - XmNheight, &theight, - NULL); - - XtVaGetValues (w, - XmNy, &x1, - XmNy, &y1, - XmNwidth, &width, - XmNheight, &height, - NULL); - - if (x1 != 0 && y1 != 0) - return; - - XtVaSetValues (w, - XmNx, x + (twidth - width) / 2, - XmNy, y + (theight - height) / 2, - NULL); - -} - -/* - * This procedure builds an dialog box action area based on a list of - * buttons passed to it. This code is based on the example in chapter 7 of - * the O'Reilly & Associates Volume 6 by Dan Heller. - */ - -Widget -CreateButtonArea (name, parent, buttons, num_buttons, tightness, default_button) -char *name; -Widget parent; -ActionAreaButton *buttons; -int num_buttons; -int tightness; -int default_button; -{ - - Widget button_area, widget; - register int i; - Dimension height, h; - - button_area = XtVaCreateWidget (name, xmFormWidgetClass, parent, - XmNfractionBase, tightness * num_buttons - 1, - XmNskipAdjust, True, - XmNbottomAttachment, XmATTACH_FORM, - XmNleftAttachment, XmATTACH_FORM, - XmNrightAttachment, XmATTACH_FORM, - NULL); - - for (i=0; i -#include -#include - -struct balance_data { - double weight; /* weight for this test */ - VPoint rm; /* rest main gear location (input) */ - VPoint rn; /* rest nose gear location (input) */ - double cm, cn; /* rest compression values of each strut */ - double Gm, Gn; /* strut + tire lengths */ - double Km, Kn; /* string constants (output) */ - double Gpz; /* the old "grounding point" Z value */ - double theta; - }; - -void -balance (s) -struct balance_data *s; -{ - - double theta, cosTheta, sinTheta; - double Fmz; - -/* - * Determine the rest pitch angle of the aircraft body - */ - - theta = - atan2 (s->rn.z - s->rm.z, s->rn.x - s->rm.x); - cosTheta = cos(theta); - sinTheta = sin(theta); - s->theta = theta; - -/* - * Determine correct rm/rn values - */ - s->rn.z = s->rn.z - s->Gn - s->cn; - s->rm.z = s->rm.z - s->Gm - s->cm; - -/* - * Determine spring constants - */ - - Fmz = (s->weight * cosTheta * s->rn.x) / (s->rm.x - s->rn.x); - - s->Km = - Fmz * s->cm; - s->Kn = (- Fmz - s->weight * cosTheta) * - s->cn; - -/* - * Determine the initial grounding point - */ - - s->Gpz = s->rm.x * sinTheta + (s->rm.z + s->Gm + s->cm) * cosTheta; - -} - - -extern Widget CreatePanelDialog (); -extern void SetCellValueDouble(), SetCellValueString(); -extern double GetCellValueDouble(); - -enum { - InfoName, - InfoEmptyWeight, - InfoIxx, - InfoIyy, - InfoIzz, - InfoWingSpan, - InfoWingArea, - InfoWingChord, - - GearGm, - GearcmMax, - GearDm, - GearKm, - GearGn, - GearcnMax, - GearDn, - GearKn, - - DerivClda, - DerivCldr, - DerivClp, - DerivCmq, - DerivCnr, - DerivCmAlpha, - DerivCmFactor, - - PowerplantFuel, - PowerplantThrust, - PowerplantABThrust, - PowerplantLag, - PowerplantSpFuelConsump, - PowerplantSpABFuelConsump - }; - -struct cell info_dialog_items[] = { - { InfoName, "Aircraft Name", - "Unknown", 10, NULL, NULL - }, - { InfoEmptyWeight, "Empty Weight [lbs]", - "10000", 10, NULL, NULL - }, - { InfoIxx, "Ixx [slug*ft^2]", - "5000", 10, NULL, NULL - }, - { InfoIyy, "Iyy [slug*ft^2]", - "50000", 10, NULL, NULL - }, - { InfoIzz, "Izz [slug*ft^2]", - "50000", 10, NULL, NULL - }, - { InfoWingSpan, "WingSpan [ft]", - "50000", 10, NULL, NULL - }, - { InfoWingArea, "Wing Area [ft]", - "50000", 10, NULL, NULL - }, - { InfoWingChord, "Wing Chord [ft]", - "50000", 10, NULL, NULL - }, - { -1, NULL, NULL, 0, NULL, NULL } - }; - -struct cell gear_dialog_items[] = { - { - GearGm, "Main Gear Assembly Length (Gm) [ft]", - "2.0", 10, NULL, NULL - }, - { - GearcmMax, "Main Gear Max Extension (cmMax) [ft]", - "1.0", 10, NULL, NULL - }, - { - GearDm, "Main Gear Damping Factor (Dm) [lb/ft/sec]", - "2.0", 10, NULL, NULL - }, - { - GearKm, "Main Gear Spring Factor (Km) [*]", - "0.0", 10, NULL, NULL - }, - { - GearGn, "Nose Gear Assembly Length (Gn) [ft]", - "2.0", 10, NULL, NULL - }, - { - GearcnMax, "Nose Gear Max Extension (cnMax) [ft]", - "1.0", 10, NULL, NULL - }, - { - GearDn, "Nose Gear Damping Factor (Dn) [lb/ft/sec]", - "2.0", 10, NULL, NULL - }, - { - GearKn, "Nose Gear Spring Factor (Kn) [*]", - "0.0", 10, NULL, NULL - }, - { -1, NULL, NULL, 0, NULL, NULL } -}; - -struct cell deriv_dialog_items[] = { - { - DerivClda, "Roll moment from aileron offset", - "0.03", 10, NULL, NULL - }, - { - DerivCldr, "Roll moment from rudder offset", - "0.003", 10, NULL, NULL - }, - { - DerivClp, "Roll damping", - "-0.3", 10, NULL, NULL - }, - { - DerivCmq, "Pitch damping", - "-8.0", 10, NULL, NULL - }, - { - DerivCnr, "Yaw damping", - "-2.0", 10, NULL, NULL - }, - { - DerivCmAlpha, "Pitch due to angle of attack", - "-0.3", 10, NULL, NULL - }, - { - DerivClda, "Pitch due to angle of attack [stalled]", - "-0.2", 10, NULL, NULL - }, - { -1, NULL, NULL, 0, NULL, NULL } - }; - -struct cell pwr_dialog_items[] = { - { - PowerplantFuel, "Internal Fuel Capacity [lbs]", - "1000", 10, NULL, NULL - }, - { - PowerplantThrust, "Military Thrust [lbs]", - "10000", 10, NULL, NULL - }, - { - PowerplantABThrust, "Afterburner Thrust [lbs]", - "10000", 10, NULL, NULL - }, - { - PowerplantLag, "Engine response lag [negative value]", - "-3.0", 10, NULL, NULL - }, - { - PowerplantSpFuelConsump, - "Specific fuel consumption, afterburner off [lb fuel/lb T * hr]", - "0.7", 10, NULL, NULL - }, - { - PowerplantSpABFuelConsump, - "Specific fuel consumption, afterburner on [lb fuel/lb T * hr]", - "2.50", 10, NULL, NULL - }, - { -1, NULL, NULL, 0, NULL, NULL } - }; - -Widget -CreateInfoDialog(parent) -Widget parent; -{ - return CreatePanelDialog("info_dialog", parent, info_dialog_items, - XtNumber(info_dialog_items), MENU_INFO_CALCULATE, - MENU_INFO_CANCEL); -} - -Widget -CreateGearDialog(parent) -Widget parent; -{ - return CreatePanelDialog("gear_dialog", parent, gear_dialog_items, - XtNumber(gear_dialog_items), MENU_GEAR_CALCULATE, - MENU_GEAR_CANCEL); -} - -Widget -CreateDerivDialog(parent) -Widget parent; -{ - return CreatePanelDialog("stability_dialog", parent, deriv_dialog_items, - XtNumber(deriv_dialog_items), MENU_DERIV_CALCULATE, - MENU_DERIV_CANCEL); -} - -Widget -CreatePowerplantDialog(parent) -Widget parent; -{ - return CreatePanelDialog("powerplant_dialog", parent, pwr_dialog_items, - XtNumber(pwr_dialog_items), MENU_PWR_CALCULATE, - MENU_PWR_CANCEL); -} - -void -InitializeDialogs(c) -craftType *c; -{ - SetCellValueString (info_dialog_items, InfoName, craft_name); - SetCellValueDouble (info_dialog_items, InfoEmptyWeight, - c->emptyWeight); - SetCellValueDouble (info_dialog_items, InfoIxx, c->I.m[0][0]); - SetCellValueDouble (info_dialog_items, InfoIyy, c->I.m[1][1]); - SetCellValueDouble (info_dialog_items, InfoIzz, c->I.m[2][2]); - SetCellValueDouble (info_dialog_items, InfoWingSpan, c->wings * 2.0); - SetCellValueDouble (info_dialog_items, InfoWingArea, c->wingS); - SetCellValueDouble (info_dialog_items, InfoWingChord, c->c); - - SetCellValueDouble (gear_dialog_items, GearGm, c->Gm); - SetCellValueDouble (gear_dialog_items, GearcmMax, c->cmMax); - SetCellValueDouble (gear_dialog_items, GearDm, c->Dm); - SetCellValueDouble (gear_dialog_items, GearKm, c->Km); - SetCellValueDouble (gear_dialog_items, GearGn, c->Gn); - SetCellValueDouble (gear_dialog_items, GearcnMax, c->cnMax); - SetCellValueDouble (gear_dialog_items, GearDn, c->Dn); - SetCellValueDouble (gear_dialog_items, GearKn, c->Kn); - - SetCellValueDouble (pwr_dialog_items, PowerplantFuel, - c->maxFuel); - SetCellValueDouble (pwr_dialog_items, PowerplantThrust, - c->maxThrust); - SetCellValueDouble (pwr_dialog_items, PowerplantABThrust, - c->maxABThrust); - SetCellValueDouble (pwr_dialog_items, PowerplantLag, - c->engineLag); - SetCellValueDouble (pwr_dialog_items, PowerplantSpFuelConsump, - c->spFuelConsump); - SetCellValueDouble (pwr_dialog_items, PowerplantSpABFuelConsump, - c->spABFuelConsump); -} - -void -GetCraftInfo(c) -craftType *c; -{ - GetCellValueString (info_dialog_items, InfoName, craft_name); - GetCellValueDouble (info_dialog_items, InfoEmptyWeight, - &c->emptyWeight); - GetCellValueDouble (info_dialog_items, InfoIxx, &c->I.m[0][0]); - GetCellValueDouble (info_dialog_items, InfoIyy, &c->I.m[1][1]); - GetCellValueDouble (info_dialog_items, InfoIzz, &c->I.m[2][2]); - GetCellValueDouble (info_dialog_items, InfoWingSpan, &c->wings); - c->wings /= 2.0; - GetCellValueDouble (info_dialog_items, InfoWingArea, &c->wingS); - GetCellValueDouble (info_dialog_items, InfoWingChord, &c->c); - - GetCellValueDouble (gear_dialog_items, GearGm, &c->Gm); - GetCellValueDouble (gear_dialog_items, GearcmMax, &c->cmMax); - GetCellValueDouble (gear_dialog_items, GearDm, &c->Dm); - GetCellValueDouble (gear_dialog_items, GearKm, &c->Km); - GetCellValueDouble (gear_dialog_items, GearGn, &c->Gn); - GetCellValueDouble (gear_dialog_items, GearcnMax, &c->cnMax); - GetCellValueDouble (gear_dialog_items, GearDn, &c->Dn); - GetCellValueDouble (gear_dialog_items, GearKn, &c->Kn); - - GetCellValueDouble (pwr_dialog_items, PowerplantFuel, - &c->maxFuel); - GetCellValueDouble (pwr_dialog_items, PowerplantThrust, - &c->maxThrust); - GetCellValueDouble (pwr_dialog_items, PowerplantABThrust, - &c->maxABThrust); - GetCellValueDouble (pwr_dialog_items, PowerplantLag, - &c->engineLag); - GetCellValueDouble (pwr_dialog_items, PowerplantSpFuelConsump, - &c->spFuelConsump); - GetCellValueDouble (pwr_dialog_items, PowerplantSpABFuelConsump, - &c->spABFuelConsump); - - c->viewPoint = marker_list[MARKER_HEAD].location.point; - -} - -void -GearCalculate(c) -craftType *c; -{ - struct balance_data b; - - b.weight = c->emptyWeight + c->maxFuel; - b.rm = marker_list[MARKER_MAIN_GEAR].location.point; - b.rn = marker_list[MARKER_NOSE_GEAR].location.point; - b.cm = GetCellValueDouble (gear_dialog_items, GearcmMax, &c->cmMax); - b.cm *= 0.6; - b.cn = GetCellValueDouble (gear_dialog_items, GearcnMax, &c->cnMax); - b.cn *= 0.6; - b.Gm = GetCellValueDouble (gear_dialog_items, GearGm, &c->Gm); - b.Gn = GetCellValueDouble (gear_dialog_items, GearGn, &c->Gn); - -#ifdef notdef - printf ("Input:\n"); - printf ("nose contact = %lf %lf %lf\n", b.rn.x, b.rn.y, b.rn.z); - printf ("main's contact = %lf %lf %lf\n", b.rm.x, b.rm.y, b.rm.z); - printf ("Weight = %lf\n", b.weight); -#endif - - balance (&b); - -#ifdef notdef - printf ("\nOutput:\n"); - printf ("rm = %lf, %lf, %lf\n", b.rm.x, b.rm.y, b.rm.z); - printf ("rn = %lf, %lf, %lf\n", b.rn.x, b.rn.y, b.rn.z); - printf ("Km = %lf\n", b.Km); - printf ("Kn = %lf\n", b.Kn); - printf ("Grounding point (z) = %lf\n", b.Gpz); - printf ("\n\"inventory\" form:\n\n"); - printf ("\tRm\t\t{%lg, %lg, %lg}\n", b.rm.x, b.rm.y, b.rm.z); - printf ("\tRn\t\t{%lg, %lg, %lg}\n", b.rn.x, b.rn.y, b.rn.z); - printf ("\tKm\t\t%lg\n", b.Km); - printf ("\tKn\t\t%lg\n", b.Kn); - printf ("\tGm\t\t%lg\n", b.Gm); - printf ("\tGn\t\t%lg\n", b.Gn); - printf ("\tCmMax\t\t%lg\n", c->cmMax); - printf ("\tCnMax\t\t%lg\n", c->cnMax); - printf ("\tGroundingPoint\t{0.0, 0.0, %lg}\n", b.Gpz); -#endif - - c->rm = b.rm; - c->rn = b.rn; - c->Km = b.Km; - c->Kn = b.Kn; - c->groundingPoint.x = c->groundingPoint.y = 0.0; - c->groundingPoint.z = b.Gpz; - SetCellValueDouble (gear_dialog_items, GearKm, c->Km); - SetCellValueDouble (gear_dialog_items, GearKn, c->Kn); -} - - diff -Nru acm-5.0/gedit/edit.c acm-6.0+20200416/gedit/edit.c --- acm-5.0/gedit/edit.c 1998-08-08 22:30:15.000000000 +0000 +++ acm-6.0+20200416/gedit/edit.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,304 +0,0 @@ -/* - * Copyright (c) 1994, Riley Rainey, riley@netcon.com - * - * Permission to use, copy, modify and distribute (without charge) this - * software, documentation, images, etc. is granted, provided that this - * comment and the author's name is retained. - * - * This software is provided by the author as is, and without any expressed - * or implied warranties, including, but not limited to, the implied - * warranties of merchantability and fitness for a particular purpose. In no - * event shall the author be liable for any direct, indirect, incidental, or - * consequential damages arising in any way out of the use of this software. - */ - -#include -#include "gedit.h" - -extern polygon_t *BeginPolygon(); -extern void FreePolygon (); - -void PointToXYZ(); - -void -Mirror (op) -int op; -{ - - int i, j; - polygon_t *new, *poly; - view_info_t *p; - point_t *points; - - XtVaGetValues (twindow, - XmNuserData, &p, - NULL); - - for (i = sel_polygon; i >= 0; i = polygon_list[i].next) { - new = BeginPolygon (); - poly = &polygon_list[i]; - new->num_points = poly->num_points; - new->point = - (point_t *) malloc (new->num_points * sizeof (point_t)); - - for (j=0; j < poly->num_points; ++j) { - - switch (op) { - - case MENU_MIRROR_XZ: - new->point[j] = - poly->point[poly->num_points - j - 1]; - new->point[j].point.y = - - new->point[j].point.y; - PointToXYZ (p, &new->point[j]); - break; - - case MENU_MIRROR_XY: - new->point[j] = - poly->point[poly->num_points - j - 1]; - new->point[j].point.z = - - new->point[j].point.z; - PointToXYZ (p, &new->point[j]); - break; - - case MENU_MIRROR_YZ: - new->point[j] = - poly->point[poly->num_points - j - 1]; - new->point[j].point.x = - - new->point[j].point.x; - PointToXYZ (p, &new->point[j]); - break; - - } - } - - ComputePlaneEquation (new); - new->next = sel_polygon; - sel_polygon = new->id; - cur_polygon = (polygon_t *) NULL; - } - - DrawWidget (twindow, False); - DrawWidget (p->other_widget, False); -} - -void -PointToXYZ (p, point) -view_info_t *p; -point_t *point; -{ - -/* - * warning, signs assume the original layout only - */ - - switch (p->layout) { - - case VL_NXZ: - point->x = (int) (- point->point.x / pixel_scale) + - p->origin_x; - point->y = (int) (- point->point.y / pixel_scale) + - p->other_view->origin_y; - point->z = (int) (point->point.z / pixel_scale) + - p->origin_y; - break; - - case VL_NXNY: - point->x = (int) (- point->point.x / pixel_scale) + - p->origin_x; - point->y = (int) (- point->point.y / pixel_scale) + - p->origin_y; - point->z = (int) (point->point.z / pixel_scale) + - p->other_view->origin_y; - break; - - case VL_NYZ: - point->x = (int) (point->point.x / pixel_scale) + - p->other_view->origin_y; - point->y = (int) (- point->point.y / pixel_scale) + - p->origin_x; - point->z = (int) (point->point.z / pixel_scale) + - p->origin_y; - break; - - case VL_NYX: - point->x = (int) (point->point.x / pixel_scale) + - p->origin_y; - point->y = (int) (- point->point.y / pixel_scale) + - p->origin_x; - point->z = (int) (point->point.z / pixel_scale) + - p->other_view->origin_y; - break; - } -} - -void -ClearSelection() -{ - - int i, j; - view_info_t *p; - - XtVaGetValues (twindow, - XmNuserData, &p, - NULL); - - for (i=sel_polygon; i>= 0; i = j) { - j = polygon_list[i].next; - FreePolygon (&polygon_list[i]); - } - - sel_polygon = -1; - - DrawWidget (twindow, False); - DrawWidget (p->other_widget, False); -} - -void -CopySelection() -{ - int i, j, nn = 0; - view_info_t *p; - polygon_t *new, *poly; - - XtVaGetValues (twindow, - XmNuserData, &p, - NULL); - - ClearClipboard(); - - for (i = sel_polygon; i >= 0; i = polygon_list[i].next) { - new = BeginPolygon (); - poly = &polygon_list[i]; - new->num_points = poly->num_points; - new->point = - (point_t *) malloc (new->num_points * sizeof (point_t)); - - for (j=0; j < poly->num_points; ++j) { - new->point[j] = poly->point[j]; - PointToXYZ (p, &new->point[j]); - } - - ComputePlaneEquation (new); - new->next = clipboard_polygon; - clipboard_polygon = new->id; - cur_polygon = (polygon_t *) NULL; - ++nn; - } -} - -void -ClearClipboard() -{ - int i, j; - view_info_t *p; - - XtVaGetValues (twindow, - XmNuserData, &p, - NULL); - - for (i=clipboard_polygon; i>= 0; i = j) { - j = polygon_list[i].next; - FreePolygon (&polygon_list[i]); - } - - clipboard_polygon = -1; -} - -void -PasteSelection() -{ - int i, j, nn = 0; - view_info_t *p; - polygon_t *new, *poly; - - XtVaGetValues (twindow, - XmNuserData, &p, - NULL); - - ClearSelection(); - - for (i = clipboard_polygon; i >= 0; i = polygon_list[i].next) { - new = BeginPolygon (); - poly = &polygon_list[i]; - new->num_points = poly->num_points; - new->point = - (point_t *) malloc (new->num_points * sizeof (point_t)); - - for (j=0; j < poly->num_points; ++j) { - new->point[j] = poly->point[j]; - /*new->point[j].y += 1.0; - new->point[j].z += 1.0;*/ - PointToXYZ (p, &new->point[j]); - } - - ComputePlaneEquation (new); - new->next = sel_polygon; - sel_polygon = new->id; - cur_polygon = (polygon_t *) NULL; - ++nn; - } - - DrawWidget (twindow, False); - DrawWidget (p->other_widget, False); -} - -void -RotateXSelection() -{ - int i, j; - view_info_t *p; - double tmp; - polygon_t *poly; - - XtVaGetValues (twindow, - XmNuserData, &p, - NULL); - - for (i = sel_polygon; i >= 0; i = polygon_list[i].next) { - poly = &polygon_list[i]; - - for (j=0; j < poly->num_points; ++j) { - tmp = poly->point[j].point.z; - poly->point[j].point.z = poly->point[j].point.y; - poly->point[j].point.y = tmp; - PointToXYZ (p, &poly->point[j]); - } - - ComputePlaneEquation (poly); - - } - - DrawWidget (twindow, False); - DrawWidget (p->other_widget, False); -} - -void -PrintList(int start) -{ - int i; - - if (start == -1) { - printf ("NULL"); - } - else { - for (i = start; i >= 0; i = polygon_list[i].next) { - printf ("%d ", i); - } - } - printf ("\n"); -} - -void -PrintDiagnostics() -{ - printf ("sel_polygon list : "); - PrintList (sel_polygon); - printf ("unsel_polygon list : "); - PrintList (unsel_polygon); - printf ("clipboard_polygon list : "); - PrintList (clipboard_polygon); -} - - - Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/gedit/gdf-big-endian/ewacs.gdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/gedit/gdf-big-endian/ewacs.gdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/gedit/gdf-big-endian/f181.gdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/gedit/gdf-big-endian/f181.gdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/gedit/gdf-big-endian/f18.gdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/gedit/gdf-big-endian/f18.gdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/gedit/gdf-big-endian/kc135.gdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/gedit/gdf-big-endian/kc135.gdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/gedit/gdf-big-endian/mig25.gdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/gedit/gdf-big-endian/mig25.gdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/gedit/gdf-big-endian/mig29.gdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/gedit/gdf-big-endian/mig29.gdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/gedit/gdf-big-endian/scaled-c172.gdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/gedit/gdf-big-endian/scaled-c172.gdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/gedit/gdf-big-endian/scaled-ewacs.gdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/gedit/gdf-big-endian/scaled-ewacs.gdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/gedit/gdf-big-endian/scaled-mig29.gdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/gedit/gdf-big-endian/scaled-mig29.gdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/gedit/gdf-big-endian/scale-f18.gdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/gedit/gdf-big-endian/scale-f18.gdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/gedit/gdf-big-endian/xmig29.gdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/gedit/gdf-big-endian/xmig29.gdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/gedit/gdf-little-endian/sa10-s.gdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/gedit/gdf-little-endian/sa10-s.gdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/gedit/gdf-little-endian/sa11-u.gdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/gedit/gdf-little-endian/sa11-u.gdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/gedit/gdf-little-endian/sa5-u.gdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/gedit/gdf-little-endian/sa5-u.gdf differ diff -Nru acm-5.0/gedit/gedit.c acm-6.0+20200416/gedit/gedit.c --- acm-5.0/gedit/gedit.c 1998-08-08 21:58:11.000000000 +0000 +++ acm-6.0+20200416/gedit/gedit.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,1522 +0,0 @@ -/* - * Copyright (c) 1994, Riley Rainey, riley@netcon.com - * - * Permission to use, copy, modify and distribute (without charge) this - * software, documentation, images, etc. is granted, provided that this - * comment and the author's name is retained. - * - * This software is provided by the author as is, and without any expressed - * or implied warranties, including, but not limited to, the implied - * warranties of merchantability and fitness for a particular purpose. In no - * event shall the author be liable for any direct, indirect, incidental, or - * consequential damages arising in any way out of the use of this software. - */ - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define DEFINE_STORAGE -#include "gedit.h" -#include "XrMisc.h" - -#include "curs_poly" -#include "curs_poly_mask" -#include "curs_marker" -#include "curs_marker_mask" - - -static unsigned char grid_dash_list[2] = { 1, 4 }; - -static XmStringCharSet charset = (XmStringCharSet) XmSTRING_DEFAULT_CHARSET; - -/* - * fallback resources - */ - -static String fallback[] = { - "*.Background: GhostWhite", - "*buttons*highlightColor: GhostWhite", - - "*.fontList: -*-helvetica-medium-r-*-*-*-140-*", - "*.rulerFont: -*-courier-bold-r-*-*-*-140-*", - "*XmTextField.fontList: -*-courier-medium-r-*-*-*-140-*", - "*XmPushButton.shadowThickness: 3", - "*XmDrawingArea.traversalOn: false", - "*.menu_bar*Background: #4af", - "*.menu_bar.spacing: 10", - "*.top_frame.shadowType: XmSHADOW_ETCHED_OUT", - "*.bottom_frame.shadowType: XmSHADOW_ETCHED_OUT", - "*.twindow.background: #d8d8d8", - "*.twindow.foreground: black", - "*.bwindow.background: #e1caac", - "*.bwindow.foreground: black", - "*.main.form.height: 950", - "*.main.form.width: 950", - - "*set_views.labelString: Set Views ...", - "*mirror_xz.labelString: Mirror left/right", - "*mirror_xz.acceleratorText: Alt-L", - "*mirror_xz.accelerator: Metal:", - "*mirror_xz.mnemonic: l", - "*mirror_xy.labelString: Mirror top/bottom", - "*mirror_xy.acceleratorText: Alt-T", - "*mirror_xy.accelerator: Metat:", - "*mirror_xy.mnemonic: t", - "*mirror_yz.labelString: Mirror front/back", - "*mirror_yz.acceleratorText: Alt-F", - "*mirror_yz.accelerator: Metaf:", - "*mirror_yz.mnemonic: f", - "*rescale.labelString: Rescale Object ...", - "*rescale.mnemonic: R", - - "*info.labelString: Aircraft Information ...", - "*gear.labelString: Landing Gear ...", - "*stability.labelString: Stability Derivatives ...", - "*powerplant.labelString: Powerplant ...", - - "*rescale_dialog.dialogTitle: Rescale Object", - - "*open_d.dialogTitle: Open a File", - "*open_d.okLabelString: Open", - "*open_d.selectionLabelString: Open which file?", - "*open_d.autoUnmanage: true", - "*open_d*pattern: *.gdf", - - "*save_as_d.dialogTitle: Save Work", - "*save_as_d.selectionLabelString: File name:", - "*save_as_d.okLabelString: Save", - "*save_as_d.*.fontList: -*-helvetica-medium-r-*-*-*-120-*", - - "*gedit_format.labelString: Gedit format", - "*gedit_format.set: true", - "*v_format.labelString: V format", - "*rayshade_format.labelString: ACM Inventory format", - - "*show_grid.visibleWhenOff: true", - "*show_ruler.visibleWhenOff: true", - - "*coodinates*columns: 8", - "*coodinates*sensitive: false", - - "*new.labelString: New", - "*open.labelString: Open ...", - "*save.labelString: Save", - "*save_as.labelString: Save As ...", - "*exit.labelString: Exit", - - "*new.acceleratorText: Alt-N", - "*new.accelerator: Metan:", - "*new.mnemonic: N", - "*open.acceleratorText: Alt-O", - "*open.accelerator: Metao:", - "*open.mnemonic: O", - "*save.acceleratorText: Alt-S", - "*save.accelerator: Metas:", - "*save.mnemonic: S", - "*save_as.mnemonic: A", - "*exit.acceleratorText: Alt-E", - "*exit.accelerator: Metae:", - "*exit.mnemonic: E", - - "*cut.labelString: Cut", - "*cut.acceleratorText: Shift-Del", - "*cut.accelerator: ShiftDelete:", - "*cut.mnemonic: t", - "*copy.labelString: Copy", - "*copy.acceleratorText: Ctrl-Ins", - "*copy.accelerator: CtrlInsert:", - "*copy.mnemonic: C", - "*paste.labelString: Paste", - "*paste.acceleratorText: Shift-Ins", - "*paste.accelerator: ShiftInsert:", - "*paste.mnemonic: P", - "*clear.labelString: Clear", - "*clear.mnemonic: e", - "*rotx.labelString: Rotate 90 about X-Axis", - - "*info_dialog*XmLabelGadget.topOffset: 7", - "*info_dialog*XmLabelGadget.rightOffset: 10", - "*info_dialog*XmLabelGadget.leftOffset: 10", - "*info_dialog*XmTextField.rightOffset: 10", - "*gear_dialog*XmLabelGadget.topOffset: 7", - "*gear_dialog*XmLabelGadget.rightOffset: 10", - "*gear_dialog*XmLabelGadget.leftOffset: 10", - "*gear_dialog*XmTextField.rightOffset: 10", - "*powerplant_dialog*XmLabelGadget.topOffset: 7", - "*powerplant_dialog*XmLabelGadget.rightOffset: 10", - "*powerplant_dialog*XmLabelGadget.leftOffset: 10", - "*powerplant_dialog*XmTextField.rightOffset: 10", - "*stability_dialog*XmLabelGadget.topOffset: 7", - "*stability_dialog*XmLabelGadget.rightOffset: 10", - "*stability_dialog*XmLabelGadget.leftOffset: 10", - "*stability_dialog*XmTextField.rightOffset: 10", - - "*stability_dialog*Calculate.sensitive: false", - "*info_dialog*Calculate.sensitive: false", - "*info_dialog*Calculate.sensitive: false", - - NULL - }; - -static XrmOptionDescRec options[] = { - {"-controllerClass", "*controllerClass", XrmoptionSepArg, "is"}, - }; - -static XtResource resources[] = { - { - XtNselectionColor, - XtCSelectionColor, - XtRPixel, - sizeof(Pixel), - XtOffset(AppDataPtr, select_pixel), - XtRString, - (caddr_t) "firebrick" - }, - { - XtNgridColor, - XtCGridColor, - XtRPixel, - sizeof(Pixel), - XtOffset(AppDataPtr, grid_pixel), - XtRString, - (caddr_t) "black" - }, - { - XtNlineThickness, - XtCLineThickness, - XtRInt, - sizeof(int), - XtOffset(AppDataPtr, line_thickness), - XtRImmediate, - (caddr_t) 0 - }, - { - XtNselectionThickness, - XtCSelectionThickness, - XtRInt, - sizeof(int), - XtOffset(AppDataPtr, selection_thickness), - XtRImmediate, - (caddr_t) 2 - }, - { - XtNboxSize, - XtCBoxSize, - XtRInt, - sizeof(int), - XtOffset(AppDataPtr, box_size), - XtRImmediate, - (caddr_t) 5 - }, - { - XtNpickSensitivity, - XtCPickSensitivity, - XtRInt, - sizeof(int), - XtOffset(AppDataPtr, pick_sensitivity), - XtRImmediate, - (caddr_t) 64 - }, - { - XtNbuttonSize, - XtCButtonSize, - XtRInt, - sizeof(int), - XtOffset(AppDataPtr, button_size), - XtRImmediate, - (caddr_t) 32 - }, - { - XtNcursorForeground, - XtCCursorForeground, - XtRPixel, - sizeof(Pixel), - XtOffset(AppDataPtr, cursor_foreground), - XtRString, - (caddr_t) "black" - }, - { - XtNcursorBackground, - XtCCursorBackground, - XtRPixel, - sizeof(Pixel), - XtOffset(AppDataPtr, cursor_background), - XtRString, - (caddr_t) "white" - }, - { - XtNshowGrid, - XtCShowGrid, - XmRBoolean, - sizeof(Boolean), - XtOffset(AppDataPtr, show_grid), - XtRString, - (caddr_t) "true" - }, - { - XtNshowRuler, - XtCShowRuler, - XmRBoolean, - sizeof(Boolean), - XtOffset(AppDataPtr, show_ruler), - XtRString, - (caddr_t) "false" - }, - { - XtNrulerFont, - XtCFont, - XtRFontStruct, - sizeof(XFontStruct *), - XtOffset(AppDataPtr, ruler_font), - XtRString, - (caddr_t) "fixed" - } - - }; - -typedef struct { - Boolean defined_in_this_version; - Widget widget; - char *name; - char *pixmap_file; - } button_list_t; - -button_list_t button_list[] = { - { True, NULL, "point", "cursor_%d.xbm" }, - { False, NULL, "hand", "hand_%d.xbm" }, - { True, NULL, "polygon", "polygon_%d.xbm" }, - { True, NULL, "circle", "circle_%d.xbm" }, - { True, NULL, "origin", "origin_%d.xbm" }, - { True, NULL, "zoom_out", "zoom_out_%d.xbm" }, - { True, NULL, "zoom_in", "zoom_in_%d.xbm" } - }; - - -#define MAX_ARGS 16 -#define APP_CLASS "Gedit" - -void QuitCB(), HelpCB(), ButtonCB(), WindowCB(); -void MenuCB(), FileCB(), ViewCB(); -void InitializeCursors(), SetCursor(); -extern void InitializeTranslations(), DrawWidget(), ClearSelection(); -extern void DetermineObjectExtent(); -extern void CreateMarkerList(); -Widget CreateHelp (), CreateViewsDialog(), CreateRescaleDialog(); -Widget CreateInfoDialog(), CreateGearDialog(); -Widget CreateDerivDialog(), CreatePowerplantDialog(); - -Widget help_box; -Widget view_box = (Widget) NULL; - -static view_info_t t_info, b_info; - -main (argc, argv) -int argc; -char *argv[]; -{ - - Widget toplevel; - Widget main_window; - Widget menu_bar; - Widget menu_pane; - Widget button; - Widget cascade; - Widget top_frame, bottom_frame, main_form, row_col; - Widget row_col1, form, index_form; - int n, i; - Arg args[16]; - char name[128]; - XmString label_string; - XtAppContext context; - static int tw = 1, bw = 2; - Display *display; - Pixmap pixmap; - Pixel fg, bg; - XGCValues gcv; - XmString string; - - toplevel = XtAppInitialize (&context, APP_CLASS, options, - XtNumber(options), &argc, argv, fallback, NULL, 0); - - XtGetApplicationResources (toplevel, &app_data, resources, - XtNumber(resources), NULL, 0); - - n = 0; - main_window = XmCreateMainWindow (toplevel, "main", args, n); - XtManageChild (main_window); - - n = 0; - menu_bar = XmCreateMenuBar (main_window, "menu_bar", args, n); - XtManageChild (menu_bar); - -/* - * The File menu - */ - - n = 0; - menu_pane = XmCreatePulldownMenu (menu_bar, "file_menu", args, n); - - n = 0; - button = XmCreatePushButton (menu_pane, "new", args, n); - XtManageChild (button); - XtAddCallback (button, XmNactivateCallback, MenuCB, - (XtPointer) MENU_NEW); - - n = 0; - button = XmCreatePushButton (menu_pane, "open", args, n); - XtManageChild (button); - XtAddCallback (button, XmNactivateCallback, MenuCB, - (XtPointer) MENU_OPEN); - XmStringFree (string); - - n = 0; - button = XmCreatePushButton (menu_pane, "save", args, n); - XtManageChild (button); - XtAddCallback (button, XmNactivateCallback, MenuCB, - (XtPointer) MENU_SAVE); - /* XmStringFree (string); */ - - n = 0; - button = XmCreatePushButton (menu_pane, "save_as", args, n); - XtManageChild (button); - XtAddCallback (button, XmNactivateCallback, MenuCB, - (XtPointer) MENU_SAVE_AS); - - n = 0; - button = XmCreatePushButton (menu_pane, "exit", args, n); - XtManageChild (button); - XtAddCallback (button, XmNactivateCallback, QuitCB, NULL); - - n = 0; - XtSetArg (args[n], XmNsubMenuId, menu_pane); n++; - XtSetArg (args[n], XmNmnemonic, 'F'); n++; - cascade = XmCreateCascadeButton (menu_bar, "File", args, n); - XtManageChild (cascade); - -/* - * The Edit menu - */ - - n = 0; - menu_pane = XmCreatePulldownMenu (menu_bar, "edit_menu", args, n); - - n = 0; - button = XmCreatePushButton (menu_pane, "cut", args, n); - XtManageChild (button); - XtAddCallback (button, XmNactivateCallback, MenuCB, - (XtPointer) MENU_CUT); - - n = 0; - button = XmCreatePushButton (menu_pane, "copy", args, n); - XtManageChild (button); - XtAddCallback (button, XmNactivateCallback, MenuCB, - (XtPointer) MENU_COPY); - - n = 0; - button = XmCreatePushButton (menu_pane, "paste", args, n); - XtManageChild (button); - XtAddCallback (button, XmNactivateCallback, MenuCB, - (XtPointer) MENU_PASTE); - - n = 0; - button = XmCreateSeparator (menu_pane, "separator1", args, n); - XtManageChild (button); - - n = 0; - button = XmCreatePushButton (menu_pane, "clear", args, n); - XtManageChild (button); - XtAddCallback (button, XmNactivateCallback, MenuCB, - (XtPointer) MENU_CLEAR); - - n = 0; - button = XmCreateSeparator (menu_pane, "separator2", args, n); - XtManageChild (button); - - n = 0; - button = XmCreatePushButton (menu_pane, "rotx", args, n); - XtManageChild (button); - XtAddCallback (button, XmNactivateCallback, MenuCB, - (XtPointer) MENU_ROTATE_X); - - n = 0; - button = XmCreatePushButton (menu_pane, "mirror_xz", args, n); - XtManageChild (button); - XtAddCallback (button, XmNactivateCallback, MenuCB, - (XtPointer) MENU_MIRROR_XZ); - - n = 0; - button = XmCreatePushButton (menu_pane, "mirror_xy", args, n); - XtManageChild (button); - XtAddCallback (button, XmNactivateCallback, MenuCB, - (XtPointer) MENU_MIRROR_XY); - - n = 0; - button = XmCreatePushButton (menu_pane, "mirror_yz", args, n); - XtManageChild (button); - XtAddCallback (button, XmNactivateCallback, MenuCB, - (XtPointer) MENU_MIRROR_YZ); - - n = 0; - button = XmCreateSeparator (menu_pane, "separator", args, n); - XtManageChild (button); - - n = 0; - button = XmCreatePushButton (menu_pane, "rescale", args, n); - XtManageChild (button); - XtAddCallback (button, XmNactivateCallback, MenuCB, - (XtPointer) MENU_RESCALE); - - n = 0; - XtSetArg (args[n], XmNsubMenuId, menu_pane); n++; - XtSetArg (args[n], XmNmnemonic, 'E'); n++; - cascade = XmCreateCascadeButton (menu_bar, "Edit", args, n); - XtManageChild (cascade); - -/* - * The Layout menu - */ - - n = 0; - menu_pane = XmCreatePulldownMenu (menu_bar, "layout_menu", args, n); - - n = 0; - string = XmStringCreateSimple ("Show Grid"); - XtSetArg (args[n], XmNlabelString, string); n++; - XtSetArg (args[n], XmNset, app_data.show_grid); n++; - XtSetArg (args[n], XmNindicatorType, XmN_OF_MANY); n++; - XtSetArg (args[n], XmNradioBehavior, False); n++; - button = XmCreateToggleButton (menu_pane, "show_grid", args, n); - XmStringFree (string); - XtManageChild (button); - XtAddCallback (button, XmNvalueChangedCallback, MenuCB, - (XtPointer) MENU_GRID); - - n = 0; - string = XmStringCreateSimple ("Show Ruler"); - XtSetArg (args[n], XmNlabelString, string); n++; - XtSetArg (args[n], XmNset, app_data.show_ruler); n++; - XtSetArg (args[n], XmNindicatorType, XmN_OF_MANY); n++; - XtSetArg (args[n], XmNradioBehavior, False); n++; - button = XmCreateToggleButton (menu_pane, "show_ruler", args, n); - XmStringFree (string); - XtManageChild (button); - XtAddCallback (button, XmNvalueChangedCallback, MenuCB, - (XtPointer) MENU_RULER); - - n = 0; - button = XmCreateSeparator (menu_pane, "separator", args, n); - XtManageChild (button); - - n = 0; - button = XmCreatePushButton (menu_pane, "set_views", args, n); - XtManageChild (button); - XtAddCallback (button, XmNactivateCallback, MenuCB, - (XtPointer) MENU_SET_VIEWS); - - n = 0; - XtSetArg (args[n], XmNsubMenuId, menu_pane); n++; - XtSetArg (args[n], XmNmnemonic, 'L'); n++; - cascade = XmCreateCascadeButton (menu_bar, "Layout", args, n); - XtManageChild (cascade); - - CreateMarkerList (menu_bar); - - n = 0; - XtSetArg (args[n], XmNmnemonic, 'H'); n++; - cascade = XmCreateCascadeButton (menu_bar, "Help", args, n); - XtManageChild (cascade); - XtAddCallback (cascade, XmNactivateCallback, HelpCB, NULL); - - n = 0; - XtSetArg (args[n], XmNmenuHelpWidget, cascade); n++; - XtSetValues (menu_bar, args, n); - -/* - * The Aircraft Performance menu - */ - - n = 0; - menu_pane = XmCreatePulldownMenu (menu_bar, "perf_menu", args, n); - - n = 0; - button = XmCreatePushButton (menu_pane, "info", args, n); - XtManageChild (button); - XtAddCallback (button, XmNactivateCallback, MenuCB, - (XtPointer) MENU_INFO); - - n = 0; - button = XmCreatePushButton (menu_pane, "gear", args, n); - XtManageChild (button); - XtAddCallback (button, XmNactivateCallback, MenuCB, - (XtPointer) MENU_GEAR); - - n = 0; - button = XmCreatePushButton (menu_pane, "stability", args, n); - XtManageChild (button); - XtAddCallback (button, XmNactivateCallback, MenuCB, - (XtPointer) MENU_DERIV); - - n = 0; - button = XmCreatePushButton (menu_pane, "powerplant", args, n); - XtManageChild (button); - XtAddCallback (button, XmNactivateCallback, MenuCB, - (XtPointer) MENU_PWR); - - n = 0; - XtSetArg (args[n], XmNsubMenuId, menu_pane); n++; - XtSetArg (args[n], XmNmnemonic, 'P'); n++; - cascade = XmCreateCascadeButton (menu_bar, "Performance", args, n); - XtManageChild (cascade); - -/* - * The main window hierarchy - */ - - main_form = XtVaCreateWidget ("form", xmFormWidgetClass, - main_window, - NULL); - - XtVaSetValues (main_window, - XmNworkWindow, main_form, - NULL); - - index_form = XtVaCreateWidget ("index", xmFormWidgetClass, - main_form, - XmNleftAttachment, XmATTACH_FORM, - XmNtopAttachment, XmATTACH_FORM, - XmNbottomAttachment, XmATTACH_FORM, - NULL); - - row_col = XtVaCreateWidget ("buttons", xmRowColumnWidgetClass, - index_form, - XmNleftAttachment, XmATTACH_FORM, - XmNtopAttachment, XmATTACH_FORM, - NULL); - - XtVaGetValues (row_col, - XmNforeground, &fg, - XmNbackground, &bg, - NULL); - - for (i=0; i < XtNumber(button_list); ++i) { - - if (button_list[i].defined_in_this_version) { - - sprintf (name, button_list[i].pixmap_file, - app_data.button_size); - - pixmap = XmGetPixmap (XtScreen (row_col), name, fg, bg); - - button_list[i].widget = XtVaCreateManagedWidget ( - button_list[i].name, xmPushButtonWidgetClass, row_col, - XmNlabelType, XmPIXMAP, - XmNlabelPixmap, pixmap, - XmNwidth, 64, - XmNheight, 64, - XmNshadowType, XmSHADOW_ETCHED_OUT, - NULL); - - XtAddCallback (button_list[i].widget, - XmNactivateCallback, ButtonCB, (XtPointer) i); - } - - } - - XtManageChild (row_col); - - row_col1 = XtVaCreateWidget ("coordinates", xmRowColumnWidgetClass, - index_form, - XmNleftAttachment, XmATTACH_FORM, - XmNrightAttachment, XmATTACH_FORM, - XmNtopAttachment, XmATTACH_WIDGET, - XmNtopWidget, row_col, - XmNbottomAttachment, XmATTACH_FORM, - NULL); - - x_field = XtVaCreateManagedWidget("x", - xmTextFieldWidgetClass, row_col1, - XmNcolumns, 12, - NULL); - - y_field = XtVaCreateManagedWidget("y", - xmTextFieldWidgetClass, row_col1, - XmNcolumns, 12, - NULL); - - z_field = XtVaCreateManagedWidget("z", - xmTextFieldWidgetClass, row_col1, - XmNcolumns, 12, - NULL); - - XtManageChild (row_col1); - XtManageChild (index_form); - - top_frame = XtVaCreateManagedWidget ("top_frame", xmFrameWidgetClass, - main_form, - XmNtopAttachment, XmATTACH_FORM, - XmNleftAttachment, XmATTACH_WIDGET, - XmNleftWidget, index_form, - XmNrightAttachment, XmATTACH_FORM, - XmNbottomAttachment, XmATTACH_POSITION, - XmNbottomPosition, 50, - NULL); - - twindow = XmCreateDrawingArea (top_frame, "twindow", args, n); - - XtAddCallback (twindow, XmNexposeCallback, WindowCB, (caddr_t) &tw); - XtAddCallback (twindow, XmNinputCallback, WindowCB, (caddr_t) &tw); - XtAddCallback (twindow, XmNresizeCallback, WindowCB, (caddr_t) &tw); - - XtManageChild (twindow); - - bottom_frame = XtVaCreateManagedWidget ("bottom_frame", - xmFrameWidgetClass, main_form, - XmNtopAttachment, XmATTACH_WIDGET, - XmNtopWidget, top_frame, - XmNleftAttachment, XmATTACH_WIDGET, - XmNleftWidget, index_form, - XmNrightAttachment, XmATTACH_FORM, - XmNbottomAttachment, XmATTACH_FORM, - NULL); - - n = 0; - bwindow = XmCreateDrawingArea (bottom_frame, "bwindow", args, n); - - XtAddCallback (bwindow, XmNexposeCallback, WindowCB, (caddr_t) &bw); - XtAddCallback (bwindow, XmNinputCallback, WindowCB, (caddr_t) &bw); - XtAddCallback (bwindow, XmNresizeCallback, WindowCB, (caddr_t) &bw); - - XtManageChild (bwindow); - XtManageChild (main_form); - - InitializeTranslations (context, twindow, bwindow); - -/* - * File dialogs - */ - - n = 0; - open_dialog = XmCreateFileSelectionDialog (toplevel, "open_d", args, n); - XtAddCallback (open_dialog, XmNokCallback, FileCB, (XtPointer) MENU_OPEN); - - n = 0; - save_as_dialog = XmCreatePromptDialog (toplevel, "save_as_d", args, n); - XtAddCallback (save_as_dialog, XmNokCallback, FileCB, (XtPointer) MENU_SAVE_AS); - - n = 0; - row_col = XmCreateRadioBox (save_as_dialog, "file_formats", args, n); - XtManageChild (row_col); - - save_formats[0] = XtVaCreateManagedWidget ("gedit_format", - xmToggleButtonWidgetClass, row_col, - NULL); - - save_formats[1] = XtVaCreateManagedWidget ("v_format", - xmToggleButtonWidgetClass, row_col, - NULL); - - save_formats[2] = XtVaCreateManagedWidget ("rayshade_format", - xmToggleButtonWidgetClass, row_col, - NULL); - - set_views_dialog = CreateViewsDialog (toplevel); - - rescale_dialog = CreateRescaleDialog (toplevel); - - info_dialog = CreateInfoDialog(toplevel); - - gear_dialog = CreateGearDialog(toplevel); - - deriv_dialog = CreateDerivDialog(toplevel); - - powerplant_dialog = CreatePowerplantDialog(toplevel); - -/* - * We logically cross-connect each of the two drawing areas with a data - * structure that is hung off each widget's userData field. - */ - - display = XtDisplay (twindow); - t_info.flags = 0; - t_info.other_view = &b_info; - t_info.layout = VL_NXZ; - t_info.other_widget = bwindow; - t_info.other_window = XtWindow (bwindow); - gcv.graphics_exposures = False; - gcv.line_style = LineOnOffDash; - gcv.font = app_data.ruler_font->fid; - t_info.gc = XCreateGC (display, - RootWindow(display, DefaultScreen(display)), - GCGraphicsExposures | GCFont, &gcv); - t_info.erase_gc = XCreateGC (display, - RootWindow(display, DefaultScreen(display)), - GCGraphicsExposures, &gcv); - t_info.grid_gc = XCreateGC (display, - RootWindow(display, DefaultScreen(display)), - GCGraphicsExposures | GCLineStyle, &gcv); - XSetDashes (display, t_info.grid_gc, 0, grid_dash_list, 2); - - XtVaSetValues (twindow, - XmNuserData, &t_info, - NULL); - - display = XtDisplay (twindow); - b_info.flags = 0; - b_info.other_view = &t_info; - b_info.layout = VL_NXNY; - b_info.other_widget = twindow; - b_info.other_window = XtWindow (twindow); - b_info.gc = XCreateGC (display, - RootWindow(display, DefaultScreen(display)), - GCGraphicsExposures | GCFont, &gcv); - b_info.erase_gc = XCreateGC (display, - RootWindow(display, DefaultScreen(display)), - GCGraphicsExposures, &gcv); - b_info.grid_gc = XCreateGC (display, - RootWindow(display, DefaultScreen(display)), - GCGraphicsExposures | GCLineStyle, &gcv); - XSetDashes (display, b_info.grid_gc, 0, grid_dash_list, 2); - - XtVaSetValues (bwindow, - XmNuserData, &b_info, - NULL); - - help_box = CreateHelp (toplevel); - - edit_state = STATE_POINT; - cur_polygon = (polygon_t *) NULL; - polygon_max = 256; - polygon_list = (polygon_t *) malloc (polygon_max * sizeof (polygon_t)); - sel_polygon = unsel_polygon = clipboard_polygon = -1; - drag_mode = False; - - for (i=0; iset == False) - return; - - if (id == 0) - desired_view = VIEW_LEFT_TOP; - else - desired_view = VIEW_FRONT_TOP; - -} - -void -QuitCB (w, client_data, call_data) -Widget w; -caddr_t client_data; -caddr_t call_data; -{ - - exit (0); -} - -void -HelpCB (w, client_data, call_data) -Widget w; -caddr_t client_data; -caddr_t call_data; -{ - - XtManageChild (help_box); -} - -void -ButtonCB (w, client_data, call_data) -Widget w; -caddr_t client_data; -caddr_t call_data; -{ - - switch ((int) client_data) { - - case 0: - edit_state = STATE_POINT; - SetCursor (CURSOR_POINT); - break; - - case 1: - break; - - case 2: - edit_state = STATE_POLYGON; - SetCursor (CURSOR_POLY); - break; - - case 3: - edit_state = STATE_CIRCLE; - SetCursor (CURSOR_CIRCLE); - break; - - case 4: - edit_state = STATE_MOVE_ORIGIN; - SetCursor (CURSOR_ORIGIN); - break; - - case 5: - RescaleView(twindow, 1 / 1.2); - XmProcessTraversal (button_list[0].widget, XmTRAVERSE_CURRENT); - edit_state = STATE_POINT; - SetCursor (CURSOR_POINT); - break; - - case 6: - RescaleView(twindow, 1.2); - XmProcessTraversal (button_list[0].widget, XmTRAVERSE_CURRENT); - edit_state = STATE_POINT; - SetCursor (CURSOR_POINT); - break; - - default: - printf ("button %d\n", (int) client_data); - - } -} - -void -MenuCB (w, client_data, call_data) -Widget w; -caddr_t client_data; -caddr_t call_data; -{ - - register int menu_id = (int) client_data; - extern void Mirror(); - Boolean value; - VPoint extent; - XmString string; - char s[64], *factor_s; - double factor; - - if (menu_id >= MENU_MARKER && menu_id < MENU_MARKER+32) { - current_marker = menu_id - MENU_MARKER; - if (marker_list[current_marker].defined) - DisplayPoint(&marker_list[current_marker].location); - SetCursor (CURSOR_MARKER); - edit_state = STATE_MARKER; - return; - } - - switch (menu_id) { - - case MENU_MIRROR_XZ: - case MENU_MIRROR_XY: - case MENU_MIRROR_YZ: - Mirror (menu_id); - break; - - case MENU_CLEAR: - ClearSelection(); - break; - - case MENU_COPY: - CopySelection(); - break; - - case MENU_PASTE: - PasteSelection(); - break; - - case MENU_ROTATE_X: - RotateXSelection(); - break; - - case MENU_SAVE: - if (filename_valid) - WriteGeditFile (filename); - else - XtManageChild (save_as_dialog); - break; - - case MENU_GRID: - XtVaGetValues (w, - XmNset, &value, - NULL); - - if (value != app_data.show_grid) { - app_data.show_grid = value; - DrawWidget (twindow, False); - DrawWidget (bwindow, False); - } - else { - app_data.show_grid = value; - } - break; - - case MENU_RULER: - XtVaGetValues (w, - XmNset, &value, - NULL); - - if (value != app_data.show_ruler) { - app_data.show_ruler = value; - DrawWidget (twindow, False); - DrawWidget (bwindow, False); - } - else { - app_data.show_ruler = value; - } - break; - - case MENU_OPEN: - XtManageChild (open_dialog); - break; - - case MENU_SAVE_AS: - XtManageChild (save_as_dialog); - break; - - case MENU_SET_VIEWS: - XtManageChild (set_views_dialog); - break; - - case MENU_SET_VIEWS_COMPLETE: - switch (desired_view) { - - case VIEW_LEFT_TOP: - t_info.layout = VL_NXZ; - b_info.layout = VL_NXNY; - break; - - case VIEW_FRONT_TOP: - t_info.layout = VL_NYZ; - b_info.layout = VL_NYX; - break; - } - - RescaleView (twindow, 1.0); - XtUnmanageChild (set_views_dialog); - break; - - case MENU_SET_VIEWS_CANCEL: - XtUnmanageChild (set_views_dialog); - break; - - case MENU_RESCALE: - DetermineObjectExtent (&extent); - - sprintf (s, " %s : %f", "X", extent.x); - string = XmStringCreateSimple(s); - XtVaSetValues (extent_x, - XmNlabelString, string, - NULL); - XmStringFree (string); - - sprintf (s, " %s : %f", "Y", extent.y); - string = XmStringCreateSimple(s); - XtVaSetValues (extent_y, - XmNlabelString, string, - NULL); - XmStringFree (string); - - sprintf (s, " %s : %f", "Z", extent.z); - string = XmStringCreateSimple(s); - XtVaSetValues (extent_z, - XmNlabelString, string, - NULL); - XmStringFree (string); - - XtManageChild (rescale_dialog); - break; - - case MENU_RESCALE_APPLY: - factor_s = XmTextFieldGetString (rescale_field); - factor = atof(factor_s); - if (factor != 0.0) - RescaleObject (factor); - break; - - case MENU_RESCALE_CANCEL: - XtUnmanageChild (rescale_dialog); - break; - - case MENU_GEAR: - XtManageChild (gear_dialog); - break; - - case MENU_GEAR_CANCEL: - GetCraftInfo (&c); - XtUnmanageChild (gear_dialog); - break; - - case MENU_GEAR_CALCULATE: - GearCalculate (&c); - GetCraftInfo (&c); - break; - - case MENU_INFO: - XtManageChild (info_dialog); - break; - - case MENU_INFO_CANCEL: - GetCraftInfo (&c); - XtUnmanageChild (info_dialog); - break; - - case MENU_INFO_CALCULATE: - GetCraftInfo (&c); - break; - - case MENU_DERIV: - XtManageChild (deriv_dialog); - break; - - case MENU_DERIV_CANCEL: - GetCraftInfo (&c); - XtUnmanageChild (deriv_dialog); - break; - - case MENU_DERIV_CALCULATE: - GetCraftInfo (&c); - break; - - case MENU_PWR: - XtManageChild (powerplant_dialog); - break; - - case MENU_PWR_CANCEL: - GetCraftInfo (&c); - XtUnmanageChild (powerplant_dialog); - break; - - case MENU_PWR_CALCULATE: - GetCraftInfo (&c); - break; - } - -} - -void -FileCB (w, client_data, call_data) -Widget w; -caddr_t client_data; -caddr_t call_data; -{ - register int menu_id = (int) client_data, i; - register XmSelectionBoxCallbackStruct *p = - (XmSelectionBoxCallbackStruct *) call_data; - char *value; - Boolean state; - extern int ReadGeditFile(), WriteGeditFile(); - - XmStringGetLtoR (p->value, charset, &value); - - switch (menu_id) { - - case MENU_OPEN: - ReadGeditFile (value); - break; - - case MENU_SAVE_AS: - for (i=0; i < 3; ++i) { - - XtVaGetValues (save_formats[i], - XmNset, &state, - NULL); - - if (state) { - switch (i) { - - case 0: - WriteGeditFile (value); - break; - case 1: - WriteVFile (value); - break; - } - - break; - } - } - break; - } - - strcpy (filename, value); - filename_valid = True; - - XtFree (value); -} - -void -AllocPixmap (w, width, height) -Widget w; -Dimension width, height; -{ - - Pixel bg; - view_info_t *p; - Display *d; - int depth; - - d = XtDisplay (w); - - XtVaGetValues (w, - XmNbackground, &bg, - XmNuserData, &p, - XmNdepth, &depth, - NULL); - - if (p->flags & VI_PIXMAP_ALLOCATED) - XFreePixmap (d, p->pixmap); - - p->pixmap = XCreatePixmap (d, RootWindow (d, DefaultScreen(d)), - width, height, depth); - - XSetForeground (d, p->erase_gc, bg); - XSetLineAttributes (d, p->erase_gc, app_data.selection_thickness, - LineSolid, CapButt, JoinMiter); - - XFillRectangle (d, p->pixmap, p->erase_gc, 0, 0, width, height); - - p->width = width; - p->height = height; - p->flags |= VI_PIXMAP_ALLOCATED; -} - - -void -WindowCB (w, client_data, call_data) -Widget w; -caddr_t client_data; -caddr_t call_data; -{ - - register XmDrawingAreaCallbackStruct *q; - view_info_t *p; - - q = (XmDrawingAreaCallbackStruct *) call_data; - - XtVaGetValues (w, - XmNuserData, &p, - NULL); - - switch (q->reason) { - - case XmCR_EXPOSE: - if ((p->flags & VI_PIXMAP_ALLOCATED) == 0) { - XtVaGetValues (w, - XmNwidth, &p->width, - XmNheight, &p->height, - NULL); - AllocPixmap (w, p->width, p->height); - } - XCopyArea (XtDisplay(w), p->pixmap, XtWindow(w), - p->gc, 0, 0, p->width, p->height, 0, 0); - break; - - case XmCR_RESIZE: - XtVaGetValues (w, - XmNwidth, &p->width, - XmNheight, &p->height, - NULL); - AllocPixmap (w, p->width, p->height); - p->origin_x = (p->width + 1) / 2; - p->origin_y = (p->height + 1) / 2; - DrawWidget (w, False); - break; - - } - -} - -void -InitializeCursors() -{ - - unsigned long fg = 1, bg = 0; - XColor colors[2]; - Drawable d; - Display *dpy; - Pixmap source, mask; - Colormap cmap; - - dpy = XtDisplay (twindow); - d = RootWindow(dpy, DefaultScreen(dpy)); - - XtVaGetValues (twindow, - XmNcolormap, &cmap, - NULL); - - cursors[CURSOR_POINT] = XCreateFontCursor (dpy, XC_left_ptr); - - source = XCreatePixmapFromBitmapData (dpy, d, curs_poly_bits, - curs_poly_width, curs_poly_height, - fg, bg, 1); - mask = XCreatePixmapFromBitmapData (dpy, d, curs_poly_mask_bits, - curs_poly_width, curs_poly_height, - fg, bg, 1); - - colors[0].pixel = app_data.cursor_foreground; - colors[1].pixel = app_data.cursor_background; - XQueryColors (dpy, cmap, colors, 2); - - cursors[CURSOR_POLY] = XCreatePixmapCursor (dpy, source, - mask, &colors[0], &colors[1], - curs_poly_x_hot, curs_poly_y_hot); - XFreePixmap (dpy, source); - XFreePixmap (dpy, mask); - - source = XCreatePixmapFromBitmapData (dpy, d, curs_marker_bits, - curs_marker_width, curs_marker_height, - fg, bg, 1); - mask = XCreatePixmapFromBitmapData (dpy, d, curs_marker_mask_bits, - curs_marker_width, curs_marker_height, - fg, bg, 1); - - cursors[CURSOR_MARKER] = XCreatePixmapCursor (dpy, source, - mask, &colors[0], &colors[1], - curs_marker_x_hot, curs_marker_y_hot); - XFreePixmap (dpy, source); - XFreePixmap (dpy, mask); - - cursors[CURSOR_ORIGIN] = XCreateFontCursor (dpy, XC_crosshair); - -} - -void SetCursor (id) -int id; -{ - - Cursor cursor; - - switch (id) { - - case CURSOR_POINT: - cursor = cursors[CURSOR_POINT]; - break; - - case CURSOR_POLY_PLANE: - cursor = cursors[CURSOR_POLY]; - break; - - case CURSOR_CIRCLE: - case CURSOR_POLY: - cursor = cursors[CURSOR_POLY]; - break; - - case CURSOR_ORIGIN: - cursor = cursors[CURSOR_ORIGIN]; - break; - - case CURSOR_MARKER: - cursor = cursors[CURSOR_MARKER]; - break; - } - - XDefineCursor (XtDisplay(twindow), XtWindow(twindow), cursor); - XDefineCursor (XtDisplay(bwindow), XtWindow(bwindow), cursor); -} diff -Nru acm-5.0/gedit/gedit.h acm-6.0+20200416/gedit/gedit.h --- acm-5.0/gedit/gedit.h 1998-08-08 21:42:02.000000000 +0000 +++ acm-6.0+20200416/gedit/gedit.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,256 +0,0 @@ -/* - * Copyright (c) 1994, Riley Rainey, riley@netcon.com - * - * Permission to use, copy, modify and distribute (without charge) this - * software, documentation, images, etc. is granted, provided that this - * comment and the author's name is retained. - * - * This software is provided by the author as is, and without any expressed - * or implied warranties, including, but not limited to, the implied - * warranties of merchantability and fitness for a particular purpose. In no - * event shall the author be liable for any direct, indirect, incidental, or - * consequential damages arising in any way out of the use of this software. - */ - -#ifdef DEFINE_STORAGE -#define _GLOBAL -#else -#define _GLOBAL extern -#endif - -#include -#include -#undef a -#include - -/* - * Application resources - */ - -typedef struct { - Pixel select_pixel; - Pixel grid_pixel; - int line_thickness; - int selection_thickness; - int box_size; - int box_offset; /* half of box_size */ - int pick_sensitivity; - int button_size; - Pixel cursor_foreground; - Pixel cursor_background; - Boolean show_grid; - Boolean show_ruler; - XFontStruct *ruler_font; - } AppData, *AppDataPtr; - -#define XtNselectionColor "selectionColor" -#define XtCSelectionColor "SelectionColor" -#define XtNgridColor "gridColor" -#define XtCGridColor "GridColor" -#define XtNlineThickness "lineThickness" -#define XtCLineThickness "LineThickness" -#define XtNselectionThickness "selectionThickness" -#define XtCSelectionThickness "SelectionThickness" -#define XtNboxSize "boxSize" -#define XtCBoxSize "BoxSize" -#define XtNpickSensitivity "pickSensitivity" -#define XtCPickSensitivity "PickSensitivity" -#define XtNbuttonSize "buttonSize" -#define XtCButtonSize "ButtonSize" -#define XtNcursorForeground "cursorColor" -#define XtCCursorForeground "CursorColor" -#define XtNcursorBackground "cursorBackgroundColor" -#define XtCCursorBackground "CursorBackgroundColor" -#define XtNshowGrid "showGrid" -#define XtCShowGrid "ShowGrid" -#define XtNshowRuler "showRuler" -#define XtCShowRuler "ShowRuler" -#define XtNrulerFont "rulerFont" - -/* - * Menu dialog identification codes - */ - -#define MENU_SET_VIEWS 1 -#define MENU_COPY 2 -#define MENU_CUT 3 -#define MENU_PASTE 4 -#define MENU_MIRROR_XZ 5 -#define MENU_MIRROR_XY 6 -#define MENU_MIRROR_YZ 7 -#define MENU_CLEAR 8 -#define MENU_SAVE 9 -#define MENU_SAVE_AS 10 -#define MENU_OPEN 11 -#define MENU_NEW 12 -#define MENU_GRID 13 -#define MENU_RULER 14 -#define MENU_SET_VIEWS_COMPLETE 15 -#define MENU_SET_VIEWS_CANCEL 16 -#define MENU_RESCALE_APPLY 17 -#define MENU_RESCALE_CANCEL 18 -#define MENU_RESCALE 19 -#define MENU_MARKER 20 /* 32 markers are available */ -#define MENU_MARKER_LAST 51 /* This is the highest marker */ -#define MENU_GEAR_CALCULATE 52 -#define MENU_GEAR_CANCEL 53 -#define MENU_GEAR 54 -#define MENU_INFO_CALCULATE 55 -#define MENU_INFO_CANCEL 56 -#define MENU_INFO 57 -#define MENU_DERIV_CALCULATE 58 -#define MENU_DERIV_CANCEL 59 -#define MENU_DERIV 60 -#define MENU_PWR_CALCULATE 61 -#define MENU_PWR_CANCEL 62 -#define MENU_PWR 63 -#define MENU_ROTATE_X 64 - - -typedef struct _view_info_t { - struct _view_info_t *other_view; - unsigned int flags; - Widget other_widget; /* the other view */ - Window other_window; /* XtWindow (other_widget) */ - Pixmap pixmap; /* A copy of this window's contents */ - GC gc; - GC erase_gc; - GC grid_gc; - short origin_x, origin_y; /* view's origin screen location */ - int layout; /* axes that we're viewing */ - Dimension width, height; - } view_info_t; - -#define VI_PIXMAP_ALLOCATED 1 - -typedef struct { - long numerator, denominator; - } fraction_t; - -typedef struct { - fraction_t x, y, z; - } loc_t; - -typedef struct { - loc_t location; /* precise point location */ - VPoint point; /* location as doubles */ - short x, y, z; /* pixel offset from origin */ - } point_t; - -typedef struct _polygon_t { - long id; - long next; - VPoint normal; /* normal vector of this polygon's plane */ - VPoint origin; /* plane's origin */ - double d; /* plane equation: a x + b y + c z + d = 0 */ - VPoint trihedral; /* used to transform from planar to world */ - int num_points; /* number of points defined */ - point_t *point; /* an array of points */ - } polygon_t; - -typedef struct { - Boolean defined; /* is the marker defined yet? */ - int id; /* a unique identifier for each marker */ - char name[32]; /* name of this marker */ - point_t location; /* where is this marker located */ - } marker_t; - -_GLOBAL AppData app_data; -_GLOBAL int edit_state; -_GLOBAL polygon_t *cur_polygon; -_GLOBAL int sel_polygon; /* list of selected polygons */ -_GLOBAL int unsel_polygon; /* list of unselected polygons */ -_GLOBAL int clipboard_polygon; -_GLOBAL polygon_t *polygon_list; /* array of polygon pool */ -_GLOBAL int polygon_count, polygon_max; -_GLOBAL double pixel_scale; /* display scale (units per pixel) */ -_GLOBAL long ruler_divisions; -_GLOBAL point_t *tmp_point; -_GLOBAL int tmp_point_max; -_GLOBAL Widget twindow; -_GLOBAL Widget bwindow; -_GLOBAL Widget open_dialog; -_GLOBAL Widget save_as_dialog; -_GLOBAL Widget save_formats[3]; -_GLOBAL Widget set_views_dialog; -_GLOBAL Widget rescale_field; -_GLOBAL Widget rescale_dialog; -_GLOBAL Widget gear_dialog; -_GLOBAL Widget info_dialog; -_GLOBAL Widget deriv_dialog; -_GLOBAL Widget powerplant_dialog; -_GLOBAL Widget extent_x, extent_y, extent_z; -_GLOBAL Widget x_field, y_field, z_field; -_GLOBAL XPoint drag_origin; /* where a drag operation started */ -_GLOBAL Boolean drag_mode; -_GLOBAL XSegment rubber_lines[2]; -_GLOBAL Cursor cursors[6]; -_GLOBAL Boolean filename_valid; -_GLOBAL char filename[256]; -_GLOBAL int desired_view; -_GLOBAL marker_t *marker_list; -_GLOBAL int current_marker; -_GLOBAL int marker_count; -_GLOBAL Boolean craft_valid; -_GLOBAL char craft_name[128]; -_GLOBAL craftType c; -_GLOBAL craft plane; - -/* - * edit_state values - */ - -#define STATE_POINT 0 -#define STATE_POLYGON 1 -#define STATE_MOVE_ORIGIN 2 -#define STATE_CIRCLE 3 -#define STATE_MARKER 4 - -/* - * view layouts - */ - -#define VL_XZ 0 -#define VL_XY 1 -#define VL_NXZ 2 -#define VL_NXY 3 -#define VL_NXNZ 4 -#define VL_NXNY 5 -#define VL_NYX 6 -#define VL_NYZ 7 -#define VL_NYNX 8 -#define VL_NYNZ 9 - -/* - * Cursor definitions - */ - -#define CURSOR_POINT 0 -#define CURSOR_POLY_PLANE 1 -#define CURSOR_POLY 2 -#define CURSOR_ORIGIN 3 -#define CURSOR_CIRCLE 4 -#define CURSOR_MARKER 5 - -/* - * Valid view configurations - */ - -#define VIEW_LEFT_TOP 0 -#define VIEW_FRONT_TOP 1 - -/* - * Markers - */ - -#define MARKER_HEAD 0 -#define MARKER_NOSE_GEAR 1 -#define MARKER_MAIN_GEAR 2 -#define MARKER_TAIL_SCRAPE 3 - -extern void CopySelection ( void ); -extern void PasteSelection ( void ); -extern void RotateXSelection ( void ); -extern void ClearClipboard( void ); -extern void PrintDiagnostics(void); - diff -Nru acm-5.0/gedit/gutil1.c acm-6.0+20200416/gedit/gutil1.c --- acm-5.0/gedit/gutil1.c 1994-01-20 14:13:17.000000000 +0000 +++ acm-6.0+20200416/gedit/gutil1.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,449 +0,0 @@ -/* - * Copyright (c) 1994, Riley Rainey, riley@netcon.com - * - * Permission to use, copy, modify and distribute (without charge) this - * software, documentation, images, etc. is granted, provided that this - * comment and the author's name is retained. - * - * This software is provided by the author as is, and without any expressed - * or implied warranties, including, but not limited to, the implied - * warranties of merchantability and fitness for a particular purpose. In no - * event shall the author be liable for any direct, indirect, incidental, or - * consequential damages arising in any way out of the use of this software. - */ - -#include -#include "gedit.h" - -void WorldToWidget(), DrawGrid(), DrawRuler(), DrawWidget(), StringSize(); -extern void PointToXYZ(); - -#define MINIMUM_GRID_SPACING 50 -#define MINIMUM_RULER_SPACING 50 -#define RULER_MARGIN 2 -#define RULER_MAJOR_LENGTH 7 -#define RULER_MINOR1_LENGTH 4 -#define RULER_MINOR2_LENGTH 2 -#define RULER_THICKNESS 2 - -void -RescaleView (w, factor) -Widget w; -double factor; -{ - polygon_t *poly; - point_t *q; - view_info_t *p; - register int i, j, xc, yc, zc; - - XtVaGetValues (w, - XmNuserData, &p, - NULL); - - switch (p->layout) { - - case VL_NXNY: - case VL_NYX: - xc = (p->width + 1) / 2; - yc = (p->height + 1) / 2; - zc = (p->other_view->height + 1) / 2; - p->other_view->origin_x = - p->origin_x = (p->origin_x - xc) * factor + xc; - p->origin_y = (p->origin_y - yc) * factor + yc; - p->other_view->origin_y = - (p->other_view->origin_y - zc) * factor + zc; - break; - - case VL_NXZ: - xc = (p->width + 1) / 2; - yc = (p->other_view->height + 1) / 2; - zc = (p->height + 1) / 2; - p->other_view->origin_x = - p->origin_x = (p->origin_x - xc) * factor + xc; - p->origin_y = (p->origin_y - zc) * factor + zc; - p->other_view->origin_y = - (p->other_view->origin_y - yc) * factor + yc; - break; - - case VL_NYZ: - xc = (p->other_view->height + 1) / 2; - yc = (p->width + 1) / 2; - zc = (p->height + 1) / 2; - p->other_view->origin_x = - p->origin_x = (p->origin_x - yc) * factor + yc; - p->origin_y = (p->origin_y - zc) * factor + zc; - p->other_view->origin_y = - (p->other_view->origin_y - xc) * factor + xc; - break; - - } - - pixel_scale /= factor; - - for (i=0, poly=polygon_list; i < polygon_max; ++i, ++poly) { - for (j=0, q=poly->point; j < poly->num_points; ++j, ++q) { - PointToXYZ (p, q); - } - } - - DrawWidget (w, False); - DrawWidget (p->other_widget, False); -} - -void -DrawWidget (w, immediate) -Widget w; -Boolean immediate; -{ - polygon_t *poly; - point_t *q; - view_info_t *p; - register int i, j; - int x1, y1, x2, y2; - Display *dpy; - Drawable d; - Pixel fg, bg; - - XtVaGetValues (w, - XmNuserData, &p, - XmNforeground, &fg, - XmNbackground, &bg, - NULL); - - dpy = XtDisplay (w); - d = XtWindow (w); - - if (d == 0) - immediate = False; - - XSetForeground (dpy, p->gc, bg); - if (immediate) - XFillRectangle (dpy, d, p->gc, 0, 0, p->width, p->height); - XFillRectangle (dpy, p->pixmap, p->gc, 0, 0, p->width, p->height); - - XSetForeground (dpy, p->gc, fg); - XSetLineAttributes (dpy, p->gc, app_data.line_thickness, LineSolid, - CapButt, JoinMiter); - - for (i=unsel_polygon; i >= 0; i = polygon_list[i].next) { - poly = &polygon_list[i]; - if (poly->num_points == 0) - continue; - WorldToWidget (p, &poly->point[poly->num_points-1], &x1, &y1); - for (j=0, q=poly->point; j < poly->num_points; ++j, ++q) { - WorldToWidget (p, q, &x2, &y2); - if (immediate) - XDrawLine (dpy, d, p->gc, x1, y1, x2, y2); - XDrawLine (dpy, p->pixmap, p->gc, x1, y1, x2, y2); - x1 = x2; - y1 = y2; - } - } - - XSetForeground (dpy, p->gc, app_data.select_pixel); - XSetLineAttributes (dpy, p->gc, app_data.selection_thickness, LineSolid, - CapButt, JoinMiter); - - for (i=sel_polygon; i >= 0; i = polygon_list[i].next) { - poly = &polygon_list[i]; - if (poly->num_points == 0) - continue; - WorldToWidget (p, &poly->point[poly->num_points-1], &x1, &y1); - for (j=0, q=poly->point; j < poly->num_points; ++j, ++q) { - WorldToWidget (p, q, &x2, &y2); - if (immediate) - XDrawLine (dpy, d, p->gc, x1, y1, x2, y2); - XDrawLine (dpy, p->pixmap, p->gc, x1, y1, x2, y2); - x1 = x2; - y1 = y2; - } - } - - if (immediate) - DrawGrid (p, dpy, d); - DrawGrid (p, dpy, p->pixmap); - - if (immediate) - DrawRuler (p, dpy, d, bg); - DrawRuler (p, dpy, p->pixmap, bg); - - if (immediate == False && d != 0) - XCopyArea (dpy, p->pixmap, d, p->gc, 0, 0, p->width, p->height, - 0, 0); -} - -void -DrawPolygon (w, poly, immediate) -Widget w; -polygon_t *poly; -Boolean immediate; -{ - - point_t *q; - view_info_t *p; - register int j; - int x1, y1, x2, y2; - Display *dpy; - Drawable d; - Pixel fg, bg; - - XtVaGetValues (w, - XmNuserData, &p, - XmNforeground, &fg, - XmNbackground, &bg, - NULL); - - dpy = XtDisplay (w); - d = XtWindow (w); - - if (d == 0) - immediate = False; - - XSetForeground (dpy, p->gc, fg); - XSetLineAttributes (dpy, p->gc, app_data.line_thickness, LineSolid, - CapButt, JoinMiter); - - if (poly->num_points == 0) - return; - - WorldToWidget (p, &poly->point[poly->num_points-1], &x1, &y1); - for (j=0, q=poly->point; j < poly->num_points; ++j, ++q) { - WorldToWidget (p, q, &x2, &y2); - if (immediate) - XDrawLine (dpy, d, p->gc, x1, y1, x2, y2); - XDrawLine (dpy, p->pixmap, p->gc, x1, y1, x2, y2); - x1 = x2; - y1 = y2; - } - - if (immediate == False && d != 0) - XCopyArea (dpy, p->pixmap, d, p->gc, 0, 0, p->width, p->height, - 0, 0); -} - -void -WorldToWidget (p, q, x, y) -view_info_t *p; -point_t *q; -int *x, *y; -{ - switch (p->layout) { - - case VL_NXZ: - *x = q->x; - *y = q->z; - break; - - case VL_NXNY: - *x = q->x; - *y = q->y; - break; - - case VL_NYX: - *x = q->y; - *y = q->x; - break; - - case VL_NYZ: - *x = q->y; - *y = q->z; - break; - } -} - -void -DrawGrid (p, dpy, d) -view_info_t *p; -Display *dpy; -Drawable d; -{ - int exp, n, x, y; - - if (app_data.show_grid == False) - return; - - XSetForeground (dpy, p->grid_gc, app_data.grid_pixel); - - for (exp = 1; ; exp *= 10) { - if (exp / pixel_scale >= MINIMUM_GRID_SPACING) - break; - if (5.0 * exp / pixel_scale >= MINIMUM_GRID_SPACING) { - exp = 5 * exp; - break; - } - } - -/* - * Y-axis lines - */ - - for (x=p->origin_x, n = 0; x > 0; ) { - XDrawLine (dpy, d, p->grid_gc, x, 0, x, p->height); - ++ n; - x = p->origin_x - (int) (n * exp / pixel_scale); - } - - for (x=p->origin_x, n = 0; x < p->width; ) { - ++ n; - x = p->origin_x + (int) (n * exp / pixel_scale); - XDrawLine (dpy, d, p->grid_gc, x, 0, x, p->height); - } - -/* - * X-axis lines - */ - - for (y=p->origin_y, n = 0; y > 0; ) { - XDrawLine (dpy, d, p->grid_gc, 0, y, p->width, y); - ++ n; - y = p->origin_y - (int) (n * exp / pixel_scale); - } - - for (y=p->origin_y, n = 0; y < p->height; ) { - ++ n; - y = p->origin_y + (int) (n * exp / pixel_scale); - XDrawLine (dpy, d, p->grid_gc, 0, y, p->width, y); - } -} - -void DrawSelectedPolygon (w, poly, immediate, erase) -Widget w; -polygon_t *poly; -Boolean immediate, erase; -{ - register int i; - int x1, x2, y1, y2; - point_t *q; - view_info_t *p; - Pixel bg; - Display *dpy; - Drawable d; - - dpy = XtDisplay (w); - d = XtWindow (w); - - if (d == 0) - immediate = False; - - XtVaGetValues (w, - XmNuserData, &p, - XmNbackground, &bg, - NULL); - - if (erase) - XSetForeground (dpy, p->gc, bg); - else - XSetForeground (dpy, p->gc, app_data.select_pixel); - - XSetLineAttributes (dpy, p->gc, app_data.selection_thickness, LineSolid, - CapButt, JoinMiter); - - WorldToWidget (p, &poly->point[poly->num_points-1], &x1, &y1); - for (i=0, q=poly->point; i < poly->num_points; ++i, ++q) { - WorldToWidget (p, q, &x2, &y2); - if (immediate) - XDrawLine (dpy, d, p->gc, x1, y1, x2, y2); - XDrawLine (dpy, p->pixmap, p->gc, x1, y1, x2, y2); - x1 = x2; - y1 = y2; - } -} - -void -DrawRuler (p, dpy, d, bg) -view_info_t *p; -Display *dpy; -Drawable d; -Pixel bg; -{ - - int ruler_y, font_y, nseg, exp, n, x, xw, yw, xv; - XSegment seg[256]; - char s[32]; - -/* - * we'll only display the horizontal ruler in the top window - */ - - if (p->other_widget == twindow) - return; - - if (app_data.show_ruler == False) - return; - - for (exp = 1; ; exp *= 10) { - if (exp / pixel_scale >= MINIMUM_RULER_SPACING) - break; - if (2.0 * exp / pixel_scale >= MINIMUM_RULER_SPACING) { - exp = 2 * exp; - break; - } - if (5.0 * exp / pixel_scale >= MINIMUM_RULER_SPACING) { - exp = 5 * exp; - break; - } - } - - ruler_y = p->height - (RULER_THICKNESS + 2 * RULER_MARGIN + - RULER_MAJOR_LENGTH + app_data.ruler_font->max_bounds.ascent); - - font_y = ruler_y + RULER_THICKNESS + RULER_MARGIN + - app_data.ruler_font->max_bounds.ascent - 2; - - XSetForeground (dpy, p->gc, bg); - XFillRectangle (dpy, d, p->gc, - 0, ruler_y, p->width, p->height - ruler_y); - - XSetForeground (dpy, p->gc, app_data.grid_pixel); - - seg[0].x1 = 0; - seg[0].x2 = p->width - 1; - seg[0].y1 = seg[0].y2 = ruler_y; - nseg = 1; - -/* - * Major tick marks - */ - - for (x=p->origin_x, n = 0; x > 0; ) { - seg[nseg].x1 = seg[nseg].x2 = x; - seg[nseg].y1 = p->height - 1; - seg[nseg].y2 = p->height - RULER_MAJOR_LENGTH; - ++ nseg; - xv = (int) (n * exp); - sprintf (s, "%d", xv); - StringSize (s, &xw, &yw); - XDrawString (dpy, d, p->gc, x - xw / 2, font_y, s, strlen(s)); - ++ n; - x = p->origin_x - (int) (n * exp / pixel_scale); - } - - for (x=p->origin_x, n = 0; x < p->width; ) { - ++ n; - x = p->origin_x + (int) (n * exp / pixel_scale); - xv = (int) (n * exp); - sprintf (s, "%d", xv); - StringSize (s, &xw, &yw); - XDrawString (dpy, d, p->gc, x - xw / 2, font_y, s, strlen(s)); - seg[nseg].x1 = seg[nseg].x2 = x; - seg[nseg].y1 = p->height - 1; - seg[nseg].y2 = p->height - RULER_MAJOR_LENGTH; - ++ nseg; - } - - XSetLineAttributes (dpy, p->gc, RULER_THICKNESS, LineSolid, - CapButt, JoinMiter); - - XDrawSegments (dpy, d, p->gc, seg, nseg); -} - -void -StringSize (s, xw, yw) -char *s; -int *xw, *yw; -{ - - *xw = XTextWidth (app_data.ruler_font, s, strlen (s)); - *yw = app_data.ruler_font->max_bounds.ascent; - -} diff -Nru acm-5.0/gedit/gutil2.c acm-6.0+20200416/gedit/gutil2.c --- acm-5.0/gedit/gutil2.c 1994-01-20 14:13:30.000000000 +0000 +++ acm-6.0+20200416/gedit/gutil2.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,81 +0,0 @@ -/* - * Copyright (c) 1994, Riley Rainey, riley@netcon.com - * - * Permission to use, copy, modify and distribute (without charge) this - * software, documentation, images, etc. is granted, provided that this - * comment and the author's name is retained. - * - * This software is provided by the author as is, and without any expressed - * or implied warranties, including, but not limited to, the implied - * warranties of merchantability and fitness for a particular purpose. In no - * event shall the author be liable for any direct, indirect, incidental, or - * consequential damages arising in any way out of the use of this software. - */ - -#include -#include -#include - -#include "gedit.h" -#include -#include - -char *markers[] = { - "Pilot's Head Location", - "Nose/Tail Gear Ground Contact Point", - "Main Gear Ground Contact Point", - "Tail Ground Contact Point", - NULL - }; - -extern void MenuCB(); - -void -CreateMarkerList(parent) -Widget parent; -{ - - register char **p; - register int count = 0, i, n; - XmString string; - Widget item, menu, cascade; - Arg args[4]; - char s[32]; - - for (p=markers; *p; ++p) { - ++count; - } - - marker_count = count; - - n = 0; - menu = XmCreatePulldownMenu (parent, "marker_menu", args, n); - - marker_list = (marker_t *) XtMalloc (count * sizeof(marker_t)); - - for (i=0; i -#include -#include "gedit.h" -#include - -extern void DrawPolygon(), WorldToWidget(), DrawWidget(), PointToXYZ(); -void SelectObject(); - -/* - * Once we have three points entered, we can compute the equation associated - * with the plane defined by them. The general equation looks like this: - * - * a x + b y + c z + d = 0 - * - * Where the normal vector is N=[a, b, c] and d = - a x0 - b y0 - c z0; - * the origin is O=[x0, y0, z0]. - * - * Once the plane equation is computed, it's a trivial task to determine - * the xyz coordinates of any subsequent points entered for this polygon - * -- since all points on the polygon are, by our definition, coplanar. - */ - -#define mag(v) sqrt( v.x * v.x + v.y * v.y + v.z * v.z ) - -void -ComputePlaneEquation (p) -polygon_t *p; -{ - - VPoint a, b; - register double length; - - VSetPoint (a, - p->point[0].point.x - p->point[1].point.x, - p->point[0].point.y - p->point[1].point.y, - p->point[0].point.z - p->point[1].point.z); - - VSetPoint (b, - p->point[2].point.x - p->point[1].point.x, - p->point[2].point.y - p->point[1].point.y, - p->point[2].point.z - p->point[1].point.z); - - VCrossProd (&a, &b, &(p->normal)); - - length = mag(p->normal); - p->normal.x /= length; - p->normal.y /= length; - p->normal.z /= length; - - p->d = - VDotProd (&p->normal, &p->point[1].point); - p->origin = p->point[1].point; -} - -void -DisplayPoint(p) -point_t *p; -{ - char value[64]; - - sprintf (value, "%f", p->point.x); - XmTextFieldSetString (x_field, value); - sprintf (value, "%f", p->point.y); - XmTextFieldSetString (y_field, value); - sprintf (value, "%f", p->point.z); - XmTextFieldSetString (z_field, value); -} - -polygon_t * -AllocPolygon () -{ - register int i, n; - register polygon_t *tmp; - - for (i=0; i < polygon_max; ++i) { - if (polygon_list[i].num_points == 0) { - polygon_list[i].next = -1; - return &polygon_list[i]; - } - } - - n = polygon_max * 2; - - if ((tmp = (polygon_t *) malloc (n * sizeof (polygon_t))) == NULL) - return (polygon_t *) NULL; - - bcopy ((char *) polygon_list, (char *) tmp, - polygon_max * sizeof (polygon_t)); - - for (i = polygon_max; i < n; ++i) { - tmp[i].next = tmp[i].num_points = 0; - tmp[i].id = i; - } - - polygon_max = n; - free ((char *) polygon_list); - polygon_list = tmp; -} - -void -FreePolygon (p) -polygon_t *p; -{ - p->num_points = 0; - if (p->point != tmp_point) - free ((char *) p->point); -} - -polygon_t * -BeginPolygon () -{ - - register polygon_t *p; - - if ((p = AllocPolygon()) == (polygon_t *) NULL) { - fprintf (stderr, "out of memory\n"); - exit (1); - } - - p->num_points = 0; - p->point = tmp_point; - cur_polygon = p; - - return p; -} - -void PointXY (w, p, x, y, q) -Widget w; -view_info_t *p; -int x, y; -point_t *q; -{ - switch (p->layout) { - - case VL_NXZ: - q->x = x; - q->y = p->other_view->origin_y; - q->z = y; - q->point.x = - (x - p->origin_x) * pixel_scale; - q->point.y = 0.0; - q->point.z = (y - p->origin_y) * pixel_scale; - break; - - case VL_NXNY: - q->x = x; - q->y = y; - q->z = p->other_view->origin_y; - q->point.x = - (x - p->origin_x) * pixel_scale; - q->point.y = - (y - p->origin_y) * pixel_scale; - q->point.z = 0.0; - break; - - case VL_NYZ: - q->x = p->other_view->origin_y; - q->y = x; - q->z = y; - q->point.x = 0.0; - q->point.y = - (x - p->origin_x) * pixel_scale; - q->point.z = (y - p->origin_y) * pixel_scale; - break; - - case VL_NYX: - q->x = y; - q->y = x; - q->z = p->other_view->origin_y; - q->point.x = (y - p->origin_y) * pixel_scale; - q->point.y = -(x - p->origin_x) * pixel_scale; - q->point.z = 0.0; - break; - - default: - printf ("oops\n"); - } - -} - -int -PinPoint (w, p, poly, x, y, pt, opt) -Widget w; -view_info_t *p; -polygon_t *poly; -int x, y; -XPoint *pt, *opt; -{ - - view_info_t *p1; - point_t *q, *oq; - int z; - Boolean plane_established; - - if (poly->num_points == 0) - oq = (point_t *) NULL; - else - oq = &poly->point[poly->num_points-1]; - - q = &poly->point[poly->num_points++]; - - plane_established = (poly->num_points > 3) ? True : False; - - switch (p->layout) { - - case VL_NXZ: - if (oq != (point_t *) NULL) { - pt->x = opt->x = oq->x; - pt->y = oq->z; - opt->y = oq->y; - q->y = oq->y; - } - else { - q->y = p->other_view->origin_y; - } - - q->x = x; - q->z = y; - z = q->y; - q->point.x = - (x - p->origin_x) * pixel_scale; - q->point.z = (y - p->origin_y) * pixel_scale; - - switch (p->other_view->layout) { - - case VL_NXNY: - if (plane_established) { - q->point.y = - (poly->normal.x * q->point.x + - poly->normal.z * q->point.z + poly->d) / - poly->normal.y; - z = q->y = - q->point.y / pixel_scale + - p->other_view->origin_y; - } - else - q->point.y = - (q->y - p->other_view->origin_y)* - pixel_scale; - break; - - case VL_NXY: - if (plane_established) { - q->point.y = - (poly->normal.x * q->point.x + - poly->normal.z * q->point.z + poly->d) / - poly->normal.y; - z = q->y = q->point.y / pixel_scale + - p->other_view->origin_y; - } - else - q->point.y = (q->y - p->other_view->origin_y) * - pixel_scale; - break; - } - - break; - - case VL_NXNY: - if (oq != (point_t *) NULL) { - pt->x = opt->x = oq->x; - pt->y = oq->y; - opt->y = oq->z; - q->z = oq->z; - } - else { - q->z = p->other_view->origin_y; - } - - q->x = x; - q->y = y; - z = q->z; - q->point.x = - (x - p->origin_x) * pixel_scale; - q->point.y = - (y - p->origin_y) * pixel_scale; - - switch (p->other_view->layout) { - - case VL_NXNZ: - if (plane_established) { - q->point.z = - (poly->normal.x * q->point.x + - poly->normal.y * q->point.y + poly->d) / - poly->normal.z; - z = q->z = q->point.z / pixel_scale + - p->other_view->origin_y; - } - else - q->point.z = - (q->z - p->other_view->origin_y)* - pixel_scale; - break; - - case VL_NXZ: - if (plane_established) { - q->point.z = - (poly->normal.x * q->point.x + - poly->normal.y * q->point.y + poly->d) / - poly->normal.z; - z = q->z = q->point.z / pixel_scale + - p->other_view->origin_y; - } - else - q->point.z = (q->z - p->other_view->origin_y) * - pixel_scale; - break; - } - - break; - - case VL_NYZ: - if (oq != (point_t *) NULL) { - pt->x = opt->x = oq->y; - pt->y = oq->z; - opt->y = oq->x; - q->x = oq->x; - } - else { - q->x = p->other_view->origin_y; - } - - q->y = x; - q->z = y; - z = q->x; - q->point.y = - (x - p->origin_x) * pixel_scale; - q->point.z = (y - p->origin_y) * pixel_scale; - - switch (p->other_view->layout) { - - case VL_NYX: - if (plane_established) { - q->point.x = - (poly->normal.y * q->point.y + - poly->normal.z * q->point.z + poly->d) / - poly->normal.x; - z = q->x = q->point.x / pixel_scale + - p->other_view->origin_y; - } - else - q->point.x = (q->x - p->other_view->origin_y) * - pixel_scale; - break; - - case VL_NYNX: - if (plane_established) { - q->point.x = - (poly->normal.y * q->point.y + - poly->normal.z * q->point.z + poly->d) / - poly->normal.x; - z = q->x = - q->point.x / pixel_scale + - p->other_view->origin_y; - } - else - q->point.x = -(q->x - p->other_view->origin_y)* - pixel_scale; - break; - } - - break; - - case VL_NYX: - if (oq != (point_t *) NULL) { - pt->x = opt->x = oq->y; - pt->y = oq->x; - opt->y = oq->z; - q->z = oq->z; - } - else { - q->z = p->other_view->origin_y; - } - - q->x = y; - q->y = x; - z = q->z; - q->point.x = - (y - p->origin_x) * pixel_scale; - q->point.y = (x - p->origin_y) * pixel_scale; - - switch (p->other_view->layout) { - - case VL_NYZ: - if (plane_established) { - q->point.z = - (poly->normal.x * q->point.x + - poly->normal.y * q->point.y + poly->d) / - poly->normal.z; - z = q->z = q->point.z / pixel_scale + - p->other_view->origin_y; - } - else - q->point.z = (q->z - p->other_view->origin_y)* - pixel_scale; - break; - - case VL_NYNZ: - if (plane_established) { - q->point.z = - (poly->normal.x * q->point.x + - poly->normal.y * q->point.y + poly->d) / - poly->normal.z; - z = q->z = - q->point.z / pixel_scale + - p->other_view->origin_y; - } - else - q->point.z = - (q->z - p->other_view->origin_y)* - pixel_scale; - break; - } - - break; - } - - DisplayPoint (q); - - return z; - -} - -int -DragPoint (w, p, poly, delta, pt, opt) -Widget w; -view_info_t *p; -polygon_t *poly; -int delta; -XPoint *pt, *opt; -{ - - view_info_t *p1; - point_t *q, *oq; - int z; - - if (poly->num_points == 1) - oq = (point_t *) NULL; - else - oq = &poly->point[poly->num_points-2]; - - q = &poly->point[poly->num_points-1]; - - switch (p->layout) { - - case VL_NXZ: - if (oq != (point_t *) NULL) { - pt->x = opt->x = oq->x; - pt->y = oq->z; - opt->y = oq->y; - } - - switch (p->other_view->layout) { - - case VL_NXNY: - q->y = drag_origin.y + delta; - q->point.y = - (q->y - p->other_view->origin_y) * - pixel_scale; - break; - - case VL_NXY: - q->y = drag_origin.y + delta; - q->point.y = (q->y - p->other_view->origin_y) * - pixel_scale; - break; - } - - z = q->y; - - break; - - case VL_NXNY: - if (oq != (point_t *) NULL) { - pt->x = opt->x = oq->x; - pt->y = oq->y; - opt->y = oq->z; - } - - switch (p->other_view->layout) { - - case VL_NXNZ: - q->z = drag_origin.y + delta; - q->point.z = - (q->z - p->other_view->origin_y) * - pixel_scale; - break; - - case VL_NXZ: - q->z = drag_origin.y + delta; - q->point.z = (q->z - p->other_view->origin_y) * - pixel_scale; - break; - } - - z = q->z; - - break; - - case VL_NYX: - if (oq != (point_t *) NULL) { - pt->x = opt->x = oq->y; - pt->y = oq->x; - opt->y = oq->z; - } - - switch (p->other_view->layout) { - - case VL_NYNZ: - q->z = drag_origin.y + delta; - q->point.z = - (q->z - p->other_view->origin_y) * - pixel_scale; - break; - - case VL_NYZ: - q->z = drag_origin.y + delta; - q->point.x = (q->z - p->other_view->origin_y) * - pixel_scale; - break; - } - - z = q->z; - - break; - - case VL_NYZ: - if (oq != (point_t *) NULL) { - pt->x = opt->x = oq->y; - pt->y = oq->z; - opt->y = oq->x; - } - - switch (p->other_view->layout) { - - case VL_NYNX: - q->x = drag_origin.y + delta; - q->point.x = - (q->x - p->other_view->origin_y) * - pixel_scale; - break; - - case VL_NYX: - q->x = drag_origin.y + delta; - q->point.x = (q->x - p->other_view->origin_y) * - pixel_scale; - break; - } - - z = q->x; - - break; - } - - DisplayPoint (q); - - return z; - -} - -void -BeginPolygonPoint (w, p, x, y) -Widget w; -view_info_t *p; -int x, y; -{ - - int z; - Display *dpy; - Drawable w1, w2; - XPoint last, last_other; - polygon_t *poly; - - dpy = XtDisplay (w); - w1 = XtWindow (w); - w2 = XtWindow (p->other_widget); - - if (cur_polygon == NULL) - BeginPolygon (); - - poly = cur_polygon; - - drag_origin.x = x; - drag_origin.y = y; - XSetFunction (dpy, p->gc, GXxor); - XSetForeground (dpy, p->gc, app_data.select_pixel); - XSetLineAttributes (dpy, p->gc, app_data.selection_thickness, LineSolid, - CapButt, JoinMiter); - - XFillRectangle (dpy, w1, p->gc, - x + app_data.box_offset, y + app_data.box_offset, - app_data.box_size, app_data.box_size); - z = PinPoint (w, p, poly, x, y, &last, &last_other); - XFillRectangle (dpy, w2, p->gc, - x + app_data.box_offset, z + app_data.box_offset, - app_data.box_size, app_data.box_size); - - if (poly->num_points > 1) { - XDrawLine (dpy, w1, p->gc, last.x, last.y, x, y); - XDrawLine (dpy, w2, p->gc, last_other.x, last_other.y, x, z); - rubber_lines[0].x1 = last.x; - rubber_lines[0].y1 = last.y; - rubber_lines[0].x2 = x; - rubber_lines[0].y2 = y; - rubber_lines[1].x1 = last_other.x; - rubber_lines[1].y1 = last_other.y; - } - rubber_lines[1].x2 = x; - rubber_lines[1].y2 = z; - XSetFunction (dpy, p->gc, GXcopy); - -} - -void -DragPolygonPoint(w, p, x, y) -Widget w; -view_info_t *p; -int x, y; -{ - int z, nx, delta; - Display *dpy; - Drawable w1, w2; - XPoint last, last_other; - polygon_t *poly; - - dpy = XtDisplay (w); - w1 = XtWindow (w); - w2 = XtWindow (p->other_widget); - - poly = cur_polygon; - -/* - * We don't drag points once the polygon's plane is determined. - */ - - if (poly->num_points > 3) - return; - -/* - * Erase old stuff - */ - XSetFunction (dpy, p->other_view->gc, GXxor); - XFillRectangle (dpy, w2, p->other_view->gc, - rubber_lines[1].x2 + app_data.box_offset, - rubber_lines[1].y2 + app_data.box_offset, - app_data.box_size, app_data.box_size); - if (poly->num_points > 1) { - XDrawSegments (dpy, w2, p->other_view->gc, - &rubber_lines[1], 1); - } - -/* - * Draw new line/point - */ - - delta = y - drag_origin.y; - nx = rubber_lines[1].x2; - z = DragPoint (w, p, poly, delta, &last, &last_other); - XFillRectangle (dpy, w2, p->other_view->gc, - nx + app_data.box_offset, z + app_data.box_offset, - app_data.box_size, app_data.box_size); - - if (poly->num_points > 1) { - XDrawLine (dpy, w2, p->other_view->gc, - last_other.x, last_other.y, nx, z); - } - rubber_lines[1].y2 = z; - - XSetFunction (dpy, p->other_view->gc, GXcopy); -} - -void -CompletePolygonPoint(w, p, x, y) -Widget w; -view_info_t *p; -int x, y; -{ - if (cur_polygon) - if (cur_polygon->num_points == 3) - ComputePlaneEquation (cur_polygon); -} - -void -CompletePolygon (w, p) -Widget w; -polygon_t *p; -{ - - register point_t *points; - view_info_t *q; - - XtVaGetValues (w, - XmNuserData, &q, - NULL); - - if (p == (polygon_t *) NULL) - return; - - if (p->num_points < 3) { - p->num_points = 0; - return; - } - - points = (point_t *) malloc (p->num_points * sizeof(point_t)); - - bcopy ((char *) tmp_point, (char *) points, - p->num_points * sizeof (point_t)); - - p->point = points; - -/* - * Add this polygon to the selected list. - */ - - p->next = sel_polygon; - sel_polygon = p->id; - cur_polygon = (polygon_t *) NULL; - -#ifdef notdef - DrawPolygon (w, p, True); - DrawPolygon (q->other_widget, p, True); -#endif - DrawWidget (w, False); - DrawWidget (q->other_widget, False); - -} - -int -PolygonProximity (p, poly, x, y) -view_info_t *p; -polygon_t *poly; -int x, y; { - - register long i, min_distance, d; - int xp, yp; - - min_distance = 0x3fffffff; - - for (i=0; i < poly->num_points; ++ i) { - WorldToWidget (p, &poly->point[i], &xp, &yp); - xp -= x; - yp -= y; - d = (int) sqrt ((double) (xp * xp + yp * yp)); - if (d < min_distance) { - min_distance = d; - } - } - - return min_distance; -} - -int -PickObject (p, x, y) -view_info_t *p; -int x, y; { - - register int i, dist, d, id = -1; - - dist = 0x3fffffff; - - for (i=0; i < polygon_max; ++i) { - if (polygon_list[i].num_points == 0) - continue; - if ((d = PolygonProximity (p, &polygon_list[i], x, y)) < dist) { - dist = d; - id = i; - } - } - - if (dist < app_data.pick_sensitivity) - return id; - else - return -1; -} - -void -CompleteMarker(w, p, x, y) -Widget w; -view_info_t *p; -int x, y; -{ - if (cur_polygon) { - marker_list[current_marker].defined = True; - marker_list[current_marker].location = cur_polygon->point[0]; - cur_polygon = NULL; - DrawWidget (w, False); - DrawWidget (p->other_widget, False); - } -} - -void -BeginPick (w, p, x, y, extend) -Widget w; -view_info_t *p; -int x, y; -Boolean extend; -{ - - register int id, last, i; - - id = PickObject (p, x, y); - - if (extend) { - if (id >= 0) { - SelectObject (id); - } - } - else { - if (id == -1) { - if (sel_polygon >= 0) { - for (i=sel_polygon; i >= 0; i = polygon_list[i].next) - last = i; - polygon_list[last].next = unsel_polygon; - unsel_polygon = sel_polygon; - sel_polygon = -1; - } - } - else if (sel_polygon >= 0) { - drag_origin.x = x; - drag_origin.y = y; - drag_mode = True; - } - else { - SelectObject (id); - } - } - - DrawWidget (w, False); - DrawWidget (p->other_widget, False); -} - -void -DragSelection (w, p, x, y) -Widget w; -view_info_t *p; -int x, y; -{ - register int dx, dy, i, j; - point_t q; - polygon_t *poly; - - dx = x - drag_origin.x + p->origin_x; - dy = y - drag_origin.y + p->origin_y; - drag_origin.x = x; - drag_origin.y = y; - - PointXY (w, p, dx, dy, &q); - - for (i=sel_polygon; i >= 0; i = polygon_list[i].next) - DrawSelectedPolygon (w, &polygon_list[i], True, True); - - for (i=sel_polygon; i >= 0; i = polygon_list[i].next) { - poly = &polygon_list[i]; - for (j=0; jnum_points; ++j) { - poly->point[j].point.x += q.point.x; - poly->point[j].point.y += q.point.y; - poly->point[j].point.z += q.point.z; - PointToXYZ (p, &poly->point[j]); - } - DrawSelectedPolygon (w, poly, True, False); - } - -} - -void -CompleteDrag (w, p, x, y) -Widget w; -view_info_t *p; -int x, y; -{ - drag_mode = False; - DrawWidget (w, False); - DrawWidget (p->other_widget, False); -} - -void -SelectObject (id) -int id; -{ - register int i, last; - - if (unsel_polygon == -1) { - polygon_list[id].next = sel_polygon; - sel_polygon = id; - return; - } - - if (unsel_polygon == id) { - unsel_polygon = polygon_list[id].next; - polygon_list[id].next = sel_polygon; - sel_polygon = id; - return; - } - - last = unsel_polygon; - for (i=polygon_list[unsel_polygon].next; i >= 0; - i = polygon_list[i].next) { - if (i == id) { - polygon_list[last].next = polygon_list[id].next; - polygon_list[id].next = sel_polygon; - sel_polygon = id; - return; - } - last = i; - } - -} - -void -DetermineObjectExtent (extent) -VPoint *extent; -{ - - VPoint min, max; - register int i, j; - polygon_t *poly; - - min.x = min.y = min.z = 10000000.0; - max.x = max.y = max.z = -10000000.0; - - for (i=0; i < polygon_max; ++i) { - if (polygon_list[i].num_points == 0) - continue; - poly = &polygon_list[i]; - for (j=0; jnum_points; ++j) { - if (poly->point[j].point.x > max.x) - max.x = poly->point[j].point.x; - if (poly->point[j].point.y > max.y) - max.y = poly->point[j].point.y; - if (poly->point[j].point.z > max.z) - max.z = poly->point[j].point.z; - if (poly->point[j].point.x < min.x) - min.x = poly->point[j].point.x; - if (poly->point[j].point.y < min.y) - min.y = poly->point[j].point.y; - if (poly->point[j].point.z < min.z) - min.z = poly->point[j].point.z; - } - } - - extent->x = max.x - min.x; - extent->y = max.y - min.y; - extent->z = max.z - min.z; -} - -void -RescaleObject (factor) -double factor; -{ - - register int i, j; - polygon_t *poly; - - for (i=0; i < polygon_max; ++i) { - if (polygon_list[i].num_points == 0) - continue; - poly = &polygon_list[i]; - for (j=0; jnum_points; ++j) { - poly->point[j].point.x *= factor; - poly->point[j].point.y *= factor; - poly->point[j].point.z *= factor; - } - } - - for (i=0; i < marker_count; ++i) { - if (marker_list[i].defined) { - marker_list[i].location.point.x *= factor; - marker_list[i].location.point.y *= factor; - marker_list[i].location.point.z *= factor; - } - } - - RescaleView (twindow, 1.0); -} diff -Nru acm-5.0/gedit/hand_32.xbm acm-6.0+20200416/gedit/hand_32.xbm --- acm-5.0/gedit/hand_32.xbm 1993-12-28 14:26:04.000000000 +0000 +++ acm-6.0+20200416/gedit/hand_32.xbm 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ -#define hand_32_width 32 -#define hand_32_height 32 -static char hand_32_bits[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0x80, 0x00, 0xd0, - 0x00, 0xa0, 0x01, 0x50, 0x00, 0xf0, 0x00, 0x30, 0x00, 0xd8, 0x00, 0x6e, - 0x00, 0x70, 0x00, 0x7f, 0x00, 0x7c, 0x80, 0x3f, 0x00, 0x6a, 0xc0, 0x1f, - 0x00, 0x27, 0x60, 0x0e, 0x00, 0x33, 0xf0, 0x01, 0x80, 0x1f, 0x38, 0x03, - 0x00, 0x11, 0xfa, 0xc0, 0xc0, 0x8f, 0x06, 0xd0, 0x00, 0x98, 0x3b, 0x1e, - 0x40, 0x70, 0xfc, 0x4b, 0x20, 0x07, 0xe8, 0xe6, 0xa0, 0xf9, 0x7f, 0xfa, - 0x60, 0xc0, 0xfe, 0xff, 0x70, 0x03, 0xa4, 0xaf, 0xf0, 0x3f, 0xde, 0x67, - 0xf0, 0x08, 0xbe, 0x7f, 0x30, 0x86, 0xff, 0x7f, 0x38, 0x0d, 0x20, 0x19, - 0xf8, 0xee, 0xf8, 0x07, 0xf8, 0x00, 0xec, 0x07, 0x5c, 0x80, 0x74, 0x02, - 0xfc, 0x7f, 0x8e, 0x01, 0x9c, 0x7f, 0x0c, 0x01, 0x7a, 0x80, 0x07, 0x00, - 0x06, 0x87, 0x7f, 0x00, 0xed, 0xb0, 0x0d, 0x00}; diff -Nru acm-5.0/gedit/hand_64.xbm acm-6.0+20200416/gedit/hand_64.xbm --- acm-5.0/gedit/hand_64.xbm 1991-11-22 21:25:29.000000000 +0000 +++ acm-6.0+20200416/gedit/hand_64.xbm 1970-01-01 00:00:00.000000000 +0000 @@ -1,46 +0,0 @@ -#define hand_width 64 -#define hand_height 64 -static char hand_bits[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0xd8, - 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0xe8, - 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x78, 0x01, 0x00, 0x80, 0xae, - 0x00, 0x00, 0x00, 0xec, 0x01, 0x00, 0x80, 0xbb, 0x00, 0x00, 0x00, 0x75, - 0x01, 0x00, 0xe0, 0x66, 0x00, 0x00, 0x00, 0xd7, 0x00, 0x00, 0xa0, 0xad, - 0x00, 0x00, 0x80, 0xed, 0x01, 0x00, 0x78, 0xeb, 0x00, 0x00, 0xc0, 0x5b, - 0x00, 0x00, 0xd4, 0x36, 0x00, 0x00, 0xc0, 0xf6, 0x00, 0x00, 0xbe, 0x2d, - 0x00, 0x00, 0xa0, 0xb5, 0x00, 0x00, 0x57, 0x15, 0x00, 0x00, 0xe0, 0x6a, - 0x00, 0x00, 0xab, 0x07, 0x00, 0x00, 0xd8, 0x35, 0x00, 0xc0, 0x5d, 0x05, - 0x00, 0x00, 0x3c, 0x5d, 0x00, 0xc0, 0xea, 0x02, 0x00, 0x00, 0xec, 0x36, - 0x00, 0x70, 0x57, 0x01, 0x00, 0x00, 0x96, 0x1a, 0x00, 0xa8, 0x75, 0x00, - 0x00, 0x00, 0xbd, 0x0e, 0x00, 0xbe, 0x5e, 0x00, 0x00, 0x00, 0xa7, 0x06, - 0x00, 0xaa, 0x15, 0x00, 0x00, 0x00, 0xad, 0x05, 0x80, 0x57, 0x0b, 0x00, - 0x00, 0x80, 0x4b, 0x03, 0x40, 0x55, 0x05, 0x00, 0x00, 0x40, 0x55, 0x03, - 0x60, 0xad, 0x05, 0x80, 0x00, 0xc0, 0xd5, 0x02, 0xb8, 0x55, 0x01, 0xe0, - 0x00, 0xa0, 0xab, 0x01, 0x6c, 0x75, 0x00, 0xf8, 0x00, 0xe0, 0x6a, 0x01, - 0xdb, 0x56, 0x00, 0xff, 0x00, 0x50, 0xd5, 0xc0, 0xb6, 0x2a, 0x80, 0x5b, - 0x00, 0xf0, 0xfa, 0xa0, 0x5b, 0x0f, 0xf0, 0xfd, 0x00, 0xa8, 0xca, 0x6b, - 0x6d, 0x05, 0x5e, 0xab, 0x00, 0xb0, 0x7a, 0xdd, 0xd5, 0x4a, 0xb5, 0x76, - 0x00, 0xb8, 0xaa, 0xb7, 0x5a, 0xdf, 0xef, 0xba, 0x00, 0xb4, 0xde, 0x6a, - 0xb5, 0x7d, 0x99, 0xed, 0x00, 0xac, 0xb5, 0xaa, 0xea, 0xd6, 0xb6, 0xfe, - 0x00, 0xba, 0xaa, 0xb6, 0xdd, 0xaf, 0xd5, 0xbd, 0x00, 0x6c, 0x6b, 0x55, - 0x55, 0xb5, 0x6e, 0x77, 0x00, 0xde, 0xaa, 0x6a, 0xbb, 0xab, 0xfa, 0xdd, - 0x00, 0xb4, 0xaa, 0xda, 0x56, 0xdd, 0x5f, 0xf7, 0x00, 0x6e, 0x55, 0xad, - 0xea, 0xb6, 0xba, 0xba, 0x00, 0xb5, 0xad, 0xaa, 0x9a, 0xee, 0xd7, 0x6e, - 0x80, 0x5e, 0xab, 0xd5, 0x6a, 0xb5, 0x5a, 0xdb, 0x00, 0x77, 0x55, 0xad, - 0x56, 0xdb, 0xb5, 0x36, 0x80, 0xad, 0xaa, 0x6a, 0xa9, 0xb6, 0xd6, 0x6f, - 0x80, 0xdf, 0xea, 0xaa, 0x56, 0x6d, 0xfd, 0x35, 0x80, 0xba, 0xad, 0x56, - 0xb5, 0xea, 0x7f, 0x2f, 0x80, 0xaf, 0xb6, 0x6a, 0x55, 0x55, 0xd7, 0x1d, - 0x40, 0xfb, 0x6d, 0xd5, 0x56, 0xf5, 0xbd, 0x16, 0xc0, 0xad, 0x5b, 0xaa, - 0xaa, 0xae, 0x6b, 0x0b, 0x80, 0x7f, 0x55, 0x55, 0x5b, 0x59, 0xd7, 0x07, - 0xc0, 0xd5, 0x56, 0xd4, 0x6a, 0xd7, 0xbd, 0x00, 0x40, 0xbf, 0x4a, 0x55, - 0x55, 0xa9, 0xd6, 0x10, 0xc0, 0xd7, 0xaa, 0xaa, 0xda, 0xd6, 0x1d, 0x02, - 0xe0, 0xad, 0xaa, 0x56, 0xab, 0x5a, 0x2b, 0x00, 0xf0, 0xbb, 0xaa, 0xea, - 0xba, 0xb5, 0x8e, 0x00, 0x50, 0x55, 0x55, 0x55, 0x55, 0xad, 0x15, 0x00, - 0xf0, 0x57, 0x55, 0xb5, 0xd6, 0x6a, 0x03, 0x00, 0xb8, 0xac, 0xaa, 0xaa, - 0x55, 0xab, 0x86, 0x00, 0x78, 0x6b, 0x55, 0xb5, 0xda, 0xaa, 0x01, 0x00, - 0xa8, 0x5a, 0x55, 0x55, 0x57, 0x75, 0x11, 0x00, 0x6c, 0x95, 0xaa, 0x6a, - 0xb5, 0xaa, 0x00, 0x00, 0xd4, 0x56, 0x49, 0x55, 0xab, 0x2a, 0x00, 0x00, - 0xbc, 0x2a, 0xb5, 0x6a, 0x5d, 0x15, 0x00, 0x00, 0xa6, 0x52, 0x55, 0xd5, - 0x56, 0x03, 0x00, 0x00, 0xdb, 0x56, 0x2a, 0x6d, 0xdb, 0x00, 0x00, 0x00, - 0xb7, 0xaa, 0xaa, 0xba, 0x05, 0x08, 0x00, 0x00}; diff -Nru acm-5.0/gedit/install-sh acm-6.0+20200416/gedit/install-sh --- acm-5.0/gedit/install-sh 1998-08-10 02:28:01.000000000 +0000 +++ acm-6.0+20200416/gedit/install-sh 1970-01-01 00:00:00.000000000 +0000 @@ -1,238 +0,0 @@ -#! /bin/sh -# -# install - install a program, script, or datafile -# This comes from X11R5. -# -# Calling this script install-sh is preferred over install.sh, to prevent -# `make' implicit rules from creating a file called install from it -# when there is no Makefile. -# -# This script is compatible with the BSD install script, but was written -# from scratch. -# - - -# set DOITPROG to echo to test this script - -# Don't use :- since 4.3BSD and earlier shells don't like it. -doit="${DOITPROG-}" - - -# put in absolute paths if you don't have them in your path; or use env. vars. - -mvprog="${MVPROG-mv}" -cpprog="${CPPROG-cp}" -chmodprog="${CHMODPROG-chmod}" -chownprog="${CHOWNPROG-chown}" -chgrpprog="${CHGRPPROG-chgrp}" -stripprog="${STRIPPROG-strip}" -rmprog="${RMPROG-rm}" -mkdirprog="${MKDIRPROG-mkdir}" - -tranformbasename="" -transform_arg="" -instcmd="$mvprog" -chmodcmd="$chmodprog 0755" -chowncmd="" -chgrpcmd="" -stripcmd="" -rmcmd="$rmprog -f" -mvcmd="$mvprog" -src="" -dst="" -dir_arg="" - -while [ x"$1" != x ]; do - case $1 in - -c) instcmd="$cpprog" - shift - continue;; - - -d) dir_arg=true - shift - continue;; - - -m) chmodcmd="$chmodprog $2" - shift - shift - continue;; - - -o) chowncmd="$chownprog $2" - shift - shift - continue;; - - -g) chgrpcmd="$chgrpprog $2" - shift - shift - continue;; - - -s) stripcmd="$stripprog" - shift - continue;; - - -t=*) transformarg=`echo $1 | sed 's/-t=//'` - shift - continue;; - - -b=*) transformbasename=`echo $1 | sed 's/-b=//'` - shift - continue;; - - *) if [ x"$src" = x ] - then - src=$1 - else - # this colon is to work around a 386BSD /bin/sh bug - : - dst=$1 - fi - shift - continue;; - esac -done - -if [ x"$src" = x ] -then - echo "install: no input file specified" - exit 1 -else - true -fi - -if [ x"$dir_arg" != x ]; then - dst=$src - src="" - - if [ -d $dst ]; then - instcmd=: - else - instcmd=mkdir - fi -else - -# Waiting for this to be detected by the "$instcmd $src $dsttmp" command -# might cause directories to be created, which would be especially bad -# if $src (and thus $dsttmp) contains '*'. - - if [ -f $src -o -d $src ] - then - true - else - echo "install: $src does not exist" - exit 1 - fi - - if [ x"$dst" = x ] - then - echo "install: no destination specified" - exit 1 - else - true - fi - -# If destination is a directory, append the input filename; if your system -# does not like double slashes in filenames, you may need to add some logic - - if [ -d $dst ] - then - dst="$dst"/`basename $src` - else - true - fi -fi - -## this sed command emulates the dirname command -dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` - -# Make sure that the destination directory exists. -# this part is taken from Noah Friedman's mkinstalldirs script - -# Skip lots of stat calls in the usual case. -if [ ! -d "$dstdir" ]; then -defaultIFS=' -' -IFS="${IFS-${defaultIFS}}" - -oIFS="${IFS}" -# Some sh's can't handle IFS=/ for some reason. -IFS='%' -set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` -IFS="${oIFS}" - -pathcomp='' - -while [ $# -ne 0 ] ; do - pathcomp="${pathcomp}${1}" - shift - - if [ ! -d "${pathcomp}" ] ; - then - $mkdirprog "${pathcomp}" - else - true - fi - - pathcomp="${pathcomp}/" -done -fi - -if [ x"$dir_arg" != x ] -then - $doit $instcmd $dst && - - if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && - if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && - if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && - if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi -else - -# If we're going to rename the final executable, determine the name now. - - if [ x"$transformarg" = x ] - then - dstfile=`basename $dst` - else - dstfile=`basename $dst $transformbasename | - sed $transformarg`$transformbasename - fi - -# don't allow the sed command to completely eliminate the filename - - if [ x"$dstfile" = x ] - then - dstfile=`basename $dst` - else - true - fi - -# Make a temp file name in the proper directory. - - dsttmp=$dstdir/#inst.$$# - -# Move or copy the file name to the temp name - - $doit $instcmd $src $dsttmp && - - trap "rm -f ${dsttmp}" 0 && - -# and set any options; do chmod last to preserve setuid bits - -# If any of these fail, we abort the whole thing. If we want to -# ignore errors from any of these, just make sure not to ignore -# errors from the above "$doit $instcmd $src $dsttmp" command. - - if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && - if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && - if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && - if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && - -# Now rename the file to the real destination. - - $doit $rmcmd -f $dstdir/$dstfile && - $doit $mvcmd $dsttmp $dstdir/$dstfile - -fi && - - -exit 0 diff -Nru acm-5.0/gedit/io.c acm-6.0+20200416/gedit/io.c --- acm-5.0/gedit/io.c 1998-08-08 02:26:20.000000000 +0000 +++ acm-6.0+20200416/gedit/io.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,317 +0,0 @@ -/* - * Copyright (c) 1994, Riley Rainey, riley@netcon.com - * - * Permission to use, copy, modify and distribute (without charge) this - * software, documentation, images, etc. is granted, provided that this - * comment and the author's name is retained. - * - * This software is provided by the author as is, and without any expressed - * or implied warranties, including, but not limited to, the implied - * warranties of merchantability and fitness for a particular purpose. In no - * event shall the author be liable for any direct, indirect, incidental, or - * consequential damages arising in any way out of the use of this software. - */ - -#include -#include -#include -#include -#include "gedit.h" - -static char magic_header[] = { 'R', 'R', '1', '1', 0, 0, 0, 1 }; - -#define REVISION 1 - -int ReadObject(), WriteObject(); -extern polygon_t *AllocPolygon(); -extern void FreePolygon(), PointToXYZ(), InitializeDialogs(); - -void -ClearWorkspace (redisplay) -Boolean redisplay; -{ - - register int i; - - for (i=sel_polygon; i >= 0; i = polygon_list[i].next) - FreePolygon (&polygon_list[i]); - - sel_polygon = -1; - - for (i=unsel_polygon; i >= 0; i = polygon_list[i].next) - FreePolygon (&polygon_list[i]); - - unsel_polygon = -1; - - if (cur_polygon != NULL) - FreePolygon (cur_polygon); - - if (redisplay) { - DrawWidget (twindow, False); - DrawWidget (bwindow, False); - } - - for (i=0; i 4 && strcmp(&name[n-4], ".obj") == 0) { - } - - if ((f = fopen (name, "r")) == (FILE *) NULL) { - fprintf (stderr, "Unable to open %s\n", name); - return -1; - } - - ClearWorkspace (False); - - if (fread ((char *) magic, sizeof (magic), 1, f) != 1) { - } - - if (strncmp (magic, magic_header, 8) != 0) { - gedit_error ("That file does not appear to be\n\ -a gedit data file. It cannot be\n\ -edited by this program."); - return; - } - - if (fread ((char *) &revision, sizeof (revision), 1, f) != 1) { - } - - if (fread ((char *) &object_count, sizeof (object_count), 1, f) != 1) { - } - - if (fread ((char *) &scale, sizeof (scale), 1, f) != 1) { - } - - pixel_scale = scale; - - while (object_count-- > 0) { - ReadObject (f); - } - -/* - * Now try to read markers - */ - - if (fread ((char *) &object_count, sizeof (object_count), 1, f) == 1) { - while (object_count-- > 0) { - ReadMarker (f); - } - } - -/* - * Attempt to read the craft structure. - */ - - if (fread ((char *) &craft_name, sizeof (craft_name), 1, f) != 1) { - } - - if (fread ((char *) &c, sizeof (c), 1, f) == 1) { - craft_valid = 1; - c.name = craft_name; - InitializeDialogs (&c); - } - - fclose (f); - - DrawWidget (twindow, False); - DrawWidget (bwindow, False); - -} - -int -ReadObject (f) -FILE *f; -{ - - polygon_t poly, *p; - view_info_t *q; - register int i; - - fread ((char *) &poly, sizeof (poly), 1, f); - - XtVaGetValues (twindow, - XmNuserData, &q, - NULL); - - p = AllocPolygon (); - - p->normal = poly.normal; - p->origin = poly.origin; - p->d = poly.d; - p->num_points = poly.num_points; - p->point = (point_t *) malloc (poly.num_points * sizeof (point_t)); - - fread ((char *) p->point, sizeof (point_t), poly.num_points, f); - - for (i=0; i < p->num_points; ++i) - PointToXYZ (q, &p->point[i]); - - p->next = unsel_polygon; - unsel_polygon = p->id; - -} - -int -ReadMarker (f) -FILE *f; -{ - - marker_t m; - register int i; - - fread ((char *) &m, sizeof (m), 1, f); - - for (i=0; i= 0; i = polygon_list[i].next) { - p = &polygon_list[i]; - if (!(p->point[0].point.x == 0.0 && - p->point[0].point.y == 0.0 && - p->point[0].point.z == 0.0 && - p->point[1].point.x == 0.0 && - p->point[1].point.y == 0.0 && - p->point[1].point.z == 0.0)) - object_count ++; - } - - for (i=unsel_polygon; i >= 0; i = polygon_list[i].next){ - p = &polygon_list[i]; - if (!(p->point[0].point.x == 0.0 && - p->point[0].point.y == 0.0 && - p->point[0].point.z == 0.0 && - p->point[1].point.x == 0.0 && - p->point[1].point.y == 0.0 && - p->point[1].point.z == 0.0)) - object_count ++; - } - - if (fwrite ((char *) &object_count, sizeof (object_count), 1, f) != 1) { - } - - if (fwrite ((char *) &pixel_scale, sizeof (pixel_scale), 1, f) != 1) { - } - - for (i=sel_polygon; i >= 0; i = polygon_list[i].next) - WriteObject (f, &polygon_list[i]); - - for (i=unsel_polygon; i >= 0; i = polygon_list[i].next) - WriteObject (f, &polygon_list[i]); - - object_count = 0; - for (i=0; ipoint[0].point.x == 0.0 && - p->point[0].point.y == 0.0 && - p->point[0].point.z == 0.0 && - p->point[1].point.x == 0.0 && - p->point[1].point.y == 0.0 && - p->point[1].point.z == 0.0) { - return; - } - - fwrite ((char *) p, sizeof (polygon_t), 1, f); - - fwrite ((char *) p->point, sizeof (point_t), p->num_points, f); - -} - -int -WriteMarker (f, p) -FILE *f; -marker_t *p; -{ - - fwrite ((char *) p, sizeof (marker_t), 1, f); - -} - -int -gedit_error (s) -char *s; -{ - - fprintf (stderr, s); - return 0; -} - diff -Nru acm-5.0/gedit/Makefile.in acm-6.0+20200416/gedit/Makefile.in --- acm-5.0/gedit/Makefile.in 1998-08-10 02:53:33.000000000 +0000 +++ acm-6.0+20200416/gedit/Makefile.in 1970-01-01 00:00:00.000000000 +0000 @@ -1,46 +0,0 @@ -# The -I and -L flags should point to the most current V library. -# In this case, "../acmp/V/lib" is the directory that corresponds to -# the acm 3.0 sources. -# -# The "-systype bsd43" is a Mips-specific flag. -# -#CFLAGS = -g -I../acmp/V/lib -L../acmp/V/lib -#CFLAGS = -systype bsd43 -g -I../acmp/V/lib -L../acmp/V/lib - ACM = .. - srcdir = @srcdir@ - prefix = @prefix@ - bindir = $(prefix)/bin - VPATH = @srcdir@ - SHELL = /bin/sh - CC = @CC@ - SLIBS = @LIBS@ - INSTALL = @INSTALL@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_DATA = @INSTALL_DATA@ - -CFLAGS = -g -I$(ACM)/src -L$(ACM)/V/lib \ - -I$(srcdir)/../V/lib -I$(srcdir)/../src \ - -I$(ACM)/dis -I$(srcdir)/../dis -DHAVE_DIS -OBJS = gedit.o actions.o gutil.o gutil1.o gutil2.o \ - circle.o edit.o VWriteObject.o io.o dialog.o cell.o \ - CrExFormDlg.o - -gedit: $(OBJS) - rm -rf gedit - $(CC) $(CFLAGS) -o gedit $(OBJS) $(SLIBS) -lm - -clean: - rm -rf core *.o *~ gedit - -distclean: clean - rm -rf Makefile config.status config.log config.cache - -gedit.o: gedit.h -gutil.o: gedit.h -actions.o: gedit.h -gutil1.o: gedit.h -gutil2.o: gedit.h -edit.o: gedit.h -io.o: gedit.h -cell.o: cell.h gedit.h -dislog.o: cell.h gedit.h diff -Nru acm-5.0/gedit/marker.xbm acm-6.0+20200416/gedit/marker.xbm --- acm-5.0/gedit/marker.xbm 1992-06-24 17:25:48.000000000 +0000 +++ acm-6.0+20200416/gedit/marker.xbm 1970-01-01 00:00:00.000000000 +0000 @@ -1,46 +0,0 @@ -#define marker_width 64 -#define marker_height 64 -static char marker_bits[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x3f, - 0xfe, 0xff, 0xff, 0x07, 0xc0, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0x07, - 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff -Nru acm-5.0/gedit/origin_32.xbm acm-6.0+20200416/gedit/origin_32.xbm --- acm-5.0/gedit/origin_32.xbm 1992-10-30 19:29:37.000000000 +0000 +++ acm-6.0+20200416/gedit/origin_32.xbm 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ -#define origin_32_width 32 -#define origin_32_height 32 -static char origin_32_bits[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x03, 0x00, 0x10, 0x00, 0x03, - 0x00, 0x08, 0x00, 0x03, 0x00, 0x10, 0x00, 0x03, 0x00, 0x08, 0x00, 0x03, - 0x00, 0x10, 0x00, 0x03, 0x00, 0x08, 0x00, 0x03, 0x00, 0x10, 0x00, 0x03, - 0x00, 0x08, 0x00, 0x03, 0x00, 0x10, 0x00, 0x03, 0x00, 0x08, 0x00, 0x03, - 0x55, 0x55, 0x55, 0x17, 0xaa, 0xaa, 0xaa, 0x0b, 0x00, 0x10, 0x00, 0x03, - 0x00, 0x48, 0x00, 0x03, 0x00, 0x90, 0x01, 0x03, 0x00, 0x08, 0x22, 0x03, - 0x00, 0x10, 0x3c, 0x03, 0x00, 0x08, 0x70, 0x03, 0x00, 0x10, 0x78, 0x03, - 0x00, 0x08, 0x00, 0x03, 0xe0, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, - 0x00, 0x10, 0x00, 0x03, 0x00, 0x08, 0x00, 0x03, 0x00, 0x10, 0x00, 0x03, - 0x00, 0x08, 0x00, 0x03, 0x00, 0x10, 0x00, 0x03, 0x00, 0x08, 0x00, 0x03, - 0x00, 0x10, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00}; diff -Nru acm-5.0/gedit/origin_64.xbm acm-6.0+20200416/gedit/origin_64.xbm --- acm-5.0/gedit/origin_64.xbm 1992-10-21 19:55:40.000000000 +0000 +++ acm-6.0+20200416/gedit/origin_64.xbm 1970-01-01 00:00:00.000000000 +0000 @@ -1,46 +0,0 @@ -#define origin_width 64 -#define origin_height 64 -static char origin_bits[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, - 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x00, - 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x0e, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x80, 0x02, - 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x00, - 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x0e, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x80, 0x02, - 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x00, - 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x0e, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x80, 0x02, - 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x00, - 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x0e, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xae, 0x02, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x5f, 0x01, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xae, 0x02, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x0e, 0x00, - 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x80, 0xf2, - 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x0e, 0x00, - 0x00, 0x00, 0x80, 0x82, 0x07, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x0e, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x80, 0x02, 0x1c, 0x00, 0x0e, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x70, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x80, 0x02, - 0xe0, 0x10, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x13, 0x0e, 0x00, - 0x00, 0x00, 0x80, 0x02, 0x00, 0x3f, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x38, 0x0e, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x7e, 0x0e, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x7e, 0x0e, 0x00, 0x00, 0x00, 0x80, 0x02, - 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x00, - 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0xfc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x7f, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x80, 0x02, - 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x00, - 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x0e, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x80, 0x02, - 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x00, - 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x0e, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x80, 0x02, - 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff -Nru acm-5.0/gedit/polygon_32.xbm acm-6.0+20200416/gedit/polygon_32.xbm --- acm-5.0/gedit/polygon_32.xbm 1992-10-30 19:31:53.000000000 +0000 +++ acm-6.0+20200416/gedit/polygon_32.xbm 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ -#define polygon_32_width 32 -#define polygon_32_height 32 -static char polygon_32_bits[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xe0, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, 0x3c, - 0x40, 0x03, 0x00, 0x12, 0x40, 0x04, 0x80, 0x11, 0x40, 0x08, 0x40, 0x10, - 0x20, 0x10, 0x30, 0x10, 0x20, 0x60, 0x08, 0x20, 0x20, 0x80, 0x07, 0x20, - 0x20, 0x80, 0x03, 0x20, 0x20, 0x80, 0x03, 0x20, 0x20, 0x00, 0x00, 0x20, - 0x20, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x20, - 0x10, 0x00, 0x00, 0x20, 0x10, 0x00, 0x00, 0x20, 0x10, 0x00, 0x00, 0x20, - 0x38, 0x00, 0x00, 0x40, 0xf8, 0x00, 0x00, 0x40, 0x38, 0x3f, 0x00, 0x40, - 0x00, 0xc0, 0x1f, 0x40, 0x00, 0x00, 0xe0, 0xe7, 0x00, 0x00, 0x00, 0xf8, - 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff -Nru acm-5.0/gedit/polygon_64.xbm acm-6.0+20200416/gedit/polygon_64.xbm --- acm-5.0/gedit/polygon_64.xbm 1991-11-21 16:01:05.000000000 +0000 +++ acm-6.0+20200416/gedit/polygon_64.xbm 1970-01-01 00:00:00.000000000 +0000 @@ -1,46 +0,0 @@ -#define polygon_width 64 -#define polygon_height 64 -static char polygon_bits[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x07, 0x00, 0x7c, 0x00, 0x00, - 0x00, 0x00, 0xc0, 0x07, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x07, - 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x07, 0x00, 0x7c, 0x00, 0x00, - 0x00, 0x00, 0xe0, 0x07, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x38, 0x03, - 0x00, 0xb8, 0x01, 0x00, 0x00, 0x00, 0x1c, 0x03, 0x00, 0x18, 0x07, 0x00, - 0x00, 0x00, 0x06, 0x03, 0x00, 0x18, 0x0e, 0x00, 0x00, 0x80, 0x03, 0x03, - 0x00, 0x18, 0x38, 0x00, 0x00, 0xc0, 0x01, 0x03, 0x00, 0x18, 0x70, 0x00, - 0x00, 0x70, 0x00, 0x06, 0x00, 0x18, 0xc0, 0x00, 0x00, 0x38, 0x00, 0x06, - 0x00, 0x1c, 0x80, 0x03, 0x00, 0x0e, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x07, - 0x00, 0x07, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x1c, 0x80, 0x01, 0x00, 0x06, - 0x00, 0x0c, 0x00, 0x38, 0xe0, 0x00, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x60, - 0x70, 0x00, 0x00, 0x06, 0x00, 0x0c, 0x00, 0xc0, 0x1f, 0x00, 0x00, 0x06, - 0x00, 0x0e, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x80, - 0x0f, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x06, - 0x00, 0x06, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, - 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x0c, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, - 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x0c, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, - 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x80, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x0c, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, - 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x80, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x0c, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, - 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xc0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x0c, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, - 0xc0, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0xfc, 0x1f, 0x00, - 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0x00, 0x18, - 0x00, 0x00, 0xc0, 0xff, 0x01, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0xf0, - 0x7f, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x1f, 0x00, 0x18, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x07, 0x18, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xc0, 0xff, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x1f, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff -Nru acm-5.0/gedit/README acm-6.0+20200416/gedit/README --- acm-5.0/gedit/README 1998-08-10 02:26:26.000000000 +0000 +++ acm-6.0+20200416/gedit/README 1970-01-01 00:00:00.000000000 +0000 @@ -1,92 +0,0 @@ -GEDIT - A 3-D object editor - -Copyright(c) 1993-1998, Riley Rainey, rainey@netcom.com - -Permission to use, copy, modify and distribute (without charge) this -software, documentation, images, etc. is granted, provided that this -comment and the author's name is retained. - -This software is provided by the author as is, and without any expressed -or implied warranties, including, but not limited to, the implied -warranties of merchantability and fitness for a particular purpose. In no -event shall the author be liable for any direct, indirect, incidental, or -consequential damages arising in any way out of the use of this software. - - - - -WHAT IS GEDIT? - -Well, this can be considered "work in progress", but it works. GEDIT can be -used to build displayable objects for ACM. It requires Motif 1.1 or later. - -Generating three dimensional objects on a two dimensional screen is a bit of -a challenge. GEDIT solves the problem by displaying two views of the same -object simultaneously. - -The main GEDIT window displays a top and side view of an area used to build -an object out of planar polygons. As an experiment, press the Polygon -button on the left-hand side of the display. You must then define the -three points that will determine the polygon's plane. - -You do that by clicking the mouse in one of the two view windows -- -hold mouse button one down and move the mouse. See how the -point in the opposite window moves up and down when you move the mouse -up and down? - -What you're doing is defining a point in 3-space -- the first -two coordinates are determined from where you clicked the mouse in the -first window. The remaining coordinate is determined by the location of the -point in the other window when you're finished dragging and you release the -mouse button. Do that three times and you've defined three points that -define a plane -- more mouse clicks immediately define a point on the -polygon since the polygon's plane has already been determined by the -location of the first three points. - -How is that useful? Picture this: take your favorite airplane book that -contains three-views (top, left, front view) of a given aircraft. Now take the -book over to a copier and copy those diagrams onto an overhead slide (the -clear paper ;-)). Now cut out each view. You can then fire up GEDIT on your -workstation, and tape the side view in the top window and the top view over -the bottom one (I usually have enough static electricity around to hold it -up without any tape) (make sure the two diagrams line up correctly). Now -start defining wings, tails, etc ... cute, no? You can then change views -(see the Layout menu) and do a similar thing with the front view. - -In the SaveAs dialog, you can output a file in V format. If you want the -object to be revisable, save a copy under another filename in GEDIT -(GDF) format. - - --- RBR - - -BUILDING GEDIT --------------- - -GEDIT uses the ACM V graphics library. You must have the ACM sources -available in order to build GEDIT. You will need to edit GEDIT's Makefile to -set the "ACM" variable to point to the top-level ACM source directory -(i.e. the directory that contains ACM's README file). - - -The GEDIT File Format ---------------------- - -Unfortunately, I was in a rush when I defined this graphics file format. -It stores information in your platform's binary form (with its definition of -structure alignment and floating point values) -- this is likely to -be incompatible with the binary format of someone else's machine. So, -until someone defines a "PGDF" (portable GDF) file format and a -converter between "PGDF" and GDF, you are limited in the sharing that -you'll be able to do with raw GDF files. - -A gdf directory that includes several files that I created (on a Sun-4) have -been provided for you to examine. - -OTHER NOTES ------------ - -This software is designed to run on paletted visuals. It will run, but -produce undesireable results in DirectColor visual. - diff -Nru acm-5.0/gedit/VReadObject.c acm-6.0+20200416/gedit/VReadObject.c --- acm-5.0/gedit/VReadObject.c 1994-01-20 14:12:00.000000000 +0000 +++ acm-6.0+20200416/gedit/VReadObject.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,61 +0,0 @@ -/* - * Copyright (c) 1994, Riley Rainey, riley@netcon.com - * - * Permission to use, copy, modify and distribute (without charge) this - * software, documentation, images, etc. is granted, provided that this - * comment and the author's name is retained. - * - * This software is provided by the author as is, and without any expressed - * or implied warranties, including, but not limited to, the implied - * warranties of merchantability and fitness for a particular purpose. In no - * event shall the author be liable for any direct, indirect, incidental, or - * consequential damages arising in any way out of the use of this software. - */ - -#include "Vlib.h" -#include - -VObject *VReadObject(f) -FILE *f; { - - short I, J, vertex, vertices, NumPts, NumPolys; - float x, y, z; - char str[64], name[128]; - VPoint *tmpPts, pts[VmaxVP]; - VPolygon **polygons; - VObject *object; - - fscanf(f, "%s\n", name); - fscanf(f, "%hd", &NumPts); - fscanf(f, "%hd", &NumPolys); - - tmpPts = (VPoint *) Vmalloc (NumPts * sizeof(VPoint)); - polygons = (VPolygon **) Vmalloc (NumPolys * sizeof(VPolygon *)); - - for (I=0; Iname = strdup (name); - object->numPolys = NumPolys; - object->polygon = polygons; - - free ((char *) tmpPts); - return ferror(f) ? (VObject *) 0 : object; -} diff -Nru acm-5.0/gedit/VWriteObject.c acm-6.0+20200416/gedit/VWriteObject.c --- acm-5.0/gedit/VWriteObject.c 1994-01-20 14:12:14.000000000 +0000 +++ acm-6.0+20200416/gedit/VWriteObject.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,158 +0,0 @@ -/* - * Copyright (c) 1994, Riley Rainey, riley@netcon.com - * - * Permission to use, copy, modify and distribute (without charge) this - * software, documentation, images, etc. is granted, provided that this - * comment and the author's name is retained. - * - * This software is provided by the author as is, and without any expressed - * or implied warranties, including, but not limited to, the implied - * warranties of merchantability and fitness for a particular purpose. In no - * event shall the author be liable for any direct, indirect, incidental, or - * consequential damages arising in any way out of the use of this software. - */ - -#include -#include -#include "gedit.h" - -int WriteVFile (name) -char *name; -{ - - int i, j, k, points = 0, polygons = 0, error; - register point_t *p; - FILE *f; - char ivname[1024], *p1; - - if ((f = fopen (name, "w")) == (FILE *) NULL) { - perror ("can't open file"); - } - -/* - * Total the number of vertices in all of the object's polygons - */ - - for (i=sel_polygon; i >= 0; i = polygon_list[i].next) { - polygons ++; - points += polygon_list[i].num_points; - } - - for (i=unsel_polygon; i >= 0; i = polygon_list[i].next) { - polygons ++; - points += polygon_list[i].num_points; - } - -/* - * Print the header - */ - - fprintf (f, "%s\n%d %d\n", "object", points, polygons); - -/* - * Print the point list - */ - - k = 1; - - for (i=sel_polygon; i >= 0; i = polygon_list[i].next) { - for (j=0; j < polygon_list[i].num_points; ++j) { - p = &polygon_list[i].point[j]; - fprintf (f, "%d %lg %lg %lg\n", k, p->point.x, - p->point.y, p->point.z); - ++k; - } - } - - for (i=unsel_polygon; i >= 0; i = polygon_list[i].next) { - for (j=0; j < polygon_list[i].num_points; ++j) { - p = &polygon_list[i].point[j]; - fprintf (f, "%d %lg %lg %lg\n", k, p->point.x, - p->point.y, p->point.z); - ++k; - } - } - - -/* - * Print the polygon list - */ - - k = 1; - - for (i=sel_polygon; i >= 0; i = polygon_list[i].next) { - fprintf(f, "%s %d", "gray44", polygon_list[i].num_points); - for (j=0; j < polygon_list[i].num_points; ++j) { - fprintf(f, " %d", k++); - } - fprintf (f, "\n"); - } - - for (i=unsel_polygon; i >= 0; i = polygon_list[i].next) { - fprintf(f, "%s %d", "gray44", polygon_list[i].num_points); - for (j=0; j < polygon_list[i].num_points; ++j) { - fprintf(f, " %d", k++); - } - fprintf (f, "\n"); - } - - error = ferror(f) ? -1 : 0; - - fclose (f); - -/* - * Now write the aircraft inventory information - */ - - strcpy (ivname, name); - if ((p1 = strrchr (ivname, '.'))) { - strcpy (p1, ".inv"); - } - else { - strcat (ivname, ".inv"); - } - - if ((f = fopen (ivname, "w")) == (FILE *) NULL) { - } - - c.viewPoint = marker_list[MARKER_HEAD].location.point; - - fprintf (f, "aircraft \"%s\" {\n\n", c.name); - fprintf (f, "\tWingArea\t%lg\n", c.wingS); - fprintf (f, "\tWingHalfSpan\t%lg\n", c.wings); - fprintf (f, "\tChord\t\t%lg\n", c.c); - fprintf (f, "\tEmptyWeight\t%lg\n", c.emptyWeight); - fprintf (f, "\tMaxFuel\t\t%lg\n", c.maxFuel); - fprintf (f, "\tIxx\t\t%lg\n", c.I.m[0][0]); - fprintf (f, "\tIyy\t\t%lg\n", c.I.m[1][1]); - fprintf (f, "\tIzz\t\t%lg\n", c.I.m[2][2]); - fprintf (f, "\tRm\t\t{%lg, %lg, %lg}\n", c.rm.x, c.rm.y, c.rm.z); - fprintf (f, "\tRn\t\t{%lg, %lg, %lg}\n", c.rn.x, c.rn.y, c.rn.z); - fprintf (f, "\tKm\t\t%lg\n", c.Km); - fprintf (f, "\tKn\t\t%lg\n", c.Kn); - fprintf (f, "\tGm\t\t%lg\n", c.Gm); - fprintf (f, "\tGn\t\t%lg\n", c.Gn); - fprintf (f, "\tCmMax\t\t%lg\n", c.cmMax); - fprintf (f, "\tCnMax\t\t%lg\n", c.cnMax); - fprintf (f, "\tGroundingPoint\t{0.0, 0.0, %lg}\n", c.groundingPoint.z); - fprintf (f, "\tViewPoint\t{%lg, %lg, %lg}\n", - c.viewPoint.x, c.viewPoint.y, c.viewPoint.z); - fprintf (f, "\n"); - fprintf (f, "\tMaxThrust\t%lg\n", c.maxThrust); - fprintf (f, "\tMaxABThrust\t%lg\n", c.maxABThrust); - fprintf (f, "\tSpFuelConsump\t%lg\n", c.spFuelConsump); - fprintf (f, "\tSpABFuelConsump\t%lg\n", c.spABFuelConsump); - fprintf (f, "\tEngineLag\t%lg\n", c.engineLag); - fprintf (f, "\n"); - fprintf (f, "\tClda\t\t%lg\n", c.Clda); - fprintf (f, "\tCldr\t\t%lg\n", c.Cldr); - fprintf (f, "\tClp\t\t%lg\n", c.Clp); - fprintf (f, "\tCmq\t\t%lg\n", c.Cmq); - fprintf (f, "\tCnr\t\t%lg\n", c.Cnr); - fprintf (f, "\tCmAlpha\t\t%lg\n", c.cmSlope); - fprintf (f, "\tCmFactor\t%lg\n", c.cmFactor); - fprintf (f, "\t}\n"); - fclose (f); - - return error; -} diff -Nru acm-5.0/gedit/XrMisc.h acm-6.0+20200416/gedit/XrMisc.h --- acm-5.0/gedit/XrMisc.h 1994-01-05 20:05:13.000000000 +0000 +++ acm-6.0+20200416/gedit/XrMisc.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,8 +0,0 @@ -#include - -typedef struct { - char *name; /* pushbutton's name */ - XtCallbackProc callback; /* activate callback */ - XtPointer client_data; /* data to register for callback */ - } ActionAreaButton; - diff -Nru acm-5.0/gedit/zoom_in_32.xbm acm-6.0+20200416/gedit/zoom_in_32.xbm --- acm-5.0/gedit/zoom_in_32.xbm 1992-10-30 19:32:23.000000000 +0000 +++ acm-6.0+20200416/gedit/zoom_in_32.xbm 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ -#define zoom_in_32_width 32 -#define zoom_in_32_height 32 -static char zoom_in_32_bits[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x07, - 0xf0, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0x0f, 0xe0, 0xff, 0xff, 0x0f, - 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xf8, 0x07, 0x00, 0x00, 0xfc, 0x01, - 0x00, 0x00, 0xff, 0x00, 0x00, 0x80, 0x7f, 0x00, 0x00, 0xc0, 0x3f, 0x00, - 0x00, 0xe0, 0x0f, 0x00, 0x00, 0xf0, 0x07, 0x00, 0x00, 0xfc, 0x01, 0x00, - 0x00, 0xff, 0x00, 0x00, 0x80, 0x7f, 0x00, 0x00, 0xc0, 0x1f, 0x00, 0x00, - 0xe0, 0x1f, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x07, 0xf0, 0xff, 0xff, 0x0f, - 0xf0, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0x07, - 0xe0, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff -Nru acm-5.0/gedit/zoom_in_64.xbm acm-6.0+20200416/gedit/zoom_in_64.xbm --- acm-5.0/gedit/zoom_in_64.xbm 1991-11-21 16:09:12.000000000 +0000 +++ acm-6.0+20200416/gedit/zoom_in_64.xbm 1970-01-01 00:00:00.000000000 +0000 @@ -1,46 +0,0 @@ -#define zoom_in_width 64 -#define zoom_in_height 64 -static char zoom_in_bits[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x80, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x3f, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, - 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x80, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x7f, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, - 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x7f, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x1f, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xf0, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, - 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x1f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xf0, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, - 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, - 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0x1f, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xe0, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0x3f, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xe0, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0x03, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xfe, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0f, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, - 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x80, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x7f, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, - 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x80, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x7f, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, - 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x3f, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, - 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff -Nru acm-5.0/gedit/zoom_out_32.xbm acm-6.0+20200416/gedit/zoom_out_32.xbm --- acm-5.0/gedit/zoom_out_32.xbm 1992-10-30 19:32:55.000000000 +0000 +++ acm-6.0+20200416/gedit/zoom_out_32.xbm 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ -#define zoom_out_32_width 32 -#define zoom_out_32_height 32 -static char zoom_out_32_bits[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x80, 0xff, 0x7f, 0x00, - 0x00, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x1e, 0x00, - 0x00, 0x80, 0x0f, 0x00, 0x00, 0xc0, 0x07, 0x00, 0x00, 0xe0, 0x01, 0x00, - 0x00, 0xf8, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, - 0x80, 0xff, 0x3f, 0x00, 0x80, 0xff, 0x7f, 0x00, 0x80, 0xff, 0x7f, 0x00, - 0x00, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff -Nru acm-5.0/gedit/zoom_out_64.xbm acm-6.0+20200416/gedit/zoom_out_64.xbm --- acm-5.0/gedit/zoom_out_64.xbm 1991-11-21 16:06:25.000000000 +0000 +++ acm-6.0+20200416/gedit/zoom_out_64.xbm 1970-01-01 00:00:00.000000000 +0000 @@ -1,46 +0,0 @@ -#define zoom_out_width 64 -#define zoom_out_height 64 -static char zoom_out_bits[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, - 0xff, 0x0f, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, - 0x00, 0xc0, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, - 0xff, 0x3f, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, - 0x00, 0x80, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xe0, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x1f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xfc, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xfe, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xc0, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, - 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x1f, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xfc, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xc0, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x3f, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x1f, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xfc, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x03, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xc0, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, - 0xff, 0x1f, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, - 0x00, 0xc0, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, - 0xff, 0x3f, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, - 0x00, 0x80, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff -Nru acm-5.0/install-sh acm-6.0+20200416/install-sh --- acm-5.0/install-sh 1995-09-26 18:02:56.000000000 +0000 +++ acm-6.0+20200416/install-sh 1970-01-01 00:00:00.000000000 +0000 @@ -1,238 +0,0 @@ -#! /bin/sh -# -# install - install a program, script, or datafile -# This comes from X11R5. -# -# Calling this script install-sh is preferred over install.sh, to prevent -# `make' implicit rules from creating a file called install from it -# when there is no Makefile. -# -# This script is compatible with the BSD install script, but was written -# from scratch. -# - - -# set DOITPROG to echo to test this script - -# Don't use :- since 4.3BSD and earlier shells don't like it. -doit="${DOITPROG-}" - - -# put in absolute paths if you don't have them in your path; or use env. vars. - -mvprog="${MVPROG-mv}" -cpprog="${CPPROG-cp}" -chmodprog="${CHMODPROG-chmod}" -chownprog="${CHOWNPROG-chown}" -chgrpprog="${CHGRPPROG-chgrp}" -stripprog="${STRIPPROG-strip}" -rmprog="${RMPROG-rm}" -mkdirprog="${MKDIRPROG-mkdir}" - -tranformbasename="" -transform_arg="" -instcmd="$mvprog" -chmodcmd="$chmodprog 0755" -chowncmd="" -chgrpcmd="" -stripcmd="" -rmcmd="$rmprog -f" -mvcmd="$mvprog" -src="" -dst="" -dir_arg="" - -while [ x"$1" != x ]; do - case $1 in - -c) instcmd="$cpprog" - shift - continue;; - - -d) dir_arg=true - shift - continue;; - - -m) chmodcmd="$chmodprog $2" - shift - shift - continue;; - - -o) chowncmd="$chownprog $2" - shift - shift - continue;; - - -g) chgrpcmd="$chgrpprog $2" - shift - shift - continue;; - - -s) stripcmd="$stripprog" - shift - continue;; - - -t=*) transformarg=`echo $1 | sed 's/-t=//'` - shift - continue;; - - -b=*) transformbasename=`echo $1 | sed 's/-b=//'` - shift - continue;; - - *) if [ x"$src" = x ] - then - src=$1 - else - # this colon is to work around a 386BSD /bin/sh bug - : - dst=$1 - fi - shift - continue;; - esac -done - -if [ x"$src" = x ] -then - echo "install: no input file specified" - exit 1 -else - true -fi - -if [ x"$dir_arg" != x ]; then - dst=$src - src="" - - if [ -d $dst ]; then - instcmd=: - else - instcmd=mkdir - fi -else - -# Waiting for this to be detected by the "$instcmd $src $dsttmp" command -# might cause directories to be created, which would be especially bad -# if $src (and thus $dsttmp) contains '*'. - - if [ -f $src -o -d $src ] - then - true - else - echo "install: $src does not exist" - exit 1 - fi - - if [ x"$dst" = x ] - then - echo "install: no destination specified" - exit 1 - else - true - fi - -# If destination is a directory, append the input filename; if your system -# does not like double slashes in filenames, you may need to add some logic - - if [ -d $dst ] - then - dst="$dst"/`basename $src` - else - true - fi -fi - -## this sed command emulates the dirname command -dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` - -# Make sure that the destination directory exists. -# this part is taken from Noah Friedman's mkinstalldirs script - -# Skip lots of stat calls in the usual case. -if [ ! -d "$dstdir" ]; then -defaultIFS=' -' -IFS="${IFS-${defaultIFS}}" - -oIFS="${IFS}" -# Some sh's can't handle IFS=/ for some reason. -IFS='%' -set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` -IFS="${oIFS}" - -pathcomp='' - -while [ $# -ne 0 ] ; do - pathcomp="${pathcomp}${1}" - shift - - if [ ! -d "${pathcomp}" ] ; - then - $mkdirprog "${pathcomp}" - else - true - fi - - pathcomp="${pathcomp}/" -done -fi - -if [ x"$dir_arg" != x ] -then - $doit $instcmd $dst && - - if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && - if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && - if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && - if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi -else - -# If we're going to rename the final executable, determine the name now. - - if [ x"$transformarg" = x ] - then - dstfile=`basename $dst` - else - dstfile=`basename $dst $transformbasename | - sed $transformarg`$transformbasename - fi - -# don't allow the sed command to completely eliminate the filename - - if [ x"$dstfile" = x ] - then - dstfile=`basename $dst` - else - true - fi - -# Make a temp file name in the proper directory. - - dsttmp=$dstdir/#inst.$$# - -# Move or copy the file name to the temp name - - $doit $instcmd $src $dsttmp && - - trap "rm -f ${dsttmp}" 0 && - -# and set any options; do chmod last to preserve setuid bits - -# If any of these fail, we abort the whole thing. If we want to -# ignore errors from any of these, just make sure not to ignore -# errors from the above "$doit $instcmd $src $dsttmp" command. - - if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && - if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && - if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && - if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && - -# Now rename the file to the real destination. - - $doit $rmcmd -f $dstdir/$dstfile && - $doit $mvcmd $dsttmp $dstdir/$dstfile - -fi && - - -exit 0 diff -Nru acm-5.0/INSTALL.txt acm-6.0+20200416/INSTALL.txt --- acm-5.0/INSTALL.txt 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/INSTALL.txt 2020-04-16 12:05:35.000000000 +0000 @@ -0,0 +1,219 @@ +Installing ACM and basic usage +============================== + +Contents +-------- + + System requirement to execute the binary package under MS Windows + System requirements to compile under Linux + System requirements to compile under MS Windows + Compiling and install from the sources + Running acm.exe + Single player, practice mode + The entities IDs problem solved + Multiplay on a local network + Multiplay mode on Internet + + +System requirement to execute the binary package under MS Windows +----------------------------------------------------------------- + +A binary package is also available for MS Windows and comes with the i386 32-bits +executable that runs also under 64-bits systems in compatibility mode. It does +not requires compilation nor installation as it runs just "out of the box" by +double-clicking on the acm.exe executable program. + +The dis_realy.exe server is also provided to support multiplayer mode over the +net, as explained below. + +Installation of the Tcl/tk interpreter is required to execute the acm.tcl launch +interface, which is handy to start the acm.exe program and tuning the great number +of its options. +The Tcl/tk interpreter is available at www.tcl.tk in binary form by +different providers, for example from Magicsplat at +http://www.magicsplat.com/tcl-installer/index.html +Often these packages provide very advanced libraries and programs along with +the basic Tcl/tk, but for our needs only a basic installation is enough. + + +System requirements to compile under Linux +------------------------------------------ + +In order to compile the program from the source you will need: + +- A 32-bits or 64-bits Linux system. + +- The gcc C compiler and the "make" utility as usual. + +- The X Window development libraries and runtime. + +- The Tcl/tk interpreter to execute the acm.tcl launch interface (recommended). + Tcl/tk is typically already installed, or a specific package is available for + any Linux distribution ready for installation. + + +System requirements to compile under MS Windows +----------------------------------------------- + +In order to compile the program from the source you will need: + +- MS Windows 7 or later. + +- The MinGW system development kit, in particular the C compiler. + +- The Tcl/tk interpreter to execute the acm.tcl launch interface (recommended). + The Tcl/tk interpreter is available at www.tcl.tk in binary form by + different providers, for example from Magicsplat at + http://www.magicsplat.com/tcl-installer/index.html + Often these packages provide very advanced libraries and programs along with + the basic Tcl/tk, but for our needs only a basic installation is enough. + + +Compiling and install from the sources +-------------------------------------- + +Under Windows, you will have to install MinGW first in order to have a complete +system development kit including the C language compiler, the "make" utility +and other needed tools. + +Then, open a terminal window and change the directory up to ACM sources +packages. + +There is not a configure script: simply type "make" to build all, and cross the +fingers... :-) This will build all the source tree under the src/ directory, +and usually takes only a few seconds on a recent machine: + + $ make + +You may also build part of the system. For example, you may build only the +acm.exe program: + + $ cd src/acm + $ make + +The "installation" procedure ends here. Afterward what you will need to run the +program are only these files: + + src/acm/acm.exe (the ACM program) + objects/ (scenery, aircraft models, munitions data, etc.) + acm.tcl (acm launch interface) + src/dis/server/dis_relay.exe (the relay server for net multiplay) + + +Running acm.exe +--------------- + +There are two ways. From the command line, type the command: + + $ src/acm/acm.exe -objects objects/ + +The acm.exe program has so many options that it is practically unusable from the +command line. For this reason I created the acm.tcl script to provide an handy +lunch interface. You may launch that program explicitly invoking the tk/tcl +"window shell" interpreter: + + $ wish acm.tcl & + +Remember to go first in the Configure panel and set the path of the acm.exe +program and the path of the objects/ directory before trying to start the +simulator. The DIS panel allows to chose among the single player mode and the +multiplayer mode as detailed below. + + +Single player, practice mode +---------------------------- +Does not require any network, and allows to learn the basic of the flight +techniques: aircraft control, takeoff, landing and navigation. You may generate +as many opponent drones as you want and fight against them; the "Drone" panel of +the launch panel allows also to set their "aggressiveness", that is how much +close (in percent) to their "G" structural limit they will pull to get behind +you... + + +The entities IDs problem solved +------------------------------- +Each entity in the DIS protocol (aircraft, missile, detonation, etc.) must have +an identification code, or "DIS entity ID", which must be unique between all the +participants into the simulation. But, how to generate these unique IDs on a +network of independent hosts connected together? This problem has been solved +by the DIS protocol by assigning to each entity a number of sub-IDs: the +exercise ID, the site ID, the application ID and the entity sequential number ID. +In more detail: + +- Exercise ID: is a number in the range [0,255] all the participants must agree + on. acm.exe simply ignores and discards any packet with different exercise ID. + +- Site ID: each host must have an unique value in the range [0,65534]. + ACM also allows the special value -1 which triggers site ID automatic + generation. With site ID automatic generation, ACM-6 generates a random + number and then enter a validation phase checking for collisions with the + incoming packets. If a collision is detected, the generation process restarts. + +- Application ID: each instance of the acm.exe program on a given host must have + it own host-specific different number chosen in the range [0,65534]. + ACM also allows the special value -1; in this case the current + process number is used as application ID. + +- Each instance of the acm.exe program will automatically generate an univocal + further entity sequential number ID in the range [1,65533] for each entity it + generates. + +Then, it is very important to configure the exercise, site and application IDs +as follows: + + - exercise ID: the same number for all the participants in the range + [0,255], for example 1. + + - site ID: -1 is the simpler choice. + + - application ID: -1 is the simpler choice. + + +Multiplay on a local network +---------------------------- +You may use the broadcast mode of the ACM program. In the launch interface, +DIS panel, ensure the DIS relay host be the empty string; this triggers the +network broadcast packet routing in the program, allowing all the participants to +talk the DIS protocol using the specified shared UDP port. The default port for +the DIS protocol is 3000, but you may agree on any other port to share with the +other participants. Be aware that the broadcasting routing works only if all the +hosts on the local network really share the same exact sub-net, or they will fail +communicate together. + +Example with netmask leaving 8 bits for the local network: +Host1: IP address: 192.168.1.33, netmask: 255.255.255.0 +Host2: IP address: 192.168.1.95, netmask: 255.255.255.0 +Host3: IP address: 192.168.1.147, netmask: 255.255.255.0 + +Another example with a netmask leaving only 2 bits available: +Host1: IP address: 192.168.1.33, netmask: 255.255.255.252 +Host2: IP address: 192.168.1.34, netmask: 255.255.255.252 + +Also set exercise no. 1 or any other value shared with the other participants. +Leave the site ID and application ID set to -1 to trigger automatic assignment. + + +Multiplay mode on Internet +-------------------------- +There must be a DIS relay server running on one of the machines participating +into the simulation, and that machine must have a public IP address. On that +machine issue this command: + + $ src/dis/server/dis_relay --port 3000 + +to start the relay server; 3000 is the standard UDP port used by the DIS protocol. +Each player must then set that host and that port in the DIS configuration panel +of acm.tcl. + +All the participants must agree on a exercise number ID. Site ID and application +ID should be set both to -1 for automatic assignment. + +You may try the --debug command line switch to display all the incoming and +relayed packets, along with the IP addresses of all the participants, new clients +entering the simulation and stale clients leaving. + + +That's all, enjoy! + +Umberto Salsi +Bologna, 2017-07-13 diff -Nru acm-5.0/Makefile acm-6.0+20200416/Makefile --- acm-5.0/Makefile 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/Makefile 2020-04-16 12:05:35.000000000 +0000 @@ -0,0 +1,68 @@ +WORKING_DIR := $(shell pwd) +PROGNAME := acm +VER := 6.0 +WEBDIR := /home/www.icosaedro.it/public_html/acm + +BUILD := $(shell date +%Y%m%d) +VERSION := ${VER}_${BUILD} + +DISTFILE := ${PROGNAME}-${VERSION} + +all: + # Really do all (but something does not builds yet): + #find . -mindepth 2 -name Makefile \ + # | while read m; do make -C $$(dirname $$m) all || exit 1; done + # + # Only do what we really care the most: + make -C src all + +clean: + rm -rf build-doxygen-docs-errors.txt doc/doxygen-html + find . -mindepth 2 -name Makefile \ + | while read m; do make -C $$(dirname $$m) clean; done + +strip: + +.PHONY: rebuild +rebuild: clean + find . -mindepth 1 -type d \ + | while read d; do \ + if [ -f $$d/Makefile ]; then \ + echo "$$d"; \ + (cd $$d; check-included && make-makefile); \ + fi \ + done + make + +# SUBROUTINE: +dist_make_package: clean + echo ${VERSION} > VERSION.txt + cd .. && \ + ln -sf ${WORKING_DIR} ${DISTFILE} && \ + tar --create --gzip \ + --owner=root --group=root \ + --exclude="*CVS*" \ + --exclude="*.cvsignore" \ + --exclude="*nbproject*" \ + --dereference \ + ${DISTFILE} \ + > /tmp/${DISTFILE}.tar.gz && \ + rm ${DISTFILE} && \ + echo "Package available in /tmp/${DISTFILE}.tar.gz" + +distclean: clean + +dist: dist_make_package + +doxygen: + tools/build-doxygen-docs.sh + +upgrade: + @echo "" + @echo "ACM Upgrade Procedure" + @echo "=====================" + @echo "" + @echo "The version of this package is `cat VERSION.txt`. Check for new releases on:" + @echo "" + @echo " http://www.icosaedro.it/acm/download.html" + @echo "" diff -Nru acm-5.0/Makefile.in acm-6.0+20200416/Makefile.in --- acm-5.0/Makefile.in 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/Makefile.in 1970-01-01 00:00:00.000000000 +0000 @@ -1,32 +0,0 @@ -# @configure_input@ - -srcdir = @srcdir@ - VPATH = @srcdir@ - SHELL = /bin/sh -SUBDIRS = V dis src objects - -# This line is needed to force BSD-style makes to do the right target -# by default -- they get confused by the following target. -defaulttarget: all - -all install uninstall clean mostlyclean realclean TAGS tags info dvi dist test check depend: - @for i in $(SUBDIRS) ; do \ - echo Making $@ in ./$${i} ... ; \ - ( cd $$i ; $(MAKE) $(MFLAGS) $@ ) || exit 1; \ - done - -Makefile: Makefile.in config.status - $(SHELL) config.status - -config.status: - $(SHELL) $(srcdir)/configure --no-create - -configure: configure.in - cd $(srcdir); autoconf - -distclean: - @for i in $(SUBDIRS) gedit; do \ - echo Making $@ in ./$${i} ... ; \ - ( cd $$i ; $(MAKE) $(MFLAGS) $@ ) || exit 1; \ - done - rm -f Makefile config.status config.log config.cache Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/objects/acmlogo-unix.xwd and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/objects/acmlogo-unix.xwd differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/objects/aconnon.au and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/objects/aconnon.au differ diff -Nru acm-5.0/objects/aim9.obv acm-6.0+20200416/objects/aim9.obv --- acm-5.0/objects/aim9.obv 1998-08-14 02:25:53.000000000 +0000 +++ acm-6.0+20200416/objects/aim9.obv 1970-01-01 00:00:00.000000000 +0000 @@ -1,73 +0,0 @@ -# -66 5 -1 -0.9167 0 0 -2 -0.9167 0.0833 0 -3 -1 0.1667 0 -4 -1.6667 0.25 0 -5 -1.8333 0.25 0 -6 -2.3333 0.8333 0 -7 -2.4167 1 0 -8 -2.4167 0.25 0 -9 -7.5833 0.25 0 -10 -8 1 0 -11 -9 1 0 -12 -9 -1 0 -13 -8 -1 0 -14 -7.5833 -0.25 0 -15 -2.4167 -0.25 0 -16 -2.4167 -1 0 -17 -2.3333 -0.8333 0 -18 -1.8333 -0.25 0 -19 -1.6667 -0.25 0 -20 -1 -0.1667 0 -21 -0.9167 -0.0833 0 -1 -0.9167 0 0 -2 -0.9167 0 0.0833 -3 -1 0 0.1667 -4 -1.6667 0 0.25 -5 -1.8333 0 0.25 -6 -2.3333 0 0.8333 -7 -2.4167 0 1 -8 -2.4167 0 0.25 -9 -7.5833 0 0.25 -10 -8 0 1 -11 -9 0 1 -12 -9 0 -1 -13 -8 0 -1 -14 -7.5833 0 -0.25 -15 -2.4167 0 -0.25 -16 -2.4167 0 -1 -17 -2.3333 0 -0.8333 -18 -1.8333 0 -0.25 -19 -1.6667 0 -0.25 -20 -1 0 -0.1667 -21 -0.9167 0 -0.0833 -43 -9 0.25 0 -44 -9 0.1768 0.1768 -45 -9 0 0.25 -46 -9 -0.1768 0.1768 -47 -9 -0.25 0 -48 -9 -0.1768 -0.1768 -49 -9 0 -0.25 -50 -9 0.1768 -0.1768 -51 -9 -0.25 0 -52 -9.75 -0.5 0 -53 -12 -0.75 0 -54 -13.5 -0.75 0 -55 -12.75 -0.5 0 -56 -15.25 -0.5 0 -57 -19.9167 0 0 -58 -15.0833 0.4167 0 -59 -15.75 0.5 0 -60 -12.5833 0.6667 0 -61 -12.0833 0.5833 0 -62 -9.833 0.5 0 -63 -9 0.25 0 -64 -12.5833 0 0.6667 -65 -12.5833 -0.6667 0 -66 -12.5833 0 -0.6667 -white 21 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 -white 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 -white 8 43 44 45 46 47 48 49 50 -white 13 51 52 53 54 55 56 57 58 59 60 61 62 63 -white 4 60 64 65 66 diff -Nru acm-5.0/objects/aircraft/amx.txt acm-6.0+20200416/objects/aircraft/amx.txt --- acm-5.0/objects/aircraft/amx.txt 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/objects/aircraft/amx.txt 2017-10-22 14:28:26.000000000 +0000 @@ -0,0 +1,192 @@ +aircraft "AMX" { + + Description "AMX International - AMX" + Object "ufo.obv" # FIXME + WingArea 226.04 # (wingS) Wing surface area (ft^2) + WingHalfSpan 14.6 # (wings) Wing half-span (ft) + WingHeight 0.0 # (wingh) Height of the wing aerodyn. center above CM (ft) + Chord 7 # (c) Mean geometric chord of wing (ft) + AspectRatio 3.75 # (aspectRatio) aspect ratio + EmptyWeight 14835 #(emptyWeight) Empty weight (well, actually mass) (lb) + + # Max. wing load (lbf): + MaxLoadZPositive 148350 # 10*EmptyWeight (+10 g) + MaxLoadZNegative 74175 # 5*EmptyWeight (-5 g) + + DISEntityType 1:2:106:1:1:1:0 + DISAltEntityType 1:2:106:1:1:1:0 + + # (I(x,y,z)) Moments of inertia (lb ft^2) + Ixx 7240 + Iyy 49786 + Izz 54390 + + # (cFlap) Lift due to flaps (yields Clift of 1.0 at max extension) + CFlap 0.64279 + BetaStall 15.0 # (deg) + + CFlapDrag 0.0467 # (cFlapDrag) Drag due to Flaps + CGearDrag 0.03 # (cGearDrag) Drag due to Gear + CSpeedBrake 0.03 # (cSpeedBrake) Drag due to Speed Brake + # at 90 degrees + + # (CDb) Drag Characteristic equation [Wave+body] + # independent variable is mach number + CDb { # (CDb) Drag Characteristic equation [Wave+body] + # independent variable is mach number + 0.0, 0.020, + 0.2, 0.020, + 0.95, 0.015, + 1.05, 0.045, + 2.00, 0.030, + 10.0, 0.030 + } + + CLift { # (CLift) Lift-slope curve (vs alpha) + -3.0, 0.0, + -1.05, 0.0, + -0.3316, -1.65, + -0.2967, -1.7, + -0.2618, -1.65, + 0.2618, 1.65, # 15 DEG (CLmax, stall begin) + 0.2967, 1.2, # 17 DEG + 0.3316, 0.8, # 19 DEG + 1.05, 0.0, + 2.0, 0.0 + } + + CnBeta { # (CnBeta) Yaw due to sideslip equation + 0, -0.08125, + 0.523540, -0.078125, + 0.785340, -0.0609375, + 1.047198, 0.125, + 1.58, 0.0 + } + + ClBeta { # (ClBeta) Roll due to sideslip equation + 0, -0.0125, + 0.43633, -0.015, + 0.78540, 0.125, + 1.58, 0.0, + 3.142, 0.125, + } + + CDBOrigin 0 # (CDBOrigin, CDBFactor) Drag due to sideslip + CDBFactor 0.5 + CDBPhase 0 # (CDBPhase) sideslip drag phase (deg) + CYBeta -1.14 # (CYbeta) Side-force from side-slip [dCY/dBeta] + EffElevator 1.50 # (effElevator) Elevator effectiveness [Cmde(1/rad)] + EffRudder 0.04 # (effRudder) Rudder effectiveness [CYdr(1/rad)] + MaxRudder 20 # (maxRudder) max Rudder (deg) + MaxAileron 20 # (maxAileron) max Aileron (deg) + MaxFlap 40 # (maxFlap) max flap setting (deg) + # (flapRate) flap extension rate (about 2 secs to fully extend flaps) + FlapRate 10 # (deg/sec) + # (gearRate) gear extension rate (about 3 secs to fully extend gear) + GearRate 30 # (deg/sec) + MaxSpeedBrake 80 # (maxSpeedBrake) max Speed Brake setting (deg) + # (speedBrakeRate) rate of speed brake extension (2 secs to full ext) + SpeedBrakeRate 40 # (deg/sec) + # (speedBrakeIncr) speed Brake increment per keystroke + SpeedBrakeIncr 80 # (deg) + Clda 0.048 # (Clda) roll moment from aileron offset + Cldr 0.004 # (Cldr) roll moment from rudder offset + Clp -0.443 # (Clp) roll damping + Cmq -5.23 # (Cmq) pitch damping factor + Cnr -0.378 # (Cnr) yaw damping factor + CmAlpha -0.35 # (cmSlope) CmAlpha curve slope + MaxFuel 6780 # (maxFuel) maximum internal fuel (lb) + + EngineType "GenericJetEngine" + # engine lag factor (how fast does it respond to throttle changes) + EngineLag -3.0 + # Engine data based on updated RD-33K engines cited in [AirI Aug89]. + # (maxThrust) max static thrust, military power (lbf) + MaxThrust 11030 + # (maxABThrust) max static thrust, afterburner on (lbf) + MaxABThrust 11030 + Thrust { # (Thrust) Mach Number vs. thrust + 0, 1, + 1.7, 1.5, + 2.0, 0.84, + 5, 0.5 + } + ABThrust { # (ABThrust) afterburner thrust table + 0, 1, + 0.5, 1, + 1, 1.21, + 1.7, 1.7, + 5, 1.64 + } + HasThrustReverser 0 # (hasThrustReverser) 0=no, otherwise yes + # (spFuelConsump) specific fuel consump(lb fuel/lb T x hr) + SpFuelConsump 0.68 + # (spABFuelConsump) AB specific fuel consump(lb fuel/lb T x hr) + SpABFuelConsump 0.68 + # (viewPoint) pilot's viewing location wrt CM + ViewPoint { 9.16, 0, -2.89 } + + # Landing Gear control parameters + + MuStatic 0.08 # (muStatic) static coeff of friction no-brakes + MuKinetic 0.05 # (muKinetic) moving coeff of friction no-brakes + MuBStatic 0.7 # (muBStatic) static brakes-on + MuBKinetic 0.6 # (muBKinetic) moving brakes-on + + MaxNWDef 72 # (maxNWDef)maximum nosewheel deflection (deg) + + # (rm) location of right main gear attachments + Rm { -1.92, 4.46, 1.54 } + # (rn) location of nose gear attachments + Rn { 13.2, 0, 1.54 } + Dm 3000 # main oleo damping factor (lbf s/ft) + Dn 900 # nose oleo damping factor (lbf s/ft) + Km 29000 # main oleo spring factor (lbf/s^2) + Kn 6300 # nose oleo spring factor (lbf/s^2) + Gm 2.4 # main strut length with tire (ft) + Gn 2.4 # nose strut length with tire (ft) + CmMax 1.5 # (cmMax) main max oleo extension distance (ft) + CnMax 1.5 # (cnMax) nose max oleo extension distance (ft) + # (tailExtent) as we rotate, this part may drag + TailExtent { -18.165, 0.0, 1.191 } + + # Speed limits at MTOW. Leave undefined or set to 0 if unknown. + MTOW 21615.0 # maximum takeoff weight (lb) + #Vs0 42.0 # stall speed, full flaps (KIAS) + #Vs1 50.0 # stall speed, no flaps (KIAS) + #Vfe 100.0 # max speed with flaps extended (KIAS) + #Vno 145.0 # normal operation speed (KIAS) + #Vne 164.0 # never exceed speed (KIAS) + + StructurePoints 15 # (structurePts) maximum structural damage + + # Radar data based on N-019 Pulse Doppler radar cited in [AirI Aug89]. + + RadarOutput 15000 # (radarOutput) radar output (watts) + RadarTRange 60 # (radarTRange) tracking radar range (NM) + RadarDRange 80 # (radarDRange) detection radar range (NM) + TEWSThreshold 0 # Radar Warning Receiver threshold (watts) + + # Weapons + + WeaponCount 7 + + HardPoint0 { 7.0, -4.0, 0.0 } + HardPoint1 { 0.357, 15.6, 0.0 } + HardPoint2 { 0.357, -15.6, 0.0 } + HardPoint3 { 1.5, 9.0, 2.0 } + HardPoint4 { 1.5, -9.0, 2.0 } + HardPoint5 { 1.5, 8.0, 1.5 } + HardPoint6 { 1.5, -8.0, 1.5 } + HardPoint7 { 1.5, 10.0, 1.5 } + HardPoint8 { 1.5, -10.0, 1.5 } + + WeaponStation 0 "M61A1" 500 0 0 + WeaponStation 1 "AIM-9M" 0 0 0 + WeaponStation 2 "AIM-9M" 0 0 0 + WeaponStation 3 "AIM-9M" 0 0 0 + WeaponStation 4 "AIM-9M" 0 0 0 + WeaponStation 5 "AIM-9M" 0 0 0 + WeaponStation 6 "AIM-9M" 0 0 0 + +} \ No newline at end of file Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/objects/aircraft/b-747.gdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/objects/aircraft/b-747.gdf differ diff -Nru acm-5.0/objects/aircraft/b-747.obv acm-6.0+20200416/objects/aircraft/b-747.obv --- acm-5.0/objects/aircraft/b-747.obv 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/objects/aircraft/b-747.obv 2017-09-14 14:19:09.000000000 +0000 @@ -0,0 +1,164 @@ +object +148 14 +1 66.1 0.0 35.5 +2 106.8 0.0 30.3 +3 111.3 0.0 25.8 +4 112.6 0.0 18.7 +5 96.4 0.0 11.6 +6 89.4 0.0 5.8 +7 71.3 0.0 3.9 +8 22.3 0.0 4.5 +9 11.3 0.0 8.4 +10 -75.8 0.0 9.0 +11 -119.0 0.0 -27.1 +12 -133.8 0.0 -27.1 +13 -120.9 0.0 6.4 +14 -126.1 0.0 7.1 +15 -124.8 0.0 16.1 +16 -59.6 0.0 33.5 +17 -46.7 0.0 34.8 +18 113.6 0.6 22.6 +19 111.7 3.2 22.6 +20 83.9 10.3 22.6 +21 74.3 11.6 22.6 +22 -66.3 11.0 22.6 +23 -65.7 -12.3 22.6 +24 71.7 -12.3 22.6 +25 83.3 -10.3 22.6 +26 111.0 -3.2 22.6 +27 113.6 0.0 22.6 +28 -81.2 0.0 12.9 +29 -115.4 39.3 12.9 +30 -122.5 38.7 12.9 +31 -116.0 0.6 12.9 +32 -124.4 -38.1 12.9 +33 -116.7 -39.3 12.9 +34 -82.5 -2.6 12.9 +35 69.0 12.4 20.4 +36 69.0 10.7 26.6 +37 69.0 6.2 31.1 +38 69.0 0.0 32.8 +39 69.0 -6.2 31.1 +40 69.0 -10.7 26.6 +41 69.0 -12.4 20.4 +42 69.0 -10.7 14.2 +43 69.0 -6.2 9.7 +44 69.0 0.0 8.0 +45 69.0 6.2 9.7 +46 69.0 10.7 14.2 +47 13.2 11.9 23.5 +48 13.2 10.3 29.4 +49 13.2 5.9 33.8 +50 13.2 0.0 35.4 +51 13.2 -5.9 33.8 +52 13.2 -10.3 29.4 +53 13.2 -11.9 23.5 +54 13.2 -10.3 17.5 +55 13.2 -5.9 13.2 +56 13.2 0.0 11.6 +57 13.2 5.9 13.2 +58 13.2 10.3 17.5 +59 -47.0 11.9 21.3 +60 -47.0 10.2 27.5 +61 -47.0 5.6 32.1 +62 -47.0 -0.6 33.8 +63 -47.0 -6.9 32.1 +64 -47.0 -11.5 27.5 +65 -47.0 -13.2 21.3 +66 -47.0 -11.5 15.0 +67 -47.0 -6.9 10.4 +68 -47.0 -0.6 8.8 +69 -47.0 5.6 10.4 +70 -47.0 10.2 15.0 +71 38.1 -1.3 27.7 +72 36.8 -13.5 27.7 +73 -50.2 -113.5 27.7 +74 -62.5 -114.2 27.7 +75 -26.4 -47.7 27.7 +76 -15.4 -12.9 27.7 +77 -14.8 -1.3 27.7 +78 -125.7 -25.8 23.9 +79 -125.7 -25.8 23.9 +80 -125.7 -25.8 23.9 +81 -125.7 -25.8 23.9 +82 -125.7 -25.8 23.9 +83 -125.7 -25.8 23.9 +84 -125.7 -25.8 23.9 +85 -125.7 -25.8 23.9 +86 -125.7 -25.8 23.9 +87 -125.7 -25.8 23.9 +88 -125.7 -25.8 23.9 +89 -125.7 -25.8 23.9 +90 -61.8 11.6 15.5 +91 -123.8 0.0 15.5 +92 -61.2 -11.6 15.5 +93 -61.2 11.6 15.5 +94 23.3 48.8 35.5 +95 23.3 48.3 37.6 +96 23.3 46.7 39.2 +97 23.3 44.5 39.8 +98 23.3 42.3 39.2 +99 23.3 40.8 37.6 +100 23.3 40.2 35.5 +101 23.3 40.8 33.3 +102 23.3 42.3 31.7 +103 23.3 44.5 31.1 +104 23.3 46.7 31.7 +105 23.3 48.3 33.3 +106 23.3 -40.5 34.8 +107 23.3 -41.1 37.2 +108 23.3 -42.8 38.9 +109 23.3 -45.1 39.5 +110 23.3 -47.5 38.9 +111 23.3 -49.2 37.2 +112 23.3 -49.8 34.8 +113 23.3 -49.2 32.5 +114 23.3 -47.5 30.8 +115 23.3 -45.1 30.2 +116 23.3 -42.8 30.8 +117 23.3 -41.1 32.5 +118 2.0 -81.1 34.8 +119 2.0 -81.8 37.2 +120 2.0 -83.5 38.9 +121 2.0 -85.8 39.5 +122 2.0 -88.1 38.9 +123 2.0 -89.8 37.2 +124 2.0 -90.4 34.8 +125 2.0 -89.8 32.5 +126 2.0 -88.1 30.8 +127 2.0 -85.8 30.2 +128 2.0 -83.5 30.8 +129 2.0 -81.8 32.5 +130 2.7 82.6 34.8 +131 2.7 81.9 37.4 +132 2.7 80.0 39.3 +133 2.7 77.4 40.0 +134 2.7 74.8 39.3 +135 2.7 72.9 37.4 +136 2.7 72.2 34.8 +137 2.7 72.9 32.2 +138 2.7 74.8 30.3 +139 2.7 77.4 29.6 +140 2.7 80.0 30.3 +141 2.7 81.9 32.2 +142 38.1 0.6 27.7 +143 38.1 13.5 27.7 +144 -48.9 114.8 27.7 +145 -64.4 114.8 27.7 +146 -28.3 47.7 27.7 +147 -15.4 12.9 27.7 +148 -14.8 0.6 27.7 +gray77 17 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 +gray77 10 18 19 20 21 22 23 24 25 26 27 +gray77 7 28 29 30 31 32 33 34 +gray77 12 35 36 37 38 39 40 41 42 43 44 45 46 +gray77 12 47 48 49 50 51 52 53 54 55 56 57 58 +gray77 12 59 60 61 62 63 64 65 66 67 68 69 70 +gray77 7 71 72 73 74 75 76 77 +gray77 12 78 79 80 81 82 83 84 85 86 87 88 89 +gray77 4 90 91 92 93 +gray77 12 94 95 96 97 98 99 100 101 102 103 104 105 +gray77 12 106 107 108 109 110 111 112 113 114 115 116 117 +gray77 12 118 119 120 121 122 123 124 125 126 127 128 129 +gray77 12 130 131 132 133 134 135 136 137 138 139 140 141 +gray77 7 142 143 144 145 146 147 148 diff -Nru acm-5.0/objects/aircraft/b-747.txt acm-6.0+20200416/objects/aircraft/b-747.txt --- acm-5.0/objects/aircraft/b-747.txt 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/objects/aircraft/b-747.txt 2017-10-22 14:28:26.000000000 +0000 @@ -0,0 +1,174 @@ +aircraft "B-747" { + +# see http://books.elsevier.com/companions/034074152X/appendices/data-a/table-3/table.htm +# see http://www.faqs.org/faqs/aviation/flight-simulators/ + + Description "Boeing 747-400" + Object "b-747.obv" + WingArea 5500.0 # (wingS) Wing surface area (ft^2) + WingHalfSpan 98 # (wings) Wing half-span (ft) + WingHeight 0.0 # (wingh) Height of the wing aerodyn. center above CM (ft) + Chord 27.3 # (c) Mean geometric chord of wing (ft) + AspectRatio 6.96 # (aspectRatio) aspect ratio + EmptyWeight 370000 #(emptyWeight) Empty weight (well, actually mass) (lb) + + # Max. wing load (lbf): + MaxLoadZPositive 1.2e6 # 1.5*MTOW (1.5 g) + MaxLoadZNegative 4.0e5 # 0.5*MTOW (0.5 g) + + DISEntityType 1:2:225:88:34:1:2 + DISAltEntityType 1:2:225:88:34:1:2 + + # (I(x,y,z)) Moments of inertia (lb ft^2) + Ixx 19000000 + Iyy 25000000 + Izz 25000000 + + # (cFlap) Lift due to flaps (yields Clift of 1.0 at max extension) + CFlap 0.64279 + BetaStall 15.0 # (deg) + + CFlapDrag 0.0467 # (cFlapDrag) Drag due to Flaps + CGearDrag 0.03 # (cGearDrag) Drag due to Gear + CSpeedBrake 0.03 # (cSpeedBrake) Drag due to Speed Brake + # at 90 degrees + + # (CDb) Drag Characteristic equation [Wave+body] + # independent variable is mach number + CDb { # (CDb) Drag Characteristic equation [Wave+body] + # independent variable is mach number + 0.0, 0.020, + 0.2, 0.020, + 0.95, 0.015, + 1.05, 0.045, + 2.00, 0.030, + 10.0, 0.030 + } + + CLift { # (CLift) Lift-slope curve (vs alpha) + -3.0, 0.0, + -1.05, 0.0, + -0.3316, -1.65, + -0.2967, -1.7, + -0.2618, -1.65, + 0.2618, 1.65, # 15 DEG (CLmax, stall begin) + 0.2967, 1.2, # 17 DEG + 0.3316, 0.8, # 19 DEG + 1.05, 0.0, + 2.0, 0.0 + } + + CnBeta { # (CnBeta) Yaw due to sideslip equation + 0, -0.08125, + 0.523540, -0.078125, + 0.785340, -0.0609375, + 1.047198, 0.125, + 1.58, 0.0 + } + + ClBeta { # (ClBeta) Roll due to sideslip equation + 0, -0.0125, + 0.43633, -0.015, + 0.78540, 0.125, + 1.58, 0.0, + 3.142, 0.125, + } + + CDBOrigin 0 # (CDBOrigin, CDBFactor) Drag due to sideslip + CDBFactor 0.5 + CDBPhase 0 # (CDBPhase) sideslip drag phase (deg) + CYBeta -1.0 # (CYbeta) Side-force from side-slip [dCY/dBeta] + EffElevator 1.0 # (effElevator) Elevator effectiveness + EffRudder 1.0 # (effRudder) Rudder effectiveness + MaxRudder 20 # (maxRudder) max Rudder (deg) + MaxAileron 30 # (maxAileron) max Aileron (deg) + MaxFlap 40 # (maxFlap) max flap setting (deg) + # (flapRate) flap extension rate + FlapRate 4 # (deg/sec) + MaxSpeedBrake 80 # (maxSpeedBrake) max Speed Brake setting (deg) + # (speedBrakeRate) rate of speed brake extension (4 secs to full ext) + SpeedBrakeRate 20 # (deg/sec) + # (speedBrakeIncr) speed Brake increment per keystroke + SpeedBrakeIncr 20 # (deg) + Clda 0.048 # (Clda) roll moment from aileron offset + Cldr 0.004 # (Cldr) roll moment from rudder offset + Clp -0.27 # (Clp) roll damping + Cmq -8.0 # (Cmq) pitch damping factor + Cnr -1.0 # (Cnr) yaw damping factor + CmAlpha -0.30 # (cmSlope) CmAlpha curve slope + + MaxFuel 360000 # (maxFuel) maximum internal fuel (lb) + EngineType "GenericJetEngine" + # engine lag factor (how fast does it respond to throttle changes) + EngineLag -4.0 + # (maxThrust) max static thrust, military power (lbf) + MaxThrust 200000 + # (maxABThrust) max static thrust, afterburner on (lbf) + MaxABThrust 200000 + Thrust { # (Thrust) Mach Number vs. thrust + 0, 1, + 1.7, 1.5, + 2.0, 0.84, + 5, 0.5 + } + ABThrust { # (Thrust) Mach Number vs. thrust + 0, 1, + 1.7, 1.5, + 2.0, 0.84, + 5, 0.5 + } + HasThrustReverser 1 # (hasThrustReverser) 0=no, otherwise yes + # (spFuelConsump) specific fuel consump(lb fuel/lb T x hr) + SpFuelConsump 0.6 + # (spABFuelConsump) AB specific fuel consump(lb fuel/lb T x hr) + SpABFuelConsump 0.6 + # (viewPoint) pilot's viewing location wrt CM + ViewPoint { 94, -3, -15.3 } + + # Landing Gear control parameters + + MuStatic 0.08 # (muStatic) static coeff of friction no-brakes + MuKinetic 0.05 # (muKinetic) moving coeff of friction no-brakes + MuBStatic 0.40 # (muBStatic) static brakes-on + MuBKinetic 0.30 # (muBKinetic) moving brakes-on + + MaxNWDef 40 # (maxNWDef) maximum nosewheel deflection (deg) + + # (gearRate) gear extension rate (about 3 secs to fully extend gear) + GearRate 10 # (deg/sec) + # (rn) location of nose gear attachments + Rn { 85.7, 0, 1 } + # (rm) location of right main gear attachments + Rm { -6, 18, 2.7 } + Gn 12.2 # nose strut length with tire (ft) + Gm 12.2 # main strut length with tire (ft) + CnMax 7.0 # (cnMax) nose max oleo extension distance (ft) + CmMax 5.0 # (cmMax) main max oleo extension distance (ft) + + Kn 25000 # nose oleo spring factor (lbf/ft) + Km 230000 # main oleo spring factor (lbf/ft) + Dn 4000 # nose oleo damping factor (lbf s/ft) + Dm 80000 # main oleo damping factor (lbf s/ft) + + # (tailExtent) as we rotate, this part may drag + TailExtent { -100.0, 0.0, -30.0 } + + # Speed limits at MTOW. Leave undefined or set to 0 if unknown. + MTOW 800000.0 # maximum takeoff weight (lb) + #Vs0 42.0 # stall speed, full flaps (KIAS) + #Vs1 50.0 # stall speed, no flaps (KIAS) + Vfe 220.0 # max speed with flaps extended (KIAS) + #Vno 145.0 # normal operation speed (KIAS) + Vne 535.0 # never exceed speed (KIAS) + + StructurePoints 1 # (structurePts) maximum structural damage + RadarOutput 0 # (radarOutput) radar output (watts) + RadarTRange 0 # (radarTRange) tracking radar range (NM) + RadarDRange 0 # (radarDRange) detection radar range (NM) + TEWSThreshold 0 # Radar Warning Receiver threshold (watts) + + # Weapons + + WeaponCount 0 + +} \ No newline at end of file diff -Nru acm-5.0/objects/aircraft/c172.obv acm-6.0+20200416/objects/aircraft/c172.obv --- acm-5.0/objects/aircraft/c172.obv 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/objects/aircraft/c172.obv 2006-01-05 13:58:55.000000000 +0000 @@ -0,0 +1,153 @@ +object +128 23 +1 0.602816 1.25587 1.20249 +2 -0.0502347 7.58544 -2.16009 +3 0.301408 7.58544 -2.16009 +4 0.904225 1.1554 1.25587 +5 0.904225 -1.1554 1.25587 +6 0.301408 -7.58544 -2.16009 +7 -0.0502347 -7.58544 -2.16009 +8 0.602816 -1.25587 1.20249 +9 -4.26195 -1.41515 -1.00941 +10 -4.52832 -1.40429 -1.12157 +11 -4.02362 -1.32018 -1.99078 +12 -3.79931 -1.32018 -1.99078 +13 -2.42539 -1.64029 -2.03284 +14 -2.45343 -1.64029 -0.897253 +15 -2.18705 -1.64029 -0.911273 +16 -2.18705 -1.64029 -2.06088 +17 1.26288e-15 -1.5925 -2.15902 +18 0.224313 -1.69637 -0.827155 +19 0.532744 -1.65431 -0.827155 +20 0.266372 -1.55617 -2.15902 +21 0.266372 1.55617 -2.15902 +22 0.532744 1.65431 -0.827155 +23 0.224313 1.69637 -0.827155 +24 1.26288e-15 1.5925 -2.15902 +25 -2.18705 1.64029 -2.06088 +26 -2.18705 1.64029 -0.911273 +27 -2.45343 1.64029 -0.897253 +28 -2.42539 1.64029 -2.03284 +29 -3.79931 1.32018 -1.99078 +30 -4.02362 1.32018 -1.99078 +31 -4.52832 1.40429 -1.12157 +32 -4.26195 1.41515 -1.00941 +33 -4.03764 0.0841175 -2.0048 +34 -5.00499 0.0841175 -1.33186 +35 -5.00499 -0.0700979 -1.33186 +36 -4.03764 -0.0981371 -2.0048 +37 5.79319 0 -0.0919553 +38 5.79319 0 -0.827598 +39 4.13799 0 -1.19542 +40 2.48279 0 -1.37933 +41 1.74715 0 -1.01151 +42 0.735643 0 -0.827598 +43 -2.02302 0 -0.919553 +44 -4.04603 0 -0.919553 +45 -5.1495 0 -1.37933 +46 -15.6324 0 -0.551732 +47 -15.5404 0 -0.183911 +48 0.275866 0 1.56324 +49 3.03453 0 1.47129 +50 3.95408 0 1.47129 +51 4.96559 0 1.10346 +52 -12.2301 0.183911 -0.827598 +53 -12.7818 4.50581 -0.827598 +54 -13.2416 4.87363 -0.827598 +55 -15.1726 4.78168 -0.827598 +56 -15.8163 0.551732 -0.827598 +57 -14.1611 0.0919553 -0.827598 +58 -0.551732 16.0002 -2.75866 +59 -2.94257 16.0002 -2.6667 +60 -3.95408 7.63229 -2.29888 +61 -4.04603 0 -1.99534 +62 0.275866 0 -2.16157 +63 0.183911 1.56324 -2.21948 +64 0.919553 1.6552 -2.25139 +65 0.827598 7.54034 -2.47918 +66 0.275866 15.5404 -2.77242 +67 0.275866 -15.5404 -2.77242 +68 0.827598 -7.54034 -2.47918 +69 0.919553 -1.6552 -2.25139 +70 0.183911 -1.56324 -2.21948 +71 0.275866 -0 -2.16157 +72 -4.04603 -0 -1.99534 +73 -3.95408 -7.63229 -2.29888 +74 -2.94257 -16.0002 -2.6667 +75 -0.551732 -16.0002 -2.75866 +76 -14.1611 -0.0919553 -0.827598 +77 -15.8163 -0.551732 -0.827598 +78 -15.1726 -4.78168 -0.827598 +79 -13.2416 -4.87363 -0.827598 +80 -12.7818 -4.50581 -0.827598 +81 -12.2301 -0.183911 -0.827598 +82 5.51732 0 -0.551732 +83 5.1495 1.19542 -0.551732 +84 -0.183911 1.74715 -0.551732 +85 -4.22994 1.56324 -0.551732 +86 -15.0807 0 -0.551732 +87 -15.0807 -0 -0.551732 +88 -4.22994 -1.56324 -0.551732 +89 -0.183911 -1.74715 -0.551732 +90 5.1495 -1.19542 -0.551732 +91 5.51732 -0 -0.551732 +92 0.0919553 0 1.6552 +93 0.0919553 -0.919553 1.47129 +94 0.0919553 -1.47129 0.919553 +95 0.0919553 -1.56324 -0.0919553 +96 0.0919553 -1.56324 -0.919553 +97 0.0919553 0 -1.19542 +98 0.0919553 -0 -1.19542 +99 0.0919553 1.56324 -0.919553 +100 0.0919553 1.56324 -0.0919553 +101 0.0919553 1.47129 0.919553 +102 0.0919553 0.919553 1.47129 +103 0.0919553 -0 1.6552 +104 4.13799 0 2.20693 +105 4.13799 -0.275866 2.48279 +106 4.13799 -0.367821 3.03453 +107 4.13799 0 3.12648 +108 4.13799 -0 3.12648 +109 4.13799 0.367821 3.03453 +110 4.13799 0.275866 2.48279 +111 4.13799 -0 2.20693 +112 -0.367821 -3.31039 3.03453 +113 -0.367821 -3.21844 2.48279 +114 -0.367821 -3.4943 2.20693 +115 -0.367821 -3.77017 2.48279 +116 -0.367821 -3.86212 3.12648 +117 -0.367821 3.86212 3.12648 +118 -0.367821 3.77017 2.48279 +119 -0.367821 3.4943 2.20693 +120 -0.367821 3.21844 2.48279 +121 -0.367821 3.31039 3.03453 +122 -6.01584 0 -1.2729 +123 -11.2573 0 -1.82463 +124 -12.3608 0 -2.1005 +125 -14.5677 0 -4.85916 +126 -16.5907 0 -4.58329 +127 -15.5792 0 -0.997034 +128 -15.5792 0 -0.629213 +gray44 4 1 2 3 4 +gray44 4 5 6 7 8 +gray44 4 9 10 11 12 +gray44 4 13 14 15 16 +gray44 4 17 18 19 20 +gray44 4 21 22 23 24 +gray44 4 25 26 27 28 +gray44 4 29 30 31 32 +gray44 4 33 34 35 36 +gray44 15 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 +gray44 6 52 53 54 55 56 57 +gray44 9 58 59 60 61 62 63 64 65 66 +gray44 9 67 68 69 70 71 72 73 74 75 +gray44 6 76 77 78 79 80 81 +gray44 5 82 83 84 85 86 +gray44 5 87 88 89 90 91 +gray44 6 92 93 94 95 96 97 +gray44 6 98 99 100 101 102 103 +gray44 4 104 105 106 107 +gray44 4 108 109 110 111 +gray44 5 112 113 114 115 116 +gray44 5 117 118 119 120 121 +gray44 7 122 123 124 125 126 127 128 diff -Nru acm-5.0/objects/aircraft/c172.txt acm-6.0+20200416/objects/aircraft/c172.txt --- acm-5.0/objects/aircraft/c172.txt 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/objects/aircraft/c172.txt 2017-09-14 14:18:06.000000000 +0000 @@ -0,0 +1,175 @@ +# Cessna 172 + +aircraft "C-172" { + + Description "Cessna 172RG" + Object "c172.obv" + WingArea 174.0 # (wingS) Wing surface area (ft^2) + WingHalfSpan 16 # (wings) Wing half-span (ft) + WingHeight 2.4 # (wingh) Height of the wing aerodyn. center above CM (ft) + Chord 4.9 # (c) Mean geometric chord of wing (ft) + AspectRatio 5.9 # (aspectRatio) aspect ratio + EmptyWeight 1450 #(emptyWeight) Empty weight (well, actually mass) (lb) + + # Max. wing load: + MaxLoadZPositive 10070 # 3.8*MTOW (+3.8 g) + MaxLoadZNegative 3975 # 1.5*MTOW (-1.5 g) + + DISEntityType 1:2:225:40:1:1:0 + DISAltEntityType 1:2:225:40:1:1:0 + + # (I(x,y,z)) Moments of inertia (lb ft^2) + Ixx 1000 + Iyy 7500 + Izz 8000 + + # (cFlap) Lift due to flaps (yields Clift of 1.0 at max extension) + CFlap 1.47 + BetaStall 15.0 # (deg) + + CFlapDrag 0.0467 # (cFlapDrag) Drag due to Flaps + CGearDrag 0.03 # (cGearDrag) Drag due to Gear + CSpeedBrake 0.03 # (cSpeedBrake) Drag due to Speed Brake + # at 90 degrees + + # (CDb) Drag Characteristic equation [Wave+body] + # independent variable is mach number + CDb { # (CDb) Drag Characteristic equation [Wave+body] + # independent variable is mach number + 0.0, 0.034, + 0.2, 0.034, + 0.95, 0.020, + 1.05, 0.045, + 2.00, 0.030, + 10.0, 0.030 + } + + CLift { # (CLift) Lift-slope curve (vs alpha) + -3.0, 0.0, + -1.05, 0.0, + -0.3316, -1.65, + -0.2967, -1.7, + -0.2618, -1.65, + 0.2618, 1.65, # 15 DEG (CLmax, stall begin) + 0.2967, 1.2, # 17 DEG + 0.3316, 0.8, # 19 DEG + 1.05, 0.0, + 2.0, 0.0 + } + + CnBeta { # (CnBeta) Yaw due to sideslip equation + 0, -0.08125, + 0.523540, -0.078125, + 0.785340, -0.0609375, + 1.047198, 0.125, + 1.58, 0.0 + } + + ClBeta { # (ClBeta) Roll due to sideslip equation + 0, -0.0125, + 0.43633, -0.015, + 0.78540, 0.125, + 1.58, 0.0, + 3.142, 0.125, + } + + CDBOrigin 0 # (CDBOrigin, CDBFactor) Drag due to sideslip + CDBFactor 0.5 + CDBPhase 0 # (CDBPhase) sideslip drag phase (deg) + CYBeta -1.0 # (CYbeta) Side-force from side-slip [dCY/dBeta] + EffElevator 1.00 # (effElevator) Elevator effectiveness + EffRudder 0.50 # (effRudder) Rudder effectiveness + MaxRudder 20 # (maxRudder) max Rudder (deg) + MaxAileron 20 # (maxAileron) max Aileron (deg) + MaxFlap 30 # (maxFlap) max flap setting (deg) + # (flapRate) flap extension rate (about 2 secs to fully extend flaps) + FlapRate 3 # (deg/sec) + # (gearRate) gear extension rate (about 3 secs to fully extend gear) + GearRate 15 # (deg/sec) + MaxSpeedBrake 80 # (maxSpeedBrake) max Speed Brake setting (deg) + # (speedBrakeRate) rate of speed brake extension (2 secs to full ext) + SpeedBrakeRate 40 # (deg/sec) + # (speedBrakeIncr) speed Brake increment per keystroke + SpeedBrakeIncr 0 # (deg) + Clda 0.048 # (Clda) roll moment from aileron offset + Cldr 0.004 # (Cldr) roll moment from rudder offset + Clp -0.27 # (Clp) roll damping + Cmq -8.0 # (Cmq) pitch damping factor + Cnr -1.0 # (Cnr) yaw damping factor + CmAlpha -0.30 # (cmSlope) CmAlpha curve slope + + EngineType "GenericPistonEngine" + MaxFuel 240 # (maxFuel) maximum internal fuel (lb) + # engine lag factor (how fast does it respond to throttle changes) + EngineLag -2.0 + # (maxThrust) max static thrust, military power (lbf) + MaxThrust 500 + # (maxABThrust) max static thrust, afterburner on (lbf) + MaxABThrust 500 + Thrust { # (Thrust) Mach Number vs. thrust + 0, 1, + 0.1, 0.95, + 0.2, 0.90, + 1.7, 0.5, + 5, 0.5 + } + ABThrust { # (ABThrust) afterburner thrust table + 0, 1, + 1.7, 1.5, + 2.0, 0.84, + 5, 0.5 + } + + HasThrustReverser 0 # (hasThrustReverser) 0=no, otherwise yes + # (spFuelConsump) specific fuel consump(lb fuel/lb T x hr) + SpFuelConsump 0.1677 + # (spABFuelConsump) AB specific fuel consump(lb fuel/lb T x hr) + SpABFuelConsump 0.1677 + # (viewPoint) pilot's viewing location wrt CM + ViewPoint { 0.2791, -0.7326, -1.7792 } + + # Landing Gear control parameters + + MuStatic 0.03 # (muStatic) static coeff of friction no-brakes + MuKinetic 0.02 # (muKinetic) moving coeff of friction no-brakes + MuBStatic 0.6 # (muBStatic) static brakes-on + MuBKinetic 0.5 # (muBKinetic) moving brakes-on + + MaxNWDef 30 # (maxNWDef) maximum nosewheel deflection (deg) + + # (rm) location of right main gear attachments + Rm { -1.3, 4.25, 2 } + # (rn) location of nose gear attachments + Rn { 3.9, 0, 1.9 } + Dm 300 # main oleo damping factor (lbf s/ft) + Dn 600 # nose oleo damping factor (lbf s/ft) + Km 9200 # main oleo spring factor (lbf/ft) + Kn 5400 # nose oleo spring factor (lbf/ft) + Gm 0.7 # main strut length with tire (ft) + Gn 1.0 # nose strut length with tire (ft) + CmMax 0.5 # (cmMax) main max oleo extension distance (ft) + CnMax 0.5 # (cnMax) nose max oleo extension distance (ft) + # (tailExtent) as we rotate, this part may drag + TailExtent { -18.165, 0.0, 1.191 } + + # Speed limits at MTOW. Leave undefined or set to 0 if unknown. + MTOW 2650.0 # maximum takeoff weight (lb) + #Vs0 42.0 # stall speed, full flaps (KIAS) + #Vs1 50.0 # stall speed, no flaps (KIAS) + Vfe 100.0 # max speed with flaps extended (KIAS) + Vno 145.0 # normal operation speed (KIAS) + Vne 164.0 # never exceed speed (KIAS) + + StructurePoints 1 # (structurePts) maximum structural damage + + # Radar data based on N-019 Pulse Doppler radar cited in [AirI Aug89]. + + RadarOutput 0 # (radarOutput) radar output (watts) + RadarTRange 0 # (radarTRange) tracking radar range (NM) + RadarDRange 0 # (radarDRange) detection radar range (NM) + TEWSThreshold 0 # Radar Warning Receiver threshold (watts) + + # Weapons + + WeaponCount 0 +} \ No newline at end of file diff -Nru acm-5.0/objects/aircraft/f117.dxf acm-6.0+20200416/objects/aircraft/f117.dxf --- acm-5.0/objects/aircraft/f117.dxf 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/objects/aircraft/f117.dxf 2006-01-05 13:58:55.000000000 +0000 @@ -0,0 +1,2318 @@ + 0 +SECTION + 2 +HEADER + 0 +ENDSEC + 0 +SECTION + 2 +TABLES + 0 +TABLE + 2 +LAYER + 70 + 153 + 0 +LAYER + 2 +0 + 70 +0 + 62 +15 + 6 +CONTINUOUS + 0 +ENDTAB + 0 +ENDSEC + 0 +SECTION + 2 +ENTITIES + 0 +3DFACE + 8 +0 + 10 +0.762000 + 20 +-3.790279 + 30 +0.000489 + 11 +0.944880 + 21 +-2.571079 + 31 +0.000489 + 12 +1.524000 + 22 +-2.266279 + 32 +0.000489 + 13 +1.524000 + 23 +-2.266279 + 33 +0.000489 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +0.000031 + 20 +-5.353721 + 30 +0.000704 + 11 +0.000000 + 21 +-3.942679 + 31 +0.610089 + 12 +0.762000 + 22 +-3.790279 + 32 +0.000489 + 13 +0.762000 + 23 +-3.790279 + 33 +0.000489 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +0.000000 + 20 +-3.028280 + 30 +1.524489 + 11 +0.000011 + 21 +3.729320 + 31 +0.000000 + 12 +0.000000 + 22 +2.000921 + 32 +0.610089 + 13 +0.000000 + 23 +2.000921 + 33 +0.610089 + 62 +0 + 0 +3DFACE + 8 +0 + 10 +1.371600 + 20 +1.238921 + 30 +0.610089 + 11 +0.000000 + 21 +-3.028280 + 31 +1.524489 + 12 +0.000000 + 22 +2.000921 + 32 +0.610089 + 13 +0.000000 + 23 +2.000921 + 33 +0.610089 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +0.000011 + 20 +3.729320 + 30 +0.000000 + 11 +1.467700 + 21 +2.235796 + 31 +0.010004 + 12 +0.000000 + 22 +2.000921 + 32 +0.610089 + 13 +0.000000 + 23 +2.000921 + 33 +0.610089 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +0.000000 + 20 +-3.028280 + 30 +1.524489 + 11 +1.371600 + 21 +1.238921 + 31 +0.610089 + 12 +0.762000 + 22 +-3.790279 + 32 +0.000489 + 13 +0.762000 + 23 +-3.790279 + 33 +0.000489 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +0.762000 + 20 +-3.790279 + 30 +0.000489 + 11 +0.000000 + 21 +-3.942679 + 31 +0.610089 + 12 +0.000000 + 22 +-3.028280 + 32 +1.524489 + 13 +0.000000 + 23 +-3.028280 + 33 +1.524489 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +0.000031 + 20 +-5.353721 + 30 +0.000704 + 11 +3.631692 + 21 +3.455000 + 31 +0.018325 + 12 +1.589602 + 22 +1.595716 + 32 +0.012271 + 13 +1.589602 + 23 +1.595716 + 33 +0.012271 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +0.000000 + 20 +-3.028280 + 30 +1.524489 + 11 +0.000000 + 21 +2.000921 + 31 +0.610089 + 12 +0.000011 + 22 +3.729320 + 32 +0.000000 + 13 +0.000011 + 23 +3.729320 + 33 +0.000000 + 62 +0 + 0 +3DFACE + 8 +0 + 10 +1.219200 + 20 +5.353721 + 30 +1.676889 + 11 +0.000011 + 21 +3.729320 + 31 +0.000000 + 12 +1.219200 + 22 +4.439321 + 32 +1.676889 + 13 +1.219200 + 23 +4.439321 + 33 +1.676889 + 62 +3 + 0 +3DFACE + 8 +0 + 10 +1.524000 + 20 +-2.266279 + 30 +0.000489 + 11 +3.631692 + 21 +3.455000 + 31 +0.018325 + 12 +3.936492 + 22 +3.150200 + 32 +0.018417 + 13 +3.936492 + 23 +3.150200 + 33 +0.018417 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +1.828800 + 20 +-0.437479 + 30 +0.000489 + 11 +1.371600 + 21 +1.238921 + 31 +0.610089 + 12 +1.589602 + 22 +1.595716 + 32 +0.012271 + 13 +1.589602 + 23 +1.595716 + 33 +0.012271 + 62 +3 + 0 +3DFACE + 8 +0 + 10 +1.524000 + 20 +-2.266279 + 30 +0.000489 + 11 +1.219200 + 21 +-1.809079 + 31 +0.610089 + 12 +1.828800 + 22 +-0.437479 + 32 +0.000489 + 13 +1.828800 + 23 +-0.437479 + 33 +0.000489 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +1.371600 + 20 +-0.437479 + 30 +0.610089 + 11 +0.762000 + 21 +-0.589879 + 31 +0.914889 + 12 +1.371600 + 22 +1.238921 + 32 +0.610089 + 13 +1.371600 + 23 +1.238921 + 33 +0.610089 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +0.762000 + 20 +-2.266279 + 30 +0.610089 + 11 +0.762000 + 21 +-0.589879 + 31 +0.914889 + 12 +1.219200 + 22 +-1.809079 + 32 +0.610089 + 13 +1.219200 + 23 +-1.809079 + 33 +0.610089 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +0.944880 + 20 +-2.571079 + 30 +0.000489 + 11 +0.762000 + 21 +-2.266279 + 31 +0.610089 + 12 +1.524000 + 22 +-2.266279 + 32 +0.000489 + 13 +1.524000 + 23 +-2.266279 + 33 +0.000489 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +1.371600 + 20 +1.238921 + 30 +0.610089 + 11 +1.467700 + 21 +2.235796 + 31 +0.010004 + 12 +1.589602 + 22 +1.595716 + 32 +0.012271 + 13 +1.589602 + 23 +1.595716 + 33 +0.012271 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +0.000031 + 20 +-5.353721 + 30 +0.000704 + 11 +3.631692 + 21 +3.455000 + 31 +0.018325 + 12 +1.589602 + 22 +1.595716 + 32 +0.012271 + 13 +1.589602 + 23 +1.595716 + 33 +0.012271 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +1.219200 + 20 +5.353721 + 30 +1.676889 + 11 +1.219200 + 21 +4.439321 + 31 +1.676889 + 12 +0.000011 + 22 +3.729320 + 32 +0.000000 + 13 +0.000011 + 23 +3.729320 + 33 +0.000000 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +-0.762000 + 20 +-3.790279 + 30 +0.000489 + 11 +-1.524000 + 21 +-2.266279 + 31 +0.000489 + 12 +-0.944880 + 22 +-2.571079 + 32 +0.000489 + 13 +-0.944880 + 23 +-2.571079 + 33 +0.000489 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +0.000031 + 20 +-5.353721 + 30 +0.000704 + 11 +-0.762000 + 21 +-3.790279 + 31 +0.000489 + 12 +0.000000 + 22 +-3.942679 + 32 +0.610089 + 13 +0.000000 + 23 +-3.942679 + 33 +0.610089 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +0.000000 + 20 +-3.028280 + 30 +1.524489 + 11 +0.000000 + 21 +2.000921 + 31 +0.610089 + 12 +0.000011 + 22 +3.729320 + 32 +0.000000 + 13 +0.000011 + 23 +3.729320 + 33 +0.000000 + 62 +0 + 0 +3DFACE + 8 +0 + 10 +-1.371600 + 20 +1.238921 + 30 +0.610089 + 11 +0.000000 + 21 +2.000921 + 31 +0.610089 + 12 +0.000000 + 22 +-3.028280 + 32 +1.524489 + 13 +0.000000 + 23 +-3.028280 + 33 +1.524489 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +0.000011 + 20 +3.729320 + 30 +0.000000 + 11 +0.000000 + 21 +2.000921 + 31 +0.610089 + 12 +-1.467700 + 22 +2.235796 + 32 +0.010004 + 13 +-1.467700 + 23 +2.235796 + 33 +0.010004 + 62 +3 + 0 +3DFACE + 8 +0 + 10 +0.000000 + 20 +-3.028280 + 30 +1.524489 + 11 +-0.762000 + 21 +-3.790279 + 31 +0.000489 + 12 +-1.371600 + 22 +1.238921 + 32 +0.610089 + 13 +-1.371600 + 23 +1.238921 + 33 +0.610089 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +-0.762000 + 20 +-3.790279 + 30 +0.000489 + 11 +0.000000 + 21 +-3.028280 + 31 +1.524489 + 12 +0.000000 + 22 +-3.942679 + 32 +0.610089 + 13 +0.000000 + 23 +-3.942679 + 33 +0.610089 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +0.000031 + 20 +-5.353721 + 30 +0.000704 + 11 +-1.589602 + 21 +1.595716 + 31 +0.012271 + 12 +-3.936492 + 22 +3.150200 + 32 +0.018417 + 13 +-3.936492 + 23 +3.150200 + 33 +0.018417 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +0.000000 + 20 +-3.028280 + 30 +1.524489 + 11 +0.000011 + 21 +3.729320 + 31 +0.000000 + 12 +0.000000 + 22 +2.000921 + 32 +0.610089 + 13 +0.000000 + 23 +2.000921 + 33 +0.610089 + 62 +0 + 0 +3DFACE + 8 +0 + 10 +-1.219200 + 20 +5.353721 + 30 +1.676889 + 11 +-1.219200 + 21 +4.439321 + 31 +1.676889 + 12 +0.000011 + 22 +3.729320 + 32 +0.000000 + 13 +0.000011 + 23 +3.729320 + 33 +0.000000 + 62 +3 + 0 +3DFACE + 8 +0 + 10 +-1.524000 + 20 +-2.266279 + 30 +0.000489 + 11 +-3.631692 + 21 +3.455000 + 31 +0.018325 + 12 +-1.828800 + 22 +-0.437479 + 32 +0.000489 + 13 +-1.828800 + 23 +-0.437479 + 33 +0.000489 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +-1.828800 + 20 +-0.437479 + 30 +0.000489 + 11 +-1.371600 + 21 +1.238921 + 31 +0.610089 + 12 +-1.371600 + 22 +-0.437479 + 32 +0.610089 + 13 +-1.371600 + 23 +-0.437479 + 33 +0.610089 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +-1.524000 + 20 +-2.266279 + 30 +0.000489 + 11 +-1.828800 + 21 +-0.437479 + 31 +0.000489 + 12 +-1.219200 + 22 +-1.809079 + 32 +0.610089 + 13 +-1.219200 + 23 +-1.809079 + 33 +0.610089 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +-1.371600 + 20 +-0.437479 + 30 +0.610089 + 11 +-1.371600 + 21 +1.238921 + 31 +0.610089 + 12 +-0.762000 + 22 +-0.589879 + 32 +0.914889 + 13 +-0.762000 + 23 +-0.589879 + 33 +0.914889 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +-0.762000 + 20 +-2.266279 + 30 +0.610089 + 11 +-1.219200 + 21 +-1.809079 + 31 +0.610089 + 12 +-0.762000 + 22 +-0.589879 + 32 +0.914889 + 13 +-0.762000 + 23 +-0.589879 + 33 +0.914889 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +-0.944880 + 20 +-2.571079 + 30 +0.000489 + 11 +-1.524000 + 21 +-2.266279 + 31 +0.000489 + 12 +-0.762000 + 22 +-2.266279 + 32 +0.610089 + 13 +-0.762000 + 23 +-2.266279 + 33 +0.610089 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +-1.371600 + 20 +1.238921 + 30 +0.610089 + 11 +-1.589602 + 21 +1.595716 + 31 +0.012271 + 12 +-1.467700 + 22 +2.235796 + 32 +0.010004 + 13 +-1.467700 + 23 +2.235796 + 33 +0.010004 + 62 +0 + 0 +3DFACE + 8 +0 + 10 +0.000031 + 20 +-5.353721 + 30 +0.000704 + 11 +-1.589602 + 21 +1.595716 + 31 +0.012271 + 12 +-3.936492 + 22 +3.150200 + 32 +0.018417 + 13 +-3.936492 + 23 +3.150200 + 33 +0.018417 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +-1.219200 + 20 +5.353721 + 30 +1.676889 + 11 +0.000011 + 21 +3.729320 + 31 +0.000000 + 12 +-1.219200 + 22 +4.439321 + 32 +1.676889 + 13 +-1.219200 + 23 +4.439321 + 33 +1.676889 + 62 +1 + 0 +3DFACE + 8 +0 + 10 +0.000000 + 20 +2.000921 + 30 +0.610089 + 11 +1.467700 + 21 +2.235796 + 31 +0.010004 + 12 +1.371600 + 22 +1.238921 + 32 +0.610089 + 13 +1.371600 + 23 +1.238921 + 33 +0.610089 + 62 +3 + 0 +3DFACE + 8 +0 + 10 +0.762000 + 20 +-3.790279 + 30 +0.000489 + 11 +1.371600 + 21 +1.238921 + 31 +0.610089 + 12 +1.589602 + 22 +1.595716 + 32 +0.012271 + 13 +1.589602 + 23 +1.595716 + 33 +0.012271 + 62 +3 + 0 +3DFACE + 8 +0 + 10 +3.936492 + 20 +3.150200 + 30 +0.018417 + 11 +0.000031 + 21 +-5.353721 + 31 +0.000704 + 12 +3.936492 + 22 +2.723480 + 32 +0.018509 + 13 +3.936492 + 23 +2.723480 + 33 +0.018509 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +0.000011 + 20 +3.729320 + 30 +0.000000 + 11 +1.589602 + 21 +1.595716 + 31 +0.012271 + 12 +1.467700 + 22 +2.235796 + 32 +0.010004 + 13 +1.467700 + 23 +2.235796 + 33 +0.010004 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +3.631692 + 20 +3.455000 + 30 +0.018325 + 11 +0.000031 + 21 +-5.353721 + 31 +0.000704 + 12 +3.936492 + 22 +3.150200 + 32 +0.018417 + 13 +3.936492 + 23 +3.150200 + 33 +0.018417 + 62 +3 + 0 +3DFACE + 8 +0 + 10 +0.000031 + 20 +-5.353721 + 30 +0.000704 + 11 +1.589602 + 21 +1.595716 + 31 +0.012271 + 12 +0.000011 + 22 +3.729320 + 32 +0.000000 + 13 +0.000011 + 23 +3.729320 + 33 +0.000000 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +1.219200 + 20 +4.439321 + 30 +1.676889 + 11 +0.000011 + 21 +3.729320 + 31 +0.000000 + 12 +0.304800 + 22 +2.427640 + 32 +0.396729 + 13 +0.304800 + 23 +2.427640 + 33 +0.396729 + 62 +2 + 0 +3DFACE + 8 +0 + 10 +3.631692 + 20 +3.455000 + 30 +0.018325 + 11 +1.828800 + 21 +-0.437479 + 31 +0.000489 + 12 +1.589602 + 22 +1.595716 + 32 +0.012271 + 13 +1.589602 + 23 +1.595716 + 33 +0.012271 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +1.524000 + 20 +-2.266279 + 30 +0.000489 + 11 +3.936492 + 21 +3.150200 + 31 +0.018417 + 12 +3.936492 + 22 +2.723480 + 32 +0.018509 + 13 +3.936492 + 23 +2.723480 + 33 +0.018509 + 62 +2 + 0 +3DFACE + 8 +0 + 10 +3.631692 + 20 +3.455000 + 30 +0.018325 + 11 +1.524000 + 21 +-2.266279 + 31 +0.000489 + 12 +1.828800 + 22 +-0.437479 + 32 +0.000489 + 13 +1.828800 + 23 +-0.437479 + 33 +0.000489 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +1.371600 + 20 +1.238921 + 30 +0.610089 + 11 +1.828800 + 21 +-0.437479 + 31 +0.000489 + 12 +1.371600 + 22 +-0.437479 + 32 +0.610089 + 13 +1.371600 + 23 +-0.437479 + 33 +0.610089 + 62 +3 + 0 +3DFACE + 8 +0 + 10 +1.828800 + 20 +-0.437479 + 30 +0.000489 + 11 +1.219200 + 21 +-1.809079 + 31 +0.610089 + 12 +1.371600 + 22 +-0.437479 + 32 +0.610089 + 13 +1.371600 + 23 +-0.437479 + 33 +0.610089 + 62 +3 + 0 +3DFACE + 8 +0 + 10 +1.219200 + 20 +-1.809079 + 30 +0.610089 + 11 +0.762000 + 21 +-0.589879 + 31 +0.914889 + 12 +1.371600 + 22 +-0.437479 + 32 +0.610089 + 13 +1.371600 + 23 +-0.437479 + 33 +0.610089 + 62 +3 + 0 +3DFACE + 8 +0 + 10 +1.524000 + 20 +-2.266279 + 30 +0.000489 + 11 +0.762000 + 21 +-2.266279 + 31 +0.610089 + 12 +1.219200 + 22 +-1.809079 + 32 +0.610089 + 13 +1.219200 + 23 +-1.809079 + 33 +0.610089 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +3.936492 + 20 +3.150200 + 30 +0.018417 + 11 +0.000031 + 21 +-5.353721 + 31 +0.000704 + 12 +3.936492 + 22 +2.723480 + 32 +0.018509 + 13 +3.936492 + 23 +2.723480 + 33 +0.018509 + 62 +3 + 0 +3DFACE + 8 +0 + 10 +0.000011 + 20 +3.729320 + 30 +0.000000 + 11 +1.589602 + 21 +1.595716 + 31 +0.012271 + 12 +1.467700 + 22 +2.235796 + 32 +0.010004 + 13 +1.467700 + 23 +2.235796 + 33 +0.010004 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +3.631692 + 20 +3.455000 + 30 +0.018325 + 11 +0.000031 + 21 +-5.353721 + 31 +0.000704 + 12 +3.936492 + 22 +3.150200 + 32 +0.018417 + 13 +3.936492 + 23 +3.150200 + 33 +0.018417 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +0.000031 + 20 +-5.353721 + 30 +0.000704 + 11 +1.589602 + 21 +1.595716 + 31 +0.012271 + 12 +0.000011 + 22 +3.729320 + 32 +0.000000 + 13 +0.000011 + 23 +3.729320 + 33 +0.000000 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +0.000011 + 20 +3.729320 + 30 +0.000000 + 11 +1.219200 + 21 +4.439321 + 31 +1.676889 + 12 +0.304800 + 22 +2.427640 + 32 +0.396729 + 13 +0.304800 + 23 +2.427640 + 33 +0.396729 + 62 +3 + 0 +3DFACE + 8 +0 + 10 +-1.467700 + 20 +2.235796 + 30 +0.010004 + 11 +0.000000 + 21 +2.000921 + 31 +0.610089 + 12 +-1.371600 + 22 +1.238921 + 32 +0.610089 + 13 +-1.371600 + 23 +1.238921 + 33 +0.610089 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +-1.371600 + 20 +1.238921 + 30 +0.610089 + 11 +-0.762000 + 21 +-3.790279 + 31 +0.000489 + 12 +-1.589602 + 22 +1.595716 + 32 +0.012271 + 13 +-1.589602 + 23 +1.595716 + 33 +0.012271 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +-1.467700 + 20 +2.235796 + 30 +0.010004 + 11 +0.000031 + 21 +-5.353721 + 31 +0.000704 + 12 +0.000011 + 22 +3.729320 + 32 +0.000000 + 13 +0.000011 + 23 +3.729320 + 33 +0.000000 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +-3.936492 + 20 +3.150200 + 30 +0.018417 + 11 +-1.589602 + 21 +1.595716 + 31 +0.012271 + 12 +-3.631692 + 22 +3.455000 + 32 +0.018325 + 13 +-3.631692 + 23 +3.455000 + 33 +0.018325 + 62 +3 + 0 +3DFACE + 8 +0 + 10 +-1.589602 + 20 +1.595716 + 30 +0.012271 + 11 +0.000031 + 21 +-5.353721 + 31 +0.000704 + 12 +-1.467700 + 22 +2.235796 + 32 +0.010004 + 13 +-1.467700 + 23 +2.235796 + 33 +0.010004 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +0.000031 + 20 +-5.353721 + 30 +0.000704 + 11 +-3.936492 + 21 +3.150200 + 31 +0.018417 + 12 +-3.936492 + 22 +2.723480 + 32 +0.018509 + 13 +-3.936492 + 23 +2.723480 + 33 +0.018509 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +0.000011 + 20 +3.729320 + 30 +0.000000 + 11 +-1.219200 + 21 +4.439321 + 31 +1.676889 + 12 +-0.304800 + 22 +2.427640 + 32 +0.396729 + 13 +-0.304800 + 23 +2.427640 + 33 +0.396729 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +-3.936492 + 20 +3.150200 + 30 +0.018417 + 11 +-1.524000 + 21 +-2.266279 + 31 +0.000489 + 12 +-3.936492 + 22 +2.723480 + 32 +0.018509 + 13 +-3.936492 + 23 +2.723480 + 33 +0.018509 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +-1.828800 + 20 +-0.437479 + 30 +0.000489 + 11 +-3.631692 + 21 +3.455000 + 31 +0.018325 + 12 +-1.589602 + 22 +1.595716 + 32 +0.012271 + 13 +-1.589602 + 23 +1.595716 + 33 +0.012271 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +-3.631692 + 20 +3.455000 + 30 +0.018325 + 11 +-1.524000 + 21 +-2.266279 + 31 +0.000489 + 12 +-3.936492 + 22 +3.150200 + 32 +0.018417 + 13 +-3.936492 + 23 +3.150200 + 33 +0.018417 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +-1.371600 + 20 +1.238921 + 30 +0.610089 + 11 +-1.828800 + 21 +-0.437479 + 31 +0.000489 + 12 +-1.589602 + 22 +1.595716 + 32 +0.012271 + 13 +-1.589602 + 23 +1.595716 + 33 +0.012271 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +-1.219200 + 20 +-1.809079 + 30 +0.610089 + 11 +-1.828800 + 21 +-0.437479 + 31 +0.000489 + 12 +-1.371600 + 22 +-0.437479 + 32 +0.610089 + 13 +-1.371600 + 23 +-0.437479 + 33 +0.610089 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +-0.762000 + 20 +-0.589879 + 30 +0.914889 + 11 +-1.219200 + 21 +-1.809079 + 31 +0.610089 + 12 +-1.371600 + 22 +-0.437479 + 32 +0.610089 + 13 +-1.371600 + 23 +-0.437479 + 33 +0.610089 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +-0.762000 + 20 +-2.266279 + 30 +0.610089 + 11 +-1.524000 + 21 +-2.266279 + 31 +0.000489 + 12 +-1.219200 + 22 +-1.809079 + 32 +0.610089 + 13 +-1.219200 + 23 +-1.809079 + 33 +0.610089 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +-1.467700 + 20 +2.235796 + 30 +0.010004 + 11 +0.000031 + 21 +-5.353721 + 31 +0.000704 + 12 +0.000011 + 22 +3.729320 + 32 +0.000000 + 13 +0.000011 + 23 +3.729320 + 33 +0.000000 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +-3.936492 + 20 +3.150200 + 30 +0.018417 + 11 +-1.589602 + 21 +1.595716 + 31 +0.012271 + 12 +-3.631692 + 22 +3.455000 + 32 +0.018325 + 13 +-3.631692 + 23 +3.455000 + 33 +0.018325 + 62 +3 + 0 +3DFACE + 8 +0 + 10 +-1.589602 + 20 +1.595716 + 30 +0.012271 + 11 +0.000031 + 21 +-5.353721 + 31 +0.000704 + 12 +-1.467700 + 22 +2.235796 + 32 +0.010004 + 13 +-1.467700 + 23 +2.235796 + 33 +0.010004 + 62 +4 + 0 +3DFACE + 8 +0 + 10 +0.000031 + 20 +-5.353721 + 30 +0.000704 + 11 +-3.936492 + 21 +3.150200 + 31 +0.018417 + 12 +-3.936492 + 22 +2.723480 + 32 +0.018509 + 13 +-3.936492 + 23 +2.723480 + 33 +0.018509 + 62 +2 + 0 +3DFACE + 8 +0 + 10 +-1.219200 + 20 +4.439321 + 30 +1.676889 + 11 +0.000011 + 21 +3.729320 + 31 +0.000000 + 12 +-0.304800 + 22 +2.427640 + 32 +0.396729 + 13 +-0.304800 + 23 +2.427640 + 33 +0.396729 + 62 +3 + 0 +ENDSEC + 0 +EOF diff -Nru acm-5.0/objects/aircraft/f16.obv acm-6.0+20200416/objects/aircraft/f16.obv --- acm-5.0/objects/aircraft/f16.obv 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/objects/aircraft/f16.obv 2006-01-05 13:58:55.000000000 +0000 @@ -0,0 +1,144 @@ +F-16-fighter +130 12 +1 -18.165 0 0 +2 -18.165 -1.191 0 +3 -15.187 -2.085 0 +4 -13.698 -2.382 0 +5 -17.272 -2.382 0 +6 -17.272 -3.573 0 +7 -10.923 -3.573 0 +8 -4.169 -3.573 0 +9 -4.169 -4.765 0 +10 5.598 -4.765 0 +11 18.463 -2.144 0 +12 18.939 -1.787 0 +13 22.274 -1.489 0 +14 24.895 -1.191 0 +15 27.992 0 0 +16 -6.551 -3.573 0 +17 -6.551 -15.485 0 +18 0.357 -15.485 0 +19 0.357 -15.187 0 +20 -2.978 -15.008 0 +21 5.598 -4.765 0 +22 -4.169 -4.765 0 +23 -4.169 -3.573 0 +24 -17.272 -3.573 0 +25 -17.272 -8.934 0.893 +26 -15.187 -8.934 0.893 +27 -10.923 -3.573 0 +28 27.992 0 0 +29 24.895 1.191 0 +30 22.274 1.489 0 +31 18.939 1.787 0 +32 18.463 2.144 0 +33 5.598 4.765 0 +34 -4.169 4.765 0 +35 -4.169 3.573 0 +36 -10.923 3.573 0 +37 -17.272 3.573 0 +38 -17.272 2.382 0 +39 -13.698 2.382 0 +40 -15.187 2.085 0 +41 -18.165 1.191 0 +42 -18.165 0 0 +43 5.598 4.765 0 +44 -2.978 15.008 0 +45 0.357 15.187 0 +46 0.357 15.485 0 +47 -6.551 15.485 0 +48 -6.551 3.573 0 +49 -4.169 3.573 0 +50 -4.169 4.765 0 +51 -10.923 3.573 0 +52 -15.187 8.934 0.893 +53 -17.272 8.934 0.893 +54 -17.272 3.573 0 +55 27.992 0 0 +56 23.525 0 -1.191 +57 17.272 0 -2.382 +58 15.783 0 -3.812 +59 13.996 0 -4.169 +60 11.316 0 -4.05 +61 8.338 0 -3.335 +62 1.787 0 -2.382 +63 -4.169 0 -2.382 +64 -13.936 0 -1.906 +65 -15.128 0 -1.906 +66 -15.187 0 -1.787 +67 -18.165 0 -1.191 +68 -18.165 0 0 +69 -4.169 0 -2.382 +70 -10.125 0 -4.05 +71 -15.783 0 -10.482 +72 -19.654 0 -10.482 +73 -19.654 0 -9.529 +74 -19.654 0 -9.529 +75 -16.378 0 -3.573 +76 -16.378 0 -2.144 +77 -14.889 0 -2.382 +78 -13.936 0 -2.382 +79 -13.936 0 -1.906 +80 -18.165 0 0 +81 -18.165 0 1.191 +82 -15.187 0 2.085 +83 -13.698 0 2.263 +84 -2.68 0 2.382 +85 8.04 0 2.382 +86 12.507 0 2.263 +87 12.507 0 0.596 +88 19.952 0 0.596 +89 23.525 0 0.476 +90 27.992 0 0 +91 -3.551 0 -2.382 +92 -3.551 -3.871 -0.10 +93 -3.551 -15.485 0 +94 -3.551 -15.485 0.1065 +95 -3.551 -3.871 0.142 +96 -3.551 -2.58 0.2556 +97 -3.551 -2.387 1.818 +98 -3.551 -2.102 2.015 +99 -3.551 -1.03 2.251 +100 -3.551 0 2.282 +101 -3.551 1.03 2.251 +102 -3.551 2.102 2.015 +103 -3.551 2.387 1.818 +104 -3.551 2.58 0.2556 +105 -3.551 3.871 0.142 +106 -3.551 15.485 0.1065 +107 -3.551 15.485 0 +108 -3.551 3.871 -0.10 +109 13.996 0 -4.169 +110 13.996 -0.8932 -3.692 +111 13.996 -1.191 -2.978 +112 13.996 -1.251 -2.502 +113 13.996 -1.787 -1.311 +114 13.996 -3.054 0 +115 13.996 -1.583 0.3568 +116 13.996 0 0.596 +117 13.996 1.583 0.3568 +118 13.996 3.054 0 +119 13.996 1.787 -1.311 +120 13.996 1.251 -2.502 +121 13.996 1.191 -2.978 +122 13.996 0.8932 -3.692 +123 -18.165 1.191 0 +124 -18.165 0.842 0.842 +125 -18.165 0 1.191 +126 -18.165 -0.842 0.842 +127 -18.165 -1.191 0 +128 -18.165 -0.842 -0.842 +129 -18.165 0 -1.191 +130 -18.165 0.842 -0.842 +gray44 14 109 110 111 112 113 114 115 116 117 118 119 120 121 122 +gray44 18 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 +gray44 15 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +(gray44 gray40) 8 16 17 18 19 20 21 22 23 +(gray44 gray40) 4 24 25 26 27 +gray44 15 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 +(gray40 gray44) 8 43 44 45 46 47 48 49 50 +(gray44 gray40) 4 51 52 53 54 +gray44 14 55 56 57 58 59 60 61 62 63 64 65 66 67 68 +gray44 11 69 70 71 72 73 74 75 76 77 78 79 +gray44 11 80 81 82 83 84 85 86 87 88 89 90 +(black gray44) 8 123 124 125 126 127 128 129 130 diff -Nru acm-5.0/objects/aircraft/f16.txt acm-6.0+20200416/objects/aircraft/f16.txt --- acm-5.0/objects/aircraft/f16.txt 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/objects/aircraft/f16.txt 2017-09-04 17:20:20.000000000 +0000 @@ -0,0 +1,195 @@ +# F-16 C Falcon + +aircraft "F-16" { + + Description "General Dynamics F-16C Fighting Falcon" + Object "f16.obv" + WingArea 300.0 # (wingS) Wing surface area (ft^2) + WingHalfSpan 16 # (wings) Wing half-span (ft) + WingHeight 0.0 # (wingh) Height of the wing aerodyn. center above CM (ft) + Chord 9.61 # (c) Mean geometric chord of wing (ft) + AspectRatio 3.0 # (aspectRatio) aspect ratio + EmptyWeight 14576 #(emptyWeight) Empty weight (well, actually mass) (lb) + + # Max. wing load (lbf): + MaxLoadZPositive 219000 # 9*(EmptyWeight+MaxFuel) (+9 g) + MaxLoadZNegative 73000 # 3*EmptyWeight (-3 g) + + DISEntityType 1:2:225:1:3:3:0 + DISAltEntityType 1:2:222:1:2:5:0 + + # (I(x,y,z)) Moments of inertia (lb ft^2) + Ixx 7240 + Iyy 49786 + Izz 54390 + + # (cFlap) Lift due to flaps (yields Clift of 1.0 at max extension) + CFlap 0.64279 + BetaStall 15.0 # (deg) + + CFlapDrag 0.0467 # (cFlapDrag) Drag due to Flaps + CGearDrag 0.03 # (cGearDrag) Drag due to Gear + CSpeedBrake 0.03 # (cSpeedBrake) Drag due to Speed Brake + # at 90 degrees + + # (CDb) Drag Characteristic equation [Wave+body] + # independent variable is mach number + CDb { # (CDb) Drag Characteristic equation [Wave+body] + # independent variable is mach number + 0.0, 0.020, + 0.2, 0.020, + 0.95, 0.015, + 1.05, 0.045, + 2.00, 0.030, + 10.0, 0.030 + } + + CLift { # (CLift) Lift-slope curve (vs alpha) + -3.0, 0.0, + -1.05, 0.0, + -0.576, -2.199, + -0.556, -2.23, + -0.524, -2.199, + 0.524, 2.199, + 0.556, 2.23, + 0.576, 2.199, + 1.05, 0.0, + 2.0, 0.0 + } + + CnBeta { # (CnBeta) Yaw due to sideslip equation + 0, -0.08125, + 0.523540, -0.078125, + 0.785340, -0.0609375, + 1.047198, 0.125, + 1.58, 0.0 + } + + ClBeta { # (ClBeta) Roll due to sideslip equation + 0, -0.0125, + 0.43633, -0.015, + 0.78540, 0.125, + 1.58, 0.0, + 3.142, 0.125, + } + + CDBOrigin 0 # (CDBOrigin, CDBFactor) Drag due to sideslip + CDBFactor 0.5 + CDBPhase 0 # (CDBPhase) sideslip drag phase (deg) + CYBeta -1.14 # (CYbeta) Side-force from side-slip [dCY/dBeta] + EffElevator 0.63 # (effElevator) Elevator effectiveness [Cmde(1/rad)] + EffRudder 0.085 # (effRudder) Rudder effectiveness [CYdr(1/rad)] + MaxRudder 20 # (maxRudder) max Rudder (deg) + MaxAileron 20 # (maxAileron) max Aileron (deg) + MaxFlap 20 # (maxFlap) max flap setting (deg) + # (flapRate) flap extension rate (about 2 secs to fully extend flaps) + FlapRate 10 # (deg/sec) + # (gearRate) gear extension rate (about 3 secs to fully extend gear) + GearRate 30 # (deg/sec) + MaxSpeedBrake 80 # (maxSpeedBrake) max Speed Brake setting (deg) + # (speedBrakeRate) rate of speed brake extension (2 secs to full ext) + SpeedBrakeRate 40 # (deg/sec) + # (speedBrakeIncr) speed Brake increment per keystroke + SpeedBrakeIncr 80 # (deg) + Clda 0.048 # (Clda) roll moment from aileron offset + Cldr 0.004 # (Cldr) roll moment from rudder offset + Clp -0.443 # (Clp) roll damping + Cmq -5.23 # (Cmq) pitch damping factor + Cnr -0.378 # (Cnr) yaw damping factor + CmAlpha -0.35 # (cmSlope) CmAlpha curve slope + MaxFuel 9750 # (maxFuel) maximum internal fuel (lb) + # engine lag factor (how fast does it respond to throttle changes) + EngineLag -3.0 + # Engine data based on updated RD-33K engines cited in [AirI Aug89]. + EngineType "GenericJetEngine" + # (maxThrust) max static thrust, military power (lbf) + MaxThrust 14080 + # (maxABThrust) max static thrust, afterburner on (lbf) + MaxABThrust 23540 + Thrust { # (Thrust) Mach Number vs. thrust + 0, 1, + 1.7, 1.5, + 2.0, 0.84, + 5, 0.5 + } + ABThrust { # (ABThrust) afterburner thrust table + 0, 1, + 0.5, 1, + 1, 1.21, + 1.7, 1.7, + 5, 1.64 + } + HasThrustReverser 0 # (hasThrustReverser) 0=no, otherwise yes + # (spFuelConsump) specific fuel consump(lb fuel/lb T x hr) + SpFuelConsump 0.68 + # (spABFuelConsump) AB specific fuel consump(lb fuel/lb T x hr) + SpABFuelConsump 2.55 + # (viewPoint) pilot's viewing location wrt CM + ViewPoint { 15.58, 0, -2.71 } + + # Landing Gear control parameters + + MuStatic 0.08 # (muStatic) static coeff of friction no-brakes + MuKinetic 0.05 # (muKinetic) moving coeff of friction no-brakes + MuBStatic 0.7 # (muBStatic) static brakes-on + MuBKinetic 0.6 # (muBKinetic) moving brakes-on + + MaxNWDef 72 # (maxNWDef)maximum nosewheel deflection (deg) + + # (rm) location of right main gear attachments + Rm { -1, 4, 4.5 } + # (rn) location of nose gear attachments + Rn { 14, 0, 4.5 } + Dm 3000 # main oleo damping factor (lbf s/ft) + Dn 1200 # nose oleo damping factor (lbf s/ft) + Km 32000 # main oleo spring factor (lbf/ft) + Kn 8600 # nose oleo spring factor (lbf/ft) + Gm 1.5 # main strut length with tire (ft) + Gn 1.5 # nose strut length with tire (ft) + CmMax 1.5 # (cmMax) main max oleo extension distance (ft) + CnMax 1.5 # (cnMax) nose max oleo extension distance (ft) + # (tailExtent) as we rotate, this part may drag + TailExtent { -18.165, 0.0, 1.191 } + + # Speed limits at MTOW. Leave undefined or set to 0 if unknown. + MTOW 24326.0 # maximum takeoff weight (lb) + #Vs0 42.0 # stall speed, full flaps (KIAS) + #Vs1 50.0 # stall speed, no flaps (KIAS) + #Vfe 100.0 # max speed with flaps extended (KIAS) + #Vno 145.0 # normal operation speed (KIAS) + #Vne 164.0 # never exceed speed (KIAS) + + StructurePoints 15 # (structurePts) maximum structural damage + + # Radar data based on N-019 Pulse Doppler radar cited in [AirI Aug89]. + + RadarOutput 15000 # (radarOutput) radar output (watts) + RadarTRange 60 # (radarTRange) tracking radar range (NM) + RadarDRange 80 # (radarDRange) detection radar range (NM) + TEWSThreshold 0 # Radar Warning Receiver threshold (watts) + + # Weapons + + WeaponCount 9 + + HardPoint0 { 7.0, -4.0, 0.0 } + HardPoint1 { 0.357, 15.6, 0.0 } + HardPoint2 { 0.357, -15.6, 0.0 } + HardPoint3 { 1.5, 9.0, 2.0 } + HardPoint4 { 1.5, -9.0, 2.0 } + HardPoint5 { 1.5, 8.0, 1.5 } + HardPoint6 { 1.5, -8.0, 1.5 } + HardPoint7 { 1.5, 10.0, 1.5 } + HardPoint8 { 1.5, -10.0, 1.5 } + + WeaponStation 0 "M61A1" 500 0 0 + WeaponStation 1 "AIM-9M" 0 0 0 + WeaponStation 2 "AIM-9M" 0 0 0 + WeaponStation 3 "AIM-9M" 0 0 0 + WeaponStation 4 "AIM-9M" 0 0 0 + WeaponStation 5 "AIM-9M" 0 0 0 + WeaponStation 6 "AIM-9M" 0 0 0 + WeaponStation 7 "AIM-120" 0 0 0 + WeaponStation 8 "AIM-120" 0 0 0 + +} \ No newline at end of file diff -Nru acm-5.0/objects/aircraft/f18.obv acm-6.0+20200416/objects/aircraft/f18.obv --- acm-5.0/objects/aircraft/f18.obv 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/objects/aircraft/f18.obv 2006-01-05 13:58:55.000000000 +0000 @@ -0,0 +1,204 @@ +F-18-RBR +180 22 +1 -19.9856 -1.71 1.60312 +2 -13.3594 -1.71 2.24437 +3 0.534375 -1.71 1.81688 +4 1.38938 -1.71 1.60312 +5 1.60312 -1.71 -0.748125 +6 -0.320625 -1.71 -1.38938 +7 -5.66437 -1.71 -1.81688 +8 -12.2906 -1.71 -2.24437 +9 -18.7031 -1.71 -2.03063 +10 -22.3369 -1.71 -1.92375 +11 -23.6194 -1.71 -1.49625 +12 -23.6194 -1.71 0.4275 +13 -23.6194 1.71 0.4275 +14 -23.6194 1.71 -1.49625 +15 -22.3369 1.71 -1.92375 +16 -18.7031 1.71 -2.03063 +17 -12.2906 1.71 -2.24437 +18 -5.66437 1.71 -1.81688 +19 -0.320625 1.71 -1.38938 +20 1.60312 1.71 -0.748125 +21 1.38938 1.71 1.60312 +22 0.534375 1.71 1.81688 +23 -13.3594 1.71 2.24437 +24 -19.9856 1.71 1.60312 +25 1.2825 0 0 +26 2.03063 -3.63375 0 +27 -19.1306 -3.8475 0 +28 -21.6956 -3.42 0 +29 -23.6194 -2.565 0 +30 -23.6194 -1.06875 0 +31 -21.6956 0 0 +32 -21.6956 0 0 +33 -23.6194 1.06875 0 +34 -23.6194 2.565 0 +35 -21.6956 3.42 0 +36 -19.1306 3.8475 0 +37 2.03063 3.63375 0 +38 1.2825 0 0 +39 -10.7944 -18.3825 -0.162309 +40 -11.4356 -2.9925 -1.2825 +41 1.60312 -4.06125 -1.2825 +42 -4.80938 -18.1687 -0.21375 +43 -4.80938 18.1687 -0.21375 +44 1.60312 4.06125 -1.2825 +45 -11.4356 2.9925 -1.2825 +46 -10.7944 18.3825 -0.162309 +47 18.9169 1.71 -2.35125 +48 17.4206 2.77875 -2.1375 +49 14.4281 3.20625 -1.92375 +50 11.6494 3.42 -1.74817 +51 7.37437 4.06125 -1.439 +52 4.59563 4.48875 -1.2367 +53 1.38938 4.7025 -1.03821 +54 -11.4356 3.52687 -0.498114 +55 -13.7869 1.06875 -0.67942 +56 -13.7869 -1.06875 -0.67942 +57 -11.4356 -3.52687 -0.498114 +58 1.38938 -4.7025 -1.03821 +59 4.59563 -4.48875 -1.2367 +60 7.37437 -4.06125 -1.439 +61 11.6494 -3.42 -1.74817 +62 14.4281 -3.20625 -1.92375 +63 17.4206 -2.77875 -2.1375 +64 18.9169 -1.71 -2.35125 +65 -13.68 -2.77875 0 +66 -15.8175 -4.48875 0 +67 -14.7487 -4.48875 0 +68 -22.23 -10.6875 0 +69 -24.795 -10.4737 0 +70 -25.2225 -10.0463 0 +71 -25.4363 -9.19125 0 +72 -22.4437 -3.42 0 +73 -21.8025 -3.20625 0 +74 -21.8025 3.20625 0 +75 -22.4437 3.42 0 +76 -25.4363 9.19125 0 +77 -25.2225 10.0463 0 +78 -24.795 10.4737 0 +79 -22.23 10.6875 0 +80 -14.7487 4.48875 0 +81 -15.8175 4.48875 0 +82 -13.68 2.77875 0 +83 -21.4819 0 0 +84 -14.8556 -0.855 0 +85 -6.09187 -1.49625 0 +86 4.59563 -1.92375 0 +87 19.5581 -1.71 0 +88 22.7644 -1.71 0 +89 26.6119 -1.49625 0 +90 29.1769 -0.855 0 +91 30.0319 0 0 +92 30.0319 0 0 +93 29.1769 0.855 0 +94 26.6119 1.49625 0 +95 22.7644 1.71 0 +96 19.5581 1.71 0 +97 4.59563 1.92375 0 +98 -6.09187 1.49625 0 +99 -14.8556 0.855 0 +100 -21.4819 0 0 +101 -13.68 -2.77875 0 +102 -15.8175 -4.48875 0 +103 -14.7487 -4.48875 0 +104 -22.23 -10.6875 0 +105 -24.795 -10.4737 0 +106 -25.2225 -10.0463 0 +107 -25.4363 -9.19125 0 +108 -22.4437 -3.42 0 +109 -21.8025 -3.20625 0 +110 -21.8025 3.20625 0 +111 -22.4437 3.42 0 +112 -25.4363 9.19125 0 +113 -25.2225 10.0463 0 +114 -24.795 10.4737 0 +115 -22.23 10.6875 0 +116 -14.7487 4.48875 0 +117 -15.8175 4.48875 0 +118 -13.68 2.77875 0 +119 30.5663 0 0.106875 +120 28.0012 0 0.748125 +121 25.65 0 1.17562 +122 20.9475 0 1.17562 +123 4.48875 0 1.17562 +124 -20.7338 0 0.534375 +125 -21.1612 0 -0.534375 +126 30.5663 0 0.106875 +127 28.4288 0 -1.38938 +128 25.2225 0 -2.03063 +129 20.0925 0 -3.09937 +130 15.8175 0 -5.02313 +131 12.3975 0 -5.66437 +132 10.0463 0 -5.45062 +133 7.90875 0 -5.02313 +134 4.06125 0 -4.38187 +135 -1.49625 0 -3.95437 +136 -7.90875 0 -3.31312 +137 -21.5888 0 -0.534375 +138 -21.5888 0 -0.106875 +139 -16.8863 3.43518 -1.81688 +140 -18.1687 5.77125 -9.405 +141 -14.9625 5.77125 -9.61875 +142 -8.1225 3.42 -2.35125 +143 -8.1225 -3.42 -2.35125 +144 -14.9625 -5.77125 -9.61875 +145 -18.1687 -5.77125 -9.405 +146 -16.8863 -3.43518 -1.81688 +147 -3.31312 0.21375 1.38938 +148 -3.31312 -1.2825 2.03063 +149 -3.31312 -3.42 1.81688 +150 -3.31312 -4.06125 0.748125 +151 -3.31312 -4.06125 -0.748125 +152 -3.31312 -4.48875 -1.17562 +153 -3.31312 -3.20625 -1.81688 +154 -3.31312 -1.92375 -2.45812 +155 -3.31312 0 -3.09937 +156 -3.31312 0 -3.09937 +157 -3.31312 1.92375 -2.45812 +158 -3.31312 3.20625 -1.81688 +159 -3.31312 4.48875 -1.17562 +160 -3.31312 4.06125 -0.748125 +161 -3.31312 4.06125 0.748125 +162 -3.31312 3.42 1.81688 +163 -3.31312 1.2825 2.03063 +164 -3.31312 -0.21375 1.38938 +165 12.5044 0 1.38938 +166 12.2906 -1.06875 1.17562 +167 12.0769 -2.1375 0.106875 +168 12.0341 -2.35125 -1.17562 +169 12.1196 -1.92375 -2.24437 +170 12.1624 -1.71 -3.31312 +171 12.3334 -0.855 -4.38187 +172 12.5044 0 -5.02313 +173 12.5044 0 -5.02313 +174 12.3334 0.855 -4.38187 +175 12.1624 1.71 -3.31312 +176 12.1196 1.92375 -2.24437 +177 12.0341 2.35125 -1.17562 +178 12.0769 2.1375 0.106875 +179 12.2906 1.06875 1.17562 +180 12.5044 0 1.38938 +gray44 12 1 2 3 4 5 6 7 8 9 10 11 12 +gray44 12 13 14 15 16 17 18 19 20 21 22 23 24 +gray44 7 25 26 27 28 29 30 31 +gray44 7 32 33 34 35 36 37 38 +gray44 4 39 40 41 42 +gray44 4 43 44 45 46 +gray44 9 47 48 49 50 51 52 53 54 55 +gray44 9 56 57 58 59 60 61 62 63 64 +gray44 9 65 66 67 68 69 70 71 72 73 +gray44 9 74 75 76 77 78 79 80 81 82 +gray44 9 83 84 85 86 87 88 89 90 91 +gray44 9 92 93 94 95 96 97 98 99 100 +gray44 9 101 102 103 104 105 106 107 108 109 +gray44 9 110 111 112 113 114 115 116 117 118 +gray44 7 119 120 121 122 123 124 125 +gray44 13 126 127 128 129 130 131 132 133 134 135 136 137 138 +gray44 4 139 140 141 142 +gray44 4 143 144 145 146 +gray44 9 147 148 149 150 151 152 153 154 155 +gray44 9 156 157 158 159 160 161 162 163 164 +gray44 8 165 166 167 168 169 170 171 172 +gray44 8 173 174 175 176 177 178 179 180 diff -Nru acm-5.0/objects/aircraft/il78.obv acm-6.0+20200416/objects/aircraft/il78.obv --- acm-5.0/objects/aircraft/il78.obv 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/objects/aircraft/il78.obv 2006-01-05 13:58:55.000000000 +0000 @@ -0,0 +1,253 @@ +object +226 25 +1 40.9151 7.83713 0.505125 +2 40.9151 6.75434 4.54612 +3 40.9151 3.79612 7.50434 +4 40.9151 -0.244875 8.58713 +5 40.9151 -4.28588 7.50434 +6 40.9151 -7.24409 4.54612 +7 40.9151 -8.32688 0.505125 +8 40.9151 -7.24409 -3.53588 +9 40.9151 -4.28587 -6.49409 +10 40.9151 -0.244875 -7.57688 +11 40.9151 3.79613 -6.49409 +12 40.9151 6.75434 -3.53587 +13 37.8844 36.8741 2.52563 +14 37.8844 36.5358 3.78844 +15 37.8844 35.6113 4.71288 +16 37.8844 34.3485 5.05125 +17 37.8844 33.0857 4.71288 +18 37.8844 32.1612 3.78844 +19 37.8844 31.8229 2.52563 +20 37.8844 32.1612 1.26281 +21 37.8844 33.0857 0.33837 +22 37.8844 34.3485 0 +23 37.8844 35.6113 0.33837 +24 37.8844 36.5358 1.26281 +25 37.8844 -36.5358 1.26281 +26 37.8844 -35.6113 0.33837 +27 37.8844 -34.3485 0 +28 37.8844 -33.0857 0.33837 +29 37.8844 -32.1612 1.26281 +30 37.8844 -31.8229 2.52563 +31 37.8844 -32.1612 3.78844 +32 37.8844 -33.0857 4.71288 +33 37.8844 -34.3485 5.05125 +34 37.8844 -35.6113 4.71288 +35 37.8844 -36.5358 3.78844 +36 37.8844 -36.8741 2.52563 +37 43.9459 -22.8974 -0.252562 +38 43.9459 -21.9729 -1.17701 +39 43.9459 -20.7101 -1.51538 +40 43.9459 -19.4473 -1.17701 +41 43.9459 -18.5229 -0.252563 +42 43.9459 -18.1845 1.01025 +43 43.9459 -18.5229 2.27306 +44 43.9459 -19.4473 3.19751 +45 43.9459 -20.7101 3.53588 +46 43.9459 -21.9729 3.19751 +47 43.9459 -22.8974 2.27306 +48 43.9459 -23.2358 1.01025 +49 80.3149 0 0.505125 +50 78.7995 0 -1.51538 +51 73.7483 0 -5.05125 +52 71.2226 0 -7.57688 +53 68.697 0 -8.58713 +54 62.1304 0 -9.59738 +55 -9.59738 0 -8.58713 +56 -16.6691 0 -9.09225 +57 -25.7614 0 -9.59738 +58 -39.3998 0 -9.09225 +59 -49.5023 0 -8.082 +60 -56.574 0 -6.0615 +61 -58.0894 0 -4.54612 +62 -40.9151 0 3.03075 +63 -16.164 0 6.56663 +64 11.1128 0 8.082 +65 35.8639 0 7.57688 +66 60.615 0 7.07175 +67 65.1611 0 6.56663 +68 67.6868 0 8.082 +69 70.2124 0 9.09225 +70 77.2841 0 4.041 +71 29.2973 -0 -4.041 +72 29.2973 -0 -10.1025 +73 -4.54612 -80.3149 -2.0205 +74 -4.54612 80.3149 -2.0205 +75 29.2973 0 -10.1025 +76 29.2973 0 -4.041 +77 43.9459 23.2358 1.01025 +78 43.9459 22.8974 2.27306 +79 43.9459 21.9729 3.19751 +80 43.9459 20.7101 3.53588 +81 43.9459 19.4473 3.19751 +82 43.9459 18.5229 2.27306 +83 43.9459 18.1845 1.01025 +84 43.9459 18.5229 -0.252563 +85 43.9459 19.4473 -1.17701 +86 43.9459 20.7101 -1.51538 +87 43.9459 21.9729 -1.17701 +88 43.9459 22.8974 -0.252562 +89 36.369 20.7101 3.53588 +90 29.2973 20.7101 3.53588 +91 24.7511 20.7101 2.52563 +92 24.7511 20.7101 -3.53588 +93 15.6589 20.7101 -6.56663 +94 27.2768 20.7101 -7.07175 +95 34.8536 20.7101 -4.041 +96 39.3998 20.7101 -4.041 +97 42.9356 20.7101 -3.53588 +98 42.9356 20.7101 2.0205 +99 18.6896 -3.03075 5.55638 +100 34.8536 -7.07175 5.55638 +101 31.3178 -8.58713 5.55638 +102 16.164 -10.6076 5.55638 +103 3.53588 -9.59738 5.55638 +104 -2.52563 -7.57688 5.55638 +105 -2.52563 7.57688 5.55638 +106 3.53588 9.59738 5.55638 +107 16.164 10.6076 5.55638 +108 31.3178 8.58713 5.55638 +109 34.8536 7.07175 5.55638 +110 18.6896 3.03075 5.55638 +111 28.287 -8.58713 3.03075 +112 17.1743 -8.58713 1.51538 +113 8.082 -8.58713 2.0205 +114 -5.05125 -8.58713 3.53588 +115 -13.1333 -8.58713 6.0615 +116 -3.53588 -8.58713 10.1025 +117 9.59738 -8.58713 11.6179 +118 17.6794 -8.58713 10.6076 +119 25.2563 -8.58713 8.58713 +120 32.8331 -8.58713 6.0615 +121 32.8331 8.58713 6.0615 +122 25.2563 8.58713 8.58713 +123 17.6794 8.58713 10.6076 +124 9.59738 8.58713 11.6179 +125 -3.53588 8.58713 10.1025 +126 -13.1333 8.58713 6.0615 +127 -5.05125 8.58713 3.53588 +128 8.082 8.58713 2.0205 +129 17.1743 8.58713 1.51538 +130 28.287 8.58713 3.03075 +131 30.3075 34.3485 4.54612 +132 23.2358 34.3485 4.54612 +133 18.6896 34.3485 3.53588 +134 18.6896 34.3485 -2.52563 +135 9.59738 34.3485 -5.55638 +136 21.2153 34.3485 -6.0615 +137 28.7921 34.3485 -3.03075 +138 33.3383 34.3485 -3.03075 +139 36.8741 34.3485 -2.52563 +140 36.8741 34.3485 3.03075 +141 42.9356 -20.7101 2.0205 +142 42.9356 -20.7101 -3.53588 +143 39.3998 -20.7101 -4.041 +144 34.8536 -20.7101 -4.041 +145 27.2768 -20.7101 -7.07175 +146 15.6589 -20.7101 -6.56663 +147 24.7511 -20.7101 -3.53588 +148 24.7511 -20.7101 2.52563 +149 29.2973 -20.7101 3.53588 +150 36.369 -20.7101 3.53588 +151 36.8741 -34.3485 3.03075 +152 36.8741 -34.3485 -2.52563 +153 33.3383 -34.3485 -3.03075 +154 28.7921 -34.3485 -3.03075 +155 21.2153 -34.3485 -6.0615 +156 9.59738 -34.3485 -5.55638 +157 18.6896 -34.3485 -2.52563 +158 18.6896 -34.3485 3.53588 +159 23.2358 -34.3485 4.54612 +160 30.3075 -34.3485 4.54612 +161 -61.6253 0.505125 -4.54612 +162 -39.3998 -4.54612 -4.54612 +163 -27.7819 -8.082 -4.54612 +164 31.3178 -8.082 -4.54612 +165 34.3485 -0.505125 -4.54612 +166 34.3485 0.505125 -4.54612 +167 31.3178 8.082 -4.54612 +168 -27.7819 8.082 -4.54612 +169 -39.3998 4.54612 -4.54612 +170 -61.6253 -0.505125 -4.54612 +171 -49.5023 0.505125 0 +172 -33.3383 -2.52563 0 +173 -22.2255 -4.54612 0 +174 -12.123 -8.082 0 +175 52.0279 -7.07175 0 +176 63.1406 -6.56663 0 +177 70.7175 -5.55638 0 +178 79.3046 -3.03075 0 +179 81.3251 -0.505125 0 +180 81.3251 0.505125 0 +181 79.3046 3.03075 0 +182 70.7175 5.55638 0 +183 63.1406 6.56663 0 +184 52.0279 7.07175 0 +185 -12.123 8.082 0 +186 -22.2255 4.54612 0 +187 -33.3383 2.52563 0 +188 -49.5023 -0.505125 0 +189 38.8946 -6.0615 -6.77563 +190 42.4305 -0 -7.15167 +191 5.55638 0.505125 -9.32963 +192 5.05125 -6.56663 -8.68184 +193 3.53588 -34.8536 -6.0615 +194 -8.082 -78.7995 -2.52563 +195 -1.01025 -79.8098 -2.0205 +196 -1.01025 79.8098 -2.0205 +197 -8.082 78.7995 -2.52563 +198 3.53588 34.8536 -6.0615 +199 5.05125 6.56663 -8.68184 +200 5.55638 -0.505125 -9.32963 +201 42.4305 0 -7.15167 +202 38.8946 6.0615 -6.77563 +203 -59.6048 -0.505125 -32.328 +204 -68.1919 -26.2665 -32.328 +205 -62.1304 -25.2563 -32.328 +206 -45.4613 -3.03075 -32.328 +207 -44.451 0.505125 -32.328 +208 -44.451 -0.505125 -32.328 +209 -45.4613 3.03075 -32.328 +210 -62.1304 25.2563 -32.328 +211 -68.1919 26.2665 -32.328 +212 -59.6048 0.505125 -32.328 +213 -17.1743 0 -9.09225 +214 -25.2563 0 -11.6179 +215 -29.8024 0 -14.1435 +216 -42.9356 -0 -27.2768 +217 -42.9356 -0 -30.8126 +218 -36.369 -0 -32.8331 +219 -43.9459 -0 -34.3485 +220 -56.0689 -0 -33.8434 +221 -64.656 -0 -32.328 +222 -71.2226 -0 -29.2973 +223 -63.1406 -0 -28.7921 +224 -53.5433 -0 -10.1025 +225 -53.5433 -0 -8.082 +226 -56.574 -0 -4.54612 +gray44 12 1 2 3 4 5 6 7 8 9 10 11 12 +gray44 12 13 14 15 16 17 18 19 20 21 22 23 24 +gray44 12 25 26 27 28 29 30 31 32 33 34 35 36 +gray44 12 37 38 39 40 41 42 43 44 45 46 47 48 +gray44 22 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 +gray44 3 71 72 73 +gray44 3 74 75 76 +gray44 12 77 78 79 80 81 82 83 84 85 86 87 88 +gray44 10 89 90 91 92 93 94 95 96 97 98 +gray44 6 99 100 101 102 103 104 +gray44 6 105 106 107 108 109 110 +gray44 10 111 112 113 114 115 116 117 118 119 120 +gray44 10 121 122 123 124 125 126 127 128 129 130 +gray44 10 131 132 133 134 135 136 137 138 139 140 +gray44 10 141 142 143 144 145 146 147 148 149 150 +gray44 10 151 152 153 154 155 156 157 158 159 160 +gray44 5 161 162 163 164 165 +gray44 5 166 167 168 169 170 +gray44 9 171 172 173 174 175 176 177 178 179 +gray44 9 180 181 182 183 184 185 186 187 188 +gray44 7 189 190 191 192 193 194 195 +gray44 7 196 197 198 199 200 201 202 +gray44 5 203 204 205 206 207 +gray44 5 208 209 210 211 212 +gray44 14 213 214 215 216 217 218 219 220 221 222 223 224 225 226 diff -Nru acm-5.0/objects/aircraft/kc135.obv acm-6.0+20200416/objects/aircraft/kc135.obv --- acm-5.0/objects/aircraft/kc135.obv 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/objects/aircraft/kc135.obv 2006-01-05 13:58:55.000000000 +0000 @@ -0,0 +1,273 @@ +object +237 34 +1 -24.141 0.135459 6.78832 +2 -24.141 1.70305 6.78832 +3 -24.141 3.89769 5.84776 +4 -24.141 6.40584 1.77202 +5 -24.141 7.03288 -1.67669 +6 -24.141 5.7788 -5.75244 +7 -24.141 4.52472 -7.94707 +8 -24.141 -0.17806 -9.20115 +9 -24.141 0.241181 -9.30906 +10 -24.141 -4.4616 -8.05499 +11 -24.141 -5.71568 -5.86035 +12 -24.141 -6.96975 -1.78461 +13 -24.141 -6.34272 1.6641 +14 -24.141 -3.83457 5.73985 +15 -24.141 -1.63993 6.6804 +16 -24.141 -0.072338 6.6804 +17 -54.8658 -1.88111 -3.76223 +18 -72.1094 -22.5734 -7.83797 +19 -80.2608 -22.5734 -7.83797 +20 -71.4823 0 -3.3917 +21 18.108 31.5999 4.00309 +22 -2.60576 31.5999 4.00309 +23 -2.60576 31.5999 5.06146 +24 1.32532 31.5999 5.96863 +25 9.79227 31.5999 6.57341 +26 11.0018 31.5999 7.32939 +27 17.9568 31.5999 6.8758 +28 17.9923 31.5999 1.05837 +29 11.0373 31.5999 0.604782 +30 9.82771 31.5999 1.36076 +31 1.36076 31.5999 1.96554 +32 -2.57032 31.5999 2.87271 +33 -2.57032 31.5999 3.93108 +34 18.1435 31.5999 3.93108 +35 18.1435 -31.5999 3.93108 +36 -2.57032 -31.5999 3.93108 +37 -2.57032 -31.5999 2.87271 +38 1.36076 -31.5999 1.96554 +39 9.82771 -31.5999 1.36076 +40 11.0373 -31.5999 0.604782 +41 17.9923 -31.5999 1.05837 +42 17.9568 -31.5999 6.8758 +43 11.0018 -31.5999 7.32939 +44 9.79227 -31.5999 6.57341 +45 1.32532 -31.5999 5.96863 +46 -2.60576 -31.5999 5.06146 +47 -2.60576 -31.5999 4.00309 +48 18.108 -31.5999 4.00309 +49 2.9232 -49.8885 6.40654 +50 -4.03179 -49.8885 6.86012 +51 -5.24135 -49.8885 6.10415 +52 -13.7083 -49.8885 5.49936 +53 -17.6394 -49.8885 4.59219 +54 -17.6394 -49.8885 3.53382 +55 3.0744 -49.8885 3.53382 +56 3.10983 -49.8885 3.46182 +57 -17.6039 -49.8885 3.46182 +58 -17.6039 -49.8885 2.40345 +59 -13.6729 -49.8885 1.49628 +60 -5.20592 -49.8885 0.891493 +61 -3.99635 -49.8885 0.135516 +62 2.95864 -49.8885 0.589102 +63 2.95864 49.8885 0.589102 +64 -3.99635 49.8885 0.135516 +65 -5.20592 49.8885 0.891493 +66 -13.6729 49.8885 1.49628 +67 -17.6039 49.8885 2.40345 +68 -17.6039 49.8885 3.46182 +69 3.10983 49.8885 3.46182 +70 3.0744 49.8885 3.53382 +71 -17.6394 49.8885 3.53382 +72 -17.6394 49.8885 4.59219 +73 -13.7083 49.8885 5.49936 +74 -5.24135 49.8885 6.10415 +75 -4.03179 49.8885 6.86012 +76 2.9232 49.8885 6.40654 +77 17.937 -29.8366 5.59983 +78 17.937 -31.7615 6.12482 +79 17.937 -33.249 5.68733 +80 17.937 -34.5615 4.02488 +81 17.937 -33.949 2.09994 +82 17.937 -31.849 1.31246 +83 17.937 -29.7491 2.18743 +84 17.937 -28.9616 4.02488 +85 46.7143 0.313519 6.5839 +86 46.7143 1.88111 6.5839 +87 46.7143 4.07575 5.64334 +88 46.7143 6.5839 1.56759 +89 46.7143 7.21094 -1.88111 +90 46.7143 5.95686 -5.95686 +91 46.7143 4.70278 -8.15149 +92 46.7143 -0 -9.40557 +93 46.7143 0 -9.40557 +94 46.7143 -4.70278 -8.15149 +95 46.7143 -5.95686 -5.95686 +96 46.7143 -7.21094 -1.88111 +97 46.7143 -6.5839 1.56759 +98 46.7143 -4.07575 5.64334 +99 46.7143 -1.88111 6.5839 +100 46.7143 -0.313519 6.5839 +101 2.17721 -1.41805 -2.54008 +102 -11.9747 -5.98734 1.81435 +103 23.7679 -6.16878 3.62869 +104 72.5738 -0 -0.907173 +105 72.5738 0 -0.907173 +106 23.7679 6.16878 3.62869 +107 -11.9747 5.98734 1.81435 +108 2.17721 1.41805 -2.54008 +109 -71.4823 -0 -3.3917 +110 -80.2608 22.5734 -7.83797 +111 -72.1094 22.5734 -7.83797 +112 -54.8658 1.88111 -3.76223 +113 -76.4986 -0 -4.35987 +114 -44.2062 5.0163 -3.63486 +115 -29.4708 5.95686 -3.31808 +116 54.2388 6.5839 -1.56759 +117 71.4823 2.19463 -1.25408 +118 72.4229 0.313519 -1.25408 +119 72.4229 -0.313519 -1.25408 +120 71.4823 -2.19463 -1.25408 +121 54.2388 -6.5839 -1.56759 +122 -29.4708 -5.95686 -3.31808 +123 -44.2062 -5.0163 -3.63486 +124 -76.4986 0 -4.35987 +125 -11.9137 6.27038 1.8973 +126 -12.2272 11.6002 1.46206 +127 -15.3624 28.8437 -0.0389337 +128 -35.7412 73.3634 -4.45217 +129 -28.8437 72.4229 -4.07575 +130 -25.0815 70.5418 -3.76223 +131 23.5139 6.27038 3.44871 +132 23.5139 -6.27038 3.44871 +133 -25.0815 -70.5418 -3.76223 +134 -28.8437 -72.4229 -4.07575 +135 -35.7412 -73.3634 -4.45217 +136 -15.3624 -28.8437 -0.0389337 +137 -12.2272 -11.6002 1.46206 +138 -11.9137 -6.27038 1.8973 +139 18.1841 -31.6654 4.07575 +140 -2.82167 -31.3519 4.07575 +141 -2.82167 -32.9195 4.07575 +142 1.56759 -33.86 4.07575 +143 10.3461 -34.1736 4.07575 +144 11.6002 -34.8006 4.07575 +145 18.1841 -34.4871 4.07575 +146 18.1841 -28.8437 4.07575 +147 11.6002 -28.5302 4.07575 +148 10.3461 -29.1573 4.07575 +149 1.56759 -29.4708 4.07575 +150 -2.82167 -30.4113 4.07575 +151 -2.82167 -31.9789 4.07575 +152 18.1841 -31.6654 4.07575 +153 3.13519 49.8495 3.44871 +154 -17.8706 50.163 3.44871 +155 -17.8706 48.5954 3.44871 +156 -13.4813 47.6549 3.44871 +157 -4.70278 47.3414 3.44871 +158 -3.44871 46.7143 3.44871 +159 3.13519 47.0278 3.44871 +160 3.13519 52.6712 3.44871 +161 -3.44871 52.9847 3.44871 +162 -4.70278 52.3577 3.44871 +163 -13.4813 52.0441 3.44871 +164 -17.8706 51.1036 3.44871 +165 -17.8706 49.536 3.44871 +166 3.13519 49.8495 3.44871 +167 3.13519 -49.8495 3.44871 +168 -17.8706 -49.536 3.44871 +169 -17.8706 -51.1036 3.44871 +170 -13.4813 -52.0441 3.44871 +171 -4.70278 -52.3577 3.44871 +172 -3.44871 -52.9847 3.44871 +173 3.13519 -52.6712 3.44871 +174 3.13519 -47.0278 3.44871 +175 -3.44871 -46.7143 3.44871 +176 -4.70278 -47.3414 3.44871 +177 -13.4813 -47.6549 3.44871 +178 -17.8706 -48.5954 3.44871 +179 -17.8706 -50.163 3.44871 +180 3.13519 -49.8495 3.44871 +181 72.7364 0 -1.25408 +182 69.9147 0 -3.44871 +183 65.839 0 -5.0163 +184 58.3145 0 -8.15149 +185 47.0278 0 -8.77853 +186 -39.5034 0 -7.83797 +187 -75.2445 0 -6.5839 +188 -74.931 0 -3.13519 +189 -45.4602 0 3.76223 +190 -27.5897 0 5.95686 +191 48.5954 0 5.64334 +192 61.1362 0 4.38926 +193 70.5418 0 1.25408 +194 -45.1467 0 -6.89742 +195 -48.909 0 -8.77853 +196 -53.6117 0 -11.2867 +197 -67.7201 0 -32.9195 +198 -75.5581 0 -32.9195 +199 -69.9147 0 -5.64334 +200 18.1841 31.6654 4.07575 +201 -2.82167 31.9789 4.07575 +202 -2.82167 30.4113 4.07575 +203 1.56759 29.4708 4.07575 +204 10.3461 29.1573 4.07575 +205 11.6002 28.5302 4.07575 +206 18.1841 28.8437 4.07575 +207 3.24076 47.1051 3.66201 +208 3.24076 47.8926 1.82457 +209 3.24076 49.9925 0.949592 +210 3.24076 52.0924 1.73707 +211 3.24076 52.7049 3.66201 +212 3.24076 51.3925 5.32446 +213 3.24076 49.905 5.76195 +214 3.24076 47.9801 5.23696 +215 3.24076 -47.9801 5.23696 +216 3.24076 -49.905 5.76195 +217 3.24076 -51.3925 5.32446 +218 3.24076 -52.7049 3.66201 +219 3.24076 -52.0924 1.73707 +220 3.24076 -49.9925 0.949592 +221 3.24076 -47.8926 1.82457 +222 3.24076 -47.1051 3.66201 +223 17.937 28.9616 4.02488 +224 17.937 29.7491 2.18743 +225 17.937 31.849 1.31246 +226 17.937 33.949 2.09994 +227 17.937 34.5615 4.02488 +228 17.937 33.249 5.68733 +229 17.937 31.7615 6.12482 +230 17.937 29.8366 5.59983 +231 18.1841 34.4871 4.07575 +232 11.6002 34.8006 4.07575 +233 10.3461 34.1736 4.07575 +234 1.56759 33.86 4.07575 +235 -2.82167 32.9195 4.07575 +236 -2.82167 31.3519 4.07575 +237 18.1841 31.6654 4.07575 +gray44 8 1 2 3 4 5 6 7 8 +gray44 8 9 10 11 12 13 14 15 16 +gray44 4 17 18 19 20 +gray44 7 21 22 23 24 25 26 27 +gray44 7 28 29 30 31 32 33 34 +gray44 7 35 36 37 38 39 40 41 +gray44 7 42 43 44 45 46 47 48 +gray44 7 49 50 51 52 53 54 55 +gray44 7 56 57 58 59 60 61 62 +gray44 7 63 64 65 66 67 68 69 +gray44 7 70 71 72 73 74 75 76 +gray44 8 77 78 79 80 81 82 83 84 +gray44 8 85 86 87 88 89 90 91 92 +gray44 8 93 94 95 96 97 98 99 100 +gray44 4 101 102 103 104 +gray44 4 105 106 107 108 +gray44 4 109 110 111 112 +gray44 6 113 114 115 116 117 118 +gray44 6 119 120 121 122 123 124 +gray44 7 125 126 127 128 129 130 131 +gray44 7 132 133 134 135 136 137 138 +gray44 7 139 140 141 142 143 144 145 +gray44 7 146 147 148 149 150 151 152 +gray44 7 153 154 155 156 157 158 159 +gray44 7 160 161 162 163 164 165 166 +gray44 7 167 168 169 170 171 172 173 +gray44 7 174 175 176 177 178 179 180 +gray44 13 181 182 183 184 185 186 187 188 189 190 191 192 193 +gray44 6 194 195 196 197 198 199 +gray44 7 200 201 202 203 204 205 206 +gray44 8 207 208 209 210 211 212 213 214 +gray44 8 215 216 217 218 219 220 221 222 +gray44 8 223 224 225 226 227 228 229 230 +gray44 7 231 232 233 234 235 236 237 diff -Nru acm-5.0/objects/aircraft/md81.txt acm-6.0+20200416/objects/aircraft/md81.txt --- acm-5.0/objects/aircraft/md81.txt 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/objects/aircraft/md81.txt 2017-10-22 14:28:26.000000000 +0000 @@ -0,0 +1,177 @@ +aircraft "MD-81" { + + # EXPERIMENTAL - not finished yet + # See also: http://www.md80.it/OLDFILES/downloads/MD80POH.html + + Description "McDonnel-Douglas MD-81" + Object "ufo.obv" # FIXME + WingArea 1270 # (wingS) Wing surface area (ft^2) + WingHalfSpan 54 # (wings) Wing half-span (ft) + WingHeight 1.0 # (wingh) Height of the wing aerodyn. center above CM (ft) + Chord 15 # (c) Mean geometric chord of wing (ft) + AspectRatio 9.18 # (aspectRatio) aspect ratio + EmptyWeight 78432 # (emptyWeight) Empty weight (well, actually mass) (lb) + + # Max. wing load (lbf): + MaxLoadZPositive 3.5e6 # 2.5*MTOW (+2.5 g at MTOW) + MaxLoadZNegative 77500 # 0.5*(MTOW + 150*100) + + DISEntityType 1:2:225:87:32:2:1 + DISAltEntityType 1:2:225:87:32:2:1 + + # (I(x,y,z)) Moments of inertia (lb ft^2) + Ixx 0.5e6 + Iyy 1.5e6 + Izz 1.9e6 + + # (cFlap) Lift due to flaps (yields Clift of 1.0 at max extension) + CFlap 0.8 + BetaStall 15.0 # (deg) + + CFlapDrag 0.07 # (cFlapDrag) Drag due to Flaps + CGearDrag 0.03 # (cGearDrag) Drag due to Gear + CSpeedBrake 0.03 # (cSpeedBrake) Drag due to Speed Brake + # at 90 degrees + + # (CDb) Drag Characteristic equation [Wave+body] + # independent variable is mach number + CDb { # (CDb) Drag Characteristic equation [Wave+body] + # independent variable is mach number + 0.0, 0.020, + 0.2, 0.020, + 0.95, 0.015, + 1.05, 0.045, + 2.00, 0.030, + 10.0, 0.030 + } + + CLift { # (CLift) Lift-slope curve (vs alpha) + -3.0, 0.0, + -1.05, 0.0, + -0.3316, -1.65, + -0.2967, -1.7, + -0.2618, -1.65, + 0.2618, 1.65, # 15 DEG (CLmax, stall begin) + 0.2967, 1.2, # 17 DEG + 0.3316, 0.8, # 19 DEG + 1.05, 0.0, + 2.0, 0.0 + } + + CnBeta { # (CnBeta) Yaw due to sideslip equation + 0, -0.08125, + 0.523540, -0.078125, + 0.785340, -0.0609375, + 1.047198, 0.125, + 1.58, 0.0 + } + + ClBeta { # (ClBeta) Roll due to sideslip equation + 0, -0.0125, + 0.43633, -0.015, + 0.78540, 0.125, + 1.58, 0.0, + 3.142, 0.125, + } + + CDBOrigin 0 # (CDBOrigin, CDBFactor) Drag due to sideslip + CDBFactor 0.5 + CDBPhase 0 # (CDBPhase) sideslip drag phase (deg) + CYBeta -1.0 # (CYbeta) Side-force from side-slip [dCY/dBeta] + EffElevator 0.8 # (effElevator) Elevator effectiveness + EffRudder 0.50 # (effRudder) Rudder effectiveness + MaxRudder 20 # (maxRudder) max Rudder (deg) + MaxAileron 25 # (maxAileron) max Aileron (deg) + MaxFlap 30 # (maxFlap) max flap setting (deg) + # (flapRate) flap extension rate + FlapRate 4 # (deg/sec) + MaxSpeedBrake 90 # (maxSpeedBrake) max Speed Brake setting (deg) + # (speedBrakeRate) rate of speed brake extension (4 secs to full ext) + SpeedBrakeRate 20 # (deg/sec) + # (speedBrakeIncr) speed Brake increment per keystroke + SpeedBrakeIncr 30 # (deg) + Clda 0.048 # (Clda) roll moment from aileron offset + Cldr 0.004 # (Cldr) roll moment from rudder offset + Clp -0.27 # (Clp) roll damping + Cmq -8.0 # (Cmq) pitch damping factor + Cnr -1.0 # (Cnr) yaw damping factor + CmAlpha -0.30 # (cmSlope) CmAlpha curve slope + + MaxFuel 39160 # (maxFuel) maximum internal fuel (lb) + EngineType "GenericJetEngine" + # engine lag factor (how fast does it respond to throttle changes) + EngineLag -4.0 + # (maxThrust) max static thrust, military power (lbf) + MaxThrust 37000 + # (maxABThrust) max static thrust, afterburner on (lbf) + MaxABThrust 37000 + Thrust { # (Thrust) Mach Number vs. thrust + 0, 1, + 1.7, 1.5, + 2.0, 0.84, + 5, 0.5 + } + ABThrust { # (Thrust) Mach Number vs. thrust + 0, 1, + 1.7, 1.5, + 2.0, 0.84, + 5, 0.5 + } + HasThrustReverser 1 # (hasThrustReverser) 0=no, otherwise yes + # (spFuelConsump) specific fuel consump(lb fuel/lb T x hr) + SpFuelConsump 0.6 + # (spABFuelConsump) AB specific fuel consump(lb fuel/lb T x hr) + SpABFuelConsump 0.6 + # (viewPoint) pilot's viewing location wrt CM + ViewPoint { 65, -3, -6 } + + # Landing Gear control parameters + + MuStatic 0.08 # (muStatic) static coeff of friction no-brakes + MuKinetic 0.05 # (muKinetic) moving coeff of friction no-brakes + MuBStatic 0.6 # (muBStatic) static brakes-on + MuBKinetic 0.4 # (muBKinetic) moving brakes-on + + MaxNWDef 82 # (maxNWDef) maximum nosewheel deflection (deg) + + # (gearRate) gear extension rate: + GearRate 10 # (deg/sec) + # (rn) location of nose gear attachments + Rn { 68, 0, 2 } + # (rm) location of right main gear attachments + Rm { -2, 8.33, 2 } + Gn 6 # nose strut length with tire (ft) + Gm 6 # main strut length with tire (ft) + CnMax 3.0 # (cnMax) nose max oleo extension distance (ft) + CmMax 3.0 # (cmMax) main max oleo extension distance (ft) + + Kn 7000 # nose oleo spring factor (lbf/ft) + Km 88000 # main oleo spring factor (lbf/ft) + Dn 1000 # nose oleo damping factor (lbf s/ft) + Dm 15600 # main oleo damping factor (lbf s/ft) + + # (tailExtent) as we rotate, this part may drag + TailExtent { 28, 0, 2.4 } + + # Speed limits at MTOW. Leave undefined or set to 0 if unknown. + MTOW 140000.0 # maximum takeoff weight (lb) + #Vs0 ?? # stall speed, full flaps (KIAS) + #Vs1 ?? # stall speed, no flaps (KIAS) + Vfe 235.0 # max speed with flaps extended (KIAS) + Vno 340.0 # normal operation speed (KIAS) + Vne 499.0 # never exceed speed (KIAS) + + StructurePoints 1 # (structurePts) maximum structural damage + + # Radar data based on N-019 Pulse Doppler radar cited in [AirI Aug89]. + + RadarOutput 0 # (radarOutput) radar output (watts) + RadarTRange 0 # (radarTRange) tracking radar range (NM) + RadarDRange 0 # (radarDRange) detection radar range (NM) + TEWSThreshold 0 # Radar Warning Receiver threshold (watts) + + # Weapons + + WeaponCount 0 + +} \ No newline at end of file diff -Nru acm-5.0/objects/aircraft/mig23.obv acm-6.0+20200416/objects/aircraft/mig23.obv --- acm-5.0/objects/aircraft/mig23.obv 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/objects/aircraft/mig23.obv 2006-01-05 13:58:55.000000000 +0000 @@ -0,0 +1,100 @@ +mig-23-wings-swept +88 10 +1 36.5891 0 0 +2 34.4368 0.86092 0 +3 30.9931 1.29138 0 +4 27.119 1.72184 0 +5 20.6621 1.72184 0 +6 18.9402 2.1523 0 +7 14.2052 3.01322 0 +8 -3.44368 2.58276 0 +9 -9.03966 2.1523 0 +10 -16.7879 0.86092 0 +11 -18.0793 0.43046 0 +12 -18.0793 0 0 +13 36.5891 0 0 +14 34.4368 -0.86092 0 +15 30.9931 -1.29138 0 +16 27.119 -1.72184 0 +17 20.6621 -1.72184 0 +18 18.9402 -2.1523 0 +19 14.2052 -3.01322 0 +20 -3.44368 -2.58276 0 +21 -9.03966 -2.1523 0 +22 -16.7879 -0.86092 0 +23 -18.0793 -0.43046 0 +24 -18.0793 0 0 +25 14.2052 3.01322 -3.01322 +26 4.73506 7.31782 -3.01322 +27 6.02644 8.6092 -3.01322 +28 -11.192 13.7747 -3.01322 +29 -12.0529 13.7747 -3.01322 +30 -14.2052 11.192 -3.01322 +31 -14.2052 10.7615 -3.01322 +32 -3.44368 2.58276 -3.01322 +33 14.2052 -3.01322 -3.01322 +34 4.73506 -7.31782 -3.01322 +35 6.02644 -8.6092 -3.01322 +36 -11.192 -13.7747 -3.01322 +37 -12.0529 -13.7747 -3.01322 +38 -14.2052 -11.192 -3.01322 +39 -14.2052 -10.7615 -3.01322 +40 -3.44368 -2.58276 -3.01322 +41 -18.9402 3.01322 -1.72184 +42 -20.2316 7.31782 -1.72184 +43 -18.5098 8.6092 -1.72184 +44 -9.03966 2.1523 -1.72184 +45 -16.7879 0.86092 -1.72184 +46 -18.9402 -3.01322 -1.72184 +47 -20.2316 -7.31782 -1.72184 +48 -18.5098 -8.6092 -1.72184 +49 -9.03966 -2.1523 -1.72184 +50 -16.7879 -0.86092 -1.72184 +51 36.5891 0 0 +52 33.1454 0 -1.29138 +53 30.1322 0 -2.1523 +54 25.8276 0 -2.58276 +55 22.3839 0 -3.87414 +56 18.0793 0 -4.3046 +57 9.47012 0 -3.87414 +58 -0.860918 0 -3.44368 +59 -8.6092 0 -6.02644 +60 -16.3575 0 -10.331 +61 -18.9402 0 -9.03966 +62 -18.0793 0 -3.87414 +63 -19.8012 0 -3.44368 +64 -17.2184 0 -1.72184 +65 -18.0793 0 -1.72184 +66 -18.0793 0 1.29138 +67 -15.4966 0 1.72184 +68 -6.4569 0 2.1523 +69 10.331 0 2.1523 +70 20.2316 0 1.72184 +71 28.8408 0 1.29138 +72 33.1454 0 0.86092 +73 -15.4966 0 1.72184 +74 -15.4966 0 4.3046 +75 -13.3443 0 5.16552 +76 -6.4569 0 2.1523 +77 20.6621 1.72184 -3.01322 +78 18.9402 2.1523 -3.01322 +79 14.2052 3.01322 -3.01322 +80 -3.44368 2.58276 -3.01322 +81 -3.44368 -2.58276 -3.01322 +82 14.2052 -3.01322 -3.01322 +83 18.9402 -2.1523 -3.01322 +84 20.6621 -1.72184 -3.01322 +85 -3.44368 2.58276 -3.01322 +86 -16.7879 0.86092 -1.72184 +87 -16.7879 -0.86092 -1.72184 +88 -3.44368 -2.58276 -3.01322 +gray44 12 1 2 3 4 5 6 7 8 9 10 11 12 +gray44 12 13 14 15 16 17 18 19 20 21 22 23 24 +gray44 8 25 26 27 28 29 30 31 32 +gray44 8 33 34 35 36 37 38 39 40 +gray44 5 41 42 43 44 45 +gray44 5 46 47 48 49 50 +gray44 22 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 +gray44 4 73 74 75 76 +gray44 8 77 78 79 80 81 82 83 84 +gray44 4 85 86 87 88 diff -Nru acm-5.0/objects/aircraft/mig25.obv acm-6.0+20200416/objects/aircraft/mig25.obv --- acm-5.0/objects/aircraft/mig25.obv 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/objects/aircraft/mig25.obv 2006-01-05 13:58:55.000000000 +0000 @@ -0,0 +1,186 @@ +Mig-25-RBR +159 25 +1 -10.0068 -3.35328 -2.65239 +2 -24.836 -3.49633 -1.80845 +3 -24.7758 -4.21971 1.3262 +4 -12.7797 -4.40056 1.92901 +5 -12.7797 4.40056 1.92901 +6 -24.7758 4.21971 1.3262 +7 -24.836 3.49633 -1.80845 +8 -10.0068 3.35328 -2.65239 +9 -12.7312 4.48625 1.94 +10 -15.2775 5.335 3.75875 +11 -24.4925 4.85 2.6675 +12 -24.735 4.23235 1.33375 +13 -23.28 4.22906 1.33375 +14 -10 -4.86127 -2.5 +15 -10.25 -5.75 2.25 +16 12.875 -5.625 2.25 +17 20.75 -4.625 -2.875 +18 20.75 4.625 -2.875 +19 12.875 5.625 2.25 +20 -10.25 5.75 2.25 +21 -10 4.86127 -2.5 +22 12.8867 -2.22292 2.32396 +23 20.7135 -2.62708 -3.03125 +24 20.7135 -4.95104 -3.03125 +25 13.0344 -4.95104 2.22292 +26 13.0344 4.95104 2.22292 +27 20.7135 4.95104 -3.03125 +28 20.7135 2.62708 -3.03125 +29 12.8867 2.22292 2.32396 +30 41.4675 0 0 +31 35.89 1.6975 0 +32 29.2212 2.425 0 +33 23.0375 2.54625 0 +34 13.095 2.425 0 +35 12.8525 5.69875 0 +36 1.6975 5.94125 0 +37 -11.155 5.82 0 +38 -24.735 4.97125 0 +39 -26.19 4.48625 0 +40 -25.8262 0.60625 0 +41 -23.0375 -0.12125 0 +42 -19.5212 0.12125 -2.7672 +43 -19.7637 4.72875 -2.98536 +44 -10.67 5.69875 -3.06372 +45 2.78875 5.82 -3.11723 +46 12.7312 5.82 -3.1525 +47 20.855 5.21375 -3.1525 +48 20.7338 0.12125 -2.91 +49 20.7338 -0.12125 -2.91 +50 20.855 -5.21375 -3.1525 +51 12.7312 -5.82 -3.1525 +52 2.78875 -5.82 -3.11723 +53 -10.67 -5.69875 -3.06372 +54 -19.7637 -4.72875 -2.98536 +55 -19.5212 -0.12125 -2.7672 +56 4.72875 -0.12125 1.59646 +57 4.72875 2.06125 2.44521 +58 4.72875 4.00125 2.68771 +59 4.72875 5.0925 2.44521 +60 4.72875 5.5775 1.47521 +61 4.72875 5.5775 -3.01104 +62 4.72875 0 -3.37479 +63 4.72875 0 -3.37479 +64 4.72875 -5.5775 -3.01104 +65 4.72875 -5.5775 1.47521 +66 4.72875 -5.0925 2.44521 +67 4.72875 -4.00125 2.68771 +68 4.72875 -2.06125 2.44521 +69 4.72875 0.12125 1.59646 +70 20.855 0 2.6675 +71 20.855 1.455 2.54625 +72 20.855 2.425 0.84875 +73 20.855 2.06125 -3.03125 +74 20.855 1.33375 -3.395 +75 20.855 0.97 -4.24375 +76 20.855 -0.12125 -4.48625 +77 20.855 0.12125 -4.48625 +78 20.855 -0.97 -4.24375 +79 20.855 -1.33375 -3.395 +80 20.855 -2.06125 -3.03125 +81 20.855 -2.425 0.84875 +82 20.855 -1.455 2.54625 +83 20.855 0 2.6675 +84 11.2762 -4.50912 2.30375 +85 -13.4588 -3.0127 2.30375 +86 -25.9475 -2.31928 1.57625 +87 -25.9475 -2.64032 -2.1825 +88 -14.6712 -3.395 -3.03125 +89 -5.335 -4.00125 -3.51625 +90 7.0325 -4.72875 -3.27375 +91 7.0325 4.72875 -3.27375 +92 -5.335 4.00125 -3.51625 +93 -14.6712 3.395 -3.03125 +94 -25.9475 2.64032 -2.1825 +95 -25.9475 2.31928 1.57625 +96 -13.4588 3.0127 2.30375 +97 11.2762 4.50912 2.30375 +98 -25.705 -3.75875 0.932298 +99 -27.0388 -5.45625 0.950218 +100 -27.7662 -5.69875 0.974422 +101 -31.4037 -12.8525 0.97 +102 -29.2212 -14.4287 0.84875 +103 -18.1875 -4.85 0.60625 +104 -18.1875 4.85 0.60625 +105 -29.2212 14.4287 0.84875 +106 -31.4037 12.8525 0.97 +107 -27.7662 5.69875 0.974422 +108 -27.0388 5.45625 0.950218 +109 -25.705 3.75875 0.932298 +110 -23.5225 5.02122 -1.94 +111 -25.9475 5.43057 -2.91 +112 -27.2813 7.4293 -10.7912 +113 -24.8562 7.5175 -11.8825 +114 -12.125 4.6075 -3.6375 +115 -7.0325 4.1225 -3.1525 +116 -7.0325 -4.1225 -3.1525 +117 -12.125 -4.6075 -3.6375 +118 -24.8562 -7.5175 -11.8825 +119 -27.2813 -7.4293 -10.7912 +120 -25.9475 -5.43057 -2.91 +121 -23.5225 -5.02122 -1.94 +122 -23.0375 0.12125 0 +123 -25.8262 -0.60625 0 +124 -26.19 -4.48625 0 +125 -24.735 -4.97125 0 +126 -11.155 -5.82 0 +127 1.6975 -5.94125 0 +128 12.8525 -5.69875 0 +129 13.095 -2.425 0 +130 23.0375 -2.54625 0 +131 29.2212 -2.425 0 +132 35.89 -1.6975 0 +133 41.4675 0 0 +134 -14.55 -5.21375 -2.49806 +135 -16.975 -22.4312 -0.2425 +136 -8.36625 -22.1887 -0.485 +137 4.72875 -5.69875 -2.91 +138 4.72875 5.69875 -2.91 +139 -8.36625 22.1887 -0.485 +140 -16.975 22.4312 -0.2425 +141 -14.55 5.21375 -2.49806 +142 -23.28 -4.22906 1.33375 +143 -24.735 -4.23235 1.33375 +144 -24.4925 -4.85 2.6675 +145 -15.2775 -5.335 3.75875 +146 -12.7312 -4.48625 1.94 +147 41.5887 0 0 +148 35.5262 0 -1.57625 +149 28.2512 0 -2.54625 +150 25.4625 0 -2.78875 +151 21.7037 0 -4.48625 +152 20.6125 0 -4.72875 +153 11.2762 0 -4.48625 +154 -26.7963 0 -2.54625 +155 -27.16 0 -2.1825 +156 -14.9138 0 2.30375 +157 -4.00125 0 2.91 +158 28.615 0 1.81875 +159 37.83 0 0.84875 +gray44 4 1 2 3 4 +gray44 4 5 6 7 8 +gray44 5 9 10 11 12 13 +gray44 4 14 15 16 17 +gray44 4 18 19 20 21 +gray44 4 22 23 24 25 +gray44 4 26 27 28 29 +gray44 12 30 31 32 33 34 35 36 37 38 39 40 41 +gray44 7 42 43 44 45 46 47 48 +gray44 7 49 50 51 52 53 54 55 +gray44 7 56 57 58 59 60 61 62 +gray44 7 63 64 65 66 67 68 69 +gray44 7 70 71 72 73 74 75 76 +gray44 7 77 78 79 80 81 82 83 +gray44 7 84 85 86 87 88 89 90 +gray44 7 91 92 93 94 95 96 97 +gray44 6 98 99 100 101 102 103 +gray44 6 104 105 106 107 108 109 +gray44 6 110 111 112 113 114 115 +gray44 6 116 117 118 119 120 121 +gray44 12 122 123 124 125 126 127 128 129 130 131 132 133 +gray44 4 134 135 136 137 +gray44 4 138 139 140 141 +gray44 5 142 143 144 145 146 +gray44 13 147 148 149 150 151 152 153 154 155 156 157 158 159 diff -Nru acm-5.0/objects/aircraft/mig29.obv acm-6.0+20200416/objects/aircraft/mig29.obv --- acm-5.0/objects/aircraft/mig29.obv 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/objects/aircraft/mig29.obv 2006-01-05 13:58:55.000000000 +0000 @@ -0,0 +1,262 @@ +object +235 25 +1 -20.7292 -3.91308 -0.575279 +2 -20.7292 -3.49195 -0.996413 +3 -20.7292 -2.91667 -1.15056 +4 -20.7292 -2.34139 -0.996413 +5 -20.7292 -1.92025 -0.575279 +6 -20.7292 -1.76611 6.51849e-16 +7 -20.7292 -1.92025 0.575279 +8 -20.7292 -2.34139 0.996413 +9 -20.7292 -2.91667 1.15056 +10 -20.7292 -3.49195 0.996413 +11 -20.7292 -3.91308 0.575279 +12 -20.7292 -4.06723 0 +13 -20.7292 4.06723 0 +14 -20.7292 3.91308 0.575279 +15 -20.7292 3.49195 0.996413 +16 -20.7292 2.91667 1.15056 +17 -20.7292 2.34139 0.996413 +18 -20.7292 1.92025 0.575279 +19 -20.7292 1.76611 6.51849e-16 +20 -20.7292 1.92025 -0.575279 +21 -20.7292 2.34139 -0.996413 +22 -20.7292 2.91667 -1.15056 +23 -20.7292 3.49195 -0.996413 +24 -20.7292 3.91308 -0.575279 +25 7.5636 -3.46665 1.78585 +26 7.5636 -1.57575 1.78585 +27 10.9252 -1.78585 -0.6303 +28 10.9252 -3.3616 -0.6303 +29 10.9252 3.3616 -0.6303 +30 10.9252 1.78585 -0.6303 +31 7.5636 1.57575 1.78585 +32 7.5636 3.46665 1.78585 +33 -17.3332 -3.5717 0.73535 +34 -17.3332 -2.41615 0.73535 +35 -17.3332 -1.4707 -0.2101 +36 -17.3332 -0 -1.15555 +37 -17.3332 -0.10505 -2.101 +38 -17.3332 -3.04645 -2.3111 +39 -17.3332 -4.30705 -1.8909 +40 -17.3332 -6.0929 -1.4707 +41 -17.3332 -5.8828 -1.0505 +42 -17.3332 -5.2525 -0.8404 +43 -17.3332 -4.30705 -0.10505 +44 -17.3332 4.30705 -0.10505 +45 -17.3332 5.2525 -0.8404 +46 -17.3332 5.8828 -1.0505 +47 -17.3332 6.0929 -1.4707 +48 -17.3332 4.30705 -1.8909 +49 -17.3332 3.04645 -2.3111 +50 -17.3332 0.10505 -2.101 +51 -17.3332 0 -1.15555 +52 -17.3332 1.4707 -0.2101 +53 -17.3332 2.41615 0.73535 +54 -17.3332 3.5717 0.73535 +55 -5.0424 5.56765 -2.101 +56 -8.6141 5.8828 -3.25655 +57 -18.5938 7.3535 -10.7151 +58 -20.3797 7.29856 -9.76965 +59 -20.0646 7.00651 -7.7737 +60 -20.2747 7.0009 -7.66865 +61 -19.6443 6.35817 -3.25655 +62 -19.0141 6.28704 -2.9414 +63 -19.0141 5.97926 -0.73535 +64 -11.7656 5.68152 -0.8404 +65 -16.703 -0.10505 -1.6808 +66 -18.0686 -4.30705 -1.6808 +67 -19.8544 -4.93735 -1.6808 +68 -20.4848 -5.56765 -1.6808 +69 -14.1818 -5.8828 -1.6808 +70 4.09695 -5.77775 -1.6808 +71 7.5636 -5.2525 -1.6808 +72 19.8544 -1.57575 -1.6808 +73 22.1655 -1.57575 -1.6808 +74 25.4221 -1.36565 -1.6808 +75 29.8342 -0.10505 -1.6808 +76 -18.804 -5.35755 -1.66969 +77 -21.7454 -6.303 -1.55248 +78 -25.212 -12.2909 -0.8404 +79 -22.0605 -13.2363 -0.73535 +80 -13.2363 -5.35755 -1.6808 +81 -11.7656 -5.68152 -0.8404 +82 -19.0141 -5.97926 -0.73535 +83 -19.0141 -6.28704 -2.9414 +84 -19.6443 -6.35817 -3.25655 +85 -20.2747 -7.0009 -7.66865 +86 -20.0646 -7.00651 -7.7737 +87 -20.3797 -7.29856 -9.76965 +88 -18.5938 -7.3535 -10.7151 +89 -8.6141 -5.8828 -3.25655 +90 -5.0424 -5.56765 -2.101 +91 -20.9049 -2.88888 1.4707 +92 -16.3878 -2.87903 1.36565 +93 -7.66865 -2.78723 1.8909 +94 1.8909 -2.73367 1.99595 +95 4.4121 -2.72231 1.99595 +96 7.5636 -2.71862 1.8909 +97 10.9252 -2.97661 -0.8404 +98 7.9838 -3.00036 -0.94545 +99 6.5131 -3.11204 -1.99595 +100 0.52525 -3.14951 -2.101 +101 -9.2444 -3.1515 -1.6808 +102 -20.9049 -3.1515 -1.15555 +103 -20.9049 -3.04645 -0.10505 +104 -15.5474 -1.15555 0.0642234 +105 -20.9049 -1.8909 -0.10505 +106 -20.7999 -4.09695 -0.10505 +107 -17.4383 -4.4121 0 +108 -17.4383 4.4121 0 +109 -20.7999 4.09695 -0.10505 +110 -20.9049 1.8909 -0.10505 +111 -15.5474 1.15555 0.0642234 +112 -20.9049 3.04645 -0.10505 +113 -20.9049 3.1515 -1.15555 +114 -9.2444 3.1515 -1.6808 +115 0.52525 3.14951 -2.101 +116 6.5131 3.11204 -1.99595 +117 7.9838 3.00036 -0.94545 +118 10.9252 2.97661 -0.8404 +119 7.5636 2.71862 1.8909 +120 4.4121 2.72231 1.99595 +121 1.8909 2.73367 1.99595 +122 -7.66865 2.78723 1.8909 +123 -16.3878 2.87903 1.36565 +124 -20.9049 2.88888 1.4707 +125 -13.2363 5.35755 -1.6808 +126 -22.0605 13.2363 -0.73535 +127 -25.212 12.2909 -0.8404 +128 -21.7454 6.303 -1.55248 +129 -18.804 5.35755 -1.66969 +130 29.8342 0.10505 -1.6808 +131 25.4221 1.36565 -1.6808 +132 22.1655 1.57575 -1.6808 +133 19.8544 1.57575 -1.6808 +134 7.5636 5.2525 -1.6808 +135 4.09695 5.77775 -1.6808 +136 -14.1818 5.8828 -1.6808 +137 -20.4848 5.56765 -1.6808 +138 -19.8544 4.93735 -1.6808 +139 -18.0686 4.30705 -1.6808 +140 -16.703 0.10505 -1.6808 +141 29.8342 0 -1.6808 +142 26.6827 0 -3.04645 +143 23.5312 0 -3.67675 +144 19.3292 0 -4.30705 +145 16.5979 0 -5.98785 +146 15.1272 0 -6.19795 +147 12.7111 0 -5.98785 +148 1.4707 0 -3.7818 +149 -19.4343 0 -0.94545 +150 -18.5938 0 -0.2101 +151 12.501 0 -0.31515 +152 19.3292 0 -0.52525 +153 21.8504 0 -0.2101 +154 26.2625 0 -0.4202 +155 29.309 0 -0.94545 +156 3.1515 5.6727 -2.101 +157 -11.0303 5.4626 -1.99595 +158 -12.606 19.1191 -0.52525 +159 -12.1858 19.5393 -0.48421 +160 -9.97975 19.7494 -0.481629 +161 -9.6646 19.4343 -0.518073 +162 -7.7737 19.3292 -0.546272 +163 -7.7737 -19.3292 -0.546272 +164 -9.6646 -19.4343 -0.518073 +165 -9.97975 -19.7494 -0.481629 +166 -12.1858 -19.5393 -0.48421 +167 -12.606 -19.1191 -0.52525 +168 -11.0303 -5.4626 -1.99595 +169 3.1515 -5.6727 -2.101 +170 -9.8747 -2.5212 1.8909 +171 -9.8747 -3.7818 1.36565 +172 -9.8747 -4.09695 -0.4202 +173 -9.8747 -5.14745 -0.6303 +174 -9.8747 -5.6727 -1.15555 +175 -9.8747 -19.7494 -0.52525 +176 -9.8747 -5.98785 -2.101 +177 -9.8747 -3.9919 -2.7313 +178 -9.8747 -2.62625 -2.9414 +179 -9.8747 0.10505 -3.25655 +180 -9.8747 0 -0.10505 +181 -9.8747 -0.94545 -0.2101 +182 -9.8747 -1.6808 0.52525 +183 -9.8747 1.6808 0.52525 +184 -9.8747 0.94545 -0.2101 +185 -9.8747 -0 -0.10505 +186 -9.8747 -0.10505 -3.25655 +187 -9.8747 2.62625 -2.9414 +188 -9.8747 3.9919 -2.7313 +189 -9.8747 5.98785 -2.101 +190 -9.8747 19.7494 -0.52525 +191 -9.8747 5.6727 -1.15555 +192 -9.8747 5.14745 -0.6303 +193 -9.8747 4.09695 -0.4202 +194 -9.8747 3.7818 1.36565 +195 -9.8747 2.5212 1.8909 +196 15.5474 0 -6.19795 +197 15.5474 -0.94545 -5.77775 +198 15.5474 -1.4707 -4.8323 +199 15.5474 -1.57575 -3.9919 +200 15.5474 -1.78585 -2.101 +201 15.5474 -1.36565 -1.0505 +202 15.5474 -0.52525 -0.52525 +203 15.5474 0.10505 -0.31515 +204 15.5474 -0.10505 -0.31515 +205 15.5474 0.52525 -0.52525 +206 15.5474 1.36565 -1.0505 +207 15.5474 1.78585 -2.101 +208 15.5474 1.57575 -3.9919 +209 15.5474 1.4707 -4.8323 +210 15.5474 0.94545 -5.77775 +211 15.5474 0 -6.19795 +212 4.202 -2.62625 1.99595 +213 4.202 -3.7818 1.57575 +214 4.202 -3.9919 -0.2101 +215 4.202 -5.14745 -0.52525 +216 4.202 -5.77775 -0.94545 +217 4.202 -5.8828 -1.8909 +218 4.202 -3.7818 -2.5212 +219 4.202 0 -3.04645 +220 4.202 0 0 +221 4.202 -1.15555 0 +222 4.202 -1.8909 1.0505 +223 4.202 -2.20605 1.78585 +224 4.202 2.20605 1.78585 +225 4.202 1.8909 1.0505 +226 4.202 1.15555 0 +227 4.202 -0 0 +228 4.202 -0 -3.04645 +229 4.202 3.7818 -2.5212 +230 4.202 5.8828 -1.8909 +231 4.202 5.77775 -0.94545 +232 4.202 5.14745 -0.52525 +233 4.202 3.9919 -0.2101 +234 4.202 3.7818 1.57575 +235 4.202 2.62625 1.99595 +(black gray44) 12 1 2 3 4 5 6 7 8 9 10 11 12 +(black gray44) 12 13 14 15 16 17 18 19 20 21 22 23 24 +(black gray44) 4 25 26 27 28 +(black gray44) 4 29 30 31 32 +gray44 11 33 34 35 36 37 38 39 40 41 42 43 +gray44 11 44 45 46 47 48 49 50 51 52 53 54 +gray44 10 55 56 57 58 59 60 61 62 63 64 +gray44 11 65 66 67 68 69 70 71 72 73 74 75 +gray44 5 76 77 78 79 80 +gray44 10 81 82 83 84 85 86 87 88 89 90 +gray44 13 91 92 93 94 95 96 97 98 99 100 101 102 103 +gray44 4 104 105 106 107 +gray44 4 108 109 110 111 +gray44 13 112 113 114 115 116 117 118 119 120 121 122 123 124 +gray44 5 125 126 127 128 129 +gray44 11 130 131 132 133 134 135 136 137 138 139 140 +gray44 15 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 +gray44 7 156 157 158 159 160 161 162 +gray44 7 163 164 165 166 167 168 169 +gray44 13 170 171 172 173 174 175 176 177 178 179 180 181 182 +gray44 13 183 184 185 186 187 188 189 190 191 192 193 194 195 +gray44 8 196 197 198 199 200 201 202 203 +gray44 8 204 205 206 207 208 209 210 211 +gray44 12 212 213 214 215 216 217 218 219 220 221 222 223 +gray44 12 224 225 226 227 228 229 230 231 232 233 234 235 diff -Nru acm-5.0/objects/aircraft/mig29.txt acm-6.0+20200416/objects/aircraft/mig29.txt --- acm-5.0/objects/aircraft/mig29.txt 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/objects/aircraft/mig29.txt 2017-09-04 17:20:20.000000000 +0000 @@ -0,0 +1,197 @@ +# Mig-29 Fulcrum +# MiG-29M information was derived from two sources: [Spick87] and [AirI Aug92]. + +aircraft "MiG-29" { + + Description "Mikoyan-Guryevich MiG-29M Fulcrum" + Object "mig29.obv" + WingArea 400.0 # (wingS) Wing surface area (ft^2) + WingHalfSpan 18.87 # (wings) Wing half-span (ft) + WingHeight 0.0 # (wingh) Height of the wing aerodyn. center above CM (ft) + Chord 9.61 # (c) Mean geometric chord of wing (ft) + AspectRatio 3.56 # (aspectRatio) aspect ratio + EmptyWeight 22500 # (emptyWeight) Empty weight (well, actually mass) (lb) + + # Max. wing load (lbf): + MaxLoadZPositive 273000 # 10*(EmptyWeight+50%*MaxFuel) (+10 g) + MaxLoadZNegative 137000 # 5*(EmptyWeight+50%*MaxFuel) (-5 g) + + DISEntityType 1:2:222:1:2:5:0 + DISAltEntityType 1:2:225:1:3:3:0 + + # (I(x,y,z)) Moments of inertia (lb ft^2): + Ixx 10000.0 + Iyy 75000.0 + Izz 80000.0 + + # (cFlap) Lift due to flaps (yields Clift of 1.0 at max extension) + CFlap 0.64279 + BetaStall 15.0 # (deg) + + CFlapDrag 0.0467 # (cFlapDrag) Drag due to Flaps + CGearDrag 0.03 # (cGearDrag) Drag due to Gear + CSpeedBrake 0.03 # (cSpeedBrake) Drag due to Speed Brake + # at 90 degrees + + # (CDb) Drag Characteristic equation [Wave+body] + # independent variable is mach number + CDb { # (CDb) Drag Characteristic equation [Wave+body] + # independent variable is mach number + 0.0, 0.020, + 0.2, 0.020, + 0.95, 0.015, + 1.05, 0.045, + 2.00, 0.030, + 10.0, 0.030 + } + + CLift { # (CLift) Lift-slope curve (vs alpha) + -3.0, 0.0, + -1.05, 0.0, + -0.576, -2.199, + -0.556, -2.23, + -0.524, -2.199, + 0.524, 2.199, + 0.556, 2.23, + 0.576, 2.199, + 1.05, 0.0, + 2.0, 0.0 + } + + CnBeta { # (CnBeta) Yaw due to sideslip equation + 0, -0.08125, + 0.523540, -0.078125, + 0.785340, -0.0609375, + 1.047198, 0.125, + 1.58, 0.0 + } + + ClBeta { # (ClBeta) Roll due to sideslip equation + 0, -0.0125, + 0.43633, -0.015, + 0.78540, 0.125, + 1.58, 0.0, + 3.142, 0.125, + } + + CDBOrigin 0 # (CDBOrigin, CDBFactor) Drag due to sideslip + CDBFactor 0.5 + CDBPhase 0 # (CDBPhase) sideslip drag phase (deg) + CYBeta -1.4 # (CYbeta) Side-force from side-slip [dCY/dBeta] + EffElevator 0.60 # (effElevator) Elevator effectiveness + EffRudder 0.14 # (effRudder) Rudder effectiveness + MaxRudder 20 # (maxRudder) max Rudder (deg) + MaxAileron 20 # (maxAileron) max Aileron (deg) + MaxFlap 20 # (maxFlap) max flap setting (deg) + # (flapRate) flap extension rate (about 2 secs to fully extend flaps) + FlapRate 10 # (deg/sec) + # (gearRate) gear extension rate (about 3 secs to fully extend gear) + GearRate 30 # (deg/sec) + MaxSpeedBrake 80 # (maxSpeedBrake) max Speed Brake setting (deg) + # (speedBrakeRate) rate of speed brake extension (2 secs to full ext) + SpeedBrakeRate 40 # (deg/sec) + # (speedBrakeIncr) speed Brake increment per keystroke + SpeedBrakeIncr 80 # (deg) + Clda 0.048 # (Clda) roll moment from aileron offset + Cldr 0.004 # (Cldr) roll moment from rudder offset + Clp -0.27 # (Clp) roll damping + Cmq -8.0 # (Cmq) pitch damping factor + Cnr -0.378 # (Cnr) yaw damping factor + CmAlpha -0.40 # (cmSlope) CmAlpha curve slope + MaxFuel 9750 # (maxFuel) maximum internal fuel (lb) + EngineType "GenericJetEngine" + # engine lag factor (how fast does it respond to throttle changes) + EngineLag -3.0 + # Engine data based on updated RD-33K engines cited in [AirI Aug89]. + # (maxThrust) max static thrust, military power (lbf) + MaxThrust 27000 + # (maxABThrust) max static thrust, afterburner on (lbf) + MaxABThrust 44000 + + Thrust { # (Thrust) Mach Number vs. thrust + 0, 1, + 1.7, 1.5, + 2.0, 0.84, + 5, 0.5 + } + ABThrust { # (ABThrust) afterburner thrust table + 0, 1, + 0.5, 1, + 1, 1.21, + 1.7, 1.7, + 5, 1.64 + } + HasThrustReverser 0 # (hasThrustReverser) 0=no, otherwise yes + # (spFuelConsump) specific fuel consump(lb fuel/lb T x hr) + SpFuelConsump 0.68 + # (spABFuelConsump) AB specific fuel consump(lb fuel/lb T x hr) + SpABFuelConsump 2.55 + # (viewPoint) pilot's viewing location wrt CM + ViewPoint { 14.75, 0, -5.375 } + + # Landing Gear control parameters + + MuStatic 0.08 # (muStatic) static coeff of friction no-brakes + MuKinetic 0.05 # (muKinetic) moving coeff of friction no-brakes + MuBStatic 0.7 # (muBStatic) static brakes-on + MuBKinetic 0.6 # (muBKinetic) moving brakes-on + + MaxNWDef 72 # (maxNWDef) maximum nosewheel deflection (deg) + + # (rm) location of right main gear attachments + Rm { -1.206000, 5, 4.4 } + # (rn) location of nose gear attachments + Rn { 10.395000, 0, 4.5 } + Dm 4500 # main oleo damping factor (lbf s/ft) + Dn 5000 # nose oleo damping factor (lbf s/ft) + Km 65000 # main oleo spring factor (lbf/ft) + Kn 32000 # nose oleo spring factor (lbf/ft) + Gm 1.5 # main strut length with tire (ft) + Gn 1.5 # nose strut length with tire (ft) + CmMax 1.0 # (cmMax) main max oleo extension distance (ft) + CnMax 0.75 # (cnMax) nose max oleo extension distance (ft) + # (tailExtent) as we rotate, this part may drag + TailExtent { -18.165, 0.0, 1.191 } + + # Speed limits at MTOW. Leave undefined or set to 0 if unknown. + MTOW 32250.0 # maximum takeoff weight (lb) + #Vs0 42.0 # stall speed, full flaps (KIAS) + #Vs1 50.0 # stall speed, no flaps (KIAS) + #Vfe 100.0 # max speed with flaps extended (KIAS) + #Vno 145.0 # normal operation speed (KIAS) + #Vne 164.0 # never exceed speed (KIAS) + + StructurePoints 15 # (structurePts) maximum structural damage + + # Radar data based on N-019 Pulse Doppler radar cited in [AirI Aug89]. + + RadarOutput 15000 # (radarOutput) radar output (watts) + RadarTRange 38 # (radarTRange) tracking radar range (NM) + RadarDRange 55 # (radarDRange) detection radar range (NM) + TEWSThreshold 0 # Radar Warning Receiver threshold (watts) + + # Weapons + + WeaponCount 9 + + HardPoint0 { 7.0, -4.0, 0.0 } + HardPoint1 { 0.357, 15.6, 0.0 } + HardPoint2 { 0.357, -15.6, 0.0 } + HardPoint3 { 1.5, 9.0, 2.0 } + HardPoint4 { 1.5, -9.0, 2.0 } + HardPoint5 { 1.5, 8.0, 1.5 } + HardPoint6 { 1.5, -8.0, 1.5 } + HardPoint7 { 1.5, 10.0, 1.5 } + HardPoint8 { 1.5, -10.0, 1.5 } + + WeaponStation 0 "M61A1" 500 0 0 + WeaponStation 1 "AIM-9M" 0 0 0 + WeaponStation 2 "AIM-9M" 0 0 0 + WeaponStation 3 "AIM-9M" 0 0 0 + WeaponStation 4 "AIM-9M" 0 0 0 + WeaponStation 5 "AIM-9M" 0 0 0 + WeaponStation 6 "AIM-9M" 0 0 0 + WeaponStation 7 "AIM-120" 0 0 0 + WeaponStation 8 "AIM-120" 0 0 0 + +} \ No newline at end of file diff -Nru acm-5.0/objects/aircraft/notavailable.obv acm-6.0+20200416/objects/aircraft/notavailable.obv --- acm-5.0/objects/aircraft/notavailable.obv 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/objects/aircraft/notavailable.obv 2017-04-16 07:56:48.000000000 +0000 @@ -0,0 +1,17 @@ +object +12 3 +1 0.3 0 -5.6 +2 0.3 0 -4.6 +3 1.1 0 -4.6 +4 1.1 0 -2.3 +5 0.6 0 -2.3 +6 0.6 0 0 +7 -0.3 0 -5.6 +8 -0.3 0 -4.6 +9 -1.1 0 -4.6 +10 -1.1 0 -2.3 +11 -0.6 0 -2.3 +12 -0.6 0 0 +#886666 4 1 2 8 7 +gray44 4 9 3 4 10 +black 4 11 5 6 12 diff -Nru acm-5.0/objects/aircraft/p51a.txt acm-6.0+20200416/objects/aircraft/p51a.txt --- acm-5.0/objects/aircraft/p51a.txt 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/objects/aircraft/p51a.txt 2017-10-22 14:28:26.000000000 +0000 @@ -0,0 +1,172 @@ +aircraft "P-51A" { + + Description "North American P-51A Mustang" + Object "ufo.obv" # FIXME + WingArea 233 # (wingS) Wing surface area (ft^2) + WingHalfSpan 18.5 # (wings) Wing half-span (ft) + WingHeight -1.2 # (wingh) Height of the wing aerodyn. center above CM (ft) + Chord 6.18 # (c) Mean geometric chord of wing (ft) + AspectRatio 5.9 # (aspectRatio) aspect ratio + EmptyWeight 6433 #(emptyWeight) Empty weight (well, actually mass) (lb) + + # Max. wing load: + MaxLoadZPositive 35000 # 5*MTOW (+5 g) + MaxLoadZNegative 14000 # 2*MTOW (-2 g) + + DISEntityType 1:2:225:255:255:255:255 # FIXME: not listed + DISAltEntityType 1:2:225:255:255:255:255 + + # (I(x,y,z)) Moments of inertia (lb ft^2) + Ixx 5000 + Iyy 10000 + Izz 15000 + + # (cFlap) Lift due to flaps (yields Clift of 1.0 at max extension) + CFlap 0.64279 + BetaStall 15.0 # (deg) + + CFlapDrag 0.0467 # (cFlapDrag) Drag due to Flaps + CGearDrag 0.03 # (cGearDrag) Drag due to Gear + CSpeedBrake 0.03 # (cSpeedBrake) Drag due to Speed Brake + # at 90 degrees + + # (CDb) Drag Characteristic equation [Wave+body] + # independent variable is mach number + CDb { # (CDb) Drag Characteristic equation [Wave+body] + # independent variable is mach number + 0.0, 0.025, + 0.2, 0.025, + 0.95, 0.015, + 1.05, 0.045, + 2.00, 0.030, + 10.0, 0.030 + } + + CLift { # (CLift) Lift-slope curve (vs alpha) + -3, -1.0, + -0.17, -0.14, + -0.03, 0.0, + 0.0, 0.2, # CLift=0.2 at 0 DEG + 0.122, 1.0, # CLift=1.0 at 7 DEG + 0.26, 1.3, # CLift=1.3 at 15 DEG + 0.40, 0.6, + 3.0, 0.0 + } + + CnBeta { # (CnBeta) Yaw due to sideslip equation + 0, -0.08125, + 0.523540, -0.078125, + 0.785340, -0.0609375, + 1.047198, 0.125, + 1.58, 0.0 + } + + ClBeta { # (ClBeta) Roll due to sideslip equation + 0, -0.0125, + 0.43633, -0.015, + 0.78540, 0.125, + 1.58, 0.0, + 3.142, 0.125, + } + + CDBOrigin 0 # (CDBOrigin, CDBFactor) Drag due to sideslip + CDBFactor 0.5 + CDBPhase 0 # (CDBPhase) sideslip drag phase (deg) + CYBeta -1.0 # (CYbeta) Side-force from side-slip [dCY/dBeta] + EffElevator 0.45 # (effElevator) Elevator effectiveness + EffRudder 0.35 # (effRudder) Rudder effectiveness + MaxRudder 30 # (maxRudder) max Rudder (deg) + MaxAileron 20 # (maxAileron) max Aileron (deg) + MaxFlap 40 # (maxFlap) max flap setting (deg) + # (flapRate) flap extension rate (about 2 secs to fully extend flaps) + FlapRate 3 # (deg/sec) + # (gearRate) gear extension rate (about 3 secs to fully extend gear) + GearRate 10 # (deg/sec) + MaxSpeedBrake 80 # (maxSpeedBrake) max Speed Brake setting (deg) + # (speedBrakeRate) rate of speed brake extension (2 secs to full ext) + SpeedBrakeRate 40 # (deg/sec) + # (speedBrakeIncr) speed Brake increment per keystroke (0 = no spd brk): + SpeedBrakeIncr 0 # (deg) + Clda 0.048 # (Clda) roll moment from aileron offset + Cldr 0.004 # (Cldr) roll moment from rudder offset + Clp -0.27 # (Clp) roll damping + Cmq -8.0 # (Cmq) pitch damping factor + Cnr -1.0 # (Cnr) yaw damping factor + CmAlpha -0.30 # (cmSlope) CmAlpha curve slope + MaxFuel 500 # (maxFuel) maximum internal fuel (lb) + EngineType "GenericPistonEngine" + # engine lag factor (how fast does it respond to throttle changes) + EngineLag -2.0 + # (maxThrust) max static thrust, military power (lbf) + MaxThrust 1670 + # (maxABThrust) max static thrust, afterburner on (lbf) + MaxABThrust 1670 + Thrust { # (Thrust) Mach Number vs. thrust + 0, 1, + 1.7, 1.5, + 2.0, 0.84, + 5, 0.5 + } + ABThrust { # (ABThrust) afterburner thrust table + 0, 1, + 1.7, 1.5, + 2.0, 0.84, + 5, 0.5 + } + HasThrustReverser 0 # (hasThrustReverser) 0=no, otherwise yes + # (spFuelConsump) specific fuel consump(lb fuel/lb T x hr) + SpFuelConsump 0.1677 + # (spABFuelConsump) AB specific fuel consump(lb fuel/lb T x hr) + SpABFuelConsump 0.1677 + # (viewPoint) pilot's viewing location wrt CM + ViewPoint { -2.4, 0, -3.35 } + + # Landing Gear control parameters + + MuStatic 0.08 # (muStatic) static coeff of friction no-brakes + MuKinetic 0.05 # (muKinetic) moving coeff of friction no-brakes + MuBStatic 0.25 # (muBStatic) static brakes-on + MuBKinetic 0.20 # (muBKinetic) moving brakes-on + + MaxNWDef 30 # (maxNWDef) maximum nosewheel deflection (deg) + + # (rm) location of right main gear attachments + Rm { 0.0, 6.0, 1.7 } + # (rn) location of nose gear attachments + Rn { -15, 0, 0.5 } + Dm 1300 # main oleo damping factor (lbf s/ft) + Dn 500 # nose oleo damping factor (lbf s/ft) + Km 12000 # main oleo spring factor (lbf/ft) + Kn 5000 # nose oleo spring factor (lbf/ft) + Gm 3.5 # main strut length with tire (ft) + Gn 1.4 # nose strut length with tire (ft) + CmMax 1.0 # (cmMax) main max oleo extension distance (ft) + CnMax 0.5 # (cnMax) nose max oleo extension distance (ft) + # (tailExtent) as we rotate, this part may drag + TailExtent { -18.165, 0.0, 1.191 } + + # Speed limits at MTOW. Leave undefined or set to 0 if unknown. + MTOW 7000.0 # maximum takeoff weight (lb) + #Vs0 xx.0 # stall speed, full flaps (KIAS) + #Vs1 xx.0 # stall speed, no flaps (KIAS) + Vfe 220.0 # max speed with flaps extended (KIAS) + Vno 304.0 # normal operation speed (KIAS) + Vne 370.0 # never exceed speed (KIAS) + + StructurePoints 10 # (structurePts) maximum structural damage + + # Radar data based on N-019 Pulse Doppler radar cited in [AirI Aug89]. + + RadarOutput 0 # (radarOutput) radar output (watts) + RadarTRange 0 # (radarTRange) tracking radar range (NM) + RadarDRange 0 # (radarDRange) detection radar range (NM) + TEWSThreshold 0 # Radar Warning Receiver threshold (watts) + + # Weapons + + WeaponCount 1 + + HardPoint0 { 7.0, -7.0, 0.0 } + + WeaponStation 0 "M61A1" 500 0 0 +} \ No newline at end of file diff -Nru acm-5.0/objects/aircraft/space-shuttle-orbiter.txt acm-6.0+20200416/objects/aircraft/space-shuttle-orbiter.txt --- acm-5.0/objects/aircraft/space-shuttle-orbiter.txt 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/objects/aircraft/space-shuttle-orbiter.txt 2017-10-22 14:28:26.000000000 +0000 @@ -0,0 +1,193 @@ +# Basically, a very poor glider. Try falling from very high altitude and land +# on your base airfield! +# FIXME: all data pretty fictional, shame on me, but great fun anyway! +# Author: Umberto Salsi +# Version: 2017-04-08 + +aircraft "Space Shuttle Orbiter" { + + Description "Space Shuttle Orbiter" + Object "ufo.obv" + WingArea 3971 # (wingS) Wing surface area (ft^2) + WingHalfSpan 38 # (wings) Wing half-span (ft) + WingHeight -2.0 # (wingh) Height of the wing aerodyn. center above CM (ft) + Chord 37 # (c) Mean geometric chord of wing (ft) + AspectRatio 1.0 # (aspectRatio) aspect ratio + EmptyWeight 172000 # (emptyWeight) Empty weight (well, actually mass) (lb) + + # Max. wing load (lbf): + MaxLoadZPositive 1720000 # 10*(EmptyWeight+50%*MaxFuel) (+10 g) + MaxLoadZNegative 860000 # 5*(EmptyWeight+50%*MaxFuel) (-5 g) + + DISEntityType 1:5:225:1:1:1:0 # "Atlantis" + DISAltEntityType 1:5:225:1:1:1:0 + + # (I(x,y,z)) Moments of inertia (lb ft^2): + Ixx 1e7 + Iyy 3e7 + Izz 3e7 + + # (cFlap) Lift due to flaps (yields Clift of 1.0 at max extension) + CFlap 0.64279 + BetaStall 15.0 # (deg) + + CFlapDrag 0.0467 # (cFlapDrag) Drag due to Flaps + CGearDrag 0.01 # (cGearDrag) Drag due to Gear at 90 degrees + + # (CDb) Drag Characteristic equation [Wave+body] + # independent variable is mach number + CDb { # (CDb) Drag Characteristic equation [Wave+body] + # independent variable is mach number + 0.0, 0.035, + 0.2, 0.035, + 0.95, 0.030, + 1.05, 0.090, + 2.00, 0.060, + 10.0, 0.060 + } + + CLift { # (CLift) Lift-slope curve (vs alpha) + -3.0, 0.0, + -1.05, 0.0, + -0.576, -2.199, + -0.556, -2.23, + -0.524, -2.199, + 0.524, 2.199, + 0.556, 2.23, + 0.576, 2.199, + 1.05, 0.0, + 2.0, 0.0 + } + + CnBeta { # (CnBeta) Yaw due to sideslip equation + 0, -0.08125, + 0.523540, -0.078125, + 0.785340, -0.0609375, + 1.047198, 0.125, + 1.58, 0.0 + } + + ClBeta { # (ClBeta) Roll due to sideslip equation + 0, -0.0125, + 0.43633, -0.015, + 0.78540, 0.125, + 1.58, 0.0, + 3.142, 0.125, + } + + CDBOrigin 0 # (CDBOrigin, CDBFactor) Drag due to sideslip + CDBFactor 0.5 + CDBPhase 0 # (CDBPhase) sideslip drag phase (deg) + CYBeta -1.4 # (CYbeta) Side-force from side-slip [dCY/dBeta] + EffElevator 0.60 # (effElevator) Elevator effectiveness + EffRudder 0.14 # (effRudder) Rudder effectiveness + MaxRudder 20 # (maxRudder) max Rudder (deg) + MaxAileron 20 # (maxAileron) max Aileron (deg) + MaxFlap 20 # (maxFlap) max flap setting (deg) + # (flapRate) flap extension rate (about 2 secs to fully extend flaps) + FlapRate 10 # (deg/sec) + # (gearRate) gear extension rate (about 3 secs to fully extend gear) + GearRate 30 # (deg/sec) + MaxSpeedBrake 80 # (maxSpeedBrake) max Speed Brake setting (deg) + # (speedBrakeRate) rate of speed brake extension (2 secs to full ext) + SpeedBrakeRate 40 # (deg/sec) + # (speedBrakeIncr) speed Brake increment per keystroke + SpeedBrakeIncr 80 # (deg) + Clda 0.048 # (Clda) roll moment from aileron offset + Cldr 0.004 # (Cldr) roll moment from rudder offset + Clp -0.27 # (Clp) roll damping + Cmq -8.0 # (Cmq) pitch damping factor + Cnr -0.378 # (Cnr) yaw damping factor + CmAlpha -0.40 # (cmSlope) CmAlpha curve slope + MaxFuel 0 # (maxFuel) maximum internal fuel (lb) + EngineType "NoEngine" + # engine lag factor (how fast does it respond to throttle changes) + EngineLag 1.0 + # (maxThrust) max static thrust, military power (lbf) + MaxThrust 1 + # (maxABThrust) max static thrust, afterburner on (lbf) + MaxABThrust 1 + + Thrust { # (Thrust) Mach Number vs. thrust + 0, 1, + 1.7, 1.5, + 2.0, 0.84, + 5, 0.5 + } + ABThrust { # (ABThrust) afterburner thrust table + 0, 1, + 0.5, 1, + 1, 1.21, + 1.7, 1.7, + 5, 1.64 + } + HasThrustReverser 0 # (hasThrustReverser) 0=no, otherwise yes + # (spFuelConsump) specific fuel consump(lb fuel/lb T x hr) + SpFuelConsump 0 + # (spABFuelConsump) AB specific fuel consump(lb fuel/lb T x hr) + SpABFuelConsump 0 + # (viewPoint) pilot's viewing location wrt CM + ViewPoint { 14.75, 0, -5.375 } + + # Landing Gear control parameters + + MuStatic 0.08 # (muStatic) static coeff of friction no-brakes + MuKinetic 0.05 # (muKinetic) moving coeff of friction no-brakes + MuBStatic 0.7 # (muBStatic) static brakes-on + MuBKinetic 0.6 # (muBKinetic) moving brakes-on + + MaxNWDef 72 # (maxNWDef) maximum nosewheel deflection (deg) + + Rn { 53.0, 0.0, 3.0 } # (rn) location of nose gear attachments + Rm { -13.3, 12.0, 6.0 } # (rm) location of right main gear attachments + Dn 4000 # nose oleo damping factor (lbf s/ft) + Dm 8000 # main oleo damping factor (lbf s/ft) + Kn 60000 # nose oleo spring factor (lbf/ft) + Km 120000 # main oleo spring factor (lbf/ft) + Gn 3 # nose strut length with tire (ft) + Gm 3 # main strut length with tire (ft) + CnMax 3.0 # (cnMax) nose max oleo extension distance (ft) + CmMax 3.0 # (cmMax) main max oleo extension distance (ft) + + # Speed limits at MTOW. Leave undefined or set to 0 if unknown. + MTOW 32250.0 # maximum takeoff weight (lb) + #Vs0 42.0 # stall speed, full flaps (KIAS) + #Vs1 50.0 # stall speed, no flaps (KIAS) + #Vfe 100.0 # max speed with flaps extended (KIAS) + #Vno 145.0 # normal operation speed (KIAS) + #Vne 164.0 # never exceed speed (KIAS) + + StructurePoints 15 # (structurePts) maximum structural damage + + # Radar data based on N-019 Pulse Doppler radar cited in [AirI Aug89]. + + RadarOutput 15000 # (radarOutput) radar output (watts) + RadarTRange 38 # (radarTRange) tracking radar range (NM) + RadarDRange 55 # (radarDRange) detection radar range (NM) + TEWSThreshold 0 # Radar Warning Receiver threshold (watts) + + # Weapons + +# WeaponCount 9 +# +# HardPoint0 { 7.0, -4.0, 0.0 } +# HardPoint1 { 0.357, 15.6, 0.0 } +# HardPoint2 { 0.357, -15.6, 0.0 } +# HardPoint3 { 1.5, 9.0, 2.0 } +# HardPoint4 { 1.5, -9.0, 2.0 } +# HardPoint5 { 1.5, 8.0, 1.5 } +# HardPoint6 { 1.5, -8.0, 1.5 } +# HardPoint7 { 1.5, 10.0, 1.5 } +# HardPoint8 { 1.5, -10.0, 1.5 } +# +# WeaponStation 0 "M61A1" 500 0 0 +# WeaponStation 1 "AIM-9M" 0 0 0 +# WeaponStation 2 "AIM-9M" 0 0 0 +# WeaponStation 3 "AIM-9M" 0 0 0 +# WeaponStation 4 "AIM-9M" 0 0 0 +# WeaponStation 5 "AIM-9M" 0 0 0 +# WeaponStation 6 "AIM-9M" 0 0 0 +# WeaponStation 7 "AIM-120" 0 0 0 +# WeaponStation 8 "AIM-120" 0 0 0 + +} \ No newline at end of file diff -Nru acm-5.0/objects/aircraft/su30.obv acm-6.0+20200416/objects/aircraft/su30.obv --- acm-5.0/objects/aircraft/su30.obv 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/objects/aircraft/su30.obv 2006-01-05 13:58:55.000000000 +0000 @@ -0,0 +1,197 @@ +object +176 19 +1 11.3429 -5.49413 3.09587 +2 11.0813 -3.66275 3.61913 +3 17.3603 -3.1395 -1.09013 +4 17.0986 -5.75575 -1.35175 +5 17.0986 5.75575 -1.35175 +6 17.3603 3.1395 -1.09013 +7 11.0813 3.66275 3.61913 +8 11.3429 5.49413 3.09587 +9 -2.87787 -3.62019 -1.83137 +10 -2.87787 -0 -4.97087 +11 -4.97087 -10.7266 -2.61625 +12 -11.5115 -36.3659 -2.093 +13 -11.5115 36.3659 -2.093 +14 -4.97087 10.7266 -2.61625 +15 -2.87787 0 -4.97087 +16 -2.87787 3.62019 -1.83137 +17 41.0751 0.784875 -2.093 +18 32.4415 3.66275 -2.093 +19 22.7614 6.279 -2.093 +20 17.7905 7.84875 -2.093 +21 13.6045 9.15687 -2.093 +22 11.2499 9.4185 -2.093 +23 -10.465 35.8426 -2.093 +24 -4.186 35.581 -2.093 +25 -3.92437 36.1043 -2.093 +26 -20.4067 36.3659 -2.093 +27 -14.1277 10.9883 -2.093 +28 -21.7149 10.9883 -2.093 +29 -28.5171 8.372 -2.093 +30 -32.1799 0.52325 -2.093 +31 -34.0112 -7.28421 -0.661308 +32 -34.0112 -6.41706 -1.52846 +33 -34.0112 -5.2325 -1.84587 +34 -34.0112 -4.04794 -1.52846 +35 -34.0112 -3.18079 -0.661308 +36 -34.0112 -2.86338 0.52325 +37 -34.0112 -3.18079 1.70781 +38 -34.0112 -4.04794 2.57496 +39 -34.0112 -5.2325 2.89237 +40 -34.0112 -6.41706 2.57496 +41 -34.0112 -7.28421 1.70781 +42 -34.0112 -7.60162 0.52325 +43 -34.0112 7.60162 0.52325 +44 -34.0112 7.28421 1.70781 +45 -34.0112 6.41706 2.57496 +46 -34.0112 5.2325 2.89237 +47 -34.0112 4.04794 2.57496 +48 -34.0112 3.18079 1.70781 +49 -34.0112 2.86338 0.52325 +50 -34.0112 3.18079 -0.661308 +51 -34.0112 4.04794 -1.52846 +52 -34.0112 5.2325 -1.84587 +53 -34.0112 6.41706 -1.52846 +54 -34.0112 7.28421 -0.661308 +55 35.0577 -2.35462 -0.261625 +56 35.0577 0.261625 0.52325 +57 35.0577 -0 -8.11037 +58 35.0577 -1.30812 -6.54063 +59 35.0577 -1.0465 -5.49413 +60 35.0577 -2.093 -4.70925 +61 35.0577 -2.87787 -2.61625 +62 35.0577 2.87787 -2.61625 +63 35.0577 2.093 -4.70925 +64 35.0577 1.0465 -5.49413 +65 35.0577 1.30812 -6.54063 +66 35.0577 0 -8.11037 +67 35.0577 -0.261625 0.52325 +68 35.0577 2.35462 -0.261625 +69 -27.209 -8.11037 0.784875 +70 -33.488 -11.5115 0.784875 +71 -34.0112 -21.9765 0.784875 +72 -29.5636 -24.5927 0.784875 +73 -16.744 -10.9883 0.784875 +74 -16.744 10.9883 0.784875 +75 -29.5636 24.5927 0.784875 +76 -34.0112 21.9765 0.784875 +77 -33.488 11.5115 0.784875 +78 -27.209 8.11037 0.784875 +79 11.2499 -5.2325 3.1395 +80 11.7731 -5.2325 4.186 +81 9.94175 -5.2325 4.97087 +82 -33.7496 -5.2325 4.186 +83 -34.7961 -5.2325 -1.83137 +84 -29.302 -5.2325 -2.35462 +85 -18.3137 -5.2325 -2.093 +86 -8.372 -5.2325 -3.40112 +87 2.61625 -5.2325 -3.40112 +88 13.8661 -5.2325 -2.35462 +89 17.7905 -5.2325 -1.0465 +90 17.7905 5.2325 -1.0465 +91 13.8661 5.2325 -2.35462 +92 2.61625 5.2325 -3.40112 +93 -8.372 5.2325 -3.40112 +94 -18.3137 5.2325 -2.093 +95 -29.302 5.2325 -2.35462 +96 -34.7961 5.2325 -1.83137 +97 -33.7496 5.2325 4.186 +98 9.94175 5.2325 4.97087 +99 11.7731 5.2325 4.186 +100 11.2499 5.2325 3.1395 +101 10.2034 -10.465 -2.093 +102 -14.3894 -10.465 1.30812 +103 -17.7905 -10.465 6.01737 +104 -24.3311 -10.465 5.2325 +105 -24.5927 -10.465 1.56975 +106 -25.3776 -10.465 1.56975 +107 -27.4706 -10.465 -19.3603 +108 -23.5463 -10.465 -21.1916 +109 -9.94175 -10.465 -4.44763 +110 -8.372 -10.465 -4.186 +111 -8.63363 -10.465 -2.87787 +112 -8.63363 10.465 -2.87787 +113 -8.372 10.465 -4.186 +114 -9.94175 10.465 -4.44763 +115 -23.5463 10.465 -21.1916 +116 -27.4706 10.465 -19.3603 +117 -25.3776 10.465 1.56975 +118 -24.5927 10.465 1.56975 +119 -24.3311 10.465 5.2325 +120 -17.7905 10.465 6.01737 +121 -14.3894 10.465 1.30812 +122 10.2034 10.465 -2.093 +123 -32.1799 -0.52325 -2.093 +124 -28.5171 -8.372 -2.093 +125 -21.7149 -10.9883 -2.093 +126 -14.1277 -10.9883 -2.093 +127 -20.4067 -36.3659 -2.093 +128 -3.92437 -36.1043 -2.093 +129 -4.186 -35.581 -2.093 +130 -10.465 -35.8426 -2.093 +131 11.2499 -9.4185 -2.093 +132 13.6045 -9.15687 -2.093 +133 17.7905 -7.84875 -2.093 +134 22.7614 -6.279 -2.093 +135 32.4415 -3.66275 -2.093 +136 41.0751 -0.784875 -2.093 +137 -43.953 -0.261625 0 +138 -40.0286 -1.0465 0 +139 -39.767 -2.35462 0 +140 -28.5171 -3.1395 0 +141 11.7731 -3.66275 0 +142 35.8426 -3.66275 0 +143 44.4763 -3.40112 0 +144 50.4936 -2.61625 0 +145 55.9877 -1.30812 0 +146 58.3424 -0.261625 0 +147 58.3424 0.261625 0 +148 55.9877 1.30812 0 +149 50.4936 2.61625 0 +150 44.4763 3.40112 0 +151 35.8426 3.66275 0 +152 11.7731 3.66275 0 +153 -28.5171 3.1395 0 +154 -39.767 2.35462 0 +155 -40.0286 1.0465 0 +156 -43.953 0.261625 0 +157 59.1272 0 0 +158 55.7261 0 -1.83137 +159 49.9704 0 -4.186 +160 43.953 0 -5.2325 +161 38.4589 0 -8.63363 +162 32.4415 0 -10.2034 +163 29.302 0 -10.9883 +164 24.5927 0 -10.7266 +165 15.6975 0 -8.63363 +166 0 0 -5.2325 +167 -10.7266 0 -3.40112 +168 -29.8253 0 -1.83137 +169 -42.6449 0 -1.30812 +170 -45.5228 0 0.784875 +171 -42.3832 0 1.83137 +172 20.1451 0 0.261625 +173 33.7496 0 1.0465 +174 41.5984 0 1.83137 +175 46.3076 0 1.83137 +176 50.7552 0 1.83137 +(black gray44) 4 1 2 3 4 +(black gray44) 4 5 6 7 8 +gray44 4 9 10 11 12 +gray44 4 13 14 15 16 +gray44 14 17 18 19 20 21 22 23 24 25 26 27 28 29 30 +(black gray44)12 31 32 33 34 35 36 37 38 39 40 41 42 +(black gray44) 12 43 44 45 46 47 48 49 50 51 52 53 54 +gray44 7 55 56 57 58 59 60 61 +gray44 7 62 63 64 65 66 67 68 +gray44 5 69 70 71 72 73 +gray44 5 74 75 76 77 78 +gray44 11 79 80 81 82 83 84 85 86 87 88 89 +gray44 11 90 91 92 93 94 95 96 97 98 99 100 +gray44 11 101 102 103 104 105 106 107 108 109 110 111 +gray44 11 112 113 114 115 116 117 118 119 120 121 122 +gray44 14 123 124 125 126 127 128 129 130 131 132 133 134 135 136 +gray44 10 137 138 139 140 141 142 143 144 145 146 +gray44 10 147 148 149 150 151 152 153 154 155 156 +gray44 20 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 diff -Nru acm-5.0/objects/aircraft/su30.txt acm-6.0+20200416/objects/aircraft/su30.txt --- acm-5.0/objects/aircraft/su30.txt 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/objects/aircraft/su30.txt 2017-09-04 17:20:20.000000000 +0000 @@ -0,0 +1,197 @@ +aircraft "Su-30" { + + Object "su30.obv" + Description "Sukhoi Su-30 Multi-Role Fighter" + + DISEntityType 1:2:222:2:9:0:0 # used Su-37 enumeration + DISAltEntityType 1:2:225:1:3:3:0 + + WingArea 668.0 # (wingS) Wing surface area (ft^2) + WingHalfSpan 24 # (wings) Wing half-span (ft) + WingHeight 0.0 # (wingh) Height of the wing aerodyn. center above CM (ft) + Chord 16 # (c) Mean geometric chord of wing (ft) + AspectRatio 3.48 # (aspectRatio) aspect ratio + EmptyWeight 32000 #(emptyWeight) Empty weight (well, actually mass) (lb) + + # Max. wing load: + MaxLoadZPositive 339000 # 8*(EmptyWeight + 0.5*MaxFuel) (+8 g) + MaxLoadZNegative 127000 # 3*(EmptyWeight + 0.5*MaxFuel) (-3 g) + + # (I(x,y,z)) Moments of inertia (lb ft^2) + # FIXME. These are simply the moments of the F-16 multiplied by 3.5. + # Since the Su-30 empty weight is 2 times the F-16, and supposing + # the same geometric distribution of masses, moments are proportional + # to emptyWeight^(5/3) and this gives the 3.5 factor. [U.S.] + Ixx 25000 + Iyy 175000 + Izz 191000 + + # (cFlap) Lift due to flaps (yields Clift of 1.0 at max extension) + CFlap 0.64279 + BetaStall 15.0 # (deg) + + CFlapDrag 0.0467 # (cFlapDrag) Drag due to Flaps + CGearDrag 0.03 # (cGearDrag) Drag due to Gear + CSpeedBrake 0.03 # (cSpeedBrake) Drag due to Speed Brake + # at 90 degrees + + # (CDb) Drag Characteristic equation [Wave+body] + # independent variable is mach number + CDb { # (CDb) Drag Characteristic equation [Wave+body] + # independent variable is mach number + 0.0, 0.020, + 0.2, 0.020, + 0.95, 0.015, + 1.05, 0.045, + 2.00, 0.030, + 10.0, 0.030 + } + + CLift { # (CLift) Lift-slope curve (vs alpha) + -3.0, 0.0, + -1.05, 0.0, + -0.576, -2.199, + -0.556, -2.23, + -0.524, -2.199, + 0.524, 2.199, + 0.556, 2.23, + 0.576, 2.199, + 1.05, 0.0, + 2.0, 0.0 + } + + CnBeta { # (CnBeta) Yaw due to sideslip equation + 0, -0.08125, + 0.523540, -0.078125, + 0.785340, -0.0609375, + 1.047198, 0.125, + 1.58, 0.0 + } + + ClBeta { # (ClBeta) Roll due to sideslip equation + 0, -0.0125, + 0.43633, -0.015, + 0.78540, 0.125, + 1.58, 0.0, + 3.142, 0.125, + } + + CDBOrigin 0 # (CDBOrigin, CDBFactor) Drag due to sideslip + CDBFactor 0.5 + CDBPhase 0 # (CDBPhase) sideslip drag phase (deg) + CYBeta -1.4 # (CYbeta) Side-force from side-slip [dCY/dBeta] + EffElevator 0.60 # (effElevator) Elevator effectiveness + EffRudder 0.10 # (effRudder) Rudder effectiveness + MaxRudder 20 # (maxRudder) max Rudder (deg) + MaxAileron 20 # (maxAileron) max Aileron (deg) + MaxFlap 20 # (maxFlap) max flap setting (deg) + # (flapRate) flap extension rate (about 2 secs to fully extend flaps) + FlapRate 10 # (deg/sec) + # (gearRate) gear extension rate (about 3 secs to fully extend gear) + GearRate 30 # (deg/sec) + MaxSpeedBrake 80 # (maxSpeedBrake) max Speed Brake setting (deg) + # (speedBrakeRate) rate of speed brake extension (2 secs to full ext) + SpeedBrakeRate 40 # (deg/sec) + # (speedBrakeIncr) speed Brake increment per keystroke + SpeedBrakeIncr 80 # (deg) + Clda 0.048 # (Clda) roll moment from aileron offset + Cldr 0.004 # (Cldr) roll moment from rudder offset + Clp -0.27 # (Clp) roll damping + Cmq -8.0 # (Cmq) pitch damping factor + Cnr -0.378 # (Cnr) yaw damping factor + CmAlpha -0.40 # (cmSlope) CmAlpha curve slope + MaxFuel 20700 # (maxFuel) maximum internal fuel (lb) + EngineType "GenericJetEngine" + # engine lag factor (how fast does it respond to throttle changes) + EngineLag -3.0 + # Engine data based on updated RD-33K engines cited in [AirI Aug89]. + # (maxThrust) max static thrust, military power (lbf) + MaxThrust 17600 + # (maxABThrust) max static thrust, afterburner on (lbf) + MaxABThrust 55000 + + Thrust { # (Thrust) Mach Number vs. thrust + 0, 1, + 1.7, 1.5, + 2.0, 0.84, + 5, 0.5 + } + ABThrust { # (ABThrust) afterburner thrust table + 0, 1, + 0.5, 1, + 1, 1.21, + 1.7, 1.7, + 5, 1.64 + } + HasThrustReverser 0 # (hasThrustReverser) 0=no, otherwise yes + # (spFuelConsump) specific fuel consump(lb fuel/lb T x hr) + SpFuelConsump 0.7 + # (spABFuelConsump) AB specific fuel consump(lb fuel/lb T x hr) + SpABFuelConsump 2.5 + # (viewPoint) pilot's viewing location wrt CM + ViewPoint { 34, 0, -8.9 } + + # Landing Gear control parameters + + MuStatic 0.08 # (muStatic) static coeff of friction no-brakes + MuKinetic 0.05 # (muKinetic) moving coeff of friction no-brakes + MuBStatic 0.7 # (muBStatic) static brakes-on + MuBKinetic 0.6 # (muBKinetic) moving brakes-on + + MaxNWDef 72 # (maxNWDef) maximum nosewheel deflection (deg) + + # (rm) location of right main gear attachments + Rm { -2.2, 8, 8.9 } + # (rn) location of nose gear attachments + Rn { 24.2, 0, 8.4 } + Dm 6400 # main oleo damping factor (lbf s/ft) + Dn 2000 # nose oleo damping factor (lbf s/ft) + Km 106000 # main oleo spring factor (lbf/ft) + Kn 22000 # nose oleo spring factor (lbf/ft) + Gm 2 # main strut length with tire (ft) + Gn 2 # nose strut length with tire (ft) + CmMax 1.0 # (cmMax) main max oleo extension distance (ft) + CnMax 1.5 # (cnMax) nose max oleo extension distance (ft) + # (tailExtent) as we rotate, this part may drag + TailExtent { -18.165, 0.0, 1.191 } + + # Speed limits at MTOW. Leave undefined or set to 0 if unknown. + MTOW 52700.0 # maximum takeoff weight (lb) + #Vs0 42.0 # stall speed, full flaps (KIAS) + #Vs1 50.0 # stall speed, no flaps (KIAS) + #Vfe 100.0 # max speed with flaps extended (KIAS) + #Vno 145.0 # normal operation speed (KIAS) + #Vne 164.0 # never exceed speed (KIAS) + + StructurePoints 30 # (structurePts) maximum structural damage + + # Radar data based on N-019 Pulse Doppler radar cited in [AirI Aug89]. + + RadarOutput 15000 # (radarOutput) radar output (watts) + RadarTRange 38 # (radarTRange) tracking radar range (NM) + RadarDRange 55 # (radarDRange) detection radar range (NM) + TEWSThreshold 0 # Radar Warning Receiver threshold (watts) + + # Weapons + + WeaponCount 7 + + HardPoint0 { 7.0, -4.0, 0.0 } + HardPoint1 { 0.357, 15.6, 0.0 } + HardPoint2 { 0.357, -15.6, 0.0 } + HardPoint3 { 1.5, 9.0, 2.0 } + HardPoint4 { 1.5, -9.0, 2.0 } + HardPoint5 { 1.5, 8.0, 1.5 } + HardPoint6 { 1.5, -8.0, 1.5 } + HardPoint7 { 1.5, 10.0, 1.5 } + HardPoint8 { 1.5, -10.0, 1.5 } + + WeaponStation 0 "M61A1" 500 0 0 + WeaponStation 1 "AIM-9M" 0 0 0 + WeaponStation 2 "AIM-9M" 0 0 0 + WeaponStation 3 "MK82" 0 0 0 + WeaponStation 4 "MK82" 0 0 0 + WeaponStation 5 "MK82" 0 0 0 + WeaponStation 6 "MK82" 0 0 0 + +} \ No newline at end of file diff -Nru acm-5.0/objects/aircraft/ufo.obv acm-6.0+20200416/objects/aircraft/ufo.obv --- acm-5.0/objects/aircraft/ufo.obv 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/objects/aircraft/ufo.obv 2017-04-18 11:22:44.000000000 +0000 @@ -0,0 +1,90 @@ +ufo +72 16 +1 15.56 15.56 0.00 +2 0.00 0.00 -20.00 +3 22.00 0.00 0.00 +4 0.00 22.00 0.00 +5 0.00 0.00 -20.00 +6 15.56 15.56 0.00 +7 -15.56 15.56 0.00 +8 0.00 0.00 -20.00 +9 0.00 22.00 0.00 +10 -22.00 0.00 0.00 +11 0.00 0.00 -20.00 +12 -15.56 15.56 0.00 +13 -15.56 -15.56 0.00 +14 0.00 0.00 -20.00 +15 -22.00 0.00 0.00 +16 -0.00 -22.00 0.00 +17 0.00 0.00 -20.00 +18 -15.56 -15.56 0.00 +19 15.56 -15.56 0.00 +20 0.00 0.00 -20.00 +21 -0.00 -22.00 0.00 +22 22.00 -0.00 0.00 +23 0.00 0.00 -20.00 +24 15.56 -15.56 0.00 +25 20.44 13.88 0.00 +26 21.40 11.57 -4.33 +27 23.31 6.95 -4.33 +28 24.27 4.64 -0.00 +29 23.31 6.95 4.33 +30 21.40 11.57 4.33 +31 4.64 24.27 0.00 +32 6.95 23.31 -4.33 +33 11.57 21.40 -4.33 +34 13.88 20.44 -0.00 +35 11.57 21.40 4.33 +36 6.95 23.31 4.33 +37 -13.88 20.44 0.00 +38 -11.57 21.40 -4.33 +39 -6.95 23.31 -4.33 +40 -4.64 24.27 -0.00 +41 -6.95 23.31 4.33 +42 -11.57 21.40 4.33 +43 -24.27 4.64 0.00 +44 -23.31 6.95 -4.33 +45 -21.40 11.57 -4.33 +46 -20.44 13.88 -0.00 +47 -21.40 11.57 4.33 +48 -23.31 6.95 4.33 +49 -20.44 -13.88 0.00 +50 -21.40 -11.57 -4.33 +51 -23.31 -6.95 -4.33 +52 -24.27 -4.64 -0.00 +53 -23.31 -6.95 4.33 +54 -21.40 -11.57 4.33 +55 -4.64 -24.27 0.00 +56 -6.95 -23.31 -4.33 +57 -11.57 -21.40 -4.33 +58 -13.88 -20.44 -0.00 +59 -11.57 -21.40 4.33 +60 -6.95 -23.31 4.33 +61 13.88 -20.44 0.00 +62 11.57 -21.40 -4.33 +63 6.95 -23.31 -4.33 +64 4.64 -24.27 -0.00 +65 6.95 -23.31 4.33 +66 11.57 -21.40 4.33 +67 24.27 -4.64 0.00 +68 23.31 -6.95 -4.33 +69 21.40 -11.57 -4.33 +70 20.44 -13.88 -0.00 +71 21.40 -11.57 4.33 +72 23.31 -6.95 4.33 +(gray44 clip) 3 1 2 3 +(gray44 clip) 3 4 5 6 +(gray44 clip) 3 7 8 9 +(gray44 clip) 3 10 11 12 +(gray44 clip) 3 13 14 15 +(gray44 clip) 3 16 17 18 +(gray44 clip) 3 19 20 21 +(gray44 clip) 3 22 23 24 +(red clip) 6 25 26 27 28 29 30 +(red clip) 6 31 32 33 34 35 36 +(red clip) 6 37 38 39 40 41 42 +(red clip) 6 43 44 45 46 47 48 +(green clip) 6 49 50 51 52 53 54 +(green clip) 6 55 56 57 58 59 60 +(green clip) 6 61 62 63 64 65 66 +(green clip) 6 67 68 69 70 71 72 diff -Nru acm-5.0/objects/aircraft/ufo.txt acm-6.0+20200416/objects/aircraft/ufo.txt --- acm-5.0/objects/aircraft/ufo.txt 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/objects/aircraft/ufo.txt 2017-10-22 14:28:26.000000000 +0000 @@ -0,0 +1,201 @@ +# Intended to become a very fast, pretty unkillable aircraft to be used for +# testing. Acm uses this one to display something when a remote DIS entity +# is not listed in the inventory nor in the objects map. +# Currently basically a very light, MiG 29 with zero fuel consumption, +# super powerful AB, and thrust reverse to hover! + +aircraft "UFO" { + + Description "UFO - Unidentified Flying Object" + Object "ufo.obv" + WingArea 400.0 # (wingS) Wing surface area (ft^2) + WingHalfSpan 18.87 # (wings) Wing half-span (ft) + WingHeight 0.0 # (wingh) Height of the wing aerodyn. center above CM (ft) + Chord 9.61 # (c) Mean geometric chord of wing (ft) + AspectRatio 3.56 # (aspectRatio) aspect ratio + EmptyWeight 5000 # (emptyWeight) Empty weight (well, actually mass) (lb) + + # Max. wing load (lbf): + MaxLoadZPositive 273000 # 10*(EmptyWeight+50%*MaxFuel) (+10 g) + MaxLoadZNegative 137000 # 5*(EmptyWeight+50%*MaxFuel) (-5 g) + + DISEntityType 255:255:255:255:255:255:255 + DISAltEntityType 255:255:255:255:255:255:255 + + # (I(x,y,z)) Moments of inertia (lb ft^2): + Ixx 4000.0 + Iyy 4000.0 + Izz 4000.0 + + # (cFlap) Lift due to flaps (yields Clift of 1.0 at max extension) + CFlap 0.64279 + BetaStall 15.0 # (deg) + + CFlapDrag 0.0467 # (cFlapDrag) Drag due to Flaps + CGearDrag 0.03 # (cGearDrag) Drag due to Gear + CSpeedBrake 0.03 # (cSpeedBrake) Drag due to Speed Brake + # at 90 degrees + + # (CDb) Drag Characteristic equation [Wave+body] + # independent variable is mach number + CDb { # (CDb) Drag Characteristic equation [Wave+body] + # independent variable is mach number + 0.0, 0.010, + 0.2, 0.010, + 0.95, 0.007, + 1.05, 0.022, + 2.00, 0.015, + 10.0, 0.015 + } + + CLift { # (CLift) Lift-slope curve (vs alpha) + -3.0, 0.0, + -1.05, 0.0, + -0.576, -2.199, + -0.556, -2.23, + -0.524, -2.199, + 0.524, 2.199, + 0.556, 2.23, + 0.576, 2.199, + 1.05, 0.0, + 2.0, 0.0 + } + + CnBeta { # (CnBeta) Yaw due to sideslip equation + 0, -0.08125, + 0.523540, -0.078125, + 0.785340, -0.0609375, + 1.047198, 0.125, + 1.58, 0.0 + } + + ClBeta { # (ClBeta) Roll due to sideslip equation + 0, -0.0125, + 0.43633, -0.015, + 0.78540, 0.125, + 1.58, 0.0, + 3.142, 0.125, + } + + CDBOrigin 0 # (CDBOrigin, CDBFactor) Drag due to sideslip + CDBFactor 0.5 + CDBPhase 0 # (CDBPhase) sideslip drag phase (deg) + CYBeta -1.4 # (CYbeta) Side-force from side-slip [dCY/dBeta] + EffElevator 0.60 # (effElevator) Elevator effectiveness + EffRudder 0.14 # (effRudder) Rudder effectiveness + MaxRudder 20 # (maxRudder) max Rudder (deg) + MaxAileron 20 # (maxAileron) max Aileron (deg) + MaxFlap 20 # (maxFlap) max flap setting (deg) + # (flapRate) flap extension rate (about 2 secs to fully extend flaps) + FlapRate 10 # (deg/sec) + # (gearRate) gear extension rate (about 3 secs to fully extend gear) + GearRate 30 # (deg/sec) + MaxSpeedBrake 80 # (maxSpeedBrake) max Speed Brake setting (deg) + # (speedBrakeRate) rate of speed brake extension (2 secs to full ext) + SpeedBrakeRate 40 # (deg/sec) + # (speedBrakeIncr) speed Brake increment per keystroke + SpeedBrakeIncr 80 # (deg) + Clda 0.048 # (Clda) roll moment from aileron offset + Cldr 0.004 # (Cldr) roll moment from rudder offset + Clp -0.27 # (Clp) roll damping + Cmq -8.0 # (Cmq) pitch damping factor + Cnr -0.378 # (Cnr) yaw damping factor + CmAlpha -0.40 # (cmSlope) CmAlpha curve slope + EngineType "GenericRocketEngine" + MaxFuel 1 # (maxFuel) maximum internal fuel (lb) + # engine lag factor (how fast does it respond to throttle changes) + EngineLag -3.0 + # Engine data based on updated RD-33K engines cited in [AirI Aug89]. + # (maxThrust) max static thrust, military power (lbf) + MaxThrust 5000 + # (maxABThrust) max static thrust, afterburner on (lbf) + MaxABThrust 50000 + + Thrust { # (Thrust) Mach Number vs. thrust + 0, 1, + 1.7, 1.5, + 2.0, 0.84, + 5, 0.5 + } + ABThrust { # (ABThrust) afterburner thrust table + 0, 1, + 0.5, 1, + 1, 1.21, + 1.7, 1.7, + 5, 1.64 + } + HasThrustReverser 1 # (hasThrustReverser) 0=no, otherwise yes + # (spFuelConsump) specific fuel consump(lb fuel/lb T x hr) + SpFuelConsump 0 + # (spABFuelConsump) AB specific fuel consump(lb fuel/lb T x hr) + SpABFuelConsump 0 + # (viewPoint) pilot's viewing location wrt CM + ViewPoint { 0, 0, -15 } + + # Landing Gear control parameters + + MuStatic 0.08 # (muStatic) static coeff of friction no-brakes + MuKinetic 0.05 # (muKinetic) moving coeff of friction no-brakes + MuBStatic 0.7 # (muBStatic) static brakes-on + MuBKinetic 0.6 # (muBKinetic) moving brakes-on + + MaxNWDef 90 # (maxNWDef) maximum nosewheel deflection (deg) + + # (rn) location of nose gear attachments vs. CM (ft) + Rn { 15, 0, 0 } + Gn 3.0 # nose strut length with tire (ft) + CnMax 2 # (cnMax) nose max oleo extension distance (ft) + Kn 1000 # nose oleo spring factor (lbf/ft) + Dn 100 # nose oleo damping factor (lbf s/ft) + + # (rm) location of right main gear attachments vs. CM (ft) + Rm { -2.0, 9, 0 } + Gm 3.0 # main strut length with tire (ft) + CmMax 2 # (cmMax) main max oleo extension distance (ft) + Km 3000 # main oleo spring factor (lbf/ft) + Dm 300 # main oleo damping factor (lbf s/ft) + + # (tailExtent) as we rotate, this part may drag + TailExtent { -5, 0.0, 0 } + + # Speed limits at MTOW. Leave undefined or set to 0 if unknown. + MTOW 10000.0 # maximum takeoff weight (lb) + #Vs0 42.0 # stall speed, full flaps (KIAS) + #Vs1 50.0 # stall speed, no flaps (KIAS) + #Vfe 100.0 # max speed with flaps extended (KIAS) + #Vno 145.0 # normal operation speed (KIAS) + #Vne 164.0 # never exceed speed (KIAS) + + StructurePoints 100000 # (structurePts) maximum structural damage + + # Radar data based on N-019 Pulse Doppler radar cited in [AirI Aug89]. + + RadarOutput 15000 # (radarOutput) radar output (watts) + RadarTRange 38 # (radarTRange) tracking radar range (NM) + RadarDRange 55 # (radarDRange) detection radar range (NM) + TEWSThreshold 0 # Radar Warning Receiver threshold (watts) + + # Weapons + + WeaponCount 9 + + HardPoint0 { 7.0, -4.0, 0.0 } + HardPoint1 { 0.357, 15.6, 0.0 } + HardPoint2 { 0.357, -15.6, 0.0 } + HardPoint3 { 1.5, 9.0, 2.0 } + HardPoint4 { 1.5, -9.0, 2.0 } + HardPoint5 { 1.5, 8.0, 1.5 } + HardPoint6 { 1.5, -8.0, 1.5 } + HardPoint7 { 1.5, 10.0, 1.5 } + HardPoint8 { 1.5, -10.0, 1.5 } + + WeaponStation 0 "M61A1" 5000 0 0 + WeaponStation 1 "MK82" 0 0 0 + WeaponStation 2 "MK82" 0 0 0 + WeaponStation 3 "AIM-9M" 0 0 0 + WeaponStation 4 "AIM-9M" 0 0 0 + WeaponStation 5 "AIM-9M" 0 0 0 + WeaponStation 6 "AIM-9M" 0 0 0 + WeaponStation 7 "AIM-120" 0 0 0 + WeaponStation 8 "AIM-120" 0 0 0 +} \ No newline at end of file diff -Nru acm-5.0/objects/aircraft.txt acm-6.0+20200416/objects/aircraft.txt --- acm-5.0/objects/aircraft.txt 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/objects/aircraft.txt 2020-04-16 12:05:38.000000000 +0000 @@ -0,0 +1,14 @@ +# Aircraft Inventory. +# See ACM-Bibliography for further information about the sources of this +# information. Read the manual for a detailed description of the format. + +include "aircraft/ufo.txt" +include "aircraft/mig29.txt" +include "aircraft/su30.txt" +include "aircraft/f16.txt" +include "aircraft/amx.txt" +include "aircraft/c172.txt" +include "aircraft/b-747.txt" +include "aircraft/md81.txt" +include "aircraft/p51a.txt" +include "aircraft/space-shuttle-orbiter.txt" Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/objects/apglock.au and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/objects/apglock.au differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/objects/apglock.wav and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/objects/apglock.wav differ diff -Nru acm-5.0/objects/baghdad-scene acm-6.0+20200416/objects/baghdad-scene --- acm-5.0/objects/baghdad-scene 1998-12-16 03:43:19.000000000 +0000 +++ acm-6.0+20200416/objects/baghdad-scene 1970-01-01 00:00:00.000000000 +0000 @@ -1,8 +0,0 @@ -33.334N 44.355E 112 154 -33.258N 44.209E 113 140 -#CAC6AF -RWY OOOO 14/32 112 11181 150 33.334N 44.355E 33.320N 44.378E -RWY ORAS 15/33 104 8293 150 33.284N 44.498E 33.267N 44.516E -RWY ORBS 15L/33R 113 12000 200 33.271N 44.212E 33.227N 44.236E -RWY ORBS 15R/33L 113 12000 200 33.258N 44.209E 33.223N 44.230E -FEATURES diff -Nru acm-5.0/objects/c172.obv acm-6.0+20200416/objects/c172.obv --- acm-5.0/objects/c172.obv 1998-08-14 02:26:06.000000000 +0000 +++ acm-6.0+20200416/objects/c172.obv 1970-01-01 00:00:00.000000000 +0000 @@ -1,153 +0,0 @@ -object -128 23 -1 0.602816 1.25587 1.20249 -2 -0.0502347 7.58544 -2.16009 -3 0.301408 7.58544 -2.16009 -4 0.904225 1.1554 1.25587 -5 0.904225 -1.1554 1.25587 -6 0.301408 -7.58544 -2.16009 -7 -0.0502347 -7.58544 -2.16009 -8 0.602816 -1.25587 1.20249 -9 -4.26195 -1.41515 -1.00941 -10 -4.52832 -1.40429 -1.12157 -11 -4.02362 -1.32018 -1.99078 -12 -3.79931 -1.32018 -1.99078 -13 -2.42539 -1.64029 -2.03284 -14 -2.45343 -1.64029 -0.897253 -15 -2.18705 -1.64029 -0.911273 -16 -2.18705 -1.64029 -2.06088 -17 1.26288e-15 -1.5925 -2.15902 -18 0.224313 -1.69637 -0.827155 -19 0.532744 -1.65431 -0.827155 -20 0.266372 -1.55617 -2.15902 -21 0.266372 1.55617 -2.15902 -22 0.532744 1.65431 -0.827155 -23 0.224313 1.69637 -0.827155 -24 1.26288e-15 1.5925 -2.15902 -25 -2.18705 1.64029 -2.06088 -26 -2.18705 1.64029 -0.911273 -27 -2.45343 1.64029 -0.897253 -28 -2.42539 1.64029 -2.03284 -29 -3.79931 1.32018 -1.99078 -30 -4.02362 1.32018 -1.99078 -31 -4.52832 1.40429 -1.12157 -32 -4.26195 1.41515 -1.00941 -33 -4.03764 0.0841175 -2.0048 -34 -5.00499 0.0841175 -1.33186 -35 -5.00499 -0.0700979 -1.33186 -36 -4.03764 -0.0981371 -2.0048 -37 5.79319 0 -0.0919553 -38 5.79319 0 -0.827598 -39 4.13799 0 -1.19542 -40 2.48279 0 -1.37933 -41 1.74715 0 -1.01151 -42 0.735643 0 -0.827598 -43 -2.02302 0 -0.919553 -44 -4.04603 0 -0.919553 -45 -5.1495 0 -1.37933 -46 -15.6324 0 -0.551732 -47 -15.5404 0 -0.183911 -48 0.275866 0 1.56324 -49 3.03453 0 1.47129 -50 3.95408 0 1.47129 -51 4.96559 0 1.10346 -52 -12.2301 0.183911 -0.827598 -53 -12.7818 4.50581 -0.827598 -54 -13.2416 4.87363 -0.827598 -55 -15.1726 4.78168 -0.827598 -56 -15.8163 0.551732 -0.827598 -57 -14.1611 0.0919553 -0.827598 -58 -0.551732 16.0002 -2.75866 -59 -2.94257 16.0002 -2.6667 -60 -3.95408 7.63229 -2.29888 -61 -4.04603 0 -1.99534 -62 0.275866 0 -2.16157 -63 0.183911 1.56324 -2.21948 -64 0.919553 1.6552 -2.25139 -65 0.827598 7.54034 -2.47918 -66 0.275866 15.5404 -2.77242 -67 0.275866 -15.5404 -2.77242 -68 0.827598 -7.54034 -2.47918 -69 0.919553 -1.6552 -2.25139 -70 0.183911 -1.56324 -2.21948 -71 0.275866 -0 -2.16157 -72 -4.04603 -0 -1.99534 -73 -3.95408 -7.63229 -2.29888 -74 -2.94257 -16.0002 -2.6667 -75 -0.551732 -16.0002 -2.75866 -76 -14.1611 -0.0919553 -0.827598 -77 -15.8163 -0.551732 -0.827598 -78 -15.1726 -4.78168 -0.827598 -79 -13.2416 -4.87363 -0.827598 -80 -12.7818 -4.50581 -0.827598 -81 -12.2301 -0.183911 -0.827598 -82 5.51732 0 -0.551732 -83 5.1495 1.19542 -0.551732 -84 -0.183911 1.74715 -0.551732 -85 -4.22994 1.56324 -0.551732 -86 -15.0807 0 -0.551732 -87 -15.0807 -0 -0.551732 -88 -4.22994 -1.56324 -0.551732 -89 -0.183911 -1.74715 -0.551732 -90 5.1495 -1.19542 -0.551732 -91 5.51732 -0 -0.551732 -92 0.0919553 0 1.6552 -93 0.0919553 -0.919553 1.47129 -94 0.0919553 -1.47129 0.919553 -95 0.0919553 -1.56324 -0.0919553 -96 0.0919553 -1.56324 -0.919553 -97 0.0919553 0 -1.19542 -98 0.0919553 -0 -1.19542 -99 0.0919553 1.56324 -0.919553 -100 0.0919553 1.56324 -0.0919553 -101 0.0919553 1.47129 0.919553 -102 0.0919553 0.919553 1.47129 -103 0.0919553 -0 1.6552 -104 4.13799 0 2.20693 -105 4.13799 -0.275866 2.48279 -106 4.13799 -0.367821 3.03453 -107 4.13799 0 3.12648 -108 4.13799 -0 3.12648 -109 4.13799 0.367821 3.03453 -110 4.13799 0.275866 2.48279 -111 4.13799 -0 2.20693 -112 -0.367821 -3.31039 3.03453 -113 -0.367821 -3.21844 2.48279 -114 -0.367821 -3.4943 2.20693 -115 -0.367821 -3.77017 2.48279 -116 -0.367821 -3.86212 3.12648 -117 -0.367821 3.86212 3.12648 -118 -0.367821 3.77017 2.48279 -119 -0.367821 3.4943 2.20693 -120 -0.367821 3.21844 2.48279 -121 -0.367821 3.31039 3.03453 -122 -6.01584 0 -1.2729 -123 -11.2573 0 -1.82463 -124 -12.3608 0 -2.1005 -125 -14.5677 0 -4.85916 -126 -16.5907 0 -4.58329 -127 -15.5792 0 -0.997034 -128 -15.5792 0 -0.629213 -gray44 4 1 2 3 4 -gray44 4 5 6 7 8 -gray44 4 9 10 11 12 -gray44 4 13 14 15 16 -gray44 4 17 18 19 20 -gray44 4 21 22 23 24 -gray44 4 25 26 27 28 -gray44 4 29 30 31 32 -gray44 4 33 34 35 36 -gray44 15 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 -gray44 6 52 53 54 55 56 57 -gray44 9 58 59 60 61 62 63 64 65 66 -gray44 9 67 68 69 70 71 72 73 74 75 -gray44 6 76 77 78 79 80 81 -gray44 5 82 83 84 85 86 -gray44 5 87 88 89 90 91 -gray44 6 92 93 94 95 96 97 -gray44 6 98 99 100 101 102 103 -gray44 4 104 105 106 107 -gray44 4 108 109 110 111 -gray44 5 112 113 114 115 116 -gray44 5 117 118 119 120 121 -gray44 7 122 123 124 125 126 127 128 Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/objects/cannon.au and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/objects/cannon.au differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/objects/cannon.wav and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/objects/cannon.wav differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/objects/crash.au and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/objects/crash.au differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/objects/crash.wav and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/objects/crash.wav differ diff -Nru acm-5.0/objects/cyl1.dxf acm-6.0+20200416/objects/cyl1.dxf --- acm-5.0/objects/cyl1.dxf 1998-08-14 02:26:24.000000000 +0000 +++ acm-6.0+20200416/objects/cyl1.dxf 1970-01-01 00:00:00.000000000 +0000 @@ -1,2644 +0,0 @@ - 0 -SECTION - 2 -HEADER - 9 -$EXTMIN - 10 --20.600000 - 20 --17.494938 - 9 -$EXTMAX - 10 -17.400000 - 20 -22.094938 - 9 -$LIMMIN - 10 --20.600000 - 20 --17.494938 - 9 -$LIMMAX - 10 -17.400000 - 20 -22.094938 - 9 -$LUNITS - 70 - 2 - 9 -$LUPREC - 70 - 3 - 9 -$AUNITS - 70 - 3 - 9 -$COORDS - 70 - 1 - 0 -ENDSEC - 0 -SECTION - 2 -TABLES - 0 -TABLE - 2 -LAYER - 70 -255 - 0 -LAYER - 2 -0 - 6 -CONTINUOUS - 62 - 2 - 70 - 64 - 0 -ENDTAB - 0 -ENDSEC - 0 -SECTION - 2 -BLOCKS - 0 -ENDSEC - 0 -SECTION - 2 -ENTITIES - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 --20.123630 - 21 -5.726771 - 31 -0.097588 - 12 --18.718408 - 22 -9.741595 - 32 -0.190282 - 13 --18.718408 - 23 -9.741595 - 33 -0.190282 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 --18.718408 - 21 -9.741595 - 31 -0.190282 - 12 --16.454798 - 22 -13.343150 - 32 -0.273435 - 13 --16.454798 - 23 -13.343150 - 33 -0.273435 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 --16.454798 - 21 -13.343150 - 31 -0.273435 - 12 --13.446306 - 22 -16.350841 - 32 -0.342877 - 13 --13.446306 - 23 -16.350841 - 33 -0.342877 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 --13.446306 - 21 -16.350841 - 31 -0.342877 - 12 --9.843791 - 22 -18.613848 - 32 -0.395125 - 13 --9.843791 - 23 -18.613848 - 33 -0.395125 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 --9.843791 - 21 -18.613848 - 31 -0.395125 - 12 --5.827898 - 22 -20.018695 - 32 -0.427560 - 13 --5.827898 - 23 -20.018695 - 33 -0.427560 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 --5.827898 - 21 -20.018695 - 31 -0.427560 - 12 --1.600000 - 22 -20.494938 - 32 -0.438556 - 13 --1.600000 - 23 -20.494938 - 33 -0.438556 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 --1.600000 - 21 -20.494938 - 31 -0.438556 - 12 -2.627898 - 22 -20.018695 - 32 -0.427560 - 13 -2.627898 - 23 -20.018695 - 33 -0.427560 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 -2.627898 - 21 -20.018695 - 31 -0.427560 - 12 -6.643791 - 22 -18.613848 - 32 -0.395125 - 13 -6.643791 - 23 -18.613848 - 33 -0.395125 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 -6.643791 - 21 -18.613848 - 31 -0.395125 - 12 -10.246306 - 22 -16.350841 - 32 -0.342877 - 13 -10.246306 - 23 -16.350841 - 33 -0.342877 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 -10.246306 - 21 -16.350841 - 31 -0.342877 - 12 -13.254798 - 22 -13.343150 - 32 -0.273435 - 13 -13.254798 - 23 -13.343150 - 33 -0.273435 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 -13.254798 - 21 -13.343150 - 31 -0.273435 - 12 -15.518408 - 22 -9.741595 - 32 -0.190282 - 13 -15.518408 - 23 -9.741595 - 33 -0.190282 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 -15.518408 - 21 -9.741595 - 31 -0.190282 - 12 -16.923630 - 22 -5.726771 - 32 -0.097588 - 13 -16.923630 - 23 -5.726771 - 33 -0.097588 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 -16.923630 - 21 -5.726771 - 31 -0.097588 - 12 -17.400000 - 22 -1.500000 - 32 --0.000000 - 13 -17.400000 - 23 -1.500000 - 33 --0.000000 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 -17.400000 - 21 -1.500000 - 31 --0.000000 - 12 -16.923630 - 22 --2.726771 - 32 --0.097588 - 13 -16.923630 - 23 --2.726771 - 33 --0.097588 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 -16.923630 - 21 --2.726771 - 31 --0.097588 - 12 -15.518408 - 22 --6.741595 - 32 --0.190282 - 13 -15.518408 - 23 --6.741595 - 33 --0.190282 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 -15.518408 - 21 --6.741595 - 31 --0.190282 - 12 -13.254798 - 22 --10.343150 - 32 --0.273435 - 13 -13.254798 - 23 --10.343150 - 33 --0.273435 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 -13.254798 - 21 --10.343150 - 31 --0.273435 - 12 -10.246306 - 22 --13.350841 - 32 --0.342877 - 13 -10.246306 - 23 --13.350841 - 33 --0.342877 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 -10.246306 - 21 --13.350841 - 31 --0.342877 - 12 -6.643791 - 22 --15.613848 - 32 --0.395125 - 13 -6.643791 - 23 --15.613848 - 33 --0.395125 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 -6.643791 - 21 --15.613848 - 31 --0.395125 - 12 -2.627898 - 22 --17.018695 - 32 --0.427560 - 13 -2.627898 - 23 --17.018695 - 33 --0.427560 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 -2.627898 - 21 --17.018695 - 31 --0.427560 - 12 --1.600000 - 22 --17.494938 - 32 --0.438556 - 13 --1.600000 - 23 --17.494938 - 33 --0.438556 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 --1.600000 - 21 --17.494938 - 31 --0.438556 - 12 --5.827898 - 22 --17.018695 - 32 --0.427560 - 13 --5.827898 - 23 --17.018695 - 33 --0.427560 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 --5.827898 - 21 --17.018695 - 31 --0.427560 - 12 --9.843791 - 22 --15.613848 - 32 --0.395125 - 13 --9.843791 - 23 --15.613848 - 33 --0.395125 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 --9.843791 - 21 --15.613848 - 31 --0.395125 - 12 --13.446306 - 22 --13.350841 - 32 --0.342877 - 13 --13.446306 - 23 --13.350841 - 33 --0.342877 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 --13.446306 - 21 --13.350841 - 31 --0.342877 - 12 --16.454798 - 22 --10.343150 - 32 --0.273435 - 13 --16.454798 - 23 --10.343150 - 33 --0.273435 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 --16.454798 - 21 --10.343150 - 31 --0.273435 - 12 --18.718408 - 22 --6.741595 - 32 --0.190282 - 13 --18.718408 - 23 --6.741595 - 33 --0.190282 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 --18.718408 - 21 --6.741595 - 31 --0.190282 - 12 --20.123630 - 22 --2.726771 - 32 --0.097588 - 13 --20.123630 - 23 --2.726771 - 33 --0.097588 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 --20.123630 - 21 -7.326771 - 31 --69.202412 - 12 --20.123630 - 22 -5.726771 - 32 -0.097588 - 13 --20.600000 - 23 -1.500000 - 33 --0.000000 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.123630 - 20 -7.326771 - 30 --69.202412 - 11 --18.718408 - 21 -11.341595 - 31 --69.109718 - 12 --18.718408 - 22 -9.741595 - 32 -0.190282 - 13 --20.123630 - 23 -5.726771 - 33 -0.097588 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --18.718408 - 20 -11.341595 - 30 --69.109718 - 11 --16.454798 - 21 -14.943150 - 31 --69.026565 - 12 --16.454798 - 22 -13.343150 - 32 -0.273435 - 13 --18.718408 - 23 -9.741595 - 33 -0.190282 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --16.454798 - 20 -14.943150 - 30 --69.026565 - 11 --13.446306 - 21 -17.950841 - 31 --68.957123 - 12 --13.446306 - 22 -16.350841 - 32 -0.342877 - 13 --16.454798 - 23 -13.343150 - 33 -0.273435 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --13.446306 - 20 -17.950841 - 30 --68.957123 - 11 --9.843791 - 21 -20.213848 - 31 --68.904875 - 12 --9.843791 - 22 -18.613848 - 32 -0.395125 - 13 --13.446306 - 23 -16.350841 - 33 -0.342877 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --9.843791 - 20 -20.213848 - 30 --68.904875 - 11 --5.827898 - 21 -21.618695 - 31 --68.872440 - 12 --5.827898 - 22 -20.018695 - 32 -0.427560 - 13 --9.843791 - 23 -18.613848 - 33 -0.395125 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --5.827898 - 20 -21.618695 - 30 --68.872440 - 11 --1.600000 - 21 -22.094938 - 31 --68.861444 - 12 --1.600000 - 22 -20.494938 - 32 -0.438556 - 13 --5.827898 - 23 -20.018695 - 33 -0.427560 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --1.600000 - 20 -22.094938 - 30 --68.861444 - 11 -2.627898 - 21 -21.618695 - 31 --68.872440 - 12 -2.627898 - 22 -20.018695 - 32 -0.427560 - 13 --1.600000 - 23 -20.494938 - 33 -0.438556 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 -2.627898 - 20 -21.618695 - 30 --68.872440 - 11 -6.643791 - 21 -20.213848 - 31 --68.904875 - 12 -6.643791 - 22 -18.613848 - 32 -0.395125 - 13 -2.627898 - 23 -20.018695 - 33 -0.427560 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 -6.643791 - 20 -20.213848 - 30 --68.904875 - 11 -10.246306 - 21 -17.950841 - 31 --68.957123 - 12 -10.246306 - 22 -16.350841 - 32 -0.342877 - 13 -6.643791 - 23 -18.613848 - 33 -0.395125 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 -10.246306 - 20 -17.950841 - 30 --68.957123 - 11 -13.254798 - 21 -14.943150 - 31 --69.026565 - 12 -13.254798 - 22 -13.343150 - 32 -0.273435 - 13 -10.246306 - 23 -16.350841 - 33 -0.342877 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 -13.254798 - 20 -14.943150 - 30 --69.026565 - 11 -15.518408 - 21 -11.341595 - 31 --69.109718 - 12 -15.518408 - 22 -9.741595 - 32 -0.190282 - 13 -13.254798 - 23 -13.343150 - 33 -0.273435 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 -15.518408 - 20 -11.341595 - 30 --69.109718 - 11 -16.923630 - 21 -7.326771 - 31 --69.202412 - 12 -16.923630 - 22 -5.726771 - 32 -0.097588 - 13 -15.518408 - 23 -9.741595 - 33 -0.190282 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 -16.923630 - 20 -7.326771 - 30 --69.202412 - 11 -17.400000 - 21 -3.100000 - 31 --69.300000 - 12 -17.400000 - 22 -1.500000 - 32 --0.000000 - 13 -16.923630 - 23 -5.726771 - 33 -0.097588 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 -17.400000 - 20 -3.100000 - 30 --69.300000 - 11 -16.923630 - 21 --1.126771 - 31 --69.397588 - 12 -16.923630 - 22 --2.726771 - 32 --0.097588 - 13 -17.400000 - 23 -1.500000 - 33 --0.000000 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 -16.923630 - 20 --1.126771 - 30 --69.397588 - 11 -15.518408 - 21 --5.141595 - 31 --69.490282 - 12 -15.518408 - 22 --6.741595 - 32 --0.190282 - 13 -16.923630 - 23 --2.726771 - 33 --0.097588 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 -15.518408 - 20 --5.141595 - 30 --69.490282 - 11 -13.254798 - 21 --8.743150 - 31 --69.573435 - 12 -13.254798 - 22 --10.343150 - 32 --0.273435 - 13 -15.518408 - 23 --6.741595 - 33 --0.190282 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 -13.254798 - 20 --8.743150 - 30 --69.573435 - 11 -10.246306 - 21 --11.750841 - 31 --69.642877 - 12 -10.246306 - 22 --13.350841 - 32 --0.342877 - 13 -13.254798 - 23 --10.343150 - 33 --0.273435 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 -10.246306 - 20 --11.750841 - 30 --69.642877 - 11 -6.643791 - 21 --14.013848 - 31 --69.695125 - 12 -6.643791 - 22 --15.613848 - 32 --0.395125 - 13 -10.246306 - 23 --13.350841 - 33 --0.342877 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 -6.643791 - 20 --14.013848 - 30 --69.695125 - 11 -2.627898 - 21 --15.418695 - 31 --69.727560 - 12 -2.627898 - 22 --17.018695 - 32 --0.427560 - 13 -6.643791 - 23 --15.613848 - 33 --0.395125 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 -2.627898 - 20 --15.418695 - 30 --69.727560 - 11 --1.600000 - 21 --15.894938 - 31 --69.738556 - 12 --1.600000 - 22 --17.494938 - 32 --0.438556 - 13 -2.627898 - 23 --17.018695 - 33 --0.427560 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --1.600000 - 20 --15.894938 - 30 --69.738556 - 11 --5.827898 - 21 --15.418695 - 31 --69.727560 - 12 --5.827898 - 22 --17.018695 - 32 --0.427560 - 13 --1.600000 - 23 --17.494938 - 33 --0.438556 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --5.827898 - 20 --15.418695 - 30 --69.727560 - 11 --9.843791 - 21 --14.013848 - 31 --69.695125 - 12 --9.843791 - 22 --15.613848 - 32 --0.395125 - 13 --5.827898 - 23 --17.018695 - 33 --0.427560 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --9.843791 - 20 --14.013848 - 30 --69.695125 - 11 --13.446306 - 21 --11.750841 - 31 --69.642877 - 12 --13.446306 - 22 --13.350841 - 32 --0.342877 - 13 --9.843791 - 23 --15.613848 - 33 --0.395125 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --13.446306 - 20 --11.750841 - 30 --69.642877 - 11 --16.454798 - 21 --8.743150 - 31 --69.573435 - 12 --16.454798 - 22 --10.343150 - 32 --0.273435 - 13 --13.446306 - 23 --13.350841 - 33 --0.342877 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --16.454798 - 20 --8.743150 - 30 --69.573435 - 11 --18.718408 - 21 --5.141595 - 31 --69.490282 - 12 --18.718408 - 22 --6.741595 - 32 --0.190282 - 13 --16.454798 - 23 --10.343150 - 33 --0.273435 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --18.718408 - 20 --5.141595 - 30 --69.490282 - 11 --20.123630 - 21 --1.126771 - 31 --69.397588 - 12 --20.123630 - 22 --2.726771 - 32 --0.097588 - 13 --18.718408 - 23 --6.741595 - 33 --0.190282 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.123630 - 20 --1.126771 - 30 --69.397588 - 11 --20.600000 - 21 -3.100000 - 31 --69.300000 - 12 --20.600000 - 22 -1.500000 - 32 --0.000000 - 13 --20.123630 - 23 --2.726771 - 33 --0.097588 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 --20.123630 - 21 -7.326771 - 31 --69.202412 - 12 --18.718408 - 22 -11.341595 - 32 --69.109718 - 13 --18.718408 - 23 -11.341595 - 33 --69.109718 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 --18.718408 - 21 -11.341595 - 31 --69.109718 - 12 --16.454798 - 22 -14.943150 - 32 --69.026565 - 13 --16.454798 - 23 -14.943150 - 33 --69.026565 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 --16.454798 - 21 -14.943150 - 31 --69.026565 - 12 --13.446306 - 22 -17.950841 - 32 --68.957123 - 13 --13.446306 - 23 -17.950841 - 33 --68.957123 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 --13.446306 - 21 -17.950841 - 31 --68.957123 - 12 --9.843791 - 22 -20.213848 - 32 --68.904875 - 13 --9.843791 - 23 -20.213848 - 33 --68.904875 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 --9.843791 - 21 -20.213848 - 31 --68.904875 - 12 --5.827898 - 22 -21.618695 - 32 --68.872440 - 13 --5.827898 - 23 -21.618695 - 33 --68.872440 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 --5.827898 - 21 -21.618695 - 31 --68.872440 - 12 --1.600000 - 22 -22.094938 - 32 --68.861444 - 13 --1.600000 - 23 -22.094938 - 33 --68.861444 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 --1.600000 - 21 -22.094938 - 31 --68.861444 - 12 -2.627898 - 22 -21.618695 - 32 --68.872440 - 13 -2.627898 - 23 -21.618695 - 33 --68.872440 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 -2.627898 - 21 -21.618695 - 31 --68.872440 - 12 -6.643791 - 22 -20.213848 - 32 --68.904875 - 13 -6.643791 - 23 -20.213848 - 33 --68.904875 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 -6.643791 - 21 -20.213848 - 31 --68.904875 - 12 -10.246306 - 22 -17.950841 - 32 --68.957123 - 13 -10.246306 - 23 -17.950841 - 33 --68.957123 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 -10.246306 - 21 -17.950841 - 31 --68.957123 - 12 -13.254798 - 22 -14.943150 - 32 --69.026565 - 13 -13.254798 - 23 -14.943150 - 33 --69.026565 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 -13.254798 - 21 -14.943150 - 31 --69.026565 - 12 -15.518408 - 22 -11.341595 - 32 --69.109718 - 13 -15.518408 - 23 -11.341595 - 33 --69.109718 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 -15.518408 - 21 -11.341595 - 31 --69.109718 - 12 -16.923630 - 22 -7.326771 - 32 --69.202412 - 13 -16.923630 - 23 -7.326771 - 33 --69.202412 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 -16.923630 - 21 -7.326771 - 31 --69.202412 - 12 -17.400000 - 22 -3.100000 - 32 --69.300000 - 13 -17.400000 - 23 -3.100000 - 33 --69.300000 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 -17.400000 - 21 -3.100000 - 31 --69.300000 - 12 -16.923630 - 22 --1.126771 - 32 --69.397588 - 13 -16.923630 - 23 --1.126771 - 33 --69.397588 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 -16.923630 - 21 --1.126771 - 31 --69.397588 - 12 -15.518408 - 22 --5.141595 - 32 --69.490282 - 13 -15.518408 - 23 --5.141595 - 33 --69.490282 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 -15.518408 - 21 --5.141595 - 31 --69.490282 - 12 -13.254798 - 22 --8.743150 - 32 --69.573435 - 13 -13.254798 - 23 --8.743150 - 33 --69.573435 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 -13.254798 - 21 --8.743150 - 31 --69.573435 - 12 -10.246306 - 22 --11.750841 - 32 --69.642877 - 13 -10.246306 - 23 --11.750841 - 33 --69.642877 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 -10.246306 - 21 --11.750841 - 31 --69.642877 - 12 -6.643791 - 22 --14.013848 - 32 --69.695125 - 13 -6.643791 - 23 --14.013848 - 33 --69.695125 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 -6.643791 - 21 --14.013848 - 31 --69.695125 - 12 -2.627898 - 22 --15.418695 - 32 --69.727560 - 13 -2.627898 - 23 --15.418695 - 33 --69.727560 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 -2.627898 - 21 --15.418695 - 31 --69.727560 - 12 --1.600000 - 22 --15.894938 - 32 --69.738556 - 13 --1.600000 - 23 --15.894938 - 33 --69.738556 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 --1.600000 - 21 --15.894938 - 31 --69.738556 - 12 --5.827898 - 22 --15.418695 - 32 --69.727560 - 13 --5.827898 - 23 --15.418695 - 33 --69.727560 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 --5.827898 - 21 --15.418695 - 31 --69.727560 - 12 --9.843791 - 22 --14.013848 - 32 --69.695125 - 13 --9.843791 - 23 --14.013848 - 33 --69.695125 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 --9.843791 - 21 --14.013848 - 31 --69.695125 - 12 --13.446306 - 22 --11.750841 - 32 --69.642877 - 13 --13.446306 - 23 --11.750841 - 33 --69.642877 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 --13.446306 - 21 --11.750841 - 31 --69.642877 - 12 --16.454798 - 22 --8.743150 - 32 --69.573435 - 13 --16.454798 - 23 --8.743150 - 33 --69.573435 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 --16.454798 - 21 --8.743150 - 31 --69.573435 - 12 --18.718408 - 22 --5.141595 - 32 --69.490282 - 13 --18.718408 - 23 --5.141595 - 33 --69.490282 - 0 -3DFACE - 8 -0 - 62 - 9 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 --18.718408 - 21 --5.141595 - 31 --69.490282 - 12 --20.123630 - 22 --1.126771 - 32 --69.397588 - 13 --20.123630 - 23 --1.126771 - 33 --69.397588 - 0 -ENDSEC - 0 -EOF diff -Nru acm-5.0/objects/cyl2.dxf acm-6.0+20200416/objects/cyl2.dxf --- acm-5.0/objects/cyl2.dxf 1998-08-14 02:26:28.000000000 +0000 +++ acm-6.0+20200416/objects/cyl2.dxf 1970-01-01 00:00:00.000000000 +0000 @@ -1,2438 +0,0 @@ - 0 -SECTION - 2 -HEADER - 0 -ENDSEC - 0 -SECTION - 2 -TABLES - 0 -TABLE - 2 -LAYER - 70 - 153 - 0 -LAYER - 2 -0 - 70 -0 - 62 -15 - 6 -CONTINUOUS - 0 -ENDTAB - 0 -ENDSEC - 0 -SECTION - 2 -ENTITIES - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 --0.243840 - 30 -21.256311 - 11 --5.646003 - 21 -1.044480 - 31 -21.286057 - 12 --5.217691 - 22 -2.268198 - 32 -21.314308 - 13 --5.217691 - 23 -2.268198 - 33 -21.314308 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 --0.243840 - 30 -21.256311 - 11 --5.217691 - 21 -2.268198 - 31 -21.314308 - 12 --4.527742 - 22 -3.365952 - 32 -21.339653 - 13 --4.527742 - 23 -3.365952 - 33 -21.339653 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 --0.243840 - 30 -21.256311 - 11 --4.527742 - 21 -3.365952 - 31 -21.339653 - 12 --3.610754 - 22 -4.282697 - 32 -21.360821 - 13 --3.610754 - 23 -4.282697 - 33 -21.360821 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 --0.243840 - 30 -21.256311 - 11 --3.610754 - 21 -4.282697 - 31 -21.360821 - 12 --2.512707 - 22 -4.972460 - 32 -21.376747 - 13 --2.512707 - 23 -4.972460 - 33 -21.376747 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 --0.243840 - 30 -21.256311 - 11 --2.512707 - 21 -4.972460 - 31 -21.376747 - 12 --1.288663 - 22 -5.400659 - 32 -21.386631 - 13 --1.288663 - 23 -5.400659 - 33 -21.386631 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 --0.243840 - 30 -21.256311 - 11 --1.288663 - 21 -5.400659 - 31 -21.386631 - 12 -0.000000 - 22 -5.545817 - 32 -21.389984 - 13 -0.000000 - 23 -5.545817 - 33 -21.389984 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 --0.243840 - 30 -21.256311 - 11 -0.000000 - 21 -5.545817 - 31 -21.389984 - 12 -1.288664 - 22 -5.400659 - 32 -21.386631 - 13 -1.288664 - 23 -5.400659 - 33 -21.386631 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 --0.243840 - 30 -21.256311 - 11 -1.288664 - 21 -5.400659 - 31 -21.386631 - 12 -2.512708 - 22 -4.972460 - 32 -21.376747 - 13 -2.512708 - 23 -4.972460 - 33 -21.376747 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 --0.243840 - 30 -21.256311 - 11 -2.512708 - 21 -4.972460 - 31 -21.376747 - 12 -3.610754 - 22 -4.282697 - 32 -21.360821 - 13 -3.610754 - 23 -4.282697 - 33 -21.360821 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 --0.243840 - 30 -21.256311 - 11 -3.610754 - 21 -4.282697 - 31 -21.360821 - 12 -4.527742 - 22 -3.365952 - 32 -21.339653 - 13 -4.527742 - 23 -3.365952 - 33 -21.339653 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 --0.243840 - 30 -21.256311 - 11 -4.527742 - 21 -3.365952 - 31 -21.339653 - 12 -5.217691 - 22 -2.268198 - 32 -21.314308 - 13 -5.217691 - 23 -2.268198 - 33 -21.314308 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 --0.243840 - 30 -21.256311 - 11 -5.217691 - 21 -2.268198 - 31 -21.314308 - 12 -5.646003 - 22 -1.044480 - 32 -21.286057 - 13 -5.646003 - 23 -1.044480 - 33 -21.286057 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 --0.243840 - 30 -21.256311 - 11 -5.646003 - 21 -1.044480 - 31 -21.286057 - 12 -5.791200 - 22 --0.243840 - 32 -21.256311 - 13 -5.791200 - 23 --0.243840 - 33 -21.256311 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 --0.243840 - 30 -21.256311 - 11 -5.791200 - 21 --0.243840 - 31 -21.256311 - 12 -5.646003 - 22 --1.532160 - 32 -21.226566 - 13 -5.646003 - 23 --1.532160 - 33 -21.226566 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 --0.243840 - 30 -21.256311 - 11 -5.646003 - 21 --1.532160 - 31 -21.226566 - 12 -5.217691 - 22 --2.755878 - 32 -21.198315 - 13 -5.217691 - 23 --2.755878 - 33 -21.198315 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 --0.243840 - 30 -21.256311 - 11 -5.217691 - 21 --2.755878 - 31 -21.198315 - 12 -4.527742 - 22 --3.853632 - 32 -21.172970 - 13 -4.527742 - 23 --3.853632 - 33 -21.172970 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 --0.243840 - 30 -21.256311 - 11 -4.527742 - 21 --3.853632 - 31 -21.172970 - 12 -3.610754 - 22 --4.770376 - 32 -21.151802 - 13 -3.610754 - 23 --4.770376 - 33 -21.151802 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 --0.243840 - 30 -21.256311 - 11 -3.610754 - 21 --4.770376 - 31 -21.151802 - 12 -2.512708 - 22 --5.460141 - 32 -21.135878 - 13 -2.512708 - 23 --5.460141 - 33 -21.135878 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 --0.243840 - 30 -21.256311 - 11 -2.512708 - 21 --5.460141 - 31 -21.135878 - 12 -1.288664 - 22 --5.888339 - 32 -21.125992 - 13 -1.288664 - 23 --5.888339 - 33 -21.125992 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 --0.243840 - 30 -21.256311 - 11 -1.288664 - 21 --5.888339 - 31 -21.125992 - 12 -0.000000 - 22 --6.033497 - 32 -21.122639 - 13 -0.000000 - 23 --6.033497 - 33 -21.122639 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 --0.243840 - 30 -21.256311 - 11 -0.000000 - 21 --6.033497 - 31 -21.122639 - 12 --1.288663 - 22 --5.888339 - 32 -21.125992 - 13 --1.288663 - 23 --5.888339 - 33 -21.125992 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 --0.243840 - 30 -21.256311 - 11 --1.288663 - 21 --5.888339 - 31 -21.125992 - 12 --2.512707 - 22 --5.460141 - 32 -21.135878 - 13 --2.512707 - 23 --5.460141 - 33 -21.135878 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 --0.243840 - 30 -21.256311 - 11 --2.512707 - 21 --5.460141 - 31 -21.135878 - 12 --3.610754 - 22 --4.770376 - 32 -21.151802 - 13 --3.610754 - 23 --4.770376 - 33 -21.151802 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 --0.243840 - 30 -21.256311 - 11 --3.610754 - 21 --4.770376 - 31 -21.151802 - 12 --4.527742 - 22 --3.853632 - 32 -21.172970 - 13 --4.527742 - 23 --3.853632 - 33 -21.172970 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 --0.243840 - 30 -21.256311 - 11 --4.527742 - 21 --3.853632 - 31 -21.172970 - 12 --5.217691 - 22 --2.755878 - 32 -21.198315 - 13 --5.217691 - 23 --2.755878 - 33 -21.198315 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 --0.243840 - 30 -21.256311 - 11 --5.217691 - 21 --2.755878 - 31 -21.198315 - 12 --5.646003 - 22 --1.532160 - 32 -21.226566 - 13 --5.646003 - 23 --1.532160 - 33 -21.226566 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 -0.243840 - 30 -0.133671 - 11 --5.646003 - 21 -1.532160 - 31 -0.163415 - 12 --5.646003 - 22 -1.044480 - 32 -21.286057 - 13 --5.791200 - 23 --0.243840 - 33 -21.256311 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.646003 - 20 -1.532160 - 30 -0.163415 - 11 --5.217691 - 21 -2.755878 - 31 -0.191669 - 12 --5.217691 - 22 -2.268198 - 32 -21.314308 - 13 --5.646003 - 23 -1.044480 - 33 -21.286057 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.217691 - 20 -2.755878 - 30 -0.191669 - 11 --4.527742 - 21 -3.853632 - 31 -0.217014 - 12 --4.527742 - 22 -3.365952 - 32 -21.339653 - 13 --5.217691 - 23 -2.268198 - 33 -21.314308 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --4.527742 - 20 -3.853632 - 30 -0.217014 - 11 --3.610754 - 21 -4.770377 - 31 -0.238180 - 12 --3.610754 - 22 -4.282697 - 32 -21.360821 - 13 --4.527742 - 23 -3.365952 - 33 -21.339653 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --3.610754 - 20 -4.770377 - 30 -0.238180 - 11 --2.512707 - 21 -5.460141 - 31 -0.254105 - 12 --2.512707 - 22 -4.972460 - 32 -21.376747 - 13 --3.610754 - 23 -4.282697 - 33 -21.360821 - 62 -1 - 0 -3DFACE - 8 -0 - 10 --2.512707 - 20 -5.460141 - 30 -0.254105 - 11 --1.288663 - 21 -5.888339 - 31 -0.263993 - 12 --1.288663 - 22 -5.400659 - 32 -21.386631 - 13 --2.512707 - 23 -4.972460 - 33 -21.376747 - 62 -1 - 0 -3DFACE - 8 -0 - 10 --1.288663 - 20 -5.888339 - 30 -0.263993 - 11 -0.000000 - 21 -6.033497 - 31 -0.267344 - 12 -0.000000 - 22 -5.545817 - 32 -21.389984 - 13 --1.288663 - 23 -5.400659 - 33 -21.386631 - 62 -1 - 0 -3DFACE - 8 -0 - 10 -0.000000 - 20 -6.033497 - 30 -0.267344 - 11 -1.288664 - 21 -5.888339 - 31 -0.263993 - 12 -1.288664 - 22 -5.400659 - 32 -21.386631 - 13 -0.000000 - 23 -5.545817 - 33 -21.389984 - 62 -1 - 0 -3DFACE - 8 -0 - 10 -1.288664 - 20 -5.888339 - 30 -0.263993 - 11 -2.512708 - 21 -5.460141 - 31 -0.254105 - 12 -2.512708 - 22 -4.972460 - 32 -21.376747 - 13 -1.288664 - 23 -5.400659 - 33 -21.386631 - 62 -2 - 0 -3DFACE - 8 -0 - 10 -2.512708 - 20 -5.460141 - 30 -0.254105 - 11 -3.610754 - 21 -4.770377 - 31 -0.238180 - 12 -3.610754 - 22 -4.282697 - 32 -21.360821 - 13 -2.512708 - 23 -4.972460 - 33 -21.376747 - 62 -2 - 0 -3DFACE - 8 -0 - 10 -3.610754 - 20 -4.770377 - 30 -0.238180 - 11 -4.527742 - 21 -3.853632 - 31 -0.217014 - 12 -4.527742 - 22 -3.365952 - 32 -21.339653 - 13 -3.610754 - 23 -4.282697 - 33 -21.360821 - 62 -2 - 0 -3DFACE - 8 -0 - 10 -4.527742 - 20 -3.853632 - 30 -0.217014 - 11 -5.217691 - 21 -2.755878 - 31 -0.191669 - 12 -5.217691 - 22 -2.268198 - 32 -21.314308 - 13 -4.527742 - 23 -3.365952 - 33 -21.339653 - 62 -2 - 0 -3DFACE - 8 -0 - 10 -5.217691 - 20 -2.755878 - 30 -0.191669 - 11 -5.646003 - 21 -1.532160 - 31 -0.163415 - 12 -5.646003 - 22 -1.044480 - 32 -21.286057 - 13 -5.217691 - 23 -2.268198 - 33 -21.314308 - 62 -2 - 0 -3DFACE - 8 -0 - 10 -5.646003 - 20 -1.532160 - 30 -0.163415 - 11 -5.791200 - 21 -0.243840 - 31 -0.133671 - 12 -5.791200 - 22 --0.243840 - 32 -21.256311 - 13 -5.646003 - 23 -1.044480 - 33 -21.286057 - 62 -0 - 0 -3DFACE - 8 -0 - 10 -5.791200 - 20 -0.243840 - 30 -0.133671 - 11 -5.646003 - 21 --1.044480 - 31 -0.103926 - 12 -5.646003 - 22 --1.532160 - 32 -21.226566 - 13 -5.791200 - 23 --0.243840 - 33 -21.256311 - 62 -0 - 0 -3DFACE - 8 -0 - 10 -5.646003 - 20 --1.044480 - 30 -0.103926 - 11 -5.217691 - 21 --2.268198 - 31 -0.075674 - 12 -5.217691 - 22 --2.755878 - 32 -21.198315 - 13 -5.646003 - 23 --1.532160 - 33 -21.226566 - 62 -0 - 0 -3DFACE - 8 -0 - 10 -5.217691 - 20 --2.268198 - 30 -0.075674 - 11 -4.527742 - 21 --3.365952 - 31 -0.050329 - 12 -4.527742 - 22 --3.853632 - 32 -21.172970 - 13 -5.217691 - 23 --2.755878 - 33 -21.198315 - 62 -0 - 0 -3DFACE - 8 -0 - 10 -4.527742 - 20 --3.365952 - 30 -0.050329 - 11 -3.610754 - 21 --4.282697 - 31 -0.029163 - 12 -3.610754 - 22 --4.770376 - 32 -21.151802 - 13 -4.527742 - 23 --3.853632 - 33 -21.172970 - 62 -0 - 0 -3DFACE - 8 -0 - 10 -3.610754 - 20 --4.282697 - 30 -0.029163 - 11 -2.512708 - 21 --4.972461 - 31 -0.013238 - 12 -2.512708 - 22 --5.460141 - 32 -21.135878 - 13 -3.610754 - 23 --4.770376 - 33 -21.151802 - 62 -0 - 0 -3DFACE - 8 -0 - 10 -2.512708 - 20 --4.972461 - 30 -0.013238 - 11 -1.288664 - 21 --5.400659 - 31 -0.003350 - 12 -1.288664 - 22 --5.888339 - 32 -21.125992 - 13 -2.512708 - 23 --5.460141 - 33 -21.135878 - 62 -0 - 0 -3DFACE - 8 -0 - 10 -1.288664 - 20 --5.400659 - 30 -0.003350 - 11 -0.000000 - 21 --5.545817 - 31 -0.000000 - 12 -0.000000 - 22 --6.033497 - 32 -21.122639 - 13 -1.288664 - 23 --5.888339 - 33 -21.125992 - 62 -0 - 0 -3DFACE - 8 -0 - 10 -0.000000 - 20 --5.545817 - 30 -0.000000 - 11 --1.288663 - 21 --5.400659 - 31 -0.003350 - 12 --1.288663 - 22 --5.888339 - 32 -21.125992 - 13 -0.000000 - 23 --6.033497 - 33 -21.122639 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --1.288663 - 20 --5.400659 - 30 -0.003350 - 11 --2.512707 - 21 --4.972461 - 31 -0.013238 - 12 --2.512707 - 22 --5.460141 - 32 -21.135878 - 13 --1.288663 - 23 --5.888339 - 33 -21.125992 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --2.512707 - 20 --4.972461 - 30 -0.013238 - 11 --3.610754 - 21 --4.282697 - 31 -0.029163 - 12 --3.610754 - 22 --4.770376 - 32 -21.151802 - 13 --2.512707 - 23 --5.460141 - 33 -21.135878 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --3.610754 - 20 --4.282697 - 30 -0.029163 - 11 --4.527742 - 21 --3.365952 - 31 -0.050329 - 12 --4.527742 - 22 --3.853632 - 32 -21.172970 - 13 --3.610754 - 23 --4.770376 - 33 -21.151802 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --4.527742 - 20 --3.365952 - 30 -0.050329 - 11 --5.217691 - 21 --2.268198 - 31 -0.075674 - 12 --5.217691 - 22 --2.755878 - 32 -21.198315 - 13 --4.527742 - 23 --3.853632 - 33 -21.172970 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.217691 - 20 --2.268198 - 30 -0.075674 - 11 --5.646003 - 21 --1.044480 - 31 -0.103926 - 12 --5.646003 - 22 --1.532160 - 32 -21.226566 - 13 --5.217691 - 23 --2.755878 - 33 -21.198315 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.646003 - 20 --1.044480 - 30 -0.103926 - 11 --5.791200 - 21 -0.243840 - 31 -0.133671 - 12 --5.791200 - 22 --0.243840 - 32 -21.256311 - 13 --5.646003 - 23 --1.532160 - 33 -21.226566 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 -0.243840 - 30 -0.133671 - 11 --5.646003 - 21 -1.532160 - 31 -0.163415 - 12 --5.217691 - 22 -2.755878 - 32 -0.191669 - 13 --5.217691 - 23 -2.755878 - 33 -0.191669 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 -0.243840 - 30 -0.133671 - 11 --5.217691 - 21 -2.755878 - 31 -0.191669 - 12 --4.527742 - 22 -3.853632 - 32 -0.217014 - 13 --4.527742 - 23 -3.853632 - 33 -0.217014 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 -0.243840 - 30 -0.133671 - 11 --4.527742 - 21 -3.853632 - 31 -0.217014 - 12 --3.610754 - 22 -4.770377 - 32 -0.238180 - 13 --3.610754 - 23 -4.770377 - 33 -0.238180 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 -0.243840 - 30 -0.133671 - 11 --3.610754 - 21 -4.770377 - 31 -0.238180 - 12 --2.512707 - 22 -5.460141 - 32 -0.254105 - 13 --2.512707 - 23 -5.460141 - 33 -0.254105 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 -0.243840 - 30 -0.133671 - 11 --2.512707 - 21 -5.460141 - 31 -0.254105 - 12 --1.288663 - 22 -5.888339 - 32 -0.263993 - 13 --1.288663 - 23 -5.888339 - 33 -0.263993 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 -0.243840 - 30 -0.133671 - 11 --1.288663 - 21 -5.888339 - 31 -0.263993 - 12 -0.000000 - 22 -6.033497 - 32 -0.267344 - 13 -0.000000 - 23 -6.033497 - 33 -0.267344 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 -0.243840 - 30 -0.133671 - 11 -0.000000 - 21 -6.033497 - 31 -0.267344 - 12 -1.288664 - 22 -5.888339 - 32 -0.263993 - 13 -1.288664 - 23 -5.888339 - 33 -0.263993 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 -0.243840 - 30 -0.133671 - 11 -1.288664 - 21 -5.888339 - 31 -0.263993 - 12 -2.512708 - 22 -5.460141 - 32 -0.254105 - 13 -2.512708 - 23 -5.460141 - 33 -0.254105 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 -0.243840 - 30 -0.133671 - 11 -2.512708 - 21 -5.460141 - 31 -0.254105 - 12 -3.610754 - 22 -4.770377 - 32 -0.238180 - 13 -3.610754 - 23 -4.770377 - 33 -0.238180 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 -0.243840 - 30 -0.133671 - 11 -3.610754 - 21 -4.770377 - 31 -0.238180 - 12 -4.527742 - 22 -3.853632 - 32 -0.217014 - 13 -4.527742 - 23 -3.853632 - 33 -0.217014 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 -0.243840 - 30 -0.133671 - 11 -4.527742 - 21 -3.853632 - 31 -0.217014 - 12 -5.217691 - 22 -2.755878 - 32 -0.191669 - 13 -5.217691 - 23 -2.755878 - 33 -0.191669 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 -0.243840 - 30 -0.133671 - 11 -5.217691 - 21 -2.755878 - 31 -0.191669 - 12 -5.646003 - 22 -1.532160 - 32 -0.163415 - 13 -5.646003 - 23 -1.532160 - 33 -0.163415 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 -0.243840 - 30 -0.133671 - 11 -5.646003 - 21 -1.532160 - 31 -0.163415 - 12 -5.791200 - 22 -0.243840 - 32 -0.133671 - 13 -5.791200 - 23 -0.243840 - 33 -0.133671 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 -0.243840 - 30 -0.133671 - 11 -5.791200 - 21 -0.243840 - 31 -0.133671 - 12 -5.646003 - 22 --1.044480 - 32 -0.103926 - 13 -5.646003 - 23 --1.044480 - 33 -0.103926 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 -0.243840 - 30 -0.133671 - 11 -5.646003 - 21 --1.044480 - 31 -0.103926 - 12 -5.217691 - 22 --2.268198 - 32 -0.075674 - 13 -5.217691 - 23 --2.268198 - 33 -0.075674 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 -0.243840 - 30 -0.133671 - 11 -5.217691 - 21 --2.268198 - 31 -0.075674 - 12 -4.527742 - 22 --3.365952 - 32 -0.050329 - 13 -4.527742 - 23 --3.365952 - 33 -0.050329 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 -0.243840 - 30 -0.133671 - 11 -4.527742 - 21 --3.365952 - 31 -0.050329 - 12 -3.610754 - 22 --4.282697 - 32 -0.029163 - 13 -3.610754 - 23 --4.282697 - 33 -0.029163 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 -0.243840 - 30 -0.133671 - 11 -3.610754 - 21 --4.282697 - 31 -0.029163 - 12 -2.512708 - 22 --4.972461 - 32 -0.013238 - 13 -2.512708 - 23 --4.972461 - 33 -0.013238 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 -0.243840 - 30 -0.133671 - 11 -2.512708 - 21 --4.972461 - 31 -0.013238 - 12 -1.288664 - 22 --5.400659 - 32 -0.003350 - 13 -1.288664 - 23 --5.400659 - 33 -0.003350 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 -0.243840 - 30 -0.133671 - 11 -1.288664 - 21 --5.400659 - 31 -0.003350 - 12 -0.000000 - 22 --5.545817 - 32 -0.000000 - 13 -0.000000 - 23 --5.545817 - 33 -0.000000 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 -0.243840 - 30 -0.133671 - 11 -0.000000 - 21 --5.545817 - 31 -0.000000 - 12 --1.288663 - 22 --5.400659 - 32 -0.003350 - 13 --1.288663 - 23 --5.400659 - 33 -0.003350 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 -0.243840 - 30 -0.133671 - 11 --1.288663 - 21 --5.400659 - 31 -0.003350 - 12 --2.512707 - 22 --4.972461 - 32 -0.013238 - 13 --2.512707 - 23 --4.972461 - 33 -0.013238 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 -0.243840 - 30 -0.133671 - 11 --2.512707 - 21 --4.972461 - 31 -0.013238 - 12 --3.610754 - 22 --4.282697 - 32 -0.029163 - 13 --3.610754 - 23 --4.282697 - 33 -0.029163 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 -0.243840 - 30 -0.133671 - 11 --3.610754 - 21 --4.282697 - 31 -0.029163 - 12 --4.527742 - 22 --3.365952 - 32 -0.050329 - 13 --4.527742 - 23 --3.365952 - 33 -0.050329 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 -0.243840 - 30 -0.133671 - 11 --4.527742 - 21 --3.365952 - 31 -0.050329 - 12 --5.217691 - 22 --2.268198 - 32 -0.075674 - 13 --5.217691 - 23 --2.268198 - 33 -0.075674 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --5.791200 - 20 -0.243840 - 30 -0.133671 - 11 --5.217691 - 21 --2.268198 - 31 -0.075674 - 12 --5.646003 - 22 --1.044480 - 32 -0.103926 - 13 --5.646003 - 23 --1.044480 - 33 -0.103926 - 62 -0 - 0 -ENDSEC - 0 -EOF diff -Nru acm-5.0/objects/cyl.dxf acm-6.0+20200416/objects/cyl.dxf --- acm-5.0/objects/cyl.dxf 1998-08-14 02:26:16.000000000 +0000 +++ acm-6.0+20200416/objects/cyl.dxf 1970-01-01 00:00:00.000000000 +0000 @@ -1,2644 +0,0 @@ - 0 -SECTION - 2 -HEADER - 9 -$EXTMIN - 10 --20.600000 - 20 --17.494938 - 9 -$EXTMAX - 10 -17.400000 - 20 -22.094938 - 9 -$LIMMIN - 10 --20.600000 - 20 --17.494938 - 9 -$LIMMAX - 10 -17.400000 - 20 -22.094938 - 9 -$LUNITS - 70 - 2 - 9 -$LUPREC - 70 - 3 - 9 -$AUNITS - 70 - 3 - 9 -$COORDS - 70 - 1 - 0 -ENDSEC - 0 -SECTION - 2 -TABLES - 0 -TABLE - 2 -LAYER - 70 -255 - 0 -LAYER - 2 -0 - 6 -CONTINUOUS - 62 - 2 - 70 - 64 - 0 -ENDTAB - 0 -ENDSEC - 0 -SECTION - 2 -BLOCKS - 0 -ENDSEC - 0 -SECTION - 2 -ENTITIES - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 --20.123630 - 21 -5.726771 - 31 -0.097588 - 12 --18.718408 - 22 -9.741595 - 32 -0.190282 - 13 --18.718408 - 23 -9.741595 - 33 -0.190282 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 --18.718408 - 21 -9.741595 - 31 -0.190282 - 12 --16.454798 - 22 -13.343150 - 32 -0.273435 - 13 --16.454798 - 23 -13.343150 - 33 -0.273435 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 --16.454798 - 21 -13.343150 - 31 -0.273435 - 12 --13.446306 - 22 -16.350841 - 32 -0.342877 - 13 --13.446306 - 23 -16.350841 - 33 -0.342877 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 --13.446306 - 21 -16.350841 - 31 -0.342877 - 12 --9.843791 - 22 -18.613848 - 32 -0.395125 - 13 --9.843791 - 23 -18.613848 - 33 -0.395125 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 --9.843791 - 21 -18.613848 - 31 -0.395125 - 12 --5.827898 - 22 -20.018695 - 32 -0.427560 - 13 --5.827898 - 23 -20.018695 - 33 -0.427560 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 --5.827898 - 21 -20.018695 - 31 -0.427560 - 12 --1.600000 - 22 -20.494938 - 32 -0.438556 - 13 --1.600000 - 23 -20.494938 - 33 -0.438556 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 --1.600000 - 21 -20.494938 - 31 -0.438556 - 12 -2.627898 - 22 -20.018695 - 32 -0.427560 - 13 -2.627898 - 23 -20.018695 - 33 -0.427560 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 -2.627898 - 21 -20.018695 - 31 -0.427560 - 12 -6.643791 - 22 -18.613848 - 32 -0.395125 - 13 -6.643791 - 23 -18.613848 - 33 -0.395125 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 -6.643791 - 21 -18.613848 - 31 -0.395125 - 12 -10.246306 - 22 -16.350841 - 32 -0.342877 - 13 -10.246306 - 23 -16.350841 - 33 -0.342877 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 -10.246306 - 21 -16.350841 - 31 -0.342877 - 12 -13.254798 - 22 -13.343150 - 32 -0.273435 - 13 -13.254798 - 23 -13.343150 - 33 -0.273435 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 -13.254798 - 21 -13.343150 - 31 -0.273435 - 12 -15.518408 - 22 -9.741595 - 32 -0.190282 - 13 -15.518408 - 23 -9.741595 - 33 -0.190282 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 -15.518408 - 21 -9.741595 - 31 -0.190282 - 12 -16.923630 - 22 -5.726771 - 32 -0.097588 - 13 -16.923630 - 23 -5.726771 - 33 -0.097588 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 -16.923630 - 21 -5.726771 - 31 -0.097588 - 12 -17.400000 - 22 -1.500000 - 32 --0.000000 - 13 -17.400000 - 23 -1.500000 - 33 --0.000000 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 -17.400000 - 21 -1.500000 - 31 --0.000000 - 12 -16.923630 - 22 --2.726771 - 32 --0.097588 - 13 -16.923630 - 23 --2.726771 - 33 --0.097588 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 -16.923630 - 21 --2.726771 - 31 --0.097588 - 12 -15.518408 - 22 --6.741595 - 32 --0.190282 - 13 -15.518408 - 23 --6.741595 - 33 --0.190282 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 -15.518408 - 21 --6.741595 - 31 --0.190282 - 12 -13.254798 - 22 --10.343150 - 32 --0.273435 - 13 -13.254798 - 23 --10.343150 - 33 --0.273435 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 -13.254798 - 21 --10.343150 - 31 --0.273435 - 12 -10.246306 - 22 --13.350841 - 32 --0.342877 - 13 -10.246306 - 23 --13.350841 - 33 --0.342877 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 -10.246306 - 21 --13.350841 - 31 --0.342877 - 12 -6.643791 - 22 --15.613848 - 32 --0.395125 - 13 -6.643791 - 23 --15.613848 - 33 --0.395125 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 -6.643791 - 21 --15.613848 - 31 --0.395125 - 12 -2.627898 - 22 --17.018695 - 32 --0.427560 - 13 -2.627898 - 23 --17.018695 - 33 --0.427560 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 -2.627898 - 21 --17.018695 - 31 --0.427560 - 12 --1.600000 - 22 --17.494938 - 32 --0.438556 - 13 --1.600000 - 23 --17.494938 - 33 --0.438556 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 --1.600000 - 21 --17.494938 - 31 --0.438556 - 12 --5.827898 - 22 --17.018695 - 32 --0.427560 - 13 --5.827898 - 23 --17.018695 - 33 --0.427560 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 --5.827898 - 21 --17.018695 - 31 --0.427560 - 12 --9.843791 - 22 --15.613848 - 32 --0.395125 - 13 --9.843791 - 23 --15.613848 - 33 --0.395125 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 --9.843791 - 21 --15.613848 - 31 --0.395125 - 12 --13.446306 - 22 --13.350841 - 32 --0.342877 - 13 --13.446306 - 23 --13.350841 - 33 --0.342877 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 --13.446306 - 21 --13.350841 - 31 --0.342877 - 12 --16.454798 - 22 --10.343150 - 32 --0.273435 - 13 --16.454798 - 23 --10.343150 - 33 --0.273435 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 --16.454798 - 21 --10.343150 - 31 --0.273435 - 12 --18.718408 - 22 --6.741595 - 32 --0.190282 - 13 --18.718408 - 23 --6.741595 - 33 --0.190282 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -1.500000 - 30 --0.000000 - 11 --18.718408 - 21 --6.741595 - 31 --0.190282 - 12 --20.123630 - 22 --2.726771 - 32 --0.097588 - 13 --20.123630 - 23 --2.726771 - 33 --0.097588 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 --20.123630 - 21 -7.326771 - 31 --69.202412 - 12 --20.123630 - 22 -5.726771 - 32 -0.097588 - 13 --20.600000 - 23 -1.500000 - 33 --0.000000 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.123630 - 20 -7.326771 - 30 --69.202412 - 11 --18.718408 - 21 -11.341595 - 31 --69.109718 - 12 --18.718408 - 22 -9.741595 - 32 -0.190282 - 13 --20.123630 - 23 -5.726771 - 33 -0.097588 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --18.718408 - 20 -11.341595 - 30 --69.109718 - 11 --16.454798 - 21 -14.943150 - 31 --69.026565 - 12 --16.454798 - 22 -13.343150 - 32 -0.273435 - 13 --18.718408 - 23 -9.741595 - 33 -0.190282 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --16.454798 - 20 -14.943150 - 30 --69.026565 - 11 --13.446306 - 21 -17.950841 - 31 --68.957123 - 12 --13.446306 - 22 -16.350841 - 32 -0.342877 - 13 --16.454798 - 23 -13.343150 - 33 -0.273435 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --13.446306 - 20 -17.950841 - 30 --68.957123 - 11 --9.843791 - 21 -20.213848 - 31 --68.904875 - 12 --9.843791 - 22 -18.613848 - 32 -0.395125 - 13 --13.446306 - 23 -16.350841 - 33 -0.342877 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --9.843791 - 20 -20.213848 - 30 --68.904875 - 11 --5.827898 - 21 -21.618695 - 31 --68.872440 - 12 --5.827898 - 22 -20.018695 - 32 -0.427560 - 13 --9.843791 - 23 -18.613848 - 33 -0.395125 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --5.827898 - 20 -21.618695 - 30 --68.872440 - 11 --1.600000 - 21 -22.094938 - 31 --68.861444 - 12 --1.600000 - 22 -20.494938 - 32 -0.438556 - 13 --5.827898 - 23 -20.018695 - 33 -0.427560 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --1.600000 - 20 -22.094938 - 30 --68.861444 - 11 -2.627898 - 21 -21.618695 - 31 --68.872440 - 12 -2.627898 - 22 -20.018695 - 32 -0.427560 - 13 --1.600000 - 23 -20.494938 - 33 -0.438556 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 -2.627898 - 20 -21.618695 - 30 --68.872440 - 11 -6.643791 - 21 -20.213848 - 31 --68.904875 - 12 -6.643791 - 22 -18.613848 - 32 -0.395125 - 13 -2.627898 - 23 -20.018695 - 33 -0.427560 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 -6.643791 - 20 -20.213848 - 30 --68.904875 - 11 -10.246306 - 21 -17.950841 - 31 --68.957123 - 12 -10.246306 - 22 -16.350841 - 32 -0.342877 - 13 -6.643791 - 23 -18.613848 - 33 -0.395125 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 -10.246306 - 20 -17.950841 - 30 --68.957123 - 11 -13.254798 - 21 -14.943150 - 31 --69.026565 - 12 -13.254798 - 22 -13.343150 - 32 -0.273435 - 13 -10.246306 - 23 -16.350841 - 33 -0.342877 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 -13.254798 - 20 -14.943150 - 30 --69.026565 - 11 -15.518408 - 21 -11.341595 - 31 --69.109718 - 12 -15.518408 - 22 -9.741595 - 32 -0.190282 - 13 -13.254798 - 23 -13.343150 - 33 -0.273435 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 -15.518408 - 20 -11.341595 - 30 --69.109718 - 11 -16.923630 - 21 -7.326771 - 31 --69.202412 - 12 -16.923630 - 22 -5.726771 - 32 -0.097588 - 13 -15.518408 - 23 -9.741595 - 33 -0.190282 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 -16.923630 - 20 -7.326771 - 30 --69.202412 - 11 -17.400000 - 21 -3.100000 - 31 --69.300000 - 12 -17.400000 - 22 -1.500000 - 32 --0.000000 - 13 -16.923630 - 23 -5.726771 - 33 -0.097588 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 -17.400000 - 20 -3.100000 - 30 --69.300000 - 11 -16.923630 - 21 --1.126771 - 31 --69.397588 - 12 -16.923630 - 22 --2.726771 - 32 --0.097588 - 13 -17.400000 - 23 -1.500000 - 33 --0.000000 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 -16.923630 - 20 --1.126771 - 30 --69.397588 - 11 -15.518408 - 21 --5.141595 - 31 --69.490282 - 12 -15.518408 - 22 --6.741595 - 32 --0.190282 - 13 -16.923630 - 23 --2.726771 - 33 --0.097588 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 -15.518408 - 20 --5.141595 - 30 --69.490282 - 11 -13.254798 - 21 --8.743150 - 31 --69.573435 - 12 -13.254798 - 22 --10.343150 - 32 --0.273435 - 13 -15.518408 - 23 --6.741595 - 33 --0.190282 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 -13.254798 - 20 --8.743150 - 30 --69.573435 - 11 -10.246306 - 21 --11.750841 - 31 --69.642877 - 12 -10.246306 - 22 --13.350841 - 32 --0.342877 - 13 -13.254798 - 23 --10.343150 - 33 --0.273435 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 -10.246306 - 20 --11.750841 - 30 --69.642877 - 11 -6.643791 - 21 --14.013848 - 31 --69.695125 - 12 -6.643791 - 22 --15.613848 - 32 --0.395125 - 13 -10.246306 - 23 --13.350841 - 33 --0.342877 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 -6.643791 - 20 --14.013848 - 30 --69.695125 - 11 -2.627898 - 21 --15.418695 - 31 --69.727560 - 12 -2.627898 - 22 --17.018695 - 32 --0.427560 - 13 -6.643791 - 23 --15.613848 - 33 --0.395125 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 -2.627898 - 20 --15.418695 - 30 --69.727560 - 11 --1.600000 - 21 --15.894938 - 31 --69.738556 - 12 --1.600000 - 22 --17.494938 - 32 --0.438556 - 13 -2.627898 - 23 --17.018695 - 33 --0.427560 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --1.600000 - 20 --15.894938 - 30 --69.738556 - 11 --5.827898 - 21 --15.418695 - 31 --69.727560 - 12 --5.827898 - 22 --17.018695 - 32 --0.427560 - 13 --1.600000 - 23 --17.494938 - 33 --0.438556 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --5.827898 - 20 --15.418695 - 30 --69.727560 - 11 --9.843791 - 21 --14.013848 - 31 --69.695125 - 12 --9.843791 - 22 --15.613848 - 32 --0.395125 - 13 --5.827898 - 23 --17.018695 - 33 --0.427560 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --9.843791 - 20 --14.013848 - 30 --69.695125 - 11 --13.446306 - 21 --11.750841 - 31 --69.642877 - 12 --13.446306 - 22 --13.350841 - 32 --0.342877 - 13 --9.843791 - 23 --15.613848 - 33 --0.395125 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --13.446306 - 20 --11.750841 - 30 --69.642877 - 11 --16.454798 - 21 --8.743150 - 31 --69.573435 - 12 --16.454798 - 22 --10.343150 - 32 --0.273435 - 13 --13.446306 - 23 --13.350841 - 33 --0.342877 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --16.454798 - 20 --8.743150 - 30 --69.573435 - 11 --18.718408 - 21 --5.141595 - 31 --69.490282 - 12 --18.718408 - 22 --6.741595 - 32 --0.190282 - 13 --16.454798 - 23 --10.343150 - 33 --0.273435 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --18.718408 - 20 --5.141595 - 30 --69.490282 - 11 --20.123630 - 21 --1.126771 - 31 --69.397588 - 12 --20.123630 - 22 --2.726771 - 32 --0.097588 - 13 --18.718408 - 23 --6.741595 - 33 --0.190282 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.123630 - 20 --1.126771 - 30 --69.397588 - 11 --20.600000 - 21 -3.100000 - 31 --69.300000 - 12 --20.600000 - 22 -1.500000 - 32 --0.000000 - 13 --20.123630 - 23 --2.726771 - 33 --0.097588 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 --20.123630 - 21 -7.326771 - 31 --69.202412 - 12 --18.718408 - 22 -11.341595 - 32 --69.109718 - 13 --18.718408 - 23 -11.341595 - 33 --69.109718 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 --18.718408 - 21 -11.341595 - 31 --69.109718 - 12 --16.454798 - 22 -14.943150 - 32 --69.026565 - 13 --16.454798 - 23 -14.943150 - 33 --69.026565 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 --16.454798 - 21 -14.943150 - 31 --69.026565 - 12 --13.446306 - 22 -17.950841 - 32 --68.957123 - 13 --13.446306 - 23 -17.950841 - 33 --68.957123 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 --13.446306 - 21 -17.950841 - 31 --68.957123 - 12 --9.843791 - 22 -20.213848 - 32 --68.904875 - 13 --9.843791 - 23 -20.213848 - 33 --68.904875 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 --9.843791 - 21 -20.213848 - 31 --68.904875 - 12 --5.827898 - 22 -21.618695 - 32 --68.872440 - 13 --5.827898 - 23 -21.618695 - 33 --68.872440 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 --5.827898 - 21 -21.618695 - 31 --68.872440 - 12 --1.600000 - 22 -22.094938 - 32 --68.861444 - 13 --1.600000 - 23 -22.094938 - 33 --68.861444 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 --1.600000 - 21 -22.094938 - 31 --68.861444 - 12 -2.627898 - 22 -21.618695 - 32 --68.872440 - 13 -2.627898 - 23 -21.618695 - 33 --68.872440 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 -2.627898 - 21 -21.618695 - 31 --68.872440 - 12 -6.643791 - 22 -20.213848 - 32 --68.904875 - 13 -6.643791 - 23 -20.213848 - 33 --68.904875 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 -6.643791 - 21 -20.213848 - 31 --68.904875 - 12 -10.246306 - 22 -17.950841 - 32 --68.957123 - 13 -10.246306 - 23 -17.950841 - 33 --68.957123 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 -10.246306 - 21 -17.950841 - 31 --68.957123 - 12 -13.254798 - 22 -14.943150 - 32 --69.026565 - 13 -13.254798 - 23 -14.943150 - 33 --69.026565 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 -13.254798 - 21 -14.943150 - 31 --69.026565 - 12 -15.518408 - 22 -11.341595 - 32 --69.109718 - 13 -15.518408 - 23 -11.341595 - 33 --69.109718 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 -15.518408 - 21 -11.341595 - 31 --69.109718 - 12 -16.923630 - 22 -7.326771 - 32 --69.202412 - 13 -16.923630 - 23 -7.326771 - 33 --69.202412 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 -16.923630 - 21 -7.326771 - 31 --69.202412 - 12 -17.400000 - 22 -3.100000 - 32 --69.300000 - 13 -17.400000 - 23 -3.100000 - 33 --69.300000 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 -17.400000 - 21 -3.100000 - 31 --69.300000 - 12 -16.923630 - 22 --1.126771 - 32 --69.397588 - 13 -16.923630 - 23 --1.126771 - 33 --69.397588 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 -16.923630 - 21 --1.126771 - 31 --69.397588 - 12 -15.518408 - 22 --5.141595 - 32 --69.490282 - 13 -15.518408 - 23 --5.141595 - 33 --69.490282 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 -15.518408 - 21 --5.141595 - 31 --69.490282 - 12 -13.254798 - 22 --8.743150 - 32 --69.573435 - 13 -13.254798 - 23 --8.743150 - 33 --69.573435 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 -13.254798 - 21 --8.743150 - 31 --69.573435 - 12 -10.246306 - 22 --11.750841 - 32 --69.642877 - 13 -10.246306 - 23 --11.750841 - 33 --69.642877 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 -10.246306 - 21 --11.750841 - 31 --69.642877 - 12 -6.643791 - 22 --14.013848 - 32 --69.695125 - 13 -6.643791 - 23 --14.013848 - 33 --69.695125 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 -6.643791 - 21 --14.013848 - 31 --69.695125 - 12 -2.627898 - 22 --15.418695 - 32 --69.727560 - 13 -2.627898 - 23 --15.418695 - 33 --69.727560 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 -2.627898 - 21 --15.418695 - 31 --69.727560 - 12 --1.600000 - 22 --15.894938 - 32 --69.738556 - 13 --1.600000 - 23 --15.894938 - 33 --69.738556 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 --1.600000 - 21 --15.894938 - 31 --69.738556 - 12 --5.827898 - 22 --15.418695 - 32 --69.727560 - 13 --5.827898 - 23 --15.418695 - 33 --69.727560 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 --5.827898 - 21 --15.418695 - 31 --69.727560 - 12 --9.843791 - 22 --14.013848 - 32 --69.695125 - 13 --9.843791 - 23 --14.013848 - 33 --69.695125 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 --9.843791 - 21 --14.013848 - 31 --69.695125 - 12 --13.446306 - 22 --11.750841 - 32 --69.642877 - 13 --13.446306 - 23 --11.750841 - 33 --69.642877 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 --13.446306 - 21 --11.750841 - 31 --69.642877 - 12 --16.454798 - 22 --8.743150 - 32 --69.573435 - 13 --16.454798 - 23 --8.743150 - 33 --69.573435 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 --16.454798 - 21 --8.743150 - 31 --69.573435 - 12 --18.718408 - 22 --5.141595 - 32 --69.490282 - 13 --18.718408 - 23 --5.141595 - 33 --69.490282 - 0 -3DFACE - 8 -0 - 62 - 2 - 6 -CONTINUOUS - 10 --20.600000 - 20 -3.100000 - 30 --69.300000 - 11 --18.718408 - 21 --5.141595 - 31 --69.490282 - 12 --20.123630 - 22 --1.126771 - 32 --69.397588 - 13 --20.123630 - 23 --1.126771 - 33 --69.397588 - 0 -ENDSEC - 0 -EOF Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/objects/cyl.mdl and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/objects/cyl.mdl differ diff -Nru acm-5.0/objects/dallas-scene acm-6.0+20200416/objects/dallas-scene --- acm-5.0/objects/dallas-scene 1997-04-11 16:44:34.000000000 +0000 +++ acm-6.0+20200416/objects/dallas-scene 1970-01-01 00:00:00.000000000 +0000 @@ -1,221 +0,0 @@ -32-58-18.798N 096-50-16.604W 644.0 154 -34-17-36.089N 097-01-25.366W 762.0 040 -#879349 -RWY 80F 17/35 575 3299 60 34-11-49.689N 095-38-59.574W 34-11-17.059N 095-38-59.443W -RWY ADM 04/22 762 6761 150 34-17-36.089N 097-01-25.366W 34-18-23.048N 097-00-27.991W 575 -RWY ADM 12/30 762 7220 150 34-18-40.509N 097-01-30.377W 34-17-49.647N 097-00-29.965W -RWY ADM 17/35 762 6879 150 34-18-43.074N 097-01-24.530W 34-17-35.031N 097-01-25.130W 495 830 -RWY 1F0 17/35 842 5000 75 34-09-13.891N 097-07-21.964W 34-08-24.437N 097-07-21.114W -RWY DUC 17/35 1113 6650 100 34-28-44.771N 097-57-35.923W 34-27-55.315N 097-57-35.191W -RWY DUA 12/30 698 3000 75 33-56-42.827N 096-23-50.294W 33-56-22.645N 096-23-24.190W -RWY DUA 17/35 698 5001 100 33-56-56.558N 096-23-41.967W 33-56-07.086N 096-23-42.322W -RWY 1F4 18/36 890 3005 50 34-08-40.205N 096-48-41.348W 34-08-10.668N 096-48-45.334W -RWY F54 16/34 631 5000 100 32-40-08.891N 097-05-44.151W 32-39-20.498N 097-05-32.012W -RWY F44 17/35 444 4000 60 32-10-09.620N 095-49-42.149W 32-09-30.076N 095-49-41.997W -RWY 1F8 08/26 390 5093 40 32-35-07.094N 095-04-19.887W 32-35-06.304N 095-03-20.368W 2879 -RWY F00 09/27 619 1100 70 33-36-58.376N 096-10-41.422W 33-36-57.376N 096-10-28.921W -RWY F00 17/35 619 2994 60 33-36-56.954N 096-10-45.231W 33-36-27.346N 096-10-46.230W -RWY 0F2 17/35 1101 3602 60 33-36-23.717N 097-46-34.125W 33-35-48.261N 097-46-29.928W -RWY BKD 04/22 1283 2399 50 32-43-00.183N 098-53-40.463W 32-43-17.069N 098-53-20.731W -RWY BKD 13/31 1283 2401 50 32-43-14.216N 098-53-43.806W 32-42-57.533N 098-53-23.797W -RWY BKD 17/35 1283 4598 100 32-43-28.533N 098-53-27.541W 32-42-43.038N 098-53-27.191W -RWY 7F3 13L/31R 542 2200 160 33-02-27.925N 096-14-43.421W 33-02-10.925N 096-14-52.922W -RWY 7F3 13R/31L 542 3999 150 33-02-27.129N 096-14-43.988W 33-01-58.625N 096-14-11.403W -RWY 7F3 17L/35R 542 1400 275 33-02-26.425N 096-14-27.921W 33-02-12.526N 096-14-27.921W -RWY 7F3 17R/35L 542 3998 150 33-02-27.633N 096-14-42.475W 33-01-48.084N 096-14-43.519W 800 -RWY F18 15/33 854 4999 100 32-21-39.893N 097-26-13.275W 32-20-53.651N 097-25-52.581W -RWY 2F7 18/36 516 3203 50 33-17-53.572N 095-53-46.049W 33-17-21.913N 095-53-47.785W -RWY CRS 14/32 448 4998 75 32-01-59.204N 096-24-09.543W 32-01-18.657N 096-23-36.301W -RWY RBD 13/31 660 6451 150 32-41-14.352N 096-52-35.132W 32-40-29.155N 096-51-41.836W -RWY RBD 17/35 660 3801 150 32-41-08.883N 096-52-00.432W 32-40-31.279N 096-52-00.527W -RWY ADS 15/33 644 7202 100 32-58-40.245N 096-50-25.820W 32-57-33.383N 096-49-56.608W 979 771 -RWY DFW 13L/31R 603 9000 200 32-54-45.207N 097-01-17.305W 32-53-41.948N 097-00-03.021W -RWY DFW 13R/31L 603 9300 150 32-54-34.474N 097-04-59.265W 32-53-24.972N 097-03-47.781W -RWY DFW 17L/35R 603 11388 150 32-54-36.645N 097-01-33.598W 32-52-43.976N 097-01-34.197W -RWY DFW 17R/35L 603 13400 200 32-54-56.614N 097-01-47.563W 32-52-44.032N 097-01-48.273W -RWY DFW 18L/36R 603 11387 200 32-54-36.970N 097-03-02.743W 32-52-44.306N 097-03-03.315W -RWY DFW 18R/36L 603 11388 150 32-54-37.023N 097-03-16.816W 32-52-44.356N 097-03-17.382W -RWY DAL 13L/31R 487 7753 150 32-51-26.188N 096-51-24.477W 32-50-31.355N 096-50-20.931W -RWY DAL 13R/31L 487 8800 150 32-51-04.748N 096-51-48.420W 32-50-02.516N 096-50-36.292W 490 -RWY DAL 18/36 487 6149 150 32-51-31.215N 096-51-11.642W 32-50-30.654N 096-51-18.515W -RWY 8F7 16/34 1047 3900 75 33-15-35.418N 097-34-54.602W 33-14-57.619N 097-34-45.102W -RWY DTO 17/35 642 5000 150 33-12-32.264N 097-11-52.065W 33-11-42.810N 097-11-53.155W -RWY ETN 17/35 1470 4050 60 32-25-08.647N 098-48-34.337W 32-24-28.592N 098-48-35.850W 190 185 -RWY FTW 09/27 710 4051 100 32-49-08.348N 097-21-59.001W 32-49-01.475N 097-21-12.239W -RWY FTW 16L/34R 710 7501 150 32-49-48.640N 097-21-44.935W 32-48-35.162N 097-21-32.555W -RWY FTW 16R/34L 710 4001 75 32-49-29.401N 097-21-59.451W 32-48-50.213N 097-21-52.847W -RWY FWS 17L/35R 700 4000 60 32-34-21.1N 097-18-23.1W 32-33-41.5N 097-18-23.1W -RWY FWS 17R/35L 700 6002 100 32-34-21.052N 097-18-34.755W 32-33-21.662N 097-18-34.888W -RWY AFW 16/34 722 9600 150 33-00-05.902N 097-19-14.686W 32-58-32.307N 097-18-55.531W 1390 -RWY GLE 04/22 841 4691 150 33-38-40.542N 097-11-56.548W 33-39-10.984N 097-11-14.665W -RWY GLE 08/26 841 3920 150 33-38-41.740N 097-11-58.762W 33-38-40.984N 097-11-12.403W -RWY GLE 12/30 841 4663 75 33-39-20.773N 097-11-59.954W 33-38-49.464N 097-11-19.442W -RWY GLE 17/35 841 5000 100 33-39-30.2N 097-11-57.3W 33-38-41.150N 097-11-59.380W -RWY 4F4 17/35 415 3300 50 32-42-12.696N 094-56-55.750W 32-41-40.058N 094-56-55.912W -RWY 07F 13/31 297 3299 75 32-31-59.564N 094-58-31.150W 32-31-33.602N 094-58-07.787W -RWY 07F 17/35 297 2298 50 32-31-51.274N 094-58-16.833W 32-31-28.538N 094-58-16.236W -RWY E15 03/21 1123 4200 75 33-06-20.563N 098-33-34.639W 33-06-52.572N 098-33-03.148W -RWY E15 17/35 1123 3285 45 33-06-53.248N 098-33-18.219W 33-06-20.779N 098-33-20.012W 650 -RWY F55 14/32 777 3603 60 32-26-55.310N 097-49-11.586W 32-26-24.544N 097-48-50.340W -RWY GVT 17/35 535 8029 150 33-04-43.957N 096-03-54.551W 33-03-24.525N 096-03-55.744W -RWY LNC 13/31 500 4999 100 32-35-04.136N 096-43-27.262W 32-34-26.073N 096-42-49.950W -RWY TKI 17/35 580 7000 100 33-11-15.193N 096-35-24.360W 33-10-06.372N 096-35-27.071W -RWY T15 17/35 410 3049 50 31-20-41.678N 096-51-06.969W 31-20-11.506N 096-51-07.656W 90 -RWY HQZ 17/35 446 6000 100 32-45-18.744N 096-31-48.963W 32-44-19.4N 096-31-50.1W -RWY TX06 18/36 543 4002 60 31-38-42.917N 096-30-49.236W 31-38-03.834N 096-30-56.697W -RWY 3F9 17/35 429 3197 40 32-40-51.842N 095-30-38.670W 32-40-20.213N 095-30-39.076W -RWY 3T1 18/36 434 3406 60 32-44-45.814N 095-29-46.618W 32-44-12.145N 095-29-48.179W -RWY MWL 13/31 972 5094 100 32-47-14.755N 098-03-51.415W 32-46-38.746N 098-03-09.675W -RWY MWL 17/35 972 4186 100 32-47-14.837N 098-03-50.390W 32-46-33.423N 098-03-50.916W -RWY MSA 03/21 404 1650 25 33-07-31.433N 094-58-36.769W 33-07-44.433N 094-58-33.768W -RWY MSA 17/35 404 3837 75 33-08-04.675N 094-58-32.493W 33-07-26.712N 094-58-32.046W 200 -RWY F53 13/31 412 3200 60 33-13-04.147N 095-14-24.127W 33-12-41.194N 095-13-58.185W -RWY ONY 04/22 1274 5098 75 33-20-53.824N 098-49-28.286W 33-21-29.290N 098-48-45.558W -RWY ONY 13/31 1274 5093 150 33-21-12.662N 098-49-28.139W 33-20-36.841N 098-48-45.915W -RWY ONY 17/35 1274 5100 75 33-21-28.423N 098-49-12.881W 33-20-37.966N 098-49-13.143W -RWY PSN 08/26 422 4002 150 31-46-37.494N 095-42-45.722W 31-46-37.129N 095-41-59.365W -RWY PSN 17/35 422 4007 100 31-47-09.495N 095-42-22.624W 31-46-29.845N 095-42-23.057W -RWY PRX 03/21 547 4625 150 33-37-49.012N 095-27-10.834W 33-38-25.470N 095-26-37.784W -RWY PRX 13/31 547 4624 150 33-38-34.443N 095-27-11.616W 33-37-58.802N 095-26-37.327W -RWY PRX 17/35 547 6000 150 33-38-41.350N 095-27-15.930W 33-37-41.997N 095-27-14.894W -RWY F46 16/34 574 3371 50 32-56-06.667N 096-26-10.330W 32-55-33.605N 096-26-05.130W 470 290 -RWY SWI 16/34 745 4005 100 33-37-46.212N 096-35-15.795W 33-37-07.761N 096-35-04.384W -RWY SEP 03/21 1321 2413 50 32-12-46.070N 098-10-59.302W 32-13-04.553N 098-10-41.528W -RWY SEP 14/32 1321 4183 60 32-13-12.903N 098-10-52.057W 32-12-37.348N 098-10-27.118W -RWY SLR 18/36 489 5000 75 33-09-59.718N 095-37-11.063W 33-09-10.985N 095-37-21.022W -RWY TPL 02/20 682 4742 100 31-08-51.857N 097-24-34.103W 31-09-33.443N 097-24-08.809W -RWY TPL 15/33 682 6301 150 31-09-35.965N 097-24-43.783W 31-08-36.462N 097-24-22.110W -RWY TRL 14/32 475 3014 75 32-42-49.304N 096-16-14.343W 32-42-24.818N 096-15-54.212W -RWY TRL 17/35 475 3998 75 32-42-15.784N 096-16-01.496W 32-42-55.342N 096-16-01.581W -RWY TYR 04/22 544 7200 150 32-20-45.415N 095-24-38.452W 32-21-35.692N 095-23-38.989W -RWY TYR 13/31 544 5200 150 32-21-40.395N 095-24-19.462W 32-21-03.920N 095-23-36.705W -RWY TYR 17/35 544 4849 150 32-21-37.458N 095-24-19.533W 32-20-49.478N 095-24-19.671W -RWY ACT 01/19 516 6597 150 31-37-16.002N 097-13-29.086W 31-36-12.723N 097-13-47.841W -RWY ACT 14/32 516 5898 150 31-37-01.541N 097-14-20.082W 31-36-11.401N 097-13-45.171W -RWY F60 04/22 590 3461 56 31-28-45.998N 097-19-03.834W 31-29-10.644N 097-18-36.086W -RWY F60 17/35 590 5499 75 31-29-37.631N 097-19-06.039W 31-28-43.222N 097-19-04.923W -RWY CNW 17L/35R 470 8600 150 31-39-05.761N 097-04-25.712W 31-37-40.730N 097-04-21.451W -RWY CNW 17R/35L 470 6291 150 31-38-37.542N 097-04-32.989W 31-37-35.347N 097-04-29.861W -RWY WEA 17/35 990 2889 40 32-45-00.937N 097-40-56.703W 32-44-32.358N 097-40-56.925W 219 -RWY F14 04/22 1005 3050 100 33-56-38.346N 098-37-12.209W 33-56-58.345N 098-36-44.208W -RWY F14 13/31 1005 3315 40 33-57-04.593N 098-37-12.496W 33-56-39.097N 098-36-47.755W -RWY F14 16/34 1005 2000 42 33-57-05.345N 098-36-56.209W 33-56-45.346N 098-36-53.208W -RWY 2F9 17/35 986 3784 50 33-50-00.218N 098-34-21.871W 33-49-22.786N 098-34-21.883W -RWY T47 17/35 998 4216 60 33-52-01.269N 098-29-25.432W 33-51-19.561N 098-29-25.688W -RWY SPS 15L/33R 1015 8802 150 34-00-11.509N 098-29-44.401W 33-58-50.644N 098-29-05.667W -RWY SPS 15R/33L 1015 13100 300 34-00-13.567N 098-29-58.177W 33-58-13.216N 098-29-00.523W -RWY SPS 17/35 1015 7001 150 33-58-56.609N 098-29-44.753W 33-57-47.360N 098-29-45.463W -RWY F51 01/19 513 3202 50 32-56-04.741N 095-16-49.653W 32-56-34.873N 095-16-38.060W -NAV AEE NDB 34-11-30.363N 095-39-06.892W 569 08E 391 -NAV AUV NDB 34-09-02.642N 097-07-28.849W 840 07E 284 -NAV ADM VORTAC 34-12-41.635N 097-10-05.954W 930 06E 116.70 -NAV DUC VOR/DME 34-23-04.107N 097-55-00.523W 1090 09E 111.00 -NAV DUA NDB 33-56-32.354N 096-23-54.965W 684 06E 359 -NAV HHW NDB 34-02-22.872N 095-32-21.762W 546 05E 323 -NAV AQN VORTAC 32-26-04.501N 097-39-50.092W 850 09E 110.60 -NAV AHX NDB 32-09-33.553N 095-49-48.871W 440 06E 269 -NAV CSZ NDB 32-03-48.587N 095-57-27.435W 383 08E 215 -NAV ABG NDB 32-35-07.507N 095-06-46.798W 420 07E 404 -NAV BUJ VORTAC 33-16-59.707N 096-21-54.034W 610 08E 114.90 -NAV HJM NDB 33-36-50.376N 096-10-33.921W 607 06E 415 -NAV GMZ NDB 33-36-19.379N 097-46-24.116W 1097 07E 356 -NAV BKD NDB 32-44-50.437N 098-53-28.242W 1226 07E 245 -NAV BPR VORTAC 33-14-16.012N 097-45-59.021W 890 09E 116.50 -NAV MII NDB 33-02-25.425N 096-14-54.922W 541 06E 316 -NAV CRS NDB 32-01-39.559N 096-23-42.930W 440 06E 396 -NAV CGQ NDB 32-03-50.554N 096-25-40.935W 394 06E 344 -NAV CVE VOR/DME 32-53-25.1N 096-54-14.3W 450 06E 116.20 -NAV NBE TACAN 32-44-05.152N 096-58-00.211W 463 08E 108.3 020X -NAV RBD NDB 32-40-36.978N 096-52-15.908W 670 06E 287 -NAV DFW VORTAC 32-51-57.258N 097-01-41.029W 560 08E 117.00 -NAV OIP NDB 32-23-54.472N 098-48-37.223W 1428 08E 410 -NAV PYF NDB 31-51-45.587N 096-11-50.899W 350 06E 418 -NAV FWH TACAN 32-46-17.46N 097-26-22.07W 663 07E 108.7 024X -NAV FZT VOR/DME 32-04-28.575N 095-31-50.846W 305 06E 111.40 -NAV GLE NDB 33-43-07.28N 097-11-55.20W 860 06E 330 -NAV GZV NDB 32-57-05.433N 098-24-47.188W 1003 07E 280 -NAV MJF TACAN 33-03-58.520N 096-03-40.997W 540 05E 109.6 033X -NAV SYW NDB 32-58-53.43N 096-04-01.90W 493 05E 428 -NAV MNZ NDB 31-37-12.564N 098-08-51.123W 1268 07E 251 -NAV LNC NDB 32-34-39.488N 096-43-17.984W 495 06E 239 -NAV PQF NDB 32-48-32.457N 096-31-43.961W 445 06E 248 -NAV LXY NDB 31-38-22.605N 096-30-43.932W 533 07E 329 -NAV MQP VORTAC 32-43-34.572N 097-59-50.550W 890 09E 117.70 -NAV MSA NDB 33-07-42.433N 094-58-26.768W 404 05E 381 -NAV ONY NDB 33-21-04.382N 098-48-58.229W 1259 07E 272 -NAV PRX VOR/DME 33-32-32.588N 095-26-53.732W 510 07E 113.60 -NAV UIM VORTAC 32-52-49.450N 095-22-00.314W 520 08E 114.00 -NAV SCY VORTAC 32-27-52.502N 096-20-14.932W 435 08E 112.90 -NAV JUG NDB 32-40-08.275N 096-31-55.561W 420 06E 388 -NAV DNI NDB 33-49-26.369N 096-40-10.987W 680 06E 341 -NAV BHG NDB 33-09-30.411N 095-37-05.842W 483 06E 338 -NAV SLR VOR/DME 33-11-55.108N 095-32-33.333W 480 08E 109.00 -NAV TPL VOR/DME 31-12-33.628N 097-25-29.835W 710 09E 110.40 -NAV AVZ NDB 32-45-36.862N 096-14-57.221W 491 06E 299 -NAV TYR VOR/DME 32-21-21.132N 095-24-12.437W 540 06E 114.20 -NAV ROB NDB 31-30-13.704N 097-04-10.495W 394 07E 400 -NAV ACT VORTAC 31-39-44.387N 097-16-08.531W 510 09E 115.30 -NAV SKB NDB 33-47-24.360N 098-29-11.192W 985 08E 344 -NAV SHP TACAN 33-58-57.645N 098-29-15.593W 1020 10E 110.8 045X -NAV SPS VORTAC 33-59-14.143N 098-35-36.606W 1100 10E 112.70 -ILS 30 ILS IAIW 108.9 34-18-47.161N 097-01-38.280W 34-17-59.533N 097-00-35.018W 729.2 06E 4.92 309 3.00 -NAV AI OMARKER/COMLO 34-13-56.438N 096-55-59.236W 729.2 06E 400 -ILS 35 LOCALIZER IDUC 111.5 34-29-01.572N 097-57-36.166W - - - 07E 6.00 352 - -ILS 15 ILS/DME IADS 110.1 32-57-29.711N 096-49-55.000W 32-58-21.219N 096-50-21.574W 635 06E 6.00 154 3.00 -NAV AD OMARKER/COMLO 33-02-40.436N 096-52-13.510W 635 06E 407 -ILS 33 ILS ITBQ 110.1 32-58-49.301N 096-50-29.775W 32-57-48.178N 096-50-07.381W 643.3 06E 4.90 334 3.00 -ILS 13L ILS/DME IDAL 111.5 32-50-22.998N 096-50-11.267W 32-51-17.197N 096-51-20.280W 481.8 06E 4.51 130 3.00 -NAV OMARKER 32-54-24.052N 096-54-48.516W 481.8 06E -ILS 13R ILS/DME IDPX 111.7 32-49-56.969N 096-50-29.858W 32-50-52.178N 096-51-38.750W 476.3 06E 4.40 129 3.00 -ILS 31L ILS/DME ILVF 111.7 32-51-14.077N 096-51-59.231W 32-50-08.859N 096-50-48.569W 476.3 06E 3.96 310 3.08 -NAV LV OMARKER/COMLO 32-46-28.965N 096-46-30.602W 476.3 06E 275 -ILS 31R ILS/DME IOVW 111.5 32-51-28.657N 096-51-27.340W 32-50-35.338N 096-50-32.108W 486.1 06E 4.95 310 3.00 -ILS 31 ILS IRBD 108.5 32-41-21.376N 096-52-43.419W 32-40-33.118N 096-51-51.877W 650.8 06E 6.00 309 3.00 -NAV OMARKER 32-37-13.85N 096-47-51.87W 650.8 06E -ILS 13R ILS/DME ILWN 109.5 32-53-17.776N 097-03-40.382W 32-54-24.133N 097-04-54.075W 589.5 07E 3.91 132 3.00 -NAV OMARKER 32-58-17.65N 097-08-49.20W 589.5 07E -ILS 17L ILS/DME IFLQ 110.3 32-52-34.426N 097-01-34.248W 32-54-26.233N 097-01-28.959W 562.5 07E 3.25 173 3.00 -NAV FL OMARKER/COMLO 32-59-44.843N 097-01-46.530W 562.5 07E 219 -ILS 17R ILS IJHZ 111.35 32-52-34.136N 097-01-48.329W 32-54-44.72N 097-01-43.05W 566.4 07E 3.25 173 3.00 -NAV FL OMARKER/COMLO 32-59-44.843N 097-01-46.530W 566.4 07E 219 -ILS 18L ILS ICIX 110.55 32-52-34.857N 097-03-03.361W 32-54-26.253N 097-03-07.492W 593.9 07E 3.25 173 3.00 -NAV OMARKER 32-59-42.643N 097-02-57.932W 593.9 07E -ILS 18R ILS/DME IVYN 111.9 32-52-34.817N 097-03-17.431W 32-54-26.263N 097-03-21.562W 600.9 07E 3.25 173 3.00 -NAV OMARKER 32-59-42.643N 097-02-57.932W 600.9 07E -ILS 31R ILS IRRA 110.9 32-54-52.232N 097-01-25.558W 32-53-52.854N 097-00-07.566W 513.4 07E 4.00 308 3.00 -NAV OMARKER 32-49-51.361N 096-55-26.717W 513.4 07E -ILS 35L ILS IUWX 111.35 32-55-07.86N 097-01-47.50W 32-52-55.00N 097-01-43.53W 564.7 07E 3.00 353 3.00 -NAV PK OMARKER/COMLO 32-48-09.26N 097-01-37.97W 564.7 07E 233 -ILS 35R ILS/DME IPKQ 110.3 32-54-46.192N 097-01-33.549W 32-52-54.346N 097-01-29.458W 562.7 07E 3.25 353 3.00 -NAV PK OMARKER/COMLO 32-48-09.26N 097-01-37.97W 562.7 07E 233 -ILS 36L ILS/DME IBXN 111.9 32-54-46.532N 097-03-16.762W 32-52-54.416N 097-03-22.022W 584.2 07E 3.25 353 3.00 -NAV OMARKER 32-47-35.166N 097-03-05.630W 584.2 07E -ILS 36R ILS IFJN 110.55 32-55-12.59N 097-03-02.56W 32-52-54.91N 097-03-07.95W 577 07E 3.00 353 3.00 -NAV OMARKER 32-47-35.27N 097-03-05.53W 577 07E -ILS 17 ILS IDTO 111.1 33-11-29.960N 097-11-53.444W 33-12-22.148N 097-11-56.994W 640.2 07E 174 3.00 -NAV DT OMARKER/COMLO 33-16-59.122N 097-11-46.454W 640.2 07E 257 -ILS 16 ILS/DME IUPE 110.15 32-58-26.459N 097-18-54.331W 32-59-39.727N 097-19-13.492W 708.2 07E 4.56 163 3.00 -NAV OMARKER 33-05-11.238N 097-20-16.967W 708.2 07E -ILS 34 ILS IJVX 110.15 33-00-09.066N 097-19-15.332W 32-58-41.568N 097-19-01.612W 669.2 07E 4.04 343 3.00 -NAV OMARKER 32-53-52.956N 097-18-04.958W 669.2 07E -ILS 16L ILS/DME IFTW 109.9 32-48-20.473N 097-21-30.083W 32-49-35.842N 097-21-47.514W 701 08E 164 3.00 -NAV FT OMARKER/NDB 32-53-34.656N 097-22-24.666W 701 08E 365 -ILS 35 LOC/GS IFWH 109.3 32-47-18.463N 097-26-28.071W 32-45-21.466N 097-26-24.071W 07E 354 2.75 -ILS 35L ILS IJZW 110.95 32-34-30.971N 097-18-34.736W 32-33-30.553N 097-18-29.035W 692.2 07E 5.72 353 3.00 -NAV OMARKER 32-28-35.203N 097-18-37.054W 692.2 07E -ILS 17 ILS IGVT 110.5 33-03-18.581N 096-03-55.837W 33-04-34.499N 096-03-49.987W 526.1 05E 176 3.00 -NAV GV OMARKER/COMLO 33-09-22.613N 096-03-48.697W 526.1 05E 201 -ILS 17 ILS/DME IEFE 109.35 33-10-01.59N 096-35-26.65W 33-11-04.73N 096-35-20.14W 573 06E 5.42 176 3.00 -NAV EF OMARKER/COMLO 33-15-41.99N 096-35-18.74W 573 06E 421 -ILS 17 LOC/DME IHQZ 109.75 32-44-20.666N 096-31-49.561W - - - 06E 6.00 175 - -ILS 15 ILS/DME ITPL 111.5 31-08-23.717N 097-24-17.467W 31-09-25.645N 097-24-33.999W 678.7 07E 5.20 156 2.90 -NAV OMARKER 31-12-29.228N 097-25-48.636W 678.7 07E -ILS 13 ILS ITYR 109.9 32-20-58.650N 095-23-30.520W 32-21-31.815N 095-24-14.737W 526 06E 6.00 129 2.51 -NAV TY OMARKER/NDB 32-24-55.821N 095-28-10.246W 526 06E 320 -ILS 17L ILS ICNW 110.7 31-37-28.864N 097-04-20.859W 31-38-55.942N 097-04-19.430W 467.8 07E 4.09 171 3.00 -NAV CN OMARKER/COMLO 31-44-26.985N 097-04-40.804W 467.8 07E 283 -ILS 19 ILS/DME IACT 109.7 31-36-06.968N 097-13-49.542W 31-37-05.478N 097-13-36.979W 503.5 07E 5.57 187 2.75 -NAV AC OMARKER/COMLO 31-41-38.286N 097-12-13.721W 503.5 07E 242 -ILS 33L ILS ISPS 109.7 34-00-31.933N 098-30-06.975W 33-58-25.156N 098-28-59.843W 999.1 08E 3.00 330 3.00 -NAV SP OMARKER/NDB 33-54-38.351N 098-27-16.489W 999.1 08E 296 -FEATURES diff -Nru acm-5.0/objects/default-scene acm-6.0+20200416/objects/default-scene --- acm-5.0/objects/default-scene 1998-08-14 02:26:32.000000000 +0000 +++ acm-6.0+20200416/objects/default-scene 1970-01-01 00:00:00.000000000 +0000 @@ -1,223 +0,0 @@ -32-58-18.798N 096-50-16.604W 644.0 154 -34-17-36.089N 097-01-25.366W 762.0 040 -#879349 -RWY 80F 17/35 575 3299 60 34-11-49.689N 095-38-59.574W 34-11-17.059N 095-38-59.443W -RWY ADM 04/22 762 6761 150 34-17-36.089N 097-01-25.366W 34-18-23.048N 097-00-27.991W 575 -RWY ADM 12/30 762 7220 150 34-18-40.509N 097-01-30.377W 34-17-49.647N 097-00-29.965W -RWY ADM 17/35 762 6879 150 34-18-43.074N 097-01-24.530W 34-17-35.031N 097-01-25.130W 495 830 -RWY 1F0 17/35 842 5000 75 34-09-13.891N 097-07-21.964W 34-08-24.437N 097-07-21.114W -RWY DUC 17/35 1113 6650 100 34-28-44.771N 097-57-35.923W 34-27-55.315N 097-57-35.191W -RWY DUA 12/30 698 3000 75 33-56-42.827N 096-23-50.294W 33-56-22.645N 096-23-24.190W -RWY DUA 17/35 698 5001 100 33-56-56.558N 096-23-41.967W 33-56-07.086N 096-23-42.322W -RWY 1F4 18/36 890 3005 50 34-08-40.205N 096-48-41.348W 34-08-10.668N 096-48-45.334W -RWY F54 16/34 631 5000 100 32-40-08.891N 097-05-44.151W 32-39-20.498N 097-05-32.012W -RWY F44 17/35 444 4000 60 32-10-09.620N 095-49-42.149W 32-09-30.076N 095-49-41.997W -RWY 1F8 08/26 390 5093 40 32-35-07.094N 095-04-19.887W 32-35-06.304N 095-03-20.368W 2879 -RWY F00 09/27 619 1100 70 33-36-58.376N 096-10-41.422W 33-36-57.376N 096-10-28.921W -RWY F00 17/35 619 2994 60 33-36-56.954N 096-10-45.231W 33-36-27.346N 096-10-46.230W -RWY 0F2 17/35 1101 3602 60 33-36-23.717N 097-46-34.125W 33-35-48.261N 097-46-29.928W -RWY BKD 04/22 1283 2399 50 32-43-00.183N 098-53-40.463W 32-43-17.069N 098-53-20.731W -RWY BKD 13/31 1283 2401 50 32-43-14.216N 098-53-43.806W 32-42-57.533N 098-53-23.797W -RWY BKD 17/35 1283 4598 100 32-43-28.533N 098-53-27.541W 32-42-43.038N 098-53-27.191W -RWY 7F3 13L/31R 542 2200 160 33-02-27.925N 096-14-43.421W 33-02-10.925N 096-14-52.922W -RWY 7F3 13R/31L 542 3999 150 33-02-27.129N 096-14-43.988W 33-01-58.625N 096-14-11.403W -RWY 7F3 17L/35R 542 1400 275 33-02-26.425N 096-14-27.921W 33-02-12.526N 096-14-27.921W -RWY 7F3 17R/35L 542 3998 150 33-02-27.633N 096-14-42.475W 33-01-48.084N 096-14-43.519W 800 -RWY F18 15/33 854 4999 100 32-21-39.893N 097-26-13.275W 32-20-53.651N 097-25-52.581W -RWY 2F7 18/36 516 3203 50 33-17-53.572N 095-53-46.049W 33-17-21.913N 095-53-47.785W -RWY CRS 14/32 448 4998 75 32-01-59.204N 096-24-09.543W 32-01-18.657N 096-23-36.301W -RWY RBD 13/31 660 6451 150 32-41-14.352N 096-52-35.132W 32-40-29.155N 096-51-41.836W -RWY RBD 17/35 660 3801 150 32-41-08.883N 096-52-00.432W 32-40-31.279N 096-52-00.527W -RWY ADS 15/33 644 7202 100 32-58-40.245N 096-50-25.820W 32-57-33.383N 096-49-56.608W 979 771 -RWY DFW 13L/31R 603 9000 200 32-54-45.207N 097-01-17.305W 32-53-41.948N 097-00-03.021W -RWY DFW 13R/31L 603 9300 150 32-54-34.474N 097-04-59.265W 32-53-24.972N 097-03-47.781W -RWY DFW 17L/35R 603 11388 150 32-54-36.645N 097-01-33.598W 32-52-43.976N 097-01-34.197W -RWY DFW 17R/35L 603 13400 200 32-54-56.614N 097-01-47.563W 32-52-44.032N 097-01-48.273W -RWY DFW 18L/36R 603 11387 200 32-54-36.970N 097-03-02.743W 32-52-44.306N 097-03-03.315W -RWY DFW 18R/36L 603 11388 150 32-54-37.023N 097-03-16.816W 32-52-44.356N 097-03-17.382W -RWY DAL 13L/31R 487 7753 150 32-51-26.188N 096-51-24.477W 32-50-31.355N 096-50-20.931W -RWY DAL 13R/31L 487 8800 150 32-51-04.748N 096-51-48.420W 32-50-02.516N 096-50-36.292W 490 -RWY DAL 18/36 487 6149 150 32-51-31.215N 096-51-11.642W 32-50-30.654N 096-51-18.515W -RWY 8F7 16/34 1047 3900 75 33-15-35.418N 097-34-54.602W 33-14-57.619N 097-34-45.102W -RWY DTO 17/35 642 5000 150 33-12-32.264N 097-11-52.065W 33-11-42.810N 097-11-53.155W -RWY ETN 17/35 1470 4050 60 32-25-08.647N 098-48-34.337W 32-24-28.592N 098-48-35.850W 190 185 -RWY FTW 09/27 710 4051 100 32-49-08.348N 097-21-59.001W 32-49-01.475N 097-21-12.239W -RWY FTW 16L/34R 710 7501 150 32-49-48.640N 097-21-44.935W 32-48-35.162N 097-21-32.555W -RWY FTW 16R/34L 710 4001 75 32-49-29.401N 097-21-59.451W 32-48-50.213N 097-21-52.847W -RWY FWS 17L/35R 700 4000 60 32-34-21.1N 097-18-23.1W 32-33-41.5N 097-18-23.1W -RWY FWS 17R/35L 700 6002 100 32-34-21.052N 097-18-34.755W 32-33-21.662N 097-18-34.888W -RWY AFW 16/34 722 9600 150 33-00-05.902N 097-19-14.686W 32-58-32.307N 097-18-55.531W 1390 -RWY GLE 04/22 841 4691 150 33-38-40.542N 097-11-56.548W 33-39-10.984N 097-11-14.665W -RWY GLE 08/26 841 3920 150 33-38-41.740N 097-11-58.762W 33-38-40.984N 097-11-12.403W -RWY GLE 12/30 841 4663 75 33-39-20.773N 097-11-59.954W 33-38-49.464N 097-11-19.442W -RWY GLE 17/35 841 5000 100 33-39-30.2N 097-11-57.3W 33-38-41.150N 097-11-59.380W -RWY 4F4 17/35 415 3300 50 32-42-12.696N 094-56-55.750W 32-41-40.058N 094-56-55.912W -RWY 07F 13/31 297 3299 75 32-31-59.564N 094-58-31.150W 32-31-33.602N 094-58-07.787W -RWY 07F 17/35 297 2298 50 32-31-51.274N 094-58-16.833W 32-31-28.538N 094-58-16.236W -RWY E15 03/21 1123 4200 75 33-06-20.563N 098-33-34.639W 33-06-52.572N 098-33-03.148W -RWY E15 17/35 1123 3285 45 33-06-53.248N 098-33-18.219W 33-06-20.779N 098-33-20.012W 650 -RWY F55 14/32 777 3603 60 32-26-55.310N 097-49-11.586W 32-26-24.544N 097-48-50.340W -RWY GVT 17/35 535 8029 150 33-04-43.957N 096-03-54.551W 33-03-24.525N 096-03-55.744W -RWY LNC 13/31 500 4999 100 32-35-04.136N 096-43-27.262W 32-34-26.073N 096-42-49.950W -RWY TKI 17/35 580 7000 100 33-11-15.193N 096-35-24.360W 33-10-06.372N 096-35-27.071W -RWY T15 17/35 410 3049 50 31-20-41.678N 096-51-06.969W 31-20-11.506N 096-51-07.656W 90 -RWY HQZ 17/35 446 6000 100 32-45-18.744N 096-31-48.963W 32-44-19.4N 096-31-50.1W -RWY TX06 18/36 543 4002 60 31-38-42.917N 096-30-49.236W 31-38-03.834N 096-30-56.697W -RWY 3F9 17/35 429 3197 40 32-40-51.842N 095-30-38.670W 32-40-20.213N 095-30-39.076W -RWY 3T1 18/36 434 3406 60 32-44-45.814N 095-29-46.618W 32-44-12.145N 095-29-48.179W -RWY MWL 13/31 972 5094 100 32-47-14.755N 098-03-51.415W 32-46-38.746N 098-03-09.675W -RWY MWL 17/35 972 4186 100 32-47-14.837N 098-03-50.390W 32-46-33.423N 098-03-50.916W -RWY MSA 03/21 404 1650 25 33-07-31.433N 094-58-36.769W 33-07-44.433N 094-58-33.768W -RWY MSA 17/35 404 3837 75 33-08-04.675N 094-58-32.493W 33-07-26.712N 094-58-32.046W 200 -RWY F53 13/31 412 3200 60 33-13-04.147N 095-14-24.127W 33-12-41.194N 095-13-58.185W -RWY ONY 04/22 1274 5098 75 33-20-53.824N 098-49-28.286W 33-21-29.290N 098-48-45.558W -RWY ONY 13/31 1274 5093 150 33-21-12.662N 098-49-28.139W 33-20-36.841N 098-48-45.915W -RWY ONY 17/35 1274 5100 75 33-21-28.423N 098-49-12.881W 33-20-37.966N 098-49-13.143W -RWY PSN 08/26 422 4002 150 31-46-37.494N 095-42-45.722W 31-46-37.129N 095-41-59.365W -RWY PSN 17/35 422 4007 100 31-47-09.495N 095-42-22.624W 31-46-29.845N 095-42-23.057W -RWY PRX 03/21 547 4625 150 33-37-49.012N 095-27-10.834W 33-38-25.470N 095-26-37.784W -RWY PRX 13/31 547 4624 150 33-38-34.443N 095-27-11.616W 33-37-58.802N 095-26-37.327W -RWY PRX 17/35 547 6000 150 33-38-41.350N 095-27-15.930W 33-37-41.997N 095-27-14.894W -RWY F46 16/34 574 3371 50 32-56-06.667N 096-26-10.330W 32-55-33.605N 096-26-05.130W 470 290 -RWY SWI 16/34 745 4005 100 33-37-46.212N 096-35-15.795W 33-37-07.761N 096-35-04.384W -RWY SEP 03/21 1321 2413 50 32-12-46.070N 098-10-59.302W 32-13-04.553N 098-10-41.528W -RWY SEP 14/32 1321 4183 60 32-13-12.903N 098-10-52.057W 32-12-37.348N 098-10-27.118W -RWY SLR 18/36 489 5000 75 33-09-59.718N 095-37-11.063W 33-09-10.985N 095-37-21.022W -RWY TPL 02/20 682 4742 100 31-08-51.857N 097-24-34.103W 31-09-33.443N 097-24-08.809W -RWY TPL 15/33 682 6301 150 31-09-35.965N 097-24-43.783W 31-08-36.462N 097-24-22.110W -RWY TRL 14/32 475 3014 75 32-42-49.304N 096-16-14.343W 32-42-24.818N 096-15-54.212W -RWY TRL 17/35 475 3998 75 32-42-15.784N 096-16-01.496W 32-42-55.342N 096-16-01.581W -RWY TYR 04/22 544 7200 150 32-20-45.415N 095-24-38.452W 32-21-35.692N 095-23-38.989W -RWY TYR 13/31 544 5200 150 32-21-40.395N 095-24-19.462W 32-21-03.920N 095-23-36.705W -RWY TYR 17/35 544 4849 150 32-21-37.458N 095-24-19.533W 32-20-49.478N 095-24-19.671W -RWY ACT 01/19 516 6597 150 31-37-16.002N 097-13-29.086W 31-36-12.723N 097-13-47.841W -RWY ACT 14/32 516 5898 150 31-37-01.541N 097-14-20.082W 31-36-11.401N 097-13-45.171W -RWY F60 04/22 590 3461 56 31-28-45.998N 097-19-03.834W 31-29-10.644N 097-18-36.086W -RWY F60 17/35 590 5499 75 31-29-37.631N 097-19-06.039W 31-28-43.222N 097-19-04.923W -RWY CNW 17L/35R 470 8600 150 31-39-05.761N 097-04-25.712W 31-37-40.730N 097-04-21.451W -RWY CNW 17R/35L 470 6291 150 31-38-37.542N 097-04-32.989W 31-37-35.347N 097-04-29.861W -RWY WEA 17/35 990 2889 40 32-45-00.937N 097-40-56.703W 32-44-32.358N 097-40-56.925W 219 -RWY F14 04/22 1005 3050 100 33-56-38.346N 098-37-12.209W 33-56-58.345N 098-36-44.208W -RWY F14 13/31 1005 3315 40 33-57-04.593N 098-37-12.496W 33-56-39.097N 098-36-47.755W -RWY F14 16/34 1005 2000 42 33-57-05.345N 098-36-56.209W 33-56-45.346N 098-36-53.208W -RWY 2F9 17/35 986 3784 50 33-50-00.218N 098-34-21.871W 33-49-22.786N 098-34-21.883W -RWY T47 17/35 998 4216 60 33-52-01.269N 098-29-25.432W 33-51-19.561N 098-29-25.688W -RWY SPS 15L/33R 1015 8802 150 34-00-11.509N 098-29-44.401W 33-58-50.644N 098-29-05.667W -RWY SPS 15R/33L 1015 13100 300 34-00-13.567N 098-29-58.177W 33-58-13.216N 098-29-00.523W -RWY SPS 17/35 1015 7001 150 33-58-56.609N 098-29-44.753W 33-57-47.360N 098-29-45.463W -RWY F51 01/19 513 3202 50 32-56-04.741N 095-16-49.653W 32-56-34.873N 095-16-38.060W -NAV AEE NDB 34-11-30.363N 095-39-06.892W 569 08E 391 -NAV AUV NDB 34-09-02.642N 097-07-28.849W 840 07E 284 -NAV ADM VORTAC 34-12-41.635N 097-10-05.954W 930 06E 116.70 -NAV DUC VOR/DME 34-23-04.107N 097-55-00.523W 1090 09E 111.00 -NAV DUA NDB 33-56-32.354N 096-23-54.965W 684 06E 359 -NAV HHW NDB 34-02-22.872N 095-32-21.762W 546 05E 323 -NAV AQN VORTAC 32-26-04.501N 097-39-50.092W 850 09E 110.60 -NAV AHX NDB 32-09-33.553N 095-49-48.871W 440 06E 269 -NAV CSZ NDB 32-03-48.587N 095-57-27.435W 383 08E 215 -NAV ABG NDB 32-35-07.507N 095-06-46.798W 420 07E 404 -NAV BUJ VORTAC 33-16-59.707N 096-21-54.034W 610 08E 114.90 -NAV HJM NDB 33-36-50.376N 096-10-33.921W 607 06E 415 -NAV GMZ NDB 33-36-19.379N 097-46-24.116W 1097 07E 356 -NAV BKD NDB 32-44-50.437N 098-53-28.242W 1226 07E 245 -NAV BPR VORTAC 33-14-16.012N 097-45-59.021W 890 09E 116.50 -NAV MII NDB 33-02-25.425N 096-14-54.922W 541 06E 316 -NAV CRS NDB 32-01-39.559N 096-23-42.930W 440 06E 396 -NAV CGQ NDB 32-03-50.554N 096-25-40.935W 394 06E 344 -NAV CVE VOR/DME 32-53-25.1N 096-54-14.3W 450 06E 116.20 -NAV NBE TACAN 32-44-05.152N 096-58-00.211W 463 08E 108.3 020X -NAV RBD NDB 32-40-36.978N 096-52-15.908W 670 06E 287 -NAV DFW VORTAC 32-51-57.258N 097-01-41.029W 560 08E 117.00 -NAV OIP NDB 32-23-54.472N 098-48-37.223W 1428 08E 410 -NAV PYF NDB 31-51-45.587N 096-11-50.899W 350 06E 418 -NAV FWH TACAN 32-46-17.46N 097-26-22.07W 663 07E 108.7 024X -NAV FZT VOR/DME 32-04-28.575N 095-31-50.846W 305 06E 111.40 -NAV GLE NDB 33-43-07.28N 097-11-55.20W 860 06E 330 -NAV GZV NDB 32-57-05.433N 098-24-47.188W 1003 07E 280 -NAV MJF TACAN 33-03-58.520N 096-03-40.997W 540 05E 109.6 033X -NAV SYW NDB 32-58-53.43N 096-04-01.90W 493 05E 428 -NAV MNZ NDB 31-37-12.564N 098-08-51.123W 1268 07E 251 -NAV LNC NDB 32-34-39.488N 096-43-17.984W 495 06E 239 -NAV PQF NDB 32-48-32.457N 096-31-43.961W 445 06E 248 -NAV LXY NDB 31-38-22.605N 096-30-43.932W 533 07E 329 -NAV MQP VORTAC 32-43-34.572N 097-59-50.550W 890 09E 117.70 -NAV MSA NDB 33-07-42.433N 094-58-26.768W 404 05E 381 -NAV ONY NDB 33-21-04.382N 098-48-58.229W 1259 07E 272 -NAV PRX VOR/DME 33-32-32.588N 095-26-53.732W 510 07E 113.60 -NAV UIM VORTAC 32-52-49.450N 095-22-00.314W 520 08E 114.00 -NAV SCY VORTAC 32-27-52.502N 096-20-14.932W 435 08E 112.90 -NAV JUG NDB 32-40-08.275N 096-31-55.561W 420 06E 388 -NAV DNI NDB 33-49-26.369N 096-40-10.987W 680 06E 341 -NAV BHG NDB 33-09-30.411N 095-37-05.842W 483 06E 338 -NAV SLR VOR/DME 33-11-55.108N 095-32-33.333W 480 08E 109.00 -NAV TPL VOR/DME 31-12-33.628N 097-25-29.835W 710 09E 110.40 -NAV AVZ NDB 32-45-36.862N 096-14-57.221W 491 06E 299 -NAV TYR VOR/DME 32-21-21.132N 095-24-12.437W 540 06E 114.20 -NAV ROB NDB 31-30-13.704N 097-04-10.495W 394 07E 400 -NAV ACT VORTAC 31-39-44.387N 097-16-08.531W 510 09E 115.30 -NAV SKB NDB 33-47-24.360N 098-29-11.192W 985 08E 344 -NAV SHP TACAN 33-58-57.645N 098-29-15.593W 1020 10E 110.8 045X -NAV SPS VORTAC 33-59-14.143N 098-35-36.606W 1100 10E 112.70 -ILS 30 ILS IAIW 108.9 34-18-47.161N 097-01-38.280W 34-17-59.533N 097-00-35.018W 729.2 06E 4.92 309 3.00 -NAV AI OMARKER/COMLO 34-13-56.438N 096-55-59.236W 729.2 06E 400 -ILS 35 LOCALIZER IDUC 111.5 34-29-01.572N 097-57-36.166W - - - 07E 6.00 352 - -ILS 15 ILS/DME IADS 110.1 32-57-29.711N 096-49-55.000W 32-58-21.219N 096-50-21.574W 635 06E 6.00 154 3.00 -NAV AD OMARKER/COMLO 33-02-40.436N 096-52-13.510W 635 06E 407 -ILS 33 ILS ITBQ 110.1 32-58-49.301N 096-50-29.775W 32-57-48.178N 096-50-07.381W 643.3 06E 4.90 334 3.00 -ILS 13L ILS/DME IDAL 111.5 32-50-22.998N 096-50-11.267W 32-51-17.197N 096-51-20.280W 481.8 06E 4.51 130 3.00 -NAV OMARKER 32-54-24.052N 096-54-48.516W 481.8 06E -ILS 13R ILS/DME IDPX 111.7 32-49-56.969N 096-50-29.858W 32-50-52.178N 096-51-38.750W 476.3 06E 4.40 129 3.00 -ILS 31L ILS/DME ILVF 111.7 32-51-14.077N 096-51-59.231W 32-50-08.859N 096-50-48.569W 476.3 06E 3.96 310 3.08 -NAV LV OMARKER/COMLO 32-46-28.965N 096-46-30.602W 476.3 06E 275 -ILS 31R ILS/DME IOVW 111.5 32-51-28.657N 096-51-27.340W 32-50-35.338N 096-50-32.108W 486.1 06E 4.95 310 3.00 -ILS 31 ILS IRBD 108.5 32-41-21.376N 096-52-43.419W 32-40-33.118N 096-51-51.877W 650.8 06E 6.00 309 3.00 -NAV OMARKER 32-37-13.85N 096-47-51.87W 650.8 06E -ILS 13R ILS/DME ILWN 109.5 32-53-17.776N 097-03-40.382W 32-54-24.133N 097-04-54.075W 589.5 07E 3.91 132 3.00 -NAV OMARKER 32-58-17.65N 097-08-49.20W 589.5 07E -ILS 17L ILS/DME IFLQ 110.3 32-52-34.426N 097-01-34.248W 32-54-26.233N 097-01-28.959W 562.5 07E 3.25 173 3.00 -NAV FL OMARKER/COMLO 32-59-44.843N 097-01-46.530W 562.5 07E 219 -ILS 17R ILS IJHZ 111.35 32-52-34.136N 097-01-48.329W 32-54-44.72N 097-01-43.05W 566.4 07E 3.25 173 3.00 -NAV FL OMARKER/COMLO 32-59-44.843N 097-01-46.530W 566.4 07E 219 -ILS 18L ILS ICIX 110.55 32-52-34.857N 097-03-03.361W 32-54-26.253N 097-03-07.492W 593.9 07E 3.25 173 3.00 -NAV OMARKER 32-59-42.643N 097-02-57.932W 593.9 07E -ILS 18R ILS/DME IVYN 111.9 32-52-34.817N 097-03-17.431W 32-54-26.263N 097-03-21.562W 600.9 07E 3.25 173 3.00 -NAV OMARKER 32-59-42.643N 097-02-57.932W 600.9 07E -ILS 31R ILS IRRA 110.9 32-54-52.232N 097-01-25.558W 32-53-52.854N 097-00-07.566W 513.4 07E 4.00 308 3.00 -NAV OMARKER 32-49-51.361N 096-55-26.717W 513.4 07E -ILS 35L ILS IUWX 111.35 32-55-07.86N 097-01-47.50W 32-52-55.00N 097-01-43.53W 564.7 07E 3.00 353 3.00 -NAV PK OMARKER/COMLO 32-48-09.26N 097-01-37.97W 564.7 07E 233 -ILS 35R ILS/DME IPKQ 110.3 32-54-46.192N 097-01-33.549W 32-52-54.346N 097-01-29.458W 562.7 07E 3.25 353 3.00 -NAV PK OMARKER/COMLO 32-48-09.26N 097-01-37.97W 562.7 07E 233 -ILS 36L ILS/DME IBXN 111.9 32-54-46.532N 097-03-16.762W 32-52-54.416N 097-03-22.022W 584.2 07E 3.25 353 3.00 -NAV OMARKER 32-47-35.166N 097-03-05.630W 584.2 07E -ILS 36R ILS IFJN 110.55 32-55-12.59N 097-03-02.56W 32-52-54.91N 097-03-07.95W 577 07E 3.00 353 3.00 -NAV OMARKER 32-47-35.27N 097-03-05.53W 577 07E -ILS 17 ILS IDTO 111.1 33-11-29.960N 097-11-53.444W 33-12-22.148N 097-11-56.994W 640.2 07E 174 3.00 -NAV DT OMARKER/COMLO 33-16-59.122N 097-11-46.454W 640.2 07E 257 -ILS 16 ILS/DME IUPE 110.15 32-58-26.459N 097-18-54.331W 32-59-39.727N 097-19-13.492W 708.2 07E 4.56 163 3.00 -NAV OMARKER 33-05-11.238N 097-20-16.967W 708.2 07E -ILS 34 ILS IJVX 110.15 33-00-09.066N 097-19-15.332W 32-58-41.568N 097-19-01.612W 669.2 07E 4.04 343 3.00 -NAV OMARKER 32-53-52.956N 097-18-04.958W 669.2 07E -ILS 16L ILS/DME IFTW 109.9 32-48-20.473N 097-21-30.083W 32-49-35.842N 097-21-47.514W 701 08E 164 3.00 -NAV FT OMARKER/NDB 32-53-34.656N 097-22-24.666W 701 08E 365 -ILS 35 LOC/GS IFWH 109.3 32-47-18.463N 097-26-28.071W 32-45-21.466N 097-26-24.071W 07E 354 2.75 -ILS 35L ILS IJZW 110.95 32-34-30.971N 097-18-34.736W 32-33-30.553N 097-18-29.035W 692.2 07E 5.72 353 3.00 -NAV OMARKER 32-28-35.203N 097-18-37.054W 692.2 07E -ILS 17 ILS IGVT 110.5 33-03-18.581N 096-03-55.837W 33-04-34.499N 096-03-49.987W 526.1 05E 176 3.00 -NAV GV OMARKER/COMLO 33-09-22.613N 096-03-48.697W 526.1 05E 201 -ILS 17 ILS/DME IEFE 109.35 33-10-01.59N 096-35-26.65W 33-11-04.73N 096-35-20.14W 573 06E 5.42 176 3.00 -NAV EF OMARKER/COMLO 33-15-41.99N 096-35-18.74W 573 06E 421 -ILS 17 LOC/DME IHQZ 109.75 32-44-20.666N 096-31-49.561W - - - 06E 6.00 175 - -ILS 15 ILS/DME ITPL 111.5 31-08-23.717N 097-24-17.467W 31-09-25.645N 097-24-33.999W 678.7 07E 5.20 156 2.90 -NAV OMARKER 31-12-29.228N 097-25-48.636W 678.7 07E -ILS 13 ILS ITYR 109.9 32-20-58.650N 095-23-30.520W 32-21-31.815N 095-24-14.737W 526 06E 6.00 129 2.51 -NAV TY OMARKER/NDB 32-24-55.821N 095-28-10.246W 526 06E 320 -ILS 17L ILS ICNW 110.7 31-37-28.864N 097-04-20.859W 31-38-55.942N 097-04-19.430W 467.8 07E 4.09 171 3.00 -NAV CN OMARKER/COMLO 31-44-26.985N 097-04-40.804W 467.8 07E 283 -ILS 19 ILS/DME IACT 109.7 31-36-06.968N 097-13-49.542W 31-37-05.478N 097-13-36.979W 503.5 07E 5.57 187 2.75 -NAV AC OMARKER/COMLO 31-41-38.286N 097-12-13.721W 503.5 07E 242 -ILS 33L ILS ISPS 109.7 34-00-31.933N 098-30-06.975W 33-58-25.156N 098-28-59.843W 999.1 08E 3.00 330 3.00 -NAV SP OMARKER/NDB 33-54-38.351N 098-27-16.489W 999.1 08E 296 -FEATURES -tower.obv 32-58-04.800N 096-50-16.800W 644 0 -f117.dxf 32-58-05.800N 096-50-16.800W 644 0 Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/objects/engine.au and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/objects/engine.au differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/objects/engine.wav and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/objects/engine.wav differ diff -Nru acm-5.0/objects/f117.dxf acm-6.0+20200416/objects/f117.dxf --- acm-5.0/objects/f117.dxf 1998-08-14 02:26:39.000000000 +0000 +++ acm-6.0+20200416/objects/f117.dxf 1970-01-01 00:00:00.000000000 +0000 @@ -1,2318 +0,0 @@ - 0 -SECTION - 2 -HEADER - 0 -ENDSEC - 0 -SECTION - 2 -TABLES - 0 -TABLE - 2 -LAYER - 70 - 153 - 0 -LAYER - 2 -0 - 70 -0 - 62 -15 - 6 -CONTINUOUS - 0 -ENDTAB - 0 -ENDSEC - 0 -SECTION - 2 -ENTITIES - 0 -3DFACE - 8 -0 - 10 -0.762000 - 20 --3.790279 - 30 -0.000489 - 11 -0.944880 - 21 --2.571079 - 31 -0.000489 - 12 -1.524000 - 22 --2.266279 - 32 -0.000489 - 13 -1.524000 - 23 --2.266279 - 33 -0.000489 - 62 -4 - 0 -3DFACE - 8 -0 - 10 -0.000031 - 20 --5.353721 - 30 -0.000704 - 11 -0.000000 - 21 --3.942679 - 31 -0.610089 - 12 -0.762000 - 22 --3.790279 - 32 -0.000489 - 13 -0.762000 - 23 --3.790279 - 33 -0.000489 - 62 -4 - 0 -3DFACE - 8 -0 - 10 -0.000000 - 20 --3.028280 - 30 -1.524489 - 11 -0.000011 - 21 -3.729320 - 31 -0.000000 - 12 -0.000000 - 22 -2.000921 - 32 -0.610089 - 13 -0.000000 - 23 -2.000921 - 33 -0.610089 - 62 -0 - 0 -3DFACE - 8 -0 - 10 -1.371600 - 20 -1.238921 - 30 -0.610089 - 11 -0.000000 - 21 --3.028280 - 31 -1.524489 - 12 -0.000000 - 22 -2.000921 - 32 -0.610089 - 13 -0.000000 - 23 -2.000921 - 33 -0.610089 - 62 -4 - 0 -3DFACE - 8 -0 - 10 -0.000011 - 20 -3.729320 - 30 -0.000000 - 11 -1.467700 - 21 -2.235796 - 31 -0.010004 - 12 -0.000000 - 22 -2.000921 - 32 -0.610089 - 13 -0.000000 - 23 -2.000921 - 33 -0.610089 - 62 -4 - 0 -3DFACE - 8 -0 - 10 -0.000000 - 20 --3.028280 - 30 -1.524489 - 11 -1.371600 - 21 -1.238921 - 31 -0.610089 - 12 -0.762000 - 22 --3.790279 - 32 -0.000489 - 13 -0.762000 - 23 --3.790279 - 33 -0.000489 - 62 -4 - 0 -3DFACE - 8 -0 - 10 -0.762000 - 20 --3.790279 - 30 -0.000489 - 11 -0.000000 - 21 --3.942679 - 31 -0.610089 - 12 -0.000000 - 22 --3.028280 - 32 -1.524489 - 13 -0.000000 - 23 --3.028280 - 33 -1.524489 - 62 -4 - 0 -3DFACE - 8 -0 - 10 -0.000031 - 20 --5.353721 - 30 -0.000704 - 11 -3.631692 - 21 -3.455000 - 31 -0.018325 - 12 -1.589602 - 22 -1.595716 - 32 -0.012271 - 13 -1.589602 - 23 -1.595716 - 33 -0.012271 - 62 -4 - 0 -3DFACE - 8 -0 - 10 -0.000000 - 20 --3.028280 - 30 -1.524489 - 11 -0.000000 - 21 -2.000921 - 31 -0.610089 - 12 -0.000011 - 22 -3.729320 - 32 -0.000000 - 13 -0.000011 - 23 -3.729320 - 33 -0.000000 - 62 -0 - 0 -3DFACE - 8 -0 - 10 -1.219200 - 20 -5.353721 - 30 -1.676889 - 11 -0.000011 - 21 -3.729320 - 31 -0.000000 - 12 -1.219200 - 22 -4.439321 - 32 -1.676889 - 13 -1.219200 - 23 -4.439321 - 33 -1.676889 - 62 -3 - 0 -3DFACE - 8 -0 - 10 -1.524000 - 20 --2.266279 - 30 -0.000489 - 11 -3.631692 - 21 -3.455000 - 31 -0.018325 - 12 -3.936492 - 22 -3.150200 - 32 -0.018417 - 13 -3.936492 - 23 -3.150200 - 33 -0.018417 - 62 -4 - 0 -3DFACE - 8 -0 - 10 -1.828800 - 20 --0.437479 - 30 -0.000489 - 11 -1.371600 - 21 -1.238921 - 31 -0.610089 - 12 -1.589602 - 22 -1.595716 - 32 -0.012271 - 13 -1.589602 - 23 -1.595716 - 33 -0.012271 - 62 -3 - 0 -3DFACE - 8 -0 - 10 -1.524000 - 20 --2.266279 - 30 -0.000489 - 11 -1.219200 - 21 --1.809079 - 31 -0.610089 - 12 -1.828800 - 22 --0.437479 - 32 -0.000489 - 13 -1.828800 - 23 --0.437479 - 33 -0.000489 - 62 -4 - 0 -3DFACE - 8 -0 - 10 -1.371600 - 20 --0.437479 - 30 -0.610089 - 11 -0.762000 - 21 --0.589879 - 31 -0.914889 - 12 -1.371600 - 22 -1.238921 - 32 -0.610089 - 13 -1.371600 - 23 -1.238921 - 33 -0.610089 - 62 -4 - 0 -3DFACE - 8 -0 - 10 -0.762000 - 20 --2.266279 - 30 -0.610089 - 11 -0.762000 - 21 --0.589879 - 31 -0.914889 - 12 -1.219200 - 22 --1.809079 - 32 -0.610089 - 13 -1.219200 - 23 --1.809079 - 33 -0.610089 - 62 -4 - 0 -3DFACE - 8 -0 - 10 -0.944880 - 20 --2.571079 - 30 -0.000489 - 11 -0.762000 - 21 --2.266279 - 31 -0.610089 - 12 -1.524000 - 22 --2.266279 - 32 -0.000489 - 13 -1.524000 - 23 --2.266279 - 33 -0.000489 - 62 -4 - 0 -3DFACE - 8 -0 - 10 -1.371600 - 20 -1.238921 - 30 -0.610089 - 11 -1.467700 - 21 -2.235796 - 31 -0.010004 - 12 -1.589602 - 22 -1.595716 - 32 -0.012271 - 13 -1.589602 - 23 -1.595716 - 33 -0.012271 - 62 -4 - 0 -3DFACE - 8 -0 - 10 -0.000031 - 20 --5.353721 - 30 -0.000704 - 11 -3.631692 - 21 -3.455000 - 31 -0.018325 - 12 -1.589602 - 22 -1.595716 - 32 -0.012271 - 13 -1.589602 - 23 -1.595716 - 33 -0.012271 - 62 -4 - 0 -3DFACE - 8 -0 - 10 -1.219200 - 20 -5.353721 - 30 -1.676889 - 11 -1.219200 - 21 -4.439321 - 31 -1.676889 - 12 -0.000011 - 22 -3.729320 - 32 -0.000000 - 13 -0.000011 - 23 -3.729320 - 33 -0.000000 - 62 -4 - 0 -3DFACE - 8 -0 - 10 --0.762000 - 20 --3.790279 - 30 -0.000489 - 11 --1.524000 - 21 --2.266279 - 31 -0.000489 - 12 --0.944880 - 22 --2.571079 - 32 -0.000489 - 13 --0.944880 - 23 --2.571079 - 33 -0.000489 - 62 -4 - 0 -3DFACE - 8 -0 - 10 -0.000031 - 20 --5.353721 - 30 -0.000704 - 11 --0.762000 - 21 --3.790279 - 31 -0.000489 - 12 -0.000000 - 22 --3.942679 - 32 -0.610089 - 13 -0.000000 - 23 --3.942679 - 33 -0.610089 - 62 -4 - 0 -3DFACE - 8 -0 - 10 -0.000000 - 20 --3.028280 - 30 -1.524489 - 11 -0.000000 - 21 -2.000921 - 31 -0.610089 - 12 -0.000011 - 22 -3.729320 - 32 -0.000000 - 13 -0.000011 - 23 -3.729320 - 33 -0.000000 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --1.371600 - 20 -1.238921 - 30 -0.610089 - 11 -0.000000 - 21 -2.000921 - 31 -0.610089 - 12 -0.000000 - 22 --3.028280 - 32 -1.524489 - 13 -0.000000 - 23 --3.028280 - 33 -1.524489 - 62 -4 - 0 -3DFACE - 8 -0 - 10 -0.000011 - 20 -3.729320 - 30 -0.000000 - 11 -0.000000 - 21 -2.000921 - 31 -0.610089 - 12 --1.467700 - 22 -2.235796 - 32 -0.010004 - 13 --1.467700 - 23 -2.235796 - 33 -0.010004 - 62 -3 - 0 -3DFACE - 8 -0 - 10 -0.000000 - 20 --3.028280 - 30 -1.524489 - 11 --0.762000 - 21 --3.790279 - 31 -0.000489 - 12 --1.371600 - 22 -1.238921 - 32 -0.610089 - 13 --1.371600 - 23 -1.238921 - 33 -0.610089 - 62 -4 - 0 -3DFACE - 8 -0 - 10 --0.762000 - 20 --3.790279 - 30 -0.000489 - 11 -0.000000 - 21 --3.028280 - 31 -1.524489 - 12 -0.000000 - 22 --3.942679 - 32 -0.610089 - 13 -0.000000 - 23 --3.942679 - 33 -0.610089 - 62 -4 - 0 -3DFACE - 8 -0 - 10 -0.000031 - 20 --5.353721 - 30 -0.000704 - 11 --1.589602 - 21 -1.595716 - 31 -0.012271 - 12 --3.936492 - 22 -3.150200 - 32 -0.018417 - 13 --3.936492 - 23 -3.150200 - 33 -0.018417 - 62 -4 - 0 -3DFACE - 8 -0 - 10 -0.000000 - 20 --3.028280 - 30 -1.524489 - 11 -0.000011 - 21 -3.729320 - 31 -0.000000 - 12 -0.000000 - 22 -2.000921 - 32 -0.610089 - 13 -0.000000 - 23 -2.000921 - 33 -0.610089 - 62 -0 - 0 -3DFACE - 8 -0 - 10 --1.219200 - 20 -5.353721 - 30 -1.676889 - 11 --1.219200 - 21 -4.439321 - 31 -1.676889 - 12 -0.000011 - 22 -3.729320 - 32 -0.000000 - 13 -0.000011 - 23 -3.729320 - 33 -0.000000 - 62 -3 - 0 -3DFACE - 8 -0 - 10 --1.524000 - 20 --2.266279 - 30 -0.000489 - 11 --3.631692 - 21 -3.455000 - 31 -0.018325 - 12 --1.828800 - 22 --0.437479 - 32 -0.000489 - 13 --1.828800 - 23 --0.437479 - 33 -0.000489 - 62 -4 - 0 -3DFACE - 8 -0 - 10 --1.828800 - 20 --0.437479 - 30 -0.000489 - 11 --1.371600 - 21 -1.238921 - 31 -0.610089 - 12 --1.371600 - 22 --0.437479 - 32 -0.610089 - 13 --1.371600 - 23 --0.437479 - 33 -0.610089 - 62 -4 - 0 -3DFACE - 8 -0 - 10 --1.524000 - 20 --2.266279 - 30 -0.000489 - 11 --1.828800 - 21 --0.437479 - 31 -0.000489 - 12 --1.219200 - 22 --1.809079 - 32 -0.610089 - 13 --1.219200 - 23 --1.809079 - 33 -0.610089 - 62 -4 - 0 -3DFACE - 8 -0 - 10 --1.371600 - 20 --0.437479 - 30 -0.610089 - 11 --1.371600 - 21 -1.238921 - 31 -0.610089 - 12 --0.762000 - 22 --0.589879 - 32 -0.914889 - 13 --0.762000 - 23 --0.589879 - 33 -0.914889 - 62 -4 - 0 -3DFACE - 8 -0 - 10 --0.762000 - 20 --2.266279 - 30 -0.610089 - 11 --1.219200 - 21 --1.809079 - 31 -0.610089 - 12 --0.762000 - 22 --0.589879 - 32 -0.914889 - 13 --0.762000 - 23 --0.589879 - 33 -0.914889 - 62 -4 - 0 -3DFACE - 8 -0 - 10 --0.944880 - 20 --2.571079 - 30 -0.000489 - 11 --1.524000 - 21 --2.266279 - 31 -0.000489 - 12 --0.762000 - 22 --2.266279 - 32 -0.610089 - 13 --0.762000 - 23 --2.266279 - 33 -0.610089 - 62 -4 - 0 -3DFACE - 8 -0 - 10 --1.371600 - 20 -1.238921 - 30 -0.610089 - 11 --1.589602 - 21 -1.595716 - 31 -0.012271 - 12 --1.467700 - 22 -2.235796 - 32 -0.010004 - 13 --1.467700 - 23 -2.235796 - 33 -0.010004 - 62 -0 - 0 -3DFACE - 8 -0 - 10 -0.000031 - 20 --5.353721 - 30 -0.000704 - 11 --1.589602 - 21 -1.595716 - 31 -0.012271 - 12 --3.936492 - 22 -3.150200 - 32 -0.018417 - 13 --3.936492 - 23 -3.150200 - 33 -0.018417 - 62 -4 - 0 -3DFACE - 8 -0 - 10 --1.219200 - 20 -5.353721 - 30 -1.676889 - 11 -0.000011 - 21 -3.729320 - 31 -0.000000 - 12 --1.219200 - 22 -4.439321 - 32 -1.676889 - 13 --1.219200 - 23 -4.439321 - 33 -1.676889 - 62 -1 - 0 -3DFACE - 8 -0 - 10 -0.000000 - 20 -2.000921 - 30 -0.610089 - 11 -1.467700 - 21 -2.235796 - 31 -0.010004 - 12 -1.371600 - 22 -1.238921 - 32 -0.610089 - 13 -1.371600 - 23 -1.238921 - 33 -0.610089 - 62 -3 - 0 -3DFACE - 8 -0 - 10 -0.762000 - 20 --3.790279 - 30 -0.000489 - 11 -1.371600 - 21 -1.238921 - 31 -0.610089 - 12 -1.589602 - 22 -1.595716 - 32 -0.012271 - 13 -1.589602 - 23 -1.595716 - 33 -0.012271 - 62 -3 - 0 -3DFACE - 8 -0 - 10 -3.936492 - 20 -3.150200 - 30 -0.018417 - 11 -0.000031 - 21 --5.353721 - 31 -0.000704 - 12 -3.936492 - 22 -2.723480 - 32 -0.018509 - 13 -3.936492 - 23 -2.723480 - 33 -0.018509 - 62 -4 - 0 -3DFACE - 8 -0 - 10 -0.000011 - 20 -3.729320 - 30 -0.000000 - 11 -1.589602 - 21 -1.595716 - 31 -0.012271 - 12 -1.467700 - 22 -2.235796 - 32 -0.010004 - 13 -1.467700 - 23 -2.235796 - 33 -0.010004 - 62 -4 - 0 -3DFACE - 8 -0 - 10 -3.631692 - 20 -3.455000 - 30 -0.018325 - 11 -0.000031 - 21 --5.353721 - 31 -0.000704 - 12 -3.936492 - 22 -3.150200 - 32 -0.018417 - 13 -3.936492 - 23 -3.150200 - 33 -0.018417 - 62 -3 - 0 -3DFACE - 8 -0 - 10 -0.000031 - 20 --5.353721 - 30 -0.000704 - 11 -1.589602 - 21 -1.595716 - 31 -0.012271 - 12 -0.000011 - 22 -3.729320 - 32 -0.000000 - 13 -0.000011 - 23 -3.729320 - 33 -0.000000 - 62 -4 - 0 -3DFACE - 8 -0 - 10 -1.219200 - 20 -4.439321 - 30 -1.676889 - 11 -0.000011 - 21 -3.729320 - 31 -0.000000 - 12 -0.304800 - 22 -2.427640 - 32 -0.396729 - 13 -0.304800 - 23 -2.427640 - 33 -0.396729 - 62 -2 - 0 -3DFACE - 8 -0 - 10 -3.631692 - 20 -3.455000 - 30 -0.018325 - 11 -1.828800 - 21 --0.437479 - 31 -0.000489 - 12 -1.589602 - 22 -1.595716 - 32 -0.012271 - 13 -1.589602 - 23 -1.595716 - 33 -0.012271 - 62 -4 - 0 -3DFACE - 8 -0 - 10 -1.524000 - 20 --2.266279 - 30 -0.000489 - 11 -3.936492 - 21 -3.150200 - 31 -0.018417 - 12 -3.936492 - 22 -2.723480 - 32 -0.018509 - 13 -3.936492 - 23 -2.723480 - 33 -0.018509 - 62 -2 - 0 -3DFACE - 8 -0 - 10 -3.631692 - 20 -3.455000 - 30 -0.018325 - 11 -1.524000 - 21 --2.266279 - 31 -0.000489 - 12 -1.828800 - 22 --0.437479 - 32 -0.000489 - 13 -1.828800 - 23 --0.437479 - 33 -0.000489 - 62 -4 - 0 -3DFACE - 8 -0 - 10 -1.371600 - 20 -1.238921 - 30 -0.610089 - 11 -1.828800 - 21 --0.437479 - 31 -0.000489 - 12 -1.371600 - 22 --0.437479 - 32 -0.610089 - 13 -1.371600 - 23 --0.437479 - 33 -0.610089 - 62 -3 - 0 -3DFACE - 8 -0 - 10 -1.828800 - 20 --0.437479 - 30 -0.000489 - 11 -1.219200 - 21 --1.809079 - 31 -0.610089 - 12 -1.371600 - 22 --0.437479 - 32 -0.610089 - 13 -1.371600 - 23 --0.437479 - 33 -0.610089 - 62 -3 - 0 -3DFACE - 8 -0 - 10 -1.219200 - 20 --1.809079 - 30 -0.610089 - 11 -0.762000 - 21 --0.589879 - 31 -0.914889 - 12 -1.371600 - 22 --0.437479 - 32 -0.610089 - 13 -1.371600 - 23 --0.437479 - 33 -0.610089 - 62 -3 - 0 -3DFACE - 8 -0 - 10 -1.524000 - 20 --2.266279 - 30 -0.000489 - 11 -0.762000 - 21 --2.266279 - 31 -0.610089 - 12 -1.219200 - 22 --1.809079 - 32 -0.610089 - 13 -1.219200 - 23 --1.809079 - 33 -0.610089 - 62 -4 - 0 -3DFACE - 8 -0 - 10 -3.936492 - 20 -3.150200 - 30 -0.018417 - 11 -0.000031 - 21 --5.353721 - 31 -0.000704 - 12 -3.936492 - 22 -2.723480 - 32 -0.018509 - 13 -3.936492 - 23 -2.723480 - 33 -0.018509 - 62 -3 - 0 -3DFACE - 8 -0 - 10 -0.000011 - 20 -3.729320 - 30 -0.000000 - 11 -1.589602 - 21 -1.595716 - 31 -0.012271 - 12 -1.467700 - 22 -2.235796 - 32 -0.010004 - 13 -1.467700 - 23 -2.235796 - 33 -0.010004 - 62 -4 - 0 -3DFACE - 8 -0 - 10 -3.631692 - 20 -3.455000 - 30 -0.018325 - 11 -0.000031 - 21 --5.353721 - 31 -0.000704 - 12 -3.936492 - 22 -3.150200 - 32 -0.018417 - 13 -3.936492 - 23 -3.150200 - 33 -0.018417 - 62 -4 - 0 -3DFACE - 8 -0 - 10 -0.000031 - 20 --5.353721 - 30 -0.000704 - 11 -1.589602 - 21 -1.595716 - 31 -0.012271 - 12 -0.000011 - 22 -3.729320 - 32 -0.000000 - 13 -0.000011 - 23 -3.729320 - 33 -0.000000 - 62 -4 - 0 -3DFACE - 8 -0 - 10 -0.000011 - 20 -3.729320 - 30 -0.000000 - 11 -1.219200 - 21 -4.439321 - 31 -1.676889 - 12 -0.304800 - 22 -2.427640 - 32 -0.396729 - 13 -0.304800 - 23 -2.427640 - 33 -0.396729 - 62 -3 - 0 -3DFACE - 8 -0 - 10 --1.467700 - 20 -2.235796 - 30 -0.010004 - 11 -0.000000 - 21 -2.000921 - 31 -0.610089 - 12 --1.371600 - 22 -1.238921 - 32 -0.610089 - 13 --1.371600 - 23 -1.238921 - 33 -0.610089 - 62 -4 - 0 -3DFACE - 8 -0 - 10 --1.371600 - 20 -1.238921 - 30 -0.610089 - 11 --0.762000 - 21 --3.790279 - 31 -0.000489 - 12 --1.589602 - 22 -1.595716 - 32 -0.012271 - 13 --1.589602 - 23 -1.595716 - 33 -0.012271 - 62 -4 - 0 -3DFACE - 8 -0 - 10 --1.467700 - 20 -2.235796 - 30 -0.010004 - 11 -0.000031 - 21 --5.353721 - 31 -0.000704 - 12 -0.000011 - 22 -3.729320 - 32 -0.000000 - 13 -0.000011 - 23 -3.729320 - 33 -0.000000 - 62 -4 - 0 -3DFACE - 8 -0 - 10 --3.936492 - 20 -3.150200 - 30 -0.018417 - 11 --1.589602 - 21 -1.595716 - 31 -0.012271 - 12 --3.631692 - 22 -3.455000 - 32 -0.018325 - 13 --3.631692 - 23 -3.455000 - 33 -0.018325 - 62 -3 - 0 -3DFACE - 8 -0 - 10 --1.589602 - 20 -1.595716 - 30 -0.012271 - 11 -0.000031 - 21 --5.353721 - 31 -0.000704 - 12 --1.467700 - 22 -2.235796 - 32 -0.010004 - 13 --1.467700 - 23 -2.235796 - 33 -0.010004 - 62 -4 - 0 -3DFACE - 8 -0 - 10 -0.000031 - 20 --5.353721 - 30 -0.000704 - 11 --3.936492 - 21 -3.150200 - 31 -0.018417 - 12 --3.936492 - 22 -2.723480 - 32 -0.018509 - 13 --3.936492 - 23 -2.723480 - 33 -0.018509 - 62 -4 - 0 -3DFACE - 8 -0 - 10 -0.000011 - 20 -3.729320 - 30 -0.000000 - 11 --1.219200 - 21 -4.439321 - 31 -1.676889 - 12 --0.304800 - 22 -2.427640 - 32 -0.396729 - 13 --0.304800 - 23 -2.427640 - 33 -0.396729 - 62 -4 - 0 -3DFACE - 8 -0 - 10 --3.936492 - 20 -3.150200 - 30 -0.018417 - 11 --1.524000 - 21 --2.266279 - 31 -0.000489 - 12 --3.936492 - 22 -2.723480 - 32 -0.018509 - 13 --3.936492 - 23 -2.723480 - 33 -0.018509 - 62 -4 - 0 -3DFACE - 8 -0 - 10 --1.828800 - 20 --0.437479 - 30 -0.000489 - 11 --3.631692 - 21 -3.455000 - 31 -0.018325 - 12 --1.589602 - 22 -1.595716 - 32 -0.012271 - 13 --1.589602 - 23 -1.595716 - 33 -0.012271 - 62 -4 - 0 -3DFACE - 8 -0 - 10 --3.631692 - 20 -3.455000 - 30 -0.018325 - 11 --1.524000 - 21 --2.266279 - 31 -0.000489 - 12 --3.936492 - 22 -3.150200 - 32 -0.018417 - 13 --3.936492 - 23 -3.150200 - 33 -0.018417 - 62 -4 - 0 -3DFACE - 8 -0 - 10 --1.371600 - 20 -1.238921 - 30 -0.610089 - 11 --1.828800 - 21 --0.437479 - 31 -0.000489 - 12 --1.589602 - 22 -1.595716 - 32 -0.012271 - 13 --1.589602 - 23 -1.595716 - 33 -0.012271 - 62 -4 - 0 -3DFACE - 8 -0 - 10 --1.219200 - 20 --1.809079 - 30 -0.610089 - 11 --1.828800 - 21 --0.437479 - 31 -0.000489 - 12 --1.371600 - 22 --0.437479 - 32 -0.610089 - 13 --1.371600 - 23 --0.437479 - 33 -0.610089 - 62 -4 - 0 -3DFACE - 8 -0 - 10 --0.762000 - 20 --0.589879 - 30 -0.914889 - 11 --1.219200 - 21 --1.809079 - 31 -0.610089 - 12 --1.371600 - 22 --0.437479 - 32 -0.610089 - 13 --1.371600 - 23 --0.437479 - 33 -0.610089 - 62 -4 - 0 -3DFACE - 8 -0 - 10 --0.762000 - 20 --2.266279 - 30 -0.610089 - 11 --1.524000 - 21 --2.266279 - 31 -0.000489 - 12 --1.219200 - 22 --1.809079 - 32 -0.610089 - 13 --1.219200 - 23 --1.809079 - 33 -0.610089 - 62 -4 - 0 -3DFACE - 8 -0 - 10 --1.467700 - 20 -2.235796 - 30 -0.010004 - 11 -0.000031 - 21 --5.353721 - 31 -0.000704 - 12 -0.000011 - 22 -3.729320 - 32 -0.000000 - 13 -0.000011 - 23 -3.729320 - 33 -0.000000 - 62 -4 - 0 -3DFACE - 8 -0 - 10 --3.936492 - 20 -3.150200 - 30 -0.018417 - 11 --1.589602 - 21 -1.595716 - 31 -0.012271 - 12 --3.631692 - 22 -3.455000 - 32 -0.018325 - 13 --3.631692 - 23 -3.455000 - 33 -0.018325 - 62 -3 - 0 -3DFACE - 8 -0 - 10 --1.589602 - 20 -1.595716 - 30 -0.012271 - 11 -0.000031 - 21 --5.353721 - 31 -0.000704 - 12 --1.467700 - 22 -2.235796 - 32 -0.010004 - 13 --1.467700 - 23 -2.235796 - 33 -0.010004 - 62 -4 - 0 -3DFACE - 8 -0 - 10 -0.000031 - 20 --5.353721 - 30 -0.000704 - 11 --3.936492 - 21 -3.150200 - 31 -0.018417 - 12 --3.936492 - 22 -2.723480 - 32 -0.018509 - 13 --3.936492 - 23 -2.723480 - 33 -0.018509 - 62 -2 - 0 -3DFACE - 8 -0 - 10 --1.219200 - 20 -4.439321 - 30 -1.676889 - 11 -0.000011 - 21 -3.729320 - 31 -0.000000 - 12 --0.304800 - 22 -2.427640 - 32 -0.396729 - 13 --0.304800 - 23 -2.427640 - 33 -0.396729 - 62 -3 - 0 -ENDSEC - 0 -EOF diff -Nru acm-5.0/objects/f16.obv acm-6.0+20200416/objects/f16.obv --- acm-5.0/objects/f16.obv 1998-08-14 02:26:43.000000000 +0000 +++ acm-6.0+20200416/objects/f16.obv 1970-01-01 00:00:00.000000000 +0000 @@ -1,144 +0,0 @@ -F-16-fighter -130 12 -1 -18.165 0 0 -2 -18.165 -1.191 0 -3 -15.187 -2.085 0 -4 -13.698 -2.382 0 -5 -17.272 -2.382 0 -6 -17.272 -3.573 0 -7 -10.923 -3.573 0 -8 -4.169 -3.573 0 -9 -4.169 -4.765 0 -10 5.598 -4.765 0 -11 18.463 -2.144 0 -12 18.939 -1.787 0 -13 22.274 -1.489 0 -14 24.895 -1.191 0 -15 27.992 0 0 -16 -6.551 -3.573 0 -17 -6.551 -15.485 0 -18 0.357 -15.485 0 -19 0.357 -15.187 0 -20 -2.978 -15.008 0 -21 5.598 -4.765 0 -22 -4.169 -4.765 0 -23 -4.169 -3.573 0 -24 -17.272 -3.573 0 -25 -17.272 -8.934 0.893 -26 -15.187 -8.934 0.893 -27 -10.923 -3.573 0 -28 27.992 0 0 -29 24.895 1.191 0 -30 22.274 1.489 0 -31 18.939 1.787 0 -32 18.463 2.144 0 -33 5.598 4.765 0 -34 -4.169 4.765 0 -35 -4.169 3.573 0 -36 -10.923 3.573 0 -37 -17.272 3.573 0 -38 -17.272 2.382 0 -39 -13.698 2.382 0 -40 -15.187 2.085 0 -41 -18.165 1.191 0 -42 -18.165 0 0 -43 5.598 4.765 0 -44 -2.978 15.008 0 -45 0.357 15.187 0 -46 0.357 15.485 0 -47 -6.551 15.485 0 -48 -6.551 3.573 0 -49 -4.169 3.573 0 -50 -4.169 4.765 0 -51 -10.923 3.573 0 -52 -15.187 8.934 0.893 -53 -17.272 8.934 0.893 -54 -17.272 3.573 0 -55 27.992 0 0 -56 23.525 0 -1.191 -57 17.272 0 -2.382 -58 15.783 0 -3.812 -59 13.996 0 -4.169 -60 11.316 0 -4.05 -61 8.338 0 -3.335 -62 1.787 0 -2.382 -63 -4.169 0 -2.382 -64 -13.936 0 -1.906 -65 -15.128 0 -1.906 -66 -15.187 0 -1.787 -67 -18.165 0 -1.191 -68 -18.165 0 0 -69 -4.169 0 -2.382 -70 -10.125 0 -4.05 -71 -15.783 0 -10.482 -72 -19.654 0 -10.482 -73 -19.654 0 -9.529 -74 -19.654 0 -9.529 -75 -16.378 0 -3.573 -76 -16.378 0 -2.144 -77 -14.889 0 -2.382 -78 -13.936 0 -2.382 -79 -13.936 0 -1.906 -80 -18.165 0 0 -81 -18.165 0 1.191 -82 -15.187 0 2.085 -83 -13.698 0 2.263 -84 -2.68 0 2.382 -85 8.04 0 2.382 -86 12.507 0 2.263 -87 12.507 0 0.596 -88 19.952 0 0.596 -89 23.525 0 0.476 -90 27.992 0 0 -91 -3.551 0 -2.382 -92 -3.551 -3.871 -0.10 -93 -3.551 -15.485 0 -94 -3.551 -15.485 0.1065 -95 -3.551 -3.871 0.142 -96 -3.551 -2.58 0.2556 -97 -3.551 -2.387 1.818 -98 -3.551 -2.102 2.015 -99 -3.551 -1.03 2.251 -100 -3.551 0 2.282 -101 -3.551 1.03 2.251 -102 -3.551 2.102 2.015 -103 -3.551 2.387 1.818 -104 -3.551 2.58 0.2556 -105 -3.551 3.871 0.142 -106 -3.551 15.485 0.1065 -107 -3.551 15.485 0 -108 -3.551 3.871 -0.10 -109 13.996 0 -4.169 -110 13.996 -0.8932 -3.692 -111 13.996 -1.191 -2.978 -112 13.996 -1.251 -2.502 -113 13.996 -1.787 -1.311 -114 13.996 -3.054 0 -115 13.996 -1.583 0.3568 -116 13.996 0 0.596 -117 13.996 1.583 0.3568 -118 13.996 3.054 0 -119 13.996 1.787 -1.311 -120 13.996 1.251 -2.502 -121 13.996 1.191 -2.978 -122 13.996 0.8932 -3.692 -123 -18.165 1.191 0 -124 -18.165 0.842 0.842 -125 -18.165 0 1.191 -126 -18.165 -0.842 0.842 -127 -18.165 -1.191 0 -128 -18.165 -0.842 -0.842 -129 -18.165 0 -1.191 -130 -18.165 0.842 -0.842 -gray44 14 109 110 111 112 113 114 115 116 117 118 119 120 121 122 -gray44 18 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 -gray44 15 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 -(gray44 gray40) 8 16 17 18 19 20 21 22 23 -(gray44 gray40) 4 24 25 26 27 -gray44 15 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 -(gray40 gray44) 8 43 44 45 46 47 48 49 50 -(gray44 gray40) 4 51 52 53 54 -gray44 14 55 56 57 58 59 60 61 62 63 64 65 66 67 68 -gray44 11 69 70 71 72 73 74 75 76 77 78 79 -gray44 11 80 81 82 83 84 85 86 87 88 89 90 -(black gray44) 8 123 124 125 126 127 128 129 130 diff -Nru acm-5.0/objects/f18.obv acm-6.0+20200416/objects/f18.obv --- acm-5.0/objects/f18.obv 1998-08-14 02:26:46.000000000 +0000 +++ acm-6.0+20200416/objects/f18.obv 1970-01-01 00:00:00.000000000 +0000 @@ -1,204 +0,0 @@ -F-18-RBR -180 22 -1 -19.9856 -1.71 1.60312 -2 -13.3594 -1.71 2.24437 -3 0.534375 -1.71 1.81688 -4 1.38938 -1.71 1.60312 -5 1.60312 -1.71 -0.748125 -6 -0.320625 -1.71 -1.38938 -7 -5.66437 -1.71 -1.81688 -8 -12.2906 -1.71 -2.24437 -9 -18.7031 -1.71 -2.03063 -10 -22.3369 -1.71 -1.92375 -11 -23.6194 -1.71 -1.49625 -12 -23.6194 -1.71 0.4275 -13 -23.6194 1.71 0.4275 -14 -23.6194 1.71 -1.49625 -15 -22.3369 1.71 -1.92375 -16 -18.7031 1.71 -2.03063 -17 -12.2906 1.71 -2.24437 -18 -5.66437 1.71 -1.81688 -19 -0.320625 1.71 -1.38938 -20 1.60312 1.71 -0.748125 -21 1.38938 1.71 1.60312 -22 0.534375 1.71 1.81688 -23 -13.3594 1.71 2.24437 -24 -19.9856 1.71 1.60312 -25 1.2825 0 0 -26 2.03063 -3.63375 0 -27 -19.1306 -3.8475 0 -28 -21.6956 -3.42 0 -29 -23.6194 -2.565 0 -30 -23.6194 -1.06875 0 -31 -21.6956 0 0 -32 -21.6956 0 0 -33 -23.6194 1.06875 0 -34 -23.6194 2.565 0 -35 -21.6956 3.42 0 -36 -19.1306 3.8475 0 -37 2.03063 3.63375 0 -38 1.2825 0 0 -39 -10.7944 -18.3825 -0.162309 -40 -11.4356 -2.9925 -1.2825 -41 1.60312 -4.06125 -1.2825 -42 -4.80938 -18.1687 -0.21375 -43 -4.80938 18.1687 -0.21375 -44 1.60312 4.06125 -1.2825 -45 -11.4356 2.9925 -1.2825 -46 -10.7944 18.3825 -0.162309 -47 18.9169 1.71 -2.35125 -48 17.4206 2.77875 -2.1375 -49 14.4281 3.20625 -1.92375 -50 11.6494 3.42 -1.74817 -51 7.37437 4.06125 -1.439 -52 4.59563 4.48875 -1.2367 -53 1.38938 4.7025 -1.03821 -54 -11.4356 3.52687 -0.498114 -55 -13.7869 1.06875 -0.67942 -56 -13.7869 -1.06875 -0.67942 -57 -11.4356 -3.52687 -0.498114 -58 1.38938 -4.7025 -1.03821 -59 4.59563 -4.48875 -1.2367 -60 7.37437 -4.06125 -1.439 -61 11.6494 -3.42 -1.74817 -62 14.4281 -3.20625 -1.92375 -63 17.4206 -2.77875 -2.1375 -64 18.9169 -1.71 -2.35125 -65 -13.68 -2.77875 0 -66 -15.8175 -4.48875 0 -67 -14.7487 -4.48875 0 -68 -22.23 -10.6875 0 -69 -24.795 -10.4737 0 -70 -25.2225 -10.0463 0 -71 -25.4363 -9.19125 0 -72 -22.4437 -3.42 0 -73 -21.8025 -3.20625 0 -74 -21.8025 3.20625 0 -75 -22.4437 3.42 0 -76 -25.4363 9.19125 0 -77 -25.2225 10.0463 0 -78 -24.795 10.4737 0 -79 -22.23 10.6875 0 -80 -14.7487 4.48875 0 -81 -15.8175 4.48875 0 -82 -13.68 2.77875 0 -83 -21.4819 0 0 -84 -14.8556 -0.855 0 -85 -6.09187 -1.49625 0 -86 4.59563 -1.92375 0 -87 19.5581 -1.71 0 -88 22.7644 -1.71 0 -89 26.6119 -1.49625 0 -90 29.1769 -0.855 0 -91 30.0319 0 0 -92 30.0319 0 0 -93 29.1769 0.855 0 -94 26.6119 1.49625 0 -95 22.7644 1.71 0 -96 19.5581 1.71 0 -97 4.59563 1.92375 0 -98 -6.09187 1.49625 0 -99 -14.8556 0.855 0 -100 -21.4819 0 0 -101 -13.68 -2.77875 0 -102 -15.8175 -4.48875 0 -103 -14.7487 -4.48875 0 -104 -22.23 -10.6875 0 -105 -24.795 -10.4737 0 -106 -25.2225 -10.0463 0 -107 -25.4363 -9.19125 0 -108 -22.4437 -3.42 0 -109 -21.8025 -3.20625 0 -110 -21.8025 3.20625 0 -111 -22.4437 3.42 0 -112 -25.4363 9.19125 0 -113 -25.2225 10.0463 0 -114 -24.795 10.4737 0 -115 -22.23 10.6875 0 -116 -14.7487 4.48875 0 -117 -15.8175 4.48875 0 -118 -13.68 2.77875 0 -119 30.5663 0 0.106875 -120 28.0012 0 0.748125 -121 25.65 0 1.17562 -122 20.9475 0 1.17562 -123 4.48875 0 1.17562 -124 -20.7338 0 0.534375 -125 -21.1612 0 -0.534375 -126 30.5663 0 0.106875 -127 28.4288 0 -1.38938 -128 25.2225 0 -2.03063 -129 20.0925 0 -3.09937 -130 15.8175 0 -5.02313 -131 12.3975 0 -5.66437 -132 10.0463 0 -5.45062 -133 7.90875 0 -5.02313 -134 4.06125 0 -4.38187 -135 -1.49625 0 -3.95437 -136 -7.90875 0 -3.31312 -137 -21.5888 0 -0.534375 -138 -21.5888 0 -0.106875 -139 -16.8863 3.43518 -1.81688 -140 -18.1687 5.77125 -9.405 -141 -14.9625 5.77125 -9.61875 -142 -8.1225 3.42 -2.35125 -143 -8.1225 -3.42 -2.35125 -144 -14.9625 -5.77125 -9.61875 -145 -18.1687 -5.77125 -9.405 -146 -16.8863 -3.43518 -1.81688 -147 -3.31312 0.21375 1.38938 -148 -3.31312 -1.2825 2.03063 -149 -3.31312 -3.42 1.81688 -150 -3.31312 -4.06125 0.748125 -151 -3.31312 -4.06125 -0.748125 -152 -3.31312 -4.48875 -1.17562 -153 -3.31312 -3.20625 -1.81688 -154 -3.31312 -1.92375 -2.45812 -155 -3.31312 0 -3.09937 -156 -3.31312 0 -3.09937 -157 -3.31312 1.92375 -2.45812 -158 -3.31312 3.20625 -1.81688 -159 -3.31312 4.48875 -1.17562 -160 -3.31312 4.06125 -0.748125 -161 -3.31312 4.06125 0.748125 -162 -3.31312 3.42 1.81688 -163 -3.31312 1.2825 2.03063 -164 -3.31312 -0.21375 1.38938 -165 12.5044 0 1.38938 -166 12.2906 -1.06875 1.17562 -167 12.0769 -2.1375 0.106875 -168 12.0341 -2.35125 -1.17562 -169 12.1196 -1.92375 -2.24437 -170 12.1624 -1.71 -3.31312 -171 12.3334 -0.855 -4.38187 -172 12.5044 0 -5.02313 -173 12.5044 0 -5.02313 -174 12.3334 0.855 -4.38187 -175 12.1624 1.71 -3.31312 -176 12.1196 1.92375 -2.24437 -177 12.0341 2.35125 -1.17562 -178 12.0769 2.1375 0.106875 -179 12.2906 1.06875 1.17562 -180 12.5044 0 1.38938 -gray44 12 1 2 3 4 5 6 7 8 9 10 11 12 -gray44 12 13 14 15 16 17 18 19 20 21 22 23 24 -gray44 7 25 26 27 28 29 30 31 -gray44 7 32 33 34 35 36 37 38 -gray44 4 39 40 41 42 -gray44 4 43 44 45 46 -gray44 9 47 48 49 50 51 52 53 54 55 -gray44 9 56 57 58 59 60 61 62 63 64 -gray44 9 65 66 67 68 69 70 71 72 73 -gray44 9 74 75 76 77 78 79 80 81 82 -gray44 9 83 84 85 86 87 88 89 90 91 -gray44 9 92 93 94 95 96 97 98 99 100 -gray44 9 101 102 103 104 105 106 107 108 109 -gray44 9 110 111 112 113 114 115 116 117 118 -gray44 7 119 120 121 122 123 124 125 -gray44 13 126 127 128 129 130 131 132 133 134 135 136 137 138 -gray44 4 139 140 141 142 -gray44 4 143 144 145 146 -gray44 9 147 148 149 150 151 152 153 154 155 -gray44 9 156 157 158 159 160 161 162 163 164 -gray44 8 165 166 167 168 169 170 171 172 -gray44 8 173 174 175 176 177 178 179 180 diff -Nru acm-5.0/objects/features/hangar.obv acm-6.0+20200416/objects/features/hangar.obv --- acm-5.0/objects/features/hangar.obv 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/objects/features/hangar.obv 2006-01-05 13:58:55.000000000 +0000 @@ -0,0 +1,64 @@ +object +52 10 +1 60.0 37.5 0 +2 60.0 36 -24.75 +3 60.0 0 -24.75 +4 60.0 0 -60 +5 60.0 27.75 -49.5 +6 60.0 60.0 -30 +7 60.0 60 0 +8 60.0 -60 0 +9 60.0 -60 -30 +10 60.0 -28.5 -49.5 +11 60.0 0 -60 +12 60.0 0 -24.75 +13 60.0 -36.75 -24.75 +14 60.0 -38.25 0 +15 -60.0 -38.25 0 +16 -60.0 -36.75 -24.75 +17 -60.0 0 -24.75 +18 -60.0 0 -60 +19 -60.0 -28.5 -49.5 +20 -60.0 -60 -30 +21 -60.0 -60 0 +22 -60.0 60 0 +23 -60.0 60.0 -30 +24 -60.0 27.75 -49.5 +25 -60.0 0 -60 +26 -60.0 0 -24.75 +27 -60.0 36 -24.75 +28 -60.0 37.5 0 +29 61.125 60.0 0 +30 61.125 60.0 -30 +31 -60 60.0 -30 +32 -60 60.0 0 +33 -60 -60.0 0 +34 -60 -60.0 -30 +35 61.125 -60.0 -30 +36 61.125 -60.0 0 +37 -60 -60 -30 +38 -60 -27.375 -49.5 +39 60 -27.375 -49.5 +40 60 -60 -30 +41 60 0 -60 +42 -60 -0 -60 +43 -60 -27.375 -49.5 +44 60 -27.375 -49.5 +45 60 27.375 -49.5 +46 -60 27.375 -49.5 +47 -60 0 -60 +48 60 -0 -60 +49 60 60 -30 +50 60 27.375 -49.5 +51 -60 27.375 -49.5 +52 -60 60 -30 +(gray44 black) 7 1 2 3 4 5 6 7 +(black gray44) 7 8 9 10 11 12 13 14 +(gray44 black) 7 15 16 17 18 19 20 21 +(black gray44) 7 22 23 24 25 26 27 28 +(black gray44) 4 29 30 31 32 +(black gray44) 4 33 34 35 36 +(black gray44) 4 37 38 39 40 +(gray44 black) 4 41 42 43 44 +(gray44 black) 4 45 46 47 48 +(black gray44) 4 49 50 51 52 diff -Nru acm-5.0/objects/features/man.obv acm-6.0+20200416/objects/features/man.obv --- acm-5.0/objects/features/man.obv 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/objects/features/man.obv 2017-04-16 13:47:43.000000000 +0000 @@ -0,0 +1,17 @@ +man 1.7 m tall +12 3 +1 0.3 0 -5.6 +2 0.3 0 -4.6 +3 1.1 0 -4.6 +4 1.1 0 -2.3 +5 0.6 0 -2.3 +6 0.6 0 0 +7 -0.3 0 -5.6 +8 -0.3 0 -4.6 +9 -1.1 0 -4.6 +10 -1.1 0 -2.3 +11 -0.6 0 -2.3 +12 -0.6 0 0 +#886666 4 1 2 8 7 +gray44 4 9 3 4 10 +black 4 11 5 6 12 diff -Nru acm-5.0/objects/features/rwy-and-gnd.obv acm-6.0+20200416/objects/features/rwy-and-gnd.obv --- acm-5.0/objects/features/rwy-and-gnd.obv 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/objects/features/rwy-and-gnd.obv 2006-01-05 13:58:55.000000000 +0000 @@ -0,0 +1,357 @@ +Runway +284 70 +1 0.000000 -75.000000 0.000000 +2 12000.000000 -75.000000 0.000000 +3 12000.000000 75.000000 0.000000 +4 0.000000 75.000000 0.000000 +5 0.000000 -75.000000 0.000000 +6 12000.000000 -75.000000 0.000000 +7 12000.000000 -70.000000 0.000000 +8 0.000000 -70.000000 0.000000 +9 0.000000 75.000000 0.000000 +10 12000.000000 75.000000 0.000000 +11 12000.000000 70.000000 0.000000 +12 0.000000 70.000000 0.000000 +13 1000.000000 -66.000000 0.000000 +14 1125.000000 -66.000000 0.000000 +15 1125.000000 -36.000000 0.000000 +16 1000.000000 -36.000000 0.000000 +17 1000.000000 66.000000 0.000000 +18 1125.000000 66.000000 0.000000 +19 1125.000000 36.000000 0.000000 +20 1000.000000 36.000000 0.000000 +21 11000.000000 -66.000000 0.000000 +22 10875.000000 -66.000000 0.000000 +23 10875.000000 -36.000000 0.000000 +24 11000.000000 -36.000000 0.000000 +25 11000.000000 66.000000 0.000000 +26 10875.000000 66.000000 0.000000 +27 10875.000000 36.000000 0.000000 +28 11000.000000 36.000000 0.000000 +29 4.000000 -66.000000 0.000000 +30 129.000000 -66.000000 0.000000 +31 129.000000 -54.888889 0.000000 +32 4.000000 -54.888889 0.000000 +33 4.000000 -50.888889 0.000000 +34 129.000000 -50.888889 0.000000 +35 129.000000 -39.777779 0.000000 +36 4.000000 -39.777779 0.000000 +37 4.000000 -35.777779 0.000000 +38 129.000000 -35.777779 0.000000 +39 129.000000 -24.666666 0.000000 +40 4.000000 -24.666666 0.000000 +41 4.000000 -20.666666 0.000000 +42 129.000000 -20.666666 0.000000 +43 129.000000 -9.555555 0.000000 +44 4.000000 -9.555555 0.000000 +45 4.000000 9.555555 0.000000 +46 129.000000 9.555555 0.000000 +47 129.000000 20.666666 0.000000 +48 4.000000 20.666666 0.000000 +49 4.000000 24.666666 0.000000 +50 129.000000 24.666666 0.000000 +51 129.000000 35.777779 0.000000 +52 4.000000 35.777779 0.000000 +53 4.000000 39.777779 0.000000 +54 129.000000 39.777779 0.000000 +55 129.000000 50.888889 0.000000 +56 4.000000 50.888889 0.000000 +57 4.000000 54.888889 0.000000 +58 129.000000 54.888889 0.000000 +59 129.000000 66.000000 0.000000 +60 4.000000 66.000000 0.000000 +61 11996.000000 -66.000000 0.000000 +62 11871.000000 -66.000000 0.000000 +63 11871.000000 -54.888889 0.000000 +64 11996.000000 -54.888889 0.000000 +65 11996.000000 -50.888889 0.000000 +66 11871.000000 -50.888889 0.000000 +67 11871.000000 -39.777779 0.000000 +68 11996.000000 -39.777779 0.000000 +69 11996.000000 -35.777779 0.000000 +70 11871.000000 -35.777779 0.000000 +71 11871.000000 -24.666666 0.000000 +72 11996.000000 -24.666666 0.000000 +73 11996.000000 -20.666666 0.000000 +74 11871.000000 -20.666666 0.000000 +75 11871.000000 -9.555555 0.000000 +76 11996.000000 -9.555555 0.000000 +77 11996.000000 9.555555 0.000000 +78 11871.000000 9.555555 0.000000 +79 11871.000000 20.666666 0.000000 +80 11996.000000 20.666666 0.000000 +81 11996.000000 24.666666 0.000000 +82 11871.000000 24.666666 0.000000 +83 11871.000000 35.777779 0.000000 +84 11996.000000 35.777779 0.000000 +85 11996.000000 39.777779 0.000000 +86 11871.000000 39.777779 0.000000 +87 11871.000000 50.888889 0.000000 +88 11996.000000 50.888889 0.000000 +89 11996.000000 54.888889 0.000000 +90 11871.000000 54.888889 0.000000 +91 11871.000000 66.000000 0.000000 +92 11996.000000 66.000000 0.000000 +93 258.000000 -2.500000 0.000000 +94 383.000000 -2.500000 0.000000 +95 383.000000 2.500000 0.000000 +96 258.000000 2.500000 0.000000 +97 508.000000 -2.500000 0.000000 +98 633.000000 -2.500000 0.000000 +99 633.000000 2.500000 0.000000 +100 508.000000 2.500000 0.000000 +101 758.000000 -2.500000 0.000000 +102 883.000000 -2.500000 0.000000 +103 883.000000 2.500000 0.000000 +104 758.000000 2.500000 0.000000 +105 1008.000000 -2.500000 0.000000 +106 1133.000000 -2.500000 0.000000 +107 1133.000000 2.500000 0.000000 +108 1008.000000 2.500000 0.000000 +109 1258.000000 -2.500000 0.000000 +110 1383.000000 -2.500000 0.000000 +111 1383.000000 2.500000 0.000000 +112 1258.000000 2.500000 0.000000 +113 1508.000000 -2.500000 0.000000 +114 1633.000000 -2.500000 0.000000 +115 1633.000000 2.500000 0.000000 +116 1508.000000 2.500000 0.000000 +117 1758.000000 -2.500000 0.000000 +118 1883.000000 -2.500000 0.000000 +119 1883.000000 2.500000 0.000000 +120 1758.000000 2.500000 0.000000 +121 2008.000000 -2.500000 0.000000 +122 2133.000000 -2.500000 0.000000 +123 2133.000000 2.500000 0.000000 +124 2008.000000 2.500000 0.000000 +125 2258.000000 -2.500000 0.000000 +126 2383.000000 -2.500000 0.000000 +127 2383.000000 2.500000 0.000000 +128 2258.000000 2.500000 0.000000 +129 2508.000000 -2.500000 0.000000 +130 2633.000000 -2.500000 0.000000 +131 2633.000000 2.500000 0.000000 +132 2508.000000 2.500000 0.000000 +133 2758.000000 -2.500000 0.000000 +134 2883.000000 -2.500000 0.000000 +135 2883.000000 2.500000 0.000000 +136 2758.000000 2.500000 0.000000 +137 3008.000000 -2.500000 0.000000 +138 3133.000000 -2.500000 0.000000 +139 3133.000000 2.500000 0.000000 +140 3008.000000 2.500000 0.000000 +141 3258.000000 -2.500000 0.000000 +142 3383.000000 -2.500000 0.000000 +143 3383.000000 2.500000 0.000000 +144 3258.000000 2.500000 0.000000 +145 3508.000000 -2.500000 0.000000 +146 3633.000000 -2.500000 0.000000 +147 3633.000000 2.500000 0.000000 +148 3508.000000 2.500000 0.000000 +149 3758.000000 -2.500000 0.000000 +150 3883.000000 -2.500000 0.000000 +151 3883.000000 2.500000 0.000000 +152 3758.000000 2.500000 0.000000 +153 4008.000000 -2.500000 0.000000 +154 4133.000000 -2.500000 0.000000 +155 4133.000000 2.500000 0.000000 +156 4008.000000 2.500000 0.000000 +157 4258.000000 -2.500000 0.000000 +158 4383.000000 -2.500000 0.000000 +159 4383.000000 2.500000 0.000000 +160 4258.000000 2.500000 0.000000 +161 4508.000000 -2.500000 0.000000 +162 4633.000000 -2.500000 0.000000 +163 4633.000000 2.500000 0.000000 +164 4508.000000 2.500000 0.000000 +165 4758.000000 -2.500000 0.000000 +166 4883.000000 -2.500000 0.000000 +167 4883.000000 2.500000 0.000000 +168 4758.000000 2.500000 0.000000 +169 5008.000000 -2.500000 0.000000 +170 5133.000000 -2.500000 0.000000 +171 5133.000000 2.500000 0.000000 +172 5008.000000 2.500000 0.000000 +173 5258.000000 -2.500000 0.000000 +174 5383.000000 -2.500000 0.000000 +175 5383.000000 2.500000 0.000000 +176 5258.000000 2.500000 0.000000 +177 5508.000000 -2.500000 0.000000 +178 5633.000000 -2.500000 0.000000 +179 5633.000000 2.500000 0.000000 +180 5508.000000 2.500000 0.000000 +181 5758.000000 -2.500000 0.000000 +182 5883.000000 -2.500000 0.000000 +183 5883.000000 2.500000 0.000000 +184 5758.000000 2.500000 0.000000 +185 6008.000000 -2.500000 0.000000 +186 6133.000000 -2.500000 0.000000 +187 6133.000000 2.500000 0.000000 +188 6008.000000 2.500000 0.000000 +189 6258.000000 -2.500000 0.000000 +190 6383.000000 -2.500000 0.000000 +191 6383.000000 2.500000 0.000000 +192 6258.000000 2.500000 0.000000 +193 6508.000000 -2.500000 0.000000 +194 6633.000000 -2.500000 0.000000 +195 6633.000000 2.500000 0.000000 +196 6508.000000 2.500000 0.000000 +197 6758.000000 -2.500000 0.000000 +198 6883.000000 -2.500000 0.000000 +199 6883.000000 2.500000 0.000000 +200 6758.000000 2.500000 0.000000 +201 7008.000000 -2.500000 0.000000 +202 7133.000000 -2.500000 0.000000 +203 7133.000000 2.500000 0.000000 +204 7008.000000 2.500000 0.000000 +205 7258.000000 -2.500000 0.000000 +206 7383.000000 -2.500000 0.000000 +207 7383.000000 2.500000 0.000000 +208 7258.000000 2.500000 0.000000 +209 7508.000000 -2.500000 0.000000 +210 7633.000000 -2.500000 0.000000 +211 7633.000000 2.500000 0.000000 +212 7508.000000 2.500000 0.000000 +213 7758.000000 -2.500000 0.000000 +214 7883.000000 -2.500000 0.000000 +215 7883.000000 2.500000 0.000000 +216 7758.000000 2.500000 0.000000 +217 8008.000000 -2.500000 0.000000 +218 8133.000000 -2.500000 0.000000 +219 8133.000000 2.500000 0.000000 +220 8008.000000 2.500000 0.000000 +221 8258.000000 -2.500000 0.000000 +222 8383.000000 -2.500000 0.000000 +223 8383.000000 2.500000 0.000000 +224 8258.000000 2.500000 0.000000 +225 8508.000000 -2.500000 0.000000 +226 8633.000000 -2.500000 0.000000 +227 8633.000000 2.500000 0.000000 +228 8508.000000 2.500000 0.000000 +229 8758.000000 -2.500000 0.000000 +230 8883.000000 -2.500000 0.000000 +231 8883.000000 2.500000 0.000000 +232 8758.000000 2.500000 0.000000 +233 9008.000000 -2.500000 0.000000 +234 9133.000000 -2.500000 0.000000 +235 9133.000000 2.500000 0.000000 +236 9008.000000 2.500000 0.000000 +237 9258.000000 -2.500000 0.000000 +238 9383.000000 -2.500000 0.000000 +239 9383.000000 2.500000 0.000000 +240 9258.000000 2.500000 0.000000 +241 9508.000000 -2.500000 0.000000 +242 9633.000000 -2.500000 0.000000 +243 9633.000000 2.500000 0.000000 +244 9508.000000 2.500000 0.000000 +245 9758.000000 -2.500000 0.000000 +246 9883.000000 -2.500000 0.000000 +247 9883.000000 2.500000 0.000000 +248 9758.000000 2.500000 0.000000 +249 10008.000000 -2.500000 0.000000 +250 10133.000000 -2.500000 0.000000 +251 10133.000000 2.500000 0.000000 +252 10008.000000 2.500000 0.000000 +253 10258.000000 -2.500000 0.000000 +254 10383.000000 -2.500000 0.000000 +255 10383.000000 2.500000 0.000000 +256 10258.000000 2.500000 0.000000 +257 10508.000000 -2.500000 0.000000 +258 10633.000000 -2.500000 0.000000 +259 10633.000000 2.500000 0.000000 +260 10508.000000 2.500000 0.000000 +261 10758.000000 -2.500000 0.000000 +262 10883.000000 -2.500000 0.000000 +263 10883.000000 2.500000 0.000000 +264 10758.000000 2.500000 0.000000 +265 11008.000000 -2.500000 0.000000 +266 11133.000000 -2.500000 0.000000 +267 11133.000000 2.500000 0.000000 +268 11008.000000 2.500000 0.000000 +269 11258.000000 -2.500000 0.000000 +270 11383.000000 -2.500000 0.000000 +271 11383.000000 2.500000 0.000000 +272 11258.000000 2.500000 0.000000 +273 11508.000000 -2.500000 0.000000 +274 11633.000000 -2.500000 0.000000 +275 11633.000000 2.500000 0.000000 +276 11508.000000 2.500000 0.000000 +277 11758.000000 -2.500000 0.000000 +278 11883.000000 -2.500000 0.000000 +279 11883.000000 2.500000 0.000000 +280 11758.000000 2.500000 0.000000 +281 -211200 -211200 0 +282 -211200 211200 0 +283 211200 211200 0 +284 211200 -211200 0 +#29350B 4 281 282 283 284 +black 4 1 2 3 4 +white 4 5 6 7 8 +white 4 9 10 11 12 +white 4 13 14 15 16 +white 4 17 18 19 20 +white 4 21 22 23 24 +white 4 25 26 27 28 +white 4 29 30 31 32 +white 4 33 34 35 36 +white 4 37 38 39 40 +white 4 41 42 43 44 +white 4 45 46 47 48 +white 4 49 50 51 52 +white 4 53 54 55 56 +white 4 57 58 59 60 +white 4 61 62 63 64 +white 4 65 66 67 68 +white 4 69 70 71 72 +white 4 73 74 75 76 +white 4 77 78 79 80 +white 4 81 82 83 84 +white 4 85 86 87 88 +white 4 89 90 91 92 +white 4 93 94 95 96 +white 4 97 98 99 100 +white 4 101 102 103 104 +white 4 105 106 107 108 +white 4 109 110 111 112 +white 4 113 114 115 116 +white 4 117 118 119 120 +white 4 121 122 123 124 +white 4 125 126 127 128 +white 4 129 130 131 132 +white 4 133 134 135 136 +white 4 137 138 139 140 +white 4 141 142 143 144 +white 4 145 146 147 148 +white 4 149 150 151 152 +white 4 153 154 155 156 +white 4 157 158 159 160 +white 4 161 162 163 164 +white 4 165 166 167 168 +white 4 169 170 171 172 +white 4 173 174 175 176 +white 4 177 178 179 180 +white 4 181 182 183 184 +white 4 185 186 187 188 +white 4 189 190 191 192 +white 4 193 194 195 196 +white 4 197 198 199 200 +white 4 201 202 203 204 +white 4 205 206 207 208 +white 4 209 210 211 212 +white 4 213 214 215 216 +white 4 217 218 219 220 +white 4 221 222 223 224 +white 4 225 226 227 228 +white 4 229 230 231 232 +white 4 233 234 235 236 +white 4 237 238 239 240 +white 4 241 242 243 244 +white 4 245 246 247 248 +white 4 249 250 251 252 +white 4 253 254 255 256 +white 4 257 258 259 260 +white 4 261 262 263 264 +white 4 265 266 267 268 +white 4 269 270 271 272 +white 4 273 274 275 276 +white 4 277 278 279 280 diff -Nru acm-5.0/objects/features/surface.obv acm-6.0+20200416/objects/features/surface.obv --- acm-5.0/objects/features/surface.obv 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/objects/features/surface.obv 2006-01-05 13:58:55.000000000 +0000 @@ -0,0 +1,515 @@ +#788b63-mass +510 3 +1 158400 -274357 0 +2 -158400 -274357 0 +3 -158400 0 0 +4 -158400 274357 0 +5 158400 274357 0 +6 316800 0 0 +7 -43779.8 262562 0.02 +8 -43779.8 262562 0.02 +9 -43867.1 265104 0.02 +10 -44463.8 267083 0.02 +11 -45060.4 269062 0.02 +12 -45452.3 271416 0.02 +13 -46048.6 273395 0.02 +14 -46338.5 274357 0.02 +15 -81588.9 274357 0.02 +16 -81990.8 273359 0.02 +17 -82710.3 271574 0.02 +18 -83329.1 269693 0.02 +19 -83545.3 267434 0.02 +20 -83459.3 264891 0.02 +21 -83067.7 262629 0.02 +22 -82471.9 260649 0.02 +23 -81876.6 258574 0.02 +24 -81585.9 256313 0.02 +25 -81193.8 254050 0.02 +26 -81107 251506 0.02 +27 -81523.6 249435 0.02 +28 -82141.1 247647 0.02 +29 -82859.8 245859 0.02 +30 -83579 243977 0.02 +31 -84297.6 242188 0.02 +32 -84914.9 240400 0.02 +33 -85331.2 238327 0.02 +34 -85747.4 236255 0.02 +35 -85961.9 233993 0.02 +36 -85874 231447 0.02 +37 -85684.7 228901 0.02 +38 -85899.4 226544 0.02 +39 -85810.6 224092 0.02 +40 -85719.8 222017 0.02 +41 -84817.2 220222 0.02 +42 -83506.1 219086 0.02 +43 -81482.7 218608 0.02 +44 -79960.6 219169 0.02 +45 -77931.5 219822 0.02 +46 -75903 220381 0.02 +47 -73672.7 220751 0.02 +48 -71341 221121 0.02 +49 -69110.7 221490 0.02 +50 -66779 221859 0.02 +51 -64750.2 222418 0.02 +52 -63326.6 223545 0.02 +53 -61802 224576 0.02 +54 -60882.6 226176 0.02 +55 -59862.2 227680 0.02 +56 -59245.2 229563 0.02 +57 -58527.3 231351 0.02 +58 -57607.7 232950 0.02 +59 -56587.2 234454 0.02 +60 -55163.4 235579 0.02 +61 -53638.8 236610 0.02 +62 -52113.7 237735 0.02 +63 -50185.8 238387 0.02 +64 -48055.8 238944 0.02 +65 -45624.1 239029 0.02 +66 -43194.8 238642 0.02 +67 -41679.9 237694 0.02 +68 -40369 236465 0.02 +69 -39261.4 235047 0.02 +70 -37950.3 233817 0.02 +71 -36331.6 233340 0.02 +72 -35109.6 234654 0.02 +73 -35809.3 236635 0.02 +74 -36611.1 238428 0.02 +75 -37209.3 240408 0.02 +76 -37298 242951 0.02 +77 -37185 245305 0.02 +78 -36466.9 247092 0.02 +79 -35547.2 248688 0.02 +80 -34526.6 250191 0.02 +81 -34110.9 252260 0.02 +82 -35013.3 254053 0.02 +83 -36527.7 255001 0.02 +84 -38347.4 255667 0.02 +85 -39963 256616 0.02 +86 -41475.7 257846 0.02 +87 -42072.8 259825 0.02 +88 135615 -6906.4 0.04 +89 135007 -5398.98 0.04 +90 134197 -3608.86 0.04 +91 133082 -2101.36 0.04 +92 132271 -405.309 0.04 +93 131157 1102.36 0.04 +94 129840 2327.42 0.04 +95 128421 3552.57 0.04 +96 127408 4966.24 0.04 +97 126091 6191.54 0.04 +98 124469 7134.24 0.04 +99 123152 8359.7 0.04 +100 121328 9114.09 0.04 +101 119808 10057 0.04 +102 117984 10717.2 0.04 +103 115653 10906.4 0.04 +104 113119 10812.8 0.04 +105 110788 10436.3 0.04 +106 108963 10625.3 0.04 +107 108457 12605.3 0.04 +108 107342 14114.2 0.04 +109 106227 15623.1 0.04 +110 104707 16566.6 0.04 +111 103085 17510.2 0.04 +112 101565 18453.7 0.04 +113 99943.2 19397.4 0.04 +114 98118.6 20058.4 0.04 +115 96091.2 20530.9 0.04 +116 94672.2 21757.6 0.04 +117 93658.9 23172.7 0.04 +118 91834.2 23928.2 0.04 +119 89502.4 24023.8 0.04 +120 87170.5 24213.8 0.04 +121 85345.7 24875.1 0.04 +122 84535 26101.8 0.04 +123 85752.2 27421.7 0.04 +124 86766.8 29024.6 0.04 +125 85956.5 30817.3 0.04 +126 84841.9 32327.3 0.04 +127 83220 33271.8 0.04 +128 81699.6 34216.3 0.04 +129 79874.8 34878.1 0.04 +130 77745.6 35257.1 0.04 +131 75718 36013.5 0.04 +132 73182.8 35826.8 0.04 +133 70850.5 36017.3 0.04 +134 68518.2 36207.9 0.04 +135 69125.9 34697.7 0.04 +136 69936.2 32904.3 0.04 +137 69022.7 31300.8 0.04 +138 66994.4 31207.8 0.04 +139 65169.4 31964 0.04 +140 63547.2 32908.9 0.04 +141 61722.1 33570.8 0.04 +142 59897 34232.8 0.04 +143 57868.9 34706.2 0.04 +144 55536.2 34802.3 0.04 +145 53305.1 34992.7 0.04 +146 52393.3 36786.9 0.04 +147 52090.4 39052.5 0.04 +148 51686.2 41318.3 0.04 +149 50571.6 42829.5 0.04 +150 49558.5 44340.7 0.04 +151 47936.5 45475 0.04 +152 46111.4 46232 0.04 +153 44286.3 46894.5 0.04 +154 42258 47274.1 0.04 +155 40432.9 48031.2 0.04 +156 39622.9 49731.4 0.04 +157 40030.4 51808 0.04 +158 40234.4 53129.5 0.04 +159 38612.4 54075.3 0.04 +160 37498.1 55587.1 0.04 +161 36891.4 57570.4 0.04 +162 37096.1 59364 0.04 +163 37300.2 60591 0.04 +164 38214.7 62194.8 0.04 +165 39433.2 63514.8 0.04 +166 40955.8 64645.6 0.04 +167 42069.9 63133.8 0.04 +168 42879.5 61433.6 0.04 +169 43993.6 59921.9 0.04 +170 45107.8 58410.2 0.04 +171 46425.1 57181.5 0.04 +172 48757.7 57084.4 0.04 +173 50178.6 58120.9 0.04 +174 51194.3 59724.1 0.04 +175 51297.5 61517.2 0.04 +176 50487.9 63217.1 0.04 +177 49678.5 65011.4 0.04 +178 48767.6 66805.8 0.04 +179 47755 68223 0.04 +180 47148.9 70300.2 0.04 +181 48570 71336.3 0.04 +182 50092.5 72466.4 0.04 +183 50804.6 74258.4 0.04 +184 50908.8 76523 0.04 +185 49592 77751.9 0.04 +186 47563.6 77660.9 0.04 +187 46344.9 76341.6 0.04 +188 45328.8 74833.2 0.04 +189 44414.1 73230.1 0.04 +190 42891.4 72099.8 0.04 +191 41470.2 71063.6 0.04 +192 38934.6 70972.9 0.04 +193 37109.7 71636.4 0.04 +194 35488.1 72582.8 0.04 +195 33663.3 73246.3 0.04 +196 31635.4 73721.3 0.04 +197 30521.5 75139.1 0.04 +198 30422.8 77216.2 0.04 +199 29817 79199.6 0.04 +200 29008.1 80994.6 0.04 +201 27894.5 82506.9 0.04 +202 26069.8 83170.7 0.04 +203 23837.9 82796.8 0.04 +204 22011 81950 0.04 +205 20285.5 81103 0.04 +206 18256.9 81011.8 0.04 +207 15924.3 81204.4 0.04 +208 14099.5 81868.3 0.04 +209 12579.5 82815 0.04 +210 10958.5 84045.2 0.04 +211 9641.84 85275 0.04 +212 8325.2 86504.8 0.04 +213 7008.45 87640.3 0.04 +214 5895.21 89153.1 0.04 +215 4782.02 90666 0.04 +216 3668.88 92178.9 0.04 +217 2657.07 93597.3 0.04 +218 1035.92 94544.5 0.04 +219 -280.422 95774.6 0.04 +220 -885.205 97853.4 0.04 +221 -982.959 99836.7 0.04 +222 -1282.94 102104 0.04 +223 -2192.26 103900 0.04 +224 -4016.53 104564 0.04 +225 -5742.35 103718 0.04 +226 -7468.16 102871 0.04 +227 -8687.79 101551 0.04 +228 -9603.67 99947 0.04 +229 -10620.8 98437.6 0.04 +230 -11840.3 97117.4 0.04 +231 -13059.8 95797 0.04 +232 -13975.6 94192.7 0.04 +233 -14992.7 92588.5 0.04 +234 -15098.2 90321.3 0.04 +235 -14797 88525.8 0.04 +236 -15002.9 86731.1 0.04 +237 -16728.5 85883.5 0.04 +238 -19264.4 85792.9 0.04 +239 -20787.6 84661.3 0.04 +240 -21500.6 82867.1 0.04 +241 -20590.5 81164.9 0.04 +242 -18766 80406.3 0.04 +243 -16738 80025.5 0.04 +244 -15116.6 79078.3 0.04 +245 -14104.6 77565.1 0.04 +246 -13702.2 75296.9 0.04 +247 -14414.8 73502.6 0.04 +248 -15329.9 71897.4 0.04 +249 -16346.5 70292.3 0.04 +250 -16957.5 68497.6 0.04 +251 -17973.9 66892.4 0.04 +252 -18888.8 65381.4 0.04 +253 -19601.2 63492.1 0.04 +254 -20009.3 61507.9 0.04 +255 -19910.9 58956 0.04 +256 -20319 56877.1 0.04 +257 -21031.1 54987.5 0.04 +258 -21945.6 53476.1 0.04 +259 -22961.7 51870.2 0.04 +260 -23572.1 50074.8 0.04 +261 -23979.8 47995.6 0.04 +262 -24184.9 45632.6 0.04 +263 -22867.2 44497.3 0.04 +264 -21549.6 43267.4 0.04 +265 -20435 41754.2 0.04 +266 -19117.3 40524.5 0.04 +267 -18002.7 39011.3 0.04 +268 -16177.2 38348.4 0.04 +269 -14351.8 37685.6 0.04 +270 -13744.2 36172.9 0.04 +271 -13441.4 33904.4 0.04 +272 -12631 32108.1 0.04 +273 -11211.6 30878.6 0.04 +274 -10401 29176.9 0.04 +275 -10300.9 26625.1 0.04 +276 -8678.32 25679.2 0.04 +277 -7257.83 26245.5 0.04 +278 -5938.68 27001 0.04 +279 -4213.95 27378.1 0.04 +280 -2185.27 26999.1 0.04 +281 -1273.15 25203.2 0.04 +282 -1172.85 22651.7 0.04 +283 145.424 21422.7 0.04 +284 2275.61 21043.8 0.04 +285 3289.48 19531.6 0.04 +286 3390.07 16980.3 0.04 +287 4302.54 15184.7 0.04 +288 3287.68 13673.1 0.04 +289 2070.02 12350.5 0.04 +290 852.375 10933.3 0.04 +291 -60.9191 9421.48 0.04 +292 -1278.48 8098.67 0.04 +293 -1988.85 6208.72 0.04 +294 -2191.96 3940.66 0.04 +295 -2090.62 1861.58 0.04 +296 -1989.21 -690.006 0.04 +297 -1583.35 -2958.06 0.04 +298 -467.35 -4375.51 0.04 +299 1054.43 -5414.86 0.04 +300 2677.66 -6359.64 0.04 +301 4706.61 -6737.36 0.04 +302 7039.87 -6926.04 0.04 +303 9068.7 -6358.87 0.04 +304 10285.9 -4941.5 0.04 +305 10894.4 -3146.32 0.04 +306 10792.9 -595.359 0.04 +307 11807.3 1010.79 0.04 +308 13024.7 2333.43 0.04 +309 15053.6 2900.18 0.04 +310 17082.5 2522.19 0.04 +311 18908.4 1766.37 0.04 +312 20227.2 538.307 0.04 +313 21545.9 -689.696 0.04 +314 22661.8 -2106.56 0.04 +315 23270.6 -4184.6 0.04 +316 22053.4 -5507.13 0.04 +317 20024.6 -6074.13 0.04 +318 20633.4 -7585.45 0.04 +319 22155.2 -8529.81 0.04 +320 23271.3 -10040.9 0.04 +321 24590.3 -11268.6 0.04 +322 24692 -12779.8 0.04 +323 23373.5 -13630.3 0.04 +324 21648.8 -12969.5 0.04 +325 20329.8 -11741.8 0.04 +326 18909.4 -10514.1 0.04 +327 17387.6 -9569.76 0.04 +328 15764.3 -8625.35 0.04 +329 13938.2 -7869.86 0.04 +330 12213.8 -8720.42 0.04 +331 12620 -10987.8 0.04 +332 13634.7 -12499.2 0.04 +333 14548.2 -14293.9 0.04 +334 15360.2 -15994.2 0.04 +335 16172.3 -17788.8 0.04 +336 17288.6 -19205.4 0.04 +337 18607.8 -20433 0.04 +338 19724.2 -21943.9 0.04 +339 20333.7 -23927.3 0.04 +340 19624.4 -25816.8 0.04 +341 18103.3 -26856.7 0.04 +342 16581.2 -25912.8 0.04 +343 14957.7 -24968.9 0.04 +344 13638.4 -23741.5 0.04 +345 13029 -21757.8 0.04 +346 12419.7 -20246.5 0.04 +347 11911.8 -18168.2 0.04 +348 11505.3 -15900.9 0.04 +349 9881.93 -14956.6 0.04 +350 8360.01 -14012.2 0.04 +351 7750.85 -11933.7 0.04 +352 6634.67 -10516.6 0.04 +353 4808.51 -9761.05 0.04 +354 2779.54 -9383.45 0.04 +355 243.427 -9478.39 0.04 +356 -1785.36 -10140.3 0.04 +357 -3814.15 -10707.7 0.04 +358 -6350.26 -10802.7 0.04 +359 -8683.41 -11181.2 0.04 +360 -8277.22 -12976.9 0.04 +361 -7262.4 -14394.3 0.04 +362 -6146.08 -15906.1 0.04 +363 -5333.95 -17701.5 0.04 +364 -4420.35 -19402.3 0.04 +365 -4115.14 -21670.3 0.04 +366 -4520.03 -23749.6 0.04 +367 -4924.83 -25828.9 0.04 +368 -5126.81 -27624.5 0.04 +369 -5023.98 -30176.1 0.04 +370 -5124.02 -32538.7 0.04 +371 -5528.47 -34618 0.04 +372 -6237.36 -36414 0.04 +373 -6946.19 -38210 0.04 +374 -7654.94 -40006 0.04 +375 -8566.67 -41613.3 0.04 +376 -9275.3 -43409.4 0.04 +377 -10186.9 -45016.7 0.04 +378 -10895.4 -46812.9 0.04 +379 -11299.3 -48892.3 0.04 +380 -11500 -51160.6 0.04 +381 -10889.3 -53239 0.04 +382 -9569.29 -54466.2 0.04 +383 -7742.72 -55125.9 0.04 +384 -5713.56 -55501.8 0.04 +385 -3582.86 -55972 0.04 +386 -1249.58 -56158.6 0.04 +387 779.58 -56534.3 0.04 +388 3112.85 -56720.8 0.04 +389 5142.01 -57096.5 0.04 +390 7171.26 -57566.7 0.04 +391 8795.26 -58509.5 0.04 +392 10621.8 -59168.7 0.04 +393 12448.4 -59827.8 0.04 +394 13971 -60770.5 0.04 +395 15595.1 -61807.5 0.04 +396 17421.6 -62466.4 0.04 +397 18944.2 -63409 0.04 +398 20568.2 -64351.3 0.04 +399 21888.3 -65577.3 0.04 +400 23005.8 -67086.7 0.04 +401 23312.8 -69352.5 0.04 +402 23417.4 -71901.9 0.04 +403 24028.5 -73883.9 0.04 +404 25348.7 -75109.3 0.04 +405 27175.4 -75861.9 0.04 +406 29204.4 -76236.5 0.04 +407 31335 -76705.2 0.04 +408 33161.5 -77363.2 0.04 +409 35190.5 -77737.6 0.04 +410 37017.1 -78489.8 0.04 +411 38539.6 -79431.3 0.04 +412 40163.6 -80372.5 0.04 +413 41686.2 -81313.7 0.04 +414 43310.2 -82254.8 0.04 +415 44427.8 -83762.8 0.04 +416 45444.1 -85270.9 0.04 +417 46359.3 -86967.9 0.04 +418 46970.8 -89042.7 0.04 +419 47480.8 -91023.3 0.04 +420 48396.2 -92814.3 0.04 +421 50424.2 -92716 0.04 +422 51946.8 -93656.5 0.04 +423 53064.5 -95163.7 0.04 +424 54182.2 -96576.5 0.04 +425 55502.4 -97800.1 0.04 +426 57328.8 -98551 0.04 +427 59357.4 -98924 0.04 +428 61689.8 -99107.6 0.04 +429 64022 -99196.9 0.04 +430 66049.7 -99098.2 0.04 +431 68279.9 -98810.5 0.04 +432 70814.5 -98710.7 0.04 +433 73145.8 -98328.4 0.04 +434 75680.3 -98228.6 0.04 +435 77809.9 -98601.1 0.04 +436 79534.5 -99351.5 0.04 +437 81157.9 -100291 0.04 +438 82680 -101230 0.04 +439 83797.4 -102736 0.04 +440 85117.1 -103958 0.04 +441 86437.1 -105369 0.04 +442 87554.4 -106874 0.04 +443 88874.1 -108096 0.04 +444 89991.5 -109601 0.04 +445 91311.2 -110823 0.04 +446 93338.2 -110724 0.04 +447 94552.3 -109401 0.04 +448 95563.4 -107797 0.04 +449 95965.6 -105723 0.04 +450 96367.9 -103648 0.04 +451 96770.3 -101574 0.04 +452 96665.3 -99029.8 0.04 +453 96560.4 -96485.4 0.04 +454 96456.3 -94506.4 0.04 +455 96960.3 -92431.8 0.04 +456 97363.1 -90357.4 0.04 +457 97461.4 -88000.8 0.04 +458 97864.4 -86020.6 0.04 +459 98064.3 -83663.7 0.04 +460 97959.9 -81118.8 0.04 +461 97551.9 -78857.3 0.04 +462 97245.3 -76595.4 0.04 +463 96938.6 -74239.2 0.04 +464 96530.8 -71977.3 0.04 +465 96123 -69715.3 0.04 +466 96019.2 -67170 0.04 +467 95712.9 -64907.7 0.04 +468 95609.2 -62362.2 0.04 +469 95505.5 -59722.3 0.04 +470 95605.5 -58025 0.04 +471 96617.9 -56420.7 0.04 +472 97833.3 -55099.1 0.04 +473 99860.6 -55002.2 0.04 +474 102192 -55093.5 0.04 +475 103915 -54242.8 0.04 +476 105130 -52921.4 0.04 +477 106143 -51411.9 0.04 +478 107054 -49808.2 0.04 +479 108269 -48487 0.04 +480 109484 -47165.9 0.04 +481 110396 -45562.4 0.04 +482 111408 -43958.8 0.04 +483 112320 -42449.7 0.04 +484 113535 -41128.8 0.04 +485 114750 -39713.7 0.04 +486 116777 -39146.3 0.04 +487 118804 -38578.8 0.04 +488 120323 -37446.5 0.04 +489 121843 -36408.4 0.04 +490 123058 -35087.9 0.04 +491 124476 -33955.9 0.04 +492 125489 -32353 0.04 +493 126705 -31032.8 0.04 +494 128123 -29995.1 0.04 +495 129338 -28675 0.04 +496 130351 -27072.4 0.04 +497 131566 -25752.5 0.04 +498 132478 -24150.1 0.04 +499 133693 -22830.3 0.04 +500 134402 -21039.7 0.04 +501 133793 -18967.2 0.04 +502 133996 -16705.8 0.04 +503 134907 -15103.7 0.04 +504 136629 -14255.1 0.04 +505 138149 -13218.2 0.04 +506 139668 -12087.2 0.04 +507 140073 -10014.5 0.04 +508 138250 -9355.46 0.04 +509 136629 -8413.68 0.04 +510 135615 -6906.4 0.04 +#203d68 6 1 2 3 4 5 6 +#788b63 81 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 +#788b63 423 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 diff -Nru acm-5.0/objects/features/telar1.obv acm-6.0+20200416/objects/features/telar1.obv --- acm-5.0/objects/features/telar1.obv 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/objects/features/telar1.obv 2006-01-05 13:58:55.000000000 +0000 @@ -0,0 +1,140 @@ +object +116 22 +1 11 -8.625 5.64444 +2 12.0097 -8.625 5.37388 +3 12.7489 -8.625 4.63472 +4 13.0194 -8.625 3.625 +5 12.7489 -8.625 2.61528 +6 12.0097 -8.625 1.87612 +7 11 -8.625 1.60556 +8 9.99028 -8.625 1.87612 +9 9.25112 -8.625 2.61528 +10 8.98056 -8.625 3.625 +11 9.25112 -8.625 4.63472 +12 9.99028 -8.625 5.37388 +13 -21.8769 0.25 -4.25 +14 -20.9198 0.25 2.875 +15 -21 -6.25 3 +16 -21.5 -6 -0.75 +17 -21.5 -9.375 -0.375 +18 -22 -8 -4.25 +19 -22 8 -4.25 +20 -21.5 9.375 -0.375 +21 -21.5 6 -0.75 +22 -21 6.25 3 +23 -20.9198 -0.25 2.875 +24 -21.8769 -0.25 -4.25 +25 -15.375 6.125 -8.79722 +26 -15.625 2.375 -8.625 +27 -4.375 2.125 -16.375 +28 -4.375 6.125 -16.375 +29 -4.375 -6.125 -16.375 +30 -4.375 -2.125 -16.375 +31 -15.625 -2.375 -8.625 +32 -15.375 -6.125 -8.79722 +33 -3.375 -6.25 -15.25 +34 -3.375 -2.25 -15.25 +35 -14.625 -2.5 -7.5 +36 -14.375 -6.25 -7.67222 +37 -14.375 6.25 -7.67222 +38 -14.625 2.5 -7.5 +39 -3.375 2.25 -15.25 +40 -3.375 6.25 -15.25 +41 -14.875 6.16094 -8.875 +42 -14.125 6.25 -7.75 +43 -3.25 6.375 -14.75 +44 -4.25 6.25 -16.375 +45 -4.25 -6.25 -16.375 +46 -3.25 -6.375 -14.75 +47 -14.125 -6.25 -7.75 +48 -14.875 -6.16094 -8.875 +49 -7.625 0.125 -15.5 +50 -7.375 -1.5 -15.375 +51 -6.625 -2.25 -14.125 +52 -6.07258 -1.25 -12.875 +53 -6 -0.125 -12.5 +54 -6.46371 1.625 -13 +55 -7.14718 2.375 -14.125 +56 -7.82258 1.875 -15.5 +57 19.375 5.625 -0.875 +58 19.375 -5.5 -0.625 +59 15.25 -6.375 3.5 +60 15.5845 6.625 2.875 +61 19.625 5.5 -0.625 +62 19.5 -5.25 -0.5 +63 12.625 -6.25 -2 +64 12.625 7.125 -2.18978 +65 16 -6.125 -0.75 +66 15.875 -9.375 -0.25 +67 5 -9.375 -0.375 +68 5 9.375 -0.375 +69 15.875 9.375 -0.25 +70 16 6.125 -0.75 +71 12.625 7.125 -2.125 +72 10.625 6.5 -4.125 +73 10.625 -6.375 -4.125 +74 12.75 -6.25 -2 +75 10.75 -0.125 -4.125 +76 -22 -0.125 -4.125 +77 -22.125 -8.125 -4.125 +78 5.5 -8 -4.125 +79 10.75 -6.5 -4.125 +80 10.75 6.5 -4.125 +81 5.5 8 -4.125 +82 -22.125 8.125 -4.125 +83 -22 0.125 -4.125 +84 10.75 0.125 -4.125 +85 5.5 -9.125 -0.125 +86 -21.5 -9.125 -0.125 +87 -22.125 -7.875 -4.125 +88 5.5 -7.875 -4.125 +89 5.5 7.875 -4.125 +90 -22.125 7.875 -4.125 +91 -21.5 9.125 -0.125 +92 5.5 9.125 -0.125 +93 11.75 -6.58244 -2.375 +94 12.875 -6.29936 -2.25 +95 12.875 -6.93003 0 +96 5.625 -8.875 -0.375 +97 5.25 -8 -3.875 +98 10.625 -6.375 -4.25 +99 10.625 6.375 -4.25 +100 5.25 8 -3.875 +101 5.625 8.875 -0.375 +102 12.875 6.93003 0 +103 12.875 6.29936 -2.25 +104 11.75 6.58244 -2.375 +105 59.625 0 -4.82322 +106 59.7134 0 -4.84691 +107 59.7781 0 -4.91161 +108 59.8018 0 -5 +109 59.7781 0 -5.08839 +110 59.7134 0 -5.15309 +111 59.625 0 -5.17678 +112 59.5366 0 -5.15309 +113 59.4719 0 -5.08839 +114 59.4482 0 -5 +115 59.4719 0 -4.91161 +116 59.5366 0 -4.84691 +gray44 12 1 2 3 4 5 6 7 8 9 10 11 12 +gray44 6 13 14 15 16 17 18 +gray44 6 19 20 21 22 23 24 +gray44 4 25 26 27 28 +gray44 4 29 30 31 32 +gray44 4 33 34 35 36 +gray44 4 37 38 39 40 +gray44 4 41 42 43 44 +gray44 4 45 46 47 48 +gray44 8 49 50 51 52 53 54 55 56 +gray44 4 57 58 59 60 +gray44 4 61 62 63 64 +gray44 3 65 66 67 +gray44 3 68 69 70 +gray44 4 71 72 73 74 +gray44 5 75 76 77 78 79 +gray44 5 80 81 82 83 84 +gray44 4 85 86 87 88 +gray44 4 89 90 91 92 +gray44 6 93 94 95 96 97 98 +gray44 6 99 100 101 102 103 104 +gray44 12 105 106 107 108 109 110 111 112 113 114 115 116 diff -Nru acm-5.0/objects/features/tower.obv acm-6.0+20200416/objects/features/tower.obv --- acm-5.0/objects/features/tower.obv 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/objects/features/tower.obv 2017-07-19 18:05:09.000000000 +0000 @@ -0,0 +1,23 @@ +*-a-control-tower +12 9 +1 7 7 0 +2 -7 7 0 +3 -7 -7 0 +4 7 -7 0 +5 7 7 -60 +6 -7 7 -60 +7 -7 -7 -60 +8 7 -7 -60 +9 16 16 -76 +10 -16 16 -76 +11 -16 -16 -76 +12 16 -16 -76 +(#888 clip) 4 9 10 11 12 +(#bbb clip) 4 1 5 8 4 +(#448 clip) 4 5 9 12 8 +(#999 clip) 4 4 8 7 3 +(#224 clip) 4 8 12 11 7 +(#bbb clip) 4 3 7 6 2 +(#448 clip) 4 6 7 11 10 +(#999 clip) 4 1 2 6 5 +(#224 clip) 4 5 6 10 9 Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/objects/gear_dn.au and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/objects/gear_dn.au differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/objects/gear_dn.wav and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/objects/gear_dn.wav differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/objects/gear_up.au and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/objects/gear_up.au differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/objects/gear_up.wav and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/objects/gear_up.wav differ diff -Nru acm-5.0/objects/hangar.obv acm-6.0+20200416/objects/hangar.obv --- acm-5.0/objects/hangar.obv 1998-08-14 02:26:57.000000000 +0000 +++ acm-6.0+20200416/objects/hangar.obv 1970-01-01 00:00:00.000000000 +0000 @@ -1,64 +0,0 @@ -object -52 10 -1 60.0 37.5 0 -2 60.0 36 -24.75 -3 60.0 0 -24.75 -4 60.0 0 -60 -5 60.0 27.75 -49.5 -6 60.0 60.0 -30 -7 60.0 60 0 -8 60.0 -60 0 -9 60.0 -60 -30 -10 60.0 -28.5 -49.5 -11 60.0 0 -60 -12 60.0 0 -24.75 -13 60.0 -36.75 -24.75 -14 60.0 -38.25 0 -15 -60.0 -38.25 0 -16 -60.0 -36.75 -24.75 -17 -60.0 0 -24.75 -18 -60.0 0 -60 -19 -60.0 -28.5 -49.5 -20 -60.0 -60 -30 -21 -60.0 -60 0 -22 -60.0 60 0 -23 -60.0 60.0 -30 -24 -60.0 27.75 -49.5 -25 -60.0 0 -60 -26 -60.0 0 -24.75 -27 -60.0 36 -24.75 -28 -60.0 37.5 0 -29 61.125 60.0 0 -30 61.125 60.0 -30 -31 -60 60.0 -30 -32 -60 60.0 0 -33 -60 -60.0 0 -34 -60 -60.0 -30 -35 61.125 -60.0 -30 -36 61.125 -60.0 0 -37 -60 -60 -30 -38 -60 -27.375 -49.5 -39 60 -27.375 -49.5 -40 60 -60 -30 -41 60 0 -60 -42 -60 -0 -60 -43 -60 -27.375 -49.5 -44 60 -27.375 -49.5 -45 60 27.375 -49.5 -46 -60 27.375 -49.5 -47 -60 0 -60 -48 60 -0 -60 -49 60 60 -30 -50 60 27.375 -49.5 -51 -60 27.375 -49.5 -52 -60 60 -30 -(gray44 black) 7 1 2 3 4 5 6 7 -(black gray44) 7 8 9 10 11 12 13 14 -(gray44 black) 7 15 16 17 18 19 20 21 -(black gray44) 7 22 23 24 25 26 27 28 -(black gray44) 4 29 30 31 32 -(black gray44) 4 33 34 35 36 -(black gray44) 4 37 38 39 40 -(gray44 black) 4 41 42 43 44 -(gray44 black) 4 45 46 47 48 -(black gray44) 4 49 50 51 52 diff -Nru acm-5.0/objects/hints.txt acm-6.0+20200416/objects/hints.txt --- acm-5.0/objects/hints.txt 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/objects/hints.txt 2017-10-28 08:02:46.000000000 +0000 @@ -0,0 +1,37 @@ +# Hints shown to the user, periodically, randomly, one line at a time, and only +# while the plane is flying level. +# Empty lines an lines starting with '#' are not shown. + +Hint: to exit the program press SHIFT-Q SHIFT-Q +Hint: to leave the window in background, press 'd' +Hint: check for updates at www.icosaedro.it/acm/download.html +Hint: press SHIFT-H to switch between HUD and classic instruments +Hint: press 'r' to show HSI, ADF and radar +Hint: one nautical mile corresponds to about 2 Km +Hint: knots is a speed unit corresponding to one nautical mile per hour +Hint: one feet is about one third of a meter +Hint: never exceed the maximum vertical load of the aircraft you are flying on! +Hint: your plane lacks the speed brakes? use the flaps instead! +Hint: press < or > to turn at standard rate of 3 DEG/s then press / or | to release +Hint: press , or . to turn at 1.5 DEG/s then press / or | to release +Hist: hold heading with | and release with / +Hint: never exceed 25 DEG angle of bank for best passengers comfort! +Hint: need a GPS? press SHIFT-D +Hint: don't forget to enable the rudder/aileron coordinator (SHIFT-X) +Hint: engine control keys: 1 (idle) 2 (decrease) 3 (increase) 4 (max) +Hint: to hold the current speed enable the auto-throttle (SHIFT-T) +Hint: to start/stop/reset the timer press 't' +Hint: to retract/deploy the landing gear press 'g' +Hint: to deploy the flaps press 'h' one or more times, retract with 'y' +Hint: to hold the current altitude, press SHIFT-Z +Hint: to hold the current climb rate press SHIFT-A +Hint: release the auto-pilot system with the Home key +Hint: select NAVAID frequency with 9 0, rotate the OBS pointer with 7 8 +Hint: select RNAV waypoint with F3 F4 F5 F6 +Hint: look around you: press NumLock then the arrows of the numeric keypad +Hint: switch between NAV/RNAV HSI receivers with SPACE +Hint: follow the VOR radial with the auto-navigator (SHIFT-N) +Hint: follow the ILS landing path with the auto-landing (SHIFT-L) +Hint: ACM comes with a good manual: read it carefully! +Hint: set the zoom factor with + and - +Hist: try flying in rate control mode with SHIFT-E \ No newline at end of file diff -Nru acm-5.0/objects/il78.obv acm-6.0+20200416/objects/il78.obv --- acm-5.0/objects/il78.obv 1998-08-14 21:22:37.000000000 +0000 +++ acm-6.0+20200416/objects/il78.obv 1970-01-01 00:00:00.000000000 +0000 @@ -1,253 +0,0 @@ -object -226 25 -1 40.9151 7.83713 0.505125 -2 40.9151 6.75434 4.54612 -3 40.9151 3.79612 7.50434 -4 40.9151 -0.244875 8.58713 -5 40.9151 -4.28588 7.50434 -6 40.9151 -7.24409 4.54612 -7 40.9151 -8.32688 0.505125 -8 40.9151 -7.24409 -3.53588 -9 40.9151 -4.28587 -6.49409 -10 40.9151 -0.244875 -7.57688 -11 40.9151 3.79613 -6.49409 -12 40.9151 6.75434 -3.53587 -13 37.8844 36.8741 2.52563 -14 37.8844 36.5358 3.78844 -15 37.8844 35.6113 4.71288 -16 37.8844 34.3485 5.05125 -17 37.8844 33.0857 4.71288 -18 37.8844 32.1612 3.78844 -19 37.8844 31.8229 2.52563 -20 37.8844 32.1612 1.26281 -21 37.8844 33.0857 0.33837 -22 37.8844 34.3485 0 -23 37.8844 35.6113 0.33837 -24 37.8844 36.5358 1.26281 -25 37.8844 -36.5358 1.26281 -26 37.8844 -35.6113 0.33837 -27 37.8844 -34.3485 0 -28 37.8844 -33.0857 0.33837 -29 37.8844 -32.1612 1.26281 -30 37.8844 -31.8229 2.52563 -31 37.8844 -32.1612 3.78844 -32 37.8844 -33.0857 4.71288 -33 37.8844 -34.3485 5.05125 -34 37.8844 -35.6113 4.71288 -35 37.8844 -36.5358 3.78844 -36 37.8844 -36.8741 2.52563 -37 43.9459 -22.8974 -0.252562 -38 43.9459 -21.9729 -1.17701 -39 43.9459 -20.7101 -1.51538 -40 43.9459 -19.4473 -1.17701 -41 43.9459 -18.5229 -0.252563 -42 43.9459 -18.1845 1.01025 -43 43.9459 -18.5229 2.27306 -44 43.9459 -19.4473 3.19751 -45 43.9459 -20.7101 3.53588 -46 43.9459 -21.9729 3.19751 -47 43.9459 -22.8974 2.27306 -48 43.9459 -23.2358 1.01025 -49 80.3149 0 0.505125 -50 78.7995 0 -1.51538 -51 73.7483 0 -5.05125 -52 71.2226 0 -7.57688 -53 68.697 0 -8.58713 -54 62.1304 0 -9.59738 -55 -9.59738 0 -8.58713 -56 -16.6691 0 -9.09225 -57 -25.7614 0 -9.59738 -58 -39.3998 0 -9.09225 -59 -49.5023 0 -8.082 -60 -56.574 0 -6.0615 -61 -58.0894 0 -4.54612 -62 -40.9151 0 3.03075 -63 -16.164 0 6.56663 -64 11.1128 0 8.082 -65 35.8639 0 7.57688 -66 60.615 0 7.07175 -67 65.1611 0 6.56663 -68 67.6868 0 8.082 -69 70.2124 0 9.09225 -70 77.2841 0 4.041 -71 29.2973 -0 -4.041 -72 29.2973 -0 -10.1025 -73 -4.54612 -80.3149 -2.0205 -74 -4.54612 80.3149 -2.0205 -75 29.2973 0 -10.1025 -76 29.2973 0 -4.041 -77 43.9459 23.2358 1.01025 -78 43.9459 22.8974 2.27306 -79 43.9459 21.9729 3.19751 -80 43.9459 20.7101 3.53588 -81 43.9459 19.4473 3.19751 -82 43.9459 18.5229 2.27306 -83 43.9459 18.1845 1.01025 -84 43.9459 18.5229 -0.252563 -85 43.9459 19.4473 -1.17701 -86 43.9459 20.7101 -1.51538 -87 43.9459 21.9729 -1.17701 -88 43.9459 22.8974 -0.252562 -89 36.369 20.7101 3.53588 -90 29.2973 20.7101 3.53588 -91 24.7511 20.7101 2.52563 -92 24.7511 20.7101 -3.53588 -93 15.6589 20.7101 -6.56663 -94 27.2768 20.7101 -7.07175 -95 34.8536 20.7101 -4.041 -96 39.3998 20.7101 -4.041 -97 42.9356 20.7101 -3.53588 -98 42.9356 20.7101 2.0205 -99 18.6896 -3.03075 5.55638 -100 34.8536 -7.07175 5.55638 -101 31.3178 -8.58713 5.55638 -102 16.164 -10.6076 5.55638 -103 3.53588 -9.59738 5.55638 -104 -2.52563 -7.57688 5.55638 -105 -2.52563 7.57688 5.55638 -106 3.53588 9.59738 5.55638 -107 16.164 10.6076 5.55638 -108 31.3178 8.58713 5.55638 -109 34.8536 7.07175 5.55638 -110 18.6896 3.03075 5.55638 -111 28.287 -8.58713 3.03075 -112 17.1743 -8.58713 1.51538 -113 8.082 -8.58713 2.0205 -114 -5.05125 -8.58713 3.53588 -115 -13.1333 -8.58713 6.0615 -116 -3.53588 -8.58713 10.1025 -117 9.59738 -8.58713 11.6179 -118 17.6794 -8.58713 10.6076 -119 25.2563 -8.58713 8.58713 -120 32.8331 -8.58713 6.0615 -121 32.8331 8.58713 6.0615 -122 25.2563 8.58713 8.58713 -123 17.6794 8.58713 10.6076 -124 9.59738 8.58713 11.6179 -125 -3.53588 8.58713 10.1025 -126 -13.1333 8.58713 6.0615 -127 -5.05125 8.58713 3.53588 -128 8.082 8.58713 2.0205 -129 17.1743 8.58713 1.51538 -130 28.287 8.58713 3.03075 -131 30.3075 34.3485 4.54612 -132 23.2358 34.3485 4.54612 -133 18.6896 34.3485 3.53588 -134 18.6896 34.3485 -2.52563 -135 9.59738 34.3485 -5.55638 -136 21.2153 34.3485 -6.0615 -137 28.7921 34.3485 -3.03075 -138 33.3383 34.3485 -3.03075 -139 36.8741 34.3485 -2.52563 -140 36.8741 34.3485 3.03075 -141 42.9356 -20.7101 2.0205 -142 42.9356 -20.7101 -3.53588 -143 39.3998 -20.7101 -4.041 -144 34.8536 -20.7101 -4.041 -145 27.2768 -20.7101 -7.07175 -146 15.6589 -20.7101 -6.56663 -147 24.7511 -20.7101 -3.53588 -148 24.7511 -20.7101 2.52563 -149 29.2973 -20.7101 3.53588 -150 36.369 -20.7101 3.53588 -151 36.8741 -34.3485 3.03075 -152 36.8741 -34.3485 -2.52563 -153 33.3383 -34.3485 -3.03075 -154 28.7921 -34.3485 -3.03075 -155 21.2153 -34.3485 -6.0615 -156 9.59738 -34.3485 -5.55638 -157 18.6896 -34.3485 -2.52563 -158 18.6896 -34.3485 3.53588 -159 23.2358 -34.3485 4.54612 -160 30.3075 -34.3485 4.54612 -161 -61.6253 0.505125 -4.54612 -162 -39.3998 -4.54612 -4.54612 -163 -27.7819 -8.082 -4.54612 -164 31.3178 -8.082 -4.54612 -165 34.3485 -0.505125 -4.54612 -166 34.3485 0.505125 -4.54612 -167 31.3178 8.082 -4.54612 -168 -27.7819 8.082 -4.54612 -169 -39.3998 4.54612 -4.54612 -170 -61.6253 -0.505125 -4.54612 -171 -49.5023 0.505125 0 -172 -33.3383 -2.52563 0 -173 -22.2255 -4.54612 0 -174 -12.123 -8.082 0 -175 52.0279 -7.07175 0 -176 63.1406 -6.56663 0 -177 70.7175 -5.55638 0 -178 79.3046 -3.03075 0 -179 81.3251 -0.505125 0 -180 81.3251 0.505125 0 -181 79.3046 3.03075 0 -182 70.7175 5.55638 0 -183 63.1406 6.56663 0 -184 52.0279 7.07175 0 -185 -12.123 8.082 0 -186 -22.2255 4.54612 0 -187 -33.3383 2.52563 0 -188 -49.5023 -0.505125 0 -189 38.8946 -6.0615 -6.77563 -190 42.4305 -0 -7.15167 -191 5.55638 0.505125 -9.32963 -192 5.05125 -6.56663 -8.68184 -193 3.53588 -34.8536 -6.0615 -194 -8.082 -78.7995 -2.52563 -195 -1.01025 -79.8098 -2.0205 -196 -1.01025 79.8098 -2.0205 -197 -8.082 78.7995 -2.52563 -198 3.53588 34.8536 -6.0615 -199 5.05125 6.56663 -8.68184 -200 5.55638 -0.505125 -9.32963 -201 42.4305 0 -7.15167 -202 38.8946 6.0615 -6.77563 -203 -59.6048 -0.505125 -32.328 -204 -68.1919 -26.2665 -32.328 -205 -62.1304 -25.2563 -32.328 -206 -45.4613 -3.03075 -32.328 -207 -44.451 0.505125 -32.328 -208 -44.451 -0.505125 -32.328 -209 -45.4613 3.03075 -32.328 -210 -62.1304 25.2563 -32.328 -211 -68.1919 26.2665 -32.328 -212 -59.6048 0.505125 -32.328 -213 -17.1743 0 -9.09225 -214 -25.2563 0 -11.6179 -215 -29.8024 0 -14.1435 -216 -42.9356 -0 -27.2768 -217 -42.9356 -0 -30.8126 -218 -36.369 -0 -32.8331 -219 -43.9459 -0 -34.3485 -220 -56.0689 -0 -33.8434 -221 -64.656 -0 -32.328 -222 -71.2226 -0 -29.2973 -223 -63.1406 -0 -28.7921 -224 -53.5433 -0 -10.1025 -225 -53.5433 -0 -8.082 -226 -56.574 -0 -4.54612 -gray44 12 1 2 3 4 5 6 7 8 9 10 11 12 -gray44 12 13 14 15 16 17 18 19 20 21 22 23 24 -gray44 12 25 26 27 28 29 30 31 32 33 34 35 36 -gray44 12 37 38 39 40 41 42 43 44 45 46 47 48 -gray44 22 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 -gray44 3 71 72 73 -gray44 3 74 75 76 -gray44 12 77 78 79 80 81 82 83 84 85 86 87 88 -gray44 10 89 90 91 92 93 94 95 96 97 98 -gray44 6 99 100 101 102 103 104 -gray44 6 105 106 107 108 109 110 -gray44 10 111 112 113 114 115 116 117 118 119 120 -gray44 10 121 122 123 124 125 126 127 128 129 130 -gray44 10 131 132 133 134 135 136 137 138 139 140 -gray44 10 141 142 143 144 145 146 147 148 149 150 -gray44 10 151 152 153 154 155 156 157 158 159 160 -gray44 5 161 162 163 164 165 -gray44 5 166 167 168 169 170 -gray44 9 171 172 173 174 175 176 177 178 179 -gray44 9 180 181 182 183 184 185 186 187 188 -gray44 7 189 190 191 192 193 194 195 -gray44 7 196 197 198 199 200 201 202 -gray44 5 203 204 205 206 207 -gray44 5 208 209 210 211 212 -gray44 14 213 214 215 216 217 218 219 220 221 222 223 224 225 226 Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/objects/imarker.au and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/objects/imarker.au differ diff -Nru acm-5.0/objects/inventory acm-6.0+20200416/objects/inventory --- acm-5.0/objects/inventory 1998-08-14 02:27:00.000000000 +0000 +++ acm-6.0+20200416/objects/inventory 1970-01-01 00:00:00.000000000 +0000 @@ -1,875 +0,0 @@ -# Aircraft Inventory for ACM 5.0 -# See ACM-Bibliography for further information about the sources of this -# information. - -# Mig-29 Fulcrum -# MiG-29M information was derived from two sources: [Spick87] and [AirI Aug92]. - -aircraft "MiG-29" { - - Description "Mikoyan-Guryevich MiG-29M Fulcrum" - Object "mig29.obv" - WingArea 400.0 # (wingS) Wing surface area (ft^2) - WingHalfSpan 18.87 # (wings) Wing half-span (ft) - Chord 9.61 # (c) Mean geometric chord of wing (ft) - AspectRatio 3.56 # (aspectRatio) aspect ratio - EmptyWeight 22500.0 #(emptyWeight) Empty weight (lb) - - DISEntityType 1:2:222:1:2:5:0 - DISAltEntityType 1:2:225:1:3:3:0 - - # (I(x,y,z)) Moments of inertia - Ixx 10000.0 - Iyy 75000.0 - Izz 80000.0 - - # (cFlap) Lift due to flaps (yields Clift of 1.0 at max extension) - CFlap 0.64279 - CLNegStall 17.0 # (deg) - CLPosStall 30.0 # (deg) - BetaStall 15.0 # (deg) - - CFlapDrag 0.0467 # (cFlapDrag) Drag due to Flaps - CGearDrag 0.03 # (cGearDrag) Drag due to Gear - CSpeedBrake 0.03 # (cSpeedBrake) Drag due to Speed Brake - # at 90 degrees - - # (CDb) Drag Characteristic equation [Wave+body] - # independent variable is mach number - CDb { # (CDb) Drag Characteristic equation [Wave+body] - # independent variable is mach number - 0.0, 0.020, - 0.2, 0.020, - 0.95, 0.015, - 1.05, 0.045, - 2.00, 0.030, - 10.0, 0.030 - } - - CLift { # (CLift) Lift-slope curve (vs alpha) - -3.0, 0.0, - -1.05, 0.0, - -0.576, -2.199, - -0.556, -2.23, - -0.524, -2.199, - 0.524, 2.199, - 0.556, 2.23, - 0.576, 2.199, - 1.05, 0.0, - 2.0, 0.0 - } - - CnBeta { # (CnBeta) Yaw due to sideslip equation - 0, -0.08125, - 0.523540, -0.078125, - 0.785340, -0.0609375, - 1.047198, 0.125, - 1.58, 0.0 - } - - ClBeta { # (ClBeta) Roll due to sideslip equation - 0, -0.0125, - 0.43633, -0.015, - 0.78540, 0.125, - 1.58, 0.0, - 3.142, 0.125, - } - - CDBOrigin 0 # (CDBOrigin, CDBFactor) Drag due to sideslip - CDBFactor 0.5 - CDBPhase 0 # (CDBPhase) sideslip drag phase (deg) - CYBeta -1.4 # (CYbeta) Side-force from side-slip [dCY/dBeta] - EffElevator 0.60 # (effElevator) Elevator effectiveness - EffRudder 0.14 # (effRudder) Rudder effectiveness - MaxRudder 20 # (maxRudder) max Rudder (deg) - SeTrimTakeoff 0 # (SeTrimTakeoff) Elevator trim at takeoff (deg) - MaxAileron 20 # (maxAileron) max Aileron (deg) - MaxFlap 20 # (maxFlap) max flap setting (deg) - # (flapRate) flap extension rate (about 2 secs to fully extend flaps) - FlapRate 10 # (deg/sec) - # (gearRate) gear extension rate (about 3 secs to fully extend gear) - GearRate 30 # (deg/sec) - MaxSpeedBrake 80 # (maxSpeedBrake) max Speed Brake setting (deg) - # (speedBrakeRate) rate of speed brake extension (2 secs to full ext) - SpeedBrakeRate 40 # (deg/sec) - # (speedBrakeIncr) speed Brake increment per keystroke - SpeedBrakeIncr 80 # (deg) - Clda 0.048 # (Clda) roll moment from aileron offset - Cldr 0.004 # (Cldr) roll moment from rudder offset - Clp -0.27 # (Clp) roll damping - Cmq -8.0 # (Cmq) pitch damping factor - Cnr -0.378 # (Cnr) yaw damping factor - CmAlpha -0.40 # (cmSlope) CmAlpha curve slope - CmFactor -0.20 # (cmFactor) CmAlpha factor when stalled - MaxFuel 9750 # (maxFuel) maximum internal fuel (lb) - # engine lag factor (how fast does it respond to throttle changes) - EngineLag -3.0 - # Engine data based on updated RD-33K engines cited in [AirI Aug89]. - # (maxThrust) max static thrust, military power (lb) - MaxThrust 27000 - # (maxABThrust) max static thrust, afterburner on (lb) - MaxABThrust 44000 - - Thrust { # (Thrust) Mach Number vs. thrust - 0, 1, - 1.7, 1.5, - 2.0, 0.84, - 5, 0.5 - } - ABThrust { # (ABThrust) afterburner thrust table - 0, 1, - 0.5, 1, - 1, 1.21, - 1.7, 1.7, - 5, 1.64 - } - # (spFuelConsump) specific fuel consump(lb fuel/lb T x hr) - SpFuelConsump 0.68 - # (spABFuelConsump) AB specific fuel consump(lb fuel/lb T x hr) - SpABFuelConsump 2.55 - # (groundingPoint) hypothetical single pt of contact w/ground - GroundingPoint { 0, 0, 6.5 } - # (viewPoint) pilot's viewing location wrt CG - ViewPoint { 14.75, 0, -5.375 } - - # Landing Gear control parameters - - MuStatic 0.08 # (muStatic) static coeff of friction no-brakes - MuKinetic 0.05 # (muKinetic) moving coeff of friction no-brakes - MuBStatic 0.7 # (muBStatic) static brakes-on - MuBKinetic 0.6 # (muBKinetic) moving brakes-on - - MaxNWDef 72 # (maxNWDef) maximum nosewheel deflection (deg) - NWIncr 0.0397 # (NWIncr) deflection for each unit (1.27/32) - MaxNWS 85 # (maxNWS) maximum NWS velocity (fps) - - # (rm) location of main gear attachments - Rm { -1.206000, 0.000000, 4.25 } - # (rn) location of nose gear attachments - Rn { 10.395000, 0.000000, 4.5 } - Dm 10000 # main oleo damping factor - Dn 1000 # nose oleo damping factor - Km 105561 # main oleo spring factor - Kn 23439.1 # nose oleo spring factor - Gm 1.5 # main strut length with tire (ft) - Gn 1.5 # nose strut length with tire (ft) - CmMax 1.0 # (cmMax) main max oleo extension distance (ft) - CnMax 0.75 # (cnMax) nose max oleo extension distance (ft) - # (tailExtent) as we rotate, this part may drag - TailExtent { -18.165, 0.0, 1.191 } - StructurePoints 15 # (structurePts) maximum structural damage - - # Radar data based on N-019 Pulse Doppler radar cited in [AirI Aug89]. - - RadarOutput 15000 # (radarOutput) radar output (watts) - RadarTRange 38 # (radarTRange) tracking radar range (nm) - RadarDRange 55 # (radarDRange) detection radar range (nm) - TEWSThreshold 0 # Radar Warning Receiver threshold (watts) - - # Weapons - - WeaponCount 7 - - HardPoint0 { 7.0, -4.0, 0.0 } - HardPoint1 { 0.357, 15.6, 0.0 } - HardPoint2 { 0.357, -15.6, 0.0 } - HardPoint3 { 1.5, 9.0, 2.0 } - HardPoint4 { 1.5, -9.0, 2.0 } - HardPoint5 { 1.5, 8.0, 1.5 } - HardPoint6 { 1.5, -8.0, 1.5 } - HardPoint7 { 1.5, 10.0, 1.5 } - HardPoint8 { 1.5, -10.0, 1.5 } - - WeaponStation 0 "m61a1" 500 0 0 - WeaponStation 1 "aim9m" 0 0 0 - WeaponStation 2 "aim9m" 0 0 0 - WeaponStation 3 "aim9m" 0 0 0 - WeaponStation 4 "aim9m" 0 0 0 - WeaponStation 5 "aim9m" 0 0 0 - WeaponStation 6 "aim9m" 0 0 0 - - } - -aircraft "Su-30" { - -# COVER - - WingArea 400.0 # (wingS) Wing surface area (ft^2) - WingHalfSpan 18.87 # (wings) Wing half-span (ft) - Chord 9.61 # (c) Mean geometric chord of wing (ft) - AspectRatio 3.56 # (aspectRatio) aspect ratio - EmptyWeight 22500.0 #(emptyWeight) Empty weight (lb) - - DISEntityType 1:2:222:1:2:5:0 - DISAltEntityType 1:2:225:1:3:3:0 - - # (I(x,y,z)) Moments of inertia - Ixx 10000.0 - Iyy 75000.0 - Izz 80000.0 - - # (cFlap) Lift due to flaps (yields Clift of 1.0 at max extension) - CFlap 0.64279 - CLNegStall 17.0 # (deg) - CLPosStall 30.0 # (deg) - BetaStall 15.0 # (deg) - - CFlapDrag 0.0467 # (cFlapDrag) Drag due to Flaps - CGearDrag 0.03 # (cGearDrag) Drag due to Gear - CSpeedBrake 0.03 # (cSpeedBrake) Drag due to Speed Brake - # at 90 degrees - - # (CDb) Drag Characteristic equation [Wave+body] - # independent variable is mach number - CDb { # (CDb) Drag Characteristic equation [Wave+body] - # independent variable is mach number - 0.0, 0.020, - 0.2, 0.020, - 0.95, 0.015, - 1.05, 0.045, - 2.00, 0.030, - 10.0, 0.030 - } - - CLift { # (CLift) Lift-slope curve (vs alpha) - -3.0, 0.0, - -1.05, 0.0, - -0.576, -2.199, - -0.556, -2.23, - -0.524, -2.199, - 0.524, 2.199, - 0.556, 2.23, - 0.576, 2.199, - 1.05, 0.0, - 2.0, 0.0 - } - - CnBeta { # (CnBeta) Yaw due to sideslip equation - 0, -0.08125, - 0.523540, -0.078125, - 0.785340, -0.0609375, - 1.047198, 0.125, - 1.58, 0.0 - } - - ClBeta { # (ClBeta) Roll due to sideslip equation - 0, -0.0125, - 0.43633, -0.015, - 0.78540, 0.125, - 1.58, 0.0, - 3.142, 0.125, - } - - CDBOrigin 0 # (CDBOrigin, CDBFactor) Drag due to sideslip - CDBFactor 0.5 - CDBPhase 0 # (CDBPhase) sideslip drag phase (deg) - CYBeta -1.4 # (CYbeta) Side-force from side-slip [dCY/dBeta] - EffElevator 0.60 # (effElevator) Elevator effectiveness - EffRudder 0.14 # (effRudder) Rudder effectiveness - MaxRudder 20 # (maxRudder) max Rudder (deg) - SeTrimTakeoff 0 # (SeTrimTakeoff) Elevator trim at takeoff (deg) - MaxAileron 20 # (maxAileron) max Aileron (deg) - MaxFlap 20 # (maxFlap) max flap setting (deg) - # (flapRate) flap extension rate (about 2 secs to fully extend flaps) - FlapRate 10 # (deg/sec) - # (gearRate) gear extension rate (about 3 secs to fully extend gear) - GearRate 30 # (deg/sec) - MaxSpeedBrake 80 # (maxSpeedBrake) max Speed Brake setting (deg) - # (speedBrakeRate) rate of speed brake extension (2 secs to full ext) - SpeedBrakeRate 40 # (deg/sec) - # (speedBrakeIncr) speed Brake increment per keystroke - SpeedBrakeIncr 80 # (deg) - Clda 0.048 # (Clda) roll moment from aileron offset - Cldr 0.004 # (Cldr) roll moment from rudder offset - Clp -0.27 # (Clp) roll damping - Cmq -8.0 # (Cmq) pitch damping factor - Cnr -0.378 # (Cnr) yaw damping factor - CmAlpha -0.40 # (cmSlope) CmAlpha curve slope - CmFactor -0.20 # (cmFactor) CmAlpha factor when stalled - MaxFuel 9750 # (maxFuel) maximum internal fuel (lb) - # engine lag factor (how fast does it respond to throttle changes) - EngineLag -3.0 - # Engine data based on updated RD-33K engines cited in [AirI Aug89]. - # (maxThrust) max static thrust, military power (lb) - MaxThrust 27000 - # (maxABThrust) max static thrust, afterburner on (lb) - MaxABThrust 44000 - - Thrust { # (Thrust) Mach Number vs. thrust - 0, 1, - 1.7, 1.5, - 2.0, 0.84, - 5, 0.5 - } - ABThrust { # (ABThrust) afterburner thrust table - 0, 1, - 0.5, 1, - 1, 1.21, - 1.7, 1.7, - 5, 1.64 - } - # (spFuelConsump) specific fuel consump(lb fuel/lb T x hr) - SpFuelConsump 0.68 - # (spABFuelConsump) AB specific fuel consump(lb fuel/lb T x hr) - SpABFuelConsump 2.55 - # (groundingPoint) hypothetical single pt of contact w/ground - GroundingPoint { 0, 0, 6.5 } - # (viewPoint) pilot's viewing location wrt CG - ViewPoint { 14.75, 0, -5.375 } - - # Landing Gear control parameters - - MuStatic 0.08 # (muStatic) static coeff of friction no-brakes - MuKinetic 0.05 # (muKinetic) moving coeff of friction no-brakes - MuBStatic 0.7 # (muBStatic) static brakes-on - MuBKinetic 0.6 # (muBKinetic) moving brakes-on - - MaxNWDef 72 # (maxNWDef) maximum nosewheel deflection (deg) - NWIncr 0.0397 # (NWIncr) deflection for each unit (1.27/32) - MaxNWS 85 # (maxNWS) maximum NWS velocity (fps) - - # (rm) location of main gear attachments - Rm { -1.206000, 0.000000, 4.25 } - # (rn) location of nose gear attachments - Rn { 10.395000, 0.000000, 4.5 } - Dm 10000 # main oleo damping factor - Dn 1000 # nose oleo damping factor - Km 105561 # main oleo spring factor - Kn 23439.1 # nose oleo spring factor - Gm 1.5 # main strut length with tire (ft) - Gn 1.5 # nose strut length with tire (ft) - CmMax 1.0 # (cmMax) main max oleo extension distance (ft) - CnMax 0.75 # (cnMax) nose max oleo extension distance (ft) - # (tailExtent) as we rotate, this part may drag - TailExtent { -18.165, 0.0, 1.191 } - StructurePoints 15 # (structurePts) maximum structural damage - - # Radar data based on N-019 Pulse Doppler radar cited in [AirI Aug89]. - - RadarOutput 15000 # (radarOutput) radar output (watts) - RadarTRange 38 # (radarTRange) tracking radar range (nm) - RadarDRange 55 # (radarDRange) detection radar range (nm) - TEWSThreshold 0 # Radar Warning Receiver threshold (watts) - - # Weapons - - WeaponCount 7 - - HardPoint0 { 7.0, -4.0, 0.0 } - HardPoint1 { 0.357, 15.6, 0.0 } - HardPoint2 { 0.357, -15.6, 0.0 } - HardPoint3 { 1.5, 9.0, 2.0 } - HardPoint4 { 1.5, -9.0, 2.0 } - HardPoint5 { 1.5, 8.0, 1.5 } - HardPoint6 { 1.5, -8.0, 1.5 } - HardPoint7 { 1.5, 10.0, 1.5 } - HardPoint8 { 1.5, -10.0, 1.5 } - - WeaponStation 0 "m61a1" 500 0 0 - WeaponStation 1 "aim9m" 0 0 0 - WeaponStation 2 "aim9m" 0 0 0 - WeaponStation 3 "aim9m" 0 0 0 - WeaponStation 4 "aim9m" 0 0 0 - WeaponStation 5 "aim9m" 0 0 0 - WeaponStation 6 "aim9m" 0 0 0 - -#COVER - - Object "su30.obv" - Description "Sukhoi Su-30 Multi-Role Fighter" - - DISEntityType 1:2:222:2:9:0:0 # used Su-37 enumeration - DISAltEntityType 1:2:225:1:3:3:0 - - WingArea 600 - WingHalfSpan 24 - Chord 16 - EmptyWeight 50000 - MaxFuel 15000 - Ixx 5000 - Iyy 50000 - Izz 50000 - Rm {-2.2325, 0, 8.53825} - Rn {24.1916, 0, 8.27663} - Km 63456.8 - Kn 9791.8 - Gm 2 - Gn 2 - Dm 40000 - Dn 5000 - CmMax 1.0 - CnMax 1.5 - GroundingPoint {0.0, 0.0, 11.9359} - ViewPoint {34.2729, 0, -8.89525} - - # (CDb) Drag Characteristic equation [Wave+body] - # independent variable is mach number - CDb { # (CDb) Drag Characteristic equation [Wave+body] - # independent variable is mach number - 0.0, 0.020, - 0.2, 0.020, - 0.95, 0.015, - 1.05, 0.045, - 2.00, 0.030, - 10.0, 0.030 - } - - CLift { # (CLift) Lift-slope curve (vs alpha) - -3.0, 0.0, - -1.05, 0.0, - -0.576, -2.199, - -0.556, -2.23, - -0.524, -2.199, - 0.524, 2.199, - 0.556, 2.23, - 0.576, 2.199, - 1.05, 0.0, - 2.0, 0.0 - } - - CnBeta { # (CnBeta) Yaw due to sideslip equation - 0, -0.08125, - 0.523540, -0.078125, - 0.785340, -0.0609375, - 1.047198, 0.125, - 1.58, 0.0 - } - - ClBeta { # (ClBeta) Roll due to sideslip equation - 0, -0.0125, - 0.43633, -0.015, - 0.78540, 0.125, - 1.58, 0.0, - 3.142, 0.125, - } - - MaxThrust 20000 - MaxABThrust 55000 - Thrust { # (Thrust) Mach Number vs. thrust - 0, 1, - 1.7, 1.5, - 2.0, 0.84, - 5, 0.5 - } - ABThrust { # (ABThrust) afterburner thrust table - 0, 1, - 0.5, 1, - 1, 1.21, - 1.7, 1.7, - 5, 1.64 - } - SpFuelConsump 0.7 - SpABFuelConsump 2.5 - EngineLag -3 - - Clda 0.048 # (Clda) roll moment from aileron offset - Cldr 0.004 # (Cldr) roll moment from rudder offset - Clp -0.27 # (Clp) roll damping - Cmq -8.0 # (Cmq) pitch damping factor - Cnr -0.378 # (Cnr) yaw damping factor - CmAlpha -0.40 # (cmSlope) CmAlpha curve slope - CmFactor -0.20 # (cmFactor) CmAlpha factor when stalled - - # Radar data based on N-019 Pulse Doppler radar cited in [AirI Aug89]. - - RadarOutput 15000 # (radarOutput) radar output (watts) - RadarTRange 38 # (radarTRange) tracking radar range (nm) - RadarDRange 55 # (radarDRange) detection radar range (nm) - TEWSThreshold 0 # Radar Warning Receiver threshold (watts) - - StructurePoints 30 # (structurePts) maximum structural damage - - # Weapons - - WeaponCount 7 - - HardPoint0 { 7.0, -4.0, 0.0 } - HardPoint1 { 0.357, 15.6, 0.0 } - HardPoint2 { 0.357, -15.6, 0.0 } - HardPoint3 { 1.5, 9.0, 2.0 } - HardPoint4 { 1.5, -9.0, 2.0 } - HardPoint5 { 1.5, 8.0, 1.5 } - HardPoint6 { 1.5, -8.0, 1.5 } - HardPoint7 { 1.5, 10.0, 1.5 } - HardPoint8 { 1.5, -10.0, 1.5 } - - WeaponStation 0 "m61a1" 500 0 0 - WeaponStation 1 "aim9m" 0 0 0 - WeaponStation 2 "aim9m" 0 0 0 - WeaponStation 3 "aim9m" 0 0 0 - WeaponStation 4 "aim9m" 0 0 0 - WeaponStation 5 "aim9m" 0 0 0 - WeaponStation 6 "aim9m" 0 0 0 - } - - -# F-16 C Falcon - -aircraft "F-16" { - - Description "General Dynamics F-16C Fighting Falcon" - Object "f16.obv" - WingArea 300.0 # (wingS) Wing surface area (ft^2) - WingHalfSpan 16 # (wings) Wing half-span (ft) - Chord 9.61 # (c) Mean geometric chord of wing (ft) - AspectRatio 3.0 # (aspectRatio) aspect ratio - EmptyWeight 14576 #(emptyWeight) Empty weight (lb) - - DISEntityType 1:2:225:1:3:3:0 - DISAltEntityType 1:2:222:1:2:5:0 - - # (I(x,y,z)) Moments of inertia - Ixx 7240 - Iyy 49786 - Izz 54390 - - # (cFlap) Lift due to flaps (yields Clift of 1.0 at max extension) - CFlap 0.64279 - CLNegStall 17.0 # (deg) - CLPosStall 30.0 # (deg) - BetaStall 15.0 # (deg) - - CFlapDrag 0.0467 # (cFlapDrag) Drag due to Flaps - CGearDrag 0.03 # (cGearDrag) Drag due to Gear - CSpeedBrake 0.03 # (cSpeedBrake) Drag due to Speed Brake - # at 90 degrees - - # (CDb) Drag Characteristic equation [Wave+body] - # independent variable is mach number - CDb { # (CDb) Drag Characteristic equation [Wave+body] - # independent variable is mach number - 0.0, 0.020, - 0.2, 0.020, - 0.95, 0.015, - 1.05, 0.045, - 2.00, 0.030, - 10.0, 0.030 - } - - CLift { # (CLift) Lift-slope curve (vs alpha) - -3.0, 0.0, - -1.05, 0.0, - -0.576, -2.199, - -0.556, -2.23, - -0.524, -2.199, - 0.524, 2.199, - 0.556, 2.23, - 0.576, 2.199, - 1.05, 0.0, - 2.0, 0.0 - } - - CnBeta { # (CnBeta) Yaw due to sideslip equation - 0, -0.08125, - 0.523540, -0.078125, - 0.785340, -0.0609375, - 1.047198, 0.125, - 1.58, 0.0 - } - - ClBeta { # (ClBeta) Roll due to sideslip equation - 0, -0.0125, - 0.43633, -0.015, - 0.78540, 0.125, - 1.58, 0.0, - 3.142, 0.125, - } - - CDBOrigin 0 # (CDBOrigin, CDBFactor) Drag due to sideslip - CDBFactor 0.5 - CDBPhase 0 # (CDBPhase) sideslip drag phase (deg) - CYBeta -1.14 # (CYbeta) Side-force from side-slip [dCY/dBeta] - EffElevator 0.63 # (effElevator) Elevator effectiveness [Cmde(1/rad)] - EffRudder 0.085 # (effRudder) Rudder effectiveness [CYdr(1/rad)] - MaxRudder 20 # (maxRudder) max Rudder (deg) - SeTrimTakeoff 0 # (SeTrimTakeoff) Elevator trim at takeoff (deg) - MaxAileron 20 # (maxAileron) max Aileron (deg) - MaxFlap 20 # (maxFlap) max flap setting (deg) - # (flapRate) flap extension rate (about 2 secs to fully extend flaps) - FlapRate 10 # (deg/sec) - # (gearRate) gear extension rate (about 3 secs to fully extend gear) - GearRate 30 # (deg/sec) - MaxSpeedBrake 80 # (maxSpeedBrake) max Speed Brake setting (deg) - # (speedBrakeRate) rate of speed brake extension (2 secs to full ext) - SpeedBrakeRate 40 # (deg/sec) - # (speedBrakeIncr) speed Brake increment per keystroke - SpeedBrakeIncr 80 # (deg) - Clda 0.048 # (Clda) roll moment from aileron offset - Cldr 0.004 # (Cldr) roll moment from rudder offset - Clp -0.443 # (Clp) roll damping - Cmq -5.23 # (Cmq) pitch damping factor - Cnr -0.378 # (Cnr) yaw damping factor - CmAlpha -0.35 # (cmSlope) CmAlpha curve slope - CmFactor -0.20 # (cmFactor) CmAlpha factor when stalled - MaxFuel 9750 # (maxFuel) maximum internal fuel (lb) - # engine lag factor (how fast does it respond to throttle changes) - EngineLag -3.0 - # Engine data based on updated RD-33K engines cited in [AirI Aug89]. - # (maxThrust) max static thrust, military power (lb) - MaxThrust 14080 - # (maxABThrust) max static thrust, afterburner on (lb) - MaxABThrust 23540 - Thrust { # (Thrust) Mach Number vs. thrust - 0, 1, - 1.7, 1.5, - 2.0, 0.84, - 5, 0.5 - } - ABThrust { # (ABThrust) afterburner thrust table - 0, 1, - 0.5, 1, - 1, 1.21, - 1.7, 1.7, - 5, 1.64 - } - # (spFuelConsump) specific fuel consump(lb fuel/lb T x hr) - SpFuelConsump 0.68 - # (spABFuelConsump) AB specific fuel consump(lb fuel/lb T x hr) - SpABFuelConsump 2.55 - # (groundingPoint) hypothetical single pt of contact w/ground - GroundingPoint { 0, 0, 6.5 } - # (viewPoint) pilot's viewing location wrt CG - ViewPoint { 15.58, 0, -2.71 } - - # Landing Gear control parameters - - MuStatic 0.08 # (muStatic) static coeff of friction no-brakes - MuKinetic 0.05 # (muKinetic) moving coeff of friction no-brakes - MuBStatic 0.7 # (muBStatic) static brakes-on - MuBKinetic 0.6 # (muBKinetic) moving brakes-on - - MaxNWDef 72 # (maxNWDef)maximum nosewheel deflection (deg) - NWIncr 0.0397 # (NWIncr) deflection for each unit (1.27/32) - MaxNWS 85 # (maxNWS) maximum NWS velocity (kts) - - # (rm) location of main gear attachments - Rm { -1, 0, 4.5 } - # (rn) location of nose gear attachments - Rn { 14, 0, 4.5 } - Dm 10000 # main oleo damping factor - Dn 700 # nose oleo damping factor - Km 45408.5 # main oleo spring factor - Kn 3243.47 # nose oleo spring factor - Gm 1.5 # main strut length with tire (ft) - Gn 1.5 # nose strut length with tire (ft) - CmMax 1.5 # (cmMax) main max oleo extension distance (ft) - CnMax 1.5 # (cnMax) nose max oleo extension distance (ft) - # (tailExtent) as we rotate, this part may drag - TailExtent { -18.165, 0.0, 1.191 } - StructurePoints 15 # (structurePts) maximum structural damage - - # Radar data based on N-019 Pulse Doppler radar cited in [AirI Aug89]. - - RadarOutput 15000 # (radarOutput) radar output (watts) - RadarTRange 60 # (radarTRange) tracking radar range (nm) - RadarDRange 80 # (radarDRange) detection radar range (nm) - TEWSThreshold 0 # Radar Warning Receiver threshold (watts) - - # Weapons - - WeaponCount 7 - - HardPoint0 { 7.0, -4.0, 0.0 } - HardPoint1 { 0.357, 15.6, 0.0 } - HardPoint2 { 0.357, -15.6, 0.0 } - HardPoint3 { 1.5, 9.0, 2.0 } - HardPoint4 { 1.5, -9.0, 2.0 } - HardPoint5 { 1.5, 8.0, 1.5 } - HardPoint6 { 1.5, -8.0, 1.5 } - HardPoint7 { 1.5, 10.0, 1.5 } - HardPoint8 { 1.5, -10.0, 1.5 } - - WeaponStation 0 "m61a1" 500 0 0 - WeaponStation 1 "aim9m" 0 0 0 - WeaponStation 2 "aim9m" 0 0 0 - WeaponStation 3 "aim9m" 0 0 0 - WeaponStation 4 "aim9m" 0 0 0 - WeaponStation 5 "aim9m" 0 0 0 - WeaponStation 6 "aim9m" 0 0 0 - - - } - -# Cessna 172 - -aircraft "C-172" { - - Description "Cessna 172RG" - Object "c172.obv" - WingArea 174.0 # (wingS) Wing surface area (ft^2) - WingHalfSpan 16 # (wings) Wing half-span (ft) - Chord 4.9 # (c) Mean geometric chord of wing (ft) - AspectRatio 5.9 # (aspectRatio) aspect ratio - EmptyWeight 1450 #(emptyWeight) Empty weight (lb) - - DISEntityType 1:2:225:40:1:1:0 # T-41 trainer - DISAltEntityType 1:2:225:40:1:1:0 # T-41 trainer - - # (I(x,y,z)) Moments of inertia - Ixx 1000 - Iyy 7500 - Izz 8000 - - # (cFlap) Lift due to flaps (yields Clift of 1.0 at max extension) - CFlap 0.64279 - CLNegStall 14.0 # (deg) - CLPosStall 17.0 # (deg) - BetaStall 15.0 # (deg) - - CFlapDrag 0.0467 # (cFlapDrag) Drag due to Flaps - CGearDrag 0.03 # (cGearDrag) Drag due to Gear - CSpeedBrake 0.03 # (cSpeedBrake) Drag due to Speed Brake - # at 90 degrees - - # (CDb) Drag Characteristic equation [Wave+body] - # independent variable is mach number - CDb { # (CDb) Drag Characteristic equation [Wave+body] - # independent variable is mach number - 0.0, 0.020, - 0.2, 0.020, - 0.95, 0.015, - 1.05, 0.045, - 2.00, 0.030, - 10.0, 0.030 - } - - # This is a hack: it assumes CLMax = 1.7 at 17 degrees - - CLift { # (CLift) Lift-slope curve (vs alpha) - -3.0, 0.0, - -1.05, 0.0, - -0.3316, -1.65, - -0.2967, -1.7, - -0.2618, -1.65, - 0.2618, 1.65, - 0.2967, 1.7, - 0.3316, 1.65, - 1.05, 0.0, - 2.0, 0.0 - } - - CnBeta { # (CnBeta) Yaw due to sideslip equation - 0, -0.08125, - 0.523540, -0.078125, - 0.785340, -0.0609375, - 1.047198, 0.125, - 1.58, 0.0 - } - - ClBeta { # (ClBeta) Roll due to sideslip equation - 0, -0.0125, - 0.43633, -0.015, - 0.78540, 0.125, - 1.58, 0.0, - 3.142, 0.125, - } - - CDBOrigin 0 # (CDBOrigin, CDBFactor) Drag due to sideslip - CDBFactor 0.5 - CDBPhase 0 # (CDBPhase) sideslip drag phase (deg) - CYBeta -1.0 # (CYbeta) Side-force from side-slip [dCY/dBeta] - EffElevator 0.45 # (effElevator) Elevator effectiveness - EffRudder 0.35 # (effRudder) Rudder effectiveness - MaxRudder 20 # (maxRudder) max Rudder (deg) - SeTrimTakeoff 0 # (SeTrimTakeoff) Elevator trim at takeoff (deg) - MaxAileron 20 # (maxAileron) max Aileron (deg) - MaxFlap 40 # (maxFlap) max flap setting (deg) - # (flapRate) flap extension rate (about 2 secs to fully extend flaps) - FlapRate 6 # (deg/sec) - # (gearRate) gear extension rate (about 3 secs to fully extend gear) - GearRate 30 # (deg/sec) - MaxSpeedBrake 80 # (maxSpeedBrake) max Speed Brake setting (deg) - # (speedBrakeRate) rate of speed brake extension (2 secs to full ext) - SpeedBrakeRate 40 # (deg/sec) - # (speedBrakeIncr) speed Brake increment per keystroke - SpeedBrakeIncr 0 # (deg) - Clda 0.048 # (Clda) roll moment from aileron offset - Cldr 0.004 # (Cldr) roll moment from rudder offset - Clp -0.27 # (Clp) roll damping - Cmq -8.0 # (Cmq) pitch damping factor - Cnr -1.0 # (Cnr) yaw damping factor - CmAlpha -0.30 # (cmSlope) CmAlpha curve slope - CmFactor -0.20 # (cmFactor) CmAlpha factor when stalled - MaxFuel 240 # (maxFuel) maximum internal fuel (lb) - # engine lag factor (how fast does it respond to throttle changes) - EngineLag -1.0 - # (maxThrust) max static thrust, military power (lb) - MaxThrust 400 - # (maxABThrust) max static thrust, afterburner on (lb) - MaxABThrust 400 - Thrust { # (Thrust) Mach Number vs. thrust - 0, 1, - 1.7, 1.5, - 2.0, 0.84, - 5, 0.5 - } - ABThrust { # (ABThrust) afterburner thrust table - 0, 1, - 0.5, 1, - 1, 1.21, - 1.7, 1.7, - 5, 1.64 - } - # (spFuelConsump) specific fuel consump(lb fuel/lb T x hr) - SpFuelConsump 0.1677 - # (spABFuelConsump) AB specific fuel consump(lb fuel/lb T x hr) - SpABFuelConsump 0.1677 - # (groundingPoint) hypothetical single pt of contact w/ground - GroundingPoint { 0, 0, 3.35 } - # (viewPoint) pilot's viewing location wrt CG - ViewPoint { 0.2791, -0.7326, -1.7792 } - - # Landing Gear control parameters - - MuStatic 0.08 # (muStatic) static coeff of friction no-brakes - MuKinetic 0.05 # (muKinetic) moving coeff of friction no-brakes - MuBStatic 0.7 # (muBStatic) static brakes-on - MuBKinetic 0.6 # (muBKinetic) moving brakes-on - - MaxNWDef 30 # (maxNWDef) maximum nosewheel deflection (deg) - NWIncr 0.0397 # (NWIncr) deflection for each unit - MaxNWS 85 # (maxNWS) maximum NWS velocity (kts) - - # (rm) location of main gear attachments - Rm { -0.3489, 4.0118, 2.0299 } - # (rn) location of nose gear attachments - Rn { 4.1165, 0.0, 2.029 } - Dm 1000 # main oleo damping factor - Dn 100 # nose oleo damping factor - Km 5377 # main oleo spring factor - Kn 547 # nose oleo spring factor - Gm 1.0 # main strut length with tire (ft) - Gn 1.0 # nose strut length with tire (ft) - CmMax 0.5 # (cmMax) main max oleo extension distance (ft) - CnMax 0.5 # (cnMax) nose max oleo extension distance (ft) - # (tailExtent) as we rotate, this part may drag - TailExtent { -18.165, 0.0, 1.191 } - StructurePoints 10 # (structurePts) maximum structural damage - - # Radar data based on N-019 Pulse Doppler radar cited in [AirI Aug89]. - - RadarOutput 0 # (radarOutput) radar output (watts) - RadarTRange 0 # (radarTRange) tracking radar range (nm) - RadarDRange 0 # (radarDRange) detection radar range (nm) - TEWSThreshold 0 # Radar Warning Receiver threshold (watts) - - # Weapons - - WeaponCount 2 - - HardPoint0 { 7.0, -4.0, 0.0 } - HardPoint1 { 0.357, 15.6, 0.0 } - HardPoint2 { 0.357, -15.6, 0.0 } - HardPoint3 { 1.5, 9.0, 2.0 } - HardPoint4 { 1.5, -9.0, 2.0 } - HardPoint5 { 1.5, 8.0, 1.5 } - HardPoint6 { 1.5, -8.0, 1.5 } - HardPoint7 { 1.5, 10.0, 1.5 } - HardPoint8 { 1.5, -10.0, 1.5 } - - WeaponStation 0 "m61a1" 50 0 0 - WeaponStation 1 "aim9m" 0 0 0 - - - } - Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/objects/jet1.au and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/objects/jet1.au differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/objects/jet2.au and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/objects/jet2.au differ diff -Nru acm-5.0/objects/kc135.obv acm-6.0+20200416/objects/kc135.obv --- acm-5.0/objects/kc135.obv 1998-08-14 02:27:06.000000000 +0000 +++ acm-6.0+20200416/objects/kc135.obv 1970-01-01 00:00:00.000000000 +0000 @@ -1,273 +0,0 @@ -object -237 34 -1 -24.141 0.135459 6.78832 -2 -24.141 1.70305 6.78832 -3 -24.141 3.89769 5.84776 -4 -24.141 6.40584 1.77202 -5 -24.141 7.03288 -1.67669 -6 -24.141 5.7788 -5.75244 -7 -24.141 4.52472 -7.94707 -8 -24.141 -0.17806 -9.20115 -9 -24.141 0.241181 -9.30906 -10 -24.141 -4.4616 -8.05499 -11 -24.141 -5.71568 -5.86035 -12 -24.141 -6.96975 -1.78461 -13 -24.141 -6.34272 1.6641 -14 -24.141 -3.83457 5.73985 -15 -24.141 -1.63993 6.6804 -16 -24.141 -0.072338 6.6804 -17 -54.8658 -1.88111 -3.76223 -18 -72.1094 -22.5734 -7.83797 -19 -80.2608 -22.5734 -7.83797 -20 -71.4823 0 -3.3917 -21 18.108 31.5999 4.00309 -22 -2.60576 31.5999 4.00309 -23 -2.60576 31.5999 5.06146 -24 1.32532 31.5999 5.96863 -25 9.79227 31.5999 6.57341 -26 11.0018 31.5999 7.32939 -27 17.9568 31.5999 6.8758 -28 17.9923 31.5999 1.05837 -29 11.0373 31.5999 0.604782 -30 9.82771 31.5999 1.36076 -31 1.36076 31.5999 1.96554 -32 -2.57032 31.5999 2.87271 -33 -2.57032 31.5999 3.93108 -34 18.1435 31.5999 3.93108 -35 18.1435 -31.5999 3.93108 -36 -2.57032 -31.5999 3.93108 -37 -2.57032 -31.5999 2.87271 -38 1.36076 -31.5999 1.96554 -39 9.82771 -31.5999 1.36076 -40 11.0373 -31.5999 0.604782 -41 17.9923 -31.5999 1.05837 -42 17.9568 -31.5999 6.8758 -43 11.0018 -31.5999 7.32939 -44 9.79227 -31.5999 6.57341 -45 1.32532 -31.5999 5.96863 -46 -2.60576 -31.5999 5.06146 -47 -2.60576 -31.5999 4.00309 -48 18.108 -31.5999 4.00309 -49 2.9232 -49.8885 6.40654 -50 -4.03179 -49.8885 6.86012 -51 -5.24135 -49.8885 6.10415 -52 -13.7083 -49.8885 5.49936 -53 -17.6394 -49.8885 4.59219 -54 -17.6394 -49.8885 3.53382 -55 3.0744 -49.8885 3.53382 -56 3.10983 -49.8885 3.46182 -57 -17.6039 -49.8885 3.46182 -58 -17.6039 -49.8885 2.40345 -59 -13.6729 -49.8885 1.49628 -60 -5.20592 -49.8885 0.891493 -61 -3.99635 -49.8885 0.135516 -62 2.95864 -49.8885 0.589102 -63 2.95864 49.8885 0.589102 -64 -3.99635 49.8885 0.135516 -65 -5.20592 49.8885 0.891493 -66 -13.6729 49.8885 1.49628 -67 -17.6039 49.8885 2.40345 -68 -17.6039 49.8885 3.46182 -69 3.10983 49.8885 3.46182 -70 3.0744 49.8885 3.53382 -71 -17.6394 49.8885 3.53382 -72 -17.6394 49.8885 4.59219 -73 -13.7083 49.8885 5.49936 -74 -5.24135 49.8885 6.10415 -75 -4.03179 49.8885 6.86012 -76 2.9232 49.8885 6.40654 -77 17.937 -29.8366 5.59983 -78 17.937 -31.7615 6.12482 -79 17.937 -33.249 5.68733 -80 17.937 -34.5615 4.02488 -81 17.937 -33.949 2.09994 -82 17.937 -31.849 1.31246 -83 17.937 -29.7491 2.18743 -84 17.937 -28.9616 4.02488 -85 46.7143 0.313519 6.5839 -86 46.7143 1.88111 6.5839 -87 46.7143 4.07575 5.64334 -88 46.7143 6.5839 1.56759 -89 46.7143 7.21094 -1.88111 -90 46.7143 5.95686 -5.95686 -91 46.7143 4.70278 -8.15149 -92 46.7143 -0 -9.40557 -93 46.7143 0 -9.40557 -94 46.7143 -4.70278 -8.15149 -95 46.7143 -5.95686 -5.95686 -96 46.7143 -7.21094 -1.88111 -97 46.7143 -6.5839 1.56759 -98 46.7143 -4.07575 5.64334 -99 46.7143 -1.88111 6.5839 -100 46.7143 -0.313519 6.5839 -101 2.17721 -1.41805 -2.54008 -102 -11.9747 -5.98734 1.81435 -103 23.7679 -6.16878 3.62869 -104 72.5738 -0 -0.907173 -105 72.5738 0 -0.907173 -106 23.7679 6.16878 3.62869 -107 -11.9747 5.98734 1.81435 -108 2.17721 1.41805 -2.54008 -109 -71.4823 -0 -3.3917 -110 -80.2608 22.5734 -7.83797 -111 -72.1094 22.5734 -7.83797 -112 -54.8658 1.88111 -3.76223 -113 -76.4986 -0 -4.35987 -114 -44.2062 5.0163 -3.63486 -115 -29.4708 5.95686 -3.31808 -116 54.2388 6.5839 -1.56759 -117 71.4823 2.19463 -1.25408 -118 72.4229 0.313519 -1.25408 -119 72.4229 -0.313519 -1.25408 -120 71.4823 -2.19463 -1.25408 -121 54.2388 -6.5839 -1.56759 -122 -29.4708 -5.95686 -3.31808 -123 -44.2062 -5.0163 -3.63486 -124 -76.4986 0 -4.35987 -125 -11.9137 6.27038 1.8973 -126 -12.2272 11.6002 1.46206 -127 -15.3624 28.8437 -0.0389337 -128 -35.7412 73.3634 -4.45217 -129 -28.8437 72.4229 -4.07575 -130 -25.0815 70.5418 -3.76223 -131 23.5139 6.27038 3.44871 -132 23.5139 -6.27038 3.44871 -133 -25.0815 -70.5418 -3.76223 -134 -28.8437 -72.4229 -4.07575 -135 -35.7412 -73.3634 -4.45217 -136 -15.3624 -28.8437 -0.0389337 -137 -12.2272 -11.6002 1.46206 -138 -11.9137 -6.27038 1.8973 -139 18.1841 -31.6654 4.07575 -140 -2.82167 -31.3519 4.07575 -141 -2.82167 -32.9195 4.07575 -142 1.56759 -33.86 4.07575 -143 10.3461 -34.1736 4.07575 -144 11.6002 -34.8006 4.07575 -145 18.1841 -34.4871 4.07575 -146 18.1841 -28.8437 4.07575 -147 11.6002 -28.5302 4.07575 -148 10.3461 -29.1573 4.07575 -149 1.56759 -29.4708 4.07575 -150 -2.82167 -30.4113 4.07575 -151 -2.82167 -31.9789 4.07575 -152 18.1841 -31.6654 4.07575 -153 3.13519 49.8495 3.44871 -154 -17.8706 50.163 3.44871 -155 -17.8706 48.5954 3.44871 -156 -13.4813 47.6549 3.44871 -157 -4.70278 47.3414 3.44871 -158 -3.44871 46.7143 3.44871 -159 3.13519 47.0278 3.44871 -160 3.13519 52.6712 3.44871 -161 -3.44871 52.9847 3.44871 -162 -4.70278 52.3577 3.44871 -163 -13.4813 52.0441 3.44871 -164 -17.8706 51.1036 3.44871 -165 -17.8706 49.536 3.44871 -166 3.13519 49.8495 3.44871 -167 3.13519 -49.8495 3.44871 -168 -17.8706 -49.536 3.44871 -169 -17.8706 -51.1036 3.44871 -170 -13.4813 -52.0441 3.44871 -171 -4.70278 -52.3577 3.44871 -172 -3.44871 -52.9847 3.44871 -173 3.13519 -52.6712 3.44871 -174 3.13519 -47.0278 3.44871 -175 -3.44871 -46.7143 3.44871 -176 -4.70278 -47.3414 3.44871 -177 -13.4813 -47.6549 3.44871 -178 -17.8706 -48.5954 3.44871 -179 -17.8706 -50.163 3.44871 -180 3.13519 -49.8495 3.44871 -181 72.7364 0 -1.25408 -182 69.9147 0 -3.44871 -183 65.839 0 -5.0163 -184 58.3145 0 -8.15149 -185 47.0278 0 -8.77853 -186 -39.5034 0 -7.83797 -187 -75.2445 0 -6.5839 -188 -74.931 0 -3.13519 -189 -45.4602 0 3.76223 -190 -27.5897 0 5.95686 -191 48.5954 0 5.64334 -192 61.1362 0 4.38926 -193 70.5418 0 1.25408 -194 -45.1467 0 -6.89742 -195 -48.909 0 -8.77853 -196 -53.6117 0 -11.2867 -197 -67.7201 0 -32.9195 -198 -75.5581 0 -32.9195 -199 -69.9147 0 -5.64334 -200 18.1841 31.6654 4.07575 -201 -2.82167 31.9789 4.07575 -202 -2.82167 30.4113 4.07575 -203 1.56759 29.4708 4.07575 -204 10.3461 29.1573 4.07575 -205 11.6002 28.5302 4.07575 -206 18.1841 28.8437 4.07575 -207 3.24076 47.1051 3.66201 -208 3.24076 47.8926 1.82457 -209 3.24076 49.9925 0.949592 -210 3.24076 52.0924 1.73707 -211 3.24076 52.7049 3.66201 -212 3.24076 51.3925 5.32446 -213 3.24076 49.905 5.76195 -214 3.24076 47.9801 5.23696 -215 3.24076 -47.9801 5.23696 -216 3.24076 -49.905 5.76195 -217 3.24076 -51.3925 5.32446 -218 3.24076 -52.7049 3.66201 -219 3.24076 -52.0924 1.73707 -220 3.24076 -49.9925 0.949592 -221 3.24076 -47.8926 1.82457 -222 3.24076 -47.1051 3.66201 -223 17.937 28.9616 4.02488 -224 17.937 29.7491 2.18743 -225 17.937 31.849 1.31246 -226 17.937 33.949 2.09994 -227 17.937 34.5615 4.02488 -228 17.937 33.249 5.68733 -229 17.937 31.7615 6.12482 -230 17.937 29.8366 5.59983 -231 18.1841 34.4871 4.07575 -232 11.6002 34.8006 4.07575 -233 10.3461 34.1736 4.07575 -234 1.56759 33.86 4.07575 -235 -2.82167 32.9195 4.07575 -236 -2.82167 31.3519 4.07575 -237 18.1841 31.6654 4.07575 -gray44 8 1 2 3 4 5 6 7 8 -gray44 8 9 10 11 12 13 14 15 16 -gray44 4 17 18 19 20 -gray44 7 21 22 23 24 25 26 27 -gray44 7 28 29 30 31 32 33 34 -gray44 7 35 36 37 38 39 40 41 -gray44 7 42 43 44 45 46 47 48 -gray44 7 49 50 51 52 53 54 55 -gray44 7 56 57 58 59 60 61 62 -gray44 7 63 64 65 66 67 68 69 -gray44 7 70 71 72 73 74 75 76 -gray44 8 77 78 79 80 81 82 83 84 -gray44 8 85 86 87 88 89 90 91 92 -gray44 8 93 94 95 96 97 98 99 100 -gray44 4 101 102 103 104 -gray44 4 105 106 107 108 -gray44 4 109 110 111 112 -gray44 6 113 114 115 116 117 118 -gray44 6 119 120 121 122 123 124 -gray44 7 125 126 127 128 129 130 131 -gray44 7 132 133 134 135 136 137 138 -gray44 7 139 140 141 142 143 144 145 -gray44 7 146 147 148 149 150 151 152 -gray44 7 153 154 155 156 157 158 159 -gray44 7 160 161 162 163 164 165 166 -gray44 7 167 168 169 170 171 172 173 -gray44 7 174 175 176 177 178 179 180 -gray44 13 181 182 183 184 185 186 187 188 189 190 191 192 193 -gray44 6 194 195 196 197 198 199 -gray44 7 200 201 202 203 204 205 206 -gray44 8 207 208 209 210 211 212 213 214 -gray44 8 215 216 217 218 219 220 221 222 -gray44 8 223 224 225 226 227 228 229 230 -gray44 7 231 232 233 234 235 236 237 diff -Nru acm-5.0/objects/Makefile.in acm-6.0+20200416/objects/Makefile.in --- acm-5.0/objects/Makefile.in 1998-08-17 15:44:38.000000000 +0000 +++ acm-6.0+20200416/objects/Makefile.in 1970-01-01 00:00:00.000000000 +0000 @@ -1,49 +0,0 @@ - srcdir = @srcdir@ - -prefix = /usr/local - - bindir = $(prefix)/bin - VPATH = @srcdir@ - SHELL = /bin/sh - SLIBS = @LIBS@ - INSTALL = @INSTALL@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_DATA = @INSTALL_DATA@ - TOPDIR = .. - OBVDIR = @OBVDIR@ - -ACM_OBJECT_LIBRARY = $(OBVDIR) - SCENES = default-scene dallas-scene - OBJECTS = inventory f16.obv f18.obv \ - su30.obv mig23.obv mig25.obv mig29.obv \ - kc135.obv c172.obv aim9.obv tracer.obv tower.obv \ - f117.dxf il78.obv sa2.obv sa10.obv sa11.obv \ - hangar.obv surface.obv telar1.obv \ - acmlogo-unix.xwd object-map.txt munition-map.txt - SOUNDS = aconnon.au cannon.au crash.au engine.au gear_up.au \ - gear_dn.au imarker.au missile.au \ - mmarker.au omarker.au \ - rwr.au screetch.au stall.au apglock.au - -all clean mostlyclean realclean info dvi dist depend: - -install: - -mkdir -p $(ACM_OBJECT_LIBRARY) - @for i in $(SCENES) $(OBJECTS) $(SOUNDS) ; do \ - echo Installing $$i ... ; \ - rm -rf $(ACM_OBJECT_LIBRARY)$$i ; \ - $(INSTALL_DATA) $(srcdir)/$$i $(ACM_OBJECT_LIBRARY)$$i ; \ - done - -uninstall: - @for i in $(SCENES) $(OBJECTS) $(SOUNDS) ; do \ - echo Uninstalling $$i ... ; \ - rm -f $(ACM_OBJECT_LIBRARY)/$$i ; \ - done - -distclean: - rm -f Makefile - -realclean: distclean - -test check tags TAGS: diff -Nru acm-5.0/objects/mig23.obv acm-6.0+20200416/objects/mig23.obv --- acm-5.0/objects/mig23.obv 1998-08-14 02:27:10.000000000 +0000 +++ acm-6.0+20200416/objects/mig23.obv 1970-01-01 00:00:00.000000000 +0000 @@ -1,100 +0,0 @@ -mig-23-wings-swept -88 10 -1 36.5891 0 0 -2 34.4368 0.86092 0 -3 30.9931 1.29138 0 -4 27.119 1.72184 0 -5 20.6621 1.72184 0 -6 18.9402 2.1523 0 -7 14.2052 3.01322 0 -8 -3.44368 2.58276 0 -9 -9.03966 2.1523 0 -10 -16.7879 0.86092 0 -11 -18.0793 0.43046 0 -12 -18.0793 0 0 -13 36.5891 0 0 -14 34.4368 -0.86092 0 -15 30.9931 -1.29138 0 -16 27.119 -1.72184 0 -17 20.6621 -1.72184 0 -18 18.9402 -2.1523 0 -19 14.2052 -3.01322 0 -20 -3.44368 -2.58276 0 -21 -9.03966 -2.1523 0 -22 -16.7879 -0.86092 0 -23 -18.0793 -0.43046 0 -24 -18.0793 0 0 -25 14.2052 3.01322 -3.01322 -26 4.73506 7.31782 -3.01322 -27 6.02644 8.6092 -3.01322 -28 -11.192 13.7747 -3.01322 -29 -12.0529 13.7747 -3.01322 -30 -14.2052 11.192 -3.01322 -31 -14.2052 10.7615 -3.01322 -32 -3.44368 2.58276 -3.01322 -33 14.2052 -3.01322 -3.01322 -34 4.73506 -7.31782 -3.01322 -35 6.02644 -8.6092 -3.01322 -36 -11.192 -13.7747 -3.01322 -37 -12.0529 -13.7747 -3.01322 -38 -14.2052 -11.192 -3.01322 -39 -14.2052 -10.7615 -3.01322 -40 -3.44368 -2.58276 -3.01322 -41 -18.9402 3.01322 -1.72184 -42 -20.2316 7.31782 -1.72184 -43 -18.5098 8.6092 -1.72184 -44 -9.03966 2.1523 -1.72184 -45 -16.7879 0.86092 -1.72184 -46 -18.9402 -3.01322 -1.72184 -47 -20.2316 -7.31782 -1.72184 -48 -18.5098 -8.6092 -1.72184 -49 -9.03966 -2.1523 -1.72184 -50 -16.7879 -0.86092 -1.72184 -51 36.5891 0 0 -52 33.1454 0 -1.29138 -53 30.1322 0 -2.1523 -54 25.8276 0 -2.58276 -55 22.3839 0 -3.87414 -56 18.0793 0 -4.3046 -57 9.47012 0 -3.87414 -58 -0.860918 0 -3.44368 -59 -8.6092 0 -6.02644 -60 -16.3575 0 -10.331 -61 -18.9402 0 -9.03966 -62 -18.0793 0 -3.87414 -63 -19.8012 0 -3.44368 -64 -17.2184 0 -1.72184 -65 -18.0793 0 -1.72184 -66 -18.0793 0 1.29138 -67 -15.4966 0 1.72184 -68 -6.4569 0 2.1523 -69 10.331 0 2.1523 -70 20.2316 0 1.72184 -71 28.8408 0 1.29138 -72 33.1454 0 0.86092 -73 -15.4966 0 1.72184 -74 -15.4966 0 4.3046 -75 -13.3443 0 5.16552 -76 -6.4569 0 2.1523 -77 20.6621 1.72184 -3.01322 -78 18.9402 2.1523 -3.01322 -79 14.2052 3.01322 -3.01322 -80 -3.44368 2.58276 -3.01322 -81 -3.44368 -2.58276 -3.01322 -82 14.2052 -3.01322 -3.01322 -83 18.9402 -2.1523 -3.01322 -84 20.6621 -1.72184 -3.01322 -85 -3.44368 2.58276 -3.01322 -86 -16.7879 0.86092 -1.72184 -87 -16.7879 -0.86092 -1.72184 -88 -3.44368 -2.58276 -3.01322 -gray44 12 1 2 3 4 5 6 7 8 9 10 11 12 -gray44 12 13 14 15 16 17 18 19 20 21 22 23 24 -gray44 8 25 26 27 28 29 30 31 32 -gray44 8 33 34 35 36 37 38 39 40 -gray44 5 41 42 43 44 45 -gray44 5 46 47 48 49 50 -gray44 22 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 -gray44 4 73 74 75 76 -gray44 8 77 78 79 80 81 82 83 84 -gray44 4 85 86 87 88 diff -Nru acm-5.0/objects/mig25.obv acm-6.0+20200416/objects/mig25.obv --- acm-5.0/objects/mig25.obv 1998-08-14 02:27:13.000000000 +0000 +++ acm-6.0+20200416/objects/mig25.obv 1970-01-01 00:00:00.000000000 +0000 @@ -1,186 +0,0 @@ -Mig-25-RBR -159 25 -1 -10.0068 -3.35328 -2.65239 -2 -24.836 -3.49633 -1.80845 -3 -24.7758 -4.21971 1.3262 -4 -12.7797 -4.40056 1.92901 -5 -12.7797 4.40056 1.92901 -6 -24.7758 4.21971 1.3262 -7 -24.836 3.49633 -1.80845 -8 -10.0068 3.35328 -2.65239 -9 -12.7312 4.48625 1.94 -10 -15.2775 5.335 3.75875 -11 -24.4925 4.85 2.6675 -12 -24.735 4.23235 1.33375 -13 -23.28 4.22906 1.33375 -14 -10 -4.86127 -2.5 -15 -10.25 -5.75 2.25 -16 12.875 -5.625 2.25 -17 20.75 -4.625 -2.875 -18 20.75 4.625 -2.875 -19 12.875 5.625 2.25 -20 -10.25 5.75 2.25 -21 -10 4.86127 -2.5 -22 12.8867 -2.22292 2.32396 -23 20.7135 -2.62708 -3.03125 -24 20.7135 -4.95104 -3.03125 -25 13.0344 -4.95104 2.22292 -26 13.0344 4.95104 2.22292 -27 20.7135 4.95104 -3.03125 -28 20.7135 2.62708 -3.03125 -29 12.8867 2.22292 2.32396 -30 41.4675 0 0 -31 35.89 1.6975 0 -32 29.2212 2.425 0 -33 23.0375 2.54625 0 -34 13.095 2.425 0 -35 12.8525 5.69875 0 -36 1.6975 5.94125 0 -37 -11.155 5.82 0 -38 -24.735 4.97125 0 -39 -26.19 4.48625 0 -40 -25.8262 0.60625 0 -41 -23.0375 -0.12125 0 -42 -19.5212 0.12125 -2.7672 -43 -19.7637 4.72875 -2.98536 -44 -10.67 5.69875 -3.06372 -45 2.78875 5.82 -3.11723 -46 12.7312 5.82 -3.1525 -47 20.855 5.21375 -3.1525 -48 20.7338 0.12125 -2.91 -49 20.7338 -0.12125 -2.91 -50 20.855 -5.21375 -3.1525 -51 12.7312 -5.82 -3.1525 -52 2.78875 -5.82 -3.11723 -53 -10.67 -5.69875 -3.06372 -54 -19.7637 -4.72875 -2.98536 -55 -19.5212 -0.12125 -2.7672 -56 4.72875 -0.12125 1.59646 -57 4.72875 2.06125 2.44521 -58 4.72875 4.00125 2.68771 -59 4.72875 5.0925 2.44521 -60 4.72875 5.5775 1.47521 -61 4.72875 5.5775 -3.01104 -62 4.72875 0 -3.37479 -63 4.72875 0 -3.37479 -64 4.72875 -5.5775 -3.01104 -65 4.72875 -5.5775 1.47521 -66 4.72875 -5.0925 2.44521 -67 4.72875 -4.00125 2.68771 -68 4.72875 -2.06125 2.44521 -69 4.72875 0.12125 1.59646 -70 20.855 0 2.6675 -71 20.855 1.455 2.54625 -72 20.855 2.425 0.84875 -73 20.855 2.06125 -3.03125 -74 20.855 1.33375 -3.395 -75 20.855 0.97 -4.24375 -76 20.855 -0.12125 -4.48625 -77 20.855 0.12125 -4.48625 -78 20.855 -0.97 -4.24375 -79 20.855 -1.33375 -3.395 -80 20.855 -2.06125 -3.03125 -81 20.855 -2.425 0.84875 -82 20.855 -1.455 2.54625 -83 20.855 0 2.6675 -84 11.2762 -4.50912 2.30375 -85 -13.4588 -3.0127 2.30375 -86 -25.9475 -2.31928 1.57625 -87 -25.9475 -2.64032 -2.1825 -88 -14.6712 -3.395 -3.03125 -89 -5.335 -4.00125 -3.51625 -90 7.0325 -4.72875 -3.27375 -91 7.0325 4.72875 -3.27375 -92 -5.335 4.00125 -3.51625 -93 -14.6712 3.395 -3.03125 -94 -25.9475 2.64032 -2.1825 -95 -25.9475 2.31928 1.57625 -96 -13.4588 3.0127 2.30375 -97 11.2762 4.50912 2.30375 -98 -25.705 -3.75875 0.932298 -99 -27.0388 -5.45625 0.950218 -100 -27.7662 -5.69875 0.974422 -101 -31.4037 -12.8525 0.97 -102 -29.2212 -14.4287 0.84875 -103 -18.1875 -4.85 0.60625 -104 -18.1875 4.85 0.60625 -105 -29.2212 14.4287 0.84875 -106 -31.4037 12.8525 0.97 -107 -27.7662 5.69875 0.974422 -108 -27.0388 5.45625 0.950218 -109 -25.705 3.75875 0.932298 -110 -23.5225 5.02122 -1.94 -111 -25.9475 5.43057 -2.91 -112 -27.2813 7.4293 -10.7912 -113 -24.8562 7.5175 -11.8825 -114 -12.125 4.6075 -3.6375 -115 -7.0325 4.1225 -3.1525 -116 -7.0325 -4.1225 -3.1525 -117 -12.125 -4.6075 -3.6375 -118 -24.8562 -7.5175 -11.8825 -119 -27.2813 -7.4293 -10.7912 -120 -25.9475 -5.43057 -2.91 -121 -23.5225 -5.02122 -1.94 -122 -23.0375 0.12125 0 -123 -25.8262 -0.60625 0 -124 -26.19 -4.48625 0 -125 -24.735 -4.97125 0 -126 -11.155 -5.82 0 -127 1.6975 -5.94125 0 -128 12.8525 -5.69875 0 -129 13.095 -2.425 0 -130 23.0375 -2.54625 0 -131 29.2212 -2.425 0 -132 35.89 -1.6975 0 -133 41.4675 0 0 -134 -14.55 -5.21375 -2.49806 -135 -16.975 -22.4312 -0.2425 -136 -8.36625 -22.1887 -0.485 -137 4.72875 -5.69875 -2.91 -138 4.72875 5.69875 -2.91 -139 -8.36625 22.1887 -0.485 -140 -16.975 22.4312 -0.2425 -141 -14.55 5.21375 -2.49806 -142 -23.28 -4.22906 1.33375 -143 -24.735 -4.23235 1.33375 -144 -24.4925 -4.85 2.6675 -145 -15.2775 -5.335 3.75875 -146 -12.7312 -4.48625 1.94 -147 41.5887 0 0 -148 35.5262 0 -1.57625 -149 28.2512 0 -2.54625 -150 25.4625 0 -2.78875 -151 21.7037 0 -4.48625 -152 20.6125 0 -4.72875 -153 11.2762 0 -4.48625 -154 -26.7963 0 -2.54625 -155 -27.16 0 -2.1825 -156 -14.9138 0 2.30375 -157 -4.00125 0 2.91 -158 28.615 0 1.81875 -159 37.83 0 0.84875 -gray44 4 1 2 3 4 -gray44 4 5 6 7 8 -gray44 5 9 10 11 12 13 -gray44 4 14 15 16 17 -gray44 4 18 19 20 21 -gray44 4 22 23 24 25 -gray44 4 26 27 28 29 -gray44 12 30 31 32 33 34 35 36 37 38 39 40 41 -gray44 7 42 43 44 45 46 47 48 -gray44 7 49 50 51 52 53 54 55 -gray44 7 56 57 58 59 60 61 62 -gray44 7 63 64 65 66 67 68 69 -gray44 7 70 71 72 73 74 75 76 -gray44 7 77 78 79 80 81 82 83 -gray44 7 84 85 86 87 88 89 90 -gray44 7 91 92 93 94 95 96 97 -gray44 6 98 99 100 101 102 103 -gray44 6 104 105 106 107 108 109 -gray44 6 110 111 112 113 114 115 -gray44 6 116 117 118 119 120 121 -gray44 12 122 123 124 125 126 127 128 129 130 131 132 133 -gray44 4 134 135 136 137 -gray44 4 138 139 140 141 -gray44 5 142 143 144 145 146 -gray44 13 147 148 149 150 151 152 153 154 155 156 157 158 159 diff -Nru acm-5.0/objects/mig29.obv acm-6.0+20200416/objects/mig29.obv --- acm-5.0/objects/mig29.obv 1998-08-14 02:27:17.000000000 +0000 +++ acm-6.0+20200416/objects/mig29.obv 1970-01-01 00:00:00.000000000 +0000 @@ -1,262 +0,0 @@ -object -235 25 -1 -20.7292 -3.91308 -0.575279 -2 -20.7292 -3.49195 -0.996413 -3 -20.7292 -2.91667 -1.15056 -4 -20.7292 -2.34139 -0.996413 -5 -20.7292 -1.92025 -0.575279 -6 -20.7292 -1.76611 6.51849e-16 -7 -20.7292 -1.92025 0.575279 -8 -20.7292 -2.34139 0.996413 -9 -20.7292 -2.91667 1.15056 -10 -20.7292 -3.49195 0.996413 -11 -20.7292 -3.91308 0.575279 -12 -20.7292 -4.06723 0 -13 -20.7292 4.06723 0 -14 -20.7292 3.91308 0.575279 -15 -20.7292 3.49195 0.996413 -16 -20.7292 2.91667 1.15056 -17 -20.7292 2.34139 0.996413 -18 -20.7292 1.92025 0.575279 -19 -20.7292 1.76611 6.51849e-16 -20 -20.7292 1.92025 -0.575279 -21 -20.7292 2.34139 -0.996413 -22 -20.7292 2.91667 -1.15056 -23 -20.7292 3.49195 -0.996413 -24 -20.7292 3.91308 -0.575279 -25 7.5636 -3.46665 1.78585 -26 7.5636 -1.57575 1.78585 -27 10.9252 -1.78585 -0.6303 -28 10.9252 -3.3616 -0.6303 -29 10.9252 3.3616 -0.6303 -30 10.9252 1.78585 -0.6303 -31 7.5636 1.57575 1.78585 -32 7.5636 3.46665 1.78585 -33 -17.3332 -3.5717 0.73535 -34 -17.3332 -2.41615 0.73535 -35 -17.3332 -1.4707 -0.2101 -36 -17.3332 -0 -1.15555 -37 -17.3332 -0.10505 -2.101 -38 -17.3332 -3.04645 -2.3111 -39 -17.3332 -4.30705 -1.8909 -40 -17.3332 -6.0929 -1.4707 -41 -17.3332 -5.8828 -1.0505 -42 -17.3332 -5.2525 -0.8404 -43 -17.3332 -4.30705 -0.10505 -44 -17.3332 4.30705 -0.10505 -45 -17.3332 5.2525 -0.8404 -46 -17.3332 5.8828 -1.0505 -47 -17.3332 6.0929 -1.4707 -48 -17.3332 4.30705 -1.8909 -49 -17.3332 3.04645 -2.3111 -50 -17.3332 0.10505 -2.101 -51 -17.3332 0 -1.15555 -52 -17.3332 1.4707 -0.2101 -53 -17.3332 2.41615 0.73535 -54 -17.3332 3.5717 0.73535 -55 -5.0424 5.56765 -2.101 -56 -8.6141 5.8828 -3.25655 -57 -18.5938 7.3535 -10.7151 -58 -20.3797 7.29856 -9.76965 -59 -20.0646 7.00651 -7.7737 -60 -20.2747 7.0009 -7.66865 -61 -19.6443 6.35817 -3.25655 -62 -19.0141 6.28704 -2.9414 -63 -19.0141 5.97926 -0.73535 -64 -11.7656 5.68152 -0.8404 -65 -16.703 -0.10505 -1.6808 -66 -18.0686 -4.30705 -1.6808 -67 -19.8544 -4.93735 -1.6808 -68 -20.4848 -5.56765 -1.6808 -69 -14.1818 -5.8828 -1.6808 -70 4.09695 -5.77775 -1.6808 -71 7.5636 -5.2525 -1.6808 -72 19.8544 -1.57575 -1.6808 -73 22.1655 -1.57575 -1.6808 -74 25.4221 -1.36565 -1.6808 -75 29.8342 -0.10505 -1.6808 -76 -18.804 -5.35755 -1.66969 -77 -21.7454 -6.303 -1.55248 -78 -25.212 -12.2909 -0.8404 -79 -22.0605 -13.2363 -0.73535 -80 -13.2363 -5.35755 -1.6808 -81 -11.7656 -5.68152 -0.8404 -82 -19.0141 -5.97926 -0.73535 -83 -19.0141 -6.28704 -2.9414 -84 -19.6443 -6.35817 -3.25655 -85 -20.2747 -7.0009 -7.66865 -86 -20.0646 -7.00651 -7.7737 -87 -20.3797 -7.29856 -9.76965 -88 -18.5938 -7.3535 -10.7151 -89 -8.6141 -5.8828 -3.25655 -90 -5.0424 -5.56765 -2.101 -91 -20.9049 -2.88888 1.4707 -92 -16.3878 -2.87903 1.36565 -93 -7.66865 -2.78723 1.8909 -94 1.8909 -2.73367 1.99595 -95 4.4121 -2.72231 1.99595 -96 7.5636 -2.71862 1.8909 -97 10.9252 -2.97661 -0.8404 -98 7.9838 -3.00036 -0.94545 -99 6.5131 -3.11204 -1.99595 -100 0.52525 -3.14951 -2.101 -101 -9.2444 -3.1515 -1.6808 -102 -20.9049 -3.1515 -1.15555 -103 -20.9049 -3.04645 -0.10505 -104 -15.5474 -1.15555 0.0642234 -105 -20.9049 -1.8909 -0.10505 -106 -20.7999 -4.09695 -0.10505 -107 -17.4383 -4.4121 0 -108 -17.4383 4.4121 0 -109 -20.7999 4.09695 -0.10505 -110 -20.9049 1.8909 -0.10505 -111 -15.5474 1.15555 0.0642234 -112 -20.9049 3.04645 -0.10505 -113 -20.9049 3.1515 -1.15555 -114 -9.2444 3.1515 -1.6808 -115 0.52525 3.14951 -2.101 -116 6.5131 3.11204 -1.99595 -117 7.9838 3.00036 -0.94545 -118 10.9252 2.97661 -0.8404 -119 7.5636 2.71862 1.8909 -120 4.4121 2.72231 1.99595 -121 1.8909 2.73367 1.99595 -122 -7.66865 2.78723 1.8909 -123 -16.3878 2.87903 1.36565 -124 -20.9049 2.88888 1.4707 -125 -13.2363 5.35755 -1.6808 -126 -22.0605 13.2363 -0.73535 -127 -25.212 12.2909 -0.8404 -128 -21.7454 6.303 -1.55248 -129 -18.804 5.35755 -1.66969 -130 29.8342 0.10505 -1.6808 -131 25.4221 1.36565 -1.6808 -132 22.1655 1.57575 -1.6808 -133 19.8544 1.57575 -1.6808 -134 7.5636 5.2525 -1.6808 -135 4.09695 5.77775 -1.6808 -136 -14.1818 5.8828 -1.6808 -137 -20.4848 5.56765 -1.6808 -138 -19.8544 4.93735 -1.6808 -139 -18.0686 4.30705 -1.6808 -140 -16.703 0.10505 -1.6808 -141 29.8342 0 -1.6808 -142 26.6827 0 -3.04645 -143 23.5312 0 -3.67675 -144 19.3292 0 -4.30705 -145 16.5979 0 -5.98785 -146 15.1272 0 -6.19795 -147 12.7111 0 -5.98785 -148 1.4707 0 -3.7818 -149 -19.4343 0 -0.94545 -150 -18.5938 0 -0.2101 -151 12.501 0 -0.31515 -152 19.3292 0 -0.52525 -153 21.8504 0 -0.2101 -154 26.2625 0 -0.4202 -155 29.309 0 -0.94545 -156 3.1515 5.6727 -2.101 -157 -11.0303 5.4626 -1.99595 -158 -12.606 19.1191 -0.52525 -159 -12.1858 19.5393 -0.48421 -160 -9.97975 19.7494 -0.481629 -161 -9.6646 19.4343 -0.518073 -162 -7.7737 19.3292 -0.546272 -163 -7.7737 -19.3292 -0.546272 -164 -9.6646 -19.4343 -0.518073 -165 -9.97975 -19.7494 -0.481629 -166 -12.1858 -19.5393 -0.48421 -167 -12.606 -19.1191 -0.52525 -168 -11.0303 -5.4626 -1.99595 -169 3.1515 -5.6727 -2.101 -170 -9.8747 -2.5212 1.8909 -171 -9.8747 -3.7818 1.36565 -172 -9.8747 -4.09695 -0.4202 -173 -9.8747 -5.14745 -0.6303 -174 -9.8747 -5.6727 -1.15555 -175 -9.8747 -19.7494 -0.52525 -176 -9.8747 -5.98785 -2.101 -177 -9.8747 -3.9919 -2.7313 -178 -9.8747 -2.62625 -2.9414 -179 -9.8747 0.10505 -3.25655 -180 -9.8747 0 -0.10505 -181 -9.8747 -0.94545 -0.2101 -182 -9.8747 -1.6808 0.52525 -183 -9.8747 1.6808 0.52525 -184 -9.8747 0.94545 -0.2101 -185 -9.8747 -0 -0.10505 -186 -9.8747 -0.10505 -3.25655 -187 -9.8747 2.62625 -2.9414 -188 -9.8747 3.9919 -2.7313 -189 -9.8747 5.98785 -2.101 -190 -9.8747 19.7494 -0.52525 -191 -9.8747 5.6727 -1.15555 -192 -9.8747 5.14745 -0.6303 -193 -9.8747 4.09695 -0.4202 -194 -9.8747 3.7818 1.36565 -195 -9.8747 2.5212 1.8909 -196 15.5474 0 -6.19795 -197 15.5474 -0.94545 -5.77775 -198 15.5474 -1.4707 -4.8323 -199 15.5474 -1.57575 -3.9919 -200 15.5474 -1.78585 -2.101 -201 15.5474 -1.36565 -1.0505 -202 15.5474 -0.52525 -0.52525 -203 15.5474 0.10505 -0.31515 -204 15.5474 -0.10505 -0.31515 -205 15.5474 0.52525 -0.52525 -206 15.5474 1.36565 -1.0505 -207 15.5474 1.78585 -2.101 -208 15.5474 1.57575 -3.9919 -209 15.5474 1.4707 -4.8323 -210 15.5474 0.94545 -5.77775 -211 15.5474 0 -6.19795 -212 4.202 -2.62625 1.99595 -213 4.202 -3.7818 1.57575 -214 4.202 -3.9919 -0.2101 -215 4.202 -5.14745 -0.52525 -216 4.202 -5.77775 -0.94545 -217 4.202 -5.8828 -1.8909 -218 4.202 -3.7818 -2.5212 -219 4.202 0 -3.04645 -220 4.202 0 0 -221 4.202 -1.15555 0 -222 4.202 -1.8909 1.0505 -223 4.202 -2.20605 1.78585 -224 4.202 2.20605 1.78585 -225 4.202 1.8909 1.0505 -226 4.202 1.15555 0 -227 4.202 -0 0 -228 4.202 -0 -3.04645 -229 4.202 3.7818 -2.5212 -230 4.202 5.8828 -1.8909 -231 4.202 5.77775 -0.94545 -232 4.202 5.14745 -0.52525 -233 4.202 3.9919 -0.2101 -234 4.202 3.7818 1.57575 -235 4.202 2.62625 1.99595 -(black gray44) 12 1 2 3 4 5 6 7 8 9 10 11 12 -(black gray44) 12 13 14 15 16 17 18 19 20 21 22 23 24 -(black gray44) 4 25 26 27 28 -(black gray44) 4 29 30 31 32 -gray44 11 33 34 35 36 37 38 39 40 41 42 43 -gray44 11 44 45 46 47 48 49 50 51 52 53 54 -gray44 10 55 56 57 58 59 60 61 62 63 64 -gray44 11 65 66 67 68 69 70 71 72 73 74 75 -gray44 5 76 77 78 79 80 -gray44 10 81 82 83 84 85 86 87 88 89 90 -gray44 13 91 92 93 94 95 96 97 98 99 100 101 102 103 -gray44 4 104 105 106 107 -gray44 4 108 109 110 111 -gray44 13 112 113 114 115 116 117 118 119 120 121 122 123 124 -gray44 5 125 126 127 128 129 -gray44 11 130 131 132 133 134 135 136 137 138 139 140 -gray44 15 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 -gray44 7 156 157 158 159 160 161 162 -gray44 7 163 164 165 166 167 168 169 -gray44 13 170 171 172 173 174 175 176 177 178 179 180 181 182 -gray44 13 183 184 185 186 187 188 189 190 191 192 193 194 195 -gray44 8 196 197 198 199 200 201 202 203 -gray44 8 204 205 206 207 208 209 210 211 -gray44 12 212 213 214 215 216 217 218 219 220 221 222 223 -gray44 12 224 225 226 227 228 229 230 231 232 233 234 235 Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/objects/missile.au and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/objects/missile.au differ diff -Nru acm-5.0/objects/missiles/aim9.obv acm-6.0+20200416/objects/missiles/aim9.obv --- acm-5.0/objects/missiles/aim9.obv 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/objects/missiles/aim9.obv 2017-04-27 06:05:48.000000000 +0000 @@ -0,0 +1,73 @@ +AIM9M +66 5 +1 -0.9167 0 0 +2 -0.9167 0.0833 0 +3 -1 0.1667 0 +4 -1.6667 0.25 0 +5 -1.8333 0.25 0 +6 -2.3333 0.8333 0 +7 -2.4167 1 0 +8 -2.4167 0.25 0 +9 -7.5833 0.25 0 +10 -8 1 0 +11 -9 1 0 +12 -9 -1 0 +13 -8 -1 0 +14 -7.5833 -0.25 0 +15 -2.4167 -0.25 0 +16 -2.4167 -1 0 +17 -2.3333 -0.8333 0 +18 -1.8333 -0.25 0 +19 -1.6667 -0.25 0 +20 -1 -0.1667 0 +21 -0.9167 -0.0833 0 +1 -0.9167 0 0 +2 -0.9167 0 0.0833 +3 -1 0 0.1667 +4 -1.6667 0 0.25 +5 -1.8333 0 0.25 +6 -2.3333 0 0.8333 +7 -2.4167 0 1 +8 -2.4167 0 0.25 +9 -7.5833 0 0.25 +10 -8 0 1 +11 -9 0 1 +12 -9 0 -1 +13 -8 0 -1 +14 -7.5833 0 -0.25 +15 -2.4167 0 -0.25 +16 -2.4167 0 -1 +17 -2.3333 0 -0.8333 +18 -1.8333 0 -0.25 +19 -1.6667 0 -0.25 +20 -1 0 -0.1667 +21 -0.9167 0 -0.0833 +43 -9 0.25 0 +44 -9 0.1768 0.1768 +45 -9 0 0.25 +46 -9 -0.1768 0.1768 +47 -9 -0.25 0 +48 -9 -0.1768 -0.1768 +49 -9 0 -0.25 +50 -9 0.1768 -0.1768 +51 -9 -0.25 0 +52 -9.75 -0.5 0 +53 -12 -0.75 0 +54 -13.5 -0.75 0 +55 -12.75 -0.5 0 +56 -15.25 -0.5 0 +57 -19.9167 0 0 +58 -15.0833 0.4167 0 +59 -15.75 0.5 0 +60 -12.5833 0.6667 0 +61 -12.0833 0.5833 0 +62 -9.833 0.5 0 +63 -9 0.25 0 +64 -12.5833 0 0.6667 +65 -12.5833 -0.6667 0 +66 -12.5833 0 -0.6667 +white 21 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 +white 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 +white 8 43 44 45 46 47 48 49 50 +white 13 51 52 53 54 55 56 57 58 59 60 61 62 63 +white 4 60 64 65 66 diff -Nru acm-5.0/objects/missiles/sa10.obv acm-6.0+20200416/objects/missiles/sa10.obv --- acm-5.0/objects/missiles/sa10.obv 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/objects/missiles/sa10.obv 2017-04-27 06:05:48.000000000 +0000 @@ -0,0 +1,70 @@ +SA10 +56 12 +1 -4.50593 0.0308625 0 +2 -4.50593 0.216037 0 +3 3.67264 0.216037 0 +4 4.10471 0.185175 0 +5 4.32075 0.0925875 0 +6 4.35161 -0.0308625 0 +7 -4.16644 0.277763 0 +8 -4.13558 0.709838 0 +9 -2.83935 0.709838 0 +10 -2.56159 0.277763 0 +11 2.40728 0.277763 0 +12 2.40728 0.432075 0 +13 2.90108 0.432075 0 +14 3.08625 0.2469 0 +15 3.08625 -0.2469 0 +16 2.90108 -0.432075 0 +17 2.40728 -0.432075 0 +18 2.40728 -0.277763 0 +19 -2.56159 -0.277763 0 +20 -2.83935 -0.709838 0 +21 -4.13558 -0.709838 0 +22 -4.16644 -0.277763 0 +23 4.35161 0.0308625 0 +24 4.32075 -0.0925875 0 +25 4.10471 -0.185175 0 +26 3.67264 -0.216037 0 +27 -4.50593 -0.216037 0 +28 -4.50593 -0.0308625 0 +29 -4.50593 0 0.0308625 +30 -4.50593 0 0.216037 +31 3.67264 0 0.216037 +32 4.10471 0 0.185175 +33 4.32075 0 0.0925875 +34 4.35161 0 -0.0308625 +35 -4.16644 0 0.277763 +36 -4.13558 0 0.709838 +37 -2.83935 0 0.709838 +38 -2.56159 0 0.277763 +39 2.40728 0 0.277763 +40 2.40728 0 0.432075 +41 2.90108 0 0.432075 +42 3.08625 0 0.2469 +43 3.08625 0 -0.2469 +44 2.90108 0 -0.432075 +45 2.40728 0 -0.432075 +46 2.40728 0 -0.277763 +47 -2.56159 0 -0.277763 +48 -2.83935 0 -0.709838 +49 -4.13558 0 -0.709838 +50 -4.16644 0 -0.277763 +51 4.35161 0 0.0308625 +52 4.32075 0 -0.0925875 +53 4.10471 0 -0.185175 +54 3.67264 0 -0.216037 +55 -4.50593 0 -0.216037 +56 -4.50593 0 -0.0308625 +white 6 1 2 3 4 5 6 +white 4 7 8 9 10 +white 4 11 12 13 14 +white 4 15 16 17 18 +white 4 19 20 21 22 +white 6 23 24 25 26 27 28 +white 6 29 30 31 32 33 34 +white 4 35 36 37 38 +white 4 39 40 41 42 +white 4 43 44 45 46 +white 4 47 48 49 50 +white 6 51 52 53 54 55 56 diff -Nru acm-5.0/objects/missiles/sa11.obv acm-6.0+20200416/objects/missiles/sa11.obv --- acm-5.0/objects/missiles/sa11.obv 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/objects/missiles/sa11.obv 2017-04-27 06:05:48.000000000 +0000 @@ -0,0 +1,109 @@ +SA11 +92 15 +1 -3.21732 0.234596 0 +2 -3.21732 0.203166 0.117298 +3 -3.21732 0.117298 0.203166 +4 -3.21732 0 0.234596 +5 -3.21732 -0.117298 0.203166 +6 -3.21732 -0.203166 0.117298 +7 -3.21732 -0.234596 -2.3813e-16 +8 -3.21732 -0.203166 -0.117298 +9 -3.21732 -0.117298 -0.203166 +10 -3.21732 4.76259e-16 -0.234596 +11 -3.21732 0.117298 -0.203166 +12 -3.21732 0.203166 -0.117298 +13 -2.64759 0 -0.201082 +14 -2.84867 0 -0.603248 +15 -3.18381 0 -0.603248 +16 -3.28435 0 -0.234596 +17 2.88218 0 0.0335138 +18 2.48002 0 -0.167569 +19 2.04434 0 -0.201082 +20 1.44109 0 -0.234596 +21 -3.31786 0 -0.234596 +22 -3.35137 0 0 +23 0 0 -0.26811 +24 0 0 -0.26811 +25 0 0 -0.26811 +26 0 0 -0.26811 +27 0 0 -0.26811 +28 0 0 -0.26811 +29 0 0 -0.26811 +30 0 0 -0.26811 +31 0 0 -0.26811 +32 0 0 -0.26811 +33 0 0 -0.26811 +34 0 0 -0.26811 +35 0 -0.0335138 -0.0335138 +36 0 -0.0335138 -0.0335138 +37 0 -0.0335138 -0.0335138 +38 0 -0.0335138 -0.0335138 +39 0 -0.0335138 -0.0335138 +40 0 -0.0335138 -0.0335138 +41 0 -0.0335138 -0.0335138 +42 0 -0.0335138 -0.0335138 +43 0 -0.0335138 -0.0335138 +44 0 -0.0335138 -0.0335138 +45 0 -0.0335138 -0.0335138 +46 0 -0.0335138 -0.0335138 +47 -3.28435 0.234596 0 +48 -3.18381 0.603248 0 +49 -2.84867 0.603248 0 +50 -2.64759 0.201082 0 +51 -2.24542 0.301624 0 +52 -1.9438 0.603248 0 +53 -0.469193 0.603248 0 +54 -0.100541 0.26811 0 +55 -3.35137 -0 0 +56 -3.31786 0.234596 0 +57 1.44109 0.234596 0 +58 2.04434 0.201082 0 +59 2.48002 0.167569 0 +60 2.88218 -0.0335138 0 +61 2.88218 0.0335138 0 +62 2.48002 -0.167569 0 +63 2.04434 -0.201082 0 +64 1.44109 -0.234596 0 +65 -3.31786 -0.234596 0 +66 -3.35137 0 0 +67 -0.100541 -0.26811 0 +68 -0.469193 -0.603248 0 +69 -1.9438 -0.603248 0 +70 -2.24542 -0.301624 0 +71 -2.64759 -0.201082 0 +72 -2.84867 -0.603248 0 +73 -3.18381 -0.603248 0 +74 -3.28435 -0.234596 0 +75 -3.28435 0 0.234596 +76 -3.18381 0 0.603248 +77 -2.84867 0 0.603248 +78 -2.64759 0 0.201082 +79 -2.24542 0 0.301624 +80 -1.9438 0 0.603248 +81 -0.469193 0 0.603248 +82 -0.100541 0 0.26811 +83 -3.35137 0 -0 +84 -3.31786 0 0.234596 +85 1.44109 0 0.234596 +86 2.04434 0 0.201082 +87 2.48002 0 0.167569 +88 2.88218 0 -0.0335138 +89 -0.100541 0 -0.26811 +90 -0.469193 0 -0.603248 +91 -1.9438 0 -0.603248 +92 -2.24542 0 -0.301624 +white 12 1 2 3 4 5 6 7 8 9 10 11 12 +white 4 13 14 15 16 +white 6 17 18 19 20 21 22 +white 12 23 24 25 26 27 28 29 30 31 32 33 34 +white 12 35 36 37 38 39 40 41 42 43 44 45 46 +white 4 47 48 49 50 +white 4 51 52 53 54 +white 6 55 56 57 58 59 60 +white 6 61 62 63 64 65 66 +white 4 67 68 69 70 +white 4 71 72 73 74 +white 4 75 76 77 78 +white 4 79 80 81 82 +white 6 83 84 85 86 87 88 +white 4 89 90 91 92 diff -Nru acm-5.0/objects/missiles/sa2.obv acm-6.0+20200416/objects/missiles/sa2.obv --- acm-5.0/objects/missiles/sa2.obv 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/objects/missiles/sa2.obv 2017-04-27 06:05:48.000000000 +0000 @@ -0,0 +1,116 @@ +SA2 +96 18 +1 21.62 2.1205 -0.23 +2 21.62 1.8364 0.830248 +3 21.62 1.06025 1.6064 +4 21.62 -4.08562e-16 1.8905 +5 21.62 -1.06025 1.6064 +6 21.62 -1.8364 0.830248 +7 21.62 -2.1205 -0.23 +8 21.62 -1.8364 -1.29025 +9 21.62 -1.06025 -2.0664 +10 21.62 3.47278e-15 -2.3505 +11 21.62 1.06025 -2.0664 +12 21.62 1.8364 -1.29025 +13 -36.57 3.2931 -0.23 +14 -36.57 2.85191 1.41655 +15 -36.57 1.64655 2.62191 +16 -36.57 0 3.0631 +17 -36.57 -1.64655 2.62191 +18 -36.57 -2.85191 1.41655 +19 -36.57 -3.2931 -0.23 +20 -36.57 -2.85191 -1.87655 +21 -36.57 -1.64655 -3.08191 +22 -36.57 6.53699e-15 -3.5231 +23 -36.57 1.64655 -3.08191 +24 -36.57 2.85191 -1.87655 +25 -23.69 -0 2.76 +26 -31.74 0 11.27 +27 -35.19 0 11.27 +28 -36.34 0 2.76 +29 -36.34 0 -2.76 +30 -35.19 0 -11.27 +31 -31.74 0 -11.27 +32 -23.69 -0 -2.76 +33 5.98 -0 2.07 +34 0.23 0 8.51 +35 -1.61 0 8.28 +36 -2.99 0 2.53 +37 -2.99 0 -2.53 +38 -1.61 0 -8.28 +39 0.23 0 -8.51 +40 5.98 -0 -2.07 +41 -23.69 -0 2.76 +42 -31.74 0 11.27 +43 -35.19 0 11.27 +44 -36.34 0 2.76 +45 -36.34 0 -2.76 +46 -35.19 0 -11.27 +47 -31.74 0 -11.27 +48 -23.69 -0 -2.76 +49 -8.28 -0 2.3 +50 -9.2 0 4.37 +51 -10.35 0 4.14 +52 -10.35 0 2.3 +53 -10.35 0 -2.3 +54 -10.35 0 -4.14 +55 -9.2 0 -4.37 +56 -8.28 -0 -2.3 +57 -23.69 -0 2.76 +58 -31.74 0 11.27 +59 -35.19 0 11.27 +60 -36.34 0 2.76 +61 -36.34 0 -2.76 +62 -35.19 0 -11.27 +63 -31.74 0 -11.27 +64 -23.69 -0 -2.76 +65 5.98 -0 2.07 +66 0.23 0 8.51 +67 -1.61 0 8.28 +68 -2.99 0 2.53 +69 -2.99 0 -2.53 +70 -1.61 0 -8.28 +71 0.23 0 -8.51 +72 5.98 -0 -2.07 +73 -23.69 -0 2.76 +74 -31.74 0 11.27 +75 -35.19 0 11.27 +76 -36.34 0 2.76 +77 -36.34 0 -2.76 +78 -35.19 0 -11.27 +79 -31.74 0 -11.27 +80 -23.69 -0 -2.76 +81 -37.03 0 -0 +82 -36.8 0 2.76 +83 -17.71 0 2.99 +84 -14.49 0 2.3 +85 -11.04 0 2.3 +86 25.76 0 2.3 +87 28.75 0 1.61 +88 31.51 0 0.23 +89 31.51 0 -0.23 +90 28.75 0 -1.61 +91 25.76 0 -2.3 +92 -11.04 0 -2.3 +93 -14.49 0 -2.3 +94 -17.71 0 -2.99 +95 -36.8 0 -2.76 +96 -37.03 0 0 +white 12 1 2 3 4 5 6 7 8 9 10 11 12 +white 12 13 14 15 16 17 18 19 20 21 22 23 24 +white 4 25 26 27 28 +white 4 29 30 31 32 +white 4 33 34 35 36 +white 4 37 38 39 40 +white 4 41 42 43 44 +white 4 45 46 47 48 +white 4 49 50 51 52 +white 4 53 54 55 56 +white 4 57 58 59 60 +white 4 61 62 63 64 +white 4 65 66 67 68 +white 4 69 70 71 72 +white 4 73 74 75 76 +white 4 77 78 79 80 +white 8 81 82 83 84 85 86 87 88 +white 8 89 90 91 92 93 94 95 96 Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/objects/missile.wav and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/objects/missile.wav differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/objects/mmarker.au and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/objects/mmarker.au differ diff -Nru acm-5.0/objects/munition-map.txt acm-6.0+20200416/objects/munition-map.txt --- acm-5.0/objects/munition-map.txt 1998-08-17 19:18:52.000000000 +0000 +++ acm-6.0+20200416/objects/munition-map.txt 2017-07-23 14:54:41.000000000 +0000 @@ -1,7 +1,18 @@ # munition-map.txt : maps DIS munition entity types to damage values # # Fields: -# entity-type,warhead-type,explosion-size-feet,damage-factor,warhead-class ; +# entity-type, warhead-type, explosion-size, damage-factor, warhead-class ; +# +# where: +# +# - entity-type: DIS entity type, 7 fields separated by colon; -1 = "any". +# +# - warhead-type: -1 means "any"; no other values currently defined. +# +# - explosion-size: diameter of the explosion (ft) for display rendering. +# +# - warhead-class: "blast" or "explosive" (that is bomb or missile), +# or "kinetic" (that is cannon shells). # # Damage assessment differs between kinetic and blast (explosive) warheads, # so don't compare their damage factors directly. @@ -10,44 +21,52 @@ # # damage = 0.5 * damage_factor * v * v # -# where v is the impact velocity in meters per second. Damage units -# are a somewhat arbitrary "hit point" value. An F-16 gets 15 hit points. +# where v is the impact velocity (m/s). Damage units are a somewhat arbitrary +# "structure points" value defined in the StructurePoints field of the aircraft +# model description record. An F-16, for example, gets 15 structure points. # # blast warhead damage is: # -# damage = damage_factor / ( r * r ) ( r = 1.0, if r < 1.0) +# damage = damage_factor / ( r * r + 1.0 ) +# +# being r the distance from the target (m). -2:1:222:1: 2:-1:-1, -1, 5.0, 20.0, blast ; # AA-2 Atoll -2:1:222:1:10:-1:-1, -1, 5.0, 20.0, blast ; # AA-10 Alamo -2:1:222:1:11:-1:-1, -1, 5.0, 20.0, blast ; # AA-11 Archer -2:1:222:1:12:-1:-1, -1, 5.0, 20.0, blast ; # AA-X-12 -2:1:222:1:14:-1:-1, -1,15.0, 400.0, blast ; # SA-2 Guideline -2:1:222:1:17:-1:-1, -1,15.0, 400.0, blast ; # SA-5 Gammon -2:1:222:1:18:-1:-1, -1,15.0, 400.0, blast ; # SA-6 Gainful -2:1:222:1:19:-1:-1, -1,15.0, 400.0, blast ; # SA-7 Grail -2:1:222:1:23:-1:-1, -1,15.0, 400.0, blast ; # SA-11 Gadfly -2:1:222:1:-1:-1:-1, -1, 5.0, 20.0, blast ; # all other C.I.S. SAM/AAMs +#-----------------+--------+----------+-------+------------------------------+ +# entity-type |warhead |explosion |damage |warhead | +# |type |size(m) |factor |class | +#-----------------+--------+----------+-------+------------------------------+ +2:1:222:1: 2:-1:-1, -1, 5.0, 20.0, blast ; # AA-2 Atoll +2:1:222:1:10:-1:-1, -1, 5.0, 20.0, blast ; # AA-10 Alamo +2:1:222:1:11:-1:-1, -1, 5.0, 20.0, blast ; # AA-11 Archer +2:1:222:1:12:-1:-1, -1, 5.0, 20.0, blast ; # AA-X-12 +2:1:222:1:14:-1:-1, -1, 15.0, 400.0, blast ; # SA-2 Guideline +2:1:222:1:17:-1:-1, -1, 15.0, 400.0, blast ; # SA-5 Gammon +2:1:222:1:18:-1:-1, -1, 15.0, 400.0, blast ; # SA-6 Gainful +2:1:222:1:19:-1:-1, -1, 15.0, 400.0, blast ; # SA-7 Grail +2:1:222:1:23:-1:-1, -1, 15.0, 400.0, blast ; # SA-11 Gadfly +2:1:222:1:-1:-1:-1, -1, 5.0, 20.0, blast ; # all other C.I.S. SAM/AAMs -2:1:222:2: 3:-1:-1, -1, 0.0, 3.0e-05, kinetic ; # C.I.S. 23mm AAA -2:1:222:2: 5:-1:-1, -1, 1.0, 3.0e-05, kinetic ; # C.I.S. 25mm AAA -2:1:222:2: 6:-1:-1, -1, 5.0, 5.0, blast ; # C.I.S. 30mm AAA -2:1:222:2: 7:-1:-1, -1, 5.0, 100.0, blast ; # C.I.S. 57mm AAA -2:1:222:2: 8:-1:-1, -1, 5.0, 180.0, blast ; # C.I.S. 76mm AAA -2:1:222:2: 9:-1:-1, -1, 5.0, 200.0, blast ; # C.I.S. 85mm AAA -2:1:222:2:10:-1:-1, -1, 5.0, 300.0, blast ; # C.I.S. 100mm AAA -2:1:222:2:11:-1:-1, -1, 5.0, 400.0, blast ; # C.I.S. 130mm AAA -2:1:222:2:-1:-1:-1, -1, 1.0, 1.0, blast ; # other C.I.S. AAA munitions -2:9:222:2:-1:-1:-1, -1, 2.0, 5.0, blast ; # other C.I.S. AAA munitions +2:1:222:2: 3:-1:-1, -1, 0.0,3.0e-05, kinetic ; # C.I.S. 23mm AAA +2:1:222:2: 5:-1:-1, -1, 1.0,3.0e-05, kinetic ; # C.I.S. 25mm AAA +2:1:222:2: 6:-1:-1, -1, 5.0, 5.0, blast ; # C.I.S. 30mm AAA +2:1:222:2: 7:-1:-1, -1, 5.0, 100.0, blast ; # C.I.S. 57mm AAA +2:1:222:2: 8:-1:-1, -1, 5.0, 180.0, blast ; # C.I.S. 76mm AAA +2:1:222:2: 9:-1:-1, -1, 5.0, 200.0, blast ; # C.I.S. 85mm AAA +2:1:222:2:10:-1:-1, -1, 5.0, 300.0, blast ; # C.I.S. 100mm AAA +2:1:222:2:11:-1:-1, -1, 5.0, 400.0, blast ; # C.I.S. 130mm AAA +2:1:222:2:-1:-1:-1, -1, 1.0, 1.0, blast ; # other C.I.S. AAA munitions +2:9:222:2:-1:-1:-1, -1, 2.0, 5.0, blast ; # other C.I.S. AAA munitions -2:1:225:1: 1:-1:-1, -1, 5.0, 20.0, blast ; # AIM-9 Sidewinder -2:1:225:1: 1:-1:-1, -1, 5.0, 60.0, blast ; # AIM-120 AMRAAM -2:1:225:1: 6:-1:-1, -1,15.0, 200.0, blast ; # MIM-23 Hawk -2:1:225:1:13:-1:-1, -1, 5.0, 60.0, blast ; # AIM-7 Sparrow -2:1:225:1:16:-1:-1, -1,20.0, 400.0, blast ; # MIM-104 Patriot -2:1:225:1:-1:-1:-1, -1, 5.0, 20.0, blast ; # all other U.S. AAM/SAMs +2:1:225:1: 1:-1:-1, -1, 5.0, 20.0, blast ; # AIM-9 Sidewinder +2:1:225:1: 2:-1:-1, -1, 15.0, 60.0, blast ; # AIM-120 AMRAAM +2:1:225:1: 6:-1:-1, -1, 15.0, 200.0, blast ; # MIM-23 Hawk +2:1:225:1:13:-1:-1, -1, 5.0, 60.0, blast ; # AIM-7 Sparrow +2:1:225:1:16:-1:-1, -1, 20.0, 400.0, blast ; # MIM-104 Patriot +2:1:225:1:-1:-1:-1, -1, 5.0, 20.0, blast ; # all other U.S. AAM/SAMs -2:9:225:2: 1: 1:-1, -1, 1.0, 1.0e-05, kinetic ; # 20mm M-39 -2:9:225:2: 1:-1:-1, -1, 2.0, 3.0, blast ; # 20mm shell used by ACM -2:9:225:2:-1:-1:-1, -1, 2.0, 5.0, blast ; # catch all U.S.Ballstic +2:9:225:2: 1: 1:-1, -1, 1.0,1.0e-05, kinetic ; # 20mm M-39 +2:9:225:2: 1:-1:-1, -1, 2.0, 3.0, kinetic ; # 20mm shell used by ACM +2:9:225:2:73:-1:-1, -1, 50.0, 9000.0, blast ; # Mark 82 drop bomb +2:9:225:2:-1:-1:-1, -1, 2.0, 5.0, blast ; # catch all U.S.Ballistic -2:1:225:2:-1:-1:-1, -1, 1.0, 1.0, blast ; # U.S. AAA +#2:1:225:2:-1:-1:-1, -1, 1.0, 1.0, blast ; # U.S. AAA diff -Nru acm-5.0/objects/nellis-scene acm-6.0+20200416/objects/nellis-scene --- acm-5.0/objects/nellis-scene 1999-01-03 22:05:37.000000000 +0000 +++ acm-6.0+20200416/objects/nellis-scene 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -36-04-34.900N 115-10-12.600W 2177 070 -36-00-00.000N 114-30-00.000W 2000 000 -#000000 -RWY IFP 16/34 692 7500 150 35-10-03.593N 114-33-37.135W 35-08-49.559N 114-33-31.549W 0 0 -RWY IGM 03/21 3446 6831 150 35-15-05.330N 113-56-53.175W 35-15-53.085N 113-55-54.936W 0 0 -RWY IGM 17/35 3446 6724 75 35-16-12.341N 113-56-09.748W 35-15-05.849N 113-56-09.793W 0 0 -RWY EED 02/20 983 4802 150 34-45-46.867N 114-37-26.337W 34-46-28.344N 114-36-58.325W 0 0 -RWY EED 11/29 983 5005 150 34-46-01.410N 114-38-01.114W 34-45-37.336N 114-37-08.705W 0 0 -RWY LAS 01L/19R 2177 5001 75 36-05-07.644N 115-09-51.402W 36-05-52.494N 115-09-25.739W 0 0 -RWY LAS 01R/19L 2177 9776 150 36-04-27.195N 115-10-02.975W 36-05-54.861N 115-09-12.789W 500 874 -RWY LAS 07L/25R 2177 14506 150 36-04-34.9N 115-10-12.6W 36-04-35.1N 115-07-15.9W 2133 1400 -RWY LAS 07R/25L 2177 8900 150 36-04-25.069N 115-09-21.347W 36-04-25.164N 115-07-32.945W 0 0 -RWY SGU 16/34 2938 6101 100 37-05-58.747N 113-35-34.949W 37-04-58.436N 113-35-35.067W 0 0 -RWY XXX 18/36 2000 6100 100 36-00-00.000N 114-30-00.000W 36-01-00.000N 114-30-00.000W 0 0 -FEATURES diff -Nru acm-5.0/objects/object-map.txt acm-6.0+20200416/objects/object-map.txt --- acm-5.0/objects/object-map.txt 1998-08-14 21:24:02.000000000 +0000 +++ acm-6.0+20200416/objects/object-map.txt 2017-10-30 02:45:07.000000000 +0000 @@ -1,30 +1,44 @@ # This file maps DIS enumerations to rendered objects. +# ACM looks here the image for DIS IDs not found in the inventory file. # -# Fields: +# Fields (-1=any): # # kind:domain:country:category:subcategory:specific:extra , "object-name" ; +# +# where object-name is the file containing the .obv or .dxf image of the object. -1: 1: -1:-1:-1:-1:-1, "telar1.obv" ; # ground entities +1: 1: -1:-1:-1:-1:-1, "features/telar1.obv" ; # ground entities # U.S. Aircraft Entity Types -1: 2:225: 1: 1:-1:-1, "f117.dxf" ; # F-117 -1: 2:225: 1: 3:-1:-1, "f16.obv" ; # any F-16 type -1: 2:225: 1: 9:-1:-1, "f18.obv" ; # any F-18 Hornet type -1: 2:225: 4: 5:-1:-1, "kc135.obv" ; # any KC-135 tanker type +1: 2:225: 1: 1:-1:-1, "aircraft/f117.dxf" ; # F-117 +1: 2:225: 1: 3:-1:-1, "aircraft/f16.obv" ; # any F-16 type +1: 2:225: 1: 9:-1:-1, "aircraft/f18.obv" ; # any F-18 Hornet type +1: 2:225: 4: 5:-1:-1, "aircraft/kc135.obv" ; # any KC-135 tanker type +1: 2:225:88:34: 1: 2, "aircraft/b-747.obv" ; # Boeing 747-400 +1: 2:225:40: 1:-1:-1, "aircraft/c172.obv" ; # Cessna 172-RG +1: 2:225:87:32: 2: 1, "aircraft/notavailable.obv" ; # McDonnell Douglas MD-81 + +1: 2:222: 1: 5:-1:-1, "aircraft/mig23.obv" ; # MiG 23 Flogger +1: 2:222: 1: 4:-1:-1, "aircraft/mig25.obv" ; # MiG 25 Foxbat +1: 2:222: 1: 2:-1:-1, "aircraft/mig29.obv" ; # MiG 29 Fulcrum +1: 2:222: 2: 9:-1:-1, "aircraft/su30.obv" ; # Sukhoi Su-30 +1: 2:106: 1: 1:-1:-1, "aircraft/notavailable.obv"; # AMX # C.I.S. Aircraft Entity Types -1: 2:222: 4:12:-1:-1, "il78.obv" ; # C.I.S. Il-78 Midas +1: 2:222: 4:12:-1:-1, "aircraft/il78.obv" ; # C.I.S. Il-78 Midas + +1: 2: -1: 3:-1:-1:-1, "aircraft/kc135.obv" ; # bomber aircraft +1: 2: -1: 4:-1:-1:-1, "aircraft/kc135.obv" ; # transport aircraft +1: 2: -1: 8:-1:-1:-1, "aircraft/kc135.obv" ; # airborne early warning aircraft + +2: 1:222: 1:14:-1:-1, "missiles/sa2.obv" ; # SA-2 Guideline +2: 1:222: 1:22:-1:-1, "missiles/sa10.obv" ; # SA-10 Grumble +2: 1:222: 1:23:-1:-1, "missiles/sa11.obv" ; # SA-11 Gadfly +2: 1:222: 1:25:-1:-1, "missiles/sa10.obv" ; # SA-13 Gopher +2: 1:222: 1:-1:-1:-1, "missiles/aim9.obv" ; # all other CIS anti-air missiles +2: 1: -1: 1:-1:-1:-1, "missiles/aim9.obv" ; # all other anti-air missiles +2:-1: -1:-1:-1:-1:-1, "tracer.obv" ; # all other munitions -1: 2: -1: 3:-1:-1:-1, "kc135.obv" ; # bomber aircraft -1: 2: -1: 4:-1:-1:-1, "kc135.obv" ; # transport aircraft -1: 2: -1: 8:-1:-1:-1, "kc135.obv" ; # airborne early warning aircraft - -2: 1:222: 1:14:-1:-1, "sa2.obv" ; # SA-2 Guideline -2: 1:222: 1:22:-1:-1, "sa10.obv" ; # SA-10 Grumble -2: 1:222: 1:23:-1:-1, "sa11.obv" ; # SA-11 Gadfly -2: 1:222: 1:25:-1:-1, "sa10.obv" ; # SA-13 Gopher -2: 1:222: 1:-1:-1:-1, "aim9.obv" ; # all other CIS anti-air missiles -2: 1: -1: 1:-1:-1:-1, "aim9.obv" ; # all other anti-air missiles -2:-1: -1:-1:-1:-1:-1, "cannon.obv" ; # all other munitions +-1:-1:-1:-1:-1:-1:-1, "ufo.obv" ; # anything else placeholder \ No newline at end of file Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/objects/omarker.au and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/objects/omarker.au differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/objects/rwr.au and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/objects/rwr.au differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/objects/rwr.wav and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/objects/rwr.wav differ diff -Nru acm-5.0/objects/rwy-and-gnd.obv acm-6.0+20200416/objects/rwy-and-gnd.obv --- acm-5.0/objects/rwy-and-gnd.obv 1998-08-14 02:27:28.000000000 +0000 +++ acm-6.0+20200416/objects/rwy-and-gnd.obv 1970-01-01 00:00:00.000000000 +0000 @@ -1,357 +0,0 @@ -Runway -284 70 -1 0.000000 -75.000000 0.000000 -2 12000.000000 -75.000000 0.000000 -3 12000.000000 75.000000 0.000000 -4 0.000000 75.000000 0.000000 -5 0.000000 -75.000000 0.000000 -6 12000.000000 -75.000000 0.000000 -7 12000.000000 -70.000000 0.000000 -8 0.000000 -70.000000 0.000000 -9 0.000000 75.000000 0.000000 -10 12000.000000 75.000000 0.000000 -11 12000.000000 70.000000 0.000000 -12 0.000000 70.000000 0.000000 -13 1000.000000 -66.000000 0.000000 -14 1125.000000 -66.000000 0.000000 -15 1125.000000 -36.000000 0.000000 -16 1000.000000 -36.000000 0.000000 -17 1000.000000 66.000000 0.000000 -18 1125.000000 66.000000 0.000000 -19 1125.000000 36.000000 0.000000 -20 1000.000000 36.000000 0.000000 -21 11000.000000 -66.000000 0.000000 -22 10875.000000 -66.000000 0.000000 -23 10875.000000 -36.000000 0.000000 -24 11000.000000 -36.000000 0.000000 -25 11000.000000 66.000000 0.000000 -26 10875.000000 66.000000 0.000000 -27 10875.000000 36.000000 0.000000 -28 11000.000000 36.000000 0.000000 -29 4.000000 -66.000000 0.000000 -30 129.000000 -66.000000 0.000000 -31 129.000000 -54.888889 0.000000 -32 4.000000 -54.888889 0.000000 -33 4.000000 -50.888889 0.000000 -34 129.000000 -50.888889 0.000000 -35 129.000000 -39.777779 0.000000 -36 4.000000 -39.777779 0.000000 -37 4.000000 -35.777779 0.000000 -38 129.000000 -35.777779 0.000000 -39 129.000000 -24.666666 0.000000 -40 4.000000 -24.666666 0.000000 -41 4.000000 -20.666666 0.000000 -42 129.000000 -20.666666 0.000000 -43 129.000000 -9.555555 0.000000 -44 4.000000 -9.555555 0.000000 -45 4.000000 9.555555 0.000000 -46 129.000000 9.555555 0.000000 -47 129.000000 20.666666 0.000000 -48 4.000000 20.666666 0.000000 -49 4.000000 24.666666 0.000000 -50 129.000000 24.666666 0.000000 -51 129.000000 35.777779 0.000000 -52 4.000000 35.777779 0.000000 -53 4.000000 39.777779 0.000000 -54 129.000000 39.777779 0.000000 -55 129.000000 50.888889 0.000000 -56 4.000000 50.888889 0.000000 -57 4.000000 54.888889 0.000000 -58 129.000000 54.888889 0.000000 -59 129.000000 66.000000 0.000000 -60 4.000000 66.000000 0.000000 -61 11996.000000 -66.000000 0.000000 -62 11871.000000 -66.000000 0.000000 -63 11871.000000 -54.888889 0.000000 -64 11996.000000 -54.888889 0.000000 -65 11996.000000 -50.888889 0.000000 -66 11871.000000 -50.888889 0.000000 -67 11871.000000 -39.777779 0.000000 -68 11996.000000 -39.777779 0.000000 -69 11996.000000 -35.777779 0.000000 -70 11871.000000 -35.777779 0.000000 -71 11871.000000 -24.666666 0.000000 -72 11996.000000 -24.666666 0.000000 -73 11996.000000 -20.666666 0.000000 -74 11871.000000 -20.666666 0.000000 -75 11871.000000 -9.555555 0.000000 -76 11996.000000 -9.555555 0.000000 -77 11996.000000 9.555555 0.000000 -78 11871.000000 9.555555 0.000000 -79 11871.000000 20.666666 0.000000 -80 11996.000000 20.666666 0.000000 -81 11996.000000 24.666666 0.000000 -82 11871.000000 24.666666 0.000000 -83 11871.000000 35.777779 0.000000 -84 11996.000000 35.777779 0.000000 -85 11996.000000 39.777779 0.000000 -86 11871.000000 39.777779 0.000000 -87 11871.000000 50.888889 0.000000 -88 11996.000000 50.888889 0.000000 -89 11996.000000 54.888889 0.000000 -90 11871.000000 54.888889 0.000000 -91 11871.000000 66.000000 0.000000 -92 11996.000000 66.000000 0.000000 -93 258.000000 -2.500000 0.000000 -94 383.000000 -2.500000 0.000000 -95 383.000000 2.500000 0.000000 -96 258.000000 2.500000 0.000000 -97 508.000000 -2.500000 0.000000 -98 633.000000 -2.500000 0.000000 -99 633.000000 2.500000 0.000000 -100 508.000000 2.500000 0.000000 -101 758.000000 -2.500000 0.000000 -102 883.000000 -2.500000 0.000000 -103 883.000000 2.500000 0.000000 -104 758.000000 2.500000 0.000000 -105 1008.000000 -2.500000 0.000000 -106 1133.000000 -2.500000 0.000000 -107 1133.000000 2.500000 0.000000 -108 1008.000000 2.500000 0.000000 -109 1258.000000 -2.500000 0.000000 -110 1383.000000 -2.500000 0.000000 -111 1383.000000 2.500000 0.000000 -112 1258.000000 2.500000 0.000000 -113 1508.000000 -2.500000 0.000000 -114 1633.000000 -2.500000 0.000000 -115 1633.000000 2.500000 0.000000 -116 1508.000000 2.500000 0.000000 -117 1758.000000 -2.500000 0.000000 -118 1883.000000 -2.500000 0.000000 -119 1883.000000 2.500000 0.000000 -120 1758.000000 2.500000 0.000000 -121 2008.000000 -2.500000 0.000000 -122 2133.000000 -2.500000 0.000000 -123 2133.000000 2.500000 0.000000 -124 2008.000000 2.500000 0.000000 -125 2258.000000 -2.500000 0.000000 -126 2383.000000 -2.500000 0.000000 -127 2383.000000 2.500000 0.000000 -128 2258.000000 2.500000 0.000000 -129 2508.000000 -2.500000 0.000000 -130 2633.000000 -2.500000 0.000000 -131 2633.000000 2.500000 0.000000 -132 2508.000000 2.500000 0.000000 -133 2758.000000 -2.500000 0.000000 -134 2883.000000 -2.500000 0.000000 -135 2883.000000 2.500000 0.000000 -136 2758.000000 2.500000 0.000000 -137 3008.000000 -2.500000 0.000000 -138 3133.000000 -2.500000 0.000000 -139 3133.000000 2.500000 0.000000 -140 3008.000000 2.500000 0.000000 -141 3258.000000 -2.500000 0.000000 -142 3383.000000 -2.500000 0.000000 -143 3383.000000 2.500000 0.000000 -144 3258.000000 2.500000 0.000000 -145 3508.000000 -2.500000 0.000000 -146 3633.000000 -2.500000 0.000000 -147 3633.000000 2.500000 0.000000 -148 3508.000000 2.500000 0.000000 -149 3758.000000 -2.500000 0.000000 -150 3883.000000 -2.500000 0.000000 -151 3883.000000 2.500000 0.000000 -152 3758.000000 2.500000 0.000000 -153 4008.000000 -2.500000 0.000000 -154 4133.000000 -2.500000 0.000000 -155 4133.000000 2.500000 0.000000 -156 4008.000000 2.500000 0.000000 -157 4258.000000 -2.500000 0.000000 -158 4383.000000 -2.500000 0.000000 -159 4383.000000 2.500000 0.000000 -160 4258.000000 2.500000 0.000000 -161 4508.000000 -2.500000 0.000000 -162 4633.000000 -2.500000 0.000000 -163 4633.000000 2.500000 0.000000 -164 4508.000000 2.500000 0.000000 -165 4758.000000 -2.500000 0.000000 -166 4883.000000 -2.500000 0.000000 -167 4883.000000 2.500000 0.000000 -168 4758.000000 2.500000 0.000000 -169 5008.000000 -2.500000 0.000000 -170 5133.000000 -2.500000 0.000000 -171 5133.000000 2.500000 0.000000 -172 5008.000000 2.500000 0.000000 -173 5258.000000 -2.500000 0.000000 -174 5383.000000 -2.500000 0.000000 -175 5383.000000 2.500000 0.000000 -176 5258.000000 2.500000 0.000000 -177 5508.000000 -2.500000 0.000000 -178 5633.000000 -2.500000 0.000000 -179 5633.000000 2.500000 0.000000 -180 5508.000000 2.500000 0.000000 -181 5758.000000 -2.500000 0.000000 -182 5883.000000 -2.500000 0.000000 -183 5883.000000 2.500000 0.000000 -184 5758.000000 2.500000 0.000000 -185 6008.000000 -2.500000 0.000000 -186 6133.000000 -2.500000 0.000000 -187 6133.000000 2.500000 0.000000 -188 6008.000000 2.500000 0.000000 -189 6258.000000 -2.500000 0.000000 -190 6383.000000 -2.500000 0.000000 -191 6383.000000 2.500000 0.000000 -192 6258.000000 2.500000 0.000000 -193 6508.000000 -2.500000 0.000000 -194 6633.000000 -2.500000 0.000000 -195 6633.000000 2.500000 0.000000 -196 6508.000000 2.500000 0.000000 -197 6758.000000 -2.500000 0.000000 -198 6883.000000 -2.500000 0.000000 -199 6883.000000 2.500000 0.000000 -200 6758.000000 2.500000 0.000000 -201 7008.000000 -2.500000 0.000000 -202 7133.000000 -2.500000 0.000000 -203 7133.000000 2.500000 0.000000 -204 7008.000000 2.500000 0.000000 -205 7258.000000 -2.500000 0.000000 -206 7383.000000 -2.500000 0.000000 -207 7383.000000 2.500000 0.000000 -208 7258.000000 2.500000 0.000000 -209 7508.000000 -2.500000 0.000000 -210 7633.000000 -2.500000 0.000000 -211 7633.000000 2.500000 0.000000 -212 7508.000000 2.500000 0.000000 -213 7758.000000 -2.500000 0.000000 -214 7883.000000 -2.500000 0.000000 -215 7883.000000 2.500000 0.000000 -216 7758.000000 2.500000 0.000000 -217 8008.000000 -2.500000 0.000000 -218 8133.000000 -2.500000 0.000000 -219 8133.000000 2.500000 0.000000 -220 8008.000000 2.500000 0.000000 -221 8258.000000 -2.500000 0.000000 -222 8383.000000 -2.500000 0.000000 -223 8383.000000 2.500000 0.000000 -224 8258.000000 2.500000 0.000000 -225 8508.000000 -2.500000 0.000000 -226 8633.000000 -2.500000 0.000000 -227 8633.000000 2.500000 0.000000 -228 8508.000000 2.500000 0.000000 -229 8758.000000 -2.500000 0.000000 -230 8883.000000 -2.500000 0.000000 -231 8883.000000 2.500000 0.000000 -232 8758.000000 2.500000 0.000000 -233 9008.000000 -2.500000 0.000000 -234 9133.000000 -2.500000 0.000000 -235 9133.000000 2.500000 0.000000 -236 9008.000000 2.500000 0.000000 -237 9258.000000 -2.500000 0.000000 -238 9383.000000 -2.500000 0.000000 -239 9383.000000 2.500000 0.000000 -240 9258.000000 2.500000 0.000000 -241 9508.000000 -2.500000 0.000000 -242 9633.000000 -2.500000 0.000000 -243 9633.000000 2.500000 0.000000 -244 9508.000000 2.500000 0.000000 -245 9758.000000 -2.500000 0.000000 -246 9883.000000 -2.500000 0.000000 -247 9883.000000 2.500000 0.000000 -248 9758.000000 2.500000 0.000000 -249 10008.000000 -2.500000 0.000000 -250 10133.000000 -2.500000 0.000000 -251 10133.000000 2.500000 0.000000 -252 10008.000000 2.500000 0.000000 -253 10258.000000 -2.500000 0.000000 -254 10383.000000 -2.500000 0.000000 -255 10383.000000 2.500000 0.000000 -256 10258.000000 2.500000 0.000000 -257 10508.000000 -2.500000 0.000000 -258 10633.000000 -2.500000 0.000000 -259 10633.000000 2.500000 0.000000 -260 10508.000000 2.500000 0.000000 -261 10758.000000 -2.500000 0.000000 -262 10883.000000 -2.500000 0.000000 -263 10883.000000 2.500000 0.000000 -264 10758.000000 2.500000 0.000000 -265 11008.000000 -2.500000 0.000000 -266 11133.000000 -2.500000 0.000000 -267 11133.000000 2.500000 0.000000 -268 11008.000000 2.500000 0.000000 -269 11258.000000 -2.500000 0.000000 -270 11383.000000 -2.500000 0.000000 -271 11383.000000 2.500000 0.000000 -272 11258.000000 2.500000 0.000000 -273 11508.000000 -2.500000 0.000000 -274 11633.000000 -2.500000 0.000000 -275 11633.000000 2.500000 0.000000 -276 11508.000000 2.500000 0.000000 -277 11758.000000 -2.500000 0.000000 -278 11883.000000 -2.500000 0.000000 -279 11883.000000 2.500000 0.000000 -280 11758.000000 2.500000 0.000000 -281 -211200 -211200 0 -282 -211200 211200 0 -283 211200 211200 0 -284 211200 -211200 0 -#29350B 4 281 282 283 284 -black 4 1 2 3 4 -white 4 5 6 7 8 -white 4 9 10 11 12 -white 4 13 14 15 16 -white 4 17 18 19 20 -white 4 21 22 23 24 -white 4 25 26 27 28 -white 4 29 30 31 32 -white 4 33 34 35 36 -white 4 37 38 39 40 -white 4 41 42 43 44 -white 4 45 46 47 48 -white 4 49 50 51 52 -white 4 53 54 55 56 -white 4 57 58 59 60 -white 4 61 62 63 64 -white 4 65 66 67 68 -white 4 69 70 71 72 -white 4 73 74 75 76 -white 4 77 78 79 80 -white 4 81 82 83 84 -white 4 85 86 87 88 -white 4 89 90 91 92 -white 4 93 94 95 96 -white 4 97 98 99 100 -white 4 101 102 103 104 -white 4 105 106 107 108 -white 4 109 110 111 112 -white 4 113 114 115 116 -white 4 117 118 119 120 -white 4 121 122 123 124 -white 4 125 126 127 128 -white 4 129 130 131 132 -white 4 133 134 135 136 -white 4 137 138 139 140 -white 4 141 142 143 144 -white 4 145 146 147 148 -white 4 149 150 151 152 -white 4 153 154 155 156 -white 4 157 158 159 160 -white 4 161 162 163 164 -white 4 165 166 167 168 -white 4 169 170 171 172 -white 4 173 174 175 176 -white 4 177 178 179 180 -white 4 181 182 183 184 -white 4 185 186 187 188 -white 4 189 190 191 192 -white 4 193 194 195 196 -white 4 197 198 199 200 -white 4 201 202 203 204 -white 4 205 206 207 208 -white 4 209 210 211 212 -white 4 213 214 215 216 -white 4 217 218 219 220 -white 4 221 222 223 224 -white 4 225 226 227 228 -white 4 229 230 231 232 -white 4 233 234 235 236 -white 4 237 238 239 240 -white 4 241 242 243 244 -white 4 245 246 247 248 -white 4 249 250 251 252 -white 4 253 254 255 256 -white 4 257 258 259 260 -white 4 261 262 263 264 -white 4 265 266 267 268 -white 4 269 270 271 272 -white 4 273 274 275 276 -white 4 277 278 279 280 diff -Nru acm-5.0/objects/sa10.obv acm-6.0+20200416/objects/sa10.obv --- acm-5.0/objects/sa10.obv 1998-08-14 21:22:15.000000000 +0000 +++ acm-6.0+20200416/objects/sa10.obv 1970-01-01 00:00:00.000000000 +0000 @@ -1,70 +0,0 @@ -object -56 12 -1 -4.50593 0.0308625 0 -2 -4.50593 0.216037 0 -3 3.67264 0.216037 0 -4 4.10471 0.185175 0 -5 4.32075 0.0925875 0 -6 4.35161 -0.0308625 0 -7 -4.16644 0.277763 0 -8 -4.13558 0.709838 0 -9 -2.83935 0.709838 0 -10 -2.56159 0.277763 0 -11 2.40728 0.277763 0 -12 2.40728 0.432075 0 -13 2.90108 0.432075 0 -14 3.08625 0.2469 0 -15 3.08625 -0.2469 0 -16 2.90108 -0.432075 0 -17 2.40728 -0.432075 0 -18 2.40728 -0.277763 0 -19 -2.56159 -0.277763 0 -20 -2.83935 -0.709838 0 -21 -4.13558 -0.709838 0 -22 -4.16644 -0.277763 0 -23 4.35161 0.0308625 0 -24 4.32075 -0.0925875 0 -25 4.10471 -0.185175 0 -26 3.67264 -0.216037 0 -27 -4.50593 -0.216037 0 -28 -4.50593 -0.0308625 0 -29 -4.50593 0 0.0308625 -30 -4.50593 0 0.216037 -31 3.67264 0 0.216037 -32 4.10471 0 0.185175 -33 4.32075 0 0.0925875 -34 4.35161 0 -0.0308625 -35 -4.16644 0 0.277763 -36 -4.13558 0 0.709838 -37 -2.83935 0 0.709838 -38 -2.56159 0 0.277763 -39 2.40728 0 0.277763 -40 2.40728 0 0.432075 -41 2.90108 0 0.432075 -42 3.08625 0 0.2469 -43 3.08625 0 -0.2469 -44 2.90108 0 -0.432075 -45 2.40728 0 -0.432075 -46 2.40728 0 -0.277763 -47 -2.56159 0 -0.277763 -48 -2.83935 0 -0.709838 -49 -4.13558 0 -0.709838 -50 -4.16644 0 -0.277763 -51 4.35161 0 0.0308625 -52 4.32075 0 -0.0925875 -53 4.10471 0 -0.185175 -54 3.67264 0 -0.216037 -55 -4.50593 0 -0.216037 -56 -4.50593 0 -0.0308625 -white 6 1 2 3 4 5 6 -white 4 7 8 9 10 -white 4 11 12 13 14 -white 4 15 16 17 18 -white 4 19 20 21 22 -white 6 23 24 25 26 27 28 -white 6 29 30 31 32 33 34 -white 4 35 36 37 38 -white 4 39 40 41 42 -white 4 43 44 45 46 -white 4 47 48 49 50 -white 6 51 52 53 54 55 56 diff -Nru acm-5.0/objects/sa11.obv acm-6.0+20200416/objects/sa11.obv --- acm-5.0/objects/sa11.obv 1998-08-14 21:22:24.000000000 +0000 +++ acm-6.0+20200416/objects/sa11.obv 1970-01-01 00:00:00.000000000 +0000 @@ -1,109 +0,0 @@ -object -92 15 -1 -3.21732 0.234596 0 -2 -3.21732 0.203166 0.117298 -3 -3.21732 0.117298 0.203166 -4 -3.21732 0 0.234596 -5 -3.21732 -0.117298 0.203166 -6 -3.21732 -0.203166 0.117298 -7 -3.21732 -0.234596 -2.3813e-16 -8 -3.21732 -0.203166 -0.117298 -9 -3.21732 -0.117298 -0.203166 -10 -3.21732 4.76259e-16 -0.234596 -11 -3.21732 0.117298 -0.203166 -12 -3.21732 0.203166 -0.117298 -13 -2.64759 0 -0.201082 -14 -2.84867 0 -0.603248 -15 -3.18381 0 -0.603248 -16 -3.28435 0 -0.234596 -17 2.88218 0 0.0335138 -18 2.48002 0 -0.167569 -19 2.04434 0 -0.201082 -20 1.44109 0 -0.234596 -21 -3.31786 0 -0.234596 -22 -3.35137 0 0 -23 0 0 -0.26811 -24 0 0 -0.26811 -25 0 0 -0.26811 -26 0 0 -0.26811 -27 0 0 -0.26811 -28 0 0 -0.26811 -29 0 0 -0.26811 -30 0 0 -0.26811 -31 0 0 -0.26811 -32 0 0 -0.26811 -33 0 0 -0.26811 -34 0 0 -0.26811 -35 0 -0.0335138 -0.0335138 -36 0 -0.0335138 -0.0335138 -37 0 -0.0335138 -0.0335138 -38 0 -0.0335138 -0.0335138 -39 0 -0.0335138 -0.0335138 -40 0 -0.0335138 -0.0335138 -41 0 -0.0335138 -0.0335138 -42 0 -0.0335138 -0.0335138 -43 0 -0.0335138 -0.0335138 -44 0 -0.0335138 -0.0335138 -45 0 -0.0335138 -0.0335138 -46 0 -0.0335138 -0.0335138 -47 -3.28435 0.234596 0 -48 -3.18381 0.603248 0 -49 -2.84867 0.603248 0 -50 -2.64759 0.201082 0 -51 -2.24542 0.301624 0 -52 -1.9438 0.603248 0 -53 -0.469193 0.603248 0 -54 -0.100541 0.26811 0 -55 -3.35137 -0 0 -56 -3.31786 0.234596 0 -57 1.44109 0.234596 0 -58 2.04434 0.201082 0 -59 2.48002 0.167569 0 -60 2.88218 -0.0335138 0 -61 2.88218 0.0335138 0 -62 2.48002 -0.167569 0 -63 2.04434 -0.201082 0 -64 1.44109 -0.234596 0 -65 -3.31786 -0.234596 0 -66 -3.35137 0 0 -67 -0.100541 -0.26811 0 -68 -0.469193 -0.603248 0 -69 -1.9438 -0.603248 0 -70 -2.24542 -0.301624 0 -71 -2.64759 -0.201082 0 -72 -2.84867 -0.603248 0 -73 -3.18381 -0.603248 0 -74 -3.28435 -0.234596 0 -75 -3.28435 0 0.234596 -76 -3.18381 0 0.603248 -77 -2.84867 0 0.603248 -78 -2.64759 0 0.201082 -79 -2.24542 0 0.301624 -80 -1.9438 0 0.603248 -81 -0.469193 0 0.603248 -82 -0.100541 0 0.26811 -83 -3.35137 0 -0 -84 -3.31786 0 0.234596 -85 1.44109 0 0.234596 -86 2.04434 0 0.201082 -87 2.48002 0 0.167569 -88 2.88218 0 -0.0335138 -89 -0.100541 0 -0.26811 -90 -0.469193 0 -0.603248 -91 -1.9438 0 -0.603248 -92 -2.24542 0 -0.301624 -white 12 1 2 3 4 5 6 7 8 9 10 11 12 -white 4 13 14 15 16 -white 6 17 18 19 20 21 22 -white 12 23 24 25 26 27 28 29 30 31 32 33 34 -white 12 35 36 37 38 39 40 41 42 43 44 45 46 -white 4 47 48 49 50 -white 4 51 52 53 54 -white 6 55 56 57 58 59 60 -white 6 61 62 63 64 65 66 -white 4 67 68 69 70 -white 4 71 72 73 74 -white 4 75 76 77 78 -white 4 79 80 81 82 -white 6 83 84 85 86 87 88 -white 4 89 90 91 92 diff -Nru acm-5.0/objects/sa2.obv acm-6.0+20200416/objects/sa2.obv --- acm-5.0/objects/sa2.obv 1998-08-18 13:18:45.000000000 +0000 +++ acm-6.0+20200416/objects/sa2.obv 1970-01-01 00:00:00.000000000 +0000 @@ -1,116 +0,0 @@ -object -96 18 -1 21.62 2.1205 -0.23 -2 21.62 1.8364 0.830248 -3 21.62 1.06025 1.6064 -4 21.62 -4.08562e-16 1.8905 -5 21.62 -1.06025 1.6064 -6 21.62 -1.8364 0.830248 -7 21.62 -2.1205 -0.23 -8 21.62 -1.8364 -1.29025 -9 21.62 -1.06025 -2.0664 -10 21.62 3.47278e-15 -2.3505 -11 21.62 1.06025 -2.0664 -12 21.62 1.8364 -1.29025 -13 -36.57 3.2931 -0.23 -14 -36.57 2.85191 1.41655 -15 -36.57 1.64655 2.62191 -16 -36.57 0 3.0631 -17 -36.57 -1.64655 2.62191 -18 -36.57 -2.85191 1.41655 -19 -36.57 -3.2931 -0.23 -20 -36.57 -2.85191 -1.87655 -21 -36.57 -1.64655 -3.08191 -22 -36.57 6.53699e-15 -3.5231 -23 -36.57 1.64655 -3.08191 -24 -36.57 2.85191 -1.87655 -25 -23.69 -0 2.76 -26 -31.74 0 11.27 -27 -35.19 0 11.27 -28 -36.34 0 2.76 -29 -36.34 0 -2.76 -30 -35.19 0 -11.27 -31 -31.74 0 -11.27 -32 -23.69 -0 -2.76 -33 5.98 -0 2.07 -34 0.23 0 8.51 -35 -1.61 0 8.28 -36 -2.99 0 2.53 -37 -2.99 0 -2.53 -38 -1.61 0 -8.28 -39 0.23 0 -8.51 -40 5.98 -0 -2.07 -41 -23.69 -0 2.76 -42 -31.74 0 11.27 -43 -35.19 0 11.27 -44 -36.34 0 2.76 -45 -36.34 0 -2.76 -46 -35.19 0 -11.27 -47 -31.74 0 -11.27 -48 -23.69 -0 -2.76 -49 -8.28 -0 2.3 -50 -9.2 0 4.37 -51 -10.35 0 4.14 -52 -10.35 0 2.3 -53 -10.35 0 -2.3 -54 -10.35 0 -4.14 -55 -9.2 0 -4.37 -56 -8.28 -0 -2.3 -57 -23.69 -0 2.76 -58 -31.74 0 11.27 -59 -35.19 0 11.27 -60 -36.34 0 2.76 -61 -36.34 0 -2.76 -62 -35.19 0 -11.27 -63 -31.74 0 -11.27 -64 -23.69 -0 -2.76 -65 5.98 -0 2.07 -66 0.23 0 8.51 -67 -1.61 0 8.28 -68 -2.99 0 2.53 -69 -2.99 0 -2.53 -70 -1.61 0 -8.28 -71 0.23 0 -8.51 -72 5.98 -0 -2.07 -73 -23.69 -0 2.76 -74 -31.74 0 11.27 -75 -35.19 0 11.27 -76 -36.34 0 2.76 -77 -36.34 0 -2.76 -78 -35.19 0 -11.27 -79 -31.74 0 -11.27 -80 -23.69 -0 -2.76 -81 -37.03 0 -0 -82 -36.8 0 2.76 -83 -17.71 0 2.99 -84 -14.49 0 2.3 -85 -11.04 0 2.3 -86 25.76 0 2.3 -87 28.75 0 1.61 -88 31.51 0 0.23 -89 31.51 0 -0.23 -90 28.75 0 -1.61 -91 25.76 0 -2.3 -92 -11.04 0 -2.3 -93 -14.49 0 -2.3 -94 -17.71 0 -2.99 -95 -36.8 0 -2.76 -96 -37.03 0 0 -white 12 1 2 3 4 5 6 7 8 9 10 11 12 -white 12 13 14 15 16 17 18 19 20 21 22 23 24 -white 4 25 26 27 28 -white 4 29 30 31 32 -white 4 33 34 35 36 -white 4 37 38 39 40 -white 4 41 42 43 44 -white 4 45 46 47 48 -white 4 49 50 51 52 -white 4 53 54 55 56 -white 4 57 58 59 60 -white 4 61 62 63 64 -white 4 65 66 67 68 -white 4 69 70 71 72 -white 4 73 74 75 76 -white 4 77 78 79 80 -white 8 81 82 83 84 85 86 87 88 -white 8 89 90 91 92 93 94 95 96 Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/objects/screetch.au and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/objects/screetch.au differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/objects/screetch.wav and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/objects/screetch.wav differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/objects/sounds/apglock.wav and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/objects/sounds/apglock.wav differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/objects/sounds/cannon.wav and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/objects/sounds/cannon.wav differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/objects/sounds/crash.wav and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/objects/sounds/crash.wav differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/objects/sounds/gear_dn.wav and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/objects/sounds/gear_dn.wav differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/objects/sounds/gear_up.wav and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/objects/sounds/gear_up.wav differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/objects/sounds/generic-jet-engine.wav and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/objects/sounds/generic-jet-engine.wav differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/objects/sounds/generic-piston-engine.wav and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/objects/sounds/generic-piston-engine.wav differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/objects/sounds/generic-rocket-engine.wav and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/objects/sounds/generic-rocket-engine.wav differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/objects/sounds/imarker.au and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/objects/sounds/imarker.au differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/objects/sounds/missile.wav and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/objects/sounds/missile.wav differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/objects/sounds/mmarker.au and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/objects/sounds/mmarker.au differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/objects/sounds/omarker.au and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/objects/sounds/omarker.au differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/objects/sounds/rwr.wav and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/objects/sounds/rwr.wav differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/objects/sounds/screetch.wav and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/objects/sounds/screetch.wav differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/objects/sounds/stall.wav and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/objects/sounds/stall.wav differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/objects/sounds/warning.wav and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/objects/sounds/warning.wav differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/objects/stall.au and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/objects/stall.au differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/objects/stall.wav and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/objects/stall.wav differ diff -Nru acm-5.0/objects/su30.obv acm-6.0+20200416/objects/su30.obv --- acm-5.0/objects/su30.obv 1998-08-14 21:25:55.000000000 +0000 +++ acm-6.0+20200416/objects/su30.obv 1970-01-01 00:00:00.000000000 +0000 @@ -1,197 +0,0 @@ -object -176 19 -1 11.3429 -5.49413 3.09587 -2 11.0813 -3.66275 3.61913 -3 17.3603 -3.1395 -1.09013 -4 17.0986 -5.75575 -1.35175 -5 17.0986 5.75575 -1.35175 -6 17.3603 3.1395 -1.09013 -7 11.0813 3.66275 3.61913 -8 11.3429 5.49413 3.09587 -9 -2.87787 -3.62019 -1.83137 -10 -2.87787 -0 -4.97087 -11 -4.97087 -10.7266 -2.61625 -12 -11.5115 -36.3659 -2.093 -13 -11.5115 36.3659 -2.093 -14 -4.97087 10.7266 -2.61625 -15 -2.87787 0 -4.97087 -16 -2.87787 3.62019 -1.83137 -17 41.0751 0.784875 -2.093 -18 32.4415 3.66275 -2.093 -19 22.7614 6.279 -2.093 -20 17.7905 7.84875 -2.093 -21 13.6045 9.15687 -2.093 -22 11.2499 9.4185 -2.093 -23 -10.465 35.8426 -2.093 -24 -4.186 35.581 -2.093 -25 -3.92437 36.1043 -2.093 -26 -20.4067 36.3659 -2.093 -27 -14.1277 10.9883 -2.093 -28 -21.7149 10.9883 -2.093 -29 -28.5171 8.372 -2.093 -30 -32.1799 0.52325 -2.093 -31 -34.0112 -7.28421 -0.661308 -32 -34.0112 -6.41706 -1.52846 -33 -34.0112 -5.2325 -1.84587 -34 -34.0112 -4.04794 -1.52846 -35 -34.0112 -3.18079 -0.661308 -36 -34.0112 -2.86338 0.52325 -37 -34.0112 -3.18079 1.70781 -38 -34.0112 -4.04794 2.57496 -39 -34.0112 -5.2325 2.89237 -40 -34.0112 -6.41706 2.57496 -41 -34.0112 -7.28421 1.70781 -42 -34.0112 -7.60162 0.52325 -43 -34.0112 7.60162 0.52325 -44 -34.0112 7.28421 1.70781 -45 -34.0112 6.41706 2.57496 -46 -34.0112 5.2325 2.89237 -47 -34.0112 4.04794 2.57496 -48 -34.0112 3.18079 1.70781 -49 -34.0112 2.86338 0.52325 -50 -34.0112 3.18079 -0.661308 -51 -34.0112 4.04794 -1.52846 -52 -34.0112 5.2325 -1.84587 -53 -34.0112 6.41706 -1.52846 -54 -34.0112 7.28421 -0.661308 -55 35.0577 -2.35462 -0.261625 -56 35.0577 0.261625 0.52325 -57 35.0577 -0 -8.11037 -58 35.0577 -1.30812 -6.54063 -59 35.0577 -1.0465 -5.49413 -60 35.0577 -2.093 -4.70925 -61 35.0577 -2.87787 -2.61625 -62 35.0577 2.87787 -2.61625 -63 35.0577 2.093 -4.70925 -64 35.0577 1.0465 -5.49413 -65 35.0577 1.30812 -6.54063 -66 35.0577 0 -8.11037 -67 35.0577 -0.261625 0.52325 -68 35.0577 2.35462 -0.261625 -69 -27.209 -8.11037 0.784875 -70 -33.488 -11.5115 0.784875 -71 -34.0112 -21.9765 0.784875 -72 -29.5636 -24.5927 0.784875 -73 -16.744 -10.9883 0.784875 -74 -16.744 10.9883 0.784875 -75 -29.5636 24.5927 0.784875 -76 -34.0112 21.9765 0.784875 -77 -33.488 11.5115 0.784875 -78 -27.209 8.11037 0.784875 -79 11.2499 -5.2325 3.1395 -80 11.7731 -5.2325 4.186 -81 9.94175 -5.2325 4.97087 -82 -33.7496 -5.2325 4.186 -83 -34.7961 -5.2325 -1.83137 -84 -29.302 -5.2325 -2.35462 -85 -18.3137 -5.2325 -2.093 -86 -8.372 -5.2325 -3.40112 -87 2.61625 -5.2325 -3.40112 -88 13.8661 -5.2325 -2.35462 -89 17.7905 -5.2325 -1.0465 -90 17.7905 5.2325 -1.0465 -91 13.8661 5.2325 -2.35462 -92 2.61625 5.2325 -3.40112 -93 -8.372 5.2325 -3.40112 -94 -18.3137 5.2325 -2.093 -95 -29.302 5.2325 -2.35462 -96 -34.7961 5.2325 -1.83137 -97 -33.7496 5.2325 4.186 -98 9.94175 5.2325 4.97087 -99 11.7731 5.2325 4.186 -100 11.2499 5.2325 3.1395 -101 10.2034 -10.465 -2.093 -102 -14.3894 -10.465 1.30812 -103 -17.7905 -10.465 6.01737 -104 -24.3311 -10.465 5.2325 -105 -24.5927 -10.465 1.56975 -106 -25.3776 -10.465 1.56975 -107 -27.4706 -10.465 -19.3603 -108 -23.5463 -10.465 -21.1916 -109 -9.94175 -10.465 -4.44763 -110 -8.372 -10.465 -4.186 -111 -8.63363 -10.465 -2.87787 -112 -8.63363 10.465 -2.87787 -113 -8.372 10.465 -4.186 -114 -9.94175 10.465 -4.44763 -115 -23.5463 10.465 -21.1916 -116 -27.4706 10.465 -19.3603 -117 -25.3776 10.465 1.56975 -118 -24.5927 10.465 1.56975 -119 -24.3311 10.465 5.2325 -120 -17.7905 10.465 6.01737 -121 -14.3894 10.465 1.30812 -122 10.2034 10.465 -2.093 -123 -32.1799 -0.52325 -2.093 -124 -28.5171 -8.372 -2.093 -125 -21.7149 -10.9883 -2.093 -126 -14.1277 -10.9883 -2.093 -127 -20.4067 -36.3659 -2.093 -128 -3.92437 -36.1043 -2.093 -129 -4.186 -35.581 -2.093 -130 -10.465 -35.8426 -2.093 -131 11.2499 -9.4185 -2.093 -132 13.6045 -9.15687 -2.093 -133 17.7905 -7.84875 -2.093 -134 22.7614 -6.279 -2.093 -135 32.4415 -3.66275 -2.093 -136 41.0751 -0.784875 -2.093 -137 -43.953 -0.261625 0 -138 -40.0286 -1.0465 0 -139 -39.767 -2.35462 0 -140 -28.5171 -3.1395 0 -141 11.7731 -3.66275 0 -142 35.8426 -3.66275 0 -143 44.4763 -3.40112 0 -144 50.4936 -2.61625 0 -145 55.9877 -1.30812 0 -146 58.3424 -0.261625 0 -147 58.3424 0.261625 0 -148 55.9877 1.30812 0 -149 50.4936 2.61625 0 -150 44.4763 3.40112 0 -151 35.8426 3.66275 0 -152 11.7731 3.66275 0 -153 -28.5171 3.1395 0 -154 -39.767 2.35462 0 -155 -40.0286 1.0465 0 -156 -43.953 0.261625 0 -157 59.1272 0 0 -158 55.7261 0 -1.83137 -159 49.9704 0 -4.186 -160 43.953 0 -5.2325 -161 38.4589 0 -8.63363 -162 32.4415 0 -10.2034 -163 29.302 0 -10.9883 -164 24.5927 0 -10.7266 -165 15.6975 0 -8.63363 -166 0 0 -5.2325 -167 -10.7266 0 -3.40112 -168 -29.8253 0 -1.83137 -169 -42.6449 0 -1.30812 -170 -45.5228 0 0.784875 -171 -42.3832 0 1.83137 -172 20.1451 0 0.261625 -173 33.7496 0 1.0465 -174 41.5984 0 1.83137 -175 46.3076 0 1.83137 -176 50.7552 0 1.83137 -(black gray44) 4 1 2 3 4 -(black gray44) 4 5 6 7 8 -gray44 4 9 10 11 12 -gray44 4 13 14 15 16 -gray44 14 17 18 19 20 21 22 23 24 25 26 27 28 29 30 -(black gray44)12 31 32 33 34 35 36 37 38 39 40 41 42 -(black gray44) 12 43 44 45 46 47 48 49 50 51 52 53 54 -gray44 7 55 56 57 58 59 60 61 -gray44 7 62 63 64 65 66 67 68 -gray44 5 69 70 71 72 73 -gray44 5 74 75 76 77 78 -gray44 11 79 80 81 82 83 84 85 86 87 88 89 -gray44 11 90 91 92 93 94 95 96 97 98 99 100 -gray44 11 101 102 103 104 105 106 107 108 109 110 111 -gray44 11 112 113 114 115 116 117 118 119 120 121 122 -gray44 14 123 124 125 126 127 128 129 130 131 132 133 134 135 136 -gray44 10 137 138 139 140 141 142 143 144 145 146 -gray44 10 147 148 149 150 151 152 153 154 155 156 -gray44 20 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 diff -Nru acm-5.0/objects/surface.obv acm-6.0+20200416/objects/surface.obv --- acm-5.0/objects/surface.obv 1998-08-14 02:27:41.000000000 +0000 +++ acm-6.0+20200416/objects/surface.obv 1970-01-01 00:00:00.000000000 +0000 @@ -1,515 +0,0 @@ -#788b63-mass -510 3 -1 158400 -274357 0 -2 -158400 -274357 0 -3 -158400 0 0 -4 -158400 274357 0 -5 158400 274357 0 -6 316800 0 0 -7 -43779.8 262562 0.02 -8 -43779.8 262562 0.02 -9 -43867.1 265104 0.02 -10 -44463.8 267083 0.02 -11 -45060.4 269062 0.02 -12 -45452.3 271416 0.02 -13 -46048.6 273395 0.02 -14 -46338.5 274357 0.02 -15 -81588.9 274357 0.02 -16 -81990.8 273359 0.02 -17 -82710.3 271574 0.02 -18 -83329.1 269693 0.02 -19 -83545.3 267434 0.02 -20 -83459.3 264891 0.02 -21 -83067.7 262629 0.02 -22 -82471.9 260649 0.02 -23 -81876.6 258574 0.02 -24 -81585.9 256313 0.02 -25 -81193.8 254050 0.02 -26 -81107 251506 0.02 -27 -81523.6 249435 0.02 -28 -82141.1 247647 0.02 -29 -82859.8 245859 0.02 -30 -83579 243977 0.02 -31 -84297.6 242188 0.02 -32 -84914.9 240400 0.02 -33 -85331.2 238327 0.02 -34 -85747.4 236255 0.02 -35 -85961.9 233993 0.02 -36 -85874 231447 0.02 -37 -85684.7 228901 0.02 -38 -85899.4 226544 0.02 -39 -85810.6 224092 0.02 -40 -85719.8 222017 0.02 -41 -84817.2 220222 0.02 -42 -83506.1 219086 0.02 -43 -81482.7 218608 0.02 -44 -79960.6 219169 0.02 -45 -77931.5 219822 0.02 -46 -75903 220381 0.02 -47 -73672.7 220751 0.02 -48 -71341 221121 0.02 -49 -69110.7 221490 0.02 -50 -66779 221859 0.02 -51 -64750.2 222418 0.02 -52 -63326.6 223545 0.02 -53 -61802 224576 0.02 -54 -60882.6 226176 0.02 -55 -59862.2 227680 0.02 -56 -59245.2 229563 0.02 -57 -58527.3 231351 0.02 -58 -57607.7 232950 0.02 -59 -56587.2 234454 0.02 -60 -55163.4 235579 0.02 -61 -53638.8 236610 0.02 -62 -52113.7 237735 0.02 -63 -50185.8 238387 0.02 -64 -48055.8 238944 0.02 -65 -45624.1 239029 0.02 -66 -43194.8 238642 0.02 -67 -41679.9 237694 0.02 -68 -40369 236465 0.02 -69 -39261.4 235047 0.02 -70 -37950.3 233817 0.02 -71 -36331.6 233340 0.02 -72 -35109.6 234654 0.02 -73 -35809.3 236635 0.02 -74 -36611.1 238428 0.02 -75 -37209.3 240408 0.02 -76 -37298 242951 0.02 -77 -37185 245305 0.02 -78 -36466.9 247092 0.02 -79 -35547.2 248688 0.02 -80 -34526.6 250191 0.02 -81 -34110.9 252260 0.02 -82 -35013.3 254053 0.02 -83 -36527.7 255001 0.02 -84 -38347.4 255667 0.02 -85 -39963 256616 0.02 -86 -41475.7 257846 0.02 -87 -42072.8 259825 0.02 -88 135615 -6906.4 0.04 -89 135007 -5398.98 0.04 -90 134197 -3608.86 0.04 -91 133082 -2101.36 0.04 -92 132271 -405.309 0.04 -93 131157 1102.36 0.04 -94 129840 2327.42 0.04 -95 128421 3552.57 0.04 -96 127408 4966.24 0.04 -97 126091 6191.54 0.04 -98 124469 7134.24 0.04 -99 123152 8359.7 0.04 -100 121328 9114.09 0.04 -101 119808 10057 0.04 -102 117984 10717.2 0.04 -103 115653 10906.4 0.04 -104 113119 10812.8 0.04 -105 110788 10436.3 0.04 -106 108963 10625.3 0.04 -107 108457 12605.3 0.04 -108 107342 14114.2 0.04 -109 106227 15623.1 0.04 -110 104707 16566.6 0.04 -111 103085 17510.2 0.04 -112 101565 18453.7 0.04 -113 99943.2 19397.4 0.04 -114 98118.6 20058.4 0.04 -115 96091.2 20530.9 0.04 -116 94672.2 21757.6 0.04 -117 93658.9 23172.7 0.04 -118 91834.2 23928.2 0.04 -119 89502.4 24023.8 0.04 -120 87170.5 24213.8 0.04 -121 85345.7 24875.1 0.04 -122 84535 26101.8 0.04 -123 85752.2 27421.7 0.04 -124 86766.8 29024.6 0.04 -125 85956.5 30817.3 0.04 -126 84841.9 32327.3 0.04 -127 83220 33271.8 0.04 -128 81699.6 34216.3 0.04 -129 79874.8 34878.1 0.04 -130 77745.6 35257.1 0.04 -131 75718 36013.5 0.04 -132 73182.8 35826.8 0.04 -133 70850.5 36017.3 0.04 -134 68518.2 36207.9 0.04 -135 69125.9 34697.7 0.04 -136 69936.2 32904.3 0.04 -137 69022.7 31300.8 0.04 -138 66994.4 31207.8 0.04 -139 65169.4 31964 0.04 -140 63547.2 32908.9 0.04 -141 61722.1 33570.8 0.04 -142 59897 34232.8 0.04 -143 57868.9 34706.2 0.04 -144 55536.2 34802.3 0.04 -145 53305.1 34992.7 0.04 -146 52393.3 36786.9 0.04 -147 52090.4 39052.5 0.04 -148 51686.2 41318.3 0.04 -149 50571.6 42829.5 0.04 -150 49558.5 44340.7 0.04 -151 47936.5 45475 0.04 -152 46111.4 46232 0.04 -153 44286.3 46894.5 0.04 -154 42258 47274.1 0.04 -155 40432.9 48031.2 0.04 -156 39622.9 49731.4 0.04 -157 40030.4 51808 0.04 -158 40234.4 53129.5 0.04 -159 38612.4 54075.3 0.04 -160 37498.1 55587.1 0.04 -161 36891.4 57570.4 0.04 -162 37096.1 59364 0.04 -163 37300.2 60591 0.04 -164 38214.7 62194.8 0.04 -165 39433.2 63514.8 0.04 -166 40955.8 64645.6 0.04 -167 42069.9 63133.8 0.04 -168 42879.5 61433.6 0.04 -169 43993.6 59921.9 0.04 -170 45107.8 58410.2 0.04 -171 46425.1 57181.5 0.04 -172 48757.7 57084.4 0.04 -173 50178.6 58120.9 0.04 -174 51194.3 59724.1 0.04 -175 51297.5 61517.2 0.04 -176 50487.9 63217.1 0.04 -177 49678.5 65011.4 0.04 -178 48767.6 66805.8 0.04 -179 47755 68223 0.04 -180 47148.9 70300.2 0.04 -181 48570 71336.3 0.04 -182 50092.5 72466.4 0.04 -183 50804.6 74258.4 0.04 -184 50908.8 76523 0.04 -185 49592 77751.9 0.04 -186 47563.6 77660.9 0.04 -187 46344.9 76341.6 0.04 -188 45328.8 74833.2 0.04 -189 44414.1 73230.1 0.04 -190 42891.4 72099.8 0.04 -191 41470.2 71063.6 0.04 -192 38934.6 70972.9 0.04 -193 37109.7 71636.4 0.04 -194 35488.1 72582.8 0.04 -195 33663.3 73246.3 0.04 -196 31635.4 73721.3 0.04 -197 30521.5 75139.1 0.04 -198 30422.8 77216.2 0.04 -199 29817 79199.6 0.04 -200 29008.1 80994.6 0.04 -201 27894.5 82506.9 0.04 -202 26069.8 83170.7 0.04 -203 23837.9 82796.8 0.04 -204 22011 81950 0.04 -205 20285.5 81103 0.04 -206 18256.9 81011.8 0.04 -207 15924.3 81204.4 0.04 -208 14099.5 81868.3 0.04 -209 12579.5 82815 0.04 -210 10958.5 84045.2 0.04 -211 9641.84 85275 0.04 -212 8325.2 86504.8 0.04 -213 7008.45 87640.3 0.04 -214 5895.21 89153.1 0.04 -215 4782.02 90666 0.04 -216 3668.88 92178.9 0.04 -217 2657.07 93597.3 0.04 -218 1035.92 94544.5 0.04 -219 -280.422 95774.6 0.04 -220 -885.205 97853.4 0.04 -221 -982.959 99836.7 0.04 -222 -1282.94 102104 0.04 -223 -2192.26 103900 0.04 -224 -4016.53 104564 0.04 -225 -5742.35 103718 0.04 -226 -7468.16 102871 0.04 -227 -8687.79 101551 0.04 -228 -9603.67 99947 0.04 -229 -10620.8 98437.6 0.04 -230 -11840.3 97117.4 0.04 -231 -13059.8 95797 0.04 -232 -13975.6 94192.7 0.04 -233 -14992.7 92588.5 0.04 -234 -15098.2 90321.3 0.04 -235 -14797 88525.8 0.04 -236 -15002.9 86731.1 0.04 -237 -16728.5 85883.5 0.04 -238 -19264.4 85792.9 0.04 -239 -20787.6 84661.3 0.04 -240 -21500.6 82867.1 0.04 -241 -20590.5 81164.9 0.04 -242 -18766 80406.3 0.04 -243 -16738 80025.5 0.04 -244 -15116.6 79078.3 0.04 -245 -14104.6 77565.1 0.04 -246 -13702.2 75296.9 0.04 -247 -14414.8 73502.6 0.04 -248 -15329.9 71897.4 0.04 -249 -16346.5 70292.3 0.04 -250 -16957.5 68497.6 0.04 -251 -17973.9 66892.4 0.04 -252 -18888.8 65381.4 0.04 -253 -19601.2 63492.1 0.04 -254 -20009.3 61507.9 0.04 -255 -19910.9 58956 0.04 -256 -20319 56877.1 0.04 -257 -21031.1 54987.5 0.04 -258 -21945.6 53476.1 0.04 -259 -22961.7 51870.2 0.04 -260 -23572.1 50074.8 0.04 -261 -23979.8 47995.6 0.04 -262 -24184.9 45632.6 0.04 -263 -22867.2 44497.3 0.04 -264 -21549.6 43267.4 0.04 -265 -20435 41754.2 0.04 -266 -19117.3 40524.5 0.04 -267 -18002.7 39011.3 0.04 -268 -16177.2 38348.4 0.04 -269 -14351.8 37685.6 0.04 -270 -13744.2 36172.9 0.04 -271 -13441.4 33904.4 0.04 -272 -12631 32108.1 0.04 -273 -11211.6 30878.6 0.04 -274 -10401 29176.9 0.04 -275 -10300.9 26625.1 0.04 -276 -8678.32 25679.2 0.04 -277 -7257.83 26245.5 0.04 -278 -5938.68 27001 0.04 -279 -4213.95 27378.1 0.04 -280 -2185.27 26999.1 0.04 -281 -1273.15 25203.2 0.04 -282 -1172.85 22651.7 0.04 -283 145.424 21422.7 0.04 -284 2275.61 21043.8 0.04 -285 3289.48 19531.6 0.04 -286 3390.07 16980.3 0.04 -287 4302.54 15184.7 0.04 -288 3287.68 13673.1 0.04 -289 2070.02 12350.5 0.04 -290 852.375 10933.3 0.04 -291 -60.9191 9421.48 0.04 -292 -1278.48 8098.67 0.04 -293 -1988.85 6208.72 0.04 -294 -2191.96 3940.66 0.04 -295 -2090.62 1861.58 0.04 -296 -1989.21 -690.006 0.04 -297 -1583.35 -2958.06 0.04 -298 -467.35 -4375.51 0.04 -299 1054.43 -5414.86 0.04 -300 2677.66 -6359.64 0.04 -301 4706.61 -6737.36 0.04 -302 7039.87 -6926.04 0.04 -303 9068.7 -6358.87 0.04 -304 10285.9 -4941.5 0.04 -305 10894.4 -3146.32 0.04 -306 10792.9 -595.359 0.04 -307 11807.3 1010.79 0.04 -308 13024.7 2333.43 0.04 -309 15053.6 2900.18 0.04 -310 17082.5 2522.19 0.04 -311 18908.4 1766.37 0.04 -312 20227.2 538.307 0.04 -313 21545.9 -689.696 0.04 -314 22661.8 -2106.56 0.04 -315 23270.6 -4184.6 0.04 -316 22053.4 -5507.13 0.04 -317 20024.6 -6074.13 0.04 -318 20633.4 -7585.45 0.04 -319 22155.2 -8529.81 0.04 -320 23271.3 -10040.9 0.04 -321 24590.3 -11268.6 0.04 -322 24692 -12779.8 0.04 -323 23373.5 -13630.3 0.04 -324 21648.8 -12969.5 0.04 -325 20329.8 -11741.8 0.04 -326 18909.4 -10514.1 0.04 -327 17387.6 -9569.76 0.04 -328 15764.3 -8625.35 0.04 -329 13938.2 -7869.86 0.04 -330 12213.8 -8720.42 0.04 -331 12620 -10987.8 0.04 -332 13634.7 -12499.2 0.04 -333 14548.2 -14293.9 0.04 -334 15360.2 -15994.2 0.04 -335 16172.3 -17788.8 0.04 -336 17288.6 -19205.4 0.04 -337 18607.8 -20433 0.04 -338 19724.2 -21943.9 0.04 -339 20333.7 -23927.3 0.04 -340 19624.4 -25816.8 0.04 -341 18103.3 -26856.7 0.04 -342 16581.2 -25912.8 0.04 -343 14957.7 -24968.9 0.04 -344 13638.4 -23741.5 0.04 -345 13029 -21757.8 0.04 -346 12419.7 -20246.5 0.04 -347 11911.8 -18168.2 0.04 -348 11505.3 -15900.9 0.04 -349 9881.93 -14956.6 0.04 -350 8360.01 -14012.2 0.04 -351 7750.85 -11933.7 0.04 -352 6634.67 -10516.6 0.04 -353 4808.51 -9761.05 0.04 -354 2779.54 -9383.45 0.04 -355 243.427 -9478.39 0.04 -356 -1785.36 -10140.3 0.04 -357 -3814.15 -10707.7 0.04 -358 -6350.26 -10802.7 0.04 -359 -8683.41 -11181.2 0.04 -360 -8277.22 -12976.9 0.04 -361 -7262.4 -14394.3 0.04 -362 -6146.08 -15906.1 0.04 -363 -5333.95 -17701.5 0.04 -364 -4420.35 -19402.3 0.04 -365 -4115.14 -21670.3 0.04 -366 -4520.03 -23749.6 0.04 -367 -4924.83 -25828.9 0.04 -368 -5126.81 -27624.5 0.04 -369 -5023.98 -30176.1 0.04 -370 -5124.02 -32538.7 0.04 -371 -5528.47 -34618 0.04 -372 -6237.36 -36414 0.04 -373 -6946.19 -38210 0.04 -374 -7654.94 -40006 0.04 -375 -8566.67 -41613.3 0.04 -376 -9275.3 -43409.4 0.04 -377 -10186.9 -45016.7 0.04 -378 -10895.4 -46812.9 0.04 -379 -11299.3 -48892.3 0.04 -380 -11500 -51160.6 0.04 -381 -10889.3 -53239 0.04 -382 -9569.29 -54466.2 0.04 -383 -7742.72 -55125.9 0.04 -384 -5713.56 -55501.8 0.04 -385 -3582.86 -55972 0.04 -386 -1249.58 -56158.6 0.04 -387 779.58 -56534.3 0.04 -388 3112.85 -56720.8 0.04 -389 5142.01 -57096.5 0.04 -390 7171.26 -57566.7 0.04 -391 8795.26 -58509.5 0.04 -392 10621.8 -59168.7 0.04 -393 12448.4 -59827.8 0.04 -394 13971 -60770.5 0.04 -395 15595.1 -61807.5 0.04 -396 17421.6 -62466.4 0.04 -397 18944.2 -63409 0.04 -398 20568.2 -64351.3 0.04 -399 21888.3 -65577.3 0.04 -400 23005.8 -67086.7 0.04 -401 23312.8 -69352.5 0.04 -402 23417.4 -71901.9 0.04 -403 24028.5 -73883.9 0.04 -404 25348.7 -75109.3 0.04 -405 27175.4 -75861.9 0.04 -406 29204.4 -76236.5 0.04 -407 31335 -76705.2 0.04 -408 33161.5 -77363.2 0.04 -409 35190.5 -77737.6 0.04 -410 37017.1 -78489.8 0.04 -411 38539.6 -79431.3 0.04 -412 40163.6 -80372.5 0.04 -413 41686.2 -81313.7 0.04 -414 43310.2 -82254.8 0.04 -415 44427.8 -83762.8 0.04 -416 45444.1 -85270.9 0.04 -417 46359.3 -86967.9 0.04 -418 46970.8 -89042.7 0.04 -419 47480.8 -91023.3 0.04 -420 48396.2 -92814.3 0.04 -421 50424.2 -92716 0.04 -422 51946.8 -93656.5 0.04 -423 53064.5 -95163.7 0.04 -424 54182.2 -96576.5 0.04 -425 55502.4 -97800.1 0.04 -426 57328.8 -98551 0.04 -427 59357.4 -98924 0.04 -428 61689.8 -99107.6 0.04 -429 64022 -99196.9 0.04 -430 66049.7 -99098.2 0.04 -431 68279.9 -98810.5 0.04 -432 70814.5 -98710.7 0.04 -433 73145.8 -98328.4 0.04 -434 75680.3 -98228.6 0.04 -435 77809.9 -98601.1 0.04 -436 79534.5 -99351.5 0.04 -437 81157.9 -100291 0.04 -438 82680 -101230 0.04 -439 83797.4 -102736 0.04 -440 85117.1 -103958 0.04 -441 86437.1 -105369 0.04 -442 87554.4 -106874 0.04 -443 88874.1 -108096 0.04 -444 89991.5 -109601 0.04 -445 91311.2 -110823 0.04 -446 93338.2 -110724 0.04 -447 94552.3 -109401 0.04 -448 95563.4 -107797 0.04 -449 95965.6 -105723 0.04 -450 96367.9 -103648 0.04 -451 96770.3 -101574 0.04 -452 96665.3 -99029.8 0.04 -453 96560.4 -96485.4 0.04 -454 96456.3 -94506.4 0.04 -455 96960.3 -92431.8 0.04 -456 97363.1 -90357.4 0.04 -457 97461.4 -88000.8 0.04 -458 97864.4 -86020.6 0.04 -459 98064.3 -83663.7 0.04 -460 97959.9 -81118.8 0.04 -461 97551.9 -78857.3 0.04 -462 97245.3 -76595.4 0.04 -463 96938.6 -74239.2 0.04 -464 96530.8 -71977.3 0.04 -465 96123 -69715.3 0.04 -466 96019.2 -67170 0.04 -467 95712.9 -64907.7 0.04 -468 95609.2 -62362.2 0.04 -469 95505.5 -59722.3 0.04 -470 95605.5 -58025 0.04 -471 96617.9 -56420.7 0.04 -472 97833.3 -55099.1 0.04 -473 99860.6 -55002.2 0.04 -474 102192 -55093.5 0.04 -475 103915 -54242.8 0.04 -476 105130 -52921.4 0.04 -477 106143 -51411.9 0.04 -478 107054 -49808.2 0.04 -479 108269 -48487 0.04 -480 109484 -47165.9 0.04 -481 110396 -45562.4 0.04 -482 111408 -43958.8 0.04 -483 112320 -42449.7 0.04 -484 113535 -41128.8 0.04 -485 114750 -39713.7 0.04 -486 116777 -39146.3 0.04 -487 118804 -38578.8 0.04 -488 120323 -37446.5 0.04 -489 121843 -36408.4 0.04 -490 123058 -35087.9 0.04 -491 124476 -33955.9 0.04 -492 125489 -32353 0.04 -493 126705 -31032.8 0.04 -494 128123 -29995.1 0.04 -495 129338 -28675 0.04 -496 130351 -27072.4 0.04 -497 131566 -25752.5 0.04 -498 132478 -24150.1 0.04 -499 133693 -22830.3 0.04 -500 134402 -21039.7 0.04 -501 133793 -18967.2 0.04 -502 133996 -16705.8 0.04 -503 134907 -15103.7 0.04 -504 136629 -14255.1 0.04 -505 138149 -13218.2 0.04 -506 139668 -12087.2 0.04 -507 140073 -10014.5 0.04 -508 138250 -9355.46 0.04 -509 136629 -8413.68 0.04 -510 135615 -6906.4 0.04 -#203d68 6 1 2 3 4 5 6 -#788b63 81 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 -#788b63 423 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 diff -Nru acm-5.0/objects/telar1.obv acm-6.0+20200416/objects/telar1.obv --- acm-5.0/objects/telar1.obv 1998-08-14 21:22:44.000000000 +0000 +++ acm-6.0+20200416/objects/telar1.obv 1970-01-01 00:00:00.000000000 +0000 @@ -1,140 +0,0 @@ -object -116 22 -1 11 -8.625 5.64444 -2 12.0097 -8.625 5.37388 -3 12.7489 -8.625 4.63472 -4 13.0194 -8.625 3.625 -5 12.7489 -8.625 2.61528 -6 12.0097 -8.625 1.87612 -7 11 -8.625 1.60556 -8 9.99028 -8.625 1.87612 -9 9.25112 -8.625 2.61528 -10 8.98056 -8.625 3.625 -11 9.25112 -8.625 4.63472 -12 9.99028 -8.625 5.37388 -13 -21.8769 0.25 -4.25 -14 -20.9198 0.25 2.875 -15 -21 -6.25 3 -16 -21.5 -6 -0.75 -17 -21.5 -9.375 -0.375 -18 -22 -8 -4.25 -19 -22 8 -4.25 -20 -21.5 9.375 -0.375 -21 -21.5 6 -0.75 -22 -21 6.25 3 -23 -20.9198 -0.25 2.875 -24 -21.8769 -0.25 -4.25 -25 -15.375 6.125 -8.79722 -26 -15.625 2.375 -8.625 -27 -4.375 2.125 -16.375 -28 -4.375 6.125 -16.375 -29 -4.375 -6.125 -16.375 -30 -4.375 -2.125 -16.375 -31 -15.625 -2.375 -8.625 -32 -15.375 -6.125 -8.79722 -33 -3.375 -6.25 -15.25 -34 -3.375 -2.25 -15.25 -35 -14.625 -2.5 -7.5 -36 -14.375 -6.25 -7.67222 -37 -14.375 6.25 -7.67222 -38 -14.625 2.5 -7.5 -39 -3.375 2.25 -15.25 -40 -3.375 6.25 -15.25 -41 -14.875 6.16094 -8.875 -42 -14.125 6.25 -7.75 -43 -3.25 6.375 -14.75 -44 -4.25 6.25 -16.375 -45 -4.25 -6.25 -16.375 -46 -3.25 -6.375 -14.75 -47 -14.125 -6.25 -7.75 -48 -14.875 -6.16094 -8.875 -49 -7.625 0.125 -15.5 -50 -7.375 -1.5 -15.375 -51 -6.625 -2.25 -14.125 -52 -6.07258 -1.25 -12.875 -53 -6 -0.125 -12.5 -54 -6.46371 1.625 -13 -55 -7.14718 2.375 -14.125 -56 -7.82258 1.875 -15.5 -57 19.375 5.625 -0.875 -58 19.375 -5.5 -0.625 -59 15.25 -6.375 3.5 -60 15.5845 6.625 2.875 -61 19.625 5.5 -0.625 -62 19.5 -5.25 -0.5 -63 12.625 -6.25 -2 -64 12.625 7.125 -2.18978 -65 16 -6.125 -0.75 -66 15.875 -9.375 -0.25 -67 5 -9.375 -0.375 -68 5 9.375 -0.375 -69 15.875 9.375 -0.25 -70 16 6.125 -0.75 -71 12.625 7.125 -2.125 -72 10.625 6.5 -4.125 -73 10.625 -6.375 -4.125 -74 12.75 -6.25 -2 -75 10.75 -0.125 -4.125 -76 -22 -0.125 -4.125 -77 -22.125 -8.125 -4.125 -78 5.5 -8 -4.125 -79 10.75 -6.5 -4.125 -80 10.75 6.5 -4.125 -81 5.5 8 -4.125 -82 -22.125 8.125 -4.125 -83 -22 0.125 -4.125 -84 10.75 0.125 -4.125 -85 5.5 -9.125 -0.125 -86 -21.5 -9.125 -0.125 -87 -22.125 -7.875 -4.125 -88 5.5 -7.875 -4.125 -89 5.5 7.875 -4.125 -90 -22.125 7.875 -4.125 -91 -21.5 9.125 -0.125 -92 5.5 9.125 -0.125 -93 11.75 -6.58244 -2.375 -94 12.875 -6.29936 -2.25 -95 12.875 -6.93003 0 -96 5.625 -8.875 -0.375 -97 5.25 -8 -3.875 -98 10.625 -6.375 -4.25 -99 10.625 6.375 -4.25 -100 5.25 8 -3.875 -101 5.625 8.875 -0.375 -102 12.875 6.93003 0 -103 12.875 6.29936 -2.25 -104 11.75 6.58244 -2.375 -105 59.625 0 -4.82322 -106 59.7134 0 -4.84691 -107 59.7781 0 -4.91161 -108 59.8018 0 -5 -109 59.7781 0 -5.08839 -110 59.7134 0 -5.15309 -111 59.625 0 -5.17678 -112 59.5366 0 -5.15309 -113 59.4719 0 -5.08839 -114 59.4482 0 -5 -115 59.4719 0 -4.91161 -116 59.5366 0 -4.84691 -gray44 12 1 2 3 4 5 6 7 8 9 10 11 12 -gray44 6 13 14 15 16 17 18 -gray44 6 19 20 21 22 23 24 -gray44 4 25 26 27 28 -gray44 4 29 30 31 32 -gray44 4 33 34 35 36 -gray44 4 37 38 39 40 -gray44 4 41 42 43 44 -gray44 4 45 46 47 48 -gray44 8 49 50 51 52 53 54 55 56 -gray44 4 57 58 59 60 -gray44 4 61 62 63 64 -gray44 3 65 66 67 -gray44 3 68 69 70 -gray44 4 71 72 73 74 -gray44 5 75 76 77 78 79 -gray44 5 80 81 82 83 84 -gray44 4 85 86 87 88 -gray44 4 89 90 91 92 -gray44 6 93 94 95 96 97 98 -gray44 6 99 100 101 102 103 104 -gray44 12 105 106 107 108 109 110 111 112 113 114 115 116 diff -Nru acm-5.0/objects/tower.obv acm-6.0+20200416/objects/tower.obv --- acm-5.0/objects/tower.obv 1998-08-14 02:27:44.000000000 +0000 +++ acm-6.0+20200416/objects/tower.obv 1970-01-01 00:00:00.000000000 +0000 @@ -1,78 +0,0 @@ -*-a-control-tower -60 16 -1 20 20 0 -2 20 -20 0 -3 12 -12 -60 -4 12 12 -60 -5 12 12 -60 -6 12 -12 -60 -7 12 -12 -64 -8 12 12 -64 -9 12 0.25 -64 -10 12 -0.25 -64 -11 12 -0.25 -72 -12 12 0.25 -72 -13 14 14 -72 -14 14 -14 -72 -15 0 0 -76 -16 -20 -20 0 -17 -20 20 0 -18 -12 12 -60 -19 -12 -12 -60 -20 -12 -12 -60 -21 -12 12 -60 -22 -12 12 -64 -23 -12 -12 -64 -24 -12 -0.25 -64 -25 -12 0.25 -64 -26 -12 0.25 -72 -27 -12 -0.25 -72 -28 -14 -14 -72 -29 -14 14 -72 -30 0 0 -76 -31 20 20 0 -32 -20 20 0 -33 -12 12 -60 -34 12 12 -60 -35 12 12 -60 -36 -12 12 -60 -37 -12 12 -64 -38 12 12 -64 -39 -0.25 12 -64 -40 0.25 12 -64 -41 0.25 12 -72 -42 -0.25 12 -72 -43 14 14 -72 -44 -14 14 -72 -45 0 0 -76 -46 -20 -20 0 -47 20 -20 0 -48 12 -12 -60 -49 -12 -12 -60 -50 -12 -12 -60 -51 12 -12 -60 -52 12 -12 -64 -53 -12 -12 -64 -54 -0.25 -12 -64 -55 0.25 -12 -64 -56 0.25 -12 -72 -57 -0.25 -12 -72 -58 -14 -14 -72 -59 14 -14 -72 -60 0 0 -76 -black 4 1 2 3 4 -black 4 5 6 7 8 -black 4 9 10 11 12 -black 3 13 14 15 -black 4 16 17 18 19 -black 4 20 21 22 23 -black 4 24 25 26 27 -black 3 28 29 30 -black 4 31 32 33 34 -black 4 35 36 37 38 -black 4 39 40 41 42 -black 3 43 44 45 -black 4 46 47 48 49 -black 4 50 51 52 53 -black 4 54 55 56 57 -black 3 58 59 60 diff -Nru acm-5.0/objects/WMM.COF acm-6.0+20200416/objects/WMM.COF --- acm-5.0/objects/WMM.COF 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/objects/WMM.COF 2020-04-16 12:05:38.000000000 +0000 @@ -0,0 +1,93 @@ + 2020.0 WMM-2020 12/10/2019 + 1 0 -29404.5 0.0 6.7 0.0 + 1 1 -1450.7 4652.9 7.7 -25.1 + 2 0 -2500.0 0.0 -11.5 0.0 + 2 1 2982.0 -2991.6 -7.1 -30.2 + 2 2 1676.8 -734.8 -2.2 -23.9 + 3 0 1363.9 0.0 2.8 0.0 + 3 1 -2381.0 -82.2 -6.2 5.7 + 3 2 1236.2 241.8 3.4 -1.0 + 3 3 525.7 -542.9 -12.2 1.1 + 4 0 903.1 0.0 -1.1 0.0 + 4 1 809.4 282.0 -1.6 0.2 + 4 2 86.2 -158.4 -6.0 6.9 + 4 3 -309.4 199.8 5.4 3.7 + 4 4 47.9 -350.1 -5.5 -5.6 + 5 0 -234.4 0.0 -0.3 0.0 + 5 1 363.1 47.7 0.6 0.1 + 5 2 187.8 208.4 -0.7 2.5 + 5 3 -140.7 -121.3 0.1 -0.9 + 5 4 -151.2 32.2 1.2 3.0 + 5 5 13.7 99.1 1.0 0.5 + 6 0 65.9 0.0 -0.6 0.0 + 6 1 65.6 -19.1 -0.4 0.1 + 6 2 73.0 25.0 0.5 -1.8 + 6 3 -121.5 52.7 1.4 -1.4 + 6 4 -36.2 -64.4 -1.4 0.9 + 6 5 13.5 9.0 -0.0 0.1 + 6 6 -64.7 68.1 0.8 1.0 + 7 0 80.6 0.0 -0.1 0.0 + 7 1 -76.8 -51.4 -0.3 0.5 + 7 2 -8.3 -16.8 -0.1 0.6 + 7 3 56.5 2.3 0.7 -0.7 + 7 4 15.8 23.5 0.2 -0.2 + 7 5 6.4 -2.2 -0.5 -1.2 + 7 6 -7.2 -27.2 -0.8 0.2 + 7 7 9.8 -1.9 1.0 0.3 + 8 0 23.6 0.0 -0.1 0.0 + 8 1 9.8 8.4 0.1 -0.3 + 8 2 -17.5 -15.3 -0.1 0.7 + 8 3 -0.4 12.8 0.5 -0.2 + 8 4 -21.1 -11.8 -0.1 0.5 + 8 5 15.3 14.9 0.4 -0.3 + 8 6 13.7 3.6 0.5 -0.5 + 8 7 -16.5 -6.9 0.0 0.4 + 8 8 -0.3 2.8 0.4 0.1 + 9 0 5.0 0.0 -0.1 0.0 + 9 1 8.2 -23.3 -0.2 -0.3 + 9 2 2.9 11.1 -0.0 0.2 + 9 3 -1.4 9.8 0.4 -0.4 + 9 4 -1.1 -5.1 -0.3 0.4 + 9 5 -13.3 -6.2 -0.0 0.1 + 9 6 1.1 7.8 0.3 -0.0 + 9 7 8.9 0.4 -0.0 -0.2 + 9 8 -9.3 -1.5 -0.0 0.5 + 9 9 -11.9 9.7 -0.4 0.2 + 10 0 -1.9 0.0 0.0 0.0 + 10 1 -6.2 3.4 -0.0 -0.0 + 10 2 -0.1 -0.2 -0.0 0.1 + 10 3 1.7 3.5 0.2 -0.3 + 10 4 -0.9 4.8 -0.1 0.1 + 10 5 0.6 -8.6 -0.2 -0.2 + 10 6 -0.9 -0.1 -0.0 0.1 + 10 7 1.9 -4.2 -0.1 -0.0 + 10 8 1.4 -3.4 -0.2 -0.1 + 10 9 -2.4 -0.1 -0.1 0.2 + 10 10 -3.9 -8.8 -0.0 -0.0 + 11 0 3.0 0.0 -0.0 0.0 + 11 1 -1.4 -0.0 -0.1 -0.0 + 11 2 -2.5 2.6 -0.0 0.1 + 11 3 2.4 -0.5 0.0 0.0 + 11 4 -0.9 -0.4 -0.0 0.2 + 11 5 0.3 0.6 -0.1 -0.0 + 11 6 -0.7 -0.2 0.0 0.0 + 11 7 -0.1 -1.7 -0.0 0.1 + 11 8 1.4 -1.6 -0.1 -0.0 + 11 9 -0.6 -3.0 -0.1 -0.1 + 11 10 0.2 -2.0 -0.1 0.0 + 11 11 3.1 -2.6 -0.1 -0.0 + 12 0 -2.0 0.0 0.0 0.0 + 12 1 -0.1 -1.2 -0.0 -0.0 + 12 2 0.5 0.5 -0.0 0.0 + 12 3 1.3 1.3 0.0 -0.1 + 12 4 -1.2 -1.8 -0.0 0.1 + 12 5 0.7 0.1 -0.0 -0.0 + 12 6 0.3 0.7 0.0 0.0 + 12 7 0.5 -0.1 -0.0 -0.0 + 12 8 -0.2 0.6 0.0 0.1 + 12 9 -0.5 0.2 -0.0 -0.0 + 12 10 0.1 -0.9 -0.0 -0.0 + 12 11 -1.1 -0.0 -0.0 0.0 + 12 12 -0.3 0.5 -0.1 -0.1 +999999999999999999999999999999999999999999999999 +999999999999999999999999999999999999999999999999 diff -Nru acm-5.0/objects/zones/europe/france.txt acm-6.0+20200416/objects/zones/europe/france.txt --- acm-5.0/objects/zones/europe/france.txt 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/objects/zones/europe/france.txt 2020-04-16 12:05:39.000000000 +0000 @@ -0,0 +1,401 @@ +# France zone. +# Created: 2020-04-16 +# Latitude range: [42N, 50N[ +# Longitude range: [005W, 006E[ +# 2017-11-01 Source: http://ourairports.com + +GROUND_COLOR #305030 + +RWY EBBX 06/24 1514 7874 148 49-52-53.76N 005-12-52.60E 49-53-34.44N 005-14-35.20E +RWY EGJA 03/21 290 1630 121 49-42-19.08N 002-12-47.02W 49-42-33.12N 002-12-36.00W +RWY EGJA 08/26 290 2887 75 49-42-21.60N 002-13-15.06W 49-42-26.64N 002-12-31.82W +RWY EGJA 14/32 290 2402 121 49-42-32.04N 002-13-16.82W 49-42-15.84N 002-12-50.18W +RWY EGJB 09/27 336 4800 148 49-26-04.92N 002-36-43.34W 49-26-06.72N 002-35-30.84W +RWY EGJJ 08/26 277 5597 151 49-12-25.20N 002-12-24.95W 49-12-32.04N 002-11-01.25W +RWY LEBB 10/28 138 6562 148 43-18-11.88N 002-56-13.31W 43-18-04.68N 002-54-45.14W +RWY LEBB 12/30 138 8530 148 43-18-22.68N 002-55-29.78W 43-17-44.88N 002-53-46.68W +RWY LEBG 06/24 2945 4393 98 42-21-15.12N 003-37-38.96W 42-21-39.60N 003-36-50.51W +RWY LECD 07/25 3586 3773 75 42-23-04.20N 001-51-36.58E 42-23-17.88N 001-52-23.45E +RWY LEPP 15/33 1504 7241 148 42-46-46.20N 001-39-11.70W 42-45-43.20N 001-38-25.80W +RWY LESO 04/22 16 5755 148 43-21-01.44N 001-47-50.64W 43-21-45.72N 001-47-01.75W +RWY LESU 04/22 2625 4396 98 42-20-13.56N 001-24-25.52E 42-20-47.40N 001-25-02.14E +RWY LEVT 04/22 1682 11483 148 42-52-12.36N 002-44-13.31W 42-53-44.16N 002-42-42.80W +RWY LEXJ 11/29 16 7612 148 43-25-50.88N 003-50-02.11W 43-25-24.96N 003-48-25.27W +RWY LF50 07/25 255 3150 48 47-34-42.24N 000-25-04.90W 47-34-55.56N 000-24-23.44W +RWY LF51 17/35 305 6562 98 44-11-19.68N 004-54-53.50E 44-10-18.12N 004-55-23.09E +RWY LF52 05/23 866 7874 148 49-01-06.96N 005-51-48.31E 49-01-56.28N 005-53-19.39E +RWY LFAG 09/27 295 4560 98 49-52-07.32N 003-01-11.64E 49-52-06.24N 003-02-21.34E +RWY LFAI 05/23 428 3133 66 48-35-38.04N 003-00-06.91E 48-35-56.40N 003-00-44.21E +RWY LFAI 06/24 428 3133 66 48-35-38.04N 003-00-06.91E 48-35-56.40N 003-00-44.21E +RWY LFAO 12/30 718 3478 66 48-32-53.52N 000-23-37.19W 48-32-36.24N 000-22-52.41W +RWY LFAQ 09/27 364 3838 82 49-58-17.40N 002-41-22.24E 49-58-17.40N 002-42-20.92E +RWY LFAY 12/30 208 4134 82 49-52-31.80N 002-22-45.23E 49-52-13.80N 002-23-41.71E +RWY LFBA 11/29 204 7103 98 44-10-39.72N 000-34-49.54E 44-10-13.08N 000-36-19.78E +RWY LFBC 06/24 84 7900 148 44-31-40.80N 001-08-16.84W 44-32-24.00N 001-06-45.83W +RWY LFBD 05/23 162 10171 148 44-49-08.76N 000-43-44.34W 44-50-19.32N 000-42-03.60W +RWY LFBD 11/29 162 7923 148 44-49-53.76N 000-43-45.27W 44-49-31.44N 000-41-59.63W +RWY LFBE 10/28 171 7234 148 44-49-31.08N 000-30-17.82E 44-49-25.68N 000-31-57.37E +RWY LFBF 12/30 535 5906 148 43-32-56.76N 001-21-25.92E 43-32-32.28N 001-22-38.68E +RWY LFBG 05/23 102 7949 148 45-38-54.24N 000-19-27.79W 45-39-45.00N 000-18-02.46W +RWY LFBH 10/28 74 7398 148 46-10-46.92N 001-12-39.64W 46-10-43.68N 001-10-54.52W +RWY LFBI 03/21 423 7710 148 46-34-46.56N 000-18-00.42E 46-35-52.44N 000-18-56.74E +RWY LFBK 17/35 1497 6234 148 46-13-51.60N 002-21-40.50E 46-12-51.48N 002-22-00.01E +RWY LFBL 03/21 1300 8202 148 45-51-09.00N 001-10-21.14E 45-52-16.68N 001-11-24.72E +RWY LFBM 09/27 203 11821 148 43-54-38.52N 000-31-54.40W 43-54-44.28N 000-29-13.07W +RWY LFBN 07/25 203 5774 98 46-18-29.88N 000-24-43.55W 46-18-52.20N 000-23-26.63W +RWY LFBO 14L/32R 499 9843 148 43-38-14.64N 001-21-27.43E 43-36-56.16N 001-22-48.79E +RWY LFBO 14R/32L 499 11483 148 43-38-38.76N 001-20-45.35E 43-37-08.40N 001-22-19.56E +RWY LFBP 13/31 616 8202 148 43-23-15.72N 000-25-59.74W 43-22-28.20N 000-24-29.67W +RWY LFBR 12/30 622 3609 98 43-27-05.04N 001-15-27.43E 43-26-48.84N 001-16-11.14E +RWY LFBT 02/20 1260 9843 148 43-09-57.60N 000-00-45.90W 43-11-28.68N 000-00-00.25E +RWY LFBU 10/28 436 5938 148 45-43-49.80N 000-12-25.67E 45-43-42.60N 000-13-48.77E +RWY LFBX 11/29 328 5741 98 45-12-01.44N 000-48-20.77E 45-11-38.76N 000-49-34.27E +RWY LFBZ 09/27 245 7382 148 43-28-05.52N 001-32-14.03W 43-28-06.60N 001-30-33.91W +RWY LFCC 13/31 912 4921 98 44-21-20.16N 001-28-03.00E 44-20-49.92N 001-28-54.98E +RWY LFCG 16/34 1368 3609 98 43-00-43.92N 001-06-00.25E 43-00-11.88N 001-06-22.43E +RWY LFCH 08L/26R 49 4593 66 44-35-43.08N 001-07-05.02W 44-35-57.84N 001-06-04.00W +RWY LFCI 09/27 564 5118 98 43-54-47.16N 002-06-03.38E 43-54-47.88N 002-07-13.37E +RWY LFCK 14/32 788 5988 98 43-33-45.72N 002-16-55.56E 43-32-59.28N 002-17-46.54E +RWY LFCL 15/33 459 3117 76 43-35-24.36N 001-29-49.09E 43-34-55.92N 001-30-04.93E +RWY LFCM 14/32 2606 5577 98 43-59-43.44N 003-10-35.51E 43-58-59.88N 003-11-22.06E +RWY LFCQ 10/28 581 3166 66 43-46-13.08N 002-00-20.88E 43-46-09.12N 002-01-03.72E +RWY LFCR 13/31 1910 6693 148 44-24-49.32N 002-28-21.58E 44-24-07.56N 002-29-33.50E +RWY LFCU 10/28 2428 4429 98 45-32-12.84N 002-24-58.61E 45-32-05.64N 002-25-59.70E +RWY LFCW 10/28 190 3412 98 44-23-56.40N 000-45-14.02E 44-23-49.56N 000-45-59.98E +RWY LFCY 10/28 72 4117 98 45-37-54.48N 000-58-48.35W 45-37-46.56N 000-57-51.58W +RWY LFCZ 08/26 164 3412 66 44-08-43.80N 001-10-51.17W 44-08-48.12N 001-10-04.80W +RWY LFDA 12/30 259 3281 98 43-42-42.84N 000-15-08.00W 43-42-29.88N 000-14-27.00W +RWY LFDB 14/32 351 3215 66 44-01-43.68N 001-22-25.32E 44-01-21.36N 001-22-56.71E +RWY LFDH 01/19 411 4921 98 43-40-37.20N 000-35-57.11E 43-41-25.44N 000-36-01.29E +RWY LFDI 04/22 157 3609 66 44-58-42.96N 000-08-19.60W 44-59-11.76N 000-07-50.60W +RWY LFDJ 09/27 1115 4265 98 43-05-26.88N 001-41-23.89E 43-05-25.44N 001-42-21.31E +RWY LFDM 11/29 105 3937 98 44-30-02.16N 000-11-35.98E 44-29-50.28N 000-12-27.71E +RWY LFDN 12/30 60 7480 148 45-53-46.32N 000-59-50.14W 45-53-06.36N 000-58-21.07W +RWY LFED 10/28 407 3675 98 48-03-32.04N 002-55-45.59W 48-03-29.52N 002-54-51.44W +RWY LFEH 06/24 630 3330 66 47-28-42.60N 002-23-20.04E 47-28-59.16N 002-24-02.02E +RWY LFES 03/21 574 4921 98 48-02-46.68N 003-40-07.14W 48-03-31.68N 003-39-39.28W +RWY LFEY 14/32 79 4035 82 46-43-19.56N 002-23-46.82W 46-42-48.24N 002-23-11.18W +RWY LFFI 07/25 111 3937 82 47-24-23.76N 001-11-06.61W 47-24-35.28N 001-10-11.86W +RWY LFFN 10/28 381 8038 148 48-25-53.40N 004-27-53.57E 48-25-41.16N 004-29-51.29E +RWY LFGF 03/21 656 3462 98 47-00-06.12N 004-53-25.12E 47-00-37.08N 004-53-47.15E +RWY LFGJ 05/23 645 7318 148 47-01-59.16N 005-24-55.22E 47-02-41.28N 005-26-21.08E +RWY LFGK 08/26 732 3510 98 47-59-29.40N 003-23-06.79E 47-59-35.52N 003-23-58.60E +RWY LFGW 10/28 1230 3675 66 49-07-23.52N 005-27-41.33E 49-07-17.40N 005-28-35.65E +RWY LFHQ 01/19 3218 4298 98 45-04-11.64N 002-59-29.36E 45-04-53.40N 002-59-38.87E +RWY LFHS 18/36 857 3737 98 46-12-21.60N 005-17-31.24E 46-11-44.88N 005-17-31.42E +RWY LFHV 18/36 1076 3412 98 45-55-23.88N 004-38-06.00E 45-54-50.04N 004-38-05.32E +RWY LFHV 18L/36R 1076 3609 262 45-55-24.60N 004-38-09.74E 45-54-49.68N 004-38-08.09E +RWY LFHY 08/26 915 4265 98 46-32-01.68N 003-24-55.19E 46-32-07.44N 003-25-55.63E +RWY LFIF 12/30 1686 4265 66 43-49-40.44N 002-44-20.62E 43-49-20.28N 002-45-11.92E +RWY LFIG 10/28 2024 3445 66 44-10-47.28N 002-30-43.42E 44-10-44.76N 002-31-30.58E +RWY LFJA 01/19 1001 4921 148 48-04-46.56N 005-02-53.16E 48-05-35.16N 005-03-00.00E +RWY LFJB 04/22 576 4265 66 46-53-57.12N 000-42-05.05W 46-54-30.96N 000-41-28.95W +RWY LFJR 08/26 194 5906 148 47-33-32.04N 000-19-28.83W 47-33-41.76N 000-18-03.45W +RWY LFJU 06/24 746 4960 55 46-42-35.28N 002-56-15.54E 46-43-02.28N 002-57-14.90E +RWY LFJU 06R/24L 746 2170 125 46-42-33.84N 002-56-22.31E 46-42-45.36N 002-56-48.66E +RWY LFLA 01/19 523 5413 98 47-50-34.80N 003-29-45.96E 47-51-27.72N 003-29-53.56E +RWY LFLB 18/36 779 6628 148 45-38-49.56N 005-52-46.13E 45-37-44.40N 005-52-51.46E +RWY LFLC 08/26 1090 9885 148 45-47-05.28N 003-09-02.95E 45-47-18.96N 003-11-20.98E +RWY LFLD 06/24 529 5085 148 47-03-23.76N 002-21-35.57E 47-03-49.68N 002-22-38.39E +RWY LFLE 15/33 973 3281 66 45-33-52.56N 005-58-19.42E 45-33-27.00N 005-58-46.06E +RWY LFLH 17/35 623 4725 98 46-49-57.00N 004-48-58.03E 46-49-10.92N 004-49-08.98E +RWY LFLL 17L/35R 821 8760 148 45-44-05.64N 005-05-30.73E 45-42-39.60N 005-05-41.21E +RWY LFLL 17R/35L 821 13124 148 45-44-47.76N 005-05-09.38E 45-42-38.52N 005-05-25.08E +RWY LFLM 17/35 728 4036 79 46-18-02.16N 004-47-41.82E 46-17-22.56N 004-47-47.62E +RWY LFLN 15L/33R 796 6660 148 46-25-19.20N 004-00-25.63E 46-24-23.40N 004-01-15.96E +RWY LFLN 15R/33L 796 4921 98 46-24-59.40N 004-00-25.85E 46-24-18.00N 004-01-03.36E +RWY LFLS 09/27 1302 10007 148 45-21-46.80N 005-18-35.68E 45-21-46.44N 005-20-55.82E +RWY LFLT 11/29 771 3281 98 46-21-14.76N 002-33-51.77E 46-21-03.60N 002-34-35.72E +RWY LFLU 01/19 525 6890 148 44-54-43.92N 004-58-05.16E 44-55-51.60N 004-58-18.12E +RWY LFLV 01/19 817 7218 148 46-09-35.64N 003-24-06.19E 46-10-46.20N 003-24-20.70E +RWY LFLW 15/33 2096 5577 98 44-53-52.44N 002-25-00.98E 44-53-06.00N 002-25-38.78E +RWY LFLX 04/22 529 11483 148 46-51-02.16N 001-43-09.01E 46-52-36.84N 001-44-39.01E +RWY LFLY 16/34 659 5971 148 45-44-06.00N 004-56-27.35E 45-43-09.48N 004-56-51.40E +RWY LFMA 14/32 367 5249 98 43-30-41.76N 005-21-44.50E 43-29-58.92N 005-22-24.60E +RWY LFMH 18/36 1325 7546 148 45-33-04.32N 004-17-42.50E 45-31-49.80N 004-17-51.94E +RWY LFMI 15/33 82 12303 197 43-32-16.08N 004-54-47.88E 43-30-28.08N 004-56-04.63E +RWY LFMK 10/28 433 6726 148 43-13-01.56N 002-17-35.41E 43-12-54.00N 002-19-05.63E +RWY LFML 13L/31R 74 11483 148 43-26-56.76N 005-11-50.32E 43-25-38.28N 005-13-42.46E +RWY LFML 13R/31L 74 7776 148 43-26-28.68N 005-12-10.87E 43-25-33.24N 005-13-27.66E +RWY LFMO 15/33 197 7909 197 44-08-56.04N 004-51-35.06E 44-07-52.68N 004-52-38.50E +RWY LFMP 13/31 144 4150 66 42-44-23.28N 002-51-55.58E 42-43-58.44N 002-52-39.36E +RWY LFMP 15/33 144 8202 148 42-45-14.76N 002-51-42.16E 42-44-06.00N 002-52-39.90E +RWY LFMQ 13/31 1391 5741 98 43-15-25.92N 005-46-35.62E 43-14-52.08N 005-47-37.75E +RWY LFMS 01/19 668 4576 98 44-03-48.60N 004-08-24.79E 44-04-32.88N 004-08-38.40E +RWY LFMT 12L/30R 17 8530 164 43-35-09.96N 003-57-20.63E 43-34-22.08N 003-58-55.99E +RWY LFMT 12R/30L 17 3609 98 43-34-32.88N 003-57-06.80E 43-34-12.72N 003-57-47.12E +RWY LFMU 10/28 56 5971 98 43-19-27.12N 003-20-33.90E 43-19-22.44N 003-21-54.22E +RWY LFMV 17/35 124 6168 148 43-54-56.16N 004-53-58.42E 43-53-56.40N 004-54-14.69E +RWY LFMY 16/34 195 6565 148 43-36-56.52N 005-06-15.88E 43-35-55.68N 005-06-46.94E +RWY LFMZ 08/26 207 3281 98 43-10-28.92N 002-43-42.38E 43-10-35.40N 002-44-26.02E +RWY LFNB 13/31 3362 4265 98 44-30-19.80N 003-31-34.28E 44-29-55.32N 003-32-22.27E +RWY LFNH 13/31 394 3937 66 44-02-00.60N 005-04-21.00E 44-01-34.32N 005-05-01.64E +RWY LFOA 06/24 580 11493 148 47-02-52.44N 002-36-42.37E 47-03-48.60N 002-39-06.62E +RWY LFOB 04/22 359 3625 98 49-27-16.56N 002-06-46.87E 49-27-43.56N 002-07-23.77E +RWY LFOB 13/31 359 7972 148 49-27-29.88N 002-06-13.86E 49-26-46.32N 002-07-54.26E +RWY LFOC 10/28 433 7552 148 48-03-34.56N 001-21-40.82E 48-03-24.12N 001-23-30.88E +RWY LFOD 10/28 269 4757 98 47-15-26.64N 000-07-28.51W 47-15-22.68N 000-06-19.85W +RWY LFOE 04/22 464 9826 148 49-01-05.88N 001-12-24.16E 49-02-20.40N 001-13-58.87E +RWY LFOH 05/23 313 7546 130 49-31-35.40N 000-04-39.31E 49-32-29.76N 000-05-57.57E +RWY LFOJ 07/25 412 7887 148 47-59-02.04N 001-44-44.02E 47-59-29.40N 001-46-32.48E +RWY LFOK 10/28 587 12664 148 48-46-46.56N 004-09-30.28E 48-46-22.08N 004-12-35.75E +RWY LFOP 04/22 512 5577 148 49-22-46.20N 001-10-06.42E 49-23-27.60N 001-11-02.18E +RWY LFOQ 12/30 398 4101 98 47-40-53.76N 001-12-08.32E 47-40-33.60N 001-12-57.10E +RWY LFOT 02/20 357 7887 148 47-25-18.48N 000-43-24.27E 47-26-33.72N 000-43-54.48E +RWY LFOU 03/21 443 4528 98 47-04-35.40N 000-52-51.27W 47-05-16.08N 000-52-23.58W +RWY LFOV 14/32 330 5020 98 48-02-12.48N 000-44-57.26W 48-01-33.24N 000-44-12.25W +RWY LFOZ 05/23 396 4567 98 47-53-38.76N 002-09-26.42E 47-54-06.12N 002-10-19.96E +RWY LFPB 03/21 218 8743 197 48-56-55.32N 002-25-36.70E 48-58-13.80N 002-26-31.74E +RWY LFPB 07/25 218 9843 148 48-57-49.68N 002-25-13.04E 48-58-26.40N 002-27-29.70E +RWY LFPB 09/27 218 6053 148 48-57-49.32N 002-25-13.44E 48-57-54.36N 002-26-44.27E +RWY LFPC 07/25 291 7871 164 49-14-56.40N 002-30-15.01E 49-15-29.16N 002-32-02.72E +RWY LFPG 08L/26R 392 13829 148 48-59-44.52N 002-33-09.86E 48-59-55.68N 002-36-36.65E +RWY LFPG 08R/26L 392 8858 197 48-59-34.44N 002-33-56.38E 48-59-41.64N 002-36-08.75E +RWY LFPG 09L/27R 392 8858 197 49-01-28.92N 002-31-29.60E 49-01-36.12N 002-33-42.08E +RWY LFPG 09R/27L 392 13780 148 49-01-14.16N 002-30-47.02E 49-01-25.32N 002-34-13.04E +RWY LFPK 09/27 470 4593 66 48-50-15.36N 003-00-22.57E 48-50-15.00N 003-01-31.19E +RWY LFPK 09L/27R 470 2132 164 48-50-19.32N 003-00-53.82E 48-50-18.96N 003-01-25.75E +RWY LFPK 09R/27L 470 2165 262 48-50-06.72N 003-00-04.10E 48-50-06.36N 003-00-36.58E +RWY LFPM 01/19 302 4265 98 48-36-21.96N 002-40-15.53E 48-37-03.00N 002-40-29.46E +RWY LFPM 10/28 302 6480 148 48-36-23.40N 002-39-47.84E 48-36-08.28N 002-41-21.44E +RWY LFPN 07L/25R 538 3609 98 48-45-04.32N 002-05-55.43E 48-45-15.84N 002-06-46.44E +RWY LFPN 07R/25L 538 3445 98 48-44-58.20N 002-05-59.06E 48-45-09.36N 002-06-47.45E +RWY LFPO 02/20 291 7874 197 48-43-03.00N 002-22-36.12E 48-44-16.80N 002-23-13.09E +RWY LFPO 06/24 291 11975 148 48-43-12.00N 002-19-00.91E 48-44-07.80N 002-21-38.45E +RWY LFPO 08/26 291 10892 148 48-43-09.84N 002-21-30.92E 48-43-38.64N 002-24-07.45E +RWY LFPT 05/23 325 5541 164 49-05-16.08N 002-01-38.64E 49-05-54.96N 002-02-37.14E +RWY LFPT 12/30 325 5413 164 49-06-06.84N 002-01-32.45E 49-05-41.64N 002-02-44.20E +RWY LFPV 09/27 584 5948 148 48-46-26.76N 002-11-21.41E 48-46-28.56N 002-12-50.15E +RWY LFQA 07/25 313 3773 98 49-12-24.12N 004-08-59.32E 49-12-39.24N 004-09-51.44E +RWY LFQB 05/23 388 2559 328 48-19-00.12N 004-00-27.22E 48-19-16.32N 004-00-58.03E +RWY LFQB 17/35 388 5413 98 48-19-46.20N 004-00-55.19E 48-18-52.92N 004-01-03.90E +RWY LFQB 17R/35L 388 2953 328 48-19-32.16N 004-00-44.96E 48-19-03.00N 004-00-49.75E +RWY LFQE 01/19 770 7874 148 49-12-59.04N 005-40-06.02E 49-14-14.64N 005-40-33.85E +RWY LFQF 18/36 997 3350 98 46-58-18.84N 004-15-38.05E 46-57-45.72N 004-15-37.66E +RWY LFQF 18L/36R 997 2087 164 46-58-17.40N 004-15-39.92E 46-57-56.88N 004-15-39.92E +RWY LFQG 12/30 602 5348 98 47-00-23.40N 003-06-15.30E 46-59-55.32N 003-07-20.71E +RWY LFQV 11/29 492 4921 98 49-47-11.40N 004-38-14.75E 49-46-53.04N 004-39-24.16E +RWY LFRB 07L/25R 325 2297 59 48-26-59.28N 004-25-20.71W 48-27-06.84N 004-24-48.28W +RWY LFRB 07R/25L 325 10171 148 48-26-36.24N 004-26-18.06W 48-27-08.28N 004-23-55.28W +RWY LFRC 10/28 459 8005 148 49-39-07.92N 001-29-12.70W 49-38-53.16N 001-27-13.18W +RWY LFRD 12/30 219 4708 148 48-35-25.80N 002-05-19.97W 48-35-06.00N 002-04-16.68W +RWY LFRD 17/35 219 7218 148 48-35-53.16N 002-04-57.65W 48-34-42.96N 002-04-39.22W +RWY LFRE 11/29 105 3117 82 47-17-24.36N 002-21-06.62W 47-17-15.36N 002-20-23.39W +RWY LFRF 07/25 45 3150 98 48-52-49.80N 001-34-17.36W 48-53-03.12N 001-33-34.74W +RWY LFRG 12/30 479 8366 148 49-22-13.80N 000-08-19.37E 49-21-36.36N 000-10-11.76E +RWY LFRH 02/20 160 5479 148 47-45-22.32N 003-26-30.52W 47-46-14.16N 003-26-08.20W +RWY LFRH 07/25 160 7884 148 47-45-22.68N 003-27-33.01W 47-45-46.80N 003-25-43.43W +RWY LFRI 10/28 299 5085 98 46-42-11.88N 001-23-18.82W 46-42-02.16N 001-22-07.28W +RWY LFRJ 08/26 348 8858 148 48-31-36.12N 004-10-09.01W 48-32-00.96N 004-08-03.01W +RWY LFRK 05/23 256 3871 98 49-10-15.24N 000-27-16.09W 49-10-39.00N 000-26-30.15W +RWY LFRK 13/31 256 6233 148 49-10-51.60N 000-27-59.10W 49-10-15.96N 000-26-42.61W +RWY LFRL 05/23 287 3635 131 48-16-42.96N 004-27-03.46W 48-17-05.64N 004-26-21.16W +RWY LFRL 13/31 287 2133 177 48-17-02.04N 004-26-46.57W 48-16-48.72N 004-26-21.62W +RWY LFRM 02/20 194 4658 98 47-56-30.84N 000-11-52.76E 47-57-13.68N 000-12-16.53E +RWY LFRN 10/28 124 6890 148 48-04-25.32N 001-44-45.96W 48-04-12.72N 001-43-06.20W +RWY LFRN 14/32 124 2788 98 48-04-11.64N 001-44-25.80W 48-03-50.04N 001-44-00.71W +RWY LFRO 11/29 290 5577 148 48-45-23.76N 003-28-57.76W 48-45-07.20N 003-27-38.77W +RWY LFRQ 04/22 297 2657 148 47-58-08.04N 004-10-24.92W 47-58-30.00N 004-10-04.04W +RWY LFRQ 10/28 297 7054 148 47-58-32.52N 004-11-07.22W 47-58-28.20N 004-09-23.76W +RWY LFRS 03/21 90 9514 148 47-08-29.76N 001-37-10.34W 47-09-53.28N 001-36-06.84W +RWY LFRT 06/24 453 7218 148 48-31-59.16N 002-52-02.57W 48-32-36.24N 002-50-30.62W +RWY LFRU 04/22 272 5305 118 48-35-51.72N 003-49-22.58W 48-36-31.68N 003-48-31.79W +RWY LFRV 04/22 446 5020 148 47-43-04.44N 002-43-29.86W 47-43-42.96N 002-42-43.49W +RWY LFRV 08/26 446 3363 197 47-43-26.40N 002-43-52.72W 47-43-30.72N 002-43-04.01W +RWY LFRZ 07/25 13 7874 148 47-18-32.76N 002-09-51.95W 47-18-55.08N 002-08-02.15W +RWY LFSD 02/20 726 5905 118 47-15-51.12N 005-04-55.38E 47-16-48.72N 005-05-18.46E +RWY LFSD 18/36 726 7874 148 47-16-35.76N 005-05-36.92E 47-15-18.36N 005-05-46.93E +RWY LFSI 11/29 458 7913 148 48-38-25.08N 004-53-03.70E 48-37-54.48N 004-54-52.09E +RWY LFSO 02/20 1106 7878 148 48-34-22.80N 005-56-56.72E 48-35-36.24N 005-57-35.82E +RWY LFTW 18/36 309 8005 148 43-46-06.24N 004-24-56.02E 43-44-47.04N 004-25-01.70E +RWY LFXA 01/19 823 6562 98 45-58-42.24N 005-19-36.41E 45-59-46.68N 005-19-48.40E +RWY LFXA 02/20 823 2625 328 45-58-35.40N 005-20-07.26E 45-59-00.60N 005-20-16.58E +NAV AGN VOR/DME 43-53-16.80N 000-52-22.30E 868 114.80 - +NAV ALD NDB 49-42-32.04N 002-11-58.92W 331 383 - +NAV ALM NDB 43-30-28.08N 005-21-37.69E 367 430 - +NAV AMB VOR/DME 47-25-44.05N 001-03-51.98E 361 113.70 - +NAV AMB NDB 47-25-05.53N 001-02-27.60E 354 341 - +NAV AMU TACAN 45-59-18.97N 005-19-52.50E 801 116.30 - +NAV ANG VOR 47-32-12.84N 000-51-06.60W 283 113.00 - +NAV ARE VOR 48-19-57.36N 003-36-08.89W 588 112.50 - +NAV ATN VOR/DME 46-48-21.24N 004-15-32.90E 2244 114.90 - +NAV AVD TACAN 47-03-29.17N 002-37-47.50E 554 110.60 - +NAV AVD NDB 47-07-14.52N 002-47-58.60E 679 289 - +NAV AVN VOR 43-59-43.44N 004-44-47.00E 0 112.30 - +NAV BD NDB 44-56-06.72N 000-33-44.10W 60 393 - +NAV BDX TACAN 44-49-37.93N 000-43-23.80W 155 114.40 - +NAV BE NDB 44-52-14.17N 000-23-52.10W 251 318 - +NAV BGC NDB 44-49-10.20N 000-37-09.40E 0 374 - +NAV BGP NDB 48-26-40.91N 004-24-59.40W 0 387 - +NAV BGS NDB 42-21-29.16N 003-38-07.37W 2945 357 - +NAV BLV VOR/DME 43-18-15.85N 002-56-09.17W 141 115.90 - +NAV BMC VOR/DME 44-49-36.84N 000-43-16.00W 161 113.75 - +NAV BRY VOR/DME 48-24-25.21N 003-17-41.21E 258 114.10 - +NAV BSN VOR/DME 49-11-17.88N 003-03-23.29E 476 114.85 - +NAV BST TACAN 48-17-04.56N 004-27-07.60W 286 114.70 - +NAV BST NDB 48-17-00.96N 004-25-55.99W 0 428 - +NAV BT VOR/DME 48-58-28.92N 002-27-18.61E 200 116.10 - +NAV BTZ VOR/DME 43-27-59.75N 001-30-37.01W 233 114.15 - +NAV BVS VOR 49-26-11.04N 002-09-11.48E 0 115.90 - +NAV BZ NDB 43-28-13.80N 001-24-13.28W 295 341 - +NAV CAA TACAN 44-31-52.32N 001-08-09.71W 74 110.80 - +NAV CAA NDB 44-33-04.68N 001-07-11.89W 0 382 - +NAV CAN VOR 49-10-18.12N 000-27-20.40W 256 115.40 - +NAV CAV VOR/DME 48-46-51.96N 004-08-48.98E 538 111.65 - +NAV CBY VOR/DME 45-52-54.84N 005-45-26.32E 4783 115.40 - +NAV CDN NDB 48-03-44.64N 001-21-49.10E 433 360 - +NAV CFA VOR/DME 45-47-14.99N 003-11-31.88E 1093 114.35 - +NAV CGC TACAN 45-39-41.40N 000-18-28.30W 93 116.20 - +NAV CGC NDB 45-40-09.48N 000-18-22.30W 113 354 - +NAV CGN VOR/DME 49-01-11.64N 002-30-00.40E 356 115.35 - +NAV CHW VOR/DME 48-28-48.00N 000-59-13.40E 702 115.20 - +NAV CLM VOR/DME 48-50-40.56N 003-00-49.90E 486 112.90 - +NAV CM NDB 43-54-29.87N 004-54-19.30E 124 369 - +NAV CNA VOR/DME 45-39-34.56N 000-18-41.90W 85 114.65 - +NAV CNE NDB 49-06-56.52N 000-19-16.50W 0 404 - +NAV CPE VOR/DME 49-25-58.08N 002-47-57.70E 288 109.65 - +NAV CRL VORTAC 49-15-19.08N 002-30-53.21E 325 109.20 - +NAV CSM NDB 44-05-13.56N 001-07-50.81E 0 327 - +NAV CTL VOR/DME 49-08-15.72N 003-34-39.68E 641 117.60 - +NAV CTX NDB 46-56-11.76N 001-48-04.10E 539 428 - +NAV DA NDB 44-03-59.04N 004-08-32.32E 681 402 - +NAV DGO VOR/DME 42-27-11.88N 002-52-50.56W 2126 112.60 - +NAV DIJ TACAN 47-16-18.84N 005-05-29.51E 726 113.50 - +NAV DIN VOR/DME 48-35-09.97N 002-04-56.39W 213 114.30 - +NAV DJL VOR/DME 47-16-14.89N 005-05-50.39E 726 111.45 - +NAV DPE VOR 49-55-31.44N 001-10-14.30E 362 115.80 - +NAV DVL VOR 49-18-38.52N 000-18-45.80E 497 110.20 - +NAV EAG NDB 42-27-04.69N 002-18-53.06W 0 399 - +NAV EPR VOR/DME 48-37-32.53N 001-39-23.62E 518 115.65 - +NAV EVX VORTAC 49-01-54.12N 001-13-15.10E 499 112.40 - +NAV FJR VOR/DME 43-34-42.24N 003-58-28.99E 17 114.45 - +NAV GAI VOR 43-57-14.77N 001-49-27.01E 972 115.80 - +NAV GL NDB 47-03-10.08N 001-41-16.19W 61 369 - +NAV GRB NDB 49-26-04.21N 002-38-22.24W 0 361 - +NAV GRN NDB 42-01-30.01N 002-48-25.96E 0 412 - +NAV GU NDB 48-28-39.72N 004-17-07.80W 0 338 - +NAV GUR VOR/DME 49-26-13.56N 002-36-07.42W 355 109.40 - +NAV GUY NDB 49-26-11.40N 002-36-06.41W 0 361 - +NAV HIG NDB 43-23-10.68N 001-47-45.20W 433 328 - +NAV HOL NDB 48-43-50.15N 001-49-13.80E 0 315 - +NAV ITR TACAN 43-31-33.96N 004-55-36.91E 82 115.70 - +NAV ITR NDB 43-31-34.32N 004-55-47.78E 82 391 - +NAV JSY VOR/DME 49-13-15.96N 002-02-46.00W 276 112.20 - +NAV LCA VOR 46-41-29.04N 002-08-58.49E 882 112.10 - +NAV LDV TACAN 48-31-41.88N 004-09-22.72W 364 115.15 - +NAV LGL VOR 48-47-26.16N 000-31-49.00E 971 115.00 - +NAV LM NDB 47-53-36.96N 000-10-17.00E 0 326 - +NAV LMG VOR/DME 45-48-57.24N 001-01-32.09E 1375 114.50 - +NAV LN NDB 48-43-09.48N 003-18-28.01W 297 345 - +NAV LNP VOR 45-29-23.28N 005-26-24.00E 0 113.45 - +NAV LOR TACAN 47-45-41.40N 003-26-28.21W 141 115.80 - +NAV LOR NDB 47-45-47.52N 003-26-26.48W 161 359 - +NAV LPA VOR/DME 42-27-37.80N 002-19-36.88W 1348 115.45 - +NAV LSE VOR/DME 45-44-43.80N 005-05-26.09E 821 114.75 - +NAV LTP VOR/DME 45-29-20.39N 005-26-20.62E 2165 115.55 - +NAV MAR NDB 43-29-23.28N 005-08-14.10E 0 383 - +NAV MBY VOR 46-32-28.69N 003-29-58.42E 0 109.60 - +NAV MC NDB 46-22-21.36N 002-29-33.61E 1049 335 - +NAV MDM TACAN 43-54-35.64N 000-30-15.80W 256 108.70 - +NAV MEN VOR/DME 44-36-29.88N 003-09-44.71E 4515 115.30 - +NAV MJ NDB 43-26-21.12N 005-13-03.00E 0 406 - +NAV ML DME 43-26-39.49N 005-12-07.81E 0 110.30 - +NAV MLN VOR/DME 48-27-20.88N 002-48-47.81E 335 113.60 - +NAV MLX NDB 48-38-48.13N 003-45-45.68W 0 371 - +NAV MM NDB 46-36-05.03N 004-19-53.00E 0 317 - +NAV MMD VOR 49-23-28.68N 005-07-27.91E 1076 109.40 - +NAV MOU VOR/DME 46-42-24.47N 003-37-54.01E 699 116.70 - +NAV MOU NDB 46-42-21.23N 003-37-51.10E 0 324 - +NAV MRM VOR/DME 43-22-38.28N 005-19-35.18E 771 108.80 - +NAV MS NDB 43-23-18.96N 005-17-00.49E 0 343 - +NAV MT NDB 47-20-01.68N 002-02-40.20W 67 398 - +NAV MTD VOR 49-33-09.36N 002-29-22.09E 0 113.65 - +NAV MTG VOR/DME 43-23-10.68N 005-05-12.59E 650 117.30 - +NAV MTL VOR/DME 44-33-17.64N 004-46-47.50E 656 113.65 - +NAV NAY TACAN 48-35-00.96N 005-57-06.59E 1115 116.80 - +NAV NB NDB 45-08-51.00N 000-32-59.70W 155 361 - +NAV NEA VOR/DME 42-01-39.36N 004-06-32.87W 3002 116.75 - +NAV NEV VOR 47-09-10.80N 002-55-45.70E 593 113.40 - +NAV NG NDB 43-51-25.92N 004-24-22.61E 0 354 - +NAV NIM TACAN 43-44-44.88N 004-25-10.42E 309 111.60 - +NAV NO NDB 42-45-00.00N 001-37-54.01W 0 386 - +NAV NTS VOR/DME 47-09-39.24N 001-36-46.69W 82 115.50 - +NAV OAN TACAN 47-59-21.84N 001-45-34.49E 402 116.40 - +NAV OAN NDB 48-00-04.68N 001-46-07.39E 0 385 - +NAV OB NDB 43-13-47.28N 005-39-55.51E 0 395 - +NAV OL VOR/DME 48-43-47.64N 002-23-11.11E 285 111.20 - +NAV ORG TACAN 44-08-21.48N 004-51-57.82E 197 109.40 - +NAV ORG NDB 44-08-54.24N 004-51-25.88E 197 328 - +NAV PAM NDB 42-42-51.12N 001-38-20.54W 0 422 - +NAV PAP VOR/DME 42-41-18.24N 001-39-38.81W 1890 113.55 - +NAV PAS VOR/DME 46-09-49.32N 005-59-59.71E 1418 116.60 - +NAV PGS VOR/DME 48-59-58.20N 002-37-25.72E 325 117.05 - +NAV PI NDB 46-42-14.04N 000-24-25.10E 316 363 - +NAV POI VOR 46-34-51.60N 000-17-53.50E 426 113.30 - +NAV PON VOR 49-05-45.96N 002-02-09.20E 318 111.60 - +NAV PPG VOR/DME 42-45-01.80N 002-52-01.70E 134 116.25 - +NAV PPN VOR/DME 42-44-01.32N 001-42-07.20W 3419 112.30 - +NAV PTV VOR 48-09-20.17N 002-15-53.21E 424 116.50 - +NAV QPR VOR/DME 47-57-26.27N 004-11-04.99W 285 117.80 - +NAV RBT VOR/DME 48-39-14.04N 001-59-39.19E 577 114.70 - +NAV REM VORTAC 49-18-41.76N 004-02-43.30E 335 112.30 - +NAV REN VOR/DME 48-04-09.11N 001-44-30.01W 126 109.25 - +NAV RLP VOR/DME 47-54-22.68N 005-14-57.01E 1490 117.30 - +NAV ROA VOR 46-03-33.12N 003-59-57.41E 1106 109.20 - +NAV ROU VOR 49-27-56.16N 001-16-50.30E 0 116.80 - +NAV RQ NDB 47-58-05.88N 003-59-54.38W 386 380 - +NAV RTN NDB 47-19-11.28N 001-41-16.91E 0 301 - +NAV SA NDB 43-26-06.00N 003-50-59.64W 0 416 - +NAV SAL TACAN 43-36-42.48N 005-06-10.12E 195 115.15 - +NAV SAL NDB 43-36-38.16N 005-06-04.00E 195 334 - +NAV SAU VOR 44-40-36.48N 000-09-10.50W 385 116.80 - +NAV SCL NDB 44-03-02.52N 005-30-12.49E 0 348 - +NAV SDI TACAN 48-38-13.20N 004-53-21.08E 492 114.00 - +NAV SDI NDB 48-37-44.41N 004-54-38.41E 0 373 - +NAV SEO NDB 42-13-55.92N 001-24-12.67E 0 340 - +NAV SFC VOR 45-03-59.41N 002-59-26.70E 3222 109.80 - +NAV SNR VOR/DME 43-26-59.27N 003-54-08.68W 164 115.30 - +NAV SR NDB 47-15-34.19N 000-06-51.70W 0 372 - +NAV SSN VOR/DME 43-18-40.32N 001-49-49.40W 804 117.90 - +NAV TA NDB 48-46-17.76N 002-05-50.78E 0 287 - +NAV TAN VOR 43-28-00.13N 000-01-06.30W 964 111.80 - +NAV TBO VOR 43-19-55.92N 000-08-44.70E 1020 113.90 - +NAV TH NDB 48-46-40.80N 002-22-43.39E 0 302 - +NAV TIS VOR/DME 45-52-54.49N 003-33-12.89E 2258 117.50 - +NAV TL NDB 43-17-18.24N 000-02-58.70E 928 321 - +NAV TLU TACAN 43-32-54.60N 001-22-05.59E 597 116.00 - +NAV TOE NDB 43-28-51.95N 001-40-47.60E 898 415 - +NAV TOU VOR/DME 43-40-50.89N 001-18-35.32E 555 117.70 - +NAV TRO VOR 48-15-04.33N 003-57-47.30E 859 116.00 - +NAV TS NDB 43-30-26.28N 001-29-12.41E 844 423 - +NAV TSU VOR 48-45-13.32N 002-06-08.50E 547 108.25 - +NAV TUR TACAN 47-25-19.92N 000-43-51.21E 329 113.80 - +NAV TUR NDB 47-33-57.24N 000-46-57.40E 551 331 - +NAV TW NDB 43-31-50.17N 001-01-31.01E 813 406 - +NAV VE NDB 44-50-56.40N 004-57-19.80E 0 320 - +NAV VFD VOR/DME 42-52-50.16N 002-43-27.66W 1696 112.90 - +NAV VIA VOR/DME 42-21-18.00N 003-36-48.89W 2970 111.40 - +NAV VMP VOR/DME 48-03-32.04N 001-23-20.00E 433 117.20 - +NAV VNE VOR 45-33-23.04N 004-53-00.31E 0 108.20 - +NAV VRA VOR/DME 42-43-54.84N 002-51-56.09W 1903 116.60 - +NAV VTA NDB 42-55-41.16N 002-40-46.60W 0 345 - +NAV YN NDB 46-41-20.75N 001-17-10.72W 302 334 - +# Paris, Charles De Gaulle (LFPG): +ILS 08L ILS GLE 108.70 48-59-56.47N 002-36-51.36E 48-59-41.31N 002-33-09.34E 387 5 85.3 3 +ILS 26R ILS GAU 109.10 48-59-43.72N 002-32-55.15E 48-59-58.89N 002-36-37.18E 397 5 265.3 3 +ILS 08R ILS/DME DSE 108.55 48-59-42.44N 002-36-23.46E 48-59-31.23N 002-33-55.86E 387 5 85.3 3 +ILS 26L ILS/DME DSU 108.35 48-59-33.64N 002-33-41.67E 48-59-44.85N 002-36-09.28E 397 5 265.3 3 +ILS 09L ILS/DME PNE 109.35 49-01-36.92N 002-33-56.80E 49-01-25.71N 002-31-29.08E 387 5 85.3 3 +ILS 27R ILS/DME PNW 110.35 49-01-28.12N 002-31-14.88E 49-01-39.33N 002-33-42.61E 397 5 265.3 3 +ILS 09R ILS/DME CGE 110.10 49-01-26.11N 002-34-27.76E 49-01-10.95N 002-30-46.50E 387 5 85.3 3 +ILS 27L ILS/DME PNW 110.35 49-01-13.36N 002-30-32.31E 49-01-28.53N 002-34-13.57E 397 5 265.3 3 +# Paris, Le Bourget (LFPB): +ILS 07 ILS/DME LBG 109.50 48-58-30.07N 002-27-43.36E 48-57-46.72N 002-25-11.45E 193 5 67.8 3 +ILS 25 ILS LBW 111.10 48-57-46.01N 002-24-59.39E 48-58-29.35N 002-27-31.30E 243 5 247.8 3 +ILS 27 ILS/DME RGE 110.55 48-57-48.50N 002-24-58.74E 48-57-57.57N 002-26-44.79E 224 5 265.2 3 +# Paris, Orly (LFPO): +ILS 02 ILS OLN 110.30 48-44-26.02N 002-23-17.71E 48-43-02.08N 002-22-32.57E 228 5 18.3 3 +ILS 06 ILS/DME ORE 108.50 48-44-12.38N 002-21-51.40E 48-43-09.19N 002-18-59.00E 260 5 61.9 3 +ILS 24 ILS/DME OLO 110.90 48-43-07.41N 002-18-47.97E 48-44-10.60N 002-21-40.36E 322 5 241.8 3 +ILS 08 LOCALIZER OLE 108.15 48-43-41.24N 002-24-21.59E 48-43-06.75N 002-21-29.74E 273 5 74.5 3 +ILS 26 ILS/DME OLW 111.75 48-43-07.24N 002-21-16.78E 48-43-41.73N 002-24-08.63E 309 5 254.4 3 diff -Nru acm-5.0/objects/zones/europe/germany.txt acm-6.0+20200416/objects/zones/europe/germany.txt --- acm-5.0/objects/zones/europe/germany.txt 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/objects/zones/europe/germany.txt 2020-04-16 12:05:39.000000000 +0000 @@ -0,0 +1,589 @@ +# Germany zone. +# Created: 2020-04-16 +# Latitude range: [47N, 55N[ +# Longitude range: [006E, 015E[ +# 2017-11-01 Source: http://ourairports.com + +GROUND_COLOR #305030 + +RWY EDAB 07/25 568 7218 164 51-11-26.52N 014-30-16.92E 51-11-47.04N 014-32-05.28E +RWY EDAB 07L/25R 568 3281 131 51-11-30.84N 014-30-21.24E 51-11-40.20N 014-31-10.56E +RWY EDAC 04/22 640 7333 148 50-58-27.84N 012-29-46.32E 50-59-21.48N 012-30-59.40E +RWY EDAD 09/27 187 3281 82 51-49-54.84N 012-10-36.48E 51-49-54.12N 012-11-28.68E +RWY EDAE 11/29 144 3839 75 52-11-58.20N 014-34-40.44E 52-11-42.72N 014-35-36.60E +RWY EDAH 10/28 93 7562 115 53-52-53.76N 014-08-04.20E 53-52-33.96N 014-10-05.88E +RWY EDAH 10R/28L 93 1969 98 53-52-46.56N 014-08-31.56E 53-52-41.16N 014-09-03.96E +RWY EDAK 12/30 417 7874 157 51-18-45.36N 013-32-22.92E 51-18-12.96N 013-34-12.72E +RWY EDAM 08/26 341 3740 98 51-21-43.92N 011-55-58.08E 51-21-49.68N 011-56-56.04E +RWY EDAQ 11/29 348 3675 98 51-33-14.76N 012-02-43.08E 51-32-59.64N 012-03-36.00E +RWY EDAU 09/27 322 2461 98 51-17-52.80N 013-20-31.20E 51-17-50.28N 013-21-09.36E +RWY EDAU 12/30 322 3281 66 51-17-42.72N 013-21-06.12E 51-17-25.44N 013-21-50.04E +RWY EDAV 10/28 121 8268 164 52-49-44.76N 013-40-30.36E 52-49-30.72N 013-42-42.84E +RWY EDAX 07/25 220 7808 164 53-18-12.96N 012-44-09.24E 53-18-33.12N 012-46-13.44E +RWY EDAY 05/23 262 3937 92 52-34-35.40N 013-54-32.40E 52-35-00.60N 013-55-20.64E +RWY EDAY 05R/23L 262 3937 131 52-34-33.24N 013-54-34.92E 52-34-58.80N 013-55-24.24E +RWY EDAZ 07/25 131 3937 75 52-12-07.20N 013-08-59.64E 52-12-16.56N 013-10-00.84E +RWY EDAZ 12/30 131 2297 98 52-12-29.88N 013-09-14.76E 52-12-18.00N 013-09-46.08E +RWY EDBH 09/27 23 3937 98 54-20-17.52N 012-42-03.24E 54-20-17.52N 012-43-09.48E +RWY EDBH 09L/27R 23 2953 131 54-20-22.56N 012-42-10.08E 54-20-22.92N 012-42-59.76E +RWY EDBJ 02/20 1247 3960 75 50-54-36.36N 011-42-41.40E 50-55-12.72N 011-43-03.00E +RWY EDBJ 08/26 1247 2000 100 50-54-51.84N 011-42-32.40E 50-54-56.52N 011-43-02.64E +RWY EDBK 14/32 131 3281 75 52-55-20.28N 012-25-14.16E 52-54-55.44N 012-25-48.00E +RWY EDBK 14R/32L 131 3281 98 52-55-19.20N 012-25-11.64E 52-54-54.00N 012-25-45.84E +RWY EDBM 09/27 259 3281 98 52-04-24.60N 011-37-09.12E 52-04-25.68N 011-38-01.68E +RWY EDBN 09/27 228 7522 148 53-36-07.20N 013-17-19.32E 53-36-08.64N 013-19-23.88E +RWY EDBR 18/36 518 8202 148 51-22-27.84N 014-56-59.28E 51-21-06.84N 014-57-00.72E +RWY EDBT 07/25 932 3937 98 51-22-36.48N 011-25-44.40E 51-22-49.80N 011-26-42.72E +RWY EDBW 08/26 262 4918 262 52-37-52.68N 013-45-52.20E 52-37-57.00N 013-47-11.76E +RWY EDCA 09/27 16 3281 66 53-49-59.52N 013-39-41.76E 53-49-55.92N 013-40-36.12E +RWY EDCA 09R/27L 16 2953 131 53-49-57.00N 013-39-46.44E 53-49-54.12N 013-40-35.76E +RWY EDCD 07/25 272 8149 148 51-53-07.80N 014-30-54.72E 51-53-36.60N 014-32-55.68E +RWY EDCD 07L/25R 272 6562 164 51-53-16.44N 014-31-10.92E 51-53-37.32N 014-32-49.92E +RWY EDCM 03/21 495 3609 92 51-17-35.16N 014-07-23.52E 51-18-04.32N 014-07-55.56E +RWY EDCM 03L/21R 495 3609 131 51-17-36.24N 014-07-20.28E 51-18-05.76N 014-07-52.32E +RWY EDCO 11/29 909 4757 98 51-16-11.64N 010-37-30.36E 51-15-55.80N 010-38-40.56E +RWY EDCP 13/31 7 7874 197 54-09-56.52N 013-45-36.72E 54-08-59.64N 013-47-06.72E +RWY EDCY 04/22 374 6562 98 51-34-17.76N 014-07-50.16E 51-35-09.96N 014-08-51.36E +RWY EDDB 07L/25R 157 8891 148 52-22-00.12N 013-28-51.24E 52-22-42.24N 013-31-48.72E +RWY EDDB 07R/25L 157 9843 148 52-20-43.44N 013-28-06.24E 52-21-30.24N 013-31-23.52E +RWY EDDC 04/22 755 8228 167 51-07-27.12N 013-45-19.44E 51-08-28.68N 013-46-44.04E +RWY EDDE 10/28 1036 8530 164 50-58-53.40N 010-56-23.28E 50-58-41.16N 010-58-35.04E +RWY EDDF 07C/25C 364 13123 197 50-01-57.36N 008-32-04.67E 50-02-42.36N 008-35-13.13E +RWY EDDF 07L/25R 364 9186 148 50-02-13.56N 008-29-49.49E 50-02-44.88N 008-32-01.39E +RWY EDDF 07R/25L 364 13123 148 50-01-39.00N 008-32-03.01E 50-02-24.36N 008-35-11.51E +RWY EDDF 18/36 364 13123 148 50-02-03.84N 008-31-33.35E 49-59-54.24N 008-31-33.89E +RWY EDDG 07/25 160 7119 148 52-07-53.40N 007-40-12.22E 52-08-16.44N 007-42-00.07E +RWY EDDH 05/23 53 10663 150 53-37-05.88N 009-57-49.36E 53-38-13.56N 010-00-06.48E +RWY EDDH 15/33 53 12028 150 53-39-15.84N 009-58-30.76E 53-37-30.36N 010-00-01.80E +RWY EDDK 06/24 302 8067 148 50-51-36.36N 007-07-25.61E 50-52-10.92N 007-09-18.97E +RWY EDDK 14L/32R 302 12516 197 50-52-49.80N 007-07-44.69E 50-51-18.72N 007-09-56.48E +RWY EDDK 14R/32L 302 6112 148 50-52-14.88N 007-07-15.10E 50-51-30.60N 007-08-19.46E +RWY EDDL 05L/23R 147 8858 148 51-17-01.32N 006-44-55.39E 51-17-54.24N 006-46-46.74E +RWY EDDL 05R/23L 147 9842 148 51-16-46.56N 006-45-07.16E 51-17-45.24N 006-47-10.39E +RWY EDDM 08L/26R 1487 13123 197 48-21-46.08N 011-46-03.36E 48-22-00.84N 011-49-16.32E +RWY EDDM 08R/26L 1487 13123 197 48-20-26.52N 011-45-03.60E 48-20-41.28N 011-48-16.56E +RWY EDDN 10/28 1046 8858 148 49-30-01.80N 011-03-33.12E 49-29-48.84N 011-05-45.60E +RWY EDDP 08L/26R 465 11811 148 51-25-52.32N 012-12-56.88E 51-26-00.96N 012-16-02.64E +RWY EDDP 08R/26L 465 11811 198 51-24-41.76N 012-12-19.80E 51-24-50.40N 012-15-19.44E +RWY EDDR 09/27 1058 6562 148 49-12-51.12N 007-05-48.05E 49-12-54.00N 007-07-25.39E +RWY EDDR 09L/27R 1058 1788 164 49-12-56.88N 007-06-43.99E 49-12-57.60N 007-07-10.92E +RWY EDDS 07/25 1276 10974 148 48-41-08.52N 009-12-00.47E 48-41-38.40N 009-14-37.68E +RWY EDDT 08L/26R 122 9918 151 52-33-27.36N 013-15-56.52E 52-33-43.20N 013-18-35.28E +RWY EDDT 08R/26L 122 7966 151 52-33-24.12N 013-16-30.00E 52-33-36.36N 013-18-37.08E +RWY EDDV 09C/27C 183 2559 74 52-27-53.28N 009-41-01.57E 52-27-52.20N 009-41-42.50E +RWY EDDV 09L/27R 183 12467 148 52-28-06.24N 009-38-53.84E 52-28-00.48N 009-42-14.90E +RWY EDDV 09R/27L 183 7677 148 52-27-18.00N 009-40-36.37E 52-27-14.40N 009-42-40.14E +RWY EDDW 05/23 14 2297 75 53-02-33.36N 008-47-03.26E 53-02-47.40N 008-47-32.64E +RWY EDDW 09/27 14 6693 148 53-02-47.76N 008-46-28.02E 53-02-50.28N 008-48-17.46E +RWY EDFE 08/26 384 4593 82 49-57-37.44N 008-37-54.37E 49-57-40.68N 008-39-04.43E +RWY EDFE 08R/26L 384 2198 98 49-57-31.32N 008-38-31.31E 49-57-32.76N 008-39-05.00E +RWY EDFH 03/21 1649 12467 148 49-55-53.04N 007-14-48.77E 49-57-36.72N 007-16-31.04E +RWY EDFM 09/27 308 3497 82 49-28-22.80N 008-30-21.71E 49-28-21.00N 008-31-14.52E +RWY EDFM 09L/27R 308 2297 98 49-28-23.52N 008-30-37.94E 49-28-22.80N 008-31-12.68E +RWY EDFQ 11/29 1158 4068 98 51-02-15.36N 008-40-21.90E 51-01-59.16N 008-41-20.29E +RWY EDFV 06/24 295 2625 66 49-36-17.64N 008-21-48.56E 49-36-30.24N 008-22-23.41E +RWY EDFV 06L/24R 295 3018 98 49-36-18.72N 008-21-42.34E 49-36-33.12N 008-22-22.44E +RWY EDFV 06R/24L 295 2625 66 49-36-17.64N 008-21-48.56E 49-36-30.24N 008-22-23.41E +RWY EDFZ 08/26 525 3281 72 49-58-03.72N 008-08-30.23E 49-58-12.36N 008-09-17.82E +RWY EDFZ 08R/26L 525 3281 262 49-57-59.76N 008-08-29.15E 49-58-06.96N 008-09-18.11E +RWY EDGE 10/28 1112 5643 180 50-59-39.12N 010-27-51.84E 50-59-24.72N 010-29-17.16E +RWY EDGS 04/22 1966 1640 98 50-42-11.52N 008-05-02.62E 50-42-24.12N 008-05-18.38E +RWY EDGS 13/31 1966 5315 98 50-42-46.08N 008-04-21.61E 50-42-13.68N 008-05-26.63E +RWY EDGS 13L/31R 1966 1969 98 50-42-44.64N 008-04-30.29E 50-42-32.04N 008-04-55.60E +RWY EDHI 05/23 23 8629 148 53-31-42.96N 009-49-17.36E 53-32-35.88N 009-51-09.58E +RWY EDHK 08/26 102 4134 98 54-22-43.32N 010-08-08.16E 54-22-49.08N 010-09-17.28E +RWY EDHK 08L/26R 102 1476 115 54-22-51.60N 010-08-26.88E 54-22-54.12N 010-08-51.00E +RWY EDHL 07/25 53 6896 197 53-48-07.20N 010-42-06.84E 53-48-28.44N 010-43-55.92E +RWY EDJA 06/24 2077 9780 98 47-58-59.88N 010-13-32.16E 47-59-39.48N 010-15-11.88E +RWY EDKV 06/24 1896 3510 98 50-24-12.24N 006-31-18.01E 50-24-30.24N 006-32-04.20E +RWY EDKZ 07/25 1549 3839 66 51-05-55.68N 007-35-42.61E 51-06-06.84N 007-36-38.70E +RWY EDLA 05/23 794 3018 66 51-28-51.96N 007-53-42.07E 51-29-11.04N 007-54-18.68E +RWY EDLE 07/25 424 5095 148 51-24-00.72N 006-55-45.98E 51-24-20.88N 006-56-59.53E +RWY EDLI 11/29 433 4121 66 51-58-00.48N 008-32-10.61E 51-57-46.08N 008-33-12.20E +RWY EDLN 13/31 125 3937 98 51-14-01.32N 006-29-52.04E 51-13-37.20N 006-30-40.36E +RWY EDLP 06/24 699 7152 148 51-36-32.04N 008-36-11.12E 51-37-09.84N 008-37-46.52E +RWY EDLS 11/29 157 3215 66 51-59-49.92N 006-50-00.92E 51-59-40.20N 006-50-49.88E +RWY EDLV 09/27 106 8005 148 51-36-10.08N 006-07-28.34E 51-36-07.56N 006-09-35.03E +RWY EDLW 06/24 425 6562 148 51-30-52.92N 007-36-06.84E 51-31-24.60N 007-37-37.16E +RWY EDMA 07/25 1516 5230 98 48-25-24.24N 010-55-24.60E 48-25-37.20N 010-56-23.64E +RWY EDMA 07L/25R 1516 3325 100 48-25-18.48N 010-55-49.08E 48-25-28.92N 010-56-35.88E +RWY EDMB 04/22 1903 3215 75 48-06-25.56N 009-45-27.86E 48-06-49.32N 009-45-58.82E +RWY EDME 09/27 1342 3806 75 48-23-44.52N 012-42-49.68E 48-23-46.68N 012-43-45.84E +RWY EDMN 15/33 1857 3770 66 48-06-48.60N 010-31-15.60E 48-06-15.12N 010-31-39.72E +RWY EDMO 04/22 1947 7500 147 48-04-26.40N 011-16-23.16E 48-05-21.12N 011-17-37.68E +RWY EDMS 09/27 1047 4429 98 48-54-05.76N 012-30-27.00E 48-54-00.36N 012-31-32.88E +RWY EDMV 12/30 991 3734 66 48-38-16.44N 013-11-20.76E 48-37-57.00N 013-12-07.92E +RWY EDNL 06/24 2100 3346 66 47-51-23.40N 010-00-32.40E 47-51-41.76N 010-01-12.72E +RWY EDNY 06/24 1367 7729 148 47-39-57.60N 009-29-52.40E 47-40-35.76N 009-31-30.32E +RWY EDON 08/26 39 7874 164 52-36-41.40N 014-13-30.36E 52-36-52.20N 014-15-36.72E +RWY EDOP 06/24 166 9843 180 53-25-16.68N 011-45-46.80E 53-25-57.72N 011-48-14.04E +RWY EDOV 08/26 184 6552 171 52-37-40.08N 011-48-19.44E 52-37-47.28N 011-50-04.92E +RWY EDOV 08L/26R 184 2297 131 52-37-43.32N 011-48-34.56E 52-37-46.20N 011-49-11.64E +RWY EDPA 09L/27R 1916 3116 82 48-46-40.08N 010-15-29.52E 48-46-40.44N 010-16-15.96E +RWY EDPA 09R/27L 1916 3117 98 48-46-37.92N 010-15-29.88E 48-46-39.00N 010-16-14.88E +RWY EDQA 03/21 811 4223 50 49-54-57.96N 010-54-33.84E 49-55-31.08N 010-55-12.00E +RWY EDQA 04/22 811 3773 50 49-55-00.12N 010-54-36.00E 49-55-30.00N 010-55-10.20E +RWY EDQC 12/30 1490 2822 70 50-15-51.84N 010-59-26.16E 50-15-37.80N 011-00-03.60E +RWY EDQD 06/24 1601 3550 98 49-58-57.00N 011-38-02.04E 49-59-14.64N 011-38-49.20E +RWY EDQE 08/26 1673 3190 49 49-47-36.24N 011-07-32.52E 49-47-37.32N 011-08-21.12E +RWY EDQE 08L/26R 1673 2317 85 49-47-39.48N 011-07-41.88E 49-47-40.56N 011-08-16.80E +RWY EDQH 26/08 1070 2285 62 49-35-00.60N 010-52-58.08E 49-34-55.20N 010-52-24.60E +RWY EDQK 09/27 1660 2340 160 50-08-04.92N 011-27-15.48E 50-08-07.08N 011-27-50.40E +RWY EDQL 04/22 853 2300 100 50-08-44.16N 011-02-34.80E 50-09-01.80N 011-03-02.88E +RWY EDQM 09/27 1959 4856 98 50-17-17.88N 011-50-37.32E 50-17-20.40N 011-51-51.84E +RWY EDQT 11/29 719 3609 66 50-01-12.00N 010-31-20.64E 50-00-57.96N 010-32-11.40E +RWY EDRB 05/23 1220 10026 148 49-56-13.56N 006-32-48.37E 49-57-10.44N 006-34-53.76E +RWY EDRK 06/24 640 3855 66 50-19-20.64N 007-31-14.99E 50-19-40.44N 007-32-05.60E +RWY EDRT 05/23 666 3937 98 49-51-34.56N 006-46-58.48E 49-52-01.56N 006-47-41.53E +RWY EDRY 16/34 312 5501 98 49-18-29.16N 008-26-56.51E 49-17-50.64N 008-27-12.10E +RWY EDRY 16R/34L 312 3281 98 49-18-27.72N 008-26-54.02E 49-17-56.40N 008-27-06.80E +RWY EDRZ 03/21 1132 9677 148 49-11-52.80N 007-23-25.91E 49-13-15.60N 007-24-38.81E +RWY EDSB 03/21 408 9787 148 48-46-04.08N 008-04-11.78E 48-47-26.52N 008-05-28.86E +RWY EDSN 09/27 2638 4094 98 47-58-36.84N 008-53-48.52E 47-58-36.48N 008-54-48.67E +RWY EDTB 04/22 404 2592 98 48-47-28.32N 008-11-09.71E 48-47-49.20N 008-11-31.96E +RWY EDTD 18/36 2231 4232 98 47-58-47.64N 008-31-19.06E 47-58-05.88N 008-31-20.68E +RWY EDTF 16/34 801 4068 98 48-01-40.44N 007-49-46.88E 48-01-02.64N 007-50-07.69E +RWY EDTG 05/23 696 5413 148 47-53-55.32N 007-36-32.40E 47-54-27.36N 007-37-36.01E +RWY EDTG 05R/23L 696 1969 98 47-54-01.80N 007-36-56.38E 47-54-14.04N 007-37-19.70E +RWY EDTL 03/21 511 9842 148 48-21-26.64N 007-49-05.27E 48-22-51.96N 007-50-14.35E +RWY EDTM 08/26 1818 5253 98 48-03-08.64N 009-21-44.32E 48-03-19.08N 009-23-00.10E +RWY EDTY 10/28 1299 5053 98 49-07-09.84N 009-46-23.56E 49-07-02.28N 009-47-38.62E +RWY EDTY 10L/28R 1299 2460 98 49-07-08.76N 009-46-54.23E 49-07-05.16N 009-47-31.06E +RWY EDUF 08/26 312 3937 98 51-32-49.20N 013-13-13.80E 51-32-56.04N 013-14-15.36E +RWY EDUS 09/27 384 3937 98 51-36-26.64N 013-43-45.48E 51-36-27.36N 013-44-48.12E +RWY EDUS 09R/27L 384 2904 131 51-36-24.48N 013-44-04.92E 51-36-24.84N 013-44-51.00E +RWY EDUW 17/35 26 7218 197 53-55-55.20N 013-12-57.96E 53-54-45.00N 013-13-17.04E +RWY EDVE 08/26 295 7546 148 52-19-06.24N 010-32-31.56E 52-19-10.92N 010-33-59.76E +RWY EDVE 08R/26L 295 2953 98 52-19-02.64N 010-32-54.60E 52-19-05.52N 010-33-42.12E +RWY EDVK 04/22 820 4921 98 51-24-08.28N 009-22-08.87E 51-24-45.00N 009-22-59.92E +RWY EDVK 04L/22R 820 2297 98 51-24-22.32N 009-22-15.49E 51-24-39.24N 009-22-39.76E +RWY EDVM 07/25 292 4003 75 52-10-41.52N 009-56-13.74E 52-10-53.40N 009-57-15.05E +RWY EDWE 07/25 3 4265 98 53-23-21.84N 007-13-02.21E 53-23-34.44N 007-14-09.38E +RWY EDWF 08/26 3 3937 66 53-16-14.16N 007-26-00.64E 53-16-21.36N 007-27-03.92E +RWY EDWI 02/20 16 4787 98 53-29-51.36N 008-02-56.08E 53-30-35.64N 008-03-23.15E +RWY EDWI 16/34 16 2018 49 53-30-27.00N 008-03-04.50E 53-30-08.28N 008-03-15.08E +RWY EDWR 05/23 3 2657 131 53-35-33.72N 006-42-13.64E 53-35-51.00N 006-42-46.66E +RWY EDWR 12/30 3 2854 131 53-35-43.08N 006-42-07.88E 53-35-28.32N 006-42-48.17E +RWY EDWR 13/31 3 3281 66 53-35-42.36N 006-42-35.86E 53-35-20.76N 006-43-16.54E +RWY EDWY 09/27 7 3281 66 53-42-23.40N 007-13-21.79E 53-42-25.92N 007-14-15.97E +RWY EDXF 04/22 131 2297 148 54-46-14.16N 009-22-19.96E 54-46-30.36N 009-22-45.55E +RWY EDXF 11/29 131 4003 98 54-46-22.08N 009-22-04.55E 54-46-09.84N 009-23-09.35E +RWY EDXF 11L/29R 131 3937 197 54-46-31.80N 009-22-15.13E 54-46-16.68N 009-23-17.05E +RWY EDXJ 03/21 62 4757 98 54-30-16.56N 009-07-55.09E 54-30-55.08N 009-08-40.60E +RWY EDXR 03/21 23 3150 98 54-13-02.64N 009-35-47.83E 54-13-28.20N 009-36-17.86E +RWY EDXR 12/30 23 1969 98 54-13-10.20N 009-35-53.70E 54-13-00.84N 009-36-22.79E +RWY EDXW 06/24 51 5564 148 54-54-33.84N 008-19-45.01E 54-55-01.56N 008-21-07.16E +RWY EDXW 14/32 51 6955 148 54-55-09.48N 008-19-58.37E 54-54-14.04N 008-21-07.52E +RWY EHDR 08/26 14 3117 102 53-07-04.80N 006-07-22.44E 53-07-13.08N 006-08-11.54E +RWY EHGG 01/19 17 4922 148 53-07-02.64N 006-34-36.70E 53-07-50.52N 006-34-48.97E +RWY EHGG 05/23 17 8202 148 53-06-54.00N 006-34-08.87E 53-07-30.00N 006-35-24.97E +RWY EHTW 05/23 114 9801 148 52-16-05.52N 006-52-16.43E 52-17-00.60N 006-54-25.60E +RWY EHTW 11/29 114 6558 82 52-16-17.76N 006-52-13.69E 52-15-54.36N 006-53-51.50E +RWY EKMB 10/28 16 3937 98 54-42-00.36N 011-25-45.12E 54-41-55.68N 011-26-51.72E +RWY EKPB 05/23 88 3524 98 54-52-00.84N 009-16-22.94E 54-52-25.32N 009-17-06.00E +RWY EKSB 14/32 24 5895 98 54-58-08.40N 009-47-05.60E 54-57-24.12N 009-48-11.38E +RWY ELLX 06/24 1234 13123 197 49-37-03.72N 006-11-14.86E 49-38-07.80N 006-14-08.02E +RWY EPSC 13/31 154 8202 197 53-35-31.56N 014-53-16.44E 53-34-38.64N 014-54-59.40E +RWY EPSD 09R/27L 3 2668 826 53-23-35.52N 014-37-38.28E 53-23-28.68N 014-38-20.76E +RWY ETAD 05/23 1197 10007 148 49-58-00.48N 006-41-00.82E 49-59-10.68N 006-42-48.46E +RWY ETAR 08/26 776 10498 148 49-25-57.36N 007-34-43.79E 49-26-11.04N 007-37-21.14E +RWY ETAR 09/27 776 9278 148 49-26-09.96N 007-34-51.31E 49-26-15.72N 007-37-10.92E +RWY ETHB 08/26 230 6010 148 52-16-35.76N 009-04-08.72E 52-16-48.72N 009-05-43.19E +RWY ETHC 08/26 129 6007 148 52-35-23.64N 010-00-31.68E 52-35-33.00N 010-02-07.80E +RWY ETHE 09/27 129 1673 98 52-17-26.88N 007-22-59.99E 52-17-28.68N 007-23-26.41E +RWY ETHF 12/30 1345 3413 98 51-07-00.48N 009-16-45.91E 51-06-43.92N 009-17-33.00E +RWY ETHL 03/21 1766 1968 164 48-13-16.32N 009-54-13.97E 48-13-32.88N 009-54-30.10E +RWY ETHL 09/27 1766 5400 98 48-13-14.52N 009-53-56.26E 48-13-11.64N 009-55-15.89E +RWY ETHM 08/26 597 5342 117 50-21-51.12N 007-18-15.59E 50-22-04.08N 007-19-35.00E +RWY ETHN 07/25 1339 3320 98 49-23-26.52N 009-57-05.40E 49-23-34.80N 009-57-53.39E +RWY ETHR 09/27 1268 1755 98 49-13-01.92N 011-05-46.68E 49-13-03.72N 011-06-13.68E +RWY ETHS 06/24 245 1312 148 52-54-44.28N 010-11-29.04E 52-54-50.40N 010-11-49.92E +RWY ETHS 09/27 245 8005 95 52-55-10.20N 010-09-56.52E 52-55-09.12N 010-12-07.20E +RWY ETHS 09L/27R 245 3281 164 52-55-11.28N 010-10-42.96E 52-55-12.36N 010-11-37.68E +RWY ETIC 14/32 1363 3300 73 49-42-08.28N 011-56-09.60E 49-41-42.36N 011-56-39.48E +RWY ETIH 09/27 1455 2187 72 49-13-05.16N 011-49-54.12E 49-13-05.16N 011-50-26.16E +RWY ETIN 07/25 689 2625 100 49-44-29.40N 010-11-43.80E 49-44-40.56N 010-12-20.16E +RWY ETMN 08/26 74 8002 148 53-45-55.44N 008-38-25.40E 53-46-11.64N 008-40-35.80E +RWY ETND 08/26 128 4209 148 52-35-06.00N 008-19-54.73E 52-35-09.60N 008-21-00.58E +RWY ETNG 09/27 296 10009 147 50-57-39.60N 006-01-12.14E 50-57-38.52N 006-03-48.46E +RWY ETNH 08/26 39 8005 98 54-18-36.72N 009-31-11.06E 54-18-51.12N 009-33-23.72E +RWY ETNJ 10/28 24 8136 98 53-32-08.88N 007-52-13.19E 53-31-52.68N 007-54-25.20E +RWY ETNL 10/28 138 8202 148 53-55-10.92N 012-15-37.08E 53-54-59.40N 012-17-53.52E +RWY ETNN 07/25 386 8003 148 50-49-36.48N 006-38-31.99E 50-50-07.80N 006-40-26.40E +RWY ETNS 05/23 70 8003 98 54-27-07.20N 009-30-09.00E 54-28-00.12N 009-31-49.19E +RWY ETNS 07/25 70 6554 148 54-27-19.08N 009-30-09.00E 54-27-37.80N 009-31-55.20E +RWY ETNT 08/26 26 8005 98 53-32-44.52N 007-38-57.59E 53-33-00.72N 007-41-07.19E +RWY ETNW 03/21 187 5573 156 52-26-42.00N 009-25-37.20E 52-27-31.32N 009-26-17.99E +RWY ETNW 08/26 187 6157 153 52-27-22.32N 009-24-48.60E 52-27-30.60N 009-26-26.99E +RWY ETNW 08R/26L 187 3569 132 52-27-17.28N 009-24-58.79E 52-27-22.68N 009-25-55.81E +RWY ETOI 10/28 1353 3500 80 49-38-03.84N 011-45-37.08E 49-37-57.00N 011-46-27.84E +RWY ETOR 05/23 309 3004 75 49-33-39.24N 008-27-30.92E 49-33-58.32N 008-28-05.52E +RWY ETOU 07/25 461 7065 120 50-02-49.56N 008-18-39.71E 50-03-09.36N 008-20-23.42E +RWY ETSA 07/25 2044 6777 98 48-04-03.72N 010-53-34.08E 48-04-23.88N 010-55-09.12E +RWY ETSB 03/21 1568 8225 148 50-09-50.40N 007-03-16.96E 50-11-00.96N 007-04-18.95E +RWY ETSF 09/27 1703 9003 151 48-12-22.32N 011-14-55.68E 48-12-18.00N 011-17-07.80E +RWY ETSH 09/27 265 7936 98 51-46-06.60N 013-09-00.72E 51-46-01.92N 013-11-06.72E +RWY ETSI 07L/25R 1202 8002 98 48-43-00.12N 011-30-55.80E 48-43-29.64N 011-32-46.32E +RWY ETSI 07R/25L 1202 9646 197 48-42-16.20N 011-31-07.32E 48-42-51.48N 011-33-20.88E +RWY ETSL 03/21 1822 8012 98 48-10-33.24N 010-51-11.52E 48-11-42.36N 010-52-08.76E +RWY ETSN 09/27 1249 8005 98 48-42-40.32N 011-11-42.00E 48-42-38.88N 011-13-41.52E +RWY LFGA 01/19 628 5282 98 48-06-09.36N 007-21-24.80E 48-07-00.12N 007-21-39.67E +RWY LFGB 02/20 788 3281 66 47-44-13.92N 007-25-46.88E 47-44-43.80N 007-26-05.03E +RWY LFJL 04/22 870 8202 148 48-58-24.24N 006-14-25.94E 48-59-26.88N 006-15-43.56E +RWY LFQC 09/27 790 3410 66 48-35-36.24N 006-32-11.08E 48-35-35.16N 006-33-01.80E +RWY LFQM 05/23 1271 4593 66 47-12-10.08N 006-04-34.54E 47-12-37.08N 006-05-27.96E +RWY LFQP 06/24 1017 7205 148 48-45-39.24N 007-11-16.76E 48-46-17.40N 007-12-47.23E +RWY LFQW 08/26 1249 4731 66 47-38-15.72N 006-11-41.10E 47-38-22.20N 006-12-49.57E +RWY LFSB 08/26 885 5969 197 47-35-16.80N 007-31-00.91E 47-35-30.12N 007-32-27.85E +RWY LFSB 15/33 885 12795 197 47-37-03.72N 007-30-35.53E 47-35-09.24N 007-31-55.06E +RWY LFSG 08/26 1084 8858 147 48-19-26.76N 006-03-06.55E 48-19-34.32N 006-05-17.16E +RWY LFSH 03/21 491 3264 59 48-47-25.44N 007-48-51.55E 48-47-53.88N 007-49-15.02E +RWY LFSH 03L/21R 491 3159 262 48-47-27.60N 007-48-47.38E 48-47-54.96N 007-49-10.24E +RWY LFSM 08/26 1041 5578 66 47-29-08.16N 006-46-46.06E 47-29-18.24N 006-48-05.80E +RWY LFSN 03/21 751 4593 131 48-41-11.76N 006-13-33.13E 48-41-51.36N 006-14-06.14E +RWY LFST 05/23 505 7874 148 48-31-52.32N 007-36-57.71E 48-32-43.44N 007-38-25.58E +RWY LFSX 04/22 913 7596 118 47-46-37.92N 006-21-25.78E 47-47-37.32N 006-22-34.39E +RWY LFSX 11/29 913 7982 148 47-47-29.76N 006-20-04.34E 47-46-58.80N 006-21-51.88E +RWY LKCS 09/27 1417 8202 262 48-56-47.04N 014-24-37.44E 48-56-47.04N 014-26-40.20E +RWY LKHV 06/24 1214 6575 100 49-50-39.84N 013-52-50.88E 49-51-06.48N 013-54-22.32E +RWY LKKB 06/24 939 6562 148 50-07-01.92N 014-31-52.68E 50-07-31.80N 014-33-21.60E +RWY LKKV 11/29 1989 7054 98 50-12-24.48N 012-54-03.96E 50-11-57.12N 012-55-43.68E +RWY LKLN 06/24 1188 4757 197 49-40-18.48N 013-15-57.60E 49-40-42.96N 013-16-59.52E +RWY LKPC 09/27 1207 8218 95 50-18-19.44N 013-55-00.48E 50-18-25.20N 013-57-06.12E +RWY LKPM 06L/24R 1529 4700 125 49-42-56.16N 014-05-21.12E 49-43-22.44N 014-06-20.52E +RWY LKPM 06R/24L 1529 8202 98 49-42-49.32N 014-05-10.32E 49-43-35.04N 014-06-53.64E +RWY LKPR 04/22 1247 6955 197 50-05-15.72N 014-16-00.12E 50-06-10.44N 014-17-03.84E +RWY LKPR 06/24 1247 12189 148 50-06-06.48N 014-13-34.68E 50-06-57.60N 014-16-24.24E +RWY LKPR 12/30 1247 10663 148 50-06-28.80N 014-14-43.44E 50-05-25.80N 014-16-54.12E +RWY LKVO 10/28 919 8203 148 50-13-10.92N 014-22-44.40E 50-12-48.60N 014-24-45.36E +RWY LOGI 11/29 2283 2575 59 47-29-41.28N 014-29-29.04E 47-29-30.84N 014-30-02.52E +RWY LOGO 04/22 2142 2395 98 47-28-34.32N 014-00-16.92E 47-28-53.40N 014-00-37.08E +RWY LOIH 05/23 1352 2067 59 47-22-57.36N 009-41-49.60E 47-23-11.76N 009-42-10.69E +RWY LOIJ 13/31 2198 2461 59 47-31-21.36N 012-26-45.60E 47-31-05.16N 012-27-11.16E +RWY LOLG 04/22 827 1575 82 48-06-05.76N 014-56-56.76E 48-06-17.28N 014-57-11.52E +RWY LOLK 12/30 1378 2437 59 48-12-49.68N 013-20-30.48E 48-12-41.40N 013-20-55.68E +RWY LOLS 14/32 1070 2625 75 48-24-19.80N 013-26-42.36E 48-24-01.08N 013-27-07.92E +RWY LOLU 08/26 1670 1804 59 47-57-03.24N 013-51-50.40E 47-57-07.56N 013-52-16.68E +RWY LOLW 09/27 1043 4560 98 48-10-59.16N 014-01-53.40E 48-11-00.24N 014-03-00.72E +RWY LOLW 09L/27R 1043 3051 164 48-10-54.84N 014-02-02.40E 48-10-55.20N 014-02-47.04E +RWY LOLW 09R/27L 1043 2952 148 48-10-49.80N 014-02-04.92E 48-10-50.16N 014-02-46.68E +RWY LOWI 08/26 1907 6562 148 47-15-31.68N 011-19-51.24E 47-15-41.76N 011-21-25.20E +RWY LOWL 08/26 980 9843 197 48-13-57.00N 014-10-02.64E 48-14-02.04N 014-12-27.72E +RWY LOWL 08L/26R 980 2165 148 48-14-07.08N 014-11-01.68E 48-14-08.16N 014-11-33.36E +RWY LOWS 15/33 1411 9022 148 47-48-16.92N 012-59-49.92E 47-46-54.84N 013-00-41.40E +RWY LOWZ 08/26 2470 2165 59 47-17-26.88N 012-47-09.24E 47-17-32.28N 012-47-39.48E +RWY LOXZ 08L/26R 2264 4625 131 47-12-13.68N 014-44-25.08E 47-12-19.44N 014-45-16.92E +RWY LOXZ 08R/26L 2264 9022 197 47-12-02.52N 014-43-35.40E 47-12-17.28N 014-45-43.20E +RWY LSGC 06/24 3368 3707 89 47-04-51.60N 006-47-13.27E 47-05-12.84N 006-47-56.72E +RWY LSMD 11/29 1470 7726 130 47-24-05.76N 008-38-01.39E 47-23-43.08N 008-39-45.79E +RWY LSMD 11R/29L 1470 2130 98 47-24-01.80N 008-38-17.38E 47-23-55.32N 008-38-46.79E +RWY LSME 04/22 1400 8208 130 47-05-00.60N 008-17-42.25E 47-06-04.68N 008-18-54.61E +RWY LSMF 01/19 1485 4920 130 47-04-15.24N 009-03-43.81E 47-05-04.20N 009-04-00.41E +RWY LSZG 06/24 1411 3281 75 47-10-47.28N 007-24-40.25E 47-11-00.60N 007-25-23.52E +RWY LSZG 06L/24R 1411 1640 98 47-10-50.16N 007-24-40.61E 47-10-56.64N 007-25-02.32E +RWY LSZG 06R/24L 1411 2297 66 47-10-46.92N 007-24-40.10E 47-10-54.84N 007-25-11.35E +RWY LSZH 10/28 1416 8202 197 47-27-32.04N 008-32-14.89E 47-27-23.76N 008-34-13.62E +RWY LSZH 14/32 1416 10827 197 47-28-59.16N 008-32-05.03E 47-27-40.68N 008-33-52.06E +RWY LSZH 16/34 1416 12139 197 47-28-32.16N 008-32-09.42E 47-26-43.44N 008-33-24.23E +RWY LSZR 10L/28R 1306 1969 75 47-29-11.76N 009-33-22.61E 47-29-09.24N 009-33-51.01E +RWY LSZR 10R/28L 1306 4922 98 47-29-09.96N 009-33-01.01E 47-29-02.76N 009-34-11.86E +NAV ABU NDB 50-59-37.68N 012-31-15.60E 581 330 - +NAV AGB NDB 48-25-27.48N 010-55-59.16E 1542 318 - +NAV AGD DME 50-58-57.72N 012-30-44.28E 624 115.30 - +NAV ALB VOR/DME 49-12-51.84N 011-13-17.04E 1434 111.20 - +NAV ALF DME 53-38-07.08N 009-59-38.90E 66 115.80 - +NAV ALS VOR 54-54-19.44N 009-59-36.17E 0 114.70 - +NAV ANS NDB 49-18-34.92N 010-37-58.08E 1526 452 - +NAV AUG DME 48-25-27.48N 010-55-58.80E 1542 115.90 - +NAV BA NDB 51-11-55.68N 014-32-52.08E 0 359 - +NAV BAM VORTAC 51-19-40.08N 007-10-37.13E 879 113.60 - +NAV BAY VOR 49-59-06.72N 011-38-12.12E 1625 110.60 - +NAV BAY DME 49-59-08.52N 011-38-17.16E 1620 110.60 - +NAV BAZ NDB 49-57-24.85N 011-33-54.72E 0 420 - +NAV BET NDB 52-17-16.08N 007-23-08.41E 219 402 - +NAV BHD DME 54-20-25.44N 012-42-35.28E 45 115.40 - +NAV BKD VOR/DME 53-02-04.20N 011-32-46.32E 92 117.70 - +NAV BLM VOR/DME 47-37-58.08N 007-29-58.20E 886 117.45 - +NAV BMN VOR/DME 53-02-38.40N 008-46-55.70E 40 117.45 - +NAV BN NDB 47-39-42.12N 007-28-44.69E 0 353 - +NAV BOT NDB 51-35-08.88N 007-01-22.84E 0 407 - +NAV BRU NDB 52-19-19.92N 010-36-22.32E 0 427 - +NAV BTH NDB 54-20-18.25N 012-41-09.96E 45 373 - +NAV BUE TACAN 50-10-43.32N 007-04-10.20E 1618 117.10 - +NAV BYC NDB 52-17-28.32N 009-05-27.60E 292 368 - +NAV CDD DME 51-53-13.20N 014-31-55.20E 292 112.05 - +NAV CEL NDB 52-35-22.92N 010-01-46.20E 173 311 - +NAV CHA VOR 49-55-15.96N 009-02-23.32E 532 115.50 - +NAV CLR TACAN 47-55-45.47N 007-23-59.89E 693 110.00 - +NAV COL VORTAC 50-47-00.60N 007-35-39.08E 990 108.80 - +NAV DBR NDB 52-28-05.88N 013-17-43.08E 0 347 - +NAV DHE VOR/DME 54-11-08.52N 007-54-38.52E 44 116.30 - +NAV DIK VOR/DME 49-51-41.04N 006-07-46.99E 1109 114.40 - +NAV DIK NDB 49-51-41.04N 006-07-46.99E 0 307 - +NAV DIP NDB 52-28-22.44N 013-28-05.88E 0 327 - +NAV DKB VORTAC 49-08-34.08N 010-14-17.88E 1790 117.80 - +NAV DLE VOR/DME 52-15-01.08N 009-53-00.60E 398 115.20 - +NAV DLS NDB 52-36-50.04N 013-21-48.96E 0 414 - +NAV DMN DME 48-22-00.85N 011-47-38.40E 1463 116.00 - +NAV DMS DME 48-20-26.51N 011-46-41.52E 1495 108.60 - +NAV DND DME 51-07-46.20N 013-45-27.36E 778 115.40 - +NAV DOM VOR/DME 51-42-34.20N 007-35-13.67E 298 112.70 - +NAV DON DME 47-57-38.52N 008-31-21.18E 2212 110.55 - +NAV DOR VOR/DME 51-31-31.08N 007-37-51.82E 373 108.65 - +NAV DP NDB 52-35-30.13N 008-27-12.31E 191 325 - +NAV DRN VOR/DME 51-00-55.80N 013-35-56.04E 1086 114.35 - +NAV DRW NDB 51-53-48.13N 014-33-45.00E 271 355 - +NAV DUS VOR/DME 51-16-59.52N 006-45-13.43E 151 115.15 - +NAV DVI NDB 47-57-38.52N 008-31-21.76E 0 490 - +NAV DWI NDB 51-31-33.96N 007-38-03.80E 400 357 - +NAV EEL VOR/DME 53-09-50.03N 006-40-00.05E 32 112.40 - +NAV EFD DME 50-58-57.36N 010-57-27.72E 1076 112.05 - +NAV EGG NDB 48-23-49.20N 012-44-59.28E 1329 393 - +NAV EH NDB 49-57-36.35N 008-38-33.47E 0 386 - +NAV ELU NDB 49-40-46.92N 006-21-19.01E 0 369 - +NAV EMD NDB 53-23-38.05N 007-14-30.08E 0 345 - +NAV END DME 48-23-39.85N 012-43-31.44E 1381 115.40 - +NAV ENW DME 53-23-20.76N 007-13-44.90E 50 115.25 - +NAV EPL VOR 48-19-04.08N 006-03-33.91E 1154 113.00 - +NAV ERD TACAN 48-19-29.27N 011-57-10.08E 1545 113.60 - +NAV ERF VOR/DME 50-57-03.24N 011-14-12.12E 1325 113.85 - +NAV ERL VOR/DME 49-39-19.44N 011-09-02.88E 1841 114.90 - +NAV ERT NDB 50-58-57.36N 010-55-22.80E 1036 425 - +NAV EUR VOR/DME 47-44-06.00N 011-14-57.84E 2279 115.20 - +NAV FFM VORTAC 50-03-13.32N 008-38-13.52E 491 114.20 - +NAV FHA NDB 47-40-52.31N 009-32-16.01E 1366 473 - +NAV FHD DME 47-39-59.04N 009-30-31.89E 1400 112.60 - +NAV FLD VOR/DME 53-45-45.72N 013-33-47.16E 43 117.15 - +NAV FR NDB 50-03-56.52N 008-41-00.56E 0 297 - +NAV FRD DME 50-01-49.79N 008-34-01.38E 441 115.90 - +NAV FRE VOR/DME 48-25-54.48N 014-07-47.28E 2014 113.50 - +NAV FSB NDB 52-54-56.87N 010-11-17.16E 329 284 - +NAV FTZ NDB 51-05-03.48N 009-24-54.87E 1096 468 - +NAV FU NDB 53-34-31.80N 009-52-32.91E 0 351 - +NAV FUL VOR/DME 50-35-33.00N 009-34-19.81E 1138 112.10 - +NAV FW NDB 50-00-18.00N 008-25-46.38E 0 382 - +NAV FWE VOR/DME 52-24-40.68N 014-07-50.16E 238 113.30 - +NAV GBL TACAN 49-38-36.60N 009-57-00.61E 1022 111.00 - +NAV GBL NDB 49-38-53.17N 009-58-50.48E 1020 429 - +NAV GED VORTAC 50-24-42.84N 009-14-56.98E 1601 110.80 - +NAV GIN NDB 50-38-08.16N 008-49-09.55E 0 314 - +NAV GIX TACAN 50-57-47.88N 006-02-42.72E 327 108.10 - +NAV GL NDB 52-34-20.28N 013-25-34.32E 0 321 - +NAV GMH VOR/DME 51-10-13.81N 007-53-31.34E 1821 115.40 - +NAV GOT VOR/DME 51-20-35.17N 011-35-51.00E 721 115.25 - +NAV GRE VOR/DME 47-10-59.52N 007-25-05.45E 1435 115.45 - +NAV GRE NDB 47-11-00.24N 007-24-52.56E 1411 326 - +NAV GRF TACAN 49-41-28.68N 011-56-17.88E 1385 111.80 - +NAV GRW NDB 49-41-40.56N 011-56-30.12E 1542 405 - +NAV GT NDB 53-42-51.12N 009-55-27.48E 0 323 - +NAV GTQ VOR/DME 48-59-11.04N 006-42-58.39E 1024 111.25 - +NAV HA NDB 52-27-50.76N 009-48-18.29E 0 320 - +NAV HAB NDB 50-05-35.17N 009-46-53.54E 0 403 - +NAV HAD DME 52-28-07.68N 009-41-41.32E 184 113.95 - +NAV HAE NDB 52-27-27.36N 009-34-02.35E 0 332 - +NAV HAM VORTAC 53-41-08.16N 010-12-18.00E 187 113.10 - +NAV HAN NDB 49-57-53.64N 007-16-51.17E 1649 376 - +NAV HBD DME 52-27-19.08N 009-39-33.73E 171 116.90 - +NAV HC NDB 53-52-26.76N 014-10-55.56E 93 330 - +NAV HDL NDB 49-23-09.61N 008-35-48.34E 345 417 - +NAV HDM VOR 49-33-56.16N 008-27-49.72E 327 109.00 - +NAV HDM NDB 49-32-04.20N 008-23-25.80E 320 334 - +NAV HDO VOR/DME 50-55-41.52N 014-22-07.68E 1439 115.00 - +NAV HFX NDB 49-13-05.88N 011-51-33.84E 1579 286 - +NAV HLZ VOR/DME 52-21-48.24N 010-47-42.72E 413 117.30 - +NAV HMM VOR/DME 51-51-24.84N 007-42-29.84E 237 115.65 - +NAV HN NDB 54-19-34.69N 009-40-13.19E 105 344 - +NAV HND DME 49-56-44.15N 007-16-03.61E 1716 116.95 - +NAV HNT TACAN 54-18-38.88N 009-32-19.21E 78 115.30 - +NAV HNU NDB 50-09-44.99N 009-09-15.01E 397 432 - +NAV HOC VOR/DME 47-27-59.75N 007-39-55.58E 2425 113.20 - +NAV HOD DME 50-17-23.28N 011-51-18.72E 1946 110.70 - +NAV HOF NDB 50-17-04.56N 011-45-41.04E 0 484 - +NAV HOS NDB 53-40-37.19N 010-04-59.52E 0 339 - +NAV HOZ TACAN 51-46-00.12N 013-11-56.40E 261 117.25 - +NAV HOZ NDB 51-46-11.27N 013-05-51.00E 316 406 - +NAV HR NDB 47-33-42.12N 006-43-56.10E 0 289 - +NAV HW NDB 52-28-06.59N 009-32-47.18E 0 358 - +NAV IGL TACAN 48-43-04.08N 011-34-11.28E 1233 111.40 - +NAV IGL NDB 48-44-16.08N 011-38-40.92E 0 345 - +NAV ILM NDB 49-28-18.84N 010-23-16.44E 1112 488 - +NAV INN NDB 47-13-48.00N 011-24-06.84E 2969 420 - +NAV KBA NDB 48-47-52.80N 008-05-51.18E 408 431 - +NAV KBD DME 48-46-48.72N 008-05-18.56E 495 115.80 - +NAV KBO VOR/DME 50-51-42.11N 007-08-43.87E 311 112.15 - +NAV KD NDB 50-09-09.36N 014-38-11.76E 0 300 - +NAV KHD DME 54-22-43.68N 010-08-43.44E 119 109.50 - +NAV KIL NDB 54-22-39.37N 010-07-12.00E 0 353 - +NAV KIR VORTAC 49-51-00.72N 007-22-10.49E 1453 117.50 - +NAV KLF VOR/DME 52-01-09.85N 013-33-48.24E 233 115.15 - +NAV KLO VOR/DME 47-27-25.56N 008-32-44.09E 1410 114.85 - +NAV KNG NDB 49-45-43.92N 009-05-30.01E 0 355 - +NAV KPT VOR/DME 47-44-44.88N 010-20-58.92E 2529 109.60 - +NAV KRH VOR/DME 48-59-34.44N 008-35-03.26E 908 115.95 - +NAV KSL NDB 51-27-53.29N 009-27-26.64E 886 349 - +NAV KTG VOR 49-44-45.24N 010-12-48.96E 697 111.40 - +NAV KTI NDB 47-12-55.80N 011-01-40.08E 6726 413 - +NAV KVY VOR/DME 50-12-04.31N 012-55-33.24E 2167 111.55 - +NAV LAB TACAN 48-03-55.08N 010-52-50.88E 2102 112.15 - +NAV LAG TACAN 53-55-11.28N 012-17-10.68E 190 108.25 - +NAV LAU NDB 51-12-15.48N 009-41-27.57E 0 341 - +NAV LBE VOR/DME 53-39-15.13N 009-35-42.22E 50 115.10 - +NAV LBU VOR/DME 48-54-46.79N 009-20-24.83E 1064 109.20 - +NAV LCH TACAN 48-11-25.79N 010-51-32.40E 1838 108.80 - +NAV LED DME 51-24-40.68N 012-13-25.68E 502 112.15 - +NAV LEG VOR/DME 51-26-09.60N 012-28-23.52E 486 115.85 - +NAV LHR NDB 48-20-55.33N 007-48-40.18E 0 337 - +NAV LI NDB 51-20-49.20N 006-53-28.61E 0 417 - +NAV LJ NDB 50-55-37.56N 007-03-44.24E 0 365 - +NAV LMA NDB 51-22-14.88N 006-23-42.00E 0 311 - +NAV LND DME 51-26-03.48N 012-13-32.52E 415 113.50 - +NAV LNZ VOR/DME 48-13-46.91N 014-06-11.52E 1145 116.60 - +NAV LNZ NDB 48-14-13.56N 014-19-18.48E 0 327 - +NAV LPS NDB 47-05-01.31N 006-47-38.00E 0 403 - +NAV LQ NDB 48-05-41.28N 011-01-07.68E 2062 448 - +NAV LRD DME 48-21-50.77N 007-49-39.07E 556 108.05 - +NAV LUB VOR 53-56-26.52N 010-40-04.08E 264 110.60 - +NAV LUD DME 53-48-23.04N 010-43-06.96E 70 115.65 - +NAV LUL VOR 47-41-17.88N 006-17-44.09E 0 117.10 - +NAV LUP NDB 48-13-04.79N 009-54-39.13E 1846 407 - +NAV LUX VOR/DME 49-38-21.84N 006-14-49.99E 1234 112.25 - +NAV LV NDB 50-48-15.12N 007-14-24.79E 0 327 - +NAV LW NDB 50-53-53.88N 007-15-10.26E 0 301 - +NAV LWB VOR/DME 52-54-37.08N 013-08-04.56E 234 114.55 - +NAV LXI TACAN 47-46-59.52N 006-21-25.60E 913 108.20 - +NAV LXI NDB 47-47-47.76N 006-22-30.68E 913 364 - +NAV LYE NDB 53-48-02.88N 010-41-45.24E 53 394 - +NAV MA NDB 51-23-42.36N 012-20-35.52E 0 357 - +NAV MAG VOR/DME 51-59-42.00N 011-47-39.48E 209 110.45 - +NAV MAH VOR/DME 48-15-48.24N 011-18-42.84E 1759 115.20 - +NAV MBG VOR/DME 48-34-24.23N 012-15-39.60E 1658 117.15 - +NAV MDF VOR/DME 48-14-04.92N 012-20-14.64E 1526 117.00 - +NAV MEG NDB 48-03-15.85N 009-22-03.18E 0 401 - +NAV MET TACAN 49-04-00.83N 006-07-45.80E 663 108.00 - +NAV MGB NDB 51-13-38.28N 006-30-19.48E 125 377 - +NAV MGD DME 52-04-37.56N 011-37-51.24E 302 115.45 - +NAV MHD DME 51-14-05.65N 006-29-31.09E 159 112.50 - +NAV MHV VOR 51-14-14.28N 006-29-24.86E 156 109.80 - +NAV MIC VOR 54-18-19.80N 011-00-18.72E 119 112.20 - +NAV MIQ NDB 48-34-12.73N 011-35-51.00E 0 427 - +NAV MND DME 49-28-14.16N 008-30-57.53E 351 113.55 - +NAV MNE NDB 48-21-19.44N 011-40-33.60E 0 369 - +NAV MNW NDB 48-22-27.47N 011-54-50.76E 0 338 - +NAV MOD DME 52-08-16.80N 007-41-14.06E 207 114.05 - +NAV MSE NDB 48-20-00.24N 011-39-10.44E 0 358 - +NAV MST NDB 52-06-36.36N 007-34-18.16E 0 305 - +NAV MSW NDB 48-21-08.65N 011-54-13.68E 0 400 - +NAV MTR VOR 50-16-34.67N 008-50-55.07E 666 110.00 - +NAV MU NDB 52-04-26.76N 011-38-53.88E 0 367 - +NAV MUN VOR/DME 48-10-49.09N 011-48-57.60E 1802 112.30 - +NAV MYN NDB 52-09-33.49N 007-47-59.96E 0 371 - +NAV NDG NDB 48-49-45.84N 010-25-07.32E 0 375 - +NAV NDO TACAN 53-46-08.40N 008-39-12.60E 120 117.10 - +NAV NDO NDB 53-47-06.71N 008-48-22.21E 72 372 - +NAV NEG TACAN 53-36-16.91N 013-18-31.32E 270 108.05 - +NAV NER VOR/DME 50-21-59.76N 014-37-17.04E 1000 108.60 - +NAV NEU TACAN 48-42-45.01N 011-12-39.60E 1296 108.90 - +NAV NGD DME 49-30-04.33N 011-04-48.36E 1090 113.10 - +NAV NID DME 51-35-59.99N 006-08-29.33E 152 115.50 - +NAV NIE VOR 52-37-33.24N 009-22-19.16E 190 116.50 - +NAV NKR NDB 49-20-12.12N 008-43-58.48E 0 292 - +NAV NMN NDB 50-22-04.09N 007-18-49.21E 671 331 - +NAV NRG NDB 53-36-10.07N 013-20-17.88E 264 357 - +NAV NSN NDB 49-23-41.27N 009-57-54.00E 1595 311 - +NAV NTM VORTAC 50-00-57.24N 006-31-54.44E 1388 115.30 - +NAV OBI NDB 48-04-50.16N 011-17-07.44E 1923 429 - +NAV OKG VOR/DME 50-03-54.37N 012-24-20.52E 1600 115.70 - +NAV OKL VOR/DME 50-05-47.40N 014-15-46.08E 1200 112.60 - +NAV OL NDB 53-33-18.00N 014-57-36.72E 0 397 - +NAV OSB TACAN 52-12-06.11N 008-17-07.80E 343 108.35 - +NAV OSN VOR 52-12-00.36N 008-17-07.87E 391 114.30 - +NAV PAD NDB 51-37-24.96N 008-38-21.98E 673 354 - +NAV PAH NDB 53-23-39.12N 011-39-57.24E 0 315 - +NAV PG NDB 50-02-51.72N 014-22-09.48E 0 307 - +NAV PI NDB 53-27-40.68N 011-54-25.92E 0 333 - +NAV PMD DME 53-25-30.00N 011-47-06.00E 179 117.50 - +NAV PR NDB 50-08-39.12N 014-22-01.92E 0 356 - +NAV PSA NDB 49-51-43.93N 009-20-53.95E 0 370 - +NAV PSK DME 49-47-51.00N 014-02-04.92E 2300 117.60 - +NAV RA NDB 48-56-46.68N 014-30-55.08E 0 402 - +NAV RAK NDB 50-05-49.56N 013-41-26.52E 0 386 - +NAV RDG VOR/DME 49-02-25.07N 012-31-35.40E 2172 114.70 - +NAV RID VOR/DME 49-46-54.12N 008-32-29.36E 328 112.20 - +NAV RKN VOR/DME 52-07-59.53N 006-45-49.97E 137 116.80 - +NAV RMS TACAN 49-26-04.92N 007-35-08.34E 762 113.40 - +NAV RO NDB 51-20-36.96N 014-57-07.20E 0 432 - +NAV RTB NDB 49-28-57.72N 011-15-10.44E 1096 415 - +NAV RTT NDB 47-25-51.24N 011-56-24.36E 3707 303 - +NAV RW NDB 52-32-42.36N 013-09-03.60E 0 392 - +NAV SAD DME 49-12-45.01N 007-06-57.85E 1088 116.75 - +NAV SAV VOR/DME 48-47-46.32N 007-26-52.73E 831 110.45 - +NAV SBG VOR/DME 48-00-09.37N 012-53-34.08E 1494 113.80 - +NAV SBG NDB 47-58-03.00N 012-53-38.76E 0 382 - +NAV SBN NDB 49-13-08.04N 007-07-06.02E 1058 343 - +NAV SDD DME 52-22-28.20N 013-30-13.32E 173 114.40 - +NAV SG NDB 48-42-40.68N 009-20-06.14E 0 306 - +NAV SGD DME 48-41-16.44N 009-13-26.79E 1332 115.45 - +NAV SHD DME 49-06-59.40N 009-46-41.38E 1389 108.05 - +NAV SHU NDB 47-01-18.48N 007-23-30.98E 2215 357 - +NAV SI NDB 47-49-06.96N 012-59-15.72E 0 410 - +NAV SIL NDB 50-40-48.00N 008-08-18.60E 0 489 - +NAV SK NDB 51-26-05.28N 012-07-00.12E 0 434 - +NAV SLD DME 50-42-24.47N 008-04-42.64E 2019 108.05 - +NAV SLN NDB 52-23-33.36N 013-34-12.00E 0 362 - +NAV SLT NDB 54-51-24.84N 008-24-35.93E 0 387 - +NAV SO NDB 53-12-55.09N 006-47-06.58E 3 330 - +NAV SPA TACAN 49-58-44.40N 006-41-51.72E 1161 109.50 - +NAV SR NDB 49-13-04.08N 007-13-10.24E 0 360 - +NAV STK NDB 52-59-48.12N 006-53-44.41E 18 315 - +NAV STR VOR/DME 48-30-19.45N 007-34-19.09E 586 115.60 - +NAV SU NDB 47-52-45.48N 012-56-59.64E 0 356 - +NAV SUI VOR/DME 52-22-47.65N 014-35-08.16E 98 116.70 - +NAV SUL VOR 48-22-53.76N 008-38-41.42E 0 116.10 - +NAV SWG TACAN 54-27-13.32N 009-30-05.40E 105 111.80 - +NAV SY NDB 48-40-09.12N 009-06-51.12E 0 384 - +NAV TAU VORTAC 50-15-01.80N 008-09-45.07E 1343 116.70 - +NAV TGL VOR/DME 52-33-41.40N 013-17-15.36E 118 112.30 - +NAV TGO VORTAC 48-37-06.24N 009-15-33.15E 1213 112.50 - +NAV TOF VOR/DME 52-28-23.16N 013-24-19.44E 199 114.10 - +NAV TRA VOR/DME 47-41-22.20N 008-26-13.02E 1850 114.30 - +NAV TRT VOR/DME 54-30-39.61N 013-14-57.48E 41 108.45 - +NAV TWN TACAN 52-16-28.21N 006-53-29.51E 114 110.70 - +NAV TWN NDB 52-16-04.43N 006-52-34.18E 98 336 - +NAV VO NDB 50-12-39.97N 014-25-42.24E 0 333 - +NAV VOZ VOR/DME 49-31-56.28N 014-52-28.92E 2200 116.30 - +NAV WBD NDB 50-02-56.40N 008-19-43.21E 490 399 - +NAV WES DME 54-54-37.80N 008-20-23.64E 49 111.50 - +NAV WIB TACAN 50-02-46.32N 008-18-38.99E 472 114.10 - +NAV WIL VOR/DME 47-10-41.88N 007-54-21.31E 2417 116.90 - +NAV WLD VOR/DME 48-34-45.84N 011-07-45.84E 1396 112.80 - +NAV WLU NDB 49-34-04.08N 006-03-15.01E 0 346 - +NAV WRB VOR/DME 51-30-20.52N 009-06-39.28E 843 113.70 - +NAV WSR VOR 53-20-51.71N 008-52-31.23E 0 112.90 - +NAV WTM TACAN 53-33-15.47N 007-43-30.61E 61 113.50 - +NAV WUN TACAN 52-27-37.08N 009-26-41.39E 202 114.85 - +NAV WUN NDB 52-27-33.48N 009-27-16.78E 203 419 - +NAV WUR VOR 49-43-03.00N 009-56-49.20E 1052 110.20 - +NAV WYP VOR 51-02-54.24N 007-16-48.00E 902 109.60 - +NAV ZBN NDB 49-13-39.36N 007-24-59.69E 0 435 - +NAV ZIG NDB 51-26-02.39N 012-16-49.80E 463 340 - +NAV ZND DME 49-12-33.48N 007-23-44.81E 1201 109.10 - +NAV ZUE VOR/DME 47-35-31.92N 008-49-03.61E 1730 110.05 - +NAV ZW NDB 47-11-53.16N 014-45-24.12E 0 418 - +NAV ZWN VOR/DME 49-13-44.76N 007-25-04.40E 1177 114.80 - +# Dusseldorf (EDDL): +ILS 05L ILS/DME IDNE 110.95 51-18-00.10N 006-46-59.08E 51-16-58.94N 006-44-52.49E 109 5 52.9 3 +ILS 23R ILS/DME IDNW 109.30 51-16-55.45N 006-44-43.06E 51-17-56.62N 006-46-49.64E 185 5 232.8 3 +ILS 05R ILS/DME IDSE 111.50 51-17-51.11N 006-47-22.72E 51-16-44.18N 006-45-04.26E 109 5 52.8 3 +ILS 23L ILS/DME IDSW 109.90 51-16-40.69N 006-44-54.84E 51-17-47.62N 006-47-13.29E 185 5 232.8 3 +# Frankfurt (EDDF): +ILS 07C ILS/DME IFCE 110.55 50-02-45.73N 008-35-27.27E 50-01-54.49N 008-32-02.65E 342 5 69.7 3 +ILS 25C ILS/DME IFCW 111.55 50-01-53.98N 008-31-50.54E 50-02-45.23N 008-35-15.16E 386 5 249.6 3 +ILS 07L ILS/DME IFNE 111.75 50-02-48.24N 008-32-15.54E 50-02-10.68N 008-29-47.48E 342 5 69.8 3 +ILS 25R ILS/DME IFNW 111.35 50-02-10.20N 008-29-35.35E 50-02-47.76N 008-32-03.41E 386 5 249.7 3 +ILS 07R ILS/DME IFSE 110.95 50-02-27.75N 008-35-25.63E 50-01-36.13N 008-32-00.98E 342 5 69.5 3 +ILS 25L ILS/DME IFSW 111.15 50-01-35.60N 008-31-48.89E 50-02-27.23N 008-35-13.55E 387 5 249.5 3 +# Munich (EDDM): +ILS 08L ILS/DME IMNE 109.50 48-22-01.94N 011-49-30.80E 48-21-42.99N 011-46-01.97E 1479 5 83.5 3 +ILS 26R ILS/DME IMNW 108.70 48-21-44.97N 011-45-48.88E 48-22-03.93N 011-49-17.71E 1495 5 263.4 3 +ILS 08R ILS/DME IMSE 109.30 48-20-42.38N 011-48-31.03E 48-20-23.43N 011-45-02.21E 1479 5 83.5 3 +ILS 26L ILS/DME IMSW 108.30 48-20-25.41N 011-44-49.13E 48-20-44.37N 011-48-17.95E 1495 5 263.4 3 diff -Nru acm-5.0/objects/zones/europe/italy.txt acm-6.0+20200416/objects/zones/europe/italy.txt --- acm-5.0/objects/zones/europe/italy.txt 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/objects/zones/europe/italy.txt 2018-04-02 06:09:55.000000000 +0000 @@ -0,0 +1,316 @@ +# ITALY +# ----- +# +# References: +# VATITA - VATSIM Italy (www.vatita.net) +# World Aero Data (www.worldaerodata.com) +# The Airport Guide (www.the-airport-guide.com) + +GROUND_COLOR #305030 + +# Team 1 base: +# Milano Malpensa 17L: +#TEAM1_LOC 45-38-31.390N 008-43-48.830E 745 169 +# Bologna Borgo Panigale 12: +#TEAM1_LOC 44-32-28.53N 011-16-21.000E 120 116.7 +# Roma Fiumicino, 34R: +TEAM1_LOC 41-48-44.72N 12-16-31.93E 7 342.68 + +# Team 2 base: +# Milano Malpensa 17L: +TEAM2_LOC 45-38-31.390N 008-43-48.830E 745 169 +# Bologna Borgo Panigale 12: +#TEAM2_LOC 44-32-28.53N 011-16-21.000E 120 116.7 +# Roma Fiumicino, 34R: +#TEAM2_LOC 41-48-44.72N 12-16-31.93E 7 342.68 + +# ALGHERO - FERTILIA +RWY2 LIEA 02/20 78 9843 148 40-37-55.68N 08-17-26.78E 024.5 +ILS 20 ILS/DME IALF 110.15 40-37-11.454N 08-17-00.214E 40-38-31.8N 08-17-45.0E 78 3 204.5 3 +NAV AHO TACAN 40-38-10.00N 08-17-22.00E 78 109.30 030X +NAV AEA VOR/DME 40-38-10.00N 08-17-22.00E 78 111.65 053Y + +# ANCONA - FALCONARA +RWY2 LIPY 04/22 38 9783 150 43-36-59.38N 13-21-45.04E 44.75 +ILS 22 ILS/DME IFA 111.90 43-36-23.30N 13-20-55.50E 43-37-28.50N 13-22-29.50E 38 3 224.75 3 + +# BARI - PALESE +RWY2 LIBD 07/25 177 8005 148 41-08-18N 016-45-37E 69 +ILS 07 ILS BPL 109.30 41-08-35.30N 016-46-36.79E 41-08-11.80N 016-45-02.05E 177 3 69 3 + +# BERGAMO - ORIO AL SERIO +RWY LIME 10/28 779 9636 148 45-40-15.405N 009-41-24.888E 45-39-52.959N 009-43-25.742E +ILS 28 ILS/DME BRM 108.70 45-40-16.300N 009-41-20.500E 45-39-49.500N 009-43-15.500E 779 3 284.88 3 +RWY LIME 12/30 779 2200 67 45-40-40.54N 09-42-08.01E 45-40-27.88N 09-42-38.00E +NAV ORI VOR/DME 45-40-18N 09-42-31E 779 112.60 - + +# BOLOGNA - G. MARCONI +RWY2 LIPE 12/30 120 9186 148 44-32-07.70N 11-17-19.20E 116.5 +NAV BOA VOR/DME 44-32-13.000N 011-17-26.000E 150 112.20 - +ILS 12 ILS/DME BLN 108.9 44-31-45.55N 011-18-21.50E 44-32-20.500N 011-16-49.410E 120 3 116.5 3 +FEATURE ../../features/tower.obv 44-31-50N 11-17-35E 120 0 + +# BRINDISI - CASALE +RWY2 LIBR 14/32 25 8307 148 40-39-50.02N 17-56-24.51E 137 +ILS 32 ILS IBN 109.50 40-40-20.08N 17-55-47.79E 40-39-29.50N 17-56-42.50E 25 3 317 3 +RWY2 LIBR 05/23 25 5951 148 40-39-25N 17-56-45E 53 + +# CAGLIARI - ELMAS +RWY2 LIEE 14/32 6 9196 148 39-15-05.31N 09-03-15.44E 138 +ILS 32 ILS/DME IEL 109.50 39-15-39.20N 09-02-36.20E 39-14-35.70N 09-03-38.20E 6 3 318 3 +NAV CAG VOR/DME 39-14-56.40N 009-03-14.70E 6 113.40 - + +# CATANIA - FONTANAROSSA +RWY2 LICC 08/26 27 7390 148 37-28-00.44N 15-03-59.28E 84 +ILS 08 ILS/DME CTN 109.90 37-28-04.28N 15-04-44.90E 37-27-54.59N 15-03-35.67E 27 3 84 3 + +# CROTONE +RWY2 LIBC 17/35 517 6562 148 38-59-48N 17-04-45E 169 + +# FIRENZE - PERETOLA +RWY2 LIRQ 05/23 144 5538 98 43-48-36N 11-12-18E 47 +NAV PRT VOR/DME 43-48-37.50N 11-12-05.40E 144 112.50 072X +ILS 05 ILS/DME IFZ 110.30 43-48-57.5N 11-12-50.0E 43-48-30.7N 11-12-01.4E 144 3 47 3 + +# FORLI' - LUIGI RIDOLFI +RWY2 LIPK 12/30 97 7907 148 44-11-42N 12-04-11E 116 + +# GENOVA - SESTRI +RWY2 LIMJ 11/29 9 9564 148 44-24-42.80N 08-50-32E 106 +ILS 29 ILS/DME GSE 109.30 44-24-59N 08-49-21E 44-24-32N 08-51-12E 9 3 286.84 3 +NAV SES VOR/DME 44-25-02.00N 08-49-25.00E 9 108.60 - + +# GIOIA DEL COLLE +RWY LIBV 14R/32L 1157 9846 148 40-46-24.65N 16-55-25.37E 40-45-16.65N 16-56-38.25E +RWY LIBV 14L/32R 1157 9829 98 40-46-51.12N 16-55-23.05E 40-45-41.78N 16-56-37.15E +NAV GIO TACAN 40-48-05N 16-54-05E 150 117.80 125X + +# GRAZZANISE +RWY2 LIRM 06/24 23 9810 98 41-03-37.43N 14-04-57.68E 61 +NAV GRA TACAN 41-03-32N 14-05-31E 50 117.50 122X + +# LATINA +RWY2 LIRL 12/30 75 5577 131 41-32-33N 12-54-27E 125 + +# LECCE - GALATINA +RWY2 LIBN 14/32 153 6637 197 40-14-21.22N 18-07-59.97E 145.5 +ILS 32 ILS/DME GAL 111.75 40-14-51.2N 18-07-33.1E 40-13-52.6N 18-08-21.0E 153 5 325.5 3 +NAV LCC VORTAC 40-14-54.31N 18-07-50.52E 160 112.8 75X + +# MILANO - CAMERI +RWY LIMN 17/35 569 9818 94 45-32-39.14N 8-39-53.73E 45-31-04.48N 8-40-23.43E + +# MILANO - LINATE +RWY LIML 18L/36R 337 8005 196 45-27-22.377N 009-16-33.119E 45-26-03.515N 009-16-41.622E +NAV LIN VOR/DME 45-27-39.386N 009-16-31.200E 353 116.00 - +ILS 36R ILS LNT 110.30 45-27-32.096N 009-16-31.900E 45-26-13.072N 009-16-37.151E 337 3 355.5 3 +RWY LIML 18R/36L 337 2168 197 45-27-28.936N 009-16-05.735E 45-27-09.506N 009-16-07.845E + +# MILANO - MALPENSA +RWY MA1 17L/35R 745 12860 197 45-38-31.390N 008-43-48.830E 45-36-56.700N 08-44-14.990E +ILS 17L ILS IAM 109.90 45-36-43.900N 08-44-18.500E 45-38-24.316N 08-43-56.730E 745 3 169 3 +ILS 35R ILS MLP 109.90 45-38-31.390N 008-43-48.830E 45-37-08.785N 08-44-19.555E 745 3 349.07 3 +NAV MAL VOR/DME 45-38-33.390N 008-44-05.830E 745 111.20 - +RWY MA2 17R/35L 745 12860 197 45-38-43.660N 008-43-07.410E 45-36-51.850N 08-43-38.320E +ILS 35L ILS/DME IMA 109.10 45-38-52.120N 08-43-05.000E 45-37-03.935N 08-43-42.885E 745 3 349 3 +FEATURE ../../features/tower.obv 45-37-14N 08-42-54E 745 0 + +# MILANO - VERGIATE +RWY LILG 16/34 863 3592 164 45-43-3.10N 8-41-52.69E 45-42-30.04N 8-42-11.55E + +# NAPOLI - CAPODICHINO +RWY2 LIRN 06/24 294 8622 148 40-53-09.72N 14-17-26.81E 58 +NAV POM VOR/DME 40-55-41.50N 14-23-00.80E 294 117.85 - +ILS 24 ILS/DME INP 109.50 40-52-44.6N 14-16-33.5E 40-53-28.5N 14-18-05.5E 294 3 238 3 +ILS 06 ILS/DME NPC 110.15 40-53-33.6N 14-18-17.5E 40-52-54.5N 14-16-53.5E 294 3 58 3 + +# PALERMO - PUNTA RAISI +RWY2 LICJ 07/25 37 10912 197 38-10-48.14N 13-06-12.77E 67 +RWY2 LICJ 02/20 37 6804 148 38-10-29.24N 13-05-25.71E 24 +ILS 25 ILS/DME RAI 109.50 38-10-26.10N 13-05-07.14E 38-11-02.19N 13-07-09.40E 37 3 247 3 +ILS 20 ILS/DME ITO 109.90 38-09-58.57N 13-05-08.50E 38-10-52.91N 13-05-32.93E 37 3 204 3 +# That's a terminal VOR: +NAV PRS VOR/DME 38-10-19.55N 13-04-47.85E 37 113.00 - + +# Pantelleria +RWY2 LICG 08/26 635 5499 148 36-48-57N 11-57-56E 76 +RWY2 LICG 03/21 635 4003 98 36-48-46N 11-57-57E 28 + +# PARMA - Giuseppe Verdi +RWY LIMP 02/20 164 6961 147 44-49-10.18N 10-17-38.16E 44-50-03.54N 10-18-01.63E +ILS 20 ILS/DME IPR 110.50 44-49-10.18N 10-17-38.16E 44-49-54N 10-17-52E 164 50 197.35 3 + +# REGGIO CALABRIA +RWY2 LICR 11/29 50 5574 148 38-04-19.79N 15-38-54.85E 112 +RWY2 LICR 15/33 50 6549 148 38-04-21.60N 15-39-02.17E 152 +ILS - LDA REG 109.30 38-02-51N 15-39-50E - - 0 3 19 - + +# REGGIO EMILIA - CAMPO VOLO +RWY2 LIDE 12/30 153 4593 98 44-41-54.00N 10-39-46.00E 120 + +# RIMINI +RWY LIPR 13/31 31 9828 148 44-01-42.71N 12-35-49.07E 44-00-43.35N 12-37-35.50E +ILS 31 ILS MIR 109.30 44-01-42.71N 12-35-49.07E 44-00-43.35N 12-37-35.50E 31 5 307.7 3 + +# ROMA - CIAMPINO +RWY LIRA 15/33 341 7242 154 41-48-29.01N 12-35-19.78E 41-47-25.43N 12-36-03.62E +NAV ROM VOR/DME 41-48-14.01N 12-35-19.78E 341 110.80 - +ILS 15 ILS CIA 109.90 41-47-20.43N 12-36-07.20E 41-48-16.01N 12-35-23.78E 341 3 152.63 3 + +# ROMA - FIUMICINO +RWY LIRF 07/25 7 10856 148 41-48-02.22N 12-14-12.55E 41-48-34.66N 12-16-10.11E +RWY LIRF 16R/34L 7 12795 197 41-48-55.86N 12-13-34.90E 41-47-05.03N 12-14-21.31E +RWY LIRF 16L/34R 7 12795 197 41-50-45.57N 12-15-41.34E 41-48-44.72N 12-16-31.93E +ILS 34L ILS ISW 108.90 41-49-08N 12-13-29.7E 41-47-13N 12-14-08E 7 3 342.68 3 +ILS 16R ILS FRR 110.30 41-46-55N 12-14-25.5E 41-48-45N 12-13-32E 7 3 162.68 3 +ILS 25 ILS FEE 109.70 41-47-54.0N 12-13-43E 41-48-34N 12-15-53E 7 3 249.68 3 +ILS 16L ILS FLL 108.10 41-48-31N 12-16-37.8E 41-50-34N 12-15-55E 7 3 162.58 3 +ILS 34R ILS FSS 109.30 41-50-54N 12-15-37.9E 41-48-51N 12-16-34E 7 3 342.68 3 +FEATURE ../../features/tower.obv 41-47-47N 12-15-10E 7 0 + +# ROMA - PRATICA DI MARE +RWY LIRE 13L/31R 41 8138 98 41-39-40.13N 12-25-57.92E 41-38-47.17N 12-27-22.20E + +# ROMA - URBE +RWY LIRU 16/34 55 3543 98 41-57-25.17N 12-30-00.02E 41-56-51.96N 12-30-15.92E + +# RAVENNA +RWY LIDR 08/26 0 3937 98 44-21-48.23N 012-13-02.73E 44-21-54.37N 012-13-56.30E + +# TORINO - CASELLE +RWY LIMF 18/36 989 10826 150 45-12-36.320N 07-39-04.440E 45-11-24.100N 07-38-59.860E +NAV CSL VOR/DME 45-12-49.320N 07-39-02.140E 995 116.75 - +ILS 36 ILS CAS 109.50 45-12-36.320N 07-39-04.440E 45-11-45.800N 07-39-02.860E 995 3 2.56 3 + +# VENEZIA - TESSERA +RWY LIPZ 04R/22L 7 10827 148 45-29-42.10N 12-20-19.25E 45-31-01.40N 12-22-01.25E +ILS 04R ILS VEN 110.30 45-31-10.00N 12-22-12.00E 45-29-50.00N 12-20-40.00E 7 3 42 3 +NAV TES VOR/DME 45-31-15.00N 12-22-05.00E 7 115.30 - + +# VERONA - VILLAFRANCA +RWY LIPX 05/23 238 10064 148 45-23-15.64N 10-52-36.70E 45-24-14.48N 10-54-02.27E +ILS 05 ILS IVF 110.10 45-24-18.70N 10-54-08.50E 45-23-25.50N 10-52-38.70E 238 3 45.6 3 +NAV VIL VOR 45-24-22.00N 10-54-13.50E 238 115.80 - + +NAV ALG VORTAC 40-37-41N 08-14-38E 1450 113.80 - +NAV ANC VOR/DME 43-35-11N 13-28-18E 850 110.65 - +NAV BAR VOR/DME 41-08-39N 16-46-35E 100 116.40 - +NAV BOL VORTAC 42-37-06N 12-02-55E 2100 114.40 - +NAV BRD VORTAC 40-36-39N 18-00-10E 100 113.20 - +NAV CAR VOR/DME 39-06-41N 09-30-29E 200 115.10 - +NAV CAT VOR/DME 37-27-22N 14-58-10E 200 112.10 - +NAV CDC VORTAC 38-45-21N 16-22-09E 53 117.30 - +NAV CHI VOR/DME 45-04-16N 12-16-53E 0 114.10 - +NAV CMP VOR/DME 42-07-26N 12-22-53E 1450 111.40 - +NAV CRN VOR/DME 38-59-46N 17-04-59E 0 117.10 - +NAV CTF VOR/DME 37-27-52N 15-03-44E 53 116.25 - +NAV ELB VORTAC 42-43-50N 10-23-45E 1400 114.70 - +NAV FRZ VORTAC 44-01-38N 11-00-12E 4300 115.20 - +NAV GEN VOR/DME 44-25-28N 09-04-56E 2900 112.80 - +NAV LAT VOR/DME 41-32-28N 12-55-05E 100 111.20 - +NAV OST VOR/DME 41-48-14N 12-14-15E 7 114.90 - +NAV PAL VOR/DME 38-02-02N 13-10-39E 3900 112.30 - +NAV PAN VOR/DME 36-48-51N 11-57-55E 600 116.10 - +NAV PES VOR/DME 42-26-10N 14-11-04E 0 115.90 - +NAV PIS VOR/DME 43-40-38N 10-23-26E 40 112.10 - +NAV PNZ VORTAC 40-54-43N 12-57-27E 700 114.60 - +NAV PRU VOR/DME 43-06-06N 12-30-43E 700 109.40 - +NAV RCA VOR/DME 38-04-33N 15-38-44E 100 111.00 - +NAV RCH VOR/DME 45-49-47N 13-28-49E 100 114.20 - +NAV SME VOR/DME 40-53-24N 09-30-04E 100 113.90 - +NAV SOR VOR/DME 40-34-57N 14-20-07E 1700 112.20 - +NAV SRN VOR/DME 45-38-48N 09-01-22E 800 113.70 - +NAV TAQ VOR/DME 42-12-54N 11-43-57E 100 111.80 - +NAV TEA VOR/DME 41-17-48N 13-58-14E 3300 112.90 - +NAV TPR TACAN 41-37-17.64N 12-29-37.58E 50 108.70 24X +NAV TOP VOR/DME 44-55-31N 07-51-42E 900 114.50 - +NAV TRP VOR/DME 37-53-45N 12-30-47E 100 108.80 - +NAV TZO VOR/DME 45-33-33N 09-30-26E 500 111.80 - +NAV VIC VOR/DME 45-38-14N 11-40-35E 200 113.40 - +NAV VIE VOR/DME 41-54-46N 16-02-57E 1000 112.60 - +NAV VOG VOR/DME 44-57-52N 08-58-13E 400 115.50 - + +# NDB data mostly from www.worldaerodata.com +NAV RIV NDB 45-56-07.00N 12-56-31.00E 200 371 - +NAV ABN NDB 44-03-21.00N 08-13-16.00E 200 420 - +NAV ALG NDB 40-38-24.00N 08-17-30.00E 200 382 - +NAV AME NDB 41-29-59.82N 15-50-16.10E 200 334 - +NAV ANC NDB 43-35-12.00N 13-28-20.00E 200 374 - +NAV ARB NDB 39-55-17.20N 09-40-43.20E 200 289 - +NAV AVI NDB 45-55-27.59N 12-25-42.71E 200 390 - +NAV BLA NDB 45-27-44.00N 08-07-24.00E 200 350 - +NAV BOA NDB 44-34-02.30N 11-12-00.85E 200 413 - +NAV BPL NDB 41-06-37.10N 16-39-37.60E 200 301 - +NAV BRD NDB 40-36-19.70N 18-00-31.80E 200 363.5 - +NAV BZO NDB 46-27-49.14N 11-19-18.77E 200 362 - +NAV CAG NDB 39-12-52.70N 09-05-50.90E 200 371 - +NAV CAM NDB 45-25-42.93N 08-42-02.82E 200 323 - +NAV CAR NDB 39-06-42.00N 09-30-33.00E 200 402 - +NAV CAS NDB 45-07-24.46N 07-38-43.17E 200 357 - +NAV CAT NDB 37-27-24.78N 14-57-56.52E 200 345 - +NAV CEV NDB 44-16-03.58N 12-10-48.39E 200 387 - +NAV CHI NDB 45-04-18.50N 12-16-53.00E 200 408 - +NAV CIA NDB 41-51-53.80N 12-33-38.90E 200 412 - +NAV CMO NDB 44-20-45.00N 09-10-16.00E 200 389 - +NAV CMP NDB 42-07-29.83N 12-22-49.40E 200 301.5 - +NAV COD NDB 45-13-34.54N 09-32-28.23E 200 400.5 - +NAV CTF NDB 37-27-49.10N 15-03-45.20E 200 407 - +NAV DEC NDB 39-21-49.00N 08-58-27.00E 200 331 - +NAV ELB NDB 42-43-57.00N 10-23-38.00E 200 360 - +NAV FAL NDB 43-37-41.60N 13-22-24.70E 200 357.5 - +NAV FE NDB 41-49-53.10N 12-21-03.90E 200 354 - +NAV FER NDB 44-48-52.00N 11-36-59.00E 200 427 - +NAV FN NDB 41-54-38.40N 12-14-04.60E 200 421 - +NAV FOG NDB 41-25-51.00N 15-31-53.00E 200 340 - +NAV FOR NDB 44-14-53.00N 11-55-29.00E 200 423 - +NAV FRS NDB 41-38-38.00N 13-17-23.00E 200 371 - +NAV FW NDB 41-52-51.10N 12-11-55.60E 200 345 - +NAV GAZ NDB 45-12-06.10N 10-36-14.90E 200 382 - +NAV GEN NDB 44-25-25.82N 09-05-00.01E 200 318 - +NAV GIO NDB 40-48-00.70N 16-54-04.72E 200 328 - +NAV GRA NDB 41-03-25.91N 14-05-00.54E 200 343 - +NAV GRO NDB 42-42-19.00N 11-01-31.00E 200 406 - +NAV GRT NDB 40-26-45.50N 17-25-19.70E 200 331 - +NAV GUI NDB 41-59-59.00N 12-44-20.00E 200 388 - +NAV ISA NDB 45-41-55.00N 12-13-42.00E 200 340 - +NAV ITA NDB 41-32-28.20N 12-55-10.40E 200 393 - +NAV LAT NDB 41-31-28.00N 12-56-37.00E 200 379 - +NAV LEV NDB 44-32-39.20N 07-36-55.40E 200 371 - +NAV LIN NDB 45-20-39.62N 09-17-18.89E 200 386 - +NAV LPD NDB 35-30-01.60N 12-36-57.20E 200 373 - +NAV MAL NDB 45-32-44.95N 08-45-22.53E 200 364 - +NAV NOV NDB 45-25-26.90N 08-47-37.90E 200 292 - +NAV NSY NDB 37-24-00.25N 14-55-15.96E 200 297 - +NAV ORI NDB 45-38-37.59N 09-50-30.03E 200 376.5 - +NAV OST NDB 41-48-18.60N 12-14-11.10E 200 321 - +NAV PAL NDB 38-02-03.36N 13-10-38.51E 200 355.5 - +NAV PAN NDB 36-48-40.90N 11-57-39.60E 200 335 - +NAV PAR NDB 44-49-20.24N 10-17-35.77E 200 306 - +NAV PDV NDB 45-21-36.50N 11-49-05.10E 200 285 - +NAV PIA NDB 44-52-18.00N 09-49-36.00E 200 440 - +NAV PIS NDB 43-35-21.20N 10-17-49.50E 200 379 - +NAV PNZ NDB 40-54-40.00N 12-57-22.00E 200 367.5 - +NAV POM NDB 40-55-43.00N 14-22-59.00E 200 351 - +NAV PRA NDB 41-40-46.99N 12-27-10.24E 200 339 - +NAV PRS NDB 38-11-21.79N 13-06-32.85E 200 329 - +NAV RCA NDB 38-00-46.52N 15-39-00.97E 200 325 - +NAV RIM NDB 44-04-44.50N 12-30-21.60E 200 335 - +NAV RMG NDB 45-38-22.19N 08-43-59.38E 200 337 - +NAV RON NDB 45-49-41.37N 13-21-38.50E 200 396 - +NAV SIG NDB 37-23-44.87N 14-58-17.50E 200 412 - +NAV SME NDB 40-53-36.90N 09-30-08.26E 200 357 - +NAV SOR NDB 40-34-57.40N 14-20-07.80E 200 426 - +NAV SRN NDB 45-38-48.50N 09-01-22.30E 200 330 - +NAV TAQ NDB 42-12-50.24N 11-43-44.06E 200 312 - +NAV TEA NDB 41-17-45.00N 13-58-18.00E 200 316 - +NAV TOP NDB 44-55-28.90N 07-51-37.55E 200 392.5 - +NAV TRE NDB 45-37-20.90N 12-05-44.30E 200 301.5 - +NAV TRP NDB 37-54-51.60N 12-29-34.70E 200 317.5 - +NAV TZO NDB 45-33-30.43N 09-30-33.48E 200 345 - +NAV URB NDB 41-56-42.40N 12-29-24.40E 200 285 - +NAV VEN NDB 45-26-56.70N 12-16-37.20E 200 379 - +NAV VIB NDB 42-26-24.00N 12-03-25.00E 200 480 - +NAV VIC NDB 45-38-12.72N 11-40-28.82E 200 417 - +NAV VIE NDB 41-54-48.00N 16-03-04.00E 200 405 - +NAV VIL NDB 45-19-28.00N 10-47-09.60E 200 355 - +NAV VOG NDB 44-57-50.30N 08-58-17.40E 200 333.5 - diff -Nru acm-5.0/objects/zones/europe/spain.txt acm-6.0+20200416/objects/zones/europe/spain.txt --- acm-5.0/objects/zones/europe/spain.txt 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/objects/zones/europe/spain.txt 2020-04-16 12:05:39.000000000 +0000 @@ -0,0 +1,314 @@ +# Spain zone. +# Created: 2020-04-16 +# Latitude range: [35N, 42N[ +# Longitude range: [010W, 006E[ +# 2017-11-01 Source: http://ourairports.com + +GROUND_COLOR #305030 + +RWY DA14 05/23 732 3550 80 35-54-09.36N 000-08-31.07E 35-54-34.56N 000-09-01.06E +RWY DA14 13/31 732 2275 100 35-54-34.20N 000-08-53.39E 35-54-20.88N 000-09-15.55E +RWY DAAB 07/25 535 5833 150 36-30-05.04N 002-48-11.92E 36-30-28.80N 002-49-18.91E +RWY DAAD 04/22 1506 7218 98 35-19-30.36N 004-11-54.35E 35-20-23.64N 004-12-52.63E +RWY DAAE 08/26 20 7874 148 36-42-36.00N 005-03-24.01E 36-42-48.96N 005-04-59.02E +RWY DAAG 05/23 82 11483 197 36-41-38.04N 003-13-12.61E 36-42-46.44N 003-15-05.04E +RWY DAAG 09/27 82 11483 148 36-41-31.56N 003-10-14.99E 36-41-28.32N 003-12-35.71E +RWY DAAK 05/23 335 11883 148 36-32-01.68N 002-51-45.22E 36-33-28.44N 002-53-24.29E +RWY DAAQ 09L/27R 2132 10696 148 35-31-36.84N 002-51-38.88E 35-31-34.68N 002-53-48.16E +RWY DAAQ 09R/27L 2132 10696 148 35-31-28.56N 002-51-38.81E 35-31-26.40N 002-53-48.08E +RWY DAAV 17/35 36 7874 148 36-48-20.88N 005-52-17.40E 36-47-03.84N 005-52-32.56E +RWY DAAZ 07/25 282 4265 70 35-44-59.64N 000-37-10.80E 35-45-16.20N 000-37-58.36E +RWY DAOB 08/26 3245 9843 148 35-20-20.76N 001-26-48.70E 35-20-35.52N 001-28-45.95E +RWY DAOE 07/25 187 9834 148 35-43-53.04N 000-49-09.90W 35-44-34.08N 000-47-22.00W +RWY DAOI 07/25 463 5413 98 36-12-34.92N 001-19-24.13E 36-12-56.16N 001-20-24.58E +RWY DAOL 08/26 367 9037 140 35-32-21.84N 000-32-49.05W 35-32-43.80N 000-31-03.31W +RWY DAON 07/25 814 8530 148 35-00-33.48N 001-28-14.12W 35-01-02.64N 001-26-37.72W +RWY DAOO 07/25 295 10039 148 35-37-06.60N 000-38-12.18W 35-37-45.12N 000-36-20.34W +RWY DAOS 10/28 1614 4868 100 35-10-21.72N 000-36-04.85W 35-10-15.24N 000-35-06.74W +RWY DAOV 08/26 1686 5577 98 35-12-23.04N 000-08-16.65E 35-12-32.76N 000-09-22.78E +RWY GEML 15/33 156 4685 148 35-17-09.24N 002-57-40.25W 35-16-29.64N 002-57-08.06W +RWY GMTA 18/36 95 8202 148 35-11-18.60N 003-50-28.75W 35-09-57.96N 003-50-16.04W +RWY GMTN 06/24 10 7546 148 35-35-17.88N 005-19-49.30W 35-36-01.44N 005-18-34.85W +RWY GMTT 07/25 62 6562 98 35-43-08.76N 005-55-23.23W 35-43-31.08N 005-54-08.42W +RWY GMTT 10/28 62 11483 148 35-43-59.88N 005-56-25.12W 35-43-48.00N 005-54-06.55W +RWY LE83 17/35 2329 3287 39 41-28-13.08N 004-42-49.72W 41-27-41.04N 004-42-43.96W +RWY LE84 09/27 3654 3695 30 36-55-48.72N 003-50-30.05W 36-55-51.96N 003-49-44.69W +RWY LE85 18/36 26 6004 116 37-21-35.64N 006-00-52.42W 37-20-36.60N 006-00-48.06W +RWY LEAB 09/27 2302 8858 197 38-56-52.80N 001-52-44.62W 38-56-56.76N 001-50-52.58W +RWY LEAL 10/28 142 9842 148 38-17-04.20N 000-34-29.99W 38-16-47.28N 000-32-28.74W +RWY LEAM 08/26 70 10499 148 36-50-22.92N 002-23-14.14W 36-50-53.16N 002-21-10.58W +RWY LEBA 03/21 297 4527 148 37-50-11.76N 004-51-09.61W 37-50-50.64N 004-50-42.32W +RWY LEBE 09/27 1780 4757 98 38-16-31.08N 002-57-28.84W 38-16-32.88N 002-56-29.22W +RWY LEBE 15/33 1780 2460 98 38-16-40.44N 002-56-54.20W 38-16-19.92N 002-56-37.68W +RWY LEBL 02/20 12 8333 148 41-17-16.08N 002-05-05.42E 41-18-33.84N 002-05-40.96E +RWY LEBL 07L/25R 12 11654 148 41-17-33.00N 002-03-54.40E 41-18-20.52N 002-06-13.43E +RWY LEBL 07R/25L 12 8727 197 41-16-56.28N 002-04-27.66E 41-17-31.92N 002-06-11.81E +RWY LEBZ 13/31 609 9350 197 38-53-55.68N 006-50-04.63W 38-53-01.68N 006-48-28.40W +RWY LECU 09/27 2269 4921 98 40-22-15.96N 003-47-38.15W 40-22-12.72N 003-46-34.86W +RWY LECU 09L/27R 2269 2698 148 40-22-20.28N 003-47-26.56W 40-22-17.76N 003-46-39.32W +RWY LEFM 16/34 3307 3281 59 40-53-31.20N 004-14-30.41W 40-53-02.76N 004-14-10.07W +RWY LEGA 18/36 2297 4265 98 37-08-20.76N 003-38-07.51W 37-07-38.64N 003-38-09.49W +RWY LEGE 02/20 468 7874 148 41-53-41.64N 002-45-29.74E 41-54-56.52N 002-45-58.03E +RWY LEGR 09/27 1860 9514 148 37-11-18.96N 003-47-37.28W 37-11-20.04N 003-45-39.71W +RWY LEGT 05/23 2031 8136 197 40-17-10.32N 003-44-02.65W 40-18-06.84N 003-42-48.20W +RWY LEGT 05R/23L 2031 3018 98 40-17-21.12N 003-43-30.54W 40-17-42.72N 003-43-02.35W +RWY LEIB 06/24 24 9186 148 38-52-00.84N 001-21-31.93E 38-52-43.32N 001-23-14.57E +RWY LEIZ 10/28 2902 5015 75 38-30-49.32N 003-22-22.98W 38-30-45.00N 003-21-20.16W +RWY LEJR 02/20 93 7546 148 36-44-06.00N 006-03-53.32W 36-45-15.48N 006-03-19.48W +RWY LELA 07/25 2644 4830 77 38-44-45.60N 003-31-21.72W 38-44-58.92N 003-30-23.15W +RWY LELC 05/23 11 7546 197 37-46-03.72N 000-49-17.60W 37-46-55.92N 000-48-10.20W +RWY LELC 05L/23R 11 2867 197 37-46-49.80N 000-49-00.62W 37-47-09.60N 000-48-34.89W +RWY LELC 14/32 11 2625 197 37-47-12.48N 000-48-50.02W 37-46-53.40N 000-48-27.00W +RWY LEMD 14L/32R 1998 11483 197 40-29-41.64N 003-33-28.33W 40-28-12.00N 003-31-57.29W +RWY LEMD 14R/32L 1998 13084 197 40-29-05.64N 003-34-33.64W 40-27-20.52N 003-32-46.97W +RWY LEMD 18L/36R 1998 11483 197 40-31-57.36N 003-33-33.77W 40-30-03.96N 003-33-33.16W +RWY LEMD 18R/36L 1998 13711 197 40-31-54.48N 003-34-29.46W 40-29-33.36N 003-34-28.67W +RWY LEMG 13/31 53 10500 148 36-41-04.20N 004-30-45.32W 36-39-55.44N 004-29-08.95W +RWY LEMH 01L/19R 302 7710 148 39-51-04.68N 004-12-58.75E 39-52-19.92N 004-13-14.23E +RWY LEMH 01R/19L 302 6890 148 39-51-12.24N 004-13-08.90E 39-52-19.56N 004-13-22.73E +RWY LEMO 02/20 285 11801 200 37-09-34.56N 005-37-22.40W 37-11-24.36N 005-36-32.94W +RWY LEOC 11/29 2405 4134 58 39-56-16.80N 003-30-28.48W 39-56-04.56N 003-29-37.82W +RWY LEOC 17/35 2405 2936 328 39-56-27.60N 003-30-18.18W 39-55-59.16N 003-30-09.94W +RWY LEPA 06L/24R 27 10728 148 39-32-49.56N 002-42-38.63E 39-33-45.00N 002-44-35.48E +RWY LEPA 06R/24L 27 9842 148 39-32-28.68N 002-43-54.26E 39-33-19.08N 002-45-41.51E +RWY LEPZ 14/32 1850 3346 59 38-54-56.16N 004-11-42.43W 38-54-31.68N 004-11-13.67W +RWY LERI 07/25 250 3077 148 37-56-57.48N 001-14-06.68W 37-57-10.44N 001-13-31.58W +RWY LERM 01/19 3097 3281 33 40-51-28.08N 003-14-51.97W 40-52-00.12N 003-14-46.54W +RWY LERS 07/25 233 8054 148 41-08-38.76N 001-09-21.10E 41-09-07.20N 001-10-59.34E +RWY LERS 12/30 233 1117 115 41-08-35.16N 001-09-16.49E 41-08-24.00N 001-09-54.50E +RWY LERT 10/28 86 12106 200 36-38-49.92N 006-22-11.86W 36-38-35.52N 006-19-44.40W +RWY LESA 03/21 2595 8202 197 40-56-31.20N 005-30-32.54W 40-57-43.20N 005-29-42.22W +RWY LESA 08/26 2595 6594 400 40-56-59.28N 005-30-45.94W 40-57-17.28N 005-29-22.99W +RWY LESB 05/23 157 3281 72 39-35-47.40N 002-41-55.93E 39-36-08.28N 002-42-28.04E +RWY LESL 02/20 197 6069 148 39-51-15.84N 004-15-16.99E 39-52-12.36N 004-15-42.98E +RWY LETI 05/23 1401 3280 49 40-14-34.08N 004-47-34.58W 40-14-56.04N 004-47-03.73W +RWY LETI 05L/23R 1401 1969 197 40-14-46.32N 004-47-27.67W 40-15-01.08N 004-47-11.00W +RWY LETO 05/23 2026 12001 217 40-29-05.28N 003-27-38.52W 40-30-31.32N 003-25-51.74W +RWY LEVC 04/22 240 5394 148 39-28-55.92N 000-29-20.00W 39-29-38.76N 000-28-36.10W +RWY LEVC 12/30 240 8858 148 39-29-39.84N 000-29-41.63W 39-29-00.96N 000-27-59.77W +RWY LEVD 05/23 2776 9843 197 41-41-49.20N 004-51-53.10W 41-42-57.96N 004-50-20.90W +RWY LEVD 15/33 2776 2976 197 41-42-47.88N 004-51-42.52W 41-42-24.12N 004-51-19.51W +RWY LEZG 12L/30R 863 9843 148 41-40-08.76N 001-02-23.39W 41-39-19.44N 001-00-29.95W +RWY LEZG 12R/30L 863 12198 148 41-40-48.72N 001-04-56.53W 41-39-48.60N 001-02-37.36W +RWY LEZL 09/27 112 11024 148 37-25-04.44N 005-54-43.49W 37-25-04.80N 005-52-26.76W +RWY LP77 15/33 541 4085 98 39-24-22.32N 008-17-34.04W 39-23-49.92N 008-17-05.96W +RWY LPAR 04/22 11 9810 148 38-52-18.48N 009-02-21.23W 38-53-40.20N 009-01-14.38W +RWY LPAV 17/35 26 4593 164 40-39-37.08N 008-44-44.30W 40-38-53.16N 008-44-29.26W +RWY LPBG 02/20 2241 5600 98 41-51-01.08N 006-42-34.45W 41-51-55.08N 006-42-16.85W +RWY LPBJ 01L/19R 636 11319 197 38-03-48.24N 007-56-03.95W 38-05-39.84N 007-55-49.33W +RWY LPBJ 01R/19L 636 9682 98 38-03-55.44N 007-55-54.12W 38-05-30.84N 007-55-41.63W +RWY LPBR 07/25 247 3117 82 41-35-06.00N 008-27-00.61W 41-35-20.40N 008-26-24.76W +RWY LPCO 16/34 587 3018 98 40-09-39.60N 008-28-19.60W 40-09-12.24N 008-28-04.40W +RWY LPCS 17/35 325 3969 98 38-43-46.20N 009-21-24.41W 38-43-09.12N 009-21-10.87W +RWY LPEV 01/19 807 4265 75 38-31-40.08N 007-53-24.72W 38-32-21.48N 007-53-20.69W +RWY LPFR 10/28 24 8169 148 37-01-02.28N 007-59-09.92W 37-00-48.24N 007-57-30.82W +RWY LPMR 01/19 187 9816 148 39-49-04.08N 008-53-16.04W 39-50-40.92N 008-53-12.23W +RWY LPMT 01/19 46 7044 148 38-41-59.64N 009-02-18.02W 38-43-10.56N 009-02-07.69W +RWY LPMT 08/26 46 8005 148 38-42-18.00N 009-02-13.81W 38-42-41.76N 009-00-37.48W +RWY LPOV 18/36 56 8005 148 40-55-36.48N 008-38-48.84W 40-54-18.00N 008-38-41.82W +RWY LPPM 11/29 5 2819 98 37-09-01.80N 008-35-18.82W 37-08-53.52N 008-34-45.62W +RWY LPPR 17/35 228 11417 148 41-15-47.88N 008-41-06.86W 41-13-57.00N 008-40-37.92W +RWY LPPT 03/21 374 12484 148 38-45-56.52N 009-08-39.77W 38-47-50.28N 009-07-38.60W +RWY LPPT 17/35 374 7874 148 38-47-10.32N 009-08-13.96W 38-45-54.00N 009-07-53.76W +RWY LPST 14/32 440 5906 131 38-50-12.48N 009-20-48.77W 38-49-31.08N 009-19-56.75W +RWY LPTN 08/26 266 7530 148 39-28-19.56N 008-23-08.56W 39-28-35.76N 008-21-34.85W +RWY LPTN 12/30 266 3937 74 39-28-44.76N 008-22-25.68W 39-28-27.12N 008-21-40.93W +RWY LPVR 02/20 1805 3107 98 41-16-13.08N 007-43-19.81W 41-16-42.24N 007-43-07.50W +RWY LPVZ 01/19 2060 4015 97 40-43-12.00N 007-53-18.60W 40-43-51.60N 007-53-22.38W +RWY LXGB 09/27 15 6000 150 36-09-03.24N 005-21-35.35W 36-09-05.76N 005-20-22.24W +NAV AA NDB 40-26-53.52N 003-32-19.72W 0 355 - +NAV ABT NDB 38-56-38.76N 001-59-51.61W 0 321 - +NAV ACD NDB 40-35-08.52N 003-40-35.44W 0 417 - +NAV ADX NDB 39-32-57.84N 002-23-45.10E 0 384 - +NAV ALM VOR/DME 35-11-27.96N 003-50-30.23W 46 115.00 - +NAV ALR VOR/DME 36-41-27.96N 003-12-56.02E 82 112.50 - +NAV ALT VOR/DME 38-16-05.88N 000-34-12.41W 166 113.80 - +NAV ALU NDB 35-10-52.31N 003-50-40.42W 0 401 - +NAV AM NDB 36-52-32.88N 002-14-23.68W 0 284 - +NAV AMN NDB 36-50-54.24N 002-22-44.98W 0 310 - +NAV AMR VOR/DME 36-49-59.51N 002-15-33.91W 233 114.10 - +NAV AOG TACAN 36-38-52.44N 006-20-56.62W 86 108.60 - +NAV AOG NDB 36-38-31.56N 006-19-00.52W 0 268 - +NAV ARM NDB 37-04-24.61N 003-48-07.49W 0 344 - +NAV ARN NDB 40-57-50.05N 003-07-20.86W 0 291 - +NAV ATE VOR/DME 38-17-09.95N 000-35-11.76W 192 114.65 - +NAV ATR NDB 37-56-59.65N 001-13-49.51W 245 345 - +NAV BAG NDB 41-57-05.40N 003-12-11.05E 0 319 - +NAV BAI NDB 38-09-05.40N 003-37-45.01W 0 418 - +NAV BAN VOR/DME 41-19-24.96N 002-37-47.24W 3717 112.80 - +NAV BBI VOR/DME 41-01-00.48N 005-27-23.18W 2982 112.20 - +NAV BCN VOR/DME 41-18-25.55N 002-06-28.12E 23 116.70 - +NAV BEJ VORTAC 38-07-42.24N 007-55-36.08W 620 115.80 - +NAV BGR VOR/DME 41-56-51.72N 003-12-31.90E 1082 112.20 - +NAV BJ NDB 40-26-48.84N 003-33-45.18W 0 308 - +NAV BJA NDB 36-42-24.12N 005-01-28.99E 0 423 - +NAV BJA NDB 38-09-33.49N 007-55-18.16W 0 376 - +NAV BJZ NDB 38-48-59.76N 006-41-53.48W 0 298 - +NAV BLN VOR/DME 38-09-09.00N 003-37-30.04W 1788 116.20 - +NAV BNA NDB 36-39-03.96N 003-35-29.00E 0 353 - +NAV BRA VOR/DME 40-28-08.76N 003-33-27.14W 1962 116.45 - +NAV BRB NDB 41-55-55.55N 005-40-00.80W 0 292 - +NAV BRG NDB 41-47-48.12N 006-43-31.01W 2241 358 - +NAV BSA VOR/DME 35-30-55.08N 004-24-06.01E 1328 115.90 - +NAV BSA NDB 35-21-01.44N 004-13-30.07E 0 335 - +NAV CA NDB 38-43-32.16N 009-21-29.99W 0 359 - +NAV CAC NDB 39-31-44.04N 006-25-43.86W 0 380 - +NAV CAS VOR/DME 38-44-53.88N 009-21-42.99W 326 114.30 - +NAV CB NDB 40-09-38.16N 008-28-18.98W 0 426 - +NAV CCH NDB 40-54-08.64N 001-17-53.92W 0 375 - +NAV CCS VOR/DME 39-31-28.21N 006-26-05.06W 1394 114.20 - +NAV CDB VOR/DME 37-50-45.25N 004-50-41.93W 325 112.40 - +NAV CDP VOR/DME 39-41-51.72N 003-26-03.73E 778 112.90 - +NAV CEU NDB 35-53-33.36N 005-18-19.58W 39 300 - +NAV CHE NDB 36-36-05.03N 002-11-35.99E 0 397 - +NAV CJN VOR/DME 40-22-19.21N 002-32-40.60W 3501 115.60 - +NAV CLE VOR/DME 41-38-24.00N 002-38-04.81E 1351 115.35 - +NAV CLS VOR/DME 39-42-25.92N 000-59-10.74W 1839 117.55 - +NAV CMA VOR/DME 40-52-02.27N 001-17-52.98W 3150 116.00 - +NAV CNR VOR/DME 40-38-45.60N 003-44-09.02W 2690 117.30 - +NAV COR NDB 37-50-33.72N 004-50-48.52W 0 366 - +NAV COV NDB 40-17-57.11N 007-25-32.99W 0 360 - +NAV CP NDB 38-38-32.28N 009-13-17.47W 0 389 - +NAV CST NDB 39-38-29.04N 002-54-56.23E 0 351 - +NAV CTE NDB 40-23-02.04N 002-31-22.08W 0 362 - +NAV CVT NDB 40-22-04.09N 003-46-24.28W 0 285 - +NAV EAL NDB 38-57-07.93N 003-45-25.20W 0 332 - +NAV EBT NDB 39-37-22.80N 000-28-19.50W 0 386 - +NAV ECV NDB 40-41-57.85N 003-45-45.79W 0 319 - +NAV EEC NDB 37-18-55.44N 006-00-04.72W 0 327 - +NAV ESP VORTAC 38-25-27.48N 009-11-08.81W 648 112.50 - +NAV FAR NDB 37-00-31.32N 007-55-33.35W 0 332 - +NAV FTM VOR/DME 39-39-57.96N 008-29-35.56W 686 113.50 - +NAV GBR TACAN 36-08-34.43N 005-20-33.79W 1397 113.60 - +NAV GDA VOR/DME 37-10-59.52N 003-59-27.28W 1991 113.40 - +NAV GE NDB 40-11-59.27N 003-50-39.37W 0 421 - +NAV GIR VOR/DME 41-55-52.31N 002-46-19.09E 535 114.10 - +NAV GM NDB 36-43-35.41N 004-34-17.22W 0 350 - +NAV GRA NDB 37-11-21.84N 003-40-39.76W 0 412 - +NAV GRS VOR 35-12-33.84N 000-08-56.09E 1686 113.10 - +NAV GRS NDB 35-12-29.89N 000-09-36.00E 0 424 - +NAV HIJ VOR/DME 38-30-29.15N 005-05-58.85W 1841 114.70 - +NAV HMB NDB 35-21-47.15N 000-58-08.00W 0 432 - +NAV HNS NDB 38-30-37.08N 005-06-39.82W 0 346 - +NAV IBA VOR/DME 38-52-05.89N 001-21-57.28E 30 117.80 - +NAV IZA NDB 38-54-55.80N 001-28-13.48E 0 394 - +NAV JER NDB 36-50-04.20N 006-00-58.39W 0 433 - +NAV JIL VOR/DME 36-46-36.12N 005-52-37.99E 49 117.90 - +NAV JOA VOR/DME 39-33-52.92N 002-44-47.87E 26 117.70 - +NAV JRZ VOR/DME 36-48-54.72N 006-01-35.54W 285 113.00 - +NAV LAR NDB 38-59-39.48N 009-02-25.40W 0 382 - +NAV LCZ NDB 37-40-34.68N 000-56-21.40W 0 381 - +NAV LIS VOR/DME 38-53-21.84N 009-09-46.01W 1142 114.80 - +NAV LO NDB 38-51-11.16N 009-05-51.00W 0 401 - +NAV LRD NDB 41-33-10.43N 000-38-52.88E 0 404 - +NAV MA NDB 40-24-02.88N 003-29-26.30W 0 390 - +NAV MAR VOR/DME 37-03-19.09N 004-56-23.60W 2267 112.60 - +NAV MAR NDB 36-41-06.72N 002-46-56.75E 0 416 - +NAV MEL VOR/DME 35-16-49.44N 002-57-29.41W 200 114.25 - +NAV MGA VOR/DME 36-48-51.48N 004-22-10.27W 3396 112.00 - +NAV MHN VOR/DME 39-51-48.60N 004-13-01.88E 325 112.60 - +NAV MIA NDB 35-18-28.08N 002-57-19.87W 381 292 - +NAV MIO NDB 38-42-34.93N 009-02-35.63W 46 322 - +NAV MJV VOR/DME 39-26-06.72N 002-45-29.84E 505 113.30 - +NAV MLA VOR/DME 41-07-46.56N 000-09-54.88E 1184 112.10 - +NAV MLG VOR/DME 36-40-43.32N 004-30-24.01W 75 113.55 - +NAV MLL DME 35-18-26.64N 002-57-19.51W 381 117.40 - +NAV MN NDB 39-50-11.39N 004-12-47.84E 297 344 - +NAV MNF NDB 37-17-40.57N 005-33-43.70W 0 428 - +NAV MOJ TACAN 38-42-31.68N 009-01-59.59W 66 110.00 - +NAV MOS VOR/DME 35-53-54.97N 000-08-11.00E 732 112.20 - +NAV MOS NDB 35-54-33.12N 000-08-14.00E 0 334 - +NAV MRN TACAN 37-10-23.52N 005-37-10.70W 285 115.30 - +NAV MRN VOR/DME 37-10-30.35N 005-37-08.11W 285 115.50 - +NAV MTL NDB 39-54-28.08N 008-53-01.00W 0 336 - +NAV MTN NDB 40-59-19.68N 005-19-47.75W 0 399 - +NAV MTR TACAN 39-49-57.36N 008-53-24.50W 263 109.60 - +NAV NSA VORTAC 39-33-52.92N 007-54-52.99W 1341 115.50 - +NAV NVS VOR/DME 40-22-07.31N 004-14-57.91W 2516 114.95 - +NAV ORA VOR/DME 35-36-45.35N 000-39-17.96W 284 114.00 - +NAV OVR TACAN 40-53-13.20N 008-38-36.06W 102 110.60 - +NAV PA NDB 39-35-57.84N 002-49-16.25E 0 308 - +NAV PDT VOR/DME 40-15-10.44N 003-20-52.91W 2513 116.95 - +NAV PG NDB 41-04-41.15N 008-38-12.01W 0 367 - +NAV PND NDB 39-26-14.64N 000-20-47.26W 0 340 - +NAV POR NDB 41-20-53.16N 008-42-29.02W 0 327 - +NAV POS VOR/DME 39-55-38.64N 003-06-52.49E 1168 116.40 - +NAV PRA VOR/DME 41-16-59.16N 002-04-54.70E 43 114.30 - +NAV PRT VOR/DME 41-16-23.17N 008-41-16.01W 182 114.10 - +NAV PTC NDB 39-25-38.28N 003-15-24.19E 0 401 - +NAV RBO VOR/DME 40-51-14.04N 003-14-47.87W 3119 113.95 - +NAV RES VOR/DME 41-08-58.92N 001-10-16.03E 272 114.20 - +NAV RMA NDB 36-39-32.04N 004-28-36.26W 0 330 - +NAV RS NDB 40-23-21.84N 003-33-44.14W 0 326 - +NAV RUS NDB 41-08-52.08N 001-08-46.10E 0 424 - +NAV SBD NDB 41-31-09.85N 002-06-10.98E 0 367 - +NAV SCA NDB 40-55-37.92N 005-36-59.72W 0 423 - +NAV SDM VOR 36-37-50.52N 002-58-27.37E 0 113.90 - +NAV SGO NDB 39-40-27.11N 000-12-28.10W 0 356 - +NAV SGR VOR/DME 37-05-02.04N 008-56-47.00W 500 113.90 - +NAV SIE VOR/DME 41-09-06.12N 003-36-16.81W 5659 115.40 - +NAV SLL VOR/DME 41-31-11.64N 002-06-35.10E 499 112.00 - +NAV SMR NDB 36-41-34.45N 003-05-23.53E 0 370 - +NAV SPP NDB 37-25-05.15N 005-47-43.87W 0 420 - +NAV SRA VORTAC 38-49-45.12N 009-20-24.00W 440 112.10 - +NAV SSJ TACAN 39-33-34.92N 002-43-59.70E 32 108.40 - +NAV SSY VOR/DME 40-32-47.03N 003-34-30.68W 2012 117.85 - +NAV SVL VOR/DME 37-25-40.43N 005-45-43.96W 404 113.70 - +NAV TAB TACAN 38-56-44.88N 001-51-48.60W 2320 108.00 - +NAV TBC TACAN 38-53-29.77N 006-49-07.25W 609 108.80 - +NAV TEO NDB 39-58-22.08N 004-20-45.89W 0 385 - +NAV TGR TACAN 37-07-57.00N 003-38-01.68W 2304 113.10 - +NAV TJA NDB 40-34-05.16N 003-21-26.24W 0 426 - +NAV TJZ TACAN 40-29-56.04N 003-26-43.76W 2011 112.50 - +NAV TLD VOR/DME 39-58-10.21N 004-20-14.89W 1946 113.20 - +NAV TLM VOR/DME 35-02-07.08N 001-23-17.02W 1001 116.50 - +NAV TLM NDB 35-02-24.00N 001-22-04.01W 0 346 - +NAV TNG VOR/DME 35-43-44.04N 005-53-26.99W 105 115.90 - +NAV TOB NDB 39-46-59.52N 003-28-31.40W 0 403 - +NAV TON NDB 41-55-40.43N 000-30-49.81W 0 335 - +NAV TRB VOR/DME 35-20-52.08N 001-30-54.00E 2902 116.30 - +NAV TRB NDB 35-20-44.87N 001-30-02.02E 0 389 - +NAV TRL TACAN 37-57-03.96N 001-13-45.01W 243 116.60 - +NAV TSC TACAN 40-57-18.72N 005-30-08.93W 2595 113.30 - +NAV TTN VOR/DME 35-35-42.00N 005-19-28.99W 49 117.30 - +NAV TUN NDB 35-36-56.88N 005-16-45.01W 0 388 - +NAV TVD TACAN 41-42-14.77N 004-50-59.32W 2787 108.20 - +NAV VAB VOR/DME 38-56-37.69N 002-00-09.61W 2277 115.80 - +NAV VBZ VOR/DME 38-53-23.64N 006-48-56.70W 597 116.80 - +NAV VFA VOR/DME 37-00-48.60N 007-58-30.04W 50 112.80 - +NAV VGD NDB 41-00-05.75N 006-26-40.99W 0 365 - +NAV VGE VOR 40-17-21.12N 003-43-37.56W 0 112.50 - +NAV VGE TACAN 40-17-21.12N 003-43-37.56W 2029 112.05 - +NAV VIS VOR/DME 40-43-23.88N 007-53-08.99W 2109 113.10 - +NAV VJF VOR/DME 36-14-49.92N 005-58-18.73W 728 117.80 - +NAV VJZ VOR/DME 40-33-50.75N 003-21-37.19W 2380 115.10 - +NAV VLA VOR/DME 41-20-33.37N 001-32-51.72E 2077 113.15 - +NAV VLC VOR/DME 39-29-08.16N 000-28-58.96W 200 116.10 - +NAV VLD NDB 41-47-22.20N 004-44-20.69W 0 342 - +NAV VNV NDB 41-12-38.17N 001-42-21.02E 0 380 - +NAV VR NDB 41-12-55.09N 007-44-38.00W 0 304 - +NAV VSJ TACAN 37-46-47.64N 000-48-46.40W 11 113.00 - +NAV VSJ VOR/DME 37-46-47.28N 000-48-46.00W 11 113.00 - +NAV VTB VOR/DME 39-46-50.88N 003-27-50.51W 2320 112.70 - +NAV YES VOR/DME 38-21-38.89N 002-21-09.90W 4793 115.20 - +NAV ZAR VOR/DME 41-39-28.45N 001-01-51.10W 876 113.00 - +NAV ZEM VOR/DME 36-47-41.99N 003-34-14.99E 154 116.60 - +NAV ZEM NDB 36-47-45.96N 003-34-18.98E 0 359 - +NAV ZMR VOR/DME 41-31-48.72N 005-38-22.92W 2093 117.10 - +NAV ZMR NDB 41-31-42.24N 005-39-06.26W 0 300 - +NAV ZRZ NDB 41-43-49.80N 001-11-35.92W 0 389 - +NAV ZZA NDB 41-35-56.04N 000-52-40.67W 0 348 - +ILS 32R ILS/DME MBB 109.10 40-29-49.32N 003-33-36.14W 40-28-13.88N 003-31-59.62W 1938 5 322.2 3 +ILS 32L ILS/DME MAA 109.90 40-29-13.32N 003-34-41.44W 40-27-22.40N 003-32-49.30W 1938 5 322.2 3 +ILS 18L ILS/DME IML 111.50 40-29-54.24N 003-33-33.11W 40-31-57.48N 003-33-31.01W 2074 5 179.8 3 +ILS 18R ILS/DME IMR 110.70 40-29-23.64N 003-34-28.62W 40-31-54.60N 003-34-26.71W 2074 5 179.8 3 +ILS 02 ILS/DME BLT 108.75 41-18-43.03N 002-05-45.16E 41-17-15.10N 002-05-02.69E 59 5 19.0 3 +ILS 07L ILS/DME QAA 110.30 41-18-24.53N 002-06-25.18E 41-17-30.08N 002-03-53.09E 19 5 65.6 3 +ILS 25R ILS/DME BCA 109.50 41-17-28.98N 002-03-42.66E 41-18-23.44N 002-06-14.74E 43 5 245.6 3 +ILS 07R ILS/DME BLE 110.75 41-17-35.94N 002-06-23.55E 41-16-53.36N 002-04-26.35E 19 5 65.6 3 +ILS 25L ILS/DME BLW 111.50 41-16-52.26N 002-04-15.92E 41-17-34.84N 002-06-13.12E 43 5 245.6 3 +ILS 06L ILS/DME PLM 110.90 39-33-50.08N 002-44-46.20E 39-32-46.85N 002-42-37.07E 13 5 58.5 3 +ILS 24R ILS PAA 109.90 39-32-44.48N 002-42-27.92E 39-33-47.71N 002-44-37.04E 67 5 238.5 3 +ILS 24L ILS/DME IPAL 109.30 39-32-23.63N 002-43-43.52E 39-33-21.80N 002-45-43.06E 67 5 238.7 3 +ILS 13 ILS/DME GMM 109.50 36-39-48.99N 004-28-59.91W 36-41-01.88N 004-30-43.49W 106 5 131.5 3 +ILS 31 ILS/DME GAA 109.90 36-41-10.65N 004-30-54.37W 36-39-57.76N 004-29-10.77W 0 5 311.5 3 diff -Nru acm-5.0/objects/zones/europe/united-kingdom.txt acm-6.0+20200416/objects/zones/europe/united-kingdom.txt --- acm-5.0/objects/zones/europe/united-kingdom.txt 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/objects/zones/europe/united-kingdom.txt 2020-04-16 12:05:39.000000000 +0000 @@ -0,0 +1,463 @@ +# United Kingdom zone. +# Created: 2020-04-16 +# Latitude range: [50N, 60N[ +# Longitude range: [010W, 002E[ +# 2017-11-01 Source: http://ourairports.com + +GROUND_COLOR #305030 + +RWY EG74 06/24 467 9842 197 52-28-47.64N 001-08-58.13W 52-29-38.40N 001-06-42.66W +RWY EGAA 07/25 268 9121 148 54-39-08.28N 006-14-06.86W 54-39-46.08N 006-11-46.25W +RWY EGAA 17/35 268 6401 148 54-39-28.44N 006-13-43.03W 54-38-33.36N 006-13-11.96W +RWY EGAB 15/33 155 4350 98 54-24-11.88N 007-39-29.99W 54-23-38.04N 007-38-42.00W +RWY EGAC 04/22 15 6001 148 54-36-41.04N 005-52-50.59W 54-37-29.64N 005-51-51.95W +RWY EGAE 02/20 22 3955 148 55-02-12.12N 007-09-55.44W 55-02-49.20N 007-09-35.03W +RWY EGAE 08/26 22 6076 147 55-02-25.44N 007-10-30.18W 55-02-42.72N 007-08-50.39W +RWY EGBB 15/33 327 8527 151 52-27-56.16N 001-45-40.00W 52-26-47.04N 001-44-22.99W +RWY EGBE 05/23 267 5988 151 52-21-51.84N 001-29-21.41W 52-22-31.80N 001-28-10.45W +RWY EGBG 04/22 469 1608 59 52-36-12.96N 001-01-46.99W 52-36-25.92N 001-01-32.02W +RWY EGBG 06/24 469 1099 98 52-36-19.08N 001-01-50.99W 52-36-24.84N 001-01-37.99W +RWY EGBG 10/28 469 3084 98 52-36-29.16N 001-02-19.00W 52-36-25.92N 001-01-31.01W +RWY EGBG 15/33 469 1624 59 52-36-28.08N 001-02-02.00W 52-36-14.04N 001-01-48.00W +RWY EGBG 16/34 469 1371 98 52-36-27.00N 001-01-58.01W 52-36-15.48N 001-01-47.50W +RWY EGBJ 04/22 101 3218 112 51-53-18.96N 002-10-05.27W 51-53-45.24N 002-09-36.29W +RWY EGBJ 09/27 101 4656 112 51-53-36.96N 002-10-37.99W 51-53-40.92N 002-09-24.08W +RWY EGBJ 18/36 101 2625 59 51-53-48.12N 002-09-58.00W 51-53-22.92N 002-09-54.00W +RWY EGBN 03/21 138 2693 75 52-55-00.12N 001-04-45.98W 52-55-23.16N 001-04-25.00W +RWY EGBN 09/27 138 3445 98 52-55-10.92N 001-05-08.99W 52-55-12.00N 001-04-12.00W +RWY EGBO 04/22 283 2083 59 52-30-57.96N 002-15-58.00W 52-31-15.96N 002-15-38.02W +RWY EGBO 10/28 283 2624 75 52-31-02.28N 002-16-02.50W 52-30-58.68N 002-15-20.45W +RWY EGBO 16/34 283 3878 75 52-31-20.64N 002-15-47.63W 52-30-45.36N 002-15-22.36W +RWY EGBP 08/26 433 6591 148 51-39-59.76N 002-04-15.89W 51-40-10.56N 002-02-32.75W +RWY EGBT 09/27 448 3002 60 52-02-26.52N 001-06-07.99W 52-02-26.88N 001-05-21.01W +RWY EGBW 05/23 159 1932 59 52-11-13.92N 001-37-04.01W 52-11-27.60N 001-36-41.00W +RWY EGBW 18/36 159 3009 75 52-11-47.04N 001-36-54.00W 52-11-17.16N 001-36-50.00W +RWY EGCC 05L/23R 257 10000 150 53-20-42.36N 002-17-33.86W 53-21-44.64N 002-15-25.70W +RWY EGCC 05R/23L 257 9997 150 53-19-55.20N 002-18-38.38W 53-20-56.76N 002-16-29.96W +RWY EGCK 02/20 1 3534 75 53-05-58.20N 004-20-32.57W 53-06-31.68N 004-20-19.43W +RWY EGCK 08/26 1 2887 75 53-06-02.16N 004-20-35.99W 53-06-11.88N 004-19-48.22W +RWY EGCN 02/20 55 9491 197 53-27-44.64N 001-00-40.14W 53-29-13.56N 000-59-51.86W +RWY EGCW 04/22 233 3346 59 52-37-29.28N 003-09-27.94W 52-37-55.92N 003-08-56.40W +RWY EGDC 10/28 27 6014 151 51-05-13.56N 004-09-48.64W 51-05-13.92N 004-08-14.46W +RWY EGDM 05/23 407 10538 150 51-08-38.76N 001-46-07.00W 51-09-43.20N 001-44-04.27W +RWY EGDM 17/35 407 6278 150 51-09-41.76N 001-44-01.28W 51-08-41.28N 001-43-38.39W +RWY EGDR 07/25 267 3372 151 50-05-06.72N 005-15-48.49W 50-05-22.20N 005-15-01.76W +RWY EGDR 12/30 267 6006 151 50-05-18.96N 005-15-57.28W 50-04-55.92N 005-14-32.46W +RWY EGDR 18/36 267 3448 151 50-05-24.00N 005-15-06.73W 50-04-49.80N 005-15-05.29W +RWY EGDX 08/26 163 5988 141 51-24-10.08N 003-26-45.64W 51-24-27.36N 003-25-15.31W +RWY EGDY 04/22 75 4797 151 51-00-13.32N 002-38-39.08W 51-00-51.12N 002-37-53.83W +RWY EGDY 09/27 75 7580 151 51-00-25.20N 002-39-42.19W 51-00-34.20N 002-37-44.54W +RWY EGEC 11/29 42 10003 151 55-26-27.60N 005-42-34.34W 55-26-00.24N 005-39-47.66W +RWY EGEO 01/19 20 4068 98 56-27-18.36N 005-24-19.40W 56-27-53.64N 005-24-04.57W +RWY EGFA 08/26 428 3031 75 52-06-50.40N 004-33-48.10W 52-06-59.76N 004-33-01.91W +RWY EGFE 03/21 159 5000 148 51-49-37.56N 004-57-59.90W 51-50-20.40N 004-57-20.45W +RWY EGFE 09/27 159 3412 148 51-50-02.04N 004-58-13.01W 51-50-03.12N 004-57-19.01W +RWY EGFF 12/30 220 7848 151 51-24-05.40N 003-21-31.25W 51-23-30.48N 003-19-40.76W +RWY EGFH 04/22 299 4429 151 51-35-59.64N 004-04-27.16W 51-36-36.36N 004-03-43.74W +RWY EGFH 10/28 299 2812 151 51-36-04.32N 004-04-34.54W 51-36-01.44N 004-03-50.29W +RWY EGGD 09/27 622 6598 151 51-22-55.56N 002-44-00.60W 51-22-59.52N 002-42-16.81W +RWY EGGP 09/27 80 7500 151 53-19-58.44N 002-51-57.67W 53-20-03.84N 002-49-57.68W +RWY EGGW 08/26 526 7086 151 51-52-19.20N 000-23-00.78W 51-52-37.92N 000-21-12.00W +RWY EGHH 08/26 38 7451 151 50-46-39.00N 001-51-28.55W 50-46-57.72N 001-49-36.44W +RWY EGHI 02/20 44 5653 121 50-56-34.80N 001-21-39.17W 50-57-27.36N 001-21-09.86W +RWY EGHL 09/27 618 5896 131 51-11-13.20N 001-02-47.15W 51-11-17.52N 001-01-14.84W +RWY EGHQ 12/30 390 9006 285 50-26-49.20N 005-00-43.31W 50-26-04.20N 004-58-43.54W +RWY EGKA 02/20 7 3399 59 50-49-55.20N 000-17-58.31W 50-50-23.64N 000-17-40.54W +RWY EGKA 07/25 7 2877 164 50-49-57.36N 000-18-01.05W 50-50-10.32N 000-17-20.16W +RWY EGKA 13/31 7 1312 98 50-50-17.88N 000-17-40.28W 50-50-10.32N 000-17-23.07W +RWY EGKB 03/21 598 5912 148 51-19-24.96N 000-01-37.41E 51-20-17.88N 000-02-16.98E +RWY EGKB 11/29 598 2598 59 51-19-24.60N 000-01-40.18E 51-19-17.76N 000-02-19.60E +RWY EGKC 02/20 1 1995 59 50-47-57.12N 000-39-42.40W 50-48-12.60N 000-39-23.44W +RWY EGKK 08L/26R 202 8415 148 51-08-48.84N 000-12-45.25W 51-09-06.48N 000-10-36.53W +RWY EGKK 08R/26L 202 10364 148 51-08-42.36N 000-12-44.33W 51-09-04.32N 000-10-05.49W +RWY EGLC 09/27 19 4948 98 51-30-20.16N 000-02-39.06E 51-30-17.64N 000-03-57.16E +RWY EGLF 06/24 238 8005 148 51-16-14.16N 000-47-31.36W 51-16-50.88N 000-45-40.18W +RWY EGLJ 18/36 240 4167 151 51-40-59.88N 001-04-37.52W 51-40-18.84N 001-04-35.18W +RWY EGLK 07/25 325 4380 151 51-19-19.56N 000-51-23.84W 51-19-32.52N 000-50-18.16W +RWY EGLL 09L/27R 83 12799 164 51-28-39.00N 000-29-21.94W 51-28-39.72N 000-25-59.75W +RWY EGLL 09R/27L 83 12001 148 51-27-53.64N 000-29-12.38W 51-27-54.00N 000-26-02.67W +RWY EGLM 03/21 131 3363 148 51-29-44.52N 000-46-04.82W 51-30-14.40N 000-46-06.95W +RWY EGLM 07/25 131 3642 148 51-29-54.96N 000-46-53.98W 51-30-09.72N 000-46-04.82W +RWY EGLM 11/29 131 3051 98 51-29-58.92N 000-46-47.09W 51-29-49.20N 000-46-04.83W +RWY EGMC 05/23 49 5023 121 51-34-01.92N 000-41-10.56E 51-34-32.16N 000-42-17.99E +RWY EGMD 03/21 13 4938 121 50-57-01.80N 000-56-00.11E 50-57-41.76N 000-56-40.81E +RWY EGMD 14/32 13 2264 115 50-57-29.16N 000-56-00.00E 50-57-12.96N 000-56-23.00E +RWY EGNC 01/19 190 3077 75 54-56-06.00N 002-48-41.00W 54-56-36.24N 002-48-40.00W +RWY EGNC 07/25 190 6075 98 54-55-59.88N 002-49-17.00W 54-56-30.12N 002-47-47.00W +RWY EGNE 03/21 91 5522 98 53-16-25.32N 000-57-24.59W 53-17-14.64N 000-56-45.41W +RWY EGNE 08/26 91 2662 150 53-16-37.92N 000-58-09.00W 53-16-42.96N 000-57-26.00W +RWY EGNE 15/33 91 2764 150 53-16-54.84N 000-58-00.00W 53-16-33.96N 000-57-31.00W +RWY EGNH 07/25 34 2621 98 53-46-20.64N 003-02-28.79W 53-46-30.36N 003-01-48.36W +RWY EGNH 10/28 34 6132 151 53-46-19.92N 003-02-33.68W 53-46-15.24N 003-00-51.98W +RWY EGNH 13/31 34 3533 75 53-46-28.20N 003-02-37.43W 53-46-06.96N 003-01-50.66W +RWY EGNJ 02/20 121 7205 148 53-33-55.08N 000-21-25.41W 53-35-00.96N 000-20-40.00W +RWY EGNJ 08/26 121 3458 98 53-34-32.88N 000-21-12.49W 53-34-37.56N 000-20-15.69W +RWY EGNL 05/23 173 3438 151 54-07-26.04N 003-15-58.00W 54-07-48.00N 003-15-15.01W +RWY EGNL 12/30 173 1326 151 54-07-58.08N 003-16-13.22W 54-07-42.96N 003-15-11.92W +RWY EGNL 17/35 173 3318 151 54-07-59.16N 003-16-09.44W 54-07-27.48N 003-15-56.05W +RWY EGNM 14/32 681 7382 150 53-52-24.24N 001-40-19.45W 53-51-30.24N 001-38-56.65W +RWY EGNO 08/26 55 7946 151 53-44-29.04N 002-54-04.61W 53-44-54.24N 002-51-59.44W +RWY EGNO 14/32 55 4189 98 53-44-43.44N 002-53-49.52W 53-44-15.00N 002-52-57.43W +RWY EGNR 04/22 45 6702 148 53-10-16.32N 002-59-15.50W 53-11-06.00N 002-58-03.47W +RWY EGNS 03/21 52 3934 151 54-04-40.08N 004-37-54.01W 54-05-14.28N 004-37-23.23W +RWY EGNS 08/26 52 5751 151 54-04-54.12N 004-38-12.98W 54-05-04.92N 004-36-40.00W +RWY EGNS 17/35 52 2963 89 54-05-07.08N 004-37-49.01W 54-04-41.88N 004-37-39.00W +RWY EGNT 07/25 266 7642 151 55-02-00.60N 001-42-22.82W 55-02-32.28N 001-40-23.77W +RWY EGNV 05/23 120 7516 151 54-30-07.92N 001-26-32.75W 54-30-58.32N 001-24-58.97W +RWY EGNX 09/27 306 9491 151 52-49-50.16N 001-20-58.45W 52-49-53.04N 001-18-24.01W +RWY EGOD 05/23 30 4328 151 52-48-20.88N 004-08-02.08W 52-48-48.96N 004-07-09.30W +RWY EGOD 15/33 30 4207 151 52-48-55.44N 004-08-07.80W 52-48-19.08N 004-07-34.39W +RWY EGOD 17/35 30 7500 151 52-48-55.08N 004-07-49.01W 52-47-42.00N 004-07-27.34W +RWY EGOE 05/23 272 3215 150 52-52-14.52N 002-32-09.71W 52-52-36.84N 002-31-35.62W +RWY EGOE 10/28 272 3110 150 52-52-24.60N 002-32-24.61W 52-52-20.28N 002-31-36.55W +RWY EGOQ 04/22 202 5180 150 53-15-14.04N 004-22-51.46W 53-15-54.36N 004-21-59.83W +RWY EGOS 05/23 249 4523 151 52-47-33.72N 002-40-36.05W 52-48-05.40N 002-39-44.32W +RWY EGOS 18/36 249 6018 151 52-48-06.48N 002-40-04.73W 52-47-07.44N 002-40-04.55W +RWY EGOV 01/19 37 5377 151 53-14-36.96N 004-32-26.02W 53-15-29.16N 004-32-16.40W +RWY EGOV 08/26 37 2200 151 53-14-44.88N 004-32-44.99W 53-14-58.92N 004-31-40.15W +RWY EGOV 13/31 37 7513 151 53-15-13.68N 004-32-46.32W 53-14-25.80N 004-31-12.90W +RWY EGOW 03/21 37 5405 150 53-34-31.08N 003-03-49.79W 53-35-17.52N 003-03-04.79W +RWY EGOW 08/26 37 3505 148 53-34-39.00N 003-04-05.38W 53-34-44.76N 003-03-08.14W +RWY EGPA 06/24 50 3881 151 58-57-20.88N 002-54-42.73W 58-57-41.04N 002-53-39.98W +RWY EGPA 09/27 50 4685 151 58-57-27.72N 002-54-46.51W 58-57-29.88N 002-53-16.19W +RWY EGPA 15/33 50 2231 59 58-57-37.80N 002-54-33.19W 58-57-23.76N 002-54-10.91W +RWY EGPB 06H/24H 20 1804 148 59-52-29.28N 001-17-25.69W 59-52-39.72N 001-16-57.65W +RWY EGPB 09/27 20 3871 151 59-52-50.88N 001-18-18.94W 59-52-55.20N 001-17-03.59W +RWY EGPB 15/33 20 4678 151 59-52-54.84N 001-18-01.76W 59-52-17.76N 001-17-07.08W +RWY EGPC 08/26 126 3399 148 58-27-20.88N 003-06-05.80W 58-27-29.16N 003-05-03.91W +RWY EGPC 13/31 126 5988 148 58-27-49.32N 003-06-19.69W 58-27-13.68N 003-04-49.55W +RWY EGPD 05/23 215 1893 151 57-12-12.96N 002-12-10.01W 57-12-25.92N 002-11-44.99W +RWY EGPD 14/32 215 2165 75 57-12-14.04N 002-12-06.98W 57-11-57.84N 002-11-41.50W +RWY EGPD 16/34 215 6001 151 57-12-34.20N 002-12-12.28W 57-11-39.48N 002-11-31.78W +RWY EGPD 18/36 215 853 75 57-12-16.92N 002-12-06.01W 57-12-08.64N 002-12-05.72W +RWY EGPE 05/23 31 6191 151 57-32-13.20N 004-03-34.24W 57-32-52.80N 004-02-08.05W +RWY EGPE 12/30 31 2297 59 57-32-40.56N 004-03-35.53W 57-32-33.00N 004-02-55.72W +RWY EGPF 05/23 26 8720 151 55-51-48.60N 004-26-56.62W 55-52-47.64N 004-25-05.92W +RWY EGPF 09/27 26 3622 151 55-52-19.92N 004-26-40.99W 55-52-19.20N 004-25-38.10W +RWY EGPH 06/24 135 8400 150 55-56-38.40N 003-23-24.50W 55-57-21.24N 003-21-18.22W +RWY EGPH 08/26 135 2621 150 55-56-48.48N 003-21-21.64W 55-56-57.48N 003-20-37.28W +RWY EGPH 12/30 135 5730 150 55-57-04.68N 003-21-33.98W 55-56-37.68N 003-20-05.64W +RWY EGPI 08/26 56 2083 59 55-40-57.36N 006-15-32.51W 55-41-03.84N 006-14-57.98W +RWY EGPI 13/31 56 5069 151 55-41-12.84N 006-16-45.98W 55-40-54.12N 006-15-24.16W +RWY EGPK 03/21 65 6000 148 55-29-18.24N 004-35-14.68W 55-30-12.24N 004-34-32.74W +RWY EGPK 12/30 65 9800 150 55-30-59.04N 004-36-53.14W 55-30-08.64N 004-34-28.13W +RWY EGPL 06/24 19 6024 151 57-28-35.04N 007-22-31.01W 57-29-08.88N 007-21-00.25W +RWY EGPL 17/35 19 4003 151 57-29-12.84N 007-21-56.70W 57-28-34.32N 007-21-40.25W +RWY EGPN 09/27 17 4593 98 56-27-09.00N 003-02-13.85W 56-27-08.64N 003-00-52.13W +RWY EGPO 06/24 26 3281 75 58-12-43.56N 006-20-08.92W 58-12-59.40N 006-19-15.78W +RWY EGPO 18/36 26 7218 151 58-13-31.44N 006-19-58.58W 58-12-20.88N 006-19-45.12W +RWY EGPU 05/23 38 4600 98 56-29-42.00N 006-52-37.88W 56-30-12.96N 006-51-37.87W +RWY EGPU 11/29 38 2690 62 56-30-10.08N 006-52-45.98W 56-30-01.08N 006-52-00.01W +RWY EGPU 17/35 38 1968 58 56-30-27.00N 006-52-39.00W 56-30-07.92N 006-52-32.02W +RWY EGQK 07/25 22 7582 151 57-38-45.60N 003-34-43.75W 57-39-10.44N 003-32-32.57W +RWY EGQL 04/22 38 4803 151 56-22-11.64N 002-52-27.44W 56-22-49.80N 002-51-36.72W +RWY EGQL 09/27 38 8491 150 56-22-22.80N 002-52-54.16W 56-22-35.04N 002-50-24.90W +RWY EGQS 05/23 42 9091 150 57-41-52.80N 003-21-12.31W 57-42-57.60N 003-19-16.72W +RWY EGQS 10/28 42 6066 150 57-42-26.28N 003-20-37.82W 57-42-19.44N 003-18-46.84W +RWY EGSC 05/23 47 6447 151 52-11-57.48N 000-09-50.48E 52-12-38.52N 000-11-09.53E +RWY EGSC 05G/23G 47 2949 115 52-12-11.16N 000-10-32.14E 52-12-29.88N 000-11-08.40E +RWY EGSC 10/28 47 2293 115 52-12-11.88N 000-10-07.18E 52-12-07.92N 000-10-43.49E +RWY EGSF 10/28 26 3238 75 52-28-06.96N 000-15-30.00W 52-28-04.08N 000-14-38.00W +RWY EGSF 16/34 26 2625 141 52-28-06.96N 000-15-27.00W 52-27-43.92N 000-15-06.00W +RWY EGSH 04/22 117 4154 148 52-40-27.48N 001-16-55.49E 52-41-00.24N 001-17-35.56E +RWY EGSH 09/27 117 6040 148 52-40-32.88N 001-16-08.58E 52-40-33.60N 001-17-46.57E +RWY EGSS 04/22 348 10003 151 51-52-30.36N 000-13-11.73E 51-53-42.72N 000-15-00.16E +RWY EGSU 06/24 125 4931 148 52-05-12.84N 000-07-25.00E 52-05-36.96N 000-08-32.00E +RWY EGSU 06L/24R 125 2887 82 52-05-21.84N 000-07-31.00E 52-05-36.96N 000-08-11.00E +RWY EGSX 02/20 321 6332 148 51-42-56.88N 000-09-12.03E 51-43-56.64N 000-09-39.61E +RWY EGSX 13/31 321 3005 148 51-43-31.44N 000-08-47.53E 51-43-13.80N 000-09-26.14E +RWY EGTC 03/21 358 5902 151 52-03-54.72N 000-37-24.95W 52-04-44.40N 000-36-35.27W +RWY EGTC 18/36 358 2033 59 52-04-23.88N 000-37-15.40W 52-04-04.08N 000-37-12.84W +RWY EGTE 08/26 102 6834 151 50-43-55.20N 003-25-41.30W 50-44-11.40N 003-23-58.20W +RWY EGTE 13/31 102 4393 151 50-44-18.60N 003-25-37.34W 50-43-57.00N 003-24-38.20W +RWY EGTK 01/19 270 4327 75 51-49-51.96N 001-19-12.00W 51-50-30.84N 001-19-00.01W +RWY EGTK 03/21 270 2887 154 51-49-49.08N 001-19-05.99W 51-50-16.08N 001-18-47.99W +RWY EGTK 09/27 270 2887 148 51-50-04.56N 001-19-31.01W 51-50-06.00N 001-18-47.02W +RWY EGTK 11/29 270 2493 92 51-50-25.80N 001-19-22.19W 51-50-16.80N 001-18-45.00W +RWY EGTP 01/19 330 2054 88 50-19-40.80N 005-10-30.68W 50-20-00.96N 005-10-27.23W +RWY EGTP 05/23 330 3084 59 50-19-39.00N 005-11-03.73W 50-20-00.96N 005-10-30.65W +RWY EGTP 09/27 330 2461 75 50-19-44.04N 005-11-09.28W 50-19-45.48N 005-10-31.44W +RWY EGTU 04/22 839 3176 150 50-51-22.32N 003-14-16.80W 50-51-46.08N 003-13-44.40W +RWY EGTU 09/27 839 2845 150 50-51-51.48N 003-14-25.01W 50-51-55.08N 003-13-41.02W +RWY EGTU 17/35 839 2113 65 50-51-51.84N 003-14-06.00W 50-51-30.96N 003-13-59.99W +RWY EGUB 01/19 226 5981 150 51-36-24.84N 001-05-51.54W 51-37-23.16N 001-05-38.65W +RWY EGUB 06/24 226 4782 100 51-36-53.64N 001-06-08.39W 51-37-19.92N 001-05-05.39W +RWY EGUL 06/24 32 9000 150 52-24-09.00N 000-32-39.78E 52-24-59.04N 000-34-39.53E +RWY EGUN 11/29 33 9221 200 52-21-51.48N 000-28-04.80E 52-21-31.32N 000-30-29.40E +RWY EGUO 01/19 593 3593 150 51-26-16.08N 002-17-08.99W 51-26-51.36N 002-17-04.06W +RWY EGUO 07/25 593 5459 151 51-26-15.72N 002-17-27.02W 51-26-38.40N 002-16-08.98W +RWY EGUW 05/23 284 7953 151 52-07-14.16N 000-56-37.68E 52-08-03.48N 000-58-06.71E +RWY EGUY 09/27 135 8255 200 52-21-18.72N 000-07-28.39W 52-21-29.16N 000-05-16.54W +RWY EGUY 15/33 135 2500 59 52-21-37.08N 000-06-55.29W 52-21-15.48N 000-06-35.88W +RWY EGVA 09/27 286 9994 200 51-40-58.80N 001-48-43.20W 51-41-02.40N 001-46-04.80W +RWY EGVN 08/26 288 10007 184 51-44-45.96N 001-36-14.87W 51-45-14.04N 001-33-42.44W +RWY EGVO 09/27 405 6030 141 51-14-04.20N 000-57-21.19W 51-14-01.68N 000-55-46.66W +RWY EGWC 06/24 272 3890 150 52-38-15.72N 002-18-45.76W 52-38-36.24N 002-17-52.22W +RWY EGWU 07/25 124 5545 151 51-33-00.36N 000-25-51.67W 51-33-19.08N 000-24-29.40W +RWY EGXC 07/25 25 9003 200 53-05-21.48N 000-11-08.03W 53-05-49.20N 000-08-48.09W +RWY EGXD 10/28 117 4469 151 54-08-38.04N 001-25-40.58W 54-08-35.88N 001-24-25.60W +RWY EGXD 15/33 117 6096 151 54-08-38.76N 001-25-36.91W 54-07-45.84N 001-24-46.44W +RWY EGXE 16/34 132 7520 150 54-18-06.84N 001-32-33.40W 54-16-59.52N 001-31-41.45W +RWY EGXG 06/24 29 6158 151 53-49-46.56N 001-12-26.06W 53-50-21.48N 001-11-02.29W +RWY EGXG 16/34 29 5466 151 53-50-39.12N 001-12-10.08W 53-49-50.16N 001-11-33.04W +RWY EGXH 09/27 174 9012 200 52-20-27.60N 000-45-11.20E 52-20-40.92N 000-47-34.46E +RWY EGXP 04/22 202 8990 200 53-17-55.32N 000-33-51.67W 53-19-01.92N 000-32-14.31W +RWY EGXT 08/26 273 9052 200 52-36-34.20N 000-29-43.80W 52-37-00.12N 000-27-24.00W +RWY EGXU 03/21 53 6020 150 54-02-32.64N 001-15-37.51W 54-03-23.04N 001-14-44.74W +RWY EGXU 10/28 53 4394 150 54-02-58.20N 001-15-45.50W 54-02-53.52N 001-14-32.32W +RWY EGXW 02/20 231 9000 200 53-09-16.92N 000-31-53.33W 53-10-39.36N 000-30-58.79W +RWY EGXY 07/25 228 5994 150 53-01-01.92N 000-55-41.84W 53-01-28.56N 000-54-14.49W +RWY EGXY 12/30 228 4239 150 53-01-16.32N 000-55-29.64W 53-00-55.44N 000-54-29.62W +RWY EGXY 16/34 228 4419 150 53-01-38.28N 000-54-55.25W 53-01-00.48N 000-54-19.93W +RWY EGXZ 03/21 92 5951 150 54-11-51.72N 001-23-13.42W 54-12-47.52N 001-22-35.29W +RWY EGXZ 13/31 92 4140 150 54-12-33.12N 001-23-19.97W 54-12-09.36N 001-22-23.59W +RWY EGYD 01/19 218 4803 147 53-01-15.96N 000-29-07.49W 53-02-02.40N 000-28-56.39W +RWY EGYD 09/27 218 6831 147 53-01-43.32N 000-30-20.53W 53-01-50.88N 000-28-43.47W +RWY EGYD 09R/27L 218 2354 131 53-01-46.56N 000-29-57.08W 53-01-46.56N 000-29-18.58W +RWY EGYE 06/24 367 6007 151 52-57-30.96N 000-34-18.70W 52-58-02.64N 000-32-55.95W +RWY EGYE 11/29 367 4206 151 52-57-37.08N 000-34-20.14W 52-57-27.72N 000-33-13.22W +RWY EGYE 18/36 367 2657 75 52-57-54.00N 000-33-22.20W 52-57-29.52N 000-33-20.40W +RWY EGYM 01/19 75 6086 300 52-38-21.12N 000-33-20.63E 52-39-17.64N 000-33-34.84E +RWY EGYM 06/24 75 9140 200 52-38-28.32N 000-32-00.73E 52-39-19.08N 000-34-02.65E +RWY EICK 07/25 502 4298 148 51-50-29.76N 008-29-45.60W 51-50-49.20N 008-28-44.83W +RWY EICK 17/35 502 6998 148 51-51-01.08N 008-29-47.18W 51-49-56.28N 008-29-08.84W +RWY EICM 08/26 81 4003 98 53-17-55.68N 008-57-01.91W 53-18-05.40N 008-55-58.48W +RWY EIDL 03/21 30 4908 98 55-02-16.44N 008-20-42.29W 55-03-01.80N 008-20-13.16W +RWY EIDW 10/28 242 8652 148 53-25-20.64N 006-17-24.25W 53-25-13.08N 006-15-02.09W +RWY EIDW 11/29 242 4393 200 53-26-11.76N 006-15-44.17W 53-26-00.24N 006-14-34.12W +RWY EIDW 16/34 242 6798 200 53-26-13.20N 006-15-43.13W 53-25-11.64N 006-14-58.52W +RWY EIKN 08/26 665 7546 148 53-54-29.88N 008-50-08.34W 53-54-44.28N 008-48-04.79W +RWY EIKY 07/25 112 4035 98 52-10-44.04N 009-32-19.90W 52-11-04.92N 009-31-25.10W +RWY EIKY 08/26 112 6562 148 52-10-40.80N 009-32-15.47W 52-11-01.68N 009-30-35.78W +RWY EIME 05/23 319 4800 150 53-17-34.80N 006-27-12.74W 53-18-10.80N 006-26-21.05W +RWY EIME 11/29 319 6001 150 53-18-24.84N 006-28-13.01W 53-18-07.20N 006-26-38.87W +RWY EINN 04/22 46 463 198 52-41-42.36N 008-55-17.26W 52-42-34.56N 008-54-17.03W +RWY EINN 06/24 46 10495 148 52-41-35.52N 008-56-36.67W 52-42-38.88N 008-54-21.96W +RWY EINN 08/26 46 805 148 52-41-56.76N 008-55-55.20W 52-42-05.40N 008-54-38.48W +RWY EINN 13/31 46 543 148 52-42-07.20N 008-55-32.99W 52-41-35.16N 008-54-18.00W +RWY EINN 18/36 46 23 148 52-42-27.72N 008-54-42.59W 52-41-33.36N 008-54-25.85W +RWY EISG 11/29 11 3933 98 54-16-51.96N 008-36-28.15W 54-16-45.48N 008-35-26.16W +RWY EIWF 03/21 119 4701 98 52-10-52.32N 007-05-26.59W 52-11-35.52N 007-04-59.52W +RWY EIWT 07/25 150 3038 23 53-21-04.32N 006-29-31.45W 53-21-12.24N 006-29-04.78W +RWY LFAC 06/24 12 5036 148 50-57-31.68N 001-56-42.76E 50-57-55.44N 001-57-51.52E +RWY LFAT 13/31 36 6070 131 50-31-26.40N 001-36-44.89E 50-30-45.00N 001-37-53.00E +RWY LFOI 02/20 220 4101 75 50-08-17.88N 001-49-43.14E 50-08-55.32N 001-50-06.47E +NAV ABB VOR/DME 50-08-06.36N 001-51-16.88E 223 108.45 - +NAV ADN VOR/DME 57-18-38.16N 002-16-01.99W 600 114.30 - +NAV AP NDB 52-06-58.68N 004-33-35.39W 0 371 - +NAV AQ NDB 57-08-17.89N 002-24-16.99W 0 336 - +NAV ATF NDB 57-04-39.00N 002-06-20.52W 0 348 - +NAV BAL VOR/DME 53-17-59.64N 006-26-52.01W 300 115.80 - +NAV BBA NDB 57-28-34.32N 007-22-09.30W 0 401 - +NAV BCL DME 57-28-30.37N 007-22-13.15W 48 108.10 - +NAV BCN VOR/DME 51-43-32.16N 003-15-47.02W 1450 117.45 - +NAV BDN TACAN 51-08-56.39N 001-45-09.54W 430 108.20 - +NAV BEL VOR/DME 54-39-39.95N 006-13-48.00W 194 117.20 - +NAV BEN VOR/DME 57-28-40.45N 007-21-55.08W 130 113.95 - +NAV BFD NDB 57-15-17.28N 005-49-58.33W 0 390 - +NAV BHD VOR/DME 50-23-54.97N 003-29-37.00W 215 112.05 - +NAV BHX NDB 52-27-16.19N 001-45-08.60W 325 406 - +NAV BIA NDB 50-46-39.71N 001-50-32.96W 0 339 - +NAV BIG VOR/DME 51-19-51.23N 000-02-05.32E 590 115.10 - +NAV BKL TACAN 55-03-38.88N 007-00-47.99W 18 109.15 - +NAV BKY VOR/DME 51-59-22.92N 000-03-43.00E 486 116.25 - +NAV BLC DME 51-19-26.03N 000-50-46.96W 341 116.20 - +NAV BLK NDB 51-19-23.88N 000-50-41.26W 0 328 - +NAV BNE VOR 50-37-29.29N 001-54-25.60E 0 113.80 - +NAV BNN VOR/DME 51-43-33.96N 000-32-59.00W 500 113.75 - +NAV BOU NDB 52-12-39.97N 000-02-41.77W 0 392 - +NAV BPK VOR/DME 51-44-58.92N 000-06-24.00W 382 117.50 - +NAV BRI NDB 51-22-53.04N 002-43-03.14W 0 414 - +NAV BRR NDB 57-01-32.16N 007-26-56.11W 0 316 - +NAV BSO TACAN 51-36-52.19N 001-05-57.98W 226 110.00 - +NAV BUR NDB 51-31-08.05N 000-40-38.00W 0 421 - +NAV BV NDB 53-43-31.44N 000-34-53.34W 12 372 - +NAV BZ NDB 51-44-57.12N 001-36-05.83W 288 386 - +NAV BZN TACAN 51-44-53.52N 001-36-12.71W 331 111.90 - +NAV CAE NDB 53-06-00.37N 004-20-22.27W 1 320 - +NAV CAM NDB 52-12-38.88N 000-10-58.05E 0 333 - +NAV CAR NDB 54-08-27.97N 004-29-30.01W 0 367 - +NAV CBL NDB 55-26-08.16N 005-41-17.05W 44 380 - +NAV CBN NDB 55-58-32.16N 003-58-28.99W 370 374 - +NAV CFD VOR 52-04-27.12N 000-36-38.85W 357 116.50 - +NAV CFN NDB 55-02-38.40N 008-20-21.41W 0 361 - +NAV CGY TACAN 53-05-27.60N 000-10-08.31W 24 111.10 - +NAV CHT NDB 51-37-23.16N 000-31-06.00W 0 277 - +NAV CLN VOR/DME 51-50-54.24N 001-08-51.40E 100 114.55 - +NAV CML NDB 52-27-13.68N 007-28-48.25W 0 387 - +NAV COM NDB 50-57-58.33N 002-09-18.61W 0 350 - +NAV CON VOR/DME 53-54-28.80N 008-49-12.36W 700 117.40 - +NAV CPT VOR/DME 51-29-30.12N 001-13-10.99W 498 114.35 - +NAV CRK VOR/DME 51-50-26.16N 008-29-39.37W 500 114.60 - +NAV CRN NDB 53-17-57.84N 008-56-27.17W 0 342 - +NAV CTM TACAN 52-44-07.44N 000-39-02.77W 452 112.30 - +NAV CWL NDB 53-01-34.67N 000-29-20.34W 0 423 - +NAV CWZ TACAN 53-01-42.96N 000-29-07.80W 218 117.40 - +NAV DAP VOR/DME 53-25-24.96N 006-18-10.01W 280 111.20 - +NAV DCS VOR/DME 54-43-18.84N 003-20-26.02W 700 115.20 - +NAV DET VOR/DME 51-18-14.05N 000-35-50.00E 645 117.30 - +NAV DND NDB 56-27-18.36N 003-06-53.71W 0 394 - +NAV DTY VOR/DME 52-10-49.09N 001-06-50.00W 600 116.40 - +NAV DUB VOR/DME 53-29-57.84N 006-18-25.60W 200 114.90 - +NAV DVR VOR/DME 51-09-44.99N 001-21-33.01E 315 114.95 - +NAV EAS NDB 50-57-18.01N 001-21-22.03W 0 392 - +NAV EDN NDB 55-58-42.24N 003-17-02.83W 0 341 - +NAV EKN NDB 54-23-39.12N 007-38-36.13W 0 358 - +NAV EKN DME 54-23-54.97N 007-39-13.00W 176 116.75 - +NAV ENS NDB 52-54-18.72N 008-55-39.97W 0 352 - +NAV EPM NDB 51-19-09.84N 000-22-19.00W 0 316 - +NAV FFA TACAN 51-40-54.13N 001-47-51.40W 299 113.40 - +NAV FNL NDB 52-44-29.76N 000-01-40.59W 0 401 - +NAV FNY NDB 53-28-29.28N 001-00-06.19W 0 338 - +NAV FOS NDB 51-20-50.64N 000-33-55.54W 80 348 - +NAV FOY NDB 52-33-58.68N 009-11-43.48W 0 395 - +NAV FRK DME 51-20-50.64N 000-33-55.54W 80 109.85 - +NAV GAM VOR/DME 53-16-53.04N 000-56-50.00W 121 112.80 - +NAV GAR NDB 53-31-43.33N 006-26-50.86W 0 407 - +NAV GE NDB 51-09-51.83N 000-04-08.88W 0 338 - +NAV GLW NDB 55-52-11.28N 004-26-01.07W 26 331 - +NAV GMN NDB 53-38-53.17N 006-13-36.01W 100 334 - +NAV GOS DME 51-53-31.92N 002-10-04.55W 109 115.55 - +NAV GOW VOR/DME 55-52-13.80N 004-26-44.59W 37 115.40 - +NAV GST NDB 51-53-31.19N 002-10-04.44W 111 331 - +NAV GWC VOR/DME 50-51-19.08N 000-45-24.00W 113 114.75 - +NAV GY NDB 51-07-50.52N 000-18-57.44W 0 365 - +NAV HAV NDB 51-49-54.85N 004-58-05.12W 0 328 - +NAV HDW DME 51-49-55.20N 004-58-12.43W 201 116.75 - +NAV HEN NDB 51-45-34.92N 000-47-25.00W 0 434 - +NAV HON VOR/DME 52-21-24.12N 001-39-49.00W 435 113.65 - +NAV ID DME 53-25-12.36N 006-16-13.87W 200 108.90 - +NAV ING NDB 50-52-59.53N 001-44-30.52E 475 387 - +NAV INS VOR/DME 57-32-33.36N 004-02-29.54W 58 109.20 - +NAV IOF NDB 58-49-47.64N 003-08-42.22W 0 357 - +NAV IOM VOR/DME 54-04-00.83N 004-45-48.49W 573 112.20 - +NAV ISV DME 58-12-51.84N 006-19-33.78W 28 110.90 - +NAV ISY DME 55-40-58.80N 006-14-57.88W 70 109.95 - +NAV IVR NDB 57-32-29.40N 004-02-45.49W 0 328 - +NAV IW NDB 50-40-50.89N 001-06-21.71W 0 426 - +NAV KER NDB 52-10-55.92N 009-31-28.17W 0 334 - +NAV KLY NDB 53-16-10.56N 006-06-23.18W 0 378 - +NAV KMB NDB 51-40-09.00N 002-04-08.00W 0 349 - +NAV KNK NDB 53-53-47.40N 008-56-13.20W 0 364 - +NAV KS NDB 57-39-01.43N 003-35-13.34W 0 370 - +NAV KSS TACAN 57-39-33.49N 003-32-06.40W 75 109.80 - +NAV KW NDB 58-57-34.55N 002-54-41.69W 0 395 - +NAV KWL VOR/DME 58-57-34.93N 002-53-38.22W 65 108.60 - +NAV LA NDB 51-30-29.88N 002-00-21.13W 513 282 - +NAV LAM VOR/DME 51-38-45.96N 000-09-06.00E 200 115.60 - +NAV LAY NDB 55-40-58.44N 006-14-58.13W 58 395 - +NAV LBA NDB 53-51-54.01N 001-39-10.40W 0 403 - +NAV LCY NDB 51-30-15.48N 000-04-03.01E 0 322 - +NAV LDY DME 50-57-33.13N 000-56-14.92E 28 108.15 - +NAV LE NDB 52-36-23.04N 001-02-06.00W 0 384 - +NAV LEE TACAN 54-17-49.56N 001-32-12.73W 92 112.60 - +NAV LKH TACAN 52-24-23.04N 000-32-52.67E 91 110.20 - +NAV LND VOR/DME 50-08-10.68N 005-38-13.16W 800 114.20 - +NAV LNS NDB 57-30-59.39N 001-52-05.92W 0 339 - +NAV LON VOR/DME 51-29-13.93N 000-28-00.00W 110 113.60 - +NAV LOO TACAN 54-03-01.80N 001-14-56.54W 53 109.00 - +NAV LSH NDB 51-09-16.92N 000-38-53.00E 72 340 - +NAV LUK TACAN 56-22-22.08N 002-51-49.21W 72 110.50 - +NAV LYD VOR/DME 50-59-58.92N 000-52-43.00E 30 114.05 - +NAV LYE TACAN 51-30-36.36N 001-59-32.06W 463 109.80 - +NAV LYX NDB 50-58-19.91N 000-57-19.03E 0 397 - +NAV MAC VOR/DME 55-25-48.00N 005-39-01.01W 95 116.00 - +NAV MAM TACAN 52-38-50.28N 000-33-11.75E 75 108.70 - +NAV MAY VOR/DME 51-01-01.92N 000-06-58.00E 360 117.90 - +NAV MCH NDB 53-21-11.87N 002-16-22.91W 0 428 - +NAV MCT VOR/DME 53-21-24.84N 002-15-43.99W 282 113.55 - +NAV MID VOR/DME 51-03-14.05N 000-37-30.00W 200 114.00 - +NAV MLD TACAN 52-21-47.88N 000-29-17.77E 63 115.90 - +NAV NEW VOR/DME 55-02-18.24N 001-41-54.13W 274 114.25 - +NAV NGY NDB 55-10-39.01N 004-10-07.00W 0 399 - +NAV NL NDB 52-40-35.04N 001-23-04.96E 0 372 - +NAV NN NDB 52-17-56.76N 000-47-51.37W 0 379 - +NAV NOT NDB 52-55-18.12N 001-04-45.59W 0 430 - +NAV NT NDB 55-03-01.44N 001-38-33.65W 0 352 - +NAV OCK VOR/DME 51-18-18.00N 000-26-50.00W 200 115.30 - +NAV ODH TACAN 51-13-58.08N 000-56-54.57W 410 109.60 - +NAV OE NDB 53-25-48.72N 006-25-43.68W 282 316 - +NAV OF NDB 51-31-18.84N 002-35-24.83W 0 325 - +NAV OK NDB 53-55-26.04N 008-41-59.24W 0 398 - +NAV OP NDB 53-24-49.68N 006-08-18.10W 0 397 - +NAV OTR VOR/DME 53-41-53.88N 000-06-13.00W 0 113.90 - +NAV OX NDB 51-49-57.00N 001-19-23.66W 0 368 - +NAV OX DME 51-49-56.64N 001-19-22.15W 276 117.70 - +NAV OY NDB 54-41-33.36N 006-05-07.30W 0 332 - +NAV PIK NDB 55-30-21.96N 004-34-38.10W 0 355 - +NAV PMB NDB 51-42-49.32N 004-18-40.07W 0 341 - +NAV POL VOR/DME 53-44-38.04N 002-06-11.99W 1400 112.10 - +NAV PTH VOR 56-26-33.00N 003-22-07.00W 0 110.40 - +NAV PW NDB 55-32-39.84N 004-40-53.58W 0 426 - +NAV PY NDB 50-25-27.84N 004-06-44.39W 0 397 - +NAV RCH NDB 51-21-13.69N 000-30-13.20E 0 369 - +NAV RDL NDB 51-12-57.96N 000-08-25.37W 0 343 - +NAV RSH NDB 53-30-42.85N 006-06-37.91W 0 326 - +NAV RWY NDB 54-04-51.96N 004-37-22.40W 55 359 - +NAV SAB VOR/DME 55-54-27.00N 002-12-23.00W 760 112.50 - +NAV SAM VOR/DME 50-57-19.08N 001-20-42.00W 66 113.35 - +NAV SAT TACAN 51-24-23.04N 003-26-05.89W 178 114.80 - +NAV SAY NDB 58-12-55.80N 006-19-44.69W 24 431 - +NAV SBH NDB 59-52-56.64N 001-17-41.39W 0 351 - +NAV SBY NDB 53-18-36.00N 000-10-34.20E 0 330 - +NAV SFD VOR/DME 50-45-38.16N 000-07-19.00E 300 117.00 - +NAV SFH DME 53-23-34.81N 001-22-59.30W 273 111.35 - +NAV SH NDB 52-14-36.24N 002-52-47.42W 0 426 - +NAV SHA VOR/DME 52-43-15.60N 008-53-06.76W 130 113.30 - +NAV SHD NDB 57-33-33.12N 001-49-01.99W 0 383 - +NAV SLG NDB 54-16-43.33N 008-35-28.00W 15 384 - +NAV SLP NDB 52-50-00.96N 002-46-25.00W 0 382 - +NAV SM NDB 50-26-53.16N 004-59-40.38W 0 357 - +NAV SMF NDB 53-23-33.36N 001-22-59.30W 0 333 - +NAV SMG TACAN 50-26-04.21N 005-01-48.90W 323 112.60 - +NAV SPA NDB 58-22-00.12N 001-54-24.98E 417 349 - +NAV SSD NDB 51-53-40.56N 000-14-42.11E 0 429 - +NAV STN VOR/DME 58-12-24.85N 006-10-59.02W 250 115.10 - +NAV STU VOR/DME 51-59-40.92N 005-02-25.01W 600 113.10 - +NAV SUM VOR/DME 59-52-44.04N 001-17-12.01W 19 117.35 - +NAV SWB VOR/DME 52-47-52.80N 002-39-45.14W 269 116.80 - +NAV SWN NDB 51-36-07.92N 004-03-56.99W 0 321 - +NAV SWZ DME 51-36-12.96N 004-03-55.01W 299 109.20 - +NAV TD NDB 54-33-37.08N 001-20-00.38W 0 348 - +NAV TIR VOR/DME 56-29-35.51N 006-52-32.02W 36 117.70 - +NAV TLA VOR/DME 55-29-57.12N 003-21-10.01W 2786 113.80 - +NAV TNL NDB 52-48-52.20N 001-46-00.01W 0 327 - +NAV TNT VOR/DME 53-03-14.05N 001-40-12.00W 968 115.70 - +NAV TRN VOR/DME 55-18-47.88N 004-47-02.00W 600 117.50 - +NAV UW NDB 55-54-18.72N 003-30-09.04W 0 368 - +NAV VLN TACAN 51-00-18.00N 002-38-19.50W 113 111.00 - +NAV VYL TACAN 53-15-26.64N 004-32-38.90W 101 108.40 - +NAV WAD TACAN 53-09-55.07N 000-31-36.60W 231 117.10 - +NAV WAL VOR/DME 53-23-30.84N 003-08-03.98W 55 114.10 - +NAV WBA NDB 52-30-57.24N 002-15-42.34W 0 356 - +NAV WCK NDB 58-26-48.12N 003-03-47.23W 0 344 - +NAV WCO NDB 51-51-11.16N 000-57-45.00W 0 335 - +NAV WFD NDB 53-20-15.72N 002-09-30.10W 0 380 - +NAV WHI NDB 53-11-06.00N 002-37-23.02W 0 369 - +NAV WIK VOR/DME 58-27-32.04N 003-06-01.01W 110 113.60 - +NAV WIT TACAN 52-36-28.08N 000-29-55.20W 295 117.60 - +NAV WL NDB 54-07-32.53N 003-15-46.91W 0 385 - +NAV WL DME 54-07-37.92N 003-15-53.50W 74 109.40 - +NAV WOD NDB 51-27-10.08N 000-52-44.00W 0 352 - +NAV WOL DME 52-30-56.88N 002-15-42.55W 300 108.60 - +NAV WPL NDB 52-37-48.00N 003-09-14.00W 282 323 - +NAV WST VOR/DME 53-21-10.80N 006-29-41.53W 200 114.70 - +NAV WTD NDB 52-11-20.40N 007-05-00.02W 0 368 - +NAV WTN TACAN 53-44-25.08N 002-53-34.22W 54 113.20 - +NAV WTN NDB 53-45-06.12N 002-51-08.06W 0 337 - +NAV WTZ TACAN 52-07-18.84N 000-56-25.69E 324 109.30 - +# Heathrow (EGLL): +ILS 09L ILS/DME IAA 110.30 51-28-39.77N 000-25-44.21W 51-28-35.76N 000-29-21.92W 83 5 89.7 3 +ILS 27R ILS/DME IRR 110.30 51-28-38.94N 000-29-37.48W 51-28-42.96N 000-25-59.76W 83 5 269.7 3 +ILS 09R ILS/DME IBB 109.50 51-27-54.03N 000-25-47.13W 51-27-50.40N 000-29-12.35W 83 5 89.8 3 +ILS 27L ILS/DME ILL 109.50 51-27-53.61N 000-29-27.92W 51-27-57.24N 000-26-02.70W 83 5 269.8 3 +# Gatwick (EGKK): +ILS 08R ILS IGG 110.90 51-09-06.40N 000-09-50.41W 51-08-39.20N 000-12-45.17W 189 5 77.6 3 +ILS 26L ILS IWW 110.90 51-08-40.27N 000-12-59.40W 51-09-07.48N 000-10-04.64W 215 5 257.6 3 +# Manchester (EGCC): +ILS 05L ILS/DME IMM 108.50 53-21-50.76N 002-15-13.11W 53-20-39.78N 002-17-36.42W 219 5 50.9 3 +ILS 23R ILS/DME INN 109.50 53-20-36.24N 002-17-46.44W 53-21-47.21N 002-15-23.13W 295 5 230.9 3 +ILS 05R ILS/DME IMC 111.55 53-21-02.82N 002-16-17.30W 53-19-52.61N 002-18-40.92W 220 5 51.3 3 +# Stansted (EGSS): +ILS 04 ILS ISED 110.50 51-53-49.84N 000-15-10.83E 51-52-28.17N 000-13-08.70E 303 5 42.9 3 +ILS 22 ILS ISX 110.50 51-52-23.24N 000-13-01.07E 51-53-44.91N 000-15-03.19E 393 5 222.8 3 diff -Nru acm-5.0/objects/zones/middleeast/iraq.txt acm-6.0+20200416/objects/zones/middleeast/iraq.txt --- acm-5.0/objects/zones/middleeast/iraq.txt 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/objects/zones/middleeast/iraq.txt 2017-10-28 10:37:42.000000000 +0000 @@ -0,0 +1,15 @@ +TEAM1_LOC 33.334N 44.355E 112 154 +TEAM2_LOC 33.258N 44.209E 113 140 +GROUND_COLOR #CCAC5E + +# Al-Muthanna Military Airport: +RWY OOOO 14/32 112 11181 150 33.334N 44.355E 33.320N 44.378E + +# Camp Rustamiyah: +RWY ORAS 15/33 104 8293 150 33.284N 44.498E 33.267N 44.516E + +# Baghdad International Airport: +#RWY ORBS 15L/33R 113 12000 200 33.227N 44.236E 33.271N 44.212E +#RWY ORBS 15R/33L 113 12000 200 33.223N 44.230E 33.258N 44.209E +RWY ORBS 15L/33R 113 12000 200 33.271N 44.212E 33.227N 44.236E +RWY ORBS 15R/33L 113 12000 200 33.258N 44.209E 33.223N 44.230E diff -Nru acm-5.0/objects/zones/usa/dallas.txt acm-6.0+20200416/objects/zones/usa/dallas.txt --- acm-5.0/objects/zones/usa/dallas.txt 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/objects/zones/usa/dallas.txt 2020-04-16 12:05:39.000000000 +0000 @@ -0,0 +1,468 @@ +# Dallas area scenery. +# Created: 2020-04-16 +# Latitude range: [30N, 35N[ +# Longitude range: [100W, 95W[ +# 2017-10-04 Checked against https://nfdc.faa.gov/xwiki/bin/view/NFDC/56DaySub-2017-03-02 +# "56 Day NASR Subscription - Effective March 2, 2017". + +TEAM1_LOC 32-58-40.4N 096-50-25.75W 645 160 +TEAM2_LOC 34-17-36.089N 097-01-25.366W 762.0 040 +GROUND_COLOR #305030 + +# Addison: +FEATURE ../../features/tower.obv 32-58-04.800N 096-50-16.800W 644 0 +FEATURE ../../features/man.obv 32-58-29.000N 096-50-20.000W 644 90 + +RWY ADH 13/31 1016 2717 50 34-48-20.8240N 096-40-21.4487W 34-48-01.7850N 096-39-58.4550W +RWY ADH 17/35 1016 6203 100 34-48-47.7850N 096-40-19.1120W 34-47-46.4390N 096-40-19.1040W +RWY AXS 17/35 1433 5501 75 34-42-22.8830N 099-20-18.5833W 34-41-28.4709N 099-20-18.4105W +RWY LTS 17L/35R 1382 9001 150 34-40-56.9400N 099-15-34.3800W 34-39-27.9100N 099-15-34.3100W +RWY LTS 17R/35L 1382 13440 150 34-40-56.9200N 099-16-25.7700W 34-38-43.9720N 099-16-25.7160W +RWY 80F 17/35 577 3298 60 34-11-49.6765N 095-38-59.5751W 34-11-17.0542N 095-38-59.4473W +RWY ADM 13/31 777 9002 150 34-18-53.0881N 097-01-45.3384W 34-17-49.6766N 097-00-30.0162W +RWY ADM 17/35 777 5350 100 34-18-31.6639N 097-01-24.6678W 34-17-38.7461N 097-01-25.1342W +RWY 1F0 17/35 845 5014 75 34-09-13.8813N 097-07-21.9810W 34-08-24.2890N 097-07-21.1191W +RWY AQR 18/36 590 3015 40 34-24-08.8100N 096-08-50.7400W 34-23-39.2300N 096-08-55.2900W +RWY 37K 18/36 690 4400 75 33-55-54.9500N 097-17-42.6600W 33-55-11.9900N 097-17-51.0500W +RWY 92F 17/35 1135 3400 60 34-22-24.6771N 098-40-55.7556W 34-21-51.0366N 098-40-55.7083W +RWY DUC 17/35 1114 6326 100 34-28-48.0268N 097-57-35.9834W 34-27-45.4634N 097-57-35.0610W +RWY DUA 17/35 699 5001 100 33-56-56.5522N 096-23-41.9862W 33-56-07.0838N 096-23-42.3239W +RWY FSI 17/35 1189 5001 150 34-39-24.0908N 098-24-07.7600W 34-38-34.6202N 098-24-07.8958W +RWY FDR 03/21 1258 4812 60 34-20-46.9644N 098-59-18.3817W 34-21-20.5946N 098-58-37.7712W +RWY FDR 12/30 1258 4578 75 34-21-30.0278N 098-59-16.3717W 34-20-57.9846N 098-58-37.7895W +RWY FDR 17/35 1258 6099 150 34-21-37.9970N 098-59-21.6106W 34-20-37.6707N 098-59-21.6656W +RWY 1O1 08/26 1128 1540 75 34-14-36.7500N 098-44-40.2638W 34-14-36.7500N 098-44-21.9200W +RWY 1O1 17/35 1128 3100 75 34-14-37.1463N 098-44-18.9334W 34-14-06.4827N 098-44-19.3343W +RWY F32 17/35 960 3013 50 34-15-32.5000N 097-28-22.4000W 34-15-02.7000N 097-28-22.4000W +RWY HBR 03/21 1563 2975 60 34-59-04.1300N 099-03-14.6400W 34-59-24.8800N 099-02-49.2700W +RWY HBR 12/30 1563 5295 150 34-59-59.3472N 099-03-21.6962W 34-59-22.1457N 099-02-36.9093W +RWY HBR 17/35 1563 5507 100 34-59-55.8994N 099-03-15.7724W 34-59-01.4397N 099-03-16.0394W +RWY O35 17/35 1659 3008 60 34-42-33.9747N 099-54-30.7655W 34-42-04.2231N 099-54-30.9010W +RWY HHW 17/35 572 4007 75 34-02-20.9323N 095-32-31.4760W 34-01-41.2913N 095-32-31.3654W +RWY F31 18/36 693 3000 50 33-59-42.5938N 096-38-31.9768W 33-59-13.0608N 096-38-35.5744W +RWY LAW 17/35 1110 8599 150 34-34-42.7880N 098-25-01.7490W 34-33-17.8580N 098-24-56.2250W +RWY 1K2 01/19 968 3010 60 34-50-43.6500N 097-35-11.7500W 34-51-12.4000N 097-35-02.3500W +RWY MLC 02/20 771 5602 100 34-52-30.6576N 095-47-12.2129W 34-53-22.6038N 095-46-48.8118W +RWY 1F4 18/36 890 3005 60 34-08-40.2050N 096-48-41.3480W 34-08-10.6680N 096-48-45.3340W +RWY 2K4 17/35 1644 4199 75 34-53-54.1708N 099-31-41.5188W 34-53-12.6461N 099-31-41.5993W +RWY 2OK1 18/36 801 3830 40 34-11-51.2340N 096-31-07.1688W 34-11-13.3440N 096-31-07.1688W +RWY O14 17/35 1200 2725 60 34-53-38.8000N 097-59-55.2500W 34-53-12.0000N 097-59-51.7500W +RWY F09 17/35 1346 2000 50 34-31-11.8600N 099-26-01.8200W 34-30-52.0768N 099-26-01.8200W +RWY 1F1 14/32 817 2500 48 34-04-40.2700N 097-06-30.7600W 34-04-18.6900N 097-06-16.2500W +RWY PVJ 17/35 971 5001 100 34-42-52.2918N 097-13-26.7255W 34-42-02.8293N 097-13-27.1942W +RWY 3O3 17/35 1143 3003 60 34-59-14.8310N 097-22-59.4010W 34-58-45.2870N 097-22-55.5950W +RWY 4O1 17/35 1325 2125 30 34-37-50.3118N 099-00-50.6158W 34-37-29.2896N 099-00-50.2483W +RWY 6F1 01/19 687 3300 60 34-42-12.5000N 095-04-31.9000W 34-42-43.4530N 095-04-19.3570W +RWY 1O8 17/35 1248 3062 50 34-27-46.1840N 099-10-16.8220W 34-27-15.9010N 099-10-16.8010W +RWY 0F9 17/35 647 3100 60 34-12-09.8700N 096-40-28.1700W 34-11-39.2200N 096-40-28.2000W +RWY 3O5 16/34 1058 2900 50 34-22-23.2100N 098-24-24.2900W 34-21-54.6900N 098-24-20.5500W +RWY H05 17/35 670 3000 60 34-55-27.5900N 095-23-38.1100W 34-54-57.9000N 095-23-37.9900W +RWY 3R9 16/34 909 3930 70 30-21-46.0451N 097-59-44.4491W 30-21-07.8900N 097-59-35.7200W +RWY 35TX 16/34 1750 1700 75 32-29-12.6000N 099-49-35.7000W 32-28-56.1500N 099-49-31.5000W +RWY DYS 16/34 1790 13500 300 32-26-20.2400N 099-51-31.7900W 32-24-09.2000N 099-51-01.3400W +RWY ABI 04/22 1791 3679 100 32-25-10.5631N 099-41-41.3110W 32-25-32.8373N 099-41-07.3878W +RWY ABI 17L/35R 1791 7198 150 32-24-30.7115N 099-40-29.2135W 32-23-19.4925N 099-40-28.8583W +RWY ABI 17R/35L 1791 7203 150 32-25-41.1041N 099-41-05.7103W 32-24-29.8343N 099-41-05.3577W +RWY T23 17/35 1415 5000 75 32-43-41.6920N 099-16-04.1349W 32-42-52.2405N 099-16-02.4479W +RWY 6XS2 02/20 700 1650 80 32-20-35.3000N 097-11-58.9000W 32-20-50.3500N 097-11-51.5000W +RWY 6XS2 14/32 700 2300 90 32-20-58.7000N 097-12-01.9000W 32-20-39.5500N 097-11-47.4000W +RWY 88XA 18/36 577 2100 45 33-20-25.2000N 096-28-48.8000W 33-20-04.4000N 096-28-48.8000W +RWY GKY 16/34 628 6080 100 32-40-19.3610N 097-05-46.7890W 32-39-20.5131N 097-05-32.0325W +RWY F44 17/35 444 3988 60 32-10-09.6288N 095-49-42.1646W 32-09-30.1649N 095-49-42.0139W +RWY TX25 17/35 391 4850 60 31-59-45.1400N 095-57-06.2300W 31-58-57.3400N 095-57-01.1500W +RWY AUS 17L/35R 542 9000 150 30-12-13.7882N 097-39-28.4087W 30-10-44.7277N 097-39-26.0760W +RWY AUS 17R/35L 542 12250 150 30-12-49.0181N 097-40-45.7132W 30-10-47.7956N 097-40-42.5089W +RWY EDC 13/31 620 6025 100 30-24-12.9800N 097-34-24.4500W 30-23-33.5200N 097-33-32.8600W +RWY EDC 16/34 620 1550 25 30-23-49.5800N 097-34-02.5600W 30-23-34.6862N 097-33-58.2848W +RWY E30 17/35 1739 3909 60 31-40-47.4814N 099-58-37.0498W 31-40-08.8029N 099-58-37.2515W +RWY 18TE 08/26 390 5093 45 32-35-07.0940N 095-04-19.8870W 32-35-06.3040N 095-03-20.3680W +RWY F00 17/35 618 4000 75 33-37-06.9000N 096-10-44.8800W 33-36-27.3450N 096-10-46.2500W +RWY 0F2 17/35 1101 3603 60 33-36-23.7123N 097-46-34.1336W 33-35-48.2448N 097-46-29.9469W +RWY BBD 08/26 1827 3520 110 31-10-47.9695N 099-19-43.0393W 31-10-45.9007N 099-19-02.5904W +RWY BBD 17/35 1827 4605 75 31-11-07.0766N 099-19-28.6068W 31-10-21.5090N 099-19-28.7417W +RWY BKD 04/22 1284 2398 50 32-43-00.1817N 098-53-40.4668W 32-43-17.0635N 098-53-20.7427W +RWY BKD 13/31 1284 2401 50 32-43-14.2128N 098-53-43.8027W 32-42-57.5335N 098-53-23.8037W +RWY BKD 17/35 1284 4997 100 32-43-32.4803N 098-53-27.5774W 32-42-43.0385N 098-53-27.1983W +RWY 9XS9 15/33 275 1334 75 30-16-39.0000N 096-26-31.1500W 30-16-26.3400N 096-26-26.8200W +RWY 11R 16/34 318 6003 75 30-13-40.2000N 096-22-33.0100W 30-12-41.4636N 096-22-22.6900W +RWY XBP 18/36 864 4004 60 33-10-51.0030N 097-49-41.7339W 33-10-11.4037N 097-49-42.7200W +RWY TX40 16/34 465 2600 40 32-15-25.1000N 095-39-23.3500W 32-15-00.1000N 095-39-16.2000W +RWY BWD 13/31 1387 4608 101 31-47-50.3995N 098-57-49.1183W 31-47-18.5515N 098-57-10.9107W +RWY BWD 17/35 1387 5599 100 31-48-06.7884N 098-57-18.2830W 31-47-11.3902N 098-57-17.5573W +RWY CFD 15/33 367 4000 75 30-43-13.8970N 096-20-03.7420W 30-42-39.0560N 096-19-41.9780W +RWY BMQ 01/19 1284 5000 75 30-43-56.3742N 098-14-26.9586W 30-44-43.9076N 098-14-11.0340W +RWY 2TA0 01/19 1417 1455 65 30-50-36.0500N 098-16-25.9700W 30-50-49.1400N 098-16-19.0100W +RWY 7F3 13/31 542 4000 150 33-02-27.1500N 096-14-44.0030W 33-01-58.6390N 096-14-11.4180W +RWY 7F3 18/36 542 4000 75 33-02-27.6540N 096-14-42.4890W 33-01-48.0830N 096-14-43.3860W +RWY RWV 15/33 391 3252 50 30-31-09.9640N 096-42-23.3346W 30-30-41.4506N 096-42-06.0837W +RWY T35 16/34 402 3200 50 30-52-59.8100N 096-58-25.0900W 30-52-29.4400N 096-58-14.6600W +RWY 1TA7 13/31 518 2500 40 32-37-05.7500N 095-52-15.5000W 32-36-48.2500N 095-51-54.8500W +RWY 40XS 15/33 897 3000 30 30-31-17.4500N 097-46-56.7600W 30-30-49.5200N 097-46-45.1300W +RWY T80 17/35 750 1580 80 33-22-43.2900N 096-43-44.1400W 33-22-27.6600N 096-43-44.2000W +RWY 9S1 18/36 790 2662 100 33-22-18.9600N 096-45-16.7100W 33-21-52.6300N 096-45-17.0900W +RWY 3T8 15/33 660 2450 60 31-40-53.5605N 097-21-51.8419W 31-40-32.1284N 097-21-38.5708W +RWY 3F2 17/35 1621 3700 60 32-25-12.3760N 098-59-48.5615W 32-24-35.7559N 098-59-48.6697W +RWY GZN 18/36 1711 6536 100 32-22-29.3615N 099-01-24.8666W 32-21-24.6983N 099-01-25.6353W +RWY LBR 17/35 440 3000 50 33-35-48.3500N 095-03-51.2100W 33-35-18.6600N 095-03-50.6500W +RWY CPT 15/33 854 5697 100 32-21-39.8723N 097-26-13.2781W 32-20-47.1779N 097-25-49.6998W +RWY 6R3 16/34 150 4998 75 30-21-46.6632N 095-00-37.8091W 30-20-59.6829N 095-00-19.9540W +RWY 06TE 09/27 132 3275 50 30-18-47.0000N 095-01-56.9000W 30-18-46.3000N 095-01-19.5500W +RWY 7F7 14/32 760 3000 50 31-49-14.3000N 097-34-19.6000W 31-48-49.0500N 097-34-01.3000W +RWY COM 15/33 1697 4506 75 31-50-48.3459N 099-24-23.9754W 31-50-07.8893N 099-24-02.0254W +RWY CLL 04/22 321 5150 150 30-35-07.0682N 096-22-23.1323W 30-35-40.0055N 096-21-38.1734W +RWY CLL 10/28 321 5158 150 30-35-29.2948N 096-22-22.0594W 30-35-12.8558N 096-21-26.1882W +RWY CLL 16/34 321 7000 146 30-35-47.9019N 096-21-46.2765W 30-34-39.9213N 096-21-30.8334W +RWY MKN 17/35 1387 4497 75 31-55-35.3437N 098-35-57.7337W 31-54-50.8576N 098-35-56.5207W +RWY 2F7 18/36 516 3907 60 33-17-53.6465N 095-53-46.0082W 33-17-15.0312N 095-53-48.1496W +RWY 34XS 18/36 225 900 50 30-23-31.4000N 095-32-22.9000W 30-23-22.5000N 095-32-23.3000W +RWY CRS 02/20 449 3200 75 32-01-29.6801N 096-24-23.3339W 32-01-59.0400N 096-24-09.4100W +RWY CRS 14/32 449 5004 75 32-01-59.2036N 096-24-09.5613W 32-01-18.6056N 096-23-36.2812W +RWY DKR 02/20 348 4000 75 31-18-06.6433N 095-24-22.2519W 31-18-43.4668N 095-24-05.3458W +RWY 1F7 13/31 510 2630 30 32-48-55.8625N 096-21-18.0952W 32-48-37.2578N 096-20-56.5391W +RWY RBD 13/31 660 6451 100 32-41-14.3558N 096-52-35.1540W 32-40-29.1559N 096-51-41.8605W +RWY RBD 17/35 660 3800 150 32-41-08.8827N 096-52-00.4538W 32-40-31.2830N 096-52-00.5507W +RWY ADS 15/33 645 7203 100 32-58-40.2276N 096-50-25.8484W 32-57-33.3629N 096-49-56.6190W +RWY TKI 18/36 589 7002 150 33-11-12.0500N 096-35-18.0400W 33-10-02.8200N 096-35-21.0800W +RWY DFW 13L/31R 607 9000 200 32-54-45.1950N 097-01-17.3210W 32-53-41.9330N 097-00-03.0390W +RWY DFW 13R/31L 607 9301 150 32-54-34.4720N 097-04-59.2780W 32-53-24.9700N 097-03-47.7940W +RWY DFW 17C/35C 607 13401 150 32-54-56.5480N 097-01-33.4940W 32-52-43.9620N 097-01-34.2180W +RWY DFW 17L/35R 607 8500 150 32-53-53.9540N 097-00-35.2040W 32-52-29.8540N 097-00-35.6710W +RWY DFW 17R/35L 607 13401 200 32-54-56.6000N 097-01-47.5800W 32-52-44.0180N 097-01-48.2920W +RWY DFW 18L/36R 607 13400 200 32-54-56.8770N 097-03-02.6484W 32-52-44.2980N 097-03-03.3340W +RWY DFW 18R/36L 607 13400 150 32-54-56.9330N 097-03-16.7108W 32-52-44.3500N 097-03-17.4010W +RWY DAL 13L/31R 487 7752 150 32-51-26.1859N 096-51-24.4828W 32-50-31.3553N 096-50-20.9479W +RWY DAL 13R/31L 487 8800 150 32-51-04.7418N 096-51-48.4244W 32-50-02.5073N 096-50-36.2975W +RWY DAL 18/36 487 6147 150 32-51-31.1849N 096-51-11.5861W 32-50-30.6473N 096-51-18.5243W +RWY LUD 17/35 1047 4200 60 33-15-35.8642N 097-34-53.0081W 33-14-54.6700N 097-34-46.5092W +RWY 09T 17/35 931 1600 40 33-17-00.6690N 097-29-48.2210W 33-16-44.8400N 097-29-47.9710W +RWY 76T 17/35 888 3730 170 33-16-27.4685N 097-27-06.7557W 33-15-50.5564N 097-27-06.6562W +RWY 58T 13/31 883 3000 60 33-10-07.5259N 097-29-00.7655W 33-09-47.8177N 097-28-34.3655W +RWY DTO 18/36 642 7002 150 33-12-42.1900N 097-11-51.8400W 33-11-32.9260N 097-11-53.3739W +RWY 6TS3 17/35 855 3200 100 33-32-26.4611N 096-40-49.5780W 33-31-54.8243N 096-40-49.4251W +RWY 17XS 01/19 1422 6295 80 32-10-10.7210N 098-26-18.8480W 32-11-09.1730N 098-25-53.5120W +RWY ETN 17/35 1468 5000 60 32-25-18.3300N 098-48-33.9900W 32-24-28.8757N 098-48-35.8455W +RWY F41 15/33 500 3999 50 32-20-05.6790N 096-39-57.4390W 32-19-28.1570N 096-39-42.6412W +RWY TX94 08/26 882 2500 100 33-27-10.0600N 097-16-46.8300W 33-27-09.2600N 097-16-17.3400W +RWY TE39 17/35 887 2000 75 33-26-42.0600N 097-16-21.2000W 33-26-22.3000N 097-16-19.9100W +RWY TX6 16/34 597 1264 60 33-05-40.6000N 096-23-26.2000W 33-05-28.6000N 096-23-22.0000W +RWY GRK 15/33 1015 10000 200 31-04-47.7210N 097-50-06.2815W 31-03-16.3957N 097-49-22.0050W +RWY HLR 16/34 924 3701 144 31-08-37.0190N 097-42-58.2170W 31-08-01.9140N 097-42-46.0690W +RWY FTW 16/34 710 7502 150 32-49-48.6376N 097-21-44.9518W 32-48-35.1564N 097-21-32.5720W +RWY FTW 17/35 710 4005 75 32-49-29.4222N 097-21-59.4712W 32-48-50.2115N 097-21-52.8641W +RWY 50F 17/35 873 4049 60 32-35-14.4314N 097-35-30.3310W 32-34-34.8228N 097-35-23.2854W +RWY 4T2 17/35 693 5943 127 32-59-08.7809N 097-29-35.0501W 32-58-10.1675N 097-29-29.4642W +RWY 9F9 17/35 762 3375 30 32-37-54.0000N 097-21-13.8500W 32-37-20.6000N 097-21-15.0000W +RWY 2TE2 15/33 720 2800 150 32-49-58.5400N 097-32-10.8300W 32-49-32.1800N 097-32-00.7600W +RWY NFW 18/36 650 11999 200 32-47-08.4330N 097-26-28.8810W 32-45-09.7070N 097-26-30.1680W +RWY FWS 17L/35R 700 4000 60 32-34-21.1000N 097-18-23.1000W 32-33-41.5000N 097-18-23.1000W +RWY FWS 17R/35L 700 6002 100 32-34-21.0520N 097-18-34.7550W 32-33-21.6620N 097-18-34.8880W +RWY AFW 16L/34R 722 9600 150 33-00-05.8894N 097-19-14.7023W 32-58-32.2955N 097-18-55.5436W +RWY AFW 16R/34L 722 8220 150 32-59-51.3310N 097-19-18.8730W 32-58-31.1880N 097-19-02.4660W +RWY 1TE9 15/33 420 1563 150 31-16-25.3200N 096-26-26.5200W 31-16-11.2800N 096-26-18.9594W +RWY T82 14/32 1695 5001 75 30-14-56.3718N 098-54-48.7070W 30-14-14.9784N 098-54-17.4397W +RWY GLE 13/31 846 4307 75 33-39-18.3525N 097-11-56.8889W 33-38-49.4511N 097-11-19.4554W +RWY GLE 18/36 846 6000 100 33-39-40.4792N 097-11-58.1156W 33-38-41.1371N 097-11-59.5095W +RWY GTU 11/29 790 4099 75 30-40-53.0065N 097-41-10.2785W 30-40-32.3794N 097-40-29.8599W +RWY GTU 18/36 790 5004 100 30-41-09.2437N 097-40-40.5019W 30-40-19.8165N 097-40-44.0403W +RWY GYB 17/35 484 4000 75 30-10-29.0584N 096-58-50.3404W 30-09-49.6649N 096-58-45.7906W +RWY TA35 01/19 915 4000 50 32-11-41.5800N 097-50-35.1500W 32-12-20.9100N 097-50-29.7800W +RWY T37 01/19 1457 3200 60 31-25-29.1000N 098-36-33.6500W 31-26-00.1700N 098-36-26.5200W +RWY 3T0 07/25 640 3000 60 33-50-20.7700N 096-48-54.0000W 33-50-23.5534N 096-48-18.6000W +RWY F35 02/20 1008 3500 60 32-55-09.0470N 098-26-23.1740W 32-55-38.8900N 098-26-02.3100W +RWY RPH 03/21 1123 5000 75 33-06-20.5515N 098-33-34.6569W 33-06-58.6568N 098-32-57.1732W +RWY RPH 18/36 1123 3317 50 33-06-53.5000N 098-33-18.2210W 33-06-20.7210N 098-33-20.0280W +RWY 10F 18/36 1112 3600 200 33-01-12.2284N 098-37-33.5308W 33-00-36.6076N 098-37-34.3313W +RWY GDJ 14/32 778 3603 60 32-26-55.2878N 097-49-11.5827W 32-26-24.5215N 097-48-50.3363W +RWY 66TE 17/35 684 3100 50 32-22-11.1100N 097-38-44.1000W 32-21-40.6400N 097-38-39.9800W +RWY 0TX1 01/19 710 3500 50 32-20-56.5000N 097-40-37.8000W 32-21-30.5500N 097-40-30.3000W +RWY GPM 17/35 588 4001 75 32-42-15.4122N 097-02-48.7604W 32-41-35.8230N 097-02-49.0394W +RWY GVT 17/35 535 8030 150 33-04-43.9512N 096-03-54.5590W 33-03-24.5106N 096-03-55.7595W +RWY 33R 16/34 340 3500 60 31-05-20.4059N 095-09-55.7424W 31-04-46.8163N 095-09-45.8674W +RWY MNZ 18/36 1305 4998 75 31-40-21.7505N 098-08-50.5893W 31-39-32.8977N 098-08-59.6341W +RWY 15F 18/36 1625 3420 50 33-11-46.1129N 099-43-01.6078W 33-11-12.5925N 099-43-07.0749W +RWY LHB 18/36 285 4001 75 30-52-39.2500N 096-37-19.2100W 30-51-59.6600N 096-37-20.5200W +RWY 00XA 15/33 271 4200 60 30-13-45.4000N 096-01-01.0000W 30-13-07.6700N 096-00-40.9000W +RWY INJ 16/34 686 3998 60 32-05-19.8851N 097-05-57.2220W 32-04-42.2375N 097-05-42.9154W +RWY 0TE4 17/35 502 3018 40 31-05-05.5300N 096-12-57.5200W 31-04-36.2900N 096-12-50.3400W +RWY DZB 17/35 1093 5977 100 30-32-06.9600N 098-21-30.8700W 30-31-07.8100N 098-21-32.1800W +RWY T51 17/35 166 3440 50 30-02-50.9960N 095-40-02.1560W 30-02-16.9470N 095-40-01.7940W +RWY IAH 08L/26R 96 9000 150 30-00-25.7787N 095-21-31.6473W 30-00-25.8580N 095-19-49.2900W +RWY CXO 01/19 245 5000 100 30-20-44.2266N 095-25-10.1247W 30-21-31.5059N 095-24-53.2773W +RWY CXO 14/32 245 7501 150 30-21-45.7172N 095-25-13.6153W 30-20-44.5400N 095-24-25.1014W +RWY DWH 17L/35R 152 3987 35 30-03-50.1370N 095-33-08.6866W 30-03-10.9825N 095-33-03.0389W +RWY DWH 17R/35L 152 7009 100 30-04-23.9281N 095-33-17.3279W 30-03-15.1018N 095-33-07.2668W +RWY 57TS 17/35 275 3990 100 30-48-13.3900N 095-32-35.7300W 30-47-34.4900N 095-32-27.8500W +RWY UTS 18/36 363 5005 100 30-45-13.4202N 095-35-10.8723W 30-44-24.1407N 095-35-16.6492W +RWY 21F 17/35 1062 3220 75 33-13-56.2131N 098-08-45.9587W 33-13-24.4111N 098-08-48.3489W +RWY JSO 14/32 678 5006 75 31-52-28.5791N 095-13-21.2922W 31-51-50.5994N 095-12-44.0271W +RWY 0TE7 17/35 1515 6291 60 30-15-37.5770N 098-37-24.1470W 30-14-35.5220N 098-37-18.1300W +RWY 2XS1 18/36 1188 4600 75 30-13-30.5700N 098-18-06.8100W 30-12-45.3500N 098-18-12.9200W +RWY JCT 08/26 1754 2255 130 30-30-42.7076N 099-45-46.8244W 30-30-41.8670N 099-45-21.0657W +RWY JCT 17/35 1754 5004 75 30-31-03.7330N 099-45-51.7896W 30-30-14.2146N 099-45-52.1226W +RWY 16X 17/35 804 3000 60 33-05-05.0352N 097-21-30.1881W 33-04-35.3466N 097-21-30.3667W +RWY 7XA2 16/34 810 2900 90 33-09-10.0200N 097-22-29.8800W 33-08-41.9400N 097-22-23.0200W +RWY 3T6 17/35 705 1800 22 33-08-09.8558N 097-17-49.1674W 33-07-52.0432N 097-17-49.3511W +RWY XA0 18/36 685 1660 60 33-09-01.6000N 097-16-48.0000W 33-08-45.2000N 097-16-48.2000W +RWY ILE 01/19 848 5495 100 31-04-42.9320N 097-41-20.5540W 31-05-34.9890N 097-41-02.2900W +RWY E58 17/35 895 2830 250 33-18-37.2400N 097-20-49.4100W 33-18-09.2400N 097-20-49.9100W +RWY RYW 15/33 1230 3808 50 30-30-12.7629N 097-58-17.0363W 30-29-37.0653N 097-58-03.0784W +RWY TX82 15/33 620 1824 150 31-51-57.2100N 097-22-57.2140W 31-51-41.2850N 097-22-47.2550W +RWY 30F 18R/36L 535 2600 75 33-08-05.8007N 097-00-50.1907W 33-07-40.1201N 097-00-52.0897W +RWY LZZ 16/34 1214 4202 75 31-06-42.8069N 098-11-49.1968W 31-06-01.7699N 098-11-41.4109W +RWY LNC 13/31 501 6500 100 32-35-04.1300N 096-43-27.2700W 32-34-14.6400N 096-42-38.7600W +RWY 7T0 17/35 885 2400 60 33-35-48.9100N 097-13-07.6175W 33-35-25.1678N 097-13-08.3049W +RWY 00R 12/30 151 3704 60 30-41-20.9988N 095-01-20.6496W 30-40-57.1564N 095-00-48.4254W +RWY AQO 13/31 1102 3209 150 30-47-17.3334N 098-39-37.7420W 30-46-53.7390N 098-39-13.1260W +RWY AQO 17/35 1102 4202 75 30-47-22.2241N 098-39-43.6369W 30-46-40.6444N 098-39-42.9827W +RWY 51R 18/36 287 3202 50 30-55-01.8100N 095-57-03.9620W 30-54-30.6110N 095-57-10.3950W +RWY T15 17/35 411 3021 50 31-20-41.3894N 096-51-07.0051W 31-20-11.4972N 096-51-07.6793W +RWY T92 18/36 1514 3716 50 30-44-14.3358N 099-11-03.0761W 30-43-37.5693N 099-11-03.8465W +RWY T50 15/33 1930 4100 60 30-56-15.2400N 099-48-43.2800W 30-55-38.5600N 099-48-23.1600W +RWY HQZ 18/36 447 5999 100 32-45-18.7410N 096-31-48.9690W 32-44-19.3890N 096-31-50.0520W +RWY LXY 18/36 545 5000 75 31-38-52.6564N 096-30-47.3923W 31-38-03.8255N 096-30-56.7166W +RWY T56 17/35 780 3216 36 32-31-02.0370N 096-55-36.3810W 32-30-30.2110N 096-55-36.4120W +RWY JWY 18/36 727 6500 100 32-28-01.9400N 096-54-42.4565W 32-26-57.7743N 096-54-47.7259W +RWY 3F9 17/35 429 3203 40 32-40-51.9020N 095-30-38.6980W 32-40-20.2180N 095-30-39.0880W +RWY JDD 18/36 433 4002 60 32-44-51.7002N 095-29-46.3528W 32-44-12.1337N 095-29-48.1868W +RWY MWL 13/31 974 5996 100 32-47-14.7320N 098-03-51.4120W 32-46-32.3400N 098-03-02.2700W +RWY MWL 17/35 974 4188 100 32-47-14.8320N 098-03-50.3930W 32-46-33.3960N 098-03-50.9170W +RWY TX36 12/30 755 3100 150 32-03-48.2000N 097-35-33.5500W 32-03-30.4500N 097-35-04.1500W +RWY 6X0 12/30 590 2700 30 32-05-58.3019N 095-17-54.6669W 32-05-43.6460N 095-17-28.4146W +RWY F53 13/31 412 3900 60 33-13-09.1610N 095-14-29.8149W 33-12-41.1851N 095-13-58.2001W +RWY 37F 17/35 1474 3200 50 33-28-23.2649N 099-35-10.9011W 33-27-51.6100N 099-35-09.8886W +RWY 60R 17/35 229 5003 75 30-22-26.4232N 096-06-47.9271W 30-21-36.9502N 096-06-45.3680W +RWY 89TS 18/36 215 5200 75 31-34-26.2200N 095-45-55.9600W 31-33-35.2600N 095-46-04.0700W +RWY ONY 04/22 1275 5100 75 33-20-53.8050N 098-49-28.3062W 33-21-29.2929N 098-48-45.5671W +RWY ONY 13/31 1275 5099 75 33-21-12.6904N 098-49-28.1877W 33-20-36.8331N 098-48-45.9208W +RWY ONY 17/35 1275 5101 75 33-21-28.4255N 098-49-12.8366W 33-20-37.9617N 098-49-13.1482W +RWY PSN 09/27 423 4002 75 31-46-37.4640N 095-42-45.7507W 31-46-37.0819N 095-41-59.3904W +RWY PSN 18/36 423 5005 100 31-47-19.3621N 095-42-22.5500W 31-46-29.8340N 095-42-23.0769W +RWY PRX 03/21 548 4624 150 33-37-49.0036N 095-27-10.8544W 33-38-25.4568N 095-26-37.8124W +RWY PRX 14/32 548 4624 150 33-38-34.4312N 095-27-11.6404W 33-37-58.7933N 095-26-37.3483W +RWY PRX 17/35 548 6002 100 33-38-41.3526N 095-27-15.9519W 33-37-41.9870N 095-27-14.9310W +RWY TS75 10/28 330 1000 50 30-19-04.8200N 095-51-34.2500W 30-19-02.1600N 095-51-23.2600W +RWY 74T 17/35 725 2364 90 33-11-10.5400N 097-15-16.5000W 33-10-47.1400N 097-15-16.7100W +RWY F01 06/24 1602 2268 70 34-16-35.7780N 099-45-47.8410W 34-16-45.5260N 099-45-23.4710W +RWY F01 11/29 1602 2270 70 34-16-34.2790N 099-45-47.8410W 34-16-23.3330N 099-45-24.2220W +RWY F01 17/35 1602 4445 60 34-17-02.5200N 099-45-33.2900W 34-16-18.5600N 099-45-34.4200W +RWY T14 18/36 473 3120 60 32-57-24.4200N 096-05-45.0400W 32-56-53.5500N 096-05-45.3900W +RWY F23 01/19 1470 3415 75 32-26-49.5400N 098-41-00.6000W 32-27-21.0800N 098-40-46.2900W +RWY TA25 17/35 1476 5500 75 32-26-21.0300N 098-35-46.7400W 32-25-27.4400N 098-35-35.5500W +RWY RCK 17/35 474 2962 50 30-38-07.5900N 096-59-21.0800W 30-37-38.3200N 096-59-23.2300W +RWY F46 17/35 574 3373 45 32-56-06.6820N 096-26-10.3120W 32-55-33.6040N 096-26-05.1170W +RWY XS75 12/30 1417 5561 75 30-27-39.8222N 098-29-48.1189W 30-27-06.1030N 098-28-57.9100W +RWY 33XA 04/22 555 2800 40 32-51-15.2600N 096-18-41.4700W 32-51-34.8200N 096-18-18.2200W +RWY 58F 17/35 700 3340 130 33-22-14.3292N 097-08-45.6747W 33-21-41.3510N 097-08-48.3094W +RWY XA03 18/36 887 2250 100 33-25-51.0000N 097-16-15.5500W 33-25-28.8200N 097-16-17.6600W +RWY 81R 13/31 1255 4205 60 31-14-23.1470N 098-43-21.1610W 31-13-54.2560N 098-42-46.2940W +RWY 37TX 04/22 1418 2200 100 31-19-12.3800N 098-52-07.2800W 31-19-22.8200N 098-51-45.0300W +RWY 60F 17/35 1344 4300 50 33-39-15.9200N 099-15-40.7000W 33-38-33.4000N 099-15-40.7000W +RWY SWI 16/34 746 4000 75 33-37-46.0807N 096-35-15.7626W 33-37-07.6737N 096-35-04.3677W +RWY GYI 13/31 749 2277 60 33-43-02.1454N 096-40-42.4906W 33-42-44.1698N 096-40-26.2500W +RWY GYI 17L/35R 749 9000 150 33-43-34.7404N 096-40-21.2385W 33-42-05.7497N 096-40-24.5508W +RWY 84R 17/35 323 4000 75 30-02-01.1505N 097-10-04.5436W 30-01-21.9525N 097-09-58.1313W +RWY 88R 17/35 830 4185 30 30-28-46.3200N 098-07-17.7200W 30-28-04.9100N 098-07-16.6200W +RWY F56 08/26 1561 2211 50 32-54-44.8465N 099-44-09.8295W 32-54-44.4765N 099-43-43.9050W +RWY F56 13/31 1561 1702 50 32-54-45.0759N 099-44-03.4446W 32-54-33.0077N 099-43-49.5220W +RWY F56 17/35 1561 3707 60 32-54-51.2536N 099-44-09.4282W 32-54-14.5814N 099-44-09.7332W +RWY SEP 14/32 1321 4209 75 32-13-13.0494N 098-10-52.1880W 32-12-37.2818N 098-10-27.0879W +RWY TS76 16/34 1460 2700 22 30-15-20.9100N 098-35-41.2300W 30-14-54.2000N 098-35-40.9400W +RWY SLR 01/19 489 5001 75 33-09-11.0050N 095-37-21.0610W 33-09-59.7770N 095-37-11.1860W +RWY 2KL 12/30 854 2649 110 30-36-05.4761N 098-24-44.9288W 30-35-48.9011N 098-24-21.4345W +RWY T74 17/35 600 4000 75 30-34-41.2486N 097-26-36.0554W 30-34-01.6753N 097-26-34.9845W +RWY 68F 15/33 525 3300 50 31-39-56.2910N 096-18-47.5726W 31-39-28.2714N 096-18-27.9419W +RWY TPL 02/20 682 4740 100 31-08-51.8620N 097-24-34.0940W 31-09-33.4330N 097-24-08.8120W +RWY TPL 15/33 682 7000 150 31-09-35.9700N 097-24-43.7800W 31-08-29.8500N 097-24-19.7100W +RWY TRL 17/35 474 5006 75 32-42-55.3542N 096-16-01.5978W 32-42-05.8155N 096-16-01.4856W +RWY 72F 17/35 1273 3723 60 33-11-06.4300N 099-08-59.0000W 33-10-29.6000N 099-08-59.2900W +RWY TYR 04/22 544 7802 150 32-20-41.2000N 095-24-43.4400W 32-21-35.6779N 095-23-39.0105W +RWY TYR 13/31 544 5200 150 32-21-40.3784N 095-24-19.4861W 32-21-03.9024N 095-23-36.7308W +RWY TYR 17/35 544 4849 150 32-21-37.4400N 095-24-19.5534W 32-20-49.4630N 095-24-19.7054W +RWY F05 02/20 1265 5099 100 34-13-11.3757N 099-17-15.9995W 34-13-54.1977N 099-16-43.9147W +RWY F05 16/34 1265 4304 80 34-13-52.6692N 099-17-09.5406W 34-13-11.4078N 099-16-56.9070W +RWY ACT 01/19 516 7107 150 31-36-12.7231N 097-13-47.8415W 31-37-20.8957N 097-13-27.6366W +RWY ACT 14/32 516 5103 150 31-37-01.5360N 097-14-20.0650W 31-36-18.1420N 097-13-49.8780W +RWY PWG 04/22 592 3484 55 31-28-45.8140N 097-19-03.9900W 31-29-10.6480N 097-18-36.0770W +RWY PWG 17/35 592 5501 75 31-29-37.6540N 097-19-06.0290W 31-28-43.2210N 097-19-04.9200W +RWY CNW 17L/35R 470 8600 150 31-39-05.7479N 097-04-25.7230W 31-37-40.7224N 097-04-21.4658W +RWY CNW 17R/35L 470 6291 75 31-38-37.5356N 097-04-33.0001W 31-37-35.3367N 097-04-29.8764W +RWY 74TE 18/36 960 4191 50 32-04-01.6781N 097-47-39.3537W 32-03-20.3520N 097-47-43.4030W +RWY 51TE 10/28 555 2080 90 32-28-23.3760N 096-47-35.4120W 32-28-18.4764N 096-47-11.8176W +RWY WEA 17/35 991 2892 40 32-45-00.9379N 097-40-56.7174W 32-44-32.3263N 097-40-56.9384W +RWY T29 18/36 760 2395 100 33-38-01.3800N 096-56-27.2900W 33-37-37.6900N 096-56-27.7000W +RWY F14 04/22 1005 3107 100 33-56-38.3460N 098-37-12.2090W 33-56-58.3450N 098-36-44.2080W +RWY F14 13/31 1005 3320 40 33-57-04.5910N 098-37-12.5130W 33-56-39.0560N 098-36-47.7330W +RWY F14 16/34 1005 2037 42 33-57-05.3450N 098-36-56.2090W 33-56-45.3460N 098-36-53.2080W +RWY 7TX0 17/35 986 3500 45 33-50-00.2770N 098-34-21.9130W 33-49-25.6600N 098-34-21.9100W +RWY CWC 17/35 1003 4450 75 33-52-00.2344N 098-29-25.3020W 33-51-16.2160N 098-29-25.5721W +RWY SPS 15C/33C 1019 10002 150 34-00-22.5600N 098-29-49.7100W 33-58-50.6600N 098-29-05.6900W +RWY SPS 15L/33R 1019 6000 150 34-00-40.2310N 098-29-35.7940W 33-59-45.1030N 098-29-09.3870W +RWY SPS 15R/33L 1019 13100 300 34-00-13.6000N 098-29-58.2000W 33-58-13.2300N 098-29-00.5600W +RWY SPS 17/35 1019 7021 150 33-58-56.7020N 098-29-44.7530W 33-57-47.2570N 098-29-45.4710W +RWY 76F 17/35 522 3230 50 32-41-09.1105N 095-59-02.8840W 32-40-37.1433N 095-59-02.8329W +RWY 8TE1 04/22 497 2172 27 32-44-46.5000N 096-02-46.8100W 32-45-02.3500N 096-02-29.6300W +RWY F51 01/19 513 3213 50 32-56-04.6590N 095-16-49.7370W 32-56-34.9010N 095-16-38.1080W +RWY 5TA6 17/35 1820 900 50 31-56-17.5000N 099-53-43.9000W 31-56-08.6000N 099-53-44.1000W +RWY 77F 17/35 1871 3204 50 31-57-05.7524N 099-59-08.9346W 31-56-34.0458N 099-59-09.1857W +ILS 17 LOCALIZER IBWD 109.10 31-47-03.974N 098-57-17.460W - - 1373 6.00 179.36 - +ILS 17L LOC/GS IRUK 110.55 34-39-15.280N 099-15-34.310W 34-40-46.230N 099-15-28.440W 1372 3.90 179.97 3.00 +ILS 16L ILS/DME IUPE 110.15 32-58-26.443N 097-18-54.347W 32-59-39.717N 097-19-13.511W 707 4.56 170.26 3.00 +ILS 35 LOCALIZER IDUC 111.50 34-29-01.564N 097-57-36.183W - - 1110 6.00 359.30 - +ILS 17L ILS IGYI 111.70 33-41-54.599N 096-40-24.974W 33-43-23.751N 096-40-17.203W 740 4.42 181.78 3.00 +ILS 34 ILS IDYS 109.90 32-26-39.340N 099-51-36.230W 32-24-20.560N 099-51-08.740W 1784 3.00 348.90 2.50 +ILS 08L ILS/DME IBZU 111.55 30-00-25.868N 095-19-36.974W 30-00-29.752N 095-21-18.694W 87 3.98 89.95 3.00 +ILS 31R ILS/DME IRRA 110.90 32-54-52.665N 097-01-26.098W 32-53-51.744N 097-00-07.955W 513 4.27 315.40 3.00 +ILS 35L ILS ILTS 110.30 34-41-07.010N 099-16-25.760W 34-38-54.540N 099-16-19.780W 1345 3.00 359.99 3.00 +ILS 18 ILS/DME IEFE 109.35 33-09-38.030N 096-35-22.170W 33-11-00.790N 096-35-22.070W 568 4.21 182.11 3.00 +ILS 35L ILS IJZW 110.95 32-34-30.971N 097-18-34.736W 32-33-30.553N 097-18-29.035W 689 5.72 0.11 3.00 +ILS 31L ILS/DME ILVF 111.10 32-51-14.043N 096-51-59.215W 32-50-07.296N 096-50-47.582W 472 3.96 313.00 3.08 +ILS 16 ILS/DME IFTW 109.90 32-48-20.551N 097-21-30.111W 32-49-35.905N 097-21-47.545W 698 4.46 171.94 3.00 +ILS 31R ILS/DME IOVW 111.50 32-51-28.654N 096-51-27.346W 32-50-35.337N 096-50-32.117W 481 4.95 315.77 3.00 +ILS 33L ILS/DME ISPS 109.70 34-00-31.944N 098-30-06.969W 33-58-25.154N 098-28-59.852W 990 3.00 338.35 3.00 +ILS 35R ILS/DME IABI 110.30 32-24-42.578N 099-40-29.277W 32-23-31.005N 099-40-24.251W 1771 4.77 359.76 3.00 +ILS 15 ILS/DME ITPL 111.50 31-08-20.220N 097-24-16.210W 31-09-25.643N 097-24-33.995W 679 5.00 162.70 2.90 +ILS 35R LOC/GS IFNM 110.55 34-41-15.520N 099-15-34.400W 34-39-39.540N 099-15-28.340W 1345 3.68 359.96 3.00 +ILS 17R ILS/DME IGFQ 110.95 30-10-36.099N 097-40-42.200W 30-12-36.062N 097-40-50.042W 527 3.00 178.69 3.00 +ILS 17L ILS/DME IVNK 110.50 30-10-34.110N 097-39-25.799W 30-12-01.994N 097-39-23.543W 484 3.98 178.70 3.00 +ILS 34 ILS/DME IGKY 111.55 32-40-29.140N 097-05-49.230W 32-39-28.890N 097-05-38.910W 594 5.65 348.09 3.00 +ILS 17L ILS ICNW 110.70 31-37-28.869N 097-04-20.873W 31-38-55.934N 097-04-19.443W 466 4.09 177.56 3.00 +ILS 15 ILS IGRK 111.10 31-03-06.753N 097-49-17.335W 31-04-36.580N 097-50-05.859W 1006 3.63 157.45 3.00 +ILS 18 ILS/DME IHQZ 109.75 32-44-02.574N 096-31-50.355W 32-45-07.945N 096-31-45.532W 444 5.19 180.88 3.00 +ILS 36 LOC/GS IFWH 109.30 32-47-18.760N 097-26-28.775W 32-45-21.773N 097-26-24.180W 641 3.08 358.00 3.00 +ILS 13R ILS/DME ILWN 109.50 32-53-17.460N 097-03-40.070W 32-54-24.131N 097-04-54.081W 588 3.89 139.19 3.00 +ILS 31 ILS IRBD 108.50 32-41-21.389N 096-52-43.452W 32-40-33.118N 096-51-51.903W 651 5.38 315.21 3.00 +ILS 17 ILS/DME IGVT 110.50 33-03-10.790N 096-03-55.970W 33-04-34.489N 096-03-50.001W 521 4.90 180.73 3.00 +ILS 31 ILS/DME IVMH 109.55 32-47-17.020N 098-03-54.080W 32-46-40.460N 098-03-17.990W 967 6.00 315.73 3.00 +ILS 36L ILS/DME IBXN 111.90 32-55-06.870N 097-03-16.690W 32-52-54.409N 097-03-22.040W 580 2.78 0.24 3.00 +ILS 36R ILS/DME IFJN 110.55 32-55-06.820N 097-03-02.590W 32-52-54.851N 097-03-07.968W 577 3.00 0.25 3.00 +ILS 17R ILS IALT 111.30 34-38-31.520N 099-16-25.760W 34-40-45.540N 099-16-19.790W 1371 3.00 180.00 3.00 +ILS 17R LOC/DME IHEW 110.50 30-03-08.687N 095-33-06.328W - - 158 5.24 172.79 - +ILS 34 ILS/DME ICLL 110.55 30-35-59.577N 096-21-48.931W 30-34-49.308N 096-21-39.375W 303 4.89 348.93 2.90 +ILS 13L ILS/DME IDAL 111.50 32-50-23.088N 096-50-11.378W 32-51-15.355N 096-51-18.489W 478 4.51 133.00 3.00 +ILS 18 ILS IDTO 109.10 33-11-27.910N 097-11-53.480W 33-12-32.250N 097-11-56.770W 636 5.33 181.06 3.00 +ILS 33 ILS/DME IBTJ 109.35 31-04-57.080N 097-50-10.830W 31-03-24.870N 097-49-31.100W 976 3.70 337.44 3.00 +ILS 13R ILS/DME IDPX 111.10 32-49-56.957N 096-50-29.873W 32-50-52.167N 096-51-38.757W 472 4.28 135.77 3.00 +ILS 15C LOC/GS ISHP 110.50 33-58-37.980N 098-28-59.630W 34-00-12.910N 098-29-41.890W 994 3.53 158.35 3.00 +ILS 18 ILS/DME INFW 108.70 32-44-47.417N 097-26-30.406W 32-46-57.605N 097-26-23.131W 620 3.00 178.00 3.00 +ILS 13 ILS ITYR 109.90 32-20-58.672N 095-23-30.597W 32-21-31.799N 095-24-14.758W 524 6.00 135.28 2.87 +ILS 17R LOC/DME IEMB 109.75 32-24-19.760N 099-41-05.303W - - 1796 4.88 179.76 - +ILS 02 LOCALIZER IMLC 108.30 34-53-25.742N 095-46-47.393W - - 766 6.00 20.29 - +ILS 35C ILS/DME IPKQ 110.30 32-55-07.040N 097-01-33.450W 32-52-54.331N 097-01-29.472W 557 2.77 0.26 3.00 +ILS 35L ILS/DME IUWX 111.35 32-55-07.290N 097-01-47.522W 32-52-54.983N 097-01-43.534W 559 3.00 0.26 3.00 +ILS 35R ILS/DME IAJQ 111.75 32-54-04.194N 097-00-35.150W 32-52-43.440N 097-00-30.904W 559 4.20 0.27 3.00 +ILS 35R ILS/DME IHCE 110.50 30-12-24.401N 097-39-28.686W 30-10-54.321N 097-39-21.770W 470 3.98 358.70 3.00 +ILS 35 ILS ILAW 109.10 34-34-56.120N 098-25-02.612W 34-33-27.113N 098-25-01.612W 1069 4.03 356.94 3.00 +ILS 35L ILS/DME IBSM 110.95 30-13-00.761N 097-40-46.025W 30-10-58.540N 097-40-47.349W 484 3.00 358.69 3.00 +ILS 15 ILS/DME IADS 110.10 32-57-29.684N 096-49-55.022W 32-58-21.212N 096-50-21.598W 630 6.00 159.87 3.00 +ILS 15 LOC/DME ICPT 111.15 32-20-36.489N 097-25-44.915W - - 859 6.01 159.29 - +ILS 34R ILS/DME IJVX 110.15 33-00-09.055N 097-19-15.349W 32-58-41.552N 097-19-01.625W 666 4.04 350.26 3.00 +ILS 18L ILS/DME ICIX 110.55 32-52-33.610N 097-03-03.390W 32-54-45.220N 097-03-06.820W 594 3.00 180.25 3.00 +ILS 26R ILS/DME IOND 111.55 30-00-25.769N 095-21-43.965W 30-00-29.813N 095-20-02.257W 90 3.98 269.95 3.00 +ILS 18R ILS/DME IVYN 111.90 32-52-33.934N 097-03-17.455W 32-54-45.470N 097-03-21.570W 600 2.77 180.25 3.00 +ILS 16 ILS ITYY 109.90 32-23-51.300N 099-50-57.170W 32-26-07.770N 099-51-33.650W 1784 3.00 168.90 2.60 +ILS 19 ILS/DME IACT 109.70 31-36-07.202N 097-13-49.475W 31-37-11.757N 097-13-35.357W 498 5.22 194.16 3.00 +ILS 17C ILS/DME IFLQ 110.30 32-52-33.151N 097-01-34.278W 32-54-45.640N 097-01-28.770W 556 2.77 180.26 3.00 +ILS 17L ILS/DME IPPZ 111.75 32-52-19.437N 097-00-35.727W 32-53-45.230N 097-00-31.140W 526 4.20 180.27 3.00 +ILS 14 ILS/DME ICXO 108.70 30-20-36.305N 095-24-18.573W 30-21-40.347N 095-25-03.669W 228 6.00 145.62 3.00 +ILS 17R ILS/DME IJHZ 111.35 32-52-33.240N 097-01-48.346W 32-54-45.820N 097-01-43.064W 561 3.00 180.26 3.00 +ILS 34 ILS/DME IUXT 109.90 32-49-59.147N 097-21-46.725W 32-48-45.440N 097-21-38.445W 667 4.68 351.94 3.00 +ILS 31 ILS IAIW 108.90 34-19-00.155N 097-01-53.742W 34-17-59.520N 097-00-35.016W 728 4.01 315.54 3.00 +ILS 33 ILS/DME ITBQ 110.10 32-58-49.316N 096-50-29.808W 32-57-48.170N 096-50-07.405W 645 5.41 339.87 3.00 +NAV ADH VOR/DME 34-48-09.200N 096-40-12.300W 987 117.80 125X +NAV LTS VORTAC 34-39-46.540N 099-16-16.190W 1361 109.80 035X +NAV ADM VORTAC 34-12-41.710N 097-10-05.621W 937 116.70 114X +NAV DUC VOR/DME 34-23-04.134N 097-55-00.553W 1089 111.00 047X +NAV URH VOR/DME 33-56-39.070N 096-23-30.610W 681 114.30 090X +NAV PFL NDB 34-36-31.886N 098-24-13.636W 1143 425 - +NAV OFZ NDB 34-46-52.969N 098-24-08.284W 1276 388 - +NAV HBR VORTAC 34-51-59.596N 099-03-48.186W 1472 111.80 055X +NAV HHW NDB 34-02-22.164N 095-32-22.502W 547 323 - +NAV LAW VOR/DME 34-29-46.235N 098-24-47.102W 1104 109.40 031X +NAV MLC VORTAC 34-50-57.987N 095-46-56.439W 782 112.00 057X +NAV PVJ NDB 34-42-55.490N 097-13-44.080W 960 384 - +NAV ABI VORTAC 32-28-52.781N 099-51-48.449W 1810 113.70 084X +NAV TQA VOR/DME 32-14-08.675N 099-49-00.418W 2058 111.60 053X +NAV AHX NDB 32-09-33.553N 095-49-48.871W 440 269 - +NAV CSZ NDB 32-03-48.587N 095-57-27.435W 383 215 - +NAV CWK VORTAC 30-22-42.780N 097-31-47.450W 593 112.80 075X +NAV UBC NDB 31-40-49.710N 099-58-29.706W 1735 239 - +NAV ABG NDB 32-35-07.783N 095-06-47.230W 424 404 - +NAV BYP VORTAC 33-32-14.950N 096-14-02.740W 700 114.60 093X +NAV UKW VORTAC 33-32-09.193N 097-49-16.603W 1102 112.40 071X +NAV GMZ NDB 33-36-19.303N 097-46-25.389W 1090 356 - +NAV BBD NDB 31-10-40.398N 099-19-21.325W 1815 380 - +NAV BWD VOR/DME 31-53-33.297N 098-57-26.857W 1574 108.60 023X +NAV BMQ NDB 30-44-24.990N 098-14-10.449W 0 341 - +NAV MII NDB 33-02-25.425N 096-14-54.922W 541 316 - +NAV CQY VORTAC 32-11-08.600N 096-13-05.170W 400 114.80 095X +NAV CLL VORTAC 30-36-18.006N 096-25-14.451W 264 113.30 080X +NAV CRS NDB 32-01-42.302N 096-23-40.626W 440 396 - +NAV CGQ NDB 32-03-50.887N 096-25-34.676W 394 344 - +NAV CVE VOR/DME 32-53-25.134N 096-54-14.270W 447 116.20 109X +NAV VLY NDB 33-15-42.450N 096-35-19.710W 640 421 - +NAV TTT VOR/DME 32-52-08.977N 097-02-25.812W 540 113.10 078X +NAV FUZ VORTAC 32-53-22.020N 097-10-45.931W 637 115.70 104X +NAV OIP NDB 32-23-54.472N 098-48-37.223W 1428 410 - +NAV PYF NDB 31-51-45.587N 096-11-50.899W 350 418 - +NAV HLR NDB 31-07-45.049N 097-42-29.245W 876 347 - +NAV GR NDB 31-10-04.229N 097-52-41.622W 0 323 - +NAV GRK VOR/DME 31-01-58.390N 097-48-49.640W 963 111.80 055X +NAV NFW TACAN 32-46-17.006N 097-26-21.492W 631 108.70 024X +NAV FZT VOR/DME 32-04-28.575N 095-31-50.846W 305 111.40 051X +NAV GUO NDB 30-41-03.819N 097-40-47.674W 779 332 - +NAV JEN VORTAC 32-09-34.520N 097-52-39.650W 1300 115.00 097X +NAV GHX NDB 33-09-57.112N 098-29-47.797W 0 371 - +NAV MJF TACAN 33-03-58.571N 096-03-41.030W 540 109.60 033X +NAV SYW NDB 32-58-54.696N 096-04-02.307W 493 428 - +NAV MNZ NDB 31-37-17.445N 098-08-56.074W 1240 251 - +NAV AKL NDB 33-11-27.804N 099-43-12.025W 1622 407 - +NAV DWH NDB 30-07-31.918N 095-33-57.110W 0 521 - +NAV UTS NDB 30-44-26.696N 095-35-27.125W 943 308 - +NAV JSO NDB 31-52-12.612N 095-12-55.805W 670 263 - +NAV JCT VORTAC 30-35-52.876N 099-49-02.932W 2282 116.00 107X +NAV AGJ VORTAC 31-11-07.816N 098-08-30.688W 1191 112.50 072X +NAV LOA VORTAC 31-07-26.463N 095-58-04.642W 346 110.80 045X +NAV LLO VORTAC 30-47-46.831N 098-47-14.599W 1207 108.20 019X +NAV PQF NDB 32-48-33.721N 096-31-44.831W 445 248 - +NAV GNL VOR/DME 31-34-53.316N 096-32-56.722W 514 108.80 025X +NAV LXY NDB 31-38-22.504N 096-30-44.128W 532 329 - +NAV MQP VORTAC 32-43-34.250N 097-59-50.790W 900 117.70 124X +NAV TNV VOR/DME 30-17-18.695N 096-03-29.664W 247 115.90 106X +NAV PSN NDB 31-46-50.368N 095-42-02.710W 400 375 - +NAV PRX VOR/DME 33-32-32.563N 095-26-53.845W 510 113.60 083X +NAV UIM VOR/DME 32-52-49.734N 095-22-00.809W 517 114.00 087X +NAV JUG NDB 32-40-05.090N 096-31-56.108W 420 388 - +NAV DNI NDB 33-49-35.397N 096-40-08.015W 680 341 - +NAV STV VORTAC 30-12-24.334N 098-42-20.719W 1530 113.80 085X +NAV SLR VOR/DME 33-11-54.817N 095-32-33.346W 508 109.00 027X +NAV TPL VOR/DME 31-12-33.609N 097-25-29.881W 710 110.40 041X +NAV AVZ NDB 32-45-36.460N 096-14-56.920W 491 260 - +NAV TYR VOR/DME 32-21-21.121N 095-24-12.477W 564 114.20 089X +NAV ROB NDB 31-30-13.701N 097-04-10.501W 392 400 - +NAV ACT VORTAC 31-39-44.387N 097-16-08.531W 510 115.30 100X +NAV ICF NDB 33-54-38.620N 098-27-16.800W 940 296 - +NAV SKB NDB 33-46-56.186N 098-29-17.382W 983 344 - +NAV SHP TACAN 33-58-57.770N 098-29-15.620W 1020 110.80 045X +NAV SPS VORTAC 33-59-14.235N 098-35-36.499W 1133 112.70 074X + +# +# To visit the ACM air museum at the Addison airport, uncomment these lines: +# +#FEATURE ../../missiles/aim9.obv 32-57-10.000N 096-49-59.000W 660 290 +#FEATURE ../../missiles/sa10.obv 32-57-11.000N 096-49-59.000W 660 290 +#FEATURE ../../missiles/sa11.obv 32-57-12.000N 096-49-59.000W 660 290 +#FEATURE ../../missiles/sa2.obv 32-57-13.000N 096-49-59.000W 660 290 +#FEATURE ../../features/telar1.obv 32-57-14.000N 096-49-59.000W 660 290 +#FEATURE ../../tracer.obv 32-57-15.000N 096-49-59.000W 660 290 +#FEATURE ../../features/hangar.obv 32-57-17.000N 096-49-59.000W 644 290 +#FEATURE ../../aircraft/c172.obv 32-57-19.000N 096-49-59.000W 660 290 +#FEATURE ../../aircraft/f16.obv 32-57-21.000N 096-49-59.000W 660 290 +#FEATURE ../../aircraft/f18.obv 32-57-23.000N 096-49-59.000W 660 290 +#FEATURE ../../aircraft/il78.obv 32-57-25.000N 096-49-59.000W 660 290 +#FEATURE ../../aircraft/kc135.obv 32-57-27.000N 096-49-59.000W 660 290 +#FEATURE ../../aircraft/mig23.obv 32-57-29.000N 096-49-59.000W 660 290 +#FEATURE ../../aircraft/mig25.obv 32-57-31.000N 096-49-59.000W 660 290 +#FEATURE ../../aircraft/mig29.obv 32-57-33.000N 096-49-59.000W 660 290 +#FEATURE ../../aircraft/su30.obv 32-57-35.000N 096-49-59.000W 660 290 +#FEATURE ../../aircraft/ufo.obv 32-57-37.000N 096-49-59.000W 660 290 +#FEATURE ../../aircraft/b-747.obv 32-57-39.000N 096-49-59.000W 680 290 diff -Nru acm-5.0/objects/zones/usa/lasvegaseast.txt acm-6.0+20200416/objects/zones/usa/lasvegaseast.txt --- acm-5.0/objects/zones/usa/lasvegaseast.txt 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/objects/zones/usa/lasvegaseast.txt 2020-04-16 12:05:39.000000000 +0000 @@ -0,0 +1,99 @@ +# Las Vegas east area scenery. +# Created: 2020-04-16 +# Latitude range: [35N, 40N[ +# Longitude range: [115W, 110W[ +# 2017-10-04 Checked against https://nfdc.faa.gov/xwiki/bin/view/NFDC/56DaySub-2017-03-02 +# "56 Day NASR Subscription - Effective March 2, 2017". + +# ?????: +TEAM1_LOC 35N 115W 000 031 +# ?????: +TEAM1_LOC 35N 115W 000 031 +GROUND_COLOR #305030 +RWY IFP 16/34 707 8500 150 35-09-58.5647N 114-33-36.7566W 35-08-34.6559N 114-33-30.4355W +RWY A20 18/36 725 3700 42 35-00-38.6200N 114-33-54.1200W 35-00-02.0200N 114-33-54.0700W +RWY AZC 02/20 4874 5099 60 36-57-12.9834N 113-01-00.6071W 36-57-57.4935N 113-00-31.1352W +RWY AZC 11/29 4874 6300 75 36-57-52.9339N 113-01-25.9976W 36-57-19.4226N 113-00-20.5901W +RWY FLG 03/21 7014 8800 150 35-07-52.3859N 111-40-44.1277W 35-08-57.8836N 111-39-34.4039W +RWY GCN 03/21 6609 8999 150 35-56-34.7377N 112-09-24.7015W 35-57-42.2257N 112-08-13.4164W +RWY 40G 01/19 5999 4199 45 35-38-42.6600N 112-09-02.2800W 35-39-21.4100N 112-08-43.9800W +RWY 0V7 05/23 5688 7101 75 36-42-44.8841N 110-14-22.1965W 36-43-13.5730N 110-13-02.6308W +RWY 38AZ 02/20 6581 7500 75 36-27-47.6340N 110-25-30.3650W 36-28-48.8620N 110-24-38.5300W +RWY IGM 03/21 3449 6827 150 35-15-05.3465N 113-56-53.1718W 35-15-53.0746N 113-55-54.9609W +RWY IGM 17/35 3449 6725 75 35-16-12.3498N 113-56-09.7601W 35-15-05.8533N 113-56-09.7987W +RWY L41 03/21 3603 3715 35 36-48-25.3000N 111-38-55.3900W 36-48-52.5100N 111-38-24.7000W +RWY L25 01/19 2941 2900 110 36-05-21.9300N 114-02-53.3800W 36-05-49.3400N 114-02-42.9500W +RWY PGA 07/25 4316 2201 75 36-55-44.9760N 111-27-12.6780W 36-55-47.9808N 111-26-45.8295W +RWY PGA 15/33 4316 5950 150 36-55-58.1511N 111-26-58.4275W 36-55-00.2051N 111-26-45.8520W +RWY 1G4 17/35 4817 5000 75 35-59-34.6235N 113-48-58.0393W 35-58-45.4104N 113-49-03.7925W +RWY L37 05/23 5397 5100 45 35-31-27.4800N 113-15-19.0200W 35-31-48.6100N 113-14-23.0000W +RWY P10 04/22 5573 4200 50 35-47-18.0100N 110-25-45.2100W 35-47-41.4900N 110-25-03.1400W +RWY P23 04/22 5237 4800 75 35-19-52.0100N 112-53-34.5100W 35-20-20.5300N 112-52-48.2700W +RWY U30 18/36 1549 3500 50 36-01-30.5600N 114-20-01.2600W 36-00-56.7000N 114-20-10.1400W +RWY T03 15/33 4513 6230 75 36-06-03.4900N 111-23-08.0500W 36-05-03.6100N 111-22-50.1200W +RWY 1Z1 16/34 4100 4600 40 36-15-46.1500N 113-13-52.9400W 36-15-00.7400N 113-13-49.4000W +RWY CMR 18/36 6691 6000 100 35-18-48.9315N 112-11-32.9523W 35-17-50.6336N 112-11-46.3479W +RWY INW 04/22 4941 6236 75 35-00-51.3638N 110-44-16.3536W 35-01-23.4827N 110-43-12.3716W +RWY INW 11/29 4941 7100 150 35-01-44.9039N 110-43-40.3589W 35-01-10.1599N 110-42-26.2025W +RWY BVU 09/27 2204 4803 75 35-56-50.8480N 114-52-08.4984W 35-56-42.8207N 114-51-10.9298W +RWY BVU 15/33 2204 3852 75 35-57-13.6471N 114-51-48.3950W 35-56-36.8011N 114-51-36.6176W +RWY ELY 12/30 6259 4825 60 39-18-12.3189N 114-51-06.8433W 39-17-35.4591N 114-50-27.9267W +RWY ELY 18/36 6259 6018 150 39-18-31.7649N 114-50-08.3148W 39-17-34.0123N 114-50-26.5388W +RWY 67L 01/19 1978 5121 75 36-49-37.2268N 114-03-36.6060W 36-50-21.3427N 114-03-05.7318W +RWY U08 13/31 1366 4811 75 36-34-25.8680N 114-26-50.5602W 36-33-44.5151N 114-26-21.4166W +RWY 0L9 06/24 1535 3400 50 36-18-36.4495N 114-28-10.3968W 36-18-43.0222N 114-27-29.6462W +RWY 1L1 17/35 4831 4606 60 37-47-37.4108N 114-25-10.3664W 37-46-51.9314N 114-25-12.8970W +RWY 1L3 16/34 3413 5040 70 35-27-05.3003N 114-54-36.0544W 35-26-15.5855N 114-54-31.4374W +RWY U52 07/25 5863 2150 50 38-13-39.8503N 112-40-50.3990W 38-13-40.9934N 112-40-23.4932W +RWY U52 13/31 5863 4984 75 38-14-15.1378N 112-40-45.7753W 38-13-33.4802N 112-40-12.4771W +RWY BCE 03/21 7590 7395 75 37-41-58.1583N 112-09-18.3650W 37-42-48.2511N 112-08-11.3895W +RWY CDC 02/20 5622 8650 150 37-41-26.1974N 113-06-28.1454W 37-42-36.8778N 113-05-27.5542W +RWY CDC 08/26 5622 4822 60 37-42-09.8213N 113-06-22.0634W 37-42-04.1730N 113-05-22.5093W +RWY DTA 17/35 4759 5502 75 39-23-28.1358N 112-30-07.7830W 39-22-33.7700N 112-30-08.0955W +RWY 2UT2 08/26 8280 2071 40 37-31-39.2500N 112-39-51.4500W 37-31-45.4200N 112-39-26.9300W +RWY 1L7 13/31 5737 5000 60 37-45-01.9600N 111-34-32.8200W 37-44-24.3900N 111-33-52.3700W +RWY FOM 04/22 4985 5040 75 38-57-14.4666N 112-22-12.9588W 38-57-44.0889N 112-21-21.6829W +RWY U96 01/19 4388 5700 60 37-25-42.1700N 110-34-07.9400W 37-26-32.0100N 110-33-34.9700W +RWY HVE 08/26 4446 5675 75 38-24-59.9300N 110-42-50.5400W 38-24-52.8500N 110-41-39.8100W +RWY HVE 17/35 4446 2600 120 38-25-22.9300N 110-42-02.5400W 38-24-57.2900N 110-42-04.7700W +RWY 69V 08/26 5915 4048 75 39-21-39.7900N 110-55-25.5900W 39-21-39.8600N 110-54-34.0400W +RWY 69V 12/30 5915 3640 70 39-21-54.4300N 110-55-14.6000W 39-21-26.9800N 110-54-44.5900W +RWY 69V 18/36 5915 2079 56 39-21-50.5100N 110-55-01.2800W 39-21-31.5500N 110-55-11.4800W +RWY 1L8 01/19 3350 3282 40 37-08-09.4700N 113-18-28.1200W 37-08-40.3000N 113-18-15.4300W +RWY KNB 01/19 4868 6193 75 37-00-09.3100N 112-32-06.9200W 37-01-06.4600N 112-31-39.6600W +RWY 38U 13/31 7029 5900 75 38-22-08.7077N 111-36-07.4360W 38-21-22.6398N 111-35-21.9790W +RWY 41U 03/21 5516 5021 75 39-19-35.7447N 111-37-08.1008W 39-20-10.5540N 111-36-22.5993W +RWY MLF 16/34 5042 5004 75 38-26-00.6124N 113-00-47.4281W 38-25-11.1638N 113-00-48.1446W +RWY U14 17/35 5022 6300 100 39-44-42.7742N 111-52-12.2896W 39-43-40.5271N 111-52-12.0761W +RWY U55 18/36 6763 5700 75 37-51-09.6579N 112-23-20.3112W 37-50-15.9263N 112-23-41.6325W +RWY 1L9 04/22 5930 5000 75 37-51-19.9357N 112-49-22.1182W 37-51-49.4332N 112-48-32.0706W +RWY PUC 01/19 5958 8310 100 39-36-17.7155N 110-45-18.7701W 39-37-35.6868N 110-44-45.3171W +RWY PUC 08/26 5958 3150 75 39-36-54.4719N 110-45-24.1566W 39-36-54.5475N 110-44-43.9008W +RWY PUC 15/33 5958 4514 75 39-36-55.3742N 110-45-24.2460W 39-36-13.8352N 110-45-03.3150W +RWY RIF 01/19 5318 7100 100 38-43-31.4277N 112-06-25.7660W 38-44-34.1548N 112-05-45.6348W +RWY SGU 01/19 2884 9300 150 37-01-28.6316N 113-30-59.4754W 37-02-53.2769N 113-30-14.6768W +RWY 44U 02/20 5159 3855 60 39-01-29.3500N 111-50-32.0700W 39-01-59.6600N 111-50-02.4600W +ILS 21 LOC/GS IFLG 110.50 35-08-23.340N 111-40-16.050W 35-08-38.710N 111-39-57.314W 6999 4.60 224.59 3.00 +ILS 19 ILS/DME ISGU 110.90 37-02-57.400N 113-30-18.730W 37-02-44.480N 113-30-23.370W 2875 5.00 210.15 3.10 +ILS 01 ILS/DME IPUC 109.35 39-37-45.551N 110-44-41.072W 39-36-25.997N 110-45-18.924W 5820 4.28 29.00 3.00 +ILS 20 ILS IECC 110.10 37-41-16.789N 113-06-36.179W 37-42-30.642N 113-05-38.147W 5593 4.09 214.13 3.00 +ILS 03 LOC/GS IGCN 108.90 35-57-49.718N 112-08-05.502W 35-56-44.484N 112-09-19.709W 6534 4.01 40.54 3.00 +NAV AZC NDB 36-57-36.232N 113-00-33.032W 4858 403 - +NAV FLG VOR/DME 35-08-49.912N 111-40-26.986W 7026 113.85 085Y +NAV GCN VOR/DME 35-57-37.223N 112-08-45.766W 6670 113.10 078X +NAV IGM VOR/DME 35-15-37.847N 113-56-02.694W 3422 108.80 025X +NAV PGA VOR/DME 36-55-51.758N 111-26-50.794W 4277 117.60 123X +NAV PGS VOR/DME 35-37-28.963N 113-32-40.080W 4760 112.00 57X +NAV TBC VORTAC 36-07-16.723N 111-16-10.516W 5045 113.50 082X +NAV INW VORTAC 35-03-41.759N 110-47-42.071W 4913 112.60 073X +NAV BLD VORTAC 35-59-44.845N 114-51-48.884W 3642 116.70 114X +NAV ELY VOR/DME 39-17-53.249N 114-50-53.900W 6248 110.60 043X +NAV MMM VORTAC 36-46-09.309N 114-16-38.828W 2106 114.30 090X +NAV ILC VORTAC 38-15-00.694N 114-23-39.215W 9318 116.30 110X +NAV BCE VORTAC 37-41-21.074N 112-18-14.030W 9040 112.80 075X +NAV EHK VOR/DME 37-47-14.388N 113-04-05.630W 5464 117.30 120X +NAV DTA VORTAC 39-18-07.960N 112-30-20.001W 4642 116.10 108X +NAV HVE VORTAC 38-25-00.534N 110-41-59.038W 4430 115.90 106X +NAV MLF VORTAC 38-21-37.355N 113-00-47.667W 4978 112.10 058X +NAV PUC VOR/DME 39-36-11.490N 110-45-12.700W 5830 115.50 102X +NAV UTI VOR/DME 37-01-03.430N 113-31-04.440W 2848 108.60 23X diff -Nru acm-5.0/objects/zones/usa/lasvegaswest.txt acm-6.0+20200416/objects/zones/usa/lasvegaswest.txt --- acm-5.0/objects/zones/usa/lasvegaswest.txt 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/objects/zones/usa/lasvegaswest.txt 2020-04-16 12:05:39.000000000 +0000 @@ -0,0 +1,162 @@ +# Las Vegas west area scenery. +# Created: 2020-04-16 +# Latitude range: [35N, 40N[ +# Longitude range: [120W, 115W[ +# 2017-10-04 Checked against https://nfdc.faa.gov/xwiki/bin/view/NFDC/56DaySub-2017-03-02 +# "56 Day NASR Subscription - Effective March 2, 2017". + +# ?????: +TEAM1_LOC 35N 120W 000 031 +# ?????: +TEAM1_LOC 35N 120W 000 031 +GROUND_COLOR #305030 +RWY 0O2 15/33 922 3157 50 35-17-25.7305N 116-04-57.6284W 35-16-55.4871N 116-04-48.1234W +RWY L45 16/34 378 4000 75 35-19-49.2388N 118-59-47.9637W 35-19-09.8542N 118-59-43.3854W +RWY BFL 12L/30R 510 10849 150 35-26-46.8273N 119-04-16.5846W 35-25-30.5458N 119-02-44.3966W +RWY BFL 12R/30L 510 7703 100 35-26-19.4810N 119-03-56.2709W 35-25-25.3119N 119-02-50.8302W +RWY BIH 08/26 4124 5567 100 37-22-25.1389N 118-22-26.8872W 37-22-24.6629N 118-21-17.9344W +RWY BIH 12/30 4124 7498 100 37-22-48.5093N 118-22-24.0154W 37-21-55.6498N 118-21-18.9141W +RWY BIH 17/35 4124 5600 100 37-22-50.6424N 118-21-41.9001W 37-21-55.2910N 118-21-42.4951W +RWY O57 16/34 6472 3854 60 38-16-11.8000N 119-13-21.9092W 38-15-33.7061N 119-13-21.7548W +RWY L62 11/29 326 3260 50 35-21-23.0100N 119-29-01.8300W 35-21-01.8800N 119-28-32.0900W +RWY L71 06/24 2454 6027 60 35-08-57.0641N 118-01-35.1130W 35-09-11.9351N 118-00-24.8444W +RWY NID 03/21 2284 9993 200 35-40-32.3092N 117-42-30.2161W 35-41-45.4414N 117-41-08.7391W +RWY NID 08/26 2284 7702 75 35-40-59.7852N 117-42-14.7286W 35-40-58.7498N 117-40-41.3712W +RWY NID 14/32 2284 9014 200 35-41-55.5275N 117-41-35.5134W 35-40-35.3200N 117-40-47.8535W +RWY CRO 13/31 197 3800 50 36-06-25.0700N 119-35-53.7700W 36-05-53.9400N 119-35-27.8100W +RWY 24CL 14/32 205 6815 75 36-05-50.3600N 119-32-45.7000W 36-04-48.0700N 119-32-14.0200W +RWY L06 15/33 -210 3065 70 36-27-52.2900N 116-52-53.0000W 36-27-23.4100N 116-52-41.6000W +RWY L09 05/23 25 3260 65 36-36-04.1200N 117-09-49.1400W 36-36-23.5500N 117-09-17.2200W +RWY DLO 14/32 316 5659 75 35-45-10.0912N 119-14-23.9508W 35-44-18.0000N 119-13-58.8510W +RWY O63 13/31 344 2315 40 36-14-42.9500N 119-09-04.7000W 36-14-22.9000N 119-08-51.0600W +RWY L73 16/34 635 3000 60 35-36-01.8300N 119-07-41.9500W 35-35-32.1500N 119-07-41.7100W +RWY FCH 12/30 280 3627 75 36-44-06.0996N 119-49-31.2941W 36-43-45.1873N 119-48-55.0969W +RWY FAT 11L/29R 336 9539 150 36-47-02.4054N 119-43-48.3081W 36-46-07.8210N 119-42-12.6879W +RWY FAT 11R/29L 336 8008 150 36-46-59.0199N 119-43-56.7143W 36-46-13.2055N 119-42-36.4421W +RWY E79 12/30 321 2473 50 36-50-32.8000N 119-52-21.1900W 36-50-16.4700N 119-51-58.5100W +RWY HJO 14/32 240 5179 75 36-19-22.6844N 119-37-54.6517W 36-18-37.6677N 119-37-24.4841W +RWY 2O7 05/23 3908 1498 30 36-48-58.6200N 118-12-27.3600W 36-49-04.1000N 118-12-10.2400W +RWY 2O7 14/32 3908 3533 60 36-49-14.0200N 118-12-25.7300W 36-48-41.8100N 118-12-08.9000W +RWY IYK 02/20 2457 6275 75 35-38-53.7600N 117-50-00.1300W 35-39-47.0200N 117-49-21.1200W +RWY IYK 10/28 2457 4150 75 35-40-04.0200N 117-50-06.2800W 35-39-46.4100N 117-49-20.8200W +RWY IYK 15/33 2457 7100 75 35-40-01.4200N 117-50-03.4700W 35-38-53.3400N 117-49-42.4600W +RWY L05 17/35 2614 3500 50 35-43-58.8300N 118-25-09.2600W 35-43-24.3200N 118-25-12.6600W +RWY O24 15/33 6802 3920 50 37-57-46.2981N 119-06-28.4440W 37-57-09.4200N 119-06-13.3964W +RWY NLC 14L/32R 230 13502 200 36-21-50.9892N 119-57-38.5207W 36-19-49.0290N 119-56-31.3682W +RWY NLC 14R/32L 230 13501 200 36-20-09.4824N 119-57-44.1802W 36-18-07.5226N 119-56-37.0586W +RWY O26 13/31 3710 2391 90 36-35-31.7214N 118-03-25.0563W 36-35-12.6796N 118-03-07.6953W +RWY O26 16/34 3710 3991 60 36-35-37.3550N 118-02-47.5400W 36-34-57.9250N 118-02-45.8104W +RWY L84 15/33 274 3020 60 35-37-43.7600N 119-41-14.3200W 35-37-14.6700N 119-41-05.9600W +RWY MMH 09/27 7135 7000 100 37-37-37.8006N 118-51-00.5828W 37-37-15.3293N 118-49-38.3194W +RWY M45 17/35 5872 4443 50 38-44-27.0296N 119-45-59.5314W 38-43-43.2224N 119-46-03.1882W +RWY MHV 04/22 2801 4747 60 35-03-35.0422N 118-09-51.4751W 35-04-04.0852N 118-09-06.6188W +RWY MHV 08/26 2801 7049 100 35-03-33.1835N 118-09-57.8640W 35-03-32.9995N 118-08-33.0874W +RWY MHV 12/30 2801 12503 200 35-04-08.9250N 118-09-37.5380W 35-02-41.2770N 118-07-51.4858W +RWY CN37 08/26 4074 2673 100 35-23-03.6652N 118-13-37.2373W 35-23-02.4676N 118-13-04.9947W +RWY PTV 12/30 443 5960 150 36-02-07.4635N 119-04-11.2836W 36-01-25.5877N 119-03-20.2208W +RWY O32 15/33 386 3300 60 36-40-31.5739N 119-27-07.8716W 36-39-59.6541N 119-26-59.4497W +RWY 0Q4 10/28 305 2206 50 36-34-56.8740N 119-39-36.9576W 36-34-46.3296N 119-39-13.2840W +RWY MIT 08/26 425 3672 60 35-30-38.0550N 119-11-56.8660W 35-30-38.0250N 119-11-12.4530W +RWY MIT 12/30 425 4501 100 35-30-38.4368N 119-12-03.6846W 35-30-07.8764N 119-11-24.1042W +RWY MIT 17/35 425 2970 100 35-30-33.5289N 119-11-09.4853W 35-30-04.1567N 119-11-09.5126W +RWY L61 15/33 1568 2380 30 35-58-18.5300N 116-16-12.2200W 35-57-55.4400N 116-16-06.5400W +RWY TVL 18/36 6269 8541 100 38-54-19.1587N 119-59-31.1490W 38-52-56.8960N 119-59-55.2858W +RWY 1Q1 13/31 426 2000 50 36-09-53.2800N 119-03-08.2000W 36-09-35.9700N 119-02-56.4000W +RWY L17 07/25 858 3283 60 35-08-27.0139N 119-26-35.6895W 35-08-32.9242N 119-25-56.7607W +RWY TSP 11/29 4001 4040 75 35-08-17.2700N 118-26-41.5500W 35-07-54.6900N 118-26-01.4100W +RWY L72 17/35 1718 5910 60 35-49-14.4270N 117-19-31.3494W 35-48-16.6986N 117-19-42.4548W +RWY TLR 13/31 265 3901 75 36-09-39.8895N 119-19-48.6126W 36-09-07.5495N 119-19-22.6724W +RWY VIS 12/30 295 6562 150 36-19-29.9545N 119-24-02.7401W 36-18-44.2320N 119-23-05.8527W +RWY D86 13/31 313 3012 60 36-27-04.3800N 119-19-18.4800W 36-26-40.5700N 119-18-56.3100W +RWY L19 12/30 312 3380 60 35-37-23.4058N 119-21-27.8155W 35-36-59.6318N 119-20-59.0324W +RWY L92 14/32 3758 4360 60 37-22-06.6500N 115-11-58.0000W 37-21-30.0000N 115-11-29.5700W +RWY TMT 18/36 5735 6000 75 39-28-32.3087N 117-11-37.2713W 39-27-36.8821N 117-12-04.3909W +RWY BTY 16/34 3169 5615 60 36-52-07.8308N 116-47-11.0568W 36-51-12.3242N 116-47-11.0102W +RWY CXP 09/27 4705 6101 75 39-11-39.2132N 119-44-34.9560W 39-11-25.3695N 119-43-19.5505W +RWY 2Q5 06/24 4939 815 40 39-12-03.6888N 119-41-04.8844W 39-12-07.6755N 119-40-55.8898W +RWY A34 05/23 4414 5343 75 39-14-07.1605N 119-33-50.3889W 39-14-29.4999N 119-32-48.8750W +RWY 01U 03/21 5133 2700 75 38-50-56.3620N 115-38-09.1474W 38-51-16.2119N 115-37-46.3218W +RWY 01U 15/33 5133 3400 80 38-51-32.5055N 115-38-14.8229W 38-50-59.6109N 115-38-05.9690W +RWY 05U 18/36 5958 7300 60 39-36-48.9124N 116-00-04.1142W 39-35-38.1050N 116-00-21.8511W +RWY NFL 07/25 3935 7003 152 39-24-47.1860N 118-42-57.1310W 39-24-49.7960N 118-41-27.9850W +RWY NFL 13L/31R 3935 11078 200 39-25-50.0300N 118-42-18.4990W 39-24-20.1630N 118-40-57.9170W +RWY NFL 13R/31L 3935 14004 200 39-26-08.1210N 118-42-50.2520W 39-24-14.5190N 118-41-08.3760W +RWY FLX 03/21 3966 5703 75 39-29-39.6740N 118-45-23.7041W 39-30-17.0314N 118-44-29.2487W +RWY FLX 13/31 3966 4207 100 39-30-11.5795N 118-45-09.2893W 39-29-37.2652N 118-44-38.9907W +RWY N58 05/23 4346 2750 30 39-33-37.1645N 119-15-04.3192W 39-33-48.4341N 119-14-32.3732W +RWY N58 15/33 4346 3974 40 39-33-48.8064N 119-14-30.7844W 39-33-11.2748N 119-14-15.8829W +RWY 0L4 18/36 4684 6100 80 37-29-59.8490N 117-11-08.0172W 37-29-01.7741N 117-11-28.4951W +RWY HTH 10/28 4230 6000 100 38-32-51.2162N 118-38-33.6417W 38-32-25.2151N 118-37-25.7845W +RWY HTH 15/33 4230 3250 130 38-33-05.4265N 118-37-55.5779W 38-32-34.1233N 118-37-46.4181W +RWY INS 08/26 3134 9002 150 36-35-04.0392N 115-41-44.0402W 36-35-00.4204N 115-39-53.7785W +RWY INS 13/31 3134 5476 100 36-35-47.3892N 115-40-40.3220W 36-35-02.5867N 115-40-02.6339W +RWY 0L7 02L/20R 2835 4600 75 35-45-48.1000N 115-20-02.1000W 35-46-26.6800N 115-19-32.5200W +RWY 0L7 02R/20L 2835 3700 60 35-45-48.2000N 115-19-57.7000W 35-46-19.2300N 115-19-33.9100W +RWY N15 07/25 6075 3700 80 39-12-08.7100N 117-04-42.5600W 39-12-09.0100N 117-03-55.5600W +RWY N15 16/34 6075 3072 60 39-12-25.6400N 117-03-54.0500W 39-11-55.3200N 117-03-56.0300W +RWY LSV 03L/21R 1869 10120 200 36-13-36.1000N 115-02-48.4900W 36-14-51.3000N 115-01-27.0000W +RWY LSV 03R/21L 1869 10051 150 36-13-29.5800N 115-02-39.3200W 36-14-44.2600N 115-01-18.3800W +RWY VGT 07/25 2205 5005 75 36-12-47.8622N 115-12-12.1453W 36-12-49.0762N 115-11-11.0945W +RWY VGT 12L/30R 2205 4203 75 36-12-44.7219N 115-11-47.1131W 36-12-15.6816N 115-11-10.4357W +RWY VGT 12R/30L 2205 5001 75 36-12-52.8379N 115-12-09.5951W 36-12-18.2877N 115-11-25.9509W +RWY LAS 01L/19R 2181 8988 150 36-04-31.1694N 115-10-13.3156W 36-05-51.7657N 115-09-27.1861W +RWY LAS 01R/19L 2181 9771 150 36-04-27.2649N 115-10-02.9559W 36-05-54.8802N 115-09-12.8039W +RWY LAS 07L/25R 2181 14512 150 36-04-34.9216N 115-10-12.6755W 36-04-35.0697N 115-07-15.9271W +RWY LAS 07R/25L 2181 10525 150 36-04-25.0625N 115-09-41.1613W 36-04-25.1662N 115-07-32.9677W +RWY HND 17L/35R 2492 5001 75 35-58-51.1490N 115-07-58.6133W 35-58-01.7103N 115-07-59.2284W +RWY HND 17R/35L 2492 6501 100 35-58-51.2177N 115-08-07.1314W 35-57-46.9483N 115-08-07.9226W +RWY NV65 02/20 3314 7515 100 36-36-41.0000N 116-02-22.0000W 36-37-42.6000N 116-01-30.4500W +RWY 3Q0 13/31 4557 4600 165 38-23-07.5912N 118-06-01.9074W 38-22-27.4702N 118-05-34.6898W +RWY MEV 12/30 4731 5299 75 39-00-19.7592N 119-45-30.7566W 38-59-42.8668N 119-44-43.1385W +RWY MEV 16/34 4731 7399 100 39-00-41.3162N 119-45-07.1268W 38-59-28.2010N 119-45-06.7818W +RWY RNO 07/25 4415 6102 150 39-29-46.6299N 119-46-43.8220W 39-29-46.3739N 119-45-25.9978W +RWY RNO 16L/34R 4415 9000 150 39-30-49.8258N 119-46-00.2660W 39-29-20.8949N 119-46-00.4971W +RWY RNO 16R/34L 4415 11001 150 39-30-49.8381N 119-46-09.1937W 39-29-01.1337N 119-46-09.4750W +RWY N86 17/35 4620 3418 60 39-40-33.1000N 119-43-29.1000W 39-39-59.4000N 119-43-32.1000W +RWY RTS 08/26 5050 7608 150 39-39-51.6446N 119-53-31.8784W 39-39-43.9105N 119-51-55.1399W +RWY RTS 14/32 5050 9000 150 39-41-00.1962N 119-52-53.7370W 39-39-40.5340N 119-52-02.5510W +RWY 3L2 12/30 2599 3300 105 35-47-45.9576N 115-37-49.5311W 35-47-23.2850N 115-37-20.7057W +RWY SPZ 06/24 4265 6001 75 39-24-00.3690N 119-15-40.0038W 39-24-21.5321N 119-14-28.6082W +RWY TPH 11/29 5430 6195 50 38-04-03.1300N 117-05-33.0600W 38-03-28.0400N 117-04-29.5800W +RWY TPH 15/33 5430 7158 80 38-04-03.1200N 117-05-33.7900W 38-02-54.7700N 117-05-10.6100W +RWY TNX 14/32 5550 12001 150 37-48-50.6052N 116-47-19.5779W 37-47-01.2414N 116-46-21.7147W +RWY O43 01/19 4382 5814 75 38-59-54.4620N 119-09-41.6854W 39-00-44.4516N 119-09-05.3823W +ILS 30R ILS/DME IBFL 111.90 35-26-53.948N 119-04-25.194W 35-25-58.298N 119-03-24.720W 479 4.74 315.44 3.00 +ILS 01L ILS/DME ICUA 110.10 36-06-00.851N 115-09-21.987W 36-04-49.142N 115-10-06.519W 2159 4.26 24.82 3.40 +ILS 25R ILS/DME ILAS 110.30 36-04-34.911N 115-10-19.180W 36-04-32.081N 115-07-46.674W 2047 4.00 269.94 3.00 +ILS 29R ILS/DME IFAT 111.30 36-47-08.282N 119-43-58.598W 36-46-18.838N 119-42-23.481W 332 3.91 305.48 3.00 +ILS 25L ILS/DME IRLE 111.75 36-04-25.052N 115-09-53.341W 36-04-21.996N 115-07-46.661W 2051 3.48 269.94 3.00 +ILS 30 ILS IVIS 108.50 36-19-32.057N 119-24-05.354W 36-18-48.502N 119-23-18.052W 293 5.00 314.93 3.00 +ILS 34L ILS/DME IAGY 109.90 39-30-59.983N 119-46-09.165W 39-29-16.604N 119-46-05.345W 4403 3.63 0.12 3.54 +ILS 14 LOC/GS IRVP 108.30 37-46-43.380N 116-46-12.266W 37-48-42.486N 116-47-22.045W 5482 3.00 157.32 2.75 +ILS 17 LDA/DME IBIH 109.10 37-22-27.752N 118-21-11.874W - - 4100 6.00 155.72 - +ILS 12L ILS/DME IHWG 110.70 36-12-12.221N 115-11-06.057W 36-12-39.989N 115-11-35.728W 2178 6.00 134.45 3.20 +ILS 18 LDA/DME ITVL 108.90 38-54-36.655N 119-59-22.128W - - 6323 6.00 187.42 - +ILS 11L LOC/DME IRPW 111.30 36-46-02.541N 119-42-03.438W - - 347 3.95 125.48 - +ILS 21L LOC/GS IDIQ 109.10 36-13-20.020N 115-02-49.670W 36-14-32.670N 115-01-22.830W 1856 3.54 221.15 3.00 +ILS 16R ILS/DME IRNO 110.90 39-28-49.534N 119-46-09.505W 39-30-28.096N 119-46-05.666W 4408 3.59 180.11 3.10 +ILS 32 ILS/DME IRTS 111.90 39-41-09.490N 119-52-59.710W 39-39-59.740N 119-52-09.040W 5045 4.45 333.68 3.00 +ILS 32 LOC/GS IUVV 111.70 37-49-02.077N 116-47-25.658W 37-47-04.063N 116-46-29.966W 5555 3.00 337.30 2.75 +NAV AVE VOR/DME 35-38-49.112N 119-58-42.980W 710 117.10 118X +NAV EHF VORTAC 35-29-04.397N 119-05-50.257W 549 115.40 101X +NAV BIH VOR/DME 37-22-37.020N 118-21-59.495W 4117 109.60 033X +NAV NID TACAN 35-41-16.503N 117-41-25.788W 2228 111.60 053X +NAV COR NDB 36-03-57.800N 119-31-51.400W 203 205 - +NAV FLW VOR/DME 35-05-35.104N 119-51-56.083W 3870 117.50 122X +NAV FCH NDB 36-43-26.191N 119-50-01.207W 275 344 - +NAV CZQ VORTAC 36-53-03.560N 119-48-54.523W 360 112.90 076X +NAV FRA VORTAC 37-06-15.915N 119-35-43.604W 2380 115.60 103X +NAV GFS VORTAC 35-07-52.123N 115-10-35.185W 4000 114.40 091X +NAV NLC TACAN 36-20-38.823N 119-57-58.801W 228 113.30 080X +NAV TTE VOR/DME 35-54-46.984N 119-01-14.914W 580 109.20 029X +NAV VIS VOR/DME 36-22-02.350N 119-28-55.785W 259 109.40 031X +NAV BTY VORTAC 36-48-02.149N 116-44-51.507W 2928 114.70 094X +NAV OAL VORTAC 38-00-11.741N 117-46-13.605W 4800 117.70 124X +NAV NFL TACAN 39-25-00.870N 118-42-18.270W 3929 113.50 082X +NAV HZN VORTAC 39-30-59.054N 118-59-51.679W 4085 114.10 088X +NAV INS TACAN 36-35-05.991N 115-40-13.193W 3102 114.00 087X +NAV LAS VORTAC 36-04-46.931N 115-09-35.272W 2136 116.90 116X +NAV MVA VORTAC 38-33-55.078N 118-01-58.272W 7860 115.10 098X +NAV FMG VORTAC 39-31-52.598N 119-39-21.873W 5950 117.90 126X +NAV TQQ VORTAC 37-47-25.438N 116-46-45.357W 5542 113.00 77X +NAV TPH VORTAC 38-01-50.321N 117-02-00.627W 5344 117.20 119X diff -Nru acm-5.0/objects/zones/usa/losangeles.txt acm-6.0+20200416/objects/zones/usa/losangeles.txt --- acm-5.0/objects/zones/usa/losangeles.txt 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/objects/zones/usa/losangeles.txt 2020-04-16 12:05:39.000000000 +0000 @@ -0,0 +1,218 @@ +# Los Angeles area scenery. +# Created: 2020-04-16 +# Latitude range: [30N, 35N[ +# Longitude range: [120W, 115W[ +# 2017-10-04 Checked against https://nfdc.faa.gov/xwiki/bin/view/NFDC/56DaySub-2017-03-02 +# "56 Day NASR Subscription - Effective March 2, 2017". + +# ?????: +TEAM1_LOC 30N 120W 000 031 +# ?????: +TEAM1_LOC 30N 120W 000 031 +GROUND_COLOR #305030 +RWY L54 11/29 1220 2500 60 32-57-26.3825N 116-17-53.9176W 32-57-14.6830N 116-17-28.0594W +RWY L70 04/22 2660 4600 50 34-29-58.9300N 118-19-09.2900W 34-30-26.7400N 118-18-24.6200W +RWY APV 08/26 3062 4099 60 34-34-10.4105N 117-11-38.4992W 34-34-10.4154N 117-10-49.4877W +RWY APV 18/36 3062 6498 150 34-35-15.1688N 117-10-57.1640W 34-34-13.4234N 117-11-18.6816W +RWY AVX 04/22 1602 3000 75 33-24-09.4400N 118-25-11.2300W 33-24-26.5400N 118-24-42.3100W +RWY BNG 08/26 2222 4955 100 33-55-21.3858N 116-51-32.9146W 33-55-20.9956N 116-50-34.1119W +RWY L35 08/26 6752 5850 75 34-15-49.5020N 116-51-56.5570W 34-15-49.7823N 116-50-46.8850W +RWY L08 08/26 520 5011 75 33-15-32.0000N 116-19-45.0000W 33-15-33.0000N 116-18-46.0000W +RWY BWC 08/26 -128 4402 60 32-59-34.5395N 115-31-26.6054W 32-59-34.6190N 115-30-34.9289W +RWY BUR 08/26 778 5802 150 34-11-52.4795N 118-22-08.9142W 34-11-51.5410N 118-20-59.8552W +RWY BUR 15/33 778 6886 150 34-12-44.4407N 118-21-37.6605W 34-11-38.0587N 118-21-19.3333W +RWY CXL 08/26 6 4683 75 32-40-03.2391N 115-31-30.6518W 32-40-02.2838N 115-30-35.8834W +RWY CLR 08/26 -182 3423 50 33-07-53.0264N 115-31-37.0863W 33-07-52.5949N 115-30-56.8390W +RWY CMA 08/26 77 6013 150 34-12-49.8119N 119-06-15.4596W 34-12-49.2278N 119-05-03.8660W +RWY CRQ 06/24 331 4897 150 33-07-37.1582N 117-17-16.5298W 33-07-46.2872N 117-16-19.9780W +RWY CNO 03/21 650 4919 150 33-58-14.2700N 117-38-30.3918W 33-58-49.0291N 117-37-49.5151W +RWY CNO 08L/26R 650 4858 150 33-58-32.5541N 117-38-48.3179W 33-58-33.0451N 117-37-50.6371W +RWY CNO 08R/26L 650 7000 150 33-58-24.6455N 117-38-48.2172W 33-58-25.3419N 117-37-25.1082W +RWY L77 06/24 1713 4600 50 33-39-49.2100N 115-43-02.6800W 33-39-57.9400N 115-42-09.2500W +RWY CPM 07L/25R 99 3323 60 33-53-24.6060N 118-14-57.4156W 33-53-24.7912N 118-14-18.0005W +RWY CPM 07R/25L 99 3322 60 33-53-22.6246N 118-14-57.4025W 33-53-22.8161N 118-14-17.9928W +RWY AJO 07/25 533 3200 60 33-53-51.3496N 117-36-27.7686W 33-53-51.8347N 117-35-49.8166W +RWY DAG 04/22 1930 5123 100 34-51-07.3255N 116-47-33.6340W 34-51-39.5445N 116-46-46.1966W +RWY DAG 08/26 1930 6402 150 34-51-05.3398N 116-47-52.2144W 34-51-05.3398N 116-46-35.4011W +RWY CN64 05/23 559 4200 50 33-44-43.0200N 115-19-53.3800W 33-45-00.6500N 115-19-08.3300W +RWY EDW 04L/22R 2311 12000 200 34-54-09.8758N 117-54-17.3120W 34-55-12.3655N 117-52-14.8375W +RWY EDW 04R/22L 2311 15024 300 34-53-40.4153N 117-54-18.0431W 34-54-58.6478N 117-51-44.7079W +RWY 9L2 06/24 2299 5998 150 34-59-18.7100N 117-52-22.1600W 34-59-34.9400N 117-51-12.8200W +RWY NJK 08/26 -42 9503 200 32-49-44.8745N 115-41-13.5789W 32-49-44.9672N 115-39-22.2104W +RWY NJK 12/30 -42 6824 200 32-49-47.2090N 115-40-19.5860W 32-48-59.3490N 115-39-23.1740W +RWY EMT 01/19 296 3995 75 34-04-51.7510N 118-02-15.6240W 34-05-27.4420N 118-01-55.2290W +RWY L18 18/36 708 2160 60 33-21-25.3600N 117-14-59.8900W 33-21-04.6400N 117-15-06.1100W +RWY FUL 06/24 96 3121 75 33-52-15.8070N 117-59-05.3000W 33-52-22.7600N 117-58-29.2410W +RWY HHR 07/25 66 4956 100 33-55-20.8320N 118-20-36.0310W 33-55-23.6130N 118-19-37.3180W +RWY HMT 04/22 1512 2045 25 33-44-02.0700N 117-01-30.0900W 33-44-11.0700N 117-01-08.0900W +RWY HMT 05/23 1512 4314 100 33-43-50.6590N 117-01-44.8870W 33-44-10.1060N 117-00-59.4090W +RWY L26 03/21 3390 3910 50 34-22-21.7800N 117-19-12.2200W 34-22-52.2000N 117-18-43.3900W +RWY L04 08/26 59 6000 150 32-50-42.1100N 115-16-41.7700W 32-50-41.5200N 115-15-31.4300W +RWY IPL 08/26 -54 4501 75 32-49-55.5760N 115-35-24.4371W 32-49-55.5994N 115-34-31.7016W +RWY IPL 14/32 -54 5308 100 32-50-33.0441N 115-34-45.4508W 32-49-46.3804N 115-34-16.9123W +RWY NRS 08/26 24 2240 151 32-34-01.0843N 117-06-49.6739W 32-33-55.2860N 117-06-24.4043W +RWY NRS 09/27 24 4997 336 32-34-04.6010N 117-07-22.0893W 32-33-51.7074N 117-06-25.7206W +RWY L78 07/25 2844 2562 60 32-36-55.5900N 116-10-10.8000W 32-36-58.7500N 116-09-41.0800W +RWY L80 06/24 2464 2493 50 34-09-13.9700N 116-15-20.4800W 34-09-18.4600N 116-14-51.3100W +RWY WJF 06/24 2351 7201 150 34-44-16.8072N 118-13-48.1415W 34-44-38.7410N 118-12-26.0652W +RWY POC 08L/26R 1014 3661 75 34-05-32.5291N 117-47-12.5173W 34-05-30.5067N 117-46-29.0628W +RWY POC 08R/26L 1014 4840 75 34-05-30.1703N 117-47-25.8171W 34-05-27.4966N 117-46-28.3631W +RWY LGB 07L/25R 60 6191 150 33-49-21.9119N 118-09-48.6727W 33-49-21.7015N 118-08-35.2853W +RWY LGB 07R/25L 60 5421 150 33-48-49.7673N 118-09-40.6882W 33-48-49.8117N 118-08-36.4141W +RWY LGB 12/30 60 10003 200 33-49-34.3247N 118-09-41.5171W 33-48-24.7148N 118-08-17.3104W +RWY SLI 04L/22R 36 5901 150 33-47-07.1000N 118-03-43.4260W 33-47-40.5830N 118-02-46.1250W +RWY SLI 04R/22L 36 7999 200 33-47-01.6060N 118-03-36.8100W 33-47-46.9980N 118-02-19.1480W +RWY LAX 06L/24R 128 8926 150 33-56-56.8049N 118-25-52.1755W 33-57-07.5741N 118-24-07.0161W +RWY LAX 06R/24L 128 10885 150 33-56-48.5343N 118-26-04.8016W 33-57-01.6661N 118-23-56.5618W +RWY LAX 07L/25R 128 9600 150 33-56-08.9901N 118-25-09.6303W 33-56-20.5600N 118-23-16.5500W +RWY LAX 07R/25L 128 11095 200 33-56-01.1378N 118-25-08.4660W 33-56-14.5069N 118-22-57.7701W +RWY WHP 12/30 1003 4120 75 34-15-48.7000N 118-25-04.5300W 34-15-18.0600N 118-24-32.1500W +RWY F70 18/36 1350 6000 75 33-34-56.0285N 117-07-34.8765W 33-33-58.0608N 117-07-50.1305W +RWY L88 10/28 2203 3940 60 34-56-32.4800N 119-41-29.3300W 34-56-15.1000N 119-40-46.9600W +RWY NFG 03/21 78 6005 221 33-17-43.2009N 117-21-43.2234W 33-18-25.8399N 117-20-53.9500W +RWY NXF 09/27 89 1513 72 33-17-09.4000N 117-27-32.1387W 33-17-07.2348N 117-27-14.5052W +RWY OKB 06/24 28 2712 75 33-13-02.3744N 117-21-21.1528W 33-13-07.0550N 117-20-49.7080W +RWY L90 09/27 160 2475 150 33-08-48.1600N 116-08-03.5300W 33-08-41.9400N 116-07-35.3600W +RWY L90 13/31 160 4210 150 33-09-13.2500N 116-08-10.2100W 33-08-38.8700N 116-07-42.2400W +RWY ONT 08L/26R 944 12197 150 34-03-24.7542N 117-37-22.1464W 34-03-24.8152N 117-34-57.1903W +RWY ONT 08R/26L 944 10200 150 34-03-17.8467N 117-36-58.4095W 34-03-17.8904N 117-34-57.1886W +RWY OXR 07/25 45 5953 100 34-12-03.1688N 119-13-01.4489W 34-12-02.6322N 119-11-50.5801W +RWY PMD 04/22 2543 12001 150 34-37-00.8420N 118-05-29.8020W 34-38-14.2360N 118-03-36.9660W +RWY PMD 07/25 2543 12002 200 34-37-50.1060N 118-06-47.0290W 34-37-57.9910N 118-04-23.7430W +RWY PSP 13L/31R 476 4952 75 33-50-06.5934N 116-30-34.8014W 33-49-27.2686N 116-29-59.7986W +RWY PSP 13R/31L 476 10000 150 33-50-26.4463N 116-31-02.8130W 33-49-07.0294N 116-29-52.1279W +RWY UDD 10/28 73 5002 70 33-45-05.1210N 116-16-55.9620W 33-44-43.5530N 116-16-02.6510W +RWY TRM 12/30 -115 4995 100 33-37-48.6196N 116-10-15.5034W 33-37-13.6654N 116-09-33.7444W +RWY TRM 17/35 -115 8500 150 33-38-20.9168N 116-09-23.0602W 33-36-56.8236N 116-09-23.0950W +RWY L65 15/33 1413 5100 50 33-46-17.1700N 117-13-15.7400W 33-45-28.2200N 117-13-01.1200W +RWY NTD 03/21 13 11102 200 34-06-30.4160N 119-08-04.2030W 34-07-49.6542N 119-06-32.7769W +RWY NTD 09/27 13 5502 200 34-07-15.1333N 119-07-26.0007W 34-07-01.0300N 119-06-22.7951W +RWY RNM 09/27 1395 5001 150 33-02-25.2425N 116-55-23.8455W 33-02-16.6840N 116-54-25.9941W +RWY REI 08/26 1574 4504 75 34-05-06.8199N 117-09-13.7399W 34-05-07.0822N 117-08-20.2150W +RWY RAL 09/27 819 5401 100 33-57-13.9946N 117-27-07.0891W 33-57-01.9321N 117-26-04.6412W +RWY RAL 16/34 819 2850 50 33-57-18.5568N 117-26-55.0968W 33-56-50.3748N 117-26-54.2398W +RWY RIR 06/24 767 3190 50 33-59-16.0200N 117-24-54.1100W 33-59-23.2500N 117-24-17.2400W +RWY RIV 12/30 1536 3059 100 33-53-24.9100N 117-15-38.4300W 33-53-03.5600N 117-15-12.7200W +RWY RIV 14/32 1536 13302 200 33-53-47.1500N 117-16-14.2900W 33-51-53.9800N 117-14-53.8100W +RWY L00 08/26 2415 3600 50 34-52-13.8200N 118-12-41.1100W 34-52-13.6900N 118-11-57.9000W +RWY SAS 07/25 -84 5000 75 33-14-26.0300N 115-57-38.6600W 33-14-30.4900N 115-56-40.0200W +RWY SBD 06/24 1159 10000 200 34-05-26.7169N 117-15-01.5736W 34-05-59.8411N 117-13-09.5389W +RWY NUC 06/24 184 9301 200 33-01-04.1317N 118-36-08.9596W 33-01-39.6479N 118-34-28.1900W +RWY SEE 09L/27R 388 5342 100 32-49-46.0537N 116-58-52.5038W 32-49-34.9929N 116-57-51.2891W +RWY SEE 09R/27L 388 2738 60 32-49-38.5719N 116-58-34.4547W 32-49-32.8978N 116-58-03.0796W +RWY SEE 17/35 388 4145 100 32-49-46.2477N 116-58-20.9412W 32-49-05.2395N 116-58-20.6156W +RWY MYF 05/23 427 3400 75 32-48-53.4698N 117-08-45.6181W 32-49-07.6906N 117-08-09.5208W +RWY MYF 10L/28R 427 4577 150 32-49-05.3884N 117-08-40.8604W 32-48-46.2624N 117-07-52.2549W +RWY MYF 10R/28L 427 3401 60 32-49-00.9012N 117-08-43.3216W 32-48-46.6902N 117-08-07.2071W +RWY SAN 09/27 17 9400 200 32-44-13.6413N 117-12-15.6841W 32-43-48.0086N 117-10-29.9018W +RWY NKX 06L/24R 477 12000 200 32-51-52.4391N 117-09-53.4567W 32-52-22.3469N 117-07-37.3024W +RWY NKX 06R/24L 477 8001 200 32-51-55.7025N 117-09-06.0198W 32-52-15.6406N 117-07-35.2368W +RWY NZY 11/29 26 7501 200 32-42-08.3820N 117-13-16.5910W 32-41-29.0900N 117-12-02.1260W +RWY NZY 18/36 26 8001 200 32-42-36.1250N 117-12-42.0590W 32-41-19.8330N 117-13-07.0310W +RWY SDM 08L/26R 526 7972 150 32-34-25.6400N 116-59-36.3200W 32-34-17.9380N 116-58-03.6090W +RWY SDM 08R/26L 526 3180 75 32-34-17.6938N 116-59-03.5966W 32-34-14.6300N 116-58-26.6100W +RWY NSI 12/30 506 10002 200 33-14-56.7015N 119-28-12.8759W 33-13-49.7278N 119-26-46.1905W +RWY SNA 02L/20R 56 5701 150 33-40-04.0902N 117-52-25.7898W 33-40-53.9265N 117-51-54.2126W +RWY SNA 02R/20L 56 2887 75 33-40-26.3802N 117-52-04.9704W 33-40-51.6108N 117-51-48.9845W +RWY SBA 07/25 13 6052 150 34-25-38.9964N 119-51-16.7098W 34-25-40.5035N 119-50-04.4836W +RWY SBA 15L/33R 13 4180 75 34-25-50.8102N 119-50-25.3281W 34-25-10.7491N 119-50-12.9814W +RWY SBA 15R/33L 13 4184 100 34-25-49.9454N 119-50-29.5330W 34-25-09.8460N 119-50-17.1654W +RWY SMO 03/21 177 4973 150 34-00-39.4354N 118-27-25.4272W 34-01-14.4762N 118-26-43.9649W +RWY SZP 04/22 248 2713 60 34-20-41.8792N 119-03-55.6287W 34-20-56.3378N 119-03-28.3609W +RWY TOA 11L/29R 103 5001 150 33-48-29.0133N 118-20-44.4066W 33-47-58.2439N 118-19-57.9996W +RWY TOA 11R/29L 103 3000 75 33-48-18.9881N 118-20-38.8141W 33-48-00.5334N 118-20-10.9763W +RWY TNP 08/26 1888 5531 75 34-08-03.6487N 115-57-12.3774W 34-08-03.9782N 115-56-06.5936W +RWY TNP 17/35 1888 3797 50 34-07-57.8579N 115-56-52.8506W 34-07-20.2981N 115-56-52.9667W +RWY NXP 10/28 2051 8015 150 34-18-01.0410N 116-10-27.7360W 34-17-30.9540N 116-08-59.3490W +RWY CCB 06/24 1444 3863 75 34-06-34.9854N 117-41-36.0579W 34-06-48.5968N 117-40-53.1371W +RWY VNY 16L/34R 802 4013 75 34-13-08.3874N 118-29-24.0130W 34-12-28.8190N 118-29-20.2745W +RWY VNY 16R/34L 802 8001 150 34-13-08.0774N 118-29-28.4639W 34-11-49.1790N 118-29-21.0078W +RWY VCV 03/21 2885 9138 150 34-34-57.7456N 117-23-15.9148W 34-36-02.1758N 117-21-59.2749W +RWY VCV 17/35 2885 15050 150 34-37-17.9480N 117-23-12.4277W 34-34-49.1052N 117-23-10.9199W +RWY L22 06/24 3224 4363 60 34-07-39.8200N 116-24-49.1400W 34-07-54.9200N 116-24-00.5100W +ILS 20R ILS/DME ISNA 111.75 33-39-54.505N 117-52-31.862W 33-40-47.562N 117-52-02.260W 43 5.90 207.80 3.00 +ILS 30 ILS ILGB 110.30 33-49-37.767N 118-09-45.695W 33-48-44.429N 118-08-45.513W 32 4.72 314.85 3.00 +ILS 27 LOC/DME IUBR 110.90 32-44-14.789N 117-12-20.434W - - 23 5.00 286.07 - +ILS 06 ILS ISBD 109.30 34-06-06.315N 117-12-47.634W 34-05-24.982N 117-14-49.338W 1087 3.33 70.35 3.00 +ILS 24R LOC/GS INKX 111.15 32-51-49.454N 117-10-07.027W 32-52-16.202N 117-07-49.051W 468 3.06 255.34 3.00 +ILS 08 ILS IBUR 109.50 34-11-52.638N 118-22-20.921W 34-11-55.273N 118-21-54.253W 725 5.00 90.93 3.00 +ILS 26L ILS/DME ITWO 111.35 34-03-17.841N 117-37-10.295W 34-03-21.893N 117-35-10.971W 925 3.58 269.97 3.00 +ILS 27R LOC/DME ISEE 110.50 32-49-47.509N 116-59-00.560W - - 351 6.00 282.13 - +ILS 25 LOCALIZER IHHR 109.10 33-55-20.829N 118-20-36.102W - - 66 5.50 266.73 - +ILS 29R ILS/DME ITOA 111.90 33-48-31.939N 118-20-48.823W 33-48-09.693N 118-20-08.605W 92 5.00 308.58 3.40 +ILS 26R ILS/DME IONT 109.70 34-03-24.747N 117-37-34.626W 34-03-22.008N 117-35-10.975W 926 3.03 269.97 3.00 +ILS 22L LOC/GS IEDW 110.10 34-53-29.500N 117-54-39.420W 34-54-47.490N 117-51-54.620W 2276 2.34 238.11 2.50 +ILS 07 ILS/DME ISBA 110.30 34-25-40.852N 119-49-47.652W 34-25-43.203N 119-51-04.898W 10 5.37 88.55 3.00 +ILS 25 ILS IOXR 108.70 34-12-03.262N 119-13-13.568W 34-12-00.200N 119-12-09.968W 41 6.00 270.53 3.00 +ILS 20X LDA/DME IOJW 108.30 33-40-56.459N 117-51-47.638W - - 40 6.00 194.94 - +ILS 30 LOC/GS INSI 109.70 33-14-57.071N 119-28-13.347W 33-13-58.378N 119-26-52.772W 498 4.00 312.73 3.00 +ILS 09 ILS IRAL 110.90 33-56-59.460N 117-25-51.860W 33-57-15.321N 117-26-58.196W 760 6.00 103.11 3.00 +ILS 25L ILS/DME ILAX 109.90 33-55-59.865N 118-25-20.868W 33-56-17.774N 118-23-10.214W 97 3.30 262.97 3.00 +ILS 25R ILS/DME ICFN 111.10 33-56-08.130N 118-25-18.028W 33-56-17.872N 118-23-10.225W 98 3.39 262.97 3.00 +ILS 17 LOC/GS IVCV 108.75 34-34-38.682N 117-23-10.813W 34-37-07.568N 117-23-18.303W 2815 3.00 179.52 3.00 +ILS 24L ILS/DME IHQB 111.70 33-56-46.746N 118-26-22.248W 33-57-02.310N 118-24-18.510W 117 3.47 262.96 3.00 +ILS 24R ILS/DME IOSS 108.50 33-56-53.165N 118-26-27.684W 33-57-02.408N 118-24-18.522W 117 3.36 262.96 3.00 +ILS 08L ILS IAOD 109.70 34-03-24.818N 117-34-45.067W 34-03-21.205N 117-36-59.899W 936 3.28 89.97 3.00 +ILS 28R ILS/DME IMYF 111.70 32-49-07.881N 117-08-47.220W 32-48-52.124N 117-08-14.070W 419 6.00 295.08 3.00 +ILS 26L ILS IPOC 110.50 34-05-30.449N 117-47-31.718W 34-05-33.915N 117-46-39.946W 1004 6.00 273.22 3.76 +ILS 26R ILS ICNO 111.50 33-58-32.453N 117-38-59.062W 33-58-29.489N 117-38-02.826W 631 6.00 269.40 3.00 +ILS 21 ILS/DME IRRG 109.30 34-06-21.921N 119-08-13.996W 34-07-41.406N 119-06-37.359W 9 3.26 223.68 3.00 +ILS 16R ILS IVNY 111.30 34-11-40.337N 118-29-20.159W 34-12-44.877N 118-29-29.247W 784 5.36 175.52 3.50 +ILS 07L ILS/DME IIAS 111.10 33-56-24.759N 118-22-35.445W 33-56-08.850N 118-24-56.440W 122 3.07 82.97 3.00 +ILS 07R ILS/DME IMKZ 109.90 33-56-15.785N 118-22-45.244W 33-55-59.925N 118-24-55.049W 118 3.30 82.97 3.00 +ILS 32 ILS IRIV 110.10 33-54-06.520N 117-16-28.080W 33-51-58.770N 117-15-02.720W 1484 3.00 329.43 3.00 +ILS 24 ILS/DME ICRQ 108.70 33-07-36.574N 117-17-20.164W 33-07-48.120N 117-16-33.127W 315 6.00 259.09 3.20 +ILS 24 LOC/DME IFUL 108.90 33-52-14.921N 117-59-09.922W - - 99 6.00 256.93 - +ILS 09 ILS/DME ISAN 111.55 32-43-47.602N 117-10-28.237W 32-44-10.760N 117-11-52.140W 16 4.69 106.07 3.10 +ILS 06L ILS/DME IUWU 108.50 33-57-08.577N 118-23-57.197W 33-56-54.586N 118-25-39.825W 110 4.10 82.96 3.00 +ILS 06R ILS/DME IGPE 111.70 33-57-02.407N 118-23-49.316W 33-56-53.313N 118-25-47.360W 108 3.66 82.96 3.00 +ILS 25 ILS IPMD 110.70 34-37-48.786N 118-07-10.911W 34-38-01.256N 118-04-40.078W 2492 3.00 266.17 3.00 +NAV UR NDB 34-11-53.812N 118-22-40.410W 730 253 - +NAV CMA VOR/DME 34-12-45.082N 119-05-39.678W 63 115.80 105X +NAV CPM NDB 33-53-20.622N 118-14-50.190W 97 378 - +NAV DAG VORTAC 34-57-44.845N 116-34-41.399W 1760 113.20 079X +NAV EDW VORTAC 34-58-56.500N 117-43-57.380W 2378 116.40 111X +NAV NJK TACAN 32-49-54.390N 115-40-52.210W -49 111.00 047X +NAV EMT NDB 34-05-17.932N 118-01-52.342W 305 359 - +NAV FIM VORTAC 34-21-24.097N 118-52-52.648W 2200 112.50 072X +NAV GMN VORTAC 34-48-14.503N 118-51-40.897W 4920 116.10 108X +NAV HEC VORTAC 34-47-49.265N 116-27-46.519W 1853 112.70 074X +NAV IPL VORTAC 32-44-55.920N 115-30-30.895W -18 115.90 106X +NAV NRS TACAN 32-33-51.025N 117-06-35.103W 21 109.20 029X +NAV JLI VORTAC 33-08-25.651N 116-35-09.365W 5560 114.00 087X +NAV LHS VORTAC 34-40-58.704N 118-34-36.977W 5790 108.40 021X +NAV GWF NDB 34-44-19.285N 118-13-00.433W 0 282 - +NAV SLI VORTAC 33-46-59.873N 118-03-17.118W 22 115.70 104X +NAV LAX VORTAC 33-55-59.335N 118-25-55.241W 185 113.60 083X +NAV NFG TACAN 33-16-28.509N 117-23-10.985W 502 111.80 055X +NAV OCN VORTAC 33-14-26.282N 117-25-03.795W 52 115.30 100X +NAV PDZ VORTAC 33-55-06.013N 117-31-47.990W 1432 112.20 059X +NAV NTD TACAN 34-07-23.820N 119-07-19.110W 7 110.60 043X +NAV VTU VOR/DME 34-06-54.213N 119-02-58.170W 1560 108.20 019X +NAV PAI NDB 34-15-35.009N 118-24-48.295W 0 370 - +NAV PSP VORTAC 33-52-12.054N 116-25-47.216W 1600 115.50 102X +NAV TRM VORTAC 33-37-41.145N 116-09-36.712W -87 116.20 109X +NAV PMD VORTAC 34-37-53.034N 118-03-49.761W 2498 114.50 092X +NAV POM VORTAC 34-04-42.199N 117-47-13.473W 1266 110.40 041X +NAV HDF VOR 33-46-34.780N 117-11-07.160W 1414 113.40 - +NAV RIV TACAN 33-54-23.280N 117-16-30.140W 1543 113.00 077X +NAV RAL VOR 33-57-18.650N 117-26-59.380W 778 112.40 - +NAV SB NDB 34-03-23.299N 117-21-58.011W 972 397 - +NAV NUC TACAN 33-01-36.951N 118-34-46.556W 161 117.60 123X +NAV NSD TACAN 32-52-47.630N 118-26-27.270W 2000 113.90 86X +NAV NKX TACAN 32-52-11.099N 117-09-17.513W 430 109.60 033X +NAV MZB VORTAC 32-46-55.934N 117-13-31.486W 12 117.80 125X +NAV NZY TACAN 32-42-09.130N 117-12-58.430W 17 117.00 117X +NAV PGY VORTAC 32-36-37.216N 116-58-44.685W 580 109.80 035X +NAV NSI TACAN 33-14-06.271N 119-27-30.216W 522 110.20 039X +NAV ELB VOR/DME 33-40-33.707N 117-43-51.901W 336 117.20 119X +NAV RZS VORTAC 34-30-34.321N 119-46-15.570W 3598 114.90 096X +NAV SXC VORTAC 33-22-30.201N 118-25-11.675W 2090 111.40 051X +NAV SMO VOR/DME 34-00-36.882N 118-27-24.176W 114 110.80 045X +NAV TNP VORTAC 34-06-44.044N 115-46-11.658W 1374 114.20 089X +NAV VNY VOR/DME 34-13-24.464N 118-29-30.016W 812 113.10 078X +NAV VCV VOR/DME 34-35-38.986N 117-23-23.990W 2855 109.05 27Y +NAV MXL VOR/DME 32-37-33.000N 115-13-25.000W 0 115.00 097X +NAV SQN VOR 30-30-00.000N 115-57-00.000W 0 113.30 - +NAV TIJ VOR/DME 32-32-24.550N 116-57-13.150W 499 116.50 112X +NAV UN NDB 32-32-00.000N 117-02-00.000W 0 381 - diff -Nru acm-5.0/objects/zones/usa/newyork.txt acm-6.0+20200416/objects/zones/usa/newyork.txt --- acm-5.0/objects/zones/usa/newyork.txt 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/objects/zones/usa/newyork.txt 2020-04-16 12:05:39.000000000 +0000 @@ -0,0 +1,503 @@ +# New York area scenery. +# Created: 2020-04-16 +# Latitude range: [40N, 45N[ +# Longitude range: [75W, 70W[ +# 2017-10-04 Checked against https://nfdc.faa.gov/xwiki/bin/view/NFDC/56DaySub-2017-03-02 +# "56 Day NASR Subscription - Effective March 2, 2017". + +# New York, JFK 04L: +TEAM1_LOC 40-37-19.2759N 073-47-08.1083W 000 031 +# Boston, BOS 22R: +TEAM2_LOC 42-22-41.8759N 071-00-16.2499W 000 199 +GROUND_COLOR #305030 +RWY BDR 06/24 9 4677 100 41-09-25.3598N 073-07-55.0421W 41-09-58.0324N 073-07-11.7989W +RWY BDR 11/29 9 4761 150 41-09-58.4586N 073-08-05.8621W 41-09-52.0542N 073-07-04.2161W +RWY SNC 17/35 416 2722 50 41-23-14.0580N 072-30-26.6980W 41-22-48.6500N 072-30-14.9700W +RWY DXR 08/26 457 4422 150 41-22-07.3060N 073-29-26.7358W 41-22-22.4173N 073-28-32.3223W +RWY DXR 17/35 457 3135 100 41-22-35.0829N 073-29-00.0396W 41-22-07.4625N 073-28-41.4347W +RWY LZD 13/31 238 2700 75 41-49-17.6665N 071-54-18.9632W 41-49-04.4735N 071-53-47.9757W +RWY 42B 14/32 9 2120 50 41-26-53.1800N 072-27-36.7900W 41-26-39.3900N 072-27-15.8200W +RWY 7B9 01/19 253 1800 50 41-55-22.6721N 072-27-24.5741W 41-55-40.3976N 072-27-26.5495W +RWY GON 05/23 9 5000 150 41-19-30.1161N 072-02-52.8935W 41-20-11.0876N 072-02-16.2705W +RWY GON 15/33 9 4000 96 41-19-59.2181N 072-03-10.8512W 41-19-31.2484N 072-02-33.8138W +RWY HFD 02/20 18 4417 150 41-43-53.8973N 072-38-59.3182W 41-44-37.0017N 072-38-50.2639W +RWY HFD 11/29 18 2314 71 41-44-03.0855N 072-39-27.2883W 41-43-59.5425N 072-38-57.1363W +RWY MMK 18/36 103 3100 75 41-30-45.9110N 072-49-52.5260W 41-30-16.8360N 072-49-39.7190W +RWY HVN 02/20 12 5600 150 41-15-21.7804N 072-53-17.6857W 41-16-17.0384N 072-53-13.9648W +RWY HVN 14/32 12 3626 100 41-16-01.4303N 072-53-25.1867W 41-15-37.8395N 072-52-49.4541W +RWY 11N 17/35 675 2900 50 41-34-21.8004N 073-27-52.1436W 41-33-56.2776N 073-27-34.7877W +RWY OXC 18/36 726 5800 100 41-29-10.0979N 073-08-12.7783W 41-28-13.5324N 073-08-00.5659W +RWY 4B8 02/20 202 3665 75 41-41-03.6106N 072-51-55.1592W 41-41-39.6581N 072-51-50.6543W +RWY C44 17/35 770 1756 60 41-57-28.0758N 072-03-21.4026W 41-57-13.0039N 072-03-09.8977W +RWY 4B9 03/21 195 2205 50 41-54-47.7500N 072-46-40.8900W 41-55-08.7600N 072-46-33.1400W +RWY 7B6 10/28 120 3242 60 41-55-41.5500N 072-34-56.4600W 41-55-42.9800N 072-34-13.6000W +RWY IJD 09/27 246 4271 100 41-44-36.2815N 072-11-06.5948W 41-44-47.6012N 072-10-12.3250W +RWY IJD 18/36 246 2799 75 41-44-46.6120N 072-11-08.3954W 41-44-20.1141N 072-10-57.8508W +RWY BDL 01/19 173 4268 100 41-56-01.4095N 072-40-46.6309W 41-56-43.5599N 072-40-47.5795W +RWY BDL 06/24 173 9510 200 41-55-55.2512N 072-41-47.6882W 41-57-02.3920N 072-40-19.6784W +RWY BDL 15/33 173 6847 150 41-56-32.6303N 072-41-35.7094W 41-55-45.3241N 072-40-30.9576W +RWY 8B5 06/24 589 3027 40 42-21-12.6126N 072-08-02.8567W 42-21-33.3626N 072-07-33.8326W +RWY BED 05/23 132 5107 150 42-27-48.3688N 071-17-48.7253W 42-28-28.5910N 071-17-07.5937W +RWY BED 11/29 132 7011 150 42-28-18.5654N 071-18-01.2347W 42-28-09.9695N 071-16-28.4156W +RWY 1M8 09/27 73 2466 50 41-50-17.2077N 071-01-50.9093W 41-50-23.9165N 071-01-19.5874W +RWY BVY 09/27 107 4755 100 42-34-47.0784N 070-55-29.1191W 42-34-59.8069N 070-54-27.9431W +RWY BVY 16/34 107 5001 100 42-35-31.0040N 070-55-18.9310W 42-34-52.8130N 070-54-36.5338W +RWY BOS 04L/22R 19 7864 150 42-21-28.7577N 071-00-51.6187W 42-22-41.8759N 071-00-16.2499W +RWY BOS 04R/22L 19 10006 150 42-21-03.8094N 071-00-42.4580W 42-22-36.8399N 070-59-57.4473W +RWY BOS 09/27 19 7001 150 42-21-20.7150N 071-00-46.4187W 42-21-36.7767N 070-59-15.7276W +RWY BOS 14/32 19 5000 100 42-21-23.7521N 071-01-23.7886W 42-20-54.9565N 071-00-29.6841W +RWY BOS 15L/33R 19 2557 100 42-22-23.5036N 071-00-31.0069W 42-22-05.5826N 071-00-07.0019W +RWY BOS 15R/33L 19 10083 150 42-22-27.3749N 071-01-04.4117W 42-21-16.7428N 070-59-29.7098W +RWY FMH 05/23 130 8000 150 41-39-00.4941N 070-31-48.1193W 41-40-01.9710N 070-30-41.8887W +RWY FMH 14/32 130 9501 150 41-40-02.7862N 070-32-17.8082W 41-39-05.7407N 070-30-38.4092W +RWY 5B6 07/25 41 2298 40 41-35-00.9854N 070-32-37.0646W 41-35-15.1407N 070-32-13.4290W +RWY FIT 02/20 348 3504 75 42-32-58.8143N 071-45-35.8666W 42-33-33.0907N 071-45-29.3344W +RWY FIT 14/32 348 4510 100 42-33-27.8348N 071-45-55.5606W 42-33-00.1003N 071-45-08.4039W +RWY GDM 18/36 954 3000 75 42-33-13.8618N 072-01-02.9031W 42-32-45.2655N 072-00-52.4259W +RWY GBR 11/29 739 2579 50 42-11-04.6080N 073-24-28.6840W 42-11-01.7330N 073-23-54.6470W +RWY 28M 18/36 71 1760 60 42-01-38.8728N 070-50-20.3362W 42-01-22.1393N 070-50-13.9859W +RWY 1B6 18/36 269 3172 90 42-06-38.5550N 071-30-41.3020W 42-06-08.1050N 071-30-31.3550W +RWY HYA 06/24 54 5425 150 41-39-52.5478N 070-16-57.9954W 41-40-27.1363N 070-16-03.3935W +RWY HYA 15/33 54 5253 150 41-40-29.1794N 070-17-30.8321W 41-39-49.5579N 070-16-46.1408W +RWY LWM 05/23 148 5001 150 42-42-39.2577N 071-07-44.0145W 42-43-18.0881N 071-07-02.6143W +RWY LWM 14/32 148 3900 100 42-43-16.2633N 071-07-47.8805W 42-42-56.0207N 071-07-03.4262W +RWY 1B9 04/22 122 2200 100 41-59-58.6678N 071-12-09.9458W 42-00-17.8811N 071-11-56.3104W +RWY 1B9 14/32 122 3503 75 42-00-09.4306N 071-12-07.1481W 41-59-50.7927N 071-11-28.0603W +RWY 9B1 14/32 285 1659 45 42-20-39.6381N 071-30-41.8051W 42-20-31.1185N 071-30-22.9320W +RWY GHG 06/24 9 3900 100 42-05-37.6339N 070-40-41.5043W 42-06-04.3577N 070-40-04.2387W +RWY 2B1 05/23 103 2035 50 41-40-58.1276N 070-24-09.2434W 41-41-13.4484N 070-23-55.6029W +RWY 2B1 09/27 103 2700 60 41-41-03.3333N 070-24-27.2314W 41-41-10.6954N 070-23-56.2256W +RWY 2B1 17/35 103 2060 60 41-41-16.0961N 070-24-14.0264W 41-41-00.1911N 070-24-03.7765W +RWY 0B5 16/34 359 3200 75 42-35-42.3716N 072-31-35.7656W 42-35-17.2325N 072-31-09.8394W +RWY ACK 06/24 47 6303 150 41-14-48.9863N 070-04-21.0972W 41-15-33.0124N 070-03-22.7304W +RWY ACK 12/30 47 2696 50 41-15-09.9678N 070-03-43.8865W 41-15-02.1033N 070-03-10.1647W +RWY ACK 15/33 47 4500 100 41-15-28.8294N 070-03-38.9543W 41-14-57.3825N 070-02-57.3061W +RWY EWB 05/23 79 5400 150 41-40-16.5375N 070-57-53.8837W 41-40-58.3204N 070-57-09.6421W +RWY EWB 14/32 79 5000 150 41-40-49.0738N 070-57-50.1562W 41-40-18.3320N 070-56-58.5878W +RWY 2B2 10/28 11 2105 50 42-47-42.7100N 070-50-36.1100W 42-47-43.8600N 070-50-07.9200W +RWY AQW 11/29 654 4300 100 42-41-48.9420N 073-10-42.5926W 42-41-44.0853N 073-09-45.3893W +RWY 7B2 14/32 121 3335 50 42-19-50.8900N 072-36-58.0500W 42-19-30.7800N 072-36-22.8800W +RWY OWD 10/28 49 3995 75 42-11-31.5995N 071-10-42.6240W 42-11-32.4597N 071-09-49.5600W +RWY OWD 17/35 49 4008 100 42-11-37.6464N 071-10-40.3357W 42-11-01.8310N 071-10-17.6405W +RWY ORE 01/19 556 4999 75 42-33-40.4620N 072-17-25.0761W 42-34-29.8396N 072-17-24.3848W +RWY ORE 14/32 556 4801 75 42-34-33.4277N 072-17-37.7867W 42-34-04.8263N 072-16-46.6170W +RWY 13MA 04/22 418 2475 55 42-13-13.2340N 072-18-48.6930W 42-13-34.8340N 072-18-33.2930W +RWY PSF 08/26 1188 5791 100 42-25-28.4465N 073-18-00.8516W 42-25-53.2822N 073-16-51.3048W +RWY PSF 14/32 1188 3496 100 42-25-46.4113N 073-17-48.1778W 42-25-27.7098N 073-17-09.0000W +RWY PYM 06/24 148 4350 75 41-54-15.2483N 070-44-11.4665W 41-54-48.3795N 070-43-34.8345W +RWY PYM 15/33 148 3351 75 41-54-43.9248N 070-43-48.3503W 41-54-22.8302N 070-43-14.2041W +RWY PVC 07/25 8 3502 100 42-04-11.3870N 070-13-34.6087W 42-04-29.0450N 070-12-54.6840W +RWY 3B0 02/20 699 3501 75 42-05-46.8699N 072-02-23.0285W 42-06-21.1226N 072-02-16.5979W +RWY 60M 01/19 1040 1949 50 42-17-16.3890N 071-57-52.8480W 42-17-35.1364N 071-57-52.9051W +RWY CEF 05/23 241 11598 301 42-10-38.8680N 072-32-52.8250W 42-12-13.6300N 072-31-26.2390W +RWY CEF 15/33 241 7082 150 42-12-23.1740N 072-32-31.4360W 42-11-33.7090N 072-31-24.8990W +RWY 3B3 16/34 459 3086 40 42-25-44.8581N 071-47-47.5912W 42-25-21.6396N 071-47-20.9349W +RWY 6B6 03/21 268 2770 48 42-27-27.0700N 071-31-12.5500W 42-27-53.2900N 071-31-01.9400W +RWY 6B6 12/30 268 1600 70 42-27-37.3100N 071-31-09.1400W 42-27-32.8100N 071-30-48.6800W +RWY TAN 04/22 42 1900 60 41-52-31.5570N 071-01-21.7240W 41-52-48.3440N 071-01-10.5040W +RWY TAN 12/30 42 3500 75 41-52-26.8885N 071-01-11.3423W 41-52-16.3914N 071-00-27.2727W +RWY MVY 06/24 67 5504 100 41-23-11.9581N 070-37-09.6025W 41-23-53.2384N 070-36-22.5953W +RWY MVY 15/33 67 3328 75 41-23-53.1325N 070-37-12.8822W 41-23-31.7310N 070-36-39.7436W +RWY BAF 02/20 270 9000 150 42-08-43.0807N 072-43-07.7517W 42-10-10.5755N 072-42-46.5557W +RWY BAF 15/33 270 5000 100 42-09-50.7851N 072-43-18.3599W 42-09-12.8399N 072-42-35.8716W +RWY ORH 11/29 1009 7001 150 42-16-02.3866N 071-53-26.8657W 42-15-57.7511N 071-51-53.9652W +RWY ORH 15/33 1009 5000 100 42-16-22.2435N 071-52-43.1427W 42-15-45.6872N 071-51-58.4327W +RWY LEW 04/22 288 5001 100 44-02-32.0609N 070-17-17.0073W 44-03-17.0375N 070-16-48.7404W +RWY LEW 17/35 288 2750 75 44-03-05.8892N 070-17-06.5343W 44-02-42.8919N 070-16-46.5057W +RWY 0B1 14/32 674 3818 75 44-25-41.6898N 070-48-56.9095W 44-25-19.4109N 070-48-14.4755W +RWY B19 06/24 157 3000 75 43-27-39.5900N 070-28-33.9100W 43-28-02.0310N 070-28-07.3560W +RWY 3S2 12/30 418 1808 40 44-30-55.4623N 070-24-35.2991W 44-30-46.4213N 070-24-13.7906W +RWY 3B4 12/30 125 2701 50 43-08-39.8770N 070-46-41.4600W 43-08-30.6900N 070-46-07.2800W +RWY IZG 14/32 455 4200 75 43-59-40.4174N 070-57-15.4545W 43-59-15.7728N 070-56-29.2534W +RWY 63B 11/29 292 2973 50 43-45-47.6552N 070-40-41.1049W 43-45-46.1615N 070-40-00.6509W +RWY B10 02/20 324 2201 120 44-24-25.2681N 070-08-48.0884W 44-24-46.7828N 070-08-43.7530W +RWY 81B 15/33 345 2997 75 44-09-36.5485N 070-29-08.0249W 44-09-16.9417N 070-28-37.2376W +RWY PWM 11/29 76 7200 150 43-38-45.1032N 070-19-33.8651W 43-38-38.5209N 070-17-56.3694W +RWY PWM 18/36 76 6100 150 43-39-16.1036N 070-18-26.3497W 43-38-18.4236N 070-18-02.3920W +RWY 8B0 14/32 1825 3201 75 44-59-38.8973N 070-40-11.7663W 44-59-22.7327N 070-39-33.4910W +RWY SFM 07/25 244 6389 100 43-23-12.0113N 070-43-11.0761W 43-23-45.1011N 070-41-57.4240W +RWY SFM 14/32 244 4999 100 43-24-01.2346N 070-42-51.5048W 43-23-37.3650N 070-41-52.2291W +RWY 3B5 11/29 355 2151 100 44-11-20.8805N 070-14-14.2667W 44-11-16.8859N 070-13-45.2725W +RWY 3B5 12/30 355 2104 50 44-11-25.1339N 070-14-10.3598W 44-11-18.0172N 070-13-43.2327W +RWY BML 18/36 1161 5200 100 44-34-55.3055N 071-10-46.1690W 44-34-07.3452N 071-10-20.5129W +RWY CNH 11/29 544 3098 100 43-22-14.6616N 072-22-26.4877W 43-22-12.9693N 072-21-44.6057W +RWY 4C4 04/22 1017 2466 75 44-53-03.8538N 071-30-34.4136W 44-53-26.3161N 071-30-21.2028W +RWY CON 12/30 342 3200 75 43-12-27.6376N 071-30-24.8828W 43-12-19.4407N 071-29-43.1570W +RWY CON 17/35 342 6005 100 43-12-29.4152N 071-30-27.5807W 43-11-35.6341N 071-29-53.3882W +RWY 1B5 18/36 978 2305 150 44-11-53.2110N 071-45-04.0799W 44-11-30.6490N 071-44-59.8335W +RWY 2G8 12/30 835 2822 70 44-23-41.0400N 071-12-11.6700W 44-23-32.7500N 071-11-34.5700W +RWY 5B9 01/19 582 2511 58 44-04-36.3440N 072-00-25.5595W 44-05-00.9005N 072-00-30.3121W +RWY 8B1 02/20 600 3260 75 43-03-24.4638N 071-54-18.7749W 43-03-56.6627N 071-54-19.7859W +RWY AFN 16/34 1040 2982 134 42-48-30.9800N 072-00-21.4670W 42-48-05.9920N 072-00-00.2950W +RWY EEN 02/20 488 6201 100 42-53-14.3530N 072-16-15.1370W 42-54-15.5090N 072-16-10.4340W +RWY EEN 14/32 488 4001 150 42-54-20.5720N 072-16-39.3950W 42-53-56.7400N 072-15-56.5160W +RWY LCI 08/26 545 5890 100 43-34-11.8400N 071-25-41.2000W 43-34-34.0600N 071-24-27.2600W +RWY LEB 07/25 603 5496 100 43-37-33.0158N 072-18-43.4102W 43-38-00.7239N 072-17-39.1615W +RWY LEB 18/36 603 5200 100 43-37-45.5076N 072-18-26.5069W 43-36-55.2804N 072-18-11.7787W +RWY MHT 06/24 266 7651 150 42-55-41.8490N 071-26-56.6184W 42-56-37.6303N 071-25-47.2381W +RWY MHT 17/35 266 9250 150 42-56-30.3568N 071-26-22.4471W 42-55-06.5585N 071-25-32.9183W +RWY ASH 14/32 200 6000 100 42-47-12.6982N 071-31-24.5987W 42-46-40.6791N 071-30-16.8912W +RWY 2B3 12/30 783 2140 80 43-23-25.2600N 072-11-40.6800W 43-23-19.8000N 072-11-12.6700W +RWY 2B3 18/36 783 3448 50 43-23-25.0800N 072-11-14.0500W 43-22-51.9800N 072-11-03.1300W +RWY 1P1 12/30 506 2347 90 43-46-43.4000N 071-45-29.7100W 43-46-40.0300N 071-44-58.0100W +RWY PSM 16/34 100 11321 150 43-05-28.6003N 070-50-02.9997W 43-03-52.6772N 070-48-44.6011W +RWY DAW 15/33 322 4201 75 43-17-16.8600N 070-56-07.8100W 43-16-49.6307N 070-55-24.9464W +RWY 8B2 09/27 1459 2660 60 44-15-47.0005N 071-33-05.8723W 44-15-54.2608N 071-32-30.7182W +RWY HIE 10/28 1072 4001 75 44-22-02.2111N 071-33-12.4256W 44-22-04.1791N 071-32-17.4102W +RWY 13N 06/24 600 1924 135 40-57-50.3780N 074-47-01.8339W 40-58-05.2678N 074-46-46.2312W +RWY 12N 03/21 583 1981 50 41-00-21.9160N 074-44-21.6280W 41-00-40.1460N 074-44-12.2160W +RWY BLM 03/21 153 3512 50 40-10-50.1026N 074-07-28.0973W 40-11-22.3392N 074-07-11.3304W +RWY BLM 14/32 153 7371 85 40-11-39.7980N 074-08-07.5318W 40-10-50.6043N 074-06-57.5074W +RWY 1N7 07/25 372 3112 70 40-58-08.5723N 075-00-08.7156W 40-58-23.5863N 074-59-33.3155W +RWY CDW 04/22 172 4552 80 40-52-03.9352N 074-17-10.8170W 40-52-43.0377N 074-16-41.5437W +RWY CDW 10/28 172 3719 75 40-52-37.5789N 074-17-12.8333W 40-52-41.9578N 074-16-24.7665W +RWY 2N6 11/29 78 1590 70 40-01-38.7101N 074-41-37.3285W 40-01-36.3837N 074-41-17.1095W +RWY NEL 06/24 101 5002 150 40-01-53.4600N 074-21-23.6700W 40-02-24.8900N 074-20-34.0400W +RWY NEL 15/33 101 5001 150 40-02-22.6400N 074-21-37.0300W 40-01-44.5000N 074-20-56.1400W +RWY N12 06/24 42 2987 60 40-03-50.7427N 074-10-53.3103W 40-04-10.7900N 074-10-25.1100W +RWY N07 01/19 182 2942 40 40-56-36.7900N 074-18-50.6900W 40-57-05.7700N 074-18-53.7700W +RWY LDJ 09/27 22 4140 100 40-36-57.7599N 074-15-06.5453W 40-37-07.8766N 074-14-14.5329W +RWY 47N 07/25 86 3510 50 40-31-18.3101N 074-36-12.7118W 40-31-37.6562N 074-35-34.9826W +RWY MMU 05/23 187 5998 150 40-47-35.1745N 074-25-09.2717W 40-48-23.0603N 074-24-23.3114W +RWY MMU 13/31 187 3997 150 40-48-03.3765N 074-25-28.3209W 40-47-47.3569N 074-24-40.8137W +RWY EWR 04L/22R 17 11000 150 40-40-31.3716N 074-10-46.0209W 40-42-09.2091N 074-09-43.8255W +RWY EWR 04R/22L 17 10000 150 40-40-39.2984N 074-10-27.2835W 40-42-08.2438N 074-09-30.7308W +RWY EWR 11/29 17 6726 150 40-42-10.0955N 074-10-50.5467W 40-42-04.3181N 074-09-23.5515W +RWY 3N6 06/24 87 3594 50 40-19-34.8660N 074-21-04.6200W 40-20-00.2880N 074-20-32.2200W +RWY N40 07/25 560 2900 50 40-33-48.8000N 074-59-00.7600W 40-34-05.5520N 074-58-30.2580W +RWY 39N 10/28 128 3499 75 40-23-56.5190N 074-39-55.0376W 40-23-56.9202N 074-39-09.8093W +RWY 3NJ6 02/20 72 4002 60 40-00-36.0840N 074-50-31.9930W 40-01-15.3300N 074-50-25.5700W +RWY N51 04/22 189 5598 50 40-34-26.5400N 074-44-25.7600W 40-35-14.6800N 074-43-50.0300W +RWY N51 10/28 189 2010 100 40-34-54.6323N 074-44-36.2616W 40-34-57.7900N 074-44-10.5400W +RWY N51 13/31 189 3444 200 40-35-19.1800N 074-44-32.0200W 40-35-02.4300N 074-43-53.1700W +RWY N87 11/29 118 4275 75 40-12-52.2219N 074-36-33.8307W 40-12-48.1522N 074-35-38.9852W +RWY SMQ 08/26 106 1923 100 40-37-34.7885N 074-40-18.3014W 40-37-41.4987N 074-39-54.9757W +RWY SMQ 12/30 106 2739 65 40-37-36.8922N 074-40-30.9657W 40-37-28.0959N 074-39-57.3794W +RWY SMQ 17/35 106 1700 150 40-37-37.9470N 074-40-18.4900W 40-37-22.0162N 074-40-11.4905W +RWY FWN 03/21 421 3499 75 41-11-44.0940N 074-37-29.2190W 41-12-17.3370N 074-37-16.6570W +RWY TEB 01/19 8 7000 150 40-50-19.2556N 074-03-37.3336W 40-51-28.2827N 074-03-32.2422W +RWY TEB 06/24 8 6013 150 40-50-48.2225N 074-04-13.0579W 40-51-27.8633N 074-03-14.7450W +RWY TTN 06/24 213 6006 150 40-16-11.1093N 074-49-17.6762W 40-16-51.9803N 074-48-21.4911W +RWY TTN 16/34 213 4800 150 40-17-01.3754N 074-49-04.7002W 40-16-22.2122N 074-48-29.7608W +RWY 4N1 06/24 790 3471 60 41-07-30.6581N 074-21-04.3220W 41-07-53.6822N 074-20-30.7005W +RWY WRI 06/24 141 10014 150 40-00-15.9347N 074-35-51.1635W 40-01-24.9680N 074-34-18.9460W +RWY WRI 18/36 141 7126 150 40-01-38.9716N 074-36-11.0955W 40-00-29.1074N 074-35-59.5750W +RWY 7NY8 09/27 773 1400 250 42-57-48.6200N 074-07-41.3500W 42-57-50.5700N 074-07-22.6800W +RWY ALB 01/19 285 8500 150 42-44-13.7922N 073-48-15.3198W 42-45-37.7058N 073-48-18.9573W +RWY ALB 10/28 285 7200 150 42-44-56.9415N 073-48-43.5284W 42-44-59.1972N 073-47-07.0866W +RWY 1C3 03/21 330 2400 87 43-15-04.8463N 073-28-16.8353W 43-15-27.7790N 073-28-08.5967W +RWY 3C8 14/32 75 10001 200 40-55-25.7850N 072-47-38.4750W 40-54-20.7670N 072-46-00.3780W +RWY 1B8 05/23 510 2130 65 43-03-00.7613N 073-21-54.8147W 43-03-18.6483N 073-21-39.6989W +RWY NY02 06/24 1960 2290 40 42-29-08.9000N 074-46-56.9700W 42-29-22.9600N 074-46-33.0100W +RWY 4B1 10/28 714 2600 45 42-45-34.8208N 074-08-22.1492W 42-45-36.2041N 074-07-47.3386W +RWY HTO 10/28 55 4255 100 40-57-31.9776N 072-15-37.0828W 40-57-32.7662N 072-14-41.6308W +RWY HTO 16/34 55 2060 75 40-57-45.7840N 072-15-05.8826W 40-57-28.3184N 072-14-52.0902W +RWY 1F2 01/19 1070 2000 100 43-13-22.2128N 074-06-53.7688W 43-13-41.9699N 074-06-53.4423W +RWY N89 04/22 292 3838 75 41-43-28.1070N 074-22-50.4030W 41-43-59.8630N 074-22-22.7370W +RWY FRG 01/19 80 5516 150 40-43-18.2850N 073-24-51.3346W 40-44-12.7867N 073-24-52.3624W +RWY FRG 14/32 80 6833 150 40-44-04.6770N 073-25-18.2521W 40-43-19.2856N 073-24-12.5504W +RWY 0B8 07/25 9 1792 75 41-15-04.0560N 072-02-04.3100W 41-15-12.5720N 072-01-43.7400W +RWY 0B8 12/30 9 2328 100 41-15-09.4160N 072-02-08.5930W 41-15-05.0720N 072-01-38.6640W +RWY 83K 04/22 261 2200 50 43-24-26.1400N 073-32-05.8800W 43-24-44.1600N 073-31-49.2300W +RWY 1I5 12/30 440 2275 22 42-21-54.2389N 074-04-08.3847W 42-21-46.6326N 074-03-39.8614W +RWY GFL 01/19 328 5000 150 43-20-08.4130N 073-36-31.2446W 43-20-57.7808N 073-36-33.1024W +RWY GFL 12/30 328 3999 100 43-20-29.3211N 073-37-08.6080W 43-20-15.5297N 073-36-17.8956W +RWY 1H4 17/35 840 1801 75 42-25-19.8300N 074-00-24.8400W 42-25-02.0400N 074-00-24.7800W +RWY 1B1 03/21 198 5350 100 42-17-02.7795N 073-42-44.3149W 42-17-54.5443N 073-42-30.0036W +RWY NY0 10/28 881 4000 75 42-59-53.3608N 074-20-13.3097W 42-59-53.6407N 074-19-19.4841W +RWY 20N 15/33 147 3100 60 41-59-18.6462N 073-58-04.7115W 41-58-55.1442N 073-57-38.3961W +RWY LKP 14/32 1747 4196 60 44-16-04.1802N 073-58-06.1571W 44-15-40.0456N 073-57-19.2945W +RWY 1A1 03/21 297 2275 75 42-08-47.0695N 073-45-05.2383W 42-09-08.9376N 073-44-58.2405W +RWY MAL 05/23 790 3994 100 44-50-58.1113N 074-20-10.6677W 44-51-29.6551N 074-19-37.3865W +RWY MAL 14/32 790 3250 75 44-51-21.9048N 074-19-50.1990W 44-51-02.6424N 074-19-14.1261W +RWY MSS 05/23 221 5601 100 44-55-48.1043N 074-50-57.8267W 44-56-35.3934N 074-50-17.4688W +RWY MSS 09/27 221 4001 100 44-56-03.9741N 074-51-16.1313W 44-56-13.3748N 074-50-22.1168W +RWY 21N 01/19 30 2200 60 40-59-02.1702N 072-31-08.6720W 40-59-23.9110N 072-31-09.0754W +RWY 06N 08/26 523 2811 60 41-25-48.5426N 074-23-46.0317W 41-26-01.2238N 074-23-13.2081W +RWY 44N 17/35 698 3830 60 41-42-43.5590N 073-44-28.4027W 41-42-09.8954N 073-44-05.3571W +RWY MTP 06/24 7 3246 75 41-04-25.1107N 071-55-29.1606W 41-04-46.9723N 071-54-58.1459W +RWY MGJ 03/21 364 5006 100 41-30-16.6460N 074-16-08.6202W 41-31-04.2775N 074-15-51.0801W +RWY MGJ 08/26 364 3664 100 41-30-22.5068N 074-16-05.0130W 41-30-37.1011N 074-15-20.9397W +RWY MSV 15/33 1403 6298 150 41-42-30.7526N 074-48-07.0808W 41-41-41.1058N 074-47-17.0473W +RWY SWF 09/27 491 11817 150 41-30-03.0200N 074-07-49.9800W 41-30-26.5380N 074-05-17.8585W +RWY SWF 16/34 491 6004 150 41-30-40.2511N 074-06-05.0299W 41-29-49.2055N 074-05-24.8352W +RWY ISP 06/24 99 7006 150 40-47-19.0902N 073-06-44.8159W 40-48-08.0453N 073-05-40.4068W +RWY ISP 10/28 99 5034 150 40-47-33.0994N 073-06-28.8035W 40-47-33.0982N 073-05-23.3547W +RWY ISP 15L/33R 99 3175 75 40-47-56.5234N 073-05-54.1792W 40-47-34.3411N 073-05-24.9865W +RWY ISP 15R/33L 99 5186 150 40-48-08.0173N 073-06-26.3880W 40-47-31.7742N 073-05-38.7259W +RWY JFK 04L/22R 13 12079 200 40-37-19.2759N 073-47-08.1083W 40-39-01.8337N 073-45-47.9596W +RWY JFK 04R/22L 13 8400 200 40-37-31.5320N 073-46-13.2500W 40-38-42.8490N 073-45-17.5090W +RWY JFK 13L/31R 13 10000 150 40-39-27.9500N 073-47-24.8900W 40-38-37.4000N 073-45-33.4100W +RWY JFK 13R/31L 13 14511 200 40-38-54.1020N 073-49-00.1730W 40-37-40.7810N 073-46-18.4130W +RWY LGA 04/22 21 7001 150 40-46-08.9927N 073-53-02.8304W 40-47-07.5736N 073-52-14.4209W +RWY LGA 13/31 21 7003 150 40-46-56.2698N 073-52-42.6775W 40-46-19.4573N 073-51-25.6016W +RWY K09 04/22 1703 3016 60 43-26-58.9472N 074-31-04.4624W 43-27-24.5624N 074-30-43.5965W +RWY PBG 17/35 234 11759 200 44-39-56.9979N 073-28-36.4070W 44-38-09.7502N 073-27-34.0879W +RWY PTD 06/24 474 3703 60 44-40-22.8735N 074-57-12.1926W 44-40-49.1260N 074-56-36.5288W +RWY POU 06/24 164 5001 100 41-37-18.9070N 073-53-31.2070W 41-37-50.1510N 073-52-40.1930W +RWY POU 07/25 164 1358 100 41-37-29.9188N 073-53-17.4370W 41-37-38.3941N 073-53-03.5904W +RWY POU 15/33 164 2744 100 41-37-48.8020N 073-53-06.5544W 41-37-28.4415N 073-52-42.7076W +RWY 46N 01/19 323 2664 30 41-58-51.6653N 073-50-09.8441W 41-59-17.9811N 073-50-09.2609W +RWY W57 14/32 178 1927 76 42-55-58.2900N 073-46-25.1800W 42-55-46.2200N 073-46-05.1300W +RWY SLK 05/23 1663 6573 150 44-22-48.7500N 074-12-47.7907W 44-23-41.9807N 074-11-56.0162W +RWY SLK 09/27 1663 3998 100 44-22-49.8109N 074-12-49.8507W 44-22-57.2591N 074-11-55.7914W +RWY 5B2 05/23 434 4699 100 43-02-43.5376N 073-52-02.5082W 43-03-19.8566N 073-51-23.0976W +RWY 5B2 14/32 434 4000 100 43-03-15.9375N 073-52-01.7954W 43-02-51.3307N 073-51-19.6466W +RWY SCH 04/22 378 7001 150 42-50-48.8299N 073-56-01.6674W 42-51-50.9853N 073-55-20.4820W +RWY SCH 10/28 378 4850 150 42-50-54.3014N 073-56-26.6923W 42-50-56.0484N 073-55-21.6301W +RWY B04 02/20 100 2500 90 43-03-51.2100N 073-35-03.1600W 43-04-15.8200N 073-35-00.4900W +RWY HWV 06/24 81 4200 100 40-49-17.7701N 072-52-22.5022W 40-49-47.1208N 072-51-43.8781W +RWY HWV 15/33 81 4222 150 40-49-20.4374N 072-52-17.9787W 40-48-50.9427N 072-51-39.1478W +RWY 4B0 01/19 196 2853 60 42-33-24.6031N 073-50-00.1619W 42-33-52.6209N 073-50-04.2993W +RWY 09N 02/20 450 1863 75 41-49-48.2955N 073-52-34.8494W 41-50-06.6799N 073-52-33.5622W +RWY N69 06/24 358 3315 50 41-34-25.7800N 073-44-12.2300W 41-34-48.4100N 073-43-40.7000W +RWY 4B6 02/20 274 4041 60 43-52-18.2337N 073-24-48.4682W 43-52-58.1043N 073-24-46.1090W +RWY 5B7 18/36 440 2670 50 42-41-42.3800N 073-34-53.7319W 42-41-17.4253N 073-34-42.1357W +RWY FOK 01/19 66 5001 150 40-50-05.6891N 072-38-13.1014W 40-50-55.0546N 072-38-15.9436W +RWY FOK 06/24 66 9001 150 40-50-10.4696N 072-38-20.4395W 40-51-16.0334N 072-37-01.3012W +RWY FOK 15/33 66 5003 150 40-50-49.8193N 072-38-22.7072W 40-50-16.4144N 072-37-34.7218W +RWY HPN 11/29 439 4451 150 41-04-01.3869N 073-42-56.7374W 41-03-51.9409N 073-41-59.9931W +RWY HPN 16/34 439 6549 150 41-04-31.9924N 073-42-47.9011W 41-03-36.0022N 073-42-05.0481W +RWY N82 05/23 548 3591 60 41-35-37.3021N 074-27-49.2168W 41-36-06.0934N 074-27-21.5922W +RWY N82 09/27 548 1101 110 41-35-53.7290N 074-27-32.1123W 41-35-56.0403N 074-27-17.9580W +RWY N82 14/32 548 2092 120 41-35-53.1051N 074-27-33.5722W 41-35-40.4358N 074-27-11.8184W +RWY N82 18/36 548 1250 150 41-35-50.6960N 074-27-31.6004W 41-35-38.3962N 074-27-30.1013W +RWY BID 10/28 108 2502 100 41-10-03.8872N 071-34-56.4903W 41-10-06.5646N 071-34-23.9680W +RWY UUU 04/22 172 2999 75 41-31-39.2985N 071-16-58.9974W 41-32-06.4015N 071-16-43.0766W +RWY UUU 16/34 172 2623 75 41-32-11.7013N 071-17-06.6887W 41-31-50.8585N 071-16-46.1928W +RWY OQU 05/23 18 4000 75 41-35-18.9393N 071-24-47.4694W 41-35-51.5188N 071-24-17.6735W +RWY OQU 16/34 18 7504 150 41-36-27.8143N 071-25-18.0112W 41-35-27.0825N 071-24-21.3713W +RWY SFZ 05/23 441 5000 100 41-54-59.8847N 071-29-44.9665W 41-55-41.7462N 071-29-09.8510W +RWY SFZ 15/33 441 3211 75 41-55-17.2020N 071-29-45.4356W 41-54-53.0785N 071-29-17.8568W +RWY PVD 05/23 55 7166 150 41-42-49.7723N 071-26-05.8486W 41-43-49.6961N 071-25-15.5354W +RWY PVD 16/34 55 6081 150 41-43-53.9542N 071-25-55.8304W 41-43-06.8846N 071-25-05.9925W +RWY WST 07/25 81 4010 100 41-20-44.1520N 071-48-38.1230W 41-21-07.8750N 071-47-56.0210W +RWY WST 14/32 81 3960 75 41-21-13.9750N 071-48-27.3280W 41-20-48.7800N 071-47-47.6100W +RWY 08R 11/29 130 2129 30 41-29-23.6949N 071-37-28.1457W 41-29-20.7366N 071-37-00.4473W +RWY MPV 05/23 1166 3000 75 44-12-17.4985N 072-33-47.5999W 44-12-42.5200N 072-33-25.5400W +RWY MPV 17/35 1166 5002 100 44-12-23.8349N 072-34-04.0190W 44-11-40.3611N 072-33-31.4575W +RWY DDH 13/31 827 3704 75 42-53-37.0145N 073-15-07.7591W 42-53-19.6245N 073-14-23.9887W +RWY BTV 01/19 335 4112 75 44-27-49.7731N 073-09-03.6107W 44-28-29.9208N 073-09-12.0675W +RWY BTV 15/33 335 8319 150 44-28-50.4280N 073-09-57.1631W 44-27-56.7294N 073-08-30.3457W +RWY FSO 01/19 228 3000 60 44-56-10.4465N 073-05-47.0472W 44-56-39.5708N 073-05-54.6689W +RWY 5B1 14/32 1194 2650 120 44-47-31.1354N 071-49-50.3996W 44-47-16.6766N 071-49-19.7627W +RWY CDA 02/20 1188 3302 60 44-33-52.6903N 072-01-08.0626W 44-34-24.9386N 072-01-01.3605W +RWY 6B0 01/19 490 2500 50 43-58-55.5500N 073-05-43.1500W 43-59-20.2300N 073-05-44.4300W +RWY MVL 01/19 733 3700 75 44-31-45.4166N 072-36-49.6420W 44-32-21.9384N 072-36-51.0982W +RWY EFK 05/23 934 3996 100 44-53-04.9734N 072-14-05.4980W 44-53-39.3050N 072-13-38.1514W +RWY EFK 18/36 934 5000 100 44-53-35.6402N 072-13-47.9147W 44-52-49.3837N 072-13-23.6366W +RWY 2B9 05/23 696 2300 80 43-52-51.8998N 072-15-16.0780W 43-53-10.8927N 072-14-58.8394W +RWY RUT 01/19 787 5003 100 43-31-29.6175N 072-56-58.2106W 43-32-19.0110N 072-56-59.9556W +RWY RUT 13/31 787 3170 75 43-31-44.8253N 072-57-16.8998W 43-31-29.8200N 072-56-39.1454W +RWY VT8 01/19 325 3077 60 44-21-22.1000N 073-13-31.5700W 44-21-52.0800N 073-13-38.4700W +RWY VSF 05/23 578 5501 100 43-20-20.1039N 072-31-16.5741W 43-21-04.7987N 072-30-34.2521W +RWY VSF 11/29 578 3000 75 43-20-30.2285N 072-31-34.8224W 43-20-25.7817N 072-30-54.6864W +RWY 0B7 04/22 1470 2575 30 44-06-51.7113N 072-49-46.2555W 44-07-13.5078N 072-49-28.0583W +RWY 4V8 01/19 1953 2650 75 42-55-24.8250N 072-51-53.2750W 42-55-50.6150N 072-51-59.3800W +ILS 23 ILS IMMU 110.30 40-47-32.376N 074-25-11.961W 40-48-13.206N 074-24-28.622W 179 6.00 216.00 3.00 +ILS 23 ILS/DME IFMH 109.55 41-38-52.551N 070-31-56.668W 41-39-57.057N 070-30-55.811W 122 4.43 218.82 3.00 +ILS 16 LOC/DME IBVY 110.50 42-34-49.697N 070-54-33.073W - - 91 6.00 140.74 - +ILS 22L ILS/DME ILSQ 108.70 40-40-28.953N 074-10-33.865W 40-41-43.673N 074-09-41.737W 7 4.27 205.74 3.00 +ILS 11 ILS/DME IGPR 109.15 40-42-09.294N 074-10-04.985W 40-42-10.837N 074-10-35.030W 10 5.00 94.00 3.00 +ILS 31R ILS/DME IRTH 111.50 40-39-30.778N 073-47-31.088W 40-38-50.324N 073-45-51.024W 10 4.20 300.87 3.00 +ILS 22R ILS/DME IJNN 110.75 40-40-22.392N 074-10-51.726W 40-41-47.559N 074-09-53.883W 8 3.79 205.73 3.10 +ILS 05 ILS IMSS 108.70 44-56-44.030N 074-50-10.100W 44-55-59.020N 074-50-55.007W 201 6.00 31.14 3.00 +ILS 26 LOC/DME IEIF 108.30 42-25-24.329N 073-18-12.344W - - 1207 5.94 244.17 - +ILS 33 ILS/DME IVOE 110.30 44-28-56.256N 073-10-06.606W 44-28-08.824N 073-08-43.042W 334 5.98 310.91 3.20 +ILS 04 ILS ILGA 110.50 40-47-15.861N 073-52-07.568W 40-46-19.527N 073-52-57.966W 11 5.03 32.04 3.10 +ILS 15R ILS/DME IMDC 110.70 42-21-26.359N 070-59-37.052W 42-22-14.695N 071-00-42.421W 11 4.95 133.39 3.00 +ILS 22 LOC/DME IOTI 108.50 41-31-33.392N 071-17-02.472W - - 153 6.00 203.74 - +ILS 35 ILS/DME IMHT 109.10 42-56-43.521N 071-26-30.231W 42-55-26.665N 071-25-39.817W 248 4.07 336.59 3.00 +ILS 06 ILS/DME IBDR 110.70 41-09-55.581N 073-07-09.954W 41-09-30.188N 073-07-43.097W 4 5.00 47.00 3.00 +ILS 19 ILS/DME IALB 109.50 42-44-03.937N 073-48-14.869W 42-45-27.446N 073-48-13.080W 273 4.22 178.17 3.00 +ILS 05 ILS/DME IGON 111.30 41-20-16.590N 072-02-11.290W 41-19-35.205N 072-02-44.231W 4 6.00 33.91 3.00 +ILS 16 ILS IPGQ 110.10 43-03-43.949N 070-48-37.478W 43-05-12.083N 070-49-53.581W 98 3.47 149.17 3.00 +ILS 27 ILS/DME IDGU 111.30 42-21-18.475N 071-00-59.049W 42-21-31.295N 070-59-28.355W 12 5.03 256.52 3.00 +ILS 14 ILS IASH 109.70 42-46-37.156N 071-30-09.445W 42-47-08.603N 071-31-12.833W 196 6.00 122.80 3.00 +ILS 05 LOC/DME IVSF 111.30 43-20-56.840N 072-30-36.777W - - 553 6.00 36.39 - +ILS 24 ILS/DME IMYQ 111.10 41-55-47.664N 072-41-57.628W 41-56-53.576N 072-40-25.963W 157 3.79 224.27 3.00 +ILS 22L ILS/DME IIWY 110.90 40-37-27.509N 073-46-16.388W 40-38-32.953N 073-45-19.990W 13 4.52 210.67 3.00 +ILS 03 ILS IMGJ 111.70 41-31-08.306N 074-15-49.600W 41-30-29.296N 074-16-09.090W 351 6.00 15.42 3.00 +ILS 24 ILS/DME IMVY 108.70 41-23-04.360N 070-37-18.220W 41-23-47.590N 070-36-34.210W 57 6.00 220.49 3.00 +ILS 13 ILS/DME IGDI 108.50 40-46-17.391N 073-51-21.276W 40-46-53.038N 073-52-30.836W 10 5.42 122.24 3.10 +ILS 31L ILS IMOH 111.35 40-38-59.645N 073-49-12.422W 40-37-59.870N 073-47-09.421W 9 3.27 300.84 3.00 +ILS 22R ILS/DME IJOC 109.50 40-37-44.498N 073-46-43.090W 40-38-21.280N 073-46-13.909W 9 5.50 208.41 3.00 +ILS 22L ILS/DME ILQN 110.30 42-21-00.041N 071-00-44.284W 42-22-17.003N 071-00-11.988W 11 3.86 199.67 3.00 +ILS 20 ILS IBAF 111.90 42-08-34.519N 072-43-09.825W 42-10-01.796N 072-42-52.053W 264 4.06 190.18 3.00 +ILS 23 ILS/DME IARJ 109.30 41-42-41.020N 071-26-13.190W 41-43-39.660N 071-25-17.420W 45 4.88 212.07 3.00 +ILS 06 ILS IWRI 110.10 40-01-36.661N 074-34-03.327W 40-00-21.935N 074-35-35.728W 120 3.43 45.66 3.00 +ILS 24 ILS/DME IACK 109.10 41-14-45.857N 070-04-25.248W 41-15-23.778N 070-03-27.578W 46 5.93 224.90 3.00 +ILS 24 ILS/DME IHYA 109.15 41-39-50.587N 070-17-01.086W 41-40-19.244N 070-16-10.645W 38 6.00 229.70 3.00 +ILS 01 ILS/DME IDEJ 109.50 42-45-47.687N 073-48-19.389W 42-44-24.904N 073-48-10.432W 279 4.22 358.18 3.00 +ILS 16 ILS/DME IOQU 109.50 41-35-22.410N 071-24-17.020W 41-36-20.435N 071-25-06.312W 6 4.96 145.11 3.00 +ILS 31 LOC/DME IPZV 108.50 40-46-45.554N 073-52-13.516W - - 22 6.00 304.00 - +ILS 14 LOC/DME IBLM 109.75 40-10-48.578N 074-06-54.305W - - 159 5.60 132.48 - +ILS 07 LOC/DME IRLS 108.90 41-21-11.454N 071-47-49.663W - - 77 6.00 53.11 - +ILS 06 ILS IMJE 109.95 42-56-42.363N 071-25-41.347W 42-55-53.652N 071-26-46.588W 219 5.10 42.33 3.00 +ILS 33 ILS/DME IIKX 108.55 41-56-40.160N 072-41-46.010W 41-55-54.769N 072-40-38.593W 167 5.05 314.48 3.00 +ILS 35 ILS ICON 108.70 43-12-32.145N 071-30-29.323W 43-11-42.136N 071-30-02.646W 331 6.00 335.13 3.00 +ILS 02 LDA IHFD 109.70 41-43-57.844N 072-39-05.144W - - 11 6.00 347.00 - +ILS 13L ILS/DME ITLK 111.50 40-38-30.687N 073-45-18.566W 40-39-14.757N 073-47-04.857W 10 3.90 120.86 3.00 +ILS 04L ILS/DME IEWR 110.75 40-42-18.192N 074-09-38.112W 40-41-02.167N 074-10-22.759W 7 4.23 25.74 3.10 +ILS 04R ILS/DME IEZA 108.70 40-42-15.943N 074-09-25.835W 40-40-57.598N 074-10-09.878W 6 4.15 25.74 2.95 +ILS 34 ILS/DME IUNQ 111.50 41-43-56.351N 071-25-58.363W 41-43-14.630N 071-25-11.670W 37 6.00 321.68 3.00 +ILS 08 ILS/DME ILCI 108.50 43-34-37.194N 071-24-16.835W 43-34-18.560N 071-25-31.286W 537 5.96 67.47 3.00 +ILS 04 ILS ILEW 108.90 44-03-19.736N 070-16-47.048W 44-02-39.687N 070-17-07.186W 265 6.00 24.31 3.00 +ILS 15 ILS/DME IBCU 108.95 41-39-41.954N 070-16-37.566W 41-40-23.433N 070-17-18.485W 49 6.00 139.89 3.10 +ILS 01 ILS IGFL 110.70 43-21-09.261N 073-36-33.534W 43-20-17.952N 073-36-36.665W 320 6.00 358.43 3.00 +ILS 08 LOC/DME IDXR 111.55 41-22-13.413N 073-28-52.831W - - 466 6.00 73.00 - +ILS 34 ILS IPSM 110.10 43-05-40.413N 070-50-12.666W 43-04-00.512N 070-48-59.037W 78 3.16 329.15 3.00 +ILS 11 ILS/DME IRSR 110.90 42-15-57.558N 071-51-50.032W 42-15-58.379N 071-53-15.888W 976 5.48 93.85 3.00 +ILS 24 ILS/DME IFOK 111.70 40-50-01.496N 072-38-31.268W 40-51-02.570N 072-37-09.171W 43 3.87 222.39 3.00 +ILS 06 ILS ITEB 108.90 40-51-29.818N 074-03-11.862W 40-50-57.831N 074-04-06.543W 4 5.00 48.06 3.00 +ILS 07 ILS ISFM 111.50 43-23-48.331N 070-41-50.214W 43-23-15.079N 070-42-55.862W 235 5.71 58.28 3.00 +ILS 14 ILS IFRG 111.90 40-43-16.324N 073-24-08.233W 40-43-54.773N 073-24-57.727W 74 6.00 132.34 3.00 +ILS 35 LOC/DME IOWD 108.30 42-11-45.287N 071-10-45.168W - - 61 6.00 334.86 - +ILS 24 LOC/GS IJTQ 110.10 40-00-07.131N 074-36-02.919W 40-01-14.354N 074-34-23.732W 99 3.55 226.75 3.00 +ILS 05 ILS ILWM 111.70 42-43-29.869N 071-06-50.081W 42-42-44.624N 071-07-32.682W 136 6.00 38.06 3.00 +ILS 23 ILS ISLK 108.90 44-22-42.263N 074-12-54.093W 44-23-34.774N 074-12-08.065W 1657 5.44 214.80 3.20 +ILS 09 ILS ISWF 110.10 41-30-27.398N 074-05-12.295W 41-30-13.362N 074-07-09.214W 470 3.91 78.34 3.00 +ILS 18 ILS/DME IDVR 111.90 43-36-58.274N 072-18-18.269W 43-37-37.942N 072-18-19.632W 555 6.00 171.00 3.10 +ILS 04L ILS/DME IHIQ 110.90 40-39-06.966N 073-45-43.947W 40-37-31.083N 073-46-54.912W 9 3.28 30.68 3.00 +ILS 04R ILS/DME IJFK 109.50 40-38-51.570N 073-45-10.684W 40-37-42.101N 073-46-11.054W 12 4.25 30.68 3.00 +ILS 24 ILS IRXN 108.30 40-47-15.266N 073-06-49.836W 40-48-02.176N 073-05-52.724W 91 5.31 224.88 3.00 +ILS 22X LDA/DME ITKD 111.15 40-46-06.998N 073-53-07.630W - - 40 5.00 222.00 - +ILS 27 ILS/DME IJKH 109.95 41-30-01.819N 074-07-57.726W 41-30-16.951N 074-05-56.694W 462 3.85 258.33 3.00 +ILS 04R ILS/DME IBOS 110.30 42-22-55.974N 070-59-48.188W 42-21-21.823N 071-00-24.548W 10 3.67 19.68 3.00 +ILS 19 ILS/DME ITJL 110.15 40-50-13.363N 074-03-37.774W 40-51-10.168N 074-03-30.148W 4 6.00 183.20 3.00 +ILS 23 ILS ICEF 109.90 42-10-30.293N 072-33-00.658W 42-12-02.019N 072-31-27.214W 234 3.17 214.09 3.00 +ILS 29 ILS/DME IEKW 110.90 42-16-02.784N 071-53-34.864W 42-16-00.966N 071-52-06.759W 987 5.27 273.86 3.00 +ILS 35 ILS/DME IFQV 109.70 44-40-06.610N 073-28-41.994W 44-38-17.154N 073-27-44.358W 157 3.00 337.54 3.00 +ILS 11 ILS/DME IPWM 109.90 43-38-37.591N 070-17-42.653W 43-38-40.081N 070-19-19.844W 68 4.88 95.33 3.00 +ILS 06 ILS IHWV 108.95 40-49-55.503N 072-51-32.834W 40-49-22.133N 072-52-11.702W 67 6.00 44.89 3.00 +ILS 17 ILS IPBG 109.70 44-37-58.464N 073-27-27.535W 44-39-48.133N 073-28-23.766W 223 5.00 157.55 3.00 +ILS 34 ILS/DME IOJZ 109.70 41-04-36.959N 073-42-51.718W 41-03-44.112N 073-42-15.776W 374 5.61 330.00 3.00 +ILS 36 ILS/DME IOXC 109.55 41-29-16.406N 073-08-14.131W 41-28-26.440N 073-08-06.995W 690 6.00 350.82 3.00 +ILS 07 ILS/DME IVQO 111.10 42-04-32.124N 070-12-47.713W 42-04-12.687N 070-13-23.882W 7 6.00 59.22 3.00 +ILS 29 ILS/DME IGCS 109.90 43-38-46.015N 070-19-47.591W 43-38-42.166N 070-18-07.856W 42 4.88 275.32 3.00 +ILS 05 LOC/DME ISFZ 111.90 41-55-44.365N 071-29-07.649W - - 414 6.00 31.98 - +ILS 19 ILS/DME IRUT 111.70 43-31-25.070N 072-56-58.047W 43-32-10.237N 072-57-01.341W 777 6.00 178.53 3.20 +ILS 15 ILS IMSV 109.10 41-41-38.687N 074-47-14.613W 41-42-20.443N 074-48-01.647W 1401 6.00 143.05 3.00 +ILS 11 ILS/DME IBED 111.15 42-28-07.917N 071-16-06.248W 42-28-21.195N 071-17-46.814W 127 4.62 97.16 3.00 +ILS 33L ILS/DME ILIP 110.70 42-22-37.562N 071-01-18.090W 42-21-26.645N 070-59-34.713W 11 3.48 315.26 3.00 +ILS 05 ILS IGWJ 109.90 42-12-23.018N 072-31-17.661W 42-11-00.113N 072-32-39.849W 230 3.14 34.10 3.00 +ILS 15 ILS/DME IBTV 110.30 44-27-52.767N 073-08-23.954W 44-28-42.343N 073-09-51.471W 308 4.50 130.93 3.00 +ILS 27 LOC/DME IIJD 108.35 41-44-36.037N 072-11-07.754W - - 252 6.00 254.38 - +ILS 22 ILS IURD 110.50 40-46-05.930N 073-53-05.361W 40-46-57.749N 073-52-18.701W 9 5.44 212.03 3.00 +ILS 04 ILS ISCH 109.70 42-51-59.625N 073-55-14.751W 42-50-58.785N 073-56-00.667W 325 5.02 25.91 3.00 +ILS 02 ILS/DME IHVN 109.10 41-16-26.290N 072-53-13.320W 41-15-31.816N 072-53-20.432W 2 6.00 2.91 3.00 +ILS 17 ILS/DME IMNA 109.10 42-54-57.425N 071-25-27.527W 42-56-20.859N 071-26-13.020W 220 4.04 156.61 3.10 +ILS 22 LOCALIZER ICDW 109.35 40-52-00.797N 074-17-13.162W - - 174 6.00 209.51 - +ILS 29 ILS/DME IULJ 111.15 42-28-19.801N 071-18-14.561W 42-28-14.328N 071-16-40.608W 120 5.00 277.16 3.00 +ILS 17 ILS/DME IMPV 108.70 44-11-39.128N 072-33-30.534W 44-12-18.724N 072-33-55.823W 1103 6.00 151.77 3.00 +ILS 06 ILS IPOU 111.30 41-37-55.910N 073-52-30.802W 41-37-26.683N 073-53-22.675W 149 6.00 50.67 3.00 +ILS 32 ILS/DME IBNX 110.75 41-40-11.807N 070-32-33.532W 41-39-15.342N 070-30-44.080W 109 3.65 307.53 3.00 +ILS 06 ILS/DME IBDL 111.10 41-57-17.850N 072-39-59.405W 41-56-05.542N 072-41-41.893W 169 3.43 44.28 3.00 +ILS 02 ILS IEEN 108.90 42-54-22.455N 072-16-09.898W 42-53-23.656N 072-16-10.242W 476 5.81 3.23 3.00 +ILS 06 ILS ITTN 111.30 40-16-56.131N 074-48-15.784W 40-16-19.713N 074-49-10.955W 167 6.00 46.37 3.00 +ILS 16 ILS/DME IHPN 109.70 41-03-27.452N 073-41-58.501W 41-04-22.243N 073-42-34.555W 422 5.31 150.01 3.00 +ILS 05 ILS/DME IEWB 109.70 41-41-03.158N 070-57-04.518W 41-40-21.941N 070-57-42.861W 61 6.00 38.34 3.00 +ILS 05 ILS/DME IPVD 109.30 41-43-57.102N 071-25-09.327W 41-42-56.206N 071-25-53.979W 49 4.98 32.07 3.00 +ILS 06 ILS/DME IRNE 109.10 41-15-41.152N 070-03-11.948W 41-14-57.461N 070-04-04.611W 32 5.80 44.90 3.00 +ILS 06 ILS/DME IPYM 109.35 41-54-56.751N 070-43-25.572W 41-54-20.555N 070-44-00.460W 133 6.00 39.46 3.00 +ILS 06 ILS/DME IISP 108.30 40-48-15.313N 073-05-30.846W 40-47-28.730N 073-06-39.490W 88 4.98 44.89 3.00 +NAV BDR VOR/DME 41-09-38.495N 073-07-28.188W 9 108.80 25X +NAV GON VOR/DME 41-19-49.448N 072-03-07.141W 9 110.85 45Y +NAV HFD VOR/DME 41-38-27.977N 072-32-50.705W 849 114.90 096X +NAV MAD VOR/DME 41-18-49.811N 072-41-31.893W 220 110.40 041X +NAV HVN VOR/DME 41-15-44.314N 072-53-06.659W 6 109.80 035X +NAV ORW VOR/DME 41-33-23.053N 071-59-57.672W 310 110.00 037X +NAV JWE NDB 41-22-56.581N 073-06-44.983W 571 362 - +NAV PUT VOR/DME 41-57-19.657N 071-50-38.741W 652 117.40 121X +NAV BDL VORTAC 41-56-27.638N 072-41-18.881W 160 109.00 027X +NAV SKR NDB 42-27-20.617N 071-10-42.714W 341 251 - +NAV BOS VOR/DME 42-21-26.820N 070-59-22.374W 28 112.70 074X +NAV LQ NDB 42-27-07.347N 070-57-47.878W 15 382 - +NAV CTR VOR/DME 42-17-28.747N 072-56-57.819W 1600 115.10 098X +NAV FM NDB 41-43-56.185N 070-26-29.005W 75 362 - +NAV FMH TACAN 41-39-34.577N 070-30-50.208W 116 115.80 105X +NAV FIT NDB 42-33-03.313N 071-45-25.718W 350 365 - +NAV GDM VOR/DME 42-32-45.315N 072-03-29.478W 1280 110.60 43X +NAV GBR NDB 42-10-58.722N 073-24-14.509W 726 395 - +NAV LWM VOR/DME 42-44-25.496N 071-05-41.550W 306 112.50 072X +NAV IHM NDB 42-00-09.994N 071-11-49.581W 165 220 - +NAV IMR NDB 42-05-52.822N 070-40-32.866W 3 368 - +NAV ACK VOR/DME 41-16-54.794N 070-01-36.157W 99 116.20 109X +NAV LFV VOR/DME 42-01-01.876N 070-02-14.037W 151 114.70 094X +NAV ORE NDB 42-34-07.003N 072-17-10.088W 545 205 - +NAV PVC NDB 42-04-07.740N 070-13-24.396W 9 389 - +NAV CEF VORTAC 42-11-51.160N 072-31-34.730W 241 114.00 87X +NAV TAN NDB 41-52-31.723N 071-00-58.203W 29 227 - +NAV MVY VOR/DME 41-23-46.352N 070-36-45.774W 62 114.50 092X +NAV BAF VORTAC 42-09-43.053N 072-42-58.318W 266 113.00 077X +NAV SZO NDB 43-54-14.557N 070-46-56.393W 953 227 - +NAV ENE VOR/DME 43-25-32.420N 070-36-48.692W 192 117.10 118X +NAV PH NDB 43-31-37.311N 070-05-29.163W 0 301 - +NAV RQM NDB 44-56-04.546N 070-45-04.315W 1593 221 - +NAV BML VOR/DME 44-38-00.259N 071-11-10.045W 1731 110.40 041X +NAV CNH NDB 43-22-09.055N 072-22-16.259W 527 233 - +NAV CON VOR/DME 43-13-11.233N 071-34-31.631W 715 112.90 076X +NAV CO NDB 43-07-07.597N 071-27-08.746W 355 216 - +NAV EEN VORTAC 42-47-39.400N 072-17-30.400W 1380 109.40 031X +NAV LC NDB 43-32-11.930N 071-32-13.310W 740 328 - +NAV LAH NDB 43-42-08.150N 072-10-38.865W 1190 276 - +NAV LEB VOR/DME 43-40-43.883N 072-12-57.865W 1443 113.70 084X +NAV IVV NDB 43-33-36.493N 072-27-56.403W 1162 379 - +NAV MHT VOR/DME 42-52-06.708N 071-22-10.324W 470 114.40 091X +NAV AS NDB 42-49-24.191N 071-36-07.964W 217 359 - +NAV PSM VOR/DME 43-05-04.065N 070-49-55.152W 99 116.50 112X +NAV ESG NDB 43-13-12.978N 070-49-41.914W 77 260 - +NAV GMA NDB 44-21-44.437N 071-41-09.260W 1425 386 - +NAV CAT NDB 40-44-26.810N 074-25-47.593W 250 254 - +NAV COL VOR/DME 40-18-41.877N 074-09-35.018W 129 115.40 101X +NAV NEL NDB 40-02-41.496N 074-20-07.722W 76 396 - +NAV NEL TACAN 40-02-13.096N 074-21-11.317W 87 111.80 055X +NAV RBV VORTAC 40-12-08.648N 074-29-42.094W 248 113.80 085X +NAV BWZ VOR/DME 40-47-54.358N 074-49-18.597W 1050 114.20 089X +NAV SBJ VOR/DME 40-34-58.963N 074-44-30.458W 189 112.90 076X +NAV SAX VORTAC 41-04-03.157N 074-32-17.926W 1400 115.70 104X +NAV STW VOR/DME 40-59-44.951N 074-52-08.509W 920 109.60 033X +NAV TE NDB 40-48-15.956N 074-07-56.950W 16 214 - +NAV TEB VOR/DME 40-50-55.394N 074-03-44.074W 2 108.40 021X +NAV GXU VORTAC 40-00-34.110N 074-35-47.440W 118 110.60 043X +NAV ALB VORTAC 42-44-50.210N 073-48-11.467W 272 115.30 100X +NAV BBN NDB 40-40-21.070N 073-23-03.796W 0 275 - +NAV CCC VOR/DME 40-55-46.625N 072-47-55.893W 85 117.20 119X +NAV CAM VOR/DME 42-59-39.440N 073-20-38.468W 1490 115.00 097X +NAV CRI VOR/DME 40-36-44.900N 073-53-40.000W 10 112.30 070X +NAV CMK VOR/DME 41-16-48.321N 073-34-52.773W 694 116.60 113X +NAV DPK VOR/DME 40-47-30.299N 073-18-13.168W 123 117.70 124X +NAV DNY VOR/DME 42-10-41.810N 074-57-24.986W 2560 112.10 058X +NAV HTO VORTAC 40-55-08.385N 072-19-00.136W 22 113.60 083X +NAV GFL VORTAC 43-20-30.094N 073-36-42.323W 324 110.20 039X +NAV PFH NDB 42-15-11.193N 073-43-24.286W 340 272 - +NAV HUO VOR/DME 41-24-34.872N 074-35-29.739W 1300 116.10 108X +NAV JJH NDB 42-59-57.915N 074-19-53.152W 867 523 - +NAV IGN VOR/DME 41-39-55.619N 073-49-20.008W 582 117.60 123X +NAV MSS VORTAC 44-54-51.918N 074-43-21.785W 198 114.10 088X +NAV MS NDB 41-46-00.005N 074-51-38.564W 1387 359 - +NAV OGY NDB 40-34-05.279N 073-52-58.689W 10 414 - +NAV JFK VOR/DME 40-37-58.400N 073-46-17.000W 11 115.90 106X +NAV LGA VOR/DME 40-47-01.376N 073-52-06.962W 9 113.10 078X +NAV SW NDB 41-29-08.950N 074-13-40.497W 405 335 - +NAV SKU NDB 41-31-40.837N 074-02-41.909W 520 261 - +NAV OP NDB 40-58-37.353N 073-07-06.388W 0 316 - +NAV PLB VORTAC 44-41-05.800N 073-31-21.623W 343 116.90 116X +NAV PTD NDB 44-43-24.203N 074-52-57.704W 360 400 - +NAV PO NDB 41-34-30.463N 073-57-53.473W 9 403 - +NAV PWL VOR/DME 41-46-11.177N 073-36-01.985W 1250 114.30 090X +NAV SLK NDB 44-28-36.628N 074-07-26.504W 1677 395 - +NAV SLK VOR/DME 44-23-04.414N 074-12-16.207W 1647 109.20 029X +NAV HEU NDB 42-51-15.053N 073-56-00.556W 333 356 - +NAV FOK TACAN 40-50-15.977N 072-37-54.635W 50 111.00 047X +NAV ARD VOR/DME 40-15-12.033N 074-54-27.405W 294 108.20 019X +NAV SEY VOR/DME 41-10-02.768N 071-34-33.908W 100 117.80 125X +NAV PVD VOR/DME 41-43-27.639N 071-25-46.699W 49 115.60 103X +NAV MPV VOR/DME 44-05-07.738N 072-26-57.756W 2080 110.80 045X +NAV BJA TACAN 44-28-36.960N 073-09-24.350W 308 112.40 71X +NAV BTV VOR/DME 44-23-49.578N 073-10-57.485W 416 117.50 122X +NAV LLX NDB 44-30-14.794N 072-01-45.308W 1020 353 - +NAV RUT VOR/DME 43-31-35.805N 072-57-02.464W 782 111.00 47X +NAV DYO NDB 43-42-22.131N 072-57-23.766W 1138 221 - +NAV SXD NDB 43-16-11.869N 072-35-10.630W 870 265 - +NAV VWD NDB 42-55-39.288N 072-51-50.352W 1920 224 - diff -Nru acm-5.0/objects/zones/usa/sfrancisco.txt acm-6.0+20200416/objects/zones/usa/sfrancisco.txt --- acm-5.0/objects/zones/usa/sfrancisco.txt 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/objects/zones/usa/sfrancisco.txt 2020-04-16 12:05:39.000000000 +0000 @@ -0,0 +1,245 @@ +# S. Francisco area scenery. +# Created: 2020-04-16 +# Latitude range: [35N, 40N[ +# Longitude range: [125W, 120W[ +# 2017-10-04 Checked against https://nfdc.faa.gov/xwiki/bin/view/NFDC/56DaySub-2017-03-02 +# "56 Day NASR Subscription - Effective March 2, 2017". + +# ?????: +TEAM1_LOC 35N 125W 000 031 +# ?????: +TEAM1_LOC 35N 125W 000 031 +GROUND_COLOR #305030 +RWY 2O3 16/34 1875 3217 50 38-35-03.9300N 122-26-09.7400W 38-34-32.2700N 122-26-05.7300W +RWY AUN 07/25 1539 3700 75 38-57-15.4684N 121-05-17.5148W 38-57-19.2296N 121-04-30.9279W +RWY O02 08/26 4900 4651 75 39-49-06.7267N 120-21-39.9240W 39-49-06.6172N 120-20-40.3284W +RWY D83 13/31 379 2838 50 39-01-01.3527N 123-23-04.5495W 39-00-39.1074N 123-22-42.6338W +RWY 2CL1 06/24 2120 2326 20 39-27-16.5535N 121-17-44.4269W 39-27-20.9491N 121-17-15.3230W +RWY C83 05/23 79 3000 75 37-49-20.3509N 121-37-48.4195W 37-49-33.7316N 121-37-15.0582W +RWY C83 12/30 79 4500 100 37-50-08.4954N 121-37-53.5205W 37-49-36.8929N 121-37-14.0485W +RWY O61 13/31 1287 4051 50 38-41-18.5051N 120-59-30.1488W 38-40-46.1900N 120-58-59.9894W +RWY CIC 13L/31R 240 6724 150 39-48-12.1750N 121-51-50.8290W 39-47-16.1780N 121-51-04.4520W +RWY CIC 13R/31L 240 3000 60 39-47-54.1962N 121-51-46.5686W 39-47-29.2063N 121-51-25.8867W +RWY CA11 15/33 5909 1032 40 39-59-54.8700N 120-13-02.5300W 39-59-45.0700N 120-12-58.8400W +RWY CL56 14/32 173 2156 30 39-43-19.8456N 121-52-19.7678W 39-43-00.7074N 121-52-07.6391W +RWY 2O6 12/30 243 3253 60 37-06-59.1965N 120-15-03.3923W 37-06-36.4847N 120-14-34.9558W +RWY CN13 09/27 12 2260 90 38-26-38.8398N 121-30-45.5759W 38-26-32.6349N 121-30-18.2885W +RWY O60 14/32 276 2909 60 38-46-47.3350N 122-59-41.8530W 38-46-21.7967N 122-59-24.9654W +RWY 3O8 14/32 470 2820 30 36-15-05.8000N 120-14-25.7400W 36-14-40.5200N 120-14-11.1800W +RWY C80 01/19 625 2471 60 36-09-23.6880N 120-17-51.7437W 36-09-47.6108N 120-17-45.6259W +RWY C80 12/30 625 5000 100 36-10-03.7300N 120-18-00.8405W 36-09-31.4749N 120-17-14.6340W +RWY O22 11/29 2121 2607 50 38-01-58.8649N 120-25-13.8617W 38-01-41.0903N 120-24-50.2743W +RWY O22 17/35 2121 4673 75 38-02-12.0276N 120-24-41.8439W 38-01-26.5676N 120-24-52.1590W +RWY O08 13/31 50 3035 60 39-10-57.5045N 121-59-45.3908W 39-10-31.2992N 121-59-26.6340W +RWY CCR 01L/19R 26 5001 150 37-58-55.0261N 122-03-40.7820W 37-59-40.3546N 122-03-15.8504W +RWY CCR 01R/19L 26 2770 75 37-59-01.9609N 122-03-30.1664W 37-59-27.0673N 122-03-16.3488W +RWY CCR 14L/32R 26 4602 150 37-59-47.4460N 122-03-31.8793W 37-59-06.7230N 122-03-06.2645W +RWY CCR 14R/32L 26 2799 75 37-59-45.2356N 122-03-37.4729W 37-59-20.4670N 122-03-21.8795W +RWY 0O4 17/35 296 2699 60 39-56-59.3248N 122-10-16.0258W 39-56-32.6529N 122-10-16.0132W +RWY O09 10/28 1434 3670 60 39-47-32.7300N 123-16-20.5800W 39-47-18.8800N 123-15-37.1200W +RWY DWA 16/34 100 6000 100 38-35-15.4205N 121-51-24.7450W 38-34-16.1107N 121-51-25.2738W +RWY EDU 17/35 69 3176 50 38-32-08.9500N 121-47-11.0600W 38-31-37.5550N 121-47-11.5800W +RWY 0CN1 16/34 140 2229 80 37-27-18.8600N 120-45-53.1200W 37-26-56.8200N 120-45-53.1300W +RWY BLU 15/33 5284 3300 50 39-16-45.7757N 120-42-39.6251W 39-16-13.9215N 120-42-30.6529W +RWY SUU 03L/21R 63 11001 150 38-14-35.8654N 121-57-25.1211W 38-15-49.1104N 121-55-43.1781W +RWY SUU 03R/21L 63 10995 150 38-15-41.2758N 121-55-35.4583W 38-16-54.4489N 121-53-53.5150W +RWY 74CA 09/27 1451 666 30 38-28-03.9400N 120-48-16.6700W 38-28-02.8300N 120-48-08.4200W +RWY F34 12/30 157 3102 60 36-51-47.6400N 120-28-04.4530W 36-51-24.2770N 120-27-39.7150W +RWY CN22 15/33 1170 2082 30 36-42-14.1200N 120-51-30.7800W 36-42-32.8300N 120-51-41.4700W +RWY F72 09/27 23 3031 60 38-18-09.4485N 121-26-04.5064W 38-18-02.0722N 121-25-27.6606W +RWY F72 18/36 23 3123 60 38-18-37.7757N 121-25-40.1089W 38-18-07.8454N 121-25-49.6873W +RWY E36 16/34 2623 2980 60 38-55-30.1900N 120-51-53.0600W 38-55-00.7300N 120-51-53.7100W +RWY 09CL 01/19 2280 2834 50 39-06-30.8729N 121-03-26.6455W 39-06-55.9847N 121-03-10.7122W +RWY GOO 07/25 3154 4351 75 39-13-25.5322N 121-00-38.7170W 39-13-27.5510N 120-59-43.5113W +RWY 44CL 12/30 35 2323 30 39-03-01.0800N 121-57-10.8500W 39-02-43.4700N 121-56-51.9500W +RWY E45 09/27 2933 3624 50 37-51-48.2647N 120-11-03.9653W 37-51-35.7271N 120-10-21.6363W +RWY E55 13/31 940 2500 50 38-48-15.9000N 123-31-59.5000W 38-47-55.8000N 123-31-41.1200W +RWY 3O1 18/36 79 3207 60 37-15-53.2764N 120-57-45.8990W 37-15-22.7852N 120-57-56.7840W +RWY HAF 12/30 66 5000 150 37-31-06.4216N 122-30-25.3737W 37-30-30.3128N 122-29-42.9993W +RWY HWD 10L/28R 52 3107 75 37-39-44.9116N 122-07-38.1416W 37-39-29.6167N 122-07-04.6322W +RWY HWD 10R/28L 52 5694 150 37-39-43.3603N 122-07-47.2468W 37-39-15.3360N 122-06-45.8415W +RWY HES 13/31 280 2652 60 38-39-21.1600N 122-54-04.4530W 38-38-59.4260N 122-53-45.7660W +RWY CVH 06/24 230 3150 100 36-53-22.9990N 121-24-48.2880W 36-53-32.6940N 121-24-11.4440W +RWY CVH 13/31 230 6350 100 36-54-04.8080N 121-25-04.6290W 36-53-15.4090N 121-24-16.3730W +RWY 1C9 05/23 152 2500 100 36-57-06.0175N 121-28-00.4867W 36-57-16.3563N 121-27-32.5019W +RWY JAQ 01/19 1694 3401 60 38-22-20.9021N 120-47-46.0730W 38-22-52.0710N 120-47-30.0664W +RWY KIC 11/29 374 4479 100 36-13-57.1650N 121-07-37.4748W 36-13-28.3731N 121-06-55.9374W +RWY 1O2 10/28 1380 3600 60 38-59-34.8342N 122-54-22.4987W 38-59-17.5234N 122-53-42.6688W +RWY LHM 15/33 121 6001 100 38-55-01.6673N 121-21-14.4429W 38-54-04.2960N 121-20-55.1873W +RWY LLR 11/29 574 5249 100 39-15-59.2692N 123-45-39.9144W 39-15-27.4353N 123-44-47.2230W +RWY LVK 07L/25R 400 5253 100 37-41-38.1733N 121-49-45.8457W 37-41-37.6575N 121-48-40.5005W +RWY LVK 07R/25L 400 2699 75 37-41-33.1135N 121-49-30.3197W 37-41-32.8405N 121-48-56.7405W +RWY 1O3 08/26 60 3547 40 38-12-11.2400N 121-16-33.9600W 38-12-09.7600N 121-15-49.5600W +RWY 1O3 12/30 60 1979 25 38-12-12.6000N 121-16-12.6300W 38-11-58.8600N 121-15-54.9900W +RWY 8CA8 17/35 56 3488 50 38-04-19.7200N 121-12-26.8000W 38-03-45.2500N 121-12-27.8800W +RWY LSN 14/32 121 3801 75 37-04-06.7509N 120-52-22.0680W 37-03-33.1949N 120-52-00.9647W +RWY MAE 08/26 255 3702 150 36-59-00.1470N 120-07-09.2510W 36-59-00.1330N 120-06-23.6270W +RWY MAE 12/30 255 5545 150 36-59-38.3497N 120-07-08.9732W 36-58-59.5717N 120-06-20.6676W +RWY OAR 11/29 137 3483 75 36-41-02.7937N 121-45-59.9470W 36-40-44.1889N 121-45-23.9581W +RWY MPI 08/26 2254 3306 60 37-30-41.8802N 120-02-42.5598W 37-30-36.3816N 120-02-02.1206W +RWY MYV 05/23 64 3314 60 39-05-48.4875N 121-34-26.7648W 39-06-01.4010N 121-33-48.1347W +RWY MYV 14/32 64 6007 150 39-06-17.6780N 121-34-28.5211W 39-05-23.1198N 121-33-58.4684W +RWY BAB 15/33 113 12001 300 39-09-06.1584N 121-26-36.0573W 39-07-13.7693N 121-25-47.3550W +RWY M90 15/33 162 3499 50 36-45-47.9000N 120-22-24.2800W 36-45-15.0900N 120-22-10.6300W +RWY MCE 12/30 155 5914 150 37-17-26.9527N 120-31-14.3475W 37-16-43.1646N 120-30-25.8596W +RWY MER 13/31 191 11802 150 37-23-35.1045N 120-34-51.4498W 37-22-04.3758N 120-33-19.5014W +RWY MOD 10L/28R 99 5904 150 37-37-47.0627N 120-57-36.3665W 37-37-14.3221N 120-56-35.6163W +RWY MOD 10R/28L 99 3464 100 37-37-46.4407N 120-57-50.7369W 37-37-27.2315N 120-57-15.0869W +RWY MRY 10L/28R 257 3503 60 36-35-18.8949N 121-50-40.6812W 36-35-05.4860N 121-50-01.0801W +RWY MRY 10R/28L 257 7175 150 36-35-27.1540N 121-51-21.0030W 36-34-59.7150N 121-49-59.8680W +RWY NUQ 14L/32R 37 9197 200 37-25-44.1162N 122-03-16.5762W 37-24-19.9751N 122-02-33.3448W +RWY NUQ 14R/32L 37 8122 200 37-25-30.7978N 122-03-18.1025W 37-24-16.4902N 122-02-39.9285W +RWY APC 06/24 35 5007 150 38-12-27.7506N 122-17-18.5464W 38-12-39.1008N 122-16-17.4819W +RWY APC 18L/36R 35 2510 75 38-13-06.6828N 122-16-41.8896W 38-12-43.4757N 122-16-53.0276W +RWY APC 18R/36L 35 5930 150 38-13-23.5377N 122-16-40.6654W 38-12-28.7143N 122-17-06.9774W +RWY DVO 13/31 2 3300 75 38-08-50.9500N 122-33-35.9400W 38-08-22.7600N 122-33-15.0900W +RWY O27 10/28 237 3013 75 37-45-28.2760N 120-48-18.2060W 37-45-17.3934N 120-47-43.2884W +RWY OAK 10L/28R 9 5458 150 37-43-49.6865N 122-13-19.8481W 37-43-29.3247N 122-12-16.9329W +RWY OAK 10R/28L 9 6213 150 37-43-43.3450N 122-13-33.2509W 37-43-20.1780N 122-12-21.6341W +RWY OAK 12/30 9 10520 150 37-43-12.2235N 122-14-31.6115W 37-42-05.3678N 122-12-51.3186W +RWY OAK 15/33 9 3376 75 37-44-25.0497N 122-13-22.1076W 37-43-52.9005N 122-13-10.8260W +RWY L52 11/29 14 2325 50 35-06-11.7700N 120-37-32.0600W 35-05-58.9100N 120-37-08.8600W +RWY O37 15/33 218 4500 60 39-43-34.9430N 122-08-54.0871W 39-42-51.8646N 122-08-39.7809W +RWY OVE 02/20 194 6020 100 39-28-43.8564N 121-37-54.5111W 39-29-33.7674N 121-37-12.7193W +RWY OVE 13/31 194 3540 100 39-29-42.7380N 121-37-07.9036W 39-29-14.5213N 121-36-41.2177W +RWY PAO 13/31 7 2443 70 37-27-49.5066N 122-07-03.5484W 37-27-30.5562N 122-06-44.7693W +RWY CA92 17/35 1300 3017 60 39-42-52.9377N 121-36-58.9636W 39-42-23.1354N 121-36-59.9246W +RWY PRB 01/19 839 6008 150 35-39-57.9903N 120-38-08.0778W 35-40-50.1322N 120-37-33.1655W +RWY PRB 13/31 839 4701 100 35-40-38.9547N 120-37-37.5476W 35-40-01.5151N 120-37-03.7781W +RWY CN99 12/30 65 2873 34 37-32-57.2700N 121-09-43.4500W 37-32-37.0600N 121-09-18.3700W +RWY O69 11/29 90 3602 75 38-15-38.3839N 122-36-37.5555W 38-15-17.7276N 122-36-00.7835W +RWY PVF 05/23 2585 3910 75 38-43-18.3570N 120-45-33.9880W 38-43-35.9680N 120-44-50.0630W +RWY 2O1 07/25 3419 4105 60 39-56-35.3387N 120-57-09.5064W 39-56-40.8737N 120-56-17.3100W +RWY RIU 04/22 144 3798 75 38-29-01.0681N 121-06-29.1090W 38-29-23.6323N 121-05-50.9405W +RWY L36 17/35 46 2625 42 38-40-42.9252N 121-26-42.4650W 38-40-17.0364N 121-26-44.7584W +RWY O88 07/25 23 4199 75 38-11-36.4119N 121-42-34.4045W 38-11-39.5149N 121-41-41.9495W +RWY O88 15/33 23 2199 60 38-11-42.9840N 121-42-27.1566W 38-11-22.5546N 121-42-17.7389W +RWY SMF 16L/34R 27 8605 150 38-42-25.6973N 121-34-48.2125W 38-41-00.6506N 121-34-49.6420W +RWY SMF 16R/34L 27 8598 150 38-42-26.4236N 121-36-03.8961W 38-41-01.4390N 121-36-05.3075W +RWY MHR 04L/22R 98 6038 150 38-33-10.9400N 121-18-17.9400W 38-33-46.2800N 121-17-16.6600W +RWY MHR 04R/22L 98 11301 150 38-32-40.9712N 121-18-48.6565W 38-33-47.0922N 121-16-53.9917W +RWY SAC 02/20 24 5503 150 38-30-18.7475N 121-30-02.6274W 38-31-04.3070N 121-29-24.7979W +RWY SAC 12/30 24 3837 100 38-31-06.1074N 121-29-42.2645W 38-30-40.1781N 121-29-07.0313W +RWY SAC 16/34 24 3505 150 38-30-59.2571N 121-29-38.2750W 38-30-24.6093N 121-29-37.9850W +RWY MCC 16/34 77 10599 150 38-40-55.8781N 121-24-02.0787W 38-39-11.1092N 121-24-02.2412W +RWY SNS 08/26 84 6004 150 36-39-46.4871N 121-37-06.7407W 36-39-39.4288N 121-35-53.5799W +RWY SNS 13/31 84 4825 150 36-40-06.9853N 121-36-36.0221W 36-39-26.6018N 121-36-04.4804W +RWY CPU 13/31 1328 3603 60 38-09-00.7622N 120-39-06.0834W 38-08-31.2844N 120-38-40.7859W +RWY SQL 12/30 5 2600 75 37-30-52.2250N 122-15-09.0861W 37-30-33.1302N 122-14-47.4839W +RWY SFO 01L/19R 13 7650 200 37-36-28.4323N 122-22-58.5426W 37-37-35.3329N 122-22-14.1939W +RWY SFO 01R/19L 13 8650 200 37-36-22.7876N 122-22-51.7467W 37-37-38.4319N 122-22-01.5990W +RWY SFO 10L/28R 13 11870 200 37-37-43.4594N 122-23-36.2107W 37-36-48.7210N 122-21-25.7080W +RWY SFO 10R/28L 13 11381 200 37-37-34.6480N 122-23-35.1796W 37-36-42.1630N 122-21-30.0570W +RWY RHV 13L/31R 135 3100 75 37-20-11.4493N 121-49-21.3662W 37-19-47.0107N 121-48-58.2046W +RWY RHV 13R/31L 135 3099 75 37-20-09.6541N 121-49-24.3301W 37-19-45.2266N 121-49-01.1735W +RWY SJC 12L/30R 62 11000 150 37-22-29.9737N 121-56-24.6306W 37-21-08.1263N 121-54-54.9156W +RWY SJC 12R/30L 62 11000 150 37-22-25.4201N 121-56-31.1528W 37-21-03.5704N 121-55-01.4378W +RWY SBP 07/25 212 2500 100 35-14-12.6982N 120-39-00.9699W 35-14-12.7926N 120-38-30.8377W +RWY SBP 11/29 212 6101 150 35-14-31.9696N 120-38-58.4419W 35-13-57.5621N 120-37-58.0308W +RWY E16 14/32 284 3095 75 37-05-07.7164N 121-35-56.2038W 37-04-39.7163N 121-35-40.8079W +RWY STS 02/20 129 5202 100 38-30-11.3946N 122-49-15.4684W 38-30-56.2896N 122-48-43.5628W +RWY STS 14/32 129 6000 150 38-31-03.0634N 122-48-49.7384W 38-30-08.3904N 122-48-20.4754W +RWY 0Q3 07/25 16 2700 45 38-13-23.9500N 122-27-09.1100W 38-13-23.8800N 122-26-35.2700W +RWY 0Q3 17/35 16 1513 50 38-13-37.7686N 122-27-11.0207W 38-13-22.8133N 122-27-11.2693W +RWY O79 03/21 4984 3260 50 39-34-43.3800N 120-21-30.1700W 39-35-04.5700N 120-20-58.7800W +RWY 0Q9 08/26 20 2480 40 38-15-28.5000N 122-26-18.1000W 38-15-25.0100N 122-25-47.3200W +RWY SCK 11L/29R 33 10650 150 37-54-08.4310N 121-15-03.2003W 37-53-04.2154N 121-13-17.9147W +RWY SCK 11R/29L 33 4448 75 37-53-58.6710N 121-14-57.4210W 37-53-31.8556N 121-14-13.4473W +RWY CN95 13/31 -24 2837 50 37-59-46.5300N 121-29-43.8000W 37-59-25.2700N 121-29-20.6900W +RWY 1Q4 12/30 62 3530 60 37-40-53.2400N 121-18-18.6100W 37-40-26.7800N 121-17-49.9600W +RWY CA74 12/30 35 2063 30 37-43-59.9300N 121-20-17.2700W 37-43-45.6200N 121-19-58.9700W +RWY TCY 08/26 193 3438 75 37-41-25.7450N 121-26-53.8050W 37-41-25.9870N 121-26-11.0370W +RWY TCY 12/30 193 4001 75 37-41-28.1200N 121-26-45.9340W 37-41-01.8928N 121-26-08.6784W +RWY TRK 02/20 5901 4650 75 39-18-52.2720N 120-08-23.8990W 39-19-32.0680N 120-07-54.3350W +RWY TRK 11/29 5901 7000 100 39-19-29.4440N 120-09-09.8576W 39-18-54.8707N 120-07-52.7405W +RWY O15 12/30 161 2985 50 37-29-13.1062N 120-42-03.2592W 37-28-51.8688N 120-41-37.5438W +RWY UKI 15/33 617 4423 150 39-07-54.8340N 123-12-08.7700W 39-07-12.0246N 123-11-57.4192W +RWY 1Q5 01/19 1900 4050 200 39-26-45.4100N 122-57-29.9200W 39-27-19.6900N 122-57-03.2400W +RWY VCB 02/20 117 4700 75 38-22-22.3247N 121-57-56.7113W 38-23-00.9631N 121-57-23.9357W +RWY WVI 02/20 163 4501 149 36-55-44.5333N 121-47-44.8642W 36-56-22.1376N 121-47-15.2282W +RWY WVI 09/27 163 3998 98 36-56-17.9780N 121-47-38.6633W 36-56-11.2350N 121-46-50.1373W +RWY O28 16/34 2066 2995 75 39-27-19.5118N 123-22-21.9671W 39-26-50.0189N 123-22-18.8103W +RWY WLW 13/31 141 3788 60 39-31-11.2596N 122-13-06.5041W 39-30-40.5923N 122-12-38.7904W +RWY WLW 16/34 141 4125 100 39-31-17.8247N 122-13-11.7798W 39-30-37.0784N 122-13-10.1327W +RWY O41 18/36 125 3759 60 38-40-43.4900N 121-52-11.7200W 38-40-08.3980N 121-52-27.3160W +RWY O52 17/35 60 3045 75 39-07-40.1437N 121-36-16.8282W 39-07-10.2952N 121-36-21.8161W +ILS 22L ILS/DME IMHR 111.35 38-32-32.179N 121-19-03.903W 38-33-36.464N 121-17-01.582W 92 3.13 233.59 3.00 +ILS 31 ILS ISNS 108.50 36-40-17.917N 121-36-44.561W 36-39-36.352N 121-36-07.757W 78 6.00 327.93 3.00 +ILS 19R LDA ICCR 108.50 37-58-57.439N 122-03-34.009W - - 23 5.00 197.76 - +ILS 34L ILS/DME IHUX 111.10 38-42-36.650N 121-36-03.720W 38-41-12.501N 121-36-00.081W 22 4.16 0.75 3.00 +ILS 02 ILS ISAC 110.30 38-31-13.323N 121-29-17.312W 38-30-25.582N 121-29-50.948W 20 6.00 33.01 3.00 +ILS 30 ILS/DME IINB 108.70 37-43-29.873N 122-14-58.104W 37-42-09.750N 122-13-05.632W 4 3.04 310.11 3.00 +ILS 12R ILS/DME ISLV 110.90 37-21-03.037N 121-55-00.853W 37-22-06.024N 121-56-14.583W 36 4.60 138.94 3.00 +ILS 28R ILS IMOD 111.90 37-37-53.797N 120-57-48.867W 37-37-23.278N 120-56-42.262W 84 5.63 304.23 3.00 +ILS 12 ILS IAAZ 111.90 37-42-02.254N 122-12-46.650W 37-43-02.930N 122-14-22.820W 3 3.64 130.12 2.75 +ILS 25R ILS ILVK 110.50 37-41-38.229N 121-49-52.644W 37-41-35.286N 121-48-52.840W 393 6.00 270.57 3.00 +ILS 33 LOC/GS IMIZ 109.50 39-09-34.740N 121-26-48.448W 39-07-25.634N 121-25-45.799W 98 3.00 341.42 3.00 +ILS 30 ILS/DME IMCE 109.30 37-17-32.859N 120-31-20.887W 37-16-48.289N 120-30-37.320W 153 5.97 318.62 3.00 +ILS 16 ILS IMCC 109.70 38-38-52.793N 121-24-02.271W 38-40-45.936N 121-24-08.400W 72 3.19 180.07 3.00 +ILS 28X LDA/DME IFNP 110.75 37-37-16.675N 122-22-06.215W 37-36-49.944N 122-21-40.241W 9 5.00 294.82 3.00 +ILS 15 ILS/DME ILHM 108.75 38-53-51.199N 121-20-50.791W 38-54-54.332N 121-21-07.404W 120 5.45 165.36 3.00 +ILS 11 ILS ISBP 109.70 35-13-54.037N 120-37-51.845W 35-14-20.714N 120-38-44.490W 172 6.00 124.89 3.00 +ILS 28R ILS IOAK 109.90 37-43-54.550N 122-13-34.860W 37-43-28.596N 122-12-30.621W 3 5.93 292.26 3.00 +ILS 03L LOC/GS ITXV 108.35 38-16-06.768N 121-55-18.576W 38-14-40.751N 121-57-09.016W 28 3.00 47.55 2.50 +ILS 19L ILS/DME ISIA 108.90 37-36-16.280N 122-22-56.061W 37-37-30.738N 122-22-11.058W 6 4.27 207.70 3.00 +ILS 13L ILS ICIC 111.30 39-47-07.770N 121-50-57.490W 39-48-01.160N 121-51-47.018W 233 5.18 147.53 3.00 +ILS 30L ILS/DME ISJC 110.90 37-22-27.185N 121-56-33.097W 37-21-33.003N 121-55-27.874W 49 4.61 318.93 3.00 +ILS 34 ILS IFKZ 109.70 38-41-13.140N 121-24-02.049W 38-39-20.843N 121-24-08.510W 0 5.0 0.07 3.00 +ILS 28R ILS/DME IGWQ 111.70 37-37-46.357N 122-23-43.119W 37-36-51.399N 122-21-43.117W 8 3.29 297.90 3.00 +ILS 28L ILS/DME ISFO 109.55 37-37-37.471N 122-23-41.920W 37-36-51.277N 122-21-43.200W 8 3.43 297.90 2.85 +ILS 02 LOCALIZER IAYN 108.30 36-56-25.515N 121-47-12.565W - - 159 6.00 32.21 - +ILS 28L LOC/DME IHWD 111.50 37-39-46.203N 122-07-46.752W - - 42 5.00 302.62 - +ILS 32 ILS ISTS 109.30 38-31-12.293N 122-48-54.678W 38-30-16.289N 122-48-28.788W 119 5.72 337.27 3.00 +ILS 10R ILS/DME IMRY 110.70 36-34-57.926N 121-49-54.634W 36-35-26.107N 121-51-09.714W 164 5.37 112.85 3.00 +ILS 28L LOC/DME IMTB 110.70 36-35-29.727N 121-51-28.612W - - 155 5.22 292.84 - +ILS 32R LOC/GS INUQ 110.35 37-25-52.377N 122-03-20.819W 37-24-32.159N 122-02-32.905W 24 3.97 337.80 3.00 +ILS 21L ILS ISUU 110.10 38-15-32.286N 121-55-47.976W 38-16-50.066N 121-54-09.119W 47 3.24 227.56 2.80 +ILS 29R ILS/DME ISCK 109.10 37-54-14.449N 121-15-13.085W 37-53-20.806N 121-13-36.950W 29 3.76 307.69 2.90 +ILS 16R ILS/DME ISMF 111.10 38-40-35.749N 121-36-05.732W 38-42-15.861N 121-36-09.106W 23 3.58 180.74 3.00 +ILS 16L ILS/DME IMDK 111.75 38-40-50.670N 121-34-49.810W 38-42-15.230N 121-34-44.355W 22 4.17 180.75 3.00 +ILS 15 LOC/DME IUKI 109.10 39-07-07.750N 123-11-56.287W - - 611 6.00 168.38 - +ILS 14 ILS IMYV 110.50 39-05-14.024N 121-33-53.466W 39-06-07.544N 121-34-27.778W 59 5.72 156.86 3.00 +ILS 15 LOC/GS IBAB 109.50 39-06-36.513N 121-25-31.219W 39-08-53.395N 121-26-37.415W 103 3.00 161.43 2.75 +ILS 36L ILS/DME IAPC 111.30 38-13-28.161N 122-16-38.440W 38-12-38.330N 122-17-04.370W 13 6.00 20.67 3.00 +ILS 14L LOCALIZER IMNQ 110.35 37-24-12.233N 122-02-29.368W - - 34 3.97 157.80 - +ILS 31 LOC/GS IMER 109.50 37-23-48.041N 120-35-04.567W 37-22-15.548N 120-33-22.854W 175 3.00 321.15 3.00 +NAV BSR VORTAC 36-10-52.664N 121-38-31.604W 4080 114.00 087X +NAV CIC VOR/DME 39-47-23.370N 121-50-49.902W 214 109.80 035X +NAV CCR VOR/DME 38-02-41.714N 122-02-42.750W 8 117.00 117X +NAV CC NDB 38-02-47.060N 122-02-00.350W 5 335 - +NAV SUU TACAN 38-14-44.013N 121-56-42.274W 31 116.60 113X +NAV TZZ VOR 38-20-39.139N 121-48-38.641W 32 116.40 - +NAV HGT NDB 35-57-40.200N 121-11-21.000W 961 209 - +NAV LIN VOR/DME 38-04-28.518N 121-00-13.888W 260 114.80 095X +NAV LV NDB 37-41-31.996N 121-41-02.706W 684 374 - +NAV BAB TACAN 39-08-05.260N 121-26-26.721W 90 108.60 023X +NAV MY NDB 39-10-09.809N 121-36-35.481W 64 222 - +NAV MYV VOR/DME 39-05-55.121N 121-34-23.007W 62 110.80 045X +NAV MXW VORTAC 39-19-03.261N 122-13-17.535W 110 110.00 037X +NAV HYP VOR/DME 37-13-09.957N 120-24-00.786W 184 114.20 089X +NAV MOD VOR/DME 37-37-38.547N 120-57-28.320W 93 114.60 093X +NAV NUQ TACAN 37-25-56.692N 122-03-27.305W 4 117.60 123X +NAV SGD VORTAC 38-10-45.695N 122-22-23.345W 6 112.10 058X +NAV OAK VOR/DME 37-43-33.322N 122-13-24.909W 13 116.80 115X +NAV PXN VORTAC 36-42-55.651N 120-46-43.261W 2060 112.60 073X +NAV PRB VORTAC 35-40-20.866N 120-37-37.587W 817 114.30 090X +NAV HNW VOR/DME 38-43-29.009N 120-44-57.346W 2583 115.50 102X +NAV PYE VOR/DME 38-04-47.124N 122-52-04.179W 1340 113.70 084X +NAV ROM VOR 36-08-25.361N 120-39-53.707W 3880 110.00 - +NAV MCC VOR/DME 38-40-02.621N 121-24-14.981W 65 109.20 029X +NAV SAC VORTAC 38-26-37.483N 121-33-05.938W 3 115.20 099X +NAV UAD NDB 36-29-27.265N 121-28-29.674W 105 263 - +NAV SNS VORTAC 36-39-49.811N 121-36-11.465W 80 117.30 120X +NAV SFO VOR/DME 37-37-10.144N 122-22-26.018W 7 115.80 105X +NAV SJC VOR/DME 37-22-28.961N 121-56-40.801W 34 114.10 088X +NAV MQO VORTAC 35-15-08.118N 120-45-34.439W 1463 112.40 071X +NAV STS VOR/DME 38-30-29.472N 122-48-38.222W 121 113.00 077X +NAV SAU VOR/DME 37-51-19.203N 122-31-21.908W 1040 116.20 109X +NAV SWR VOR/DME 39-10-49.162N 120-16-10.604W 8850 113.20 079X +NAV ECA VOR/DME 37-50-00.978N 121-10-16.957W 47 116.00 107X +NAV TCY NDB 37-41-32.630N 121-26-40.670W 169 203 - +NAV UK NDB 39-16-33.538N 123-14-26.388W 873 371 - +NAV ENI VORTAC 39-03-11.580N 123-16-27.576W 2985 112.30 070X +NAV PDG NDB 36-54-48.852N 121-48-28.666W 105 327 - +NAV ILA VORTAC 39-04-16.135N 122-01-38.079W 50 114.40 091X +NAV OSI VOR/DME 37-23-33.000N 122-16-52.690W 2270 113.90 086X diff -Nru acm-5.0/objects/zones/usa/tucson.txt acm-6.0+20200416/objects/zones/usa/tucson.txt --- acm-5.0/objects/zones/usa/tucson.txt 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/objects/zones/usa/tucson.txt 2020-04-16 12:05:39.000000000 +0000 @@ -0,0 +1,131 @@ +# Tucson area scenery. +# Created: 2020-04-16 +# Latitude range: [30N, 35N[ +# Longitude range: [115W, 110W[ +# 2017-10-04 Checked against https://nfdc.faa.gov/xwiki/bin/view/NFDC/56DaySub-2017-03-02 +# "56 Day NASR Subscription - Effective March 2, 2017". + +# ?????: +TEAM1_LOC 30N 115W 000 031 +# ?????: +TEAM1_LOC 30N 115W 000 031 +GROUND_COLOR #305030 +RWY 27AZ 17/35 2206 3906 40 33-55-28.9800N 113-10-04.2000W 33-54-50.3400N 113-10-04.0800W +RWY P01 12/30 1458 3800 60 32-27-23.7000N 112-51-56.7500W 32-26-57.1100N 112-51-25.3900W +RWY E51 05/23 4196 4552 60 34-35-25.8500N 113-10-44.1800W 34-35-42.9900N 113-09-53.8500W +RWY E95 10/28 3831 4002 75 32-00-01.6715N 110-21-51.4938W 31-59-54.3782N 110-21-05.8293W +RWY BXK 17/35 1033 5500 75 33-25-48.3240N 112-41-09.1010W 33-24-53.9450N 112-41-11.4000W +RWY A09 17/35 485 4800 50 34-53-41.2000N 114-36-59.9000W 34-52-53.7100N 114-36-59.9000W +RWY CGZ 05/23 1464 5200 100 32-57-04.7376N 111-46-26.9497W 32-57-30.5264N 111-45-34.1498W +RWY P19 17/35 1177 3913 60 33-18-15.3140N 111-54-55.5520W 33-17-36.5950N 111-54-55.5930W +RWY CHD 04L/22R 1243 4401 75 33-15-50.8078N 111-49-11.8273W 33-16-19.0137N 111-48-32.3495W +RWY CHD 04R/22L 1243 4870 75 33-15-56.6084N 111-48-50.9868W 33-16-27.8124N 111-48-07.2947W +RWY P08 05/23 1576 5564 150 32-56-01.1248N 111-26-07.4813W 32-56-28.4486N 111-25-10.8140W +RWY P08 17/35 1576 3873 75 32-56-21.5107N 111-25-29.6960W 32-55-43.1962N 111-25-29.8689W +RWY P52 14/32 3560 4252 75 34-44-07.3361N 112-02-17.0188W 34-43-29.0548N 112-01-55.9582W +RWY E60 02/20 1511 3901 75 32-48-08.9324N 111-35-25.8282W 32-48-39.4646N 111-34-57.8810W +RWY FHU 03/21 4719 4285 75 31-35-10.1480N 110-20-56.2906W 31-35-44.1424N 110-20-26.7031W +RWY FHU 08/26 4719 12001 150 31-35-15.2281N 110-22-01.3797W 31-35-15.4464N 110-19-42.6768W +RWY FHU 12/30 4719 5366 100 31-35-34.3510N 110-20-35.7654W 31-35-02.6253N 110-19-46.0296W +RWY E63 04/22 789 5200 75 32-57-22.7900N 112-40-50.8400W 32-57-50.4300N 112-39-59.3500W +RWY GXF 17/35 883 8500 150 32-53-58.3100N 112-43-10.4900W 32-52-34.1900N 112-43-10.7000W +RWY GEU 01/19 1071 7150 100 33-31-05.0154N 112-18-00.7754W 33-32-08.7476N 112-17-24.1442W +RWY LUF 03L/21R 1085 10012 150 33-31-22.7100N 112-23-54.8300W 33-32-35.6700N 112-22-34.8400W +RWY LUF 03R/21L 1085 9904 150 33-31-36.5600N 112-23-23.6000W 33-32-48.7300N 112-22-04.4700W +RWY P13 09/27 3261 6500 100 33-21-17.9375N 110-40-39.9857W 33-21-04.7356N 110-39-25.0041W +RWY GYR 03/21 969 8500 150 33-24-50.7219N 112-23-02.2317W 33-25-56.9013N 112-22-00.3656W +RWY P14 03/21 5262 6698 75 34-56-04.7696N 110-08-41.1119W 34-56-55.7933N 110-07-49.8343W +RWY P14 11/29 5262 3202 120 34-56-26.7369N 110-08-41.7726W 34-56-10.7938N 110-08-08.5592W +RWY E67 08/26 1833 3400 60 33-02-51.1000N 110-54-52.5600W 33-02-48.7800N 110-54-12.7000W +RWY HII 14/32 783 8001 100 34-34-50.1791N 114-21-53.9720W 34-33-41.9020N 114-21-05.6214W +RWY MZJ 12/30 1893 6849 150 32-30-59.3255N 111-19-59.5715W 32-30-11.5555N 111-19-02.8462W +RWY FFZ 04L/22R 1394 3799 75 33-27-29.8835N 111-44-03.0576W 33-27-53.4533N 111-43-28.1417W +RWY FFZ 04R/22L 1394 5101 100 33-27-21.2342N 111-44-02.7213W 33-27-52.8681N 111-43-15.8192W +RWY OLS 03/21 3955 7200 100 31-24-39.1879N 110-51-22.4518W 31-25-28.3862N 110-50-22.3869W +RWY P20 01/19 458 6250 100 34-08-31.6438N 114-16-20.6603W 34-09-27.1009N 114-15-47.7911W +RWY PAN 06/24 5157 5504 75 34-15-18.0170N 111-20-53.1190W 34-15-31.2000N 111-19-49.5200W +RWY DVT 07L/25R 1478 4500 75 33-41-20.9760N 112-05-22.0262W 33-41-24.0728N 112-04-28.9041W +RWY DVT 07R/25L 1478 8196 100 33-41-12.6032N 112-05-46.5681W 33-41-18.2430N 112-04-09.8161W +RWY A39 04/22 1306 4751 50 32-59-10.2300N 111-55-28.7500W 32-59-41.7200N 111-54-47.3400W +RWY IWA 12C/30C 1384 10201 150 33-19-03.4054N 111-39-57.3239W 33-17-51.3360N 111-38-33.1882W +RWY IWA 12L/30R 1384 9300 150 33-19-03.3224N 111-39-40.7262W 33-17-57.6145N 111-38-24.0276W +RWY IWA 12R/30L 1384 10401 150 33-19-03.6143N 111-40-22.3237W 33-17-50.1431N 111-38-56.5337W +RWY PHX 07L/25R 1135 10300 150 33-25-51.8088N 112-01-37.5649W 33-25-51.7274N 111-59-36.0454W +RWY PHX 07R/25L 1135 7800 150 33-25-43.8912N 112-01-37.5673W 33-25-43.8360N 112-00-05.5440W +RWY PHX 08/26 1135 11489 150 33-26-27.0986N 112-01-47.2574W 33-26-26.9641N 111-59-31.6879W +RWY PRC 03L/21R 5045 4846 60 34-39-23.3700N 112-25-13.6100W 34-39-59.3754N 112-24-35.3500W +RWY PRC 03R/21L 5045 7619 150 34-38-47.2900N 112-25-40.8000W 34-39-43.9100N 112-24-40.6600W +RWY PRC 12/30 5045 4408 75 34-39-09.8579N 112-25-40.6779W 34-38-38.2236N 112-25-04.4008W +RWY 44A 17/35 163 2800 60 32-31-12.5200N 114-41-54.3800W 32-30-44.8100N 114-41-53.9800W +RWY E77 11/29 3272 4207 75 32-38-22.7857N 110-39-10.6532W 32-37-59.5843N 110-38-29.8179W +RWY SDL 03/21 1510 8249 100 33-36-53.0117N 111-55-11.7848W 33-37-51.7182N 111-54-04.0392W +RWY SEZ 03/21 4830 5132 100 34-50-37.2207N 111-47-40.4587W 34-51-12.6197N 111-46-56.3606W +RWY E78 04/22 2409 5830 60 31-55-42.0925N 111-54-08.0784W 31-56-12.4139N 111-53-10.5051W +RWY SOW 03/21 6415 3938 60 34-15-38.0060N 110-00-26.9116W 34-16-04.1715N 109-59-52.1771W +RWY SOW 06/24 6415 7200 100 34-15-49.5912N 110-01-07.9157W 34-16-06.8439N 109-59-44.7084W +RWY TYL 03/21 5823 7001 75 34-26-44.0334N 110-07-21.9716W 34-27-35.6401N 110-06-26.2800W +RWY P29 06/24 4743 4430 60 31-40-08.7100N 110-01-41.3300W 31-40-24.7400N 110-00-53.6000W +RWY AVQ 03/21 2031 3892 75 32-24-12.3801N 111-13-22.3745W 32-24-39.3827N 111-12-50.0095W +RWY AVQ 12/30 2031 6901 100 32-25-03.6117N 111-13-34.3560W 32-24-14.9318N 111-12-37.9188W +RWY TUS 03/21 2643 7000 150 32-07-01.8010N 110-57-32.5456W 32-07-50.7389N 110-56-34.9558W +RWY TUS 11L/29R 2643 10996 150 32-07-24.1321N 110-56-52.4872W 32-06-07.1639N 110-55-22.1441W +RWY TUS 11R/29L 2643 8408 75 32-07-19.5718N 110-56-58.7462W 32-06-20.7202N 110-55-49.6594W +RWY DMA 12/30 2704 13643 200 32-10-48.5983N 110-53-53.1245W 32-09-09.2254N 110-52-05.6973W +RWY RYN 06L/24R 2419 4900 75 32-08-28.3981N 111-10-56.9801W 32-08-44.7328N 111-10-03.3287W +RWY RYN 06R/24L 2419 5503 75 32-08-24.5404N 111-10-45.5085W 32-08-42.8729N 111-09-45.2563W +RWY RYN 15/33 2419 4000 75 32-08-43.3311N 111-10-49.2954W 32-08-04.6228N 111-10-39.6085W +RWY E25 05/23 2379 6101 75 33-57-59.3754N 112-48-13.8203W 33-58-29.1557N 112-47-10.8263W +RWY NYL 03L/21R 213 13300 200 32-38-12.4170N 114-37-45.8220W 32-39-46.8960N 114-35-57.5480W +RWY NYL 03R/21L 213 9240 150 32-38-55.4600N 114-36-45.1040W 32-40-01.0790N 114-35-29.8560W +RWY NYL 08/26 213 6146 150 32-39-57.2420N 114-36-20.3620W 32-39-58.1650N 114-35-08.4760W +RWY NYL 17/35 213 5710 150 32-40-03.7490N 114-36-14.6920W 32-39-07.2550N 114-36-13.6070W +RWY LGF 06/24 433 6043 100 32-51-35.2740N 114-24-03.0350W 32-51-49.7720N 114-22-54.3070W +RWY LGF 18/36 433 6142 151 32-52-32.1350N 114-23-33.8540W 32-51-32.4590N 114-23-47.4500W +RWY BLH 08/26 400 6543 150 33-36-59.7683N 114-43-39.8259W 33-36-59.5333N 114-42-22.4640W +RWY BLH 17/35 400 5800 100 33-37-48.1258N 114-43-00.2703W 33-36-50.7511N 114-43-00.5427W +RWY 49X 16/34 638 5000 75 34-32-08.6734N 114-25-55.0446W 34-31-19.2147N 114-25-55.1295W +RWY EED 02/20 983 4235 100 34-45-51.7500N 114-37-23.0500W 34-46-28.3440N 114-36-58.3250W +RWY EED 11/29 983 5005 100 34-46-01.4100N 114-38-01.1140W 34-45-37.3360N 114-37-08.7050W +ILS 03R LOC/GS ILUF 108.70 33-33-00.880N 112-21-51.140W 33-31-47.800N 112-23-19.310W 1069 3.46 42.43 3.00 +ILS 25L ILS/DME IRJG 110.75 33-25-43.900N 112-01-50.780W 33-25-40.930N 112-00-16.870W 1120 4.49 270.04 3.00 +ILS 06R ILS/DME IIVI 111.10 32-08-47.886N 111-09-28.843W 32-08-30.122N 111-10-36.625W 2398 5.72 70.22 3.00 +ILS 21L ILS/DME IPRC 108.50 34-38-39.774N 112-25-48.774W 34-39-34.954N 112-24-45.537W 4960 4.65 221.14 3.00 +ILS 12 LOC/GS IAFB 109.30 32-09-00.630N 110-51-56.400W 32-10-39.610N 110-53-50.520W 2594 5.0 132.00 3.00 +ILS 05 ILS ICGZ 111.15 32-57-33.610N 111-45-27.831W 32-57-10.875N 111-46-21.405W 1451 6.00 59.80 3.00 +ILS 11L ILS/DME ITUS 111.70 32-05-53.509N 110-55-06.122W 32-07-14.768N 110-56-48.060W 2580 4.00 135.17 3.00 +ILS 08 ILS/DME ISYQ 111.75 33-26-26.946N 111-59-19.745W 33-26-29.654N 112-01-24.630W 1114 3.46 90.07 3.00 +ILS 26 LOC/GS IFHU 109.90 31-35-15.199N 110-22-16.408W 31-35-11.473N 110-19-53.649W 4606 3.02 269.89 3.00 +ILS 30 ILS IDMA 109.30 32-11-02.818N 110-54-08.511W 32-09-15.893N 110-52-20.807W 2691 3.00 317.53 3.00 +ILS 30C LOC/GS IIWA 110.15 33-19-13.059N 111-40-08.600W 33-18-01.860N 111-38-37.226W 1376 4.25 315.70 3.00 +ILS 21L LOC/GS IEMJ 110.90 33-31-25.610N 112-23-35.610W 33-32-45.240N 112-22-16.310W 1083 3.52 235.00 3.00 +ILS 07R ILS/DME IAHA 110.75 33-25-43.830N 111-59-52.330W 33-25-46.630N 112-01-25.090W 1108 4.49 90.04 3.00 +ILS 07L ILS/DME IPHX 111.50 33-25-51.715N 111-59-20.415W 33-25-49.051N 112-01-25.219W 1106 3.46 90.05 3.00 +ILS 26 ILS/DME ICWJ 111.75 33-26-27.108N 112-01-59.227W 33-26-29.600N 111-59-44.432W 1129 3.21 270.07 3.00 +ILS 21R ILS IYUM 108.30 32-38-04.046N 114-37-55.407W 32-39-42.539N 114-37-10.284W 189 3.00 223.97 3.00 +NAV BXK VORTAC 33-27-12.442N 112-49-28.530W 1060 110.60 043X +NAV TFD VORTAC 32-53-09.076N 111-54-31.444W 1316 114.80 095X +NAV CHD NDB 33-15-59.360N 111-48-28.490W 1238 407 - +NAV ARH TACAN 31-35-08.093N 110-20-20.343W 4660 111.60 053X +NAV DAO NDB 31-35-08.408N 110-20-39.309W 4654 410 - +NAV FHU VOR/DME 31-35-22.762N 110-21-17.793W 4665 113.60 83X +NAV GBN VORTAC 32-57-22.530N 112-40-27.378W 790 116.60 113X +NAV LUF TACAN 33-32-15.660N 112-22-48.760W 1076 113.00 077X +NAV AVQ NDB 32-24-42.615N 111-12-56.111W 2021 245 - +NAV FFZ NDB 33-27-42.773N 111-43-59.113W 1392 281 - +NAV ENZ NDB 31-25-16.919N 110-50-47.170W 3918 394 - +NAV OLS VOR/DME 31-24-53.835N 110-50-56.032W 3877 108.20 019X +NAV PXR VORTAC 33-25-58.874N 111-58-12.716W 1182 115.60 103X +NAV IWA VORTAC 33-18-11.426N 111-39-05.174W 1366 113.30 080X +NAV DRK VORTAC 34-42-09.197N 112-28-49.244W 4967 114.10 088X +NAV SOW NDB 34-16-02.118N 110-00-29.572W 6403 206 - +NAV DMA TACAN 32-09-35.697N 110-52-51.274W 2662 117.60 123X +NAV RBJ NDB 32-04-26.550N 111-21-37.108W 2607 220 - +NAV RYN NDB 32-08-19.626N 111-09-41.385W 2420 338 - +NAV TUS VORTAC 32-05-42.734N 110-54-53.480W 2671 116.00 107X +NAV BZA VORTAC 32-46-05.187N 114-36-10.607W 130 116.80 115X +NAV NYL TACAN 32-38-48.482N 114-36-48.438W 192 113.70 084X +NAV BLH VORTAC 33-35-45.833N 114-45-40.584W 410 117.40 121X +NAV EED VORTAC 34-45-57.615N 114-28-26.775W 620 115.20 099X +NAV PKE VORTAC 34-06-07.102N 114-40-55.439W 1000 117.90 126X +NAV NOG NDB 31-13-00.000N 110-59-00.000W 0 265 - +NAV PPE VOR/DME 31-23-00.000N 113-30-00.000W 0 112.10 058X diff -Nru acm-5.0/objects/zones.txt acm-6.0+20200416/objects/zones.txt --- acm-5.0/objects/zones.txt 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/objects/zones.txt 2020-04-16 12:05:38.000000000 +0000 @@ -0,0 +1,35 @@ +# This file lists all the available scenery files. For each scenery file, the +# range of latitude and longitude it covers must be indicated. The ACM program +# automatically loads and release data from each scenery file according to the +# position of each local aircraft it is currently simulating (normally one only). +# Each column must contain in the order: +# +# 1. Minimum latitude covered. +# 2. Maximum latitude covered. +# 3. Minimum longitude covered. +# 4. Maximum longitude covered. +# 5. File name of the scenery as path relative to this file. Example: +# "../../myscene.txt". The extension of the file does not really care. +# White spaces not allowed inside the path. +# +# Latitude and longitudes have the usual syntax, examples: +# +# 10N 10-20-30.400S 30.5S +# 10E 10-20-30.400W 30.5W +# +# Fields must be separated by at least one white space. Apart from that, white +# spaces are ignored. Empty lines and lines beginning with '#' are ignored. + +35N 40N 125W 120W zones/usa/sfrancisco.txt +30N 35N 120W 115W zones/usa/losangeles.txt +35N 40N 120W 115W zones/usa/lasvegaswest.txt +35N 40N 115W 110W zones/usa/lasvegaseast.txt +30N 35N 115W 110W zones/usa/tucson.txt +30N 35N 100W 095W zones/usa/dallas.txt +40N 45N 075W 070W zones/usa/newyork.txt +42N 50N 005W 006E zones/europe/france.txt +47N 55N 006E 015E zones/europe/germany.txt +35N 47N 006E 019E zones/europe/italy.txt +35N 42N 010W 006E zones/europe/spain.txt +50N 60N 010W 002E zones/europe/united-kingdom.txt +30N 35N 040E 045E zones/middleeast/iraq.txt \ No newline at end of file diff -Nru acm-5.0/README acm-6.0+20200416/README --- acm-5.0/README 1998-12-23 22:42:01.000000000 +0000 +++ acm-6.0+20200416/README 1970-01-01 00:00:00.000000000 +0000 @@ -1,562 +0,0 @@ -ACM Flight Simulator, revision 5.0 - - -What is ACM? ------------- - -ACM is a LAN-oriented, multiplayer aerial combat simulation. The main design -objective was to provide source code that could be easily compiled and -executed on a wide variety of platforms. To that end, acm is written entirely -in C, exploiting the programming features of Unix, X11, and the BSD socket -interface. A Windows/95 version is available from www.websimulations.com. - -Players engage in air to air combat against one another using heat seeking -missiles and cannons. - -ACM is implemented as a distributed simulation. It communicates information -via the IEEE Distributed Interactive Simulation protocol (IEEE 1278.1-1994). -This should allow ACM to interoperate with other simulations that support that -protocol. - - -Riley Rainey (riley.rainey@websimulations.com) -Dallas, Texas -December 23, 1998 - - -Building ACM: -------------- - -To build ACM, type: - - $ ./configure - $ make - -On systems where X11 is installed in an unusual location, configure may have -trouble locating the X include files and libraries (you'll know that -because the compiler will complain that it can't find files like "X11/X.h"). -If this problem crops up, you can help configure to set up the -Makefiles by telling it where to find X11: - - $ x_includes=/usr/myX11/include; export x_includes - $ x_libraries=/usr/myX11/lib; export x_libraries - $ ./configure - $ make - -By default, configure will compile ACM using gcc if gcc is found in your PATH -environment variable. Some combinations of gcc and OS platforms have problems -with ACM (gcc 2.2.2 seems to have problems on SunOS and HP-UX, for example). -You can override configure's selection of gcc: - - $ CC=cc; export CC - $ ./configure - $ make - -ACM can then be executed by typing: - - $ cd src; acm - -When you are ready to install ACM on your system: - - # make install - - -What's different with revision 5.0: ------------------------------------ - -Current ACM documentation may be found in the file "acmdoc.rtf". - -ACM now dynamically maps DIS entity identifiers to rendered objects. The -mapping is defined in the file "objects/object-map.txt". - -ACM now has a more flexible scheme for determining aircraft damage. See the -file "objects/munition-map.txt". - -ACM now supports reading DXF object description files. This support isn't -exhaustive, but it works with many popular 3D CAD programs capable of -exporting DXF files. - -The V library object description file suffix was changed from ".obj" to -".obv" to avoid conflicting with Micrsoft object file names. - -A bug in the new scene reader code was preventing 'FEATURES' (special -ground based features) from being rendered. The default-scene file now -contains an example of a ground feature reference -- the tower at Addison -airport. - -Support for the GNU --srcdir option to 'configure'. Michael Deutschmann -(ldeutsch@mail.netshop.net) suggested changes to support this as well -as numerous autoconfig enhancements. - -Several changes have been made to allow ACM to compile and link -cleanly on Linux systems. ACM's configure now looks for a /usr/lib/games -directory and installs ACM's object files there if it is present. - -Mats Lofkvist fixed several bugs relating to DIS processing. - -The DIS/x library now supports more DIS dead reckoning methods. -All static and world-based methods are now supported. Body -frame methods remain unsupported. - -Missiles will no longer fire while weight is on the landing gear. - -Mark Cianfaglione (markcia@nortel.ca) suggested changes to landing gear -handling. Now the gear will not come up until weight is off the wheels. -At Mark's suggestion, the low fuel light now comes on when there is -fifteen percent fuel remaining -- it used to be hard coded to come on -any time there was less than 1000 lbs of fule on-board. - -Misha Stephanov pointed out two one-line, -but significant bugs in update.c and damage.c. Misha also suggest -a changes to landing gear handling to detect when someone is unlucky -enough to attempt a gear-up landing. - -ACM now has a basic DIS Stealth capability. - -ACM supports numerous new command line options, all of which are -documented in the acmdoc.rtf file. - - -What's different with revision 4.8: ------------------------------------ - -The world is now round -- er, spheroidal. When you enter the ACM world, you -are placed on runway 15 at Addison airport in Dallas, Texas [my aircraft's -home base ;-) ]. The scene databases now include realistic radio navigation -aid information as well as runway location information. With this info -integrated into ACM, you can fly more real instrument approaches. -If you'd like to try, you should get a copy of the current -National Ocean Service [NOS] terminal procedures [approach plates] -South Central Volume 2. I will try to get permission to scan and distribute a -few with the release of ACM. - -Only the Dallas scene database is currently available. - -Use your PC joystick with ACM! Support for the Colorado Spectrum -Workstation Gameport(tm) has been added to ACM. This gameport adapter -allows you to connect a PC joystick to a serial line on your UNIX -workstation. The Workstation Gameport can be ordered from Colorado -Spectrum by phone: +1 (970) 225-6929; it currently lists for $100. -The Workstation Gameport is a different design than the Notebook -Gameport that you will find in your local PC retail store. The Notebook -Gameport will not work with ACM. - -WARNING: This support is currently incomplete. The joystick driver has been -temporarily hard-wired to interface to two-axis joysticks. To enable joystick -operation, type: - - $ acm -js /dev/cua1 - -The name of the serial port connected to the gameport is supplied as the -second argument. The device name will vary from one system to the next -(/dev/cua1 corresponds to the direct-connect port "B" on my Sparc IPX). - -Mats Lofkvist has integrated ACM with the U.S. Navy Postgraduate School's -Distributed Interactive Simulation software (called NPSNET). As the name -implies, DIS is a simulation information interchange protocol that allows -distributed servers (ACM servers, in this case) to work cooperatively. - -I have replaced Mats' use of NPSNET with a DIS library that I created. This -library implementation should be more portable. - -Using DIS means that if you are using ACM in a multiplayer environment, you'll -see much better overall performance. - -The DIS protocol relies on broadcast UDP datagrams. Therefore, all ACM -players must currently run on the same subnet (UDP broadcasts are not -propagated beyond a subnet). There are DIS bridges available that -would potentially relax this restriction, but none have been tested with -ACM yet. - -The ACM server (acms) has been eliminated. Invoke acm by simply -typing 'acm'. Check the acm man page for information about new -command-line arguments and switches. - -A font problem that manifested itself on AIX/Windows has been fixed. - -Fixes for Linux compatibility problems in ACM 4.7 were submitted by -Jeremie Petit (petit@aurora.unice.fr). - - -What's different with revision 4.7: ------------------------------------ - -A problem with V library 3-D to 2-D mapping has been fixed. - -A problem with the V library could cause this esoteric error message on some -X servers: - - BadPixmap (invalid Pixmap parameter) - -The fix to this problem was identified by Brent Holland. - - -What's different with revision 4.6: ------------------------------------ - -Sound support has been added for many HP platforms. Philippe-Andre Prindeville -made the changes required for ACM to function with the HP-UX audio API. -Configure no longer assumes that the NCD netaudio library is the only only one -named "libaudio.a". - -Cloud layers can now be used to affect combat conditions. A single cloud -top/base can be set. This solid cloud layer is opaque to IR emissions, so -you will have a hard time shooting down an opponent who is on the other side -of the clouds. The default cloud base is 2800 feet, tops at 9000 feet. -It is not currently possible to "turn-off" clouds. - -Portability problems with ACM's usage of the random number generators rand() -and random() have been fixed. - -A problem with architectures where a "long" is not the size of an "int" (DEC -Alphas) has been fixed. - - -What's different with revision 4.5: ------------------------------------ - -The HUD compass and HSI were pointing to true north rather than to magnetic -north. This has been fixed. The magnetic variation has been set to -eight degrees east (it can be changed in navaid.c). This means that the -18-36 runways at both team's airfields are actually 17-35 runways; the runway -heading for the ILS 17 approach at team one's airfield is 172 degrees; the -runway heading for the ILS 36 approach at team two's airfield is 352 degrees. - -A field has been added to the navaid description structure to account for -the fact that ILS localizers have a variable beam width (three to six degrees -according to the FAA Airman's Information Manual). The two ILS approaches -have been adjusted so that their beam widths are 700 feet wide at the runway -threshold (per the standard). - -Porting problems with Solaris 2.3 and DEC Alpha OSF/1 have been fixed. -Thanks to Bill Davidson, Peter Asenstorfer, and S.Y. Ni. - -A problem in the VOR TO/FROM logic was pointed out by Jeff Westbrook and has -been fixed. - -A problem with monochrome support was fixed by Jeff Westbrook. - -ACM's configuration facility was rebuilt using autoconf 1.9. - - -What's different with revision 4.4: ------------------------------------ - -Simple visual depth cueing has been added to ACM. Depth cueing is only -activated on color or grey-scale screens that have at least 8 bit planes. -Visibility can be set using the "-visibility" switch on the acms command -line. It produces interesting, if slow, results when used with any of the -Hawaiian Island scenes. I intend to improve the performance and visual -fidelity of this feature. - -A bug in the depth cueing color blending code has been fixed. - -Fixes to src/makefile.in and V/lib/Makefile.in have been applied. A -"make depend" target has been added. - - -What's different with revision 4.3: ------------------------------------ - -Drones will now maneuver and attempt to attack you with missiles. -The original inspiration and code changes were supplied by -Jason Nyberg (nyberg@ctron.com). The drone tracking method was modified -and the missile launch logic was created by Riley Rainey. - -A bug in the AIM-9 time-to-target HUD calculation was fixed. - -Support for NCD's netaudio software has been added. The NCD netaudio software -is free and available in source form via anonymous ftp from ftp.x.org. - -Netaudio 1.1 does not allow the user to switch the audio output port on -a Sun IPX (an IPX has both an internal speaker and an external jack for -headphones or separate speakers). You can switch ports by using the SunOS -/usr/demo/SOUND/x_soundtool before executing acms. - -The scene file format has been modified slightly. The third line is -now the color to be used for the "ground". - -The kauai-scene, oahu-scene and maui-scene files display environments -around those Hawaiian islands. Terrain elevation data was extracted from -USGS one degree Digital Elevation Model (DEM) data files. Because of the -complexity of these scenes, rendering speed is unacceptably slow on all but -the fastest contemporary workstations. - -A bug in the V library backface clipping code was fixed by Tim Love. - -A bug in the V library was resulting in oddly colored instrument panels at -seemingly random times. This has been fixed. - -A problem with the landing gear parameters on the F-16 has been fixed. - -Acms 4.2 core dumped on AIX systems. This has been fixed. Tom McConnell -supplied the changes. - - -What's different with revision 4.2: ------------------------------------ - -Several nits reported by CodeCenter have been repaired by Brad Bass. - -Makefiles now use the $(MFLAGS) macro, where needed. - - -What's different with revision 4.1: ------------------------------------ - -Ultrix and HP-UX make(1) was having problems with the $(MAKEFLAGS) directive in -V/Makefile.in. It has been removed. It's removal should not affect the -build process. - -The Ultrix 4.3 shell was having problems with "./configure". The problem -has been fixed. - -A problem in "./Makefile" that would cause a mis-identification of the -default target has been fixed. - -ClipPoly.c was unused in ACM 4, but has been updated so that it compiles. - -A problem in inventory.c that was causing the nose-wheel steering mode to -stay enabled at all times has been fixed. This problem was pointed-out by - _ -Mats Lofkvist (d87-mal@nada.kth.se). - - -What's different with revision 4.0: ------------------------------------ - -Combat Simulation ------------------ - -Mig-29's are now the default team two plane. - -The HUD display has been improved. - -A bug in the missile tracking algorithm that would induce misses when the -target was moving at a high speed has been fixed. - -ACM now supports situation recording and playback. The "{" key will start -recording, the "}" key ends it. The positions of all aircraft existing -during the recording period will be saved in the file "./back_box_output". -That file can be played back by moving it to the file "./black_box_input". -Activate the playback by pressing the "[" key while you're in ACM. - -DME, VOR's, Localizers, and Glide Slopes have been added. An HSI has been -added to provide VOR and ILS readouts. - -To activate the HSI, press the 'R' key. Each press of the 'R' key cycles -through RADAR -> HSI -> RADAR STANDBY. The Omni Bearing Selector is moved -20 degrees with the '7' key, and one degree with the '8' key. The '9' key -increases the NAV frequency by 1 MHz, the '0' key increases it by 0.05 MHz. -The selected frequency is displayed at the lower right-hand section of the HSI. - -If you want to shoot an ILS approach, I suggest the following settings: - -LEVEL FLIGHT: - power 45 %RPM - flaps 20 - gear up - speed brake deployed as needed - speed ~ 150 kts - -ON GLIDE SLOPE: - power 35 %RPM - flaps 20 - gear down - speed brake retracted - speed 140-150 kts - AOA 10-11 degrees - -When you shoot the ILS 17 approach, don't forget to set the OBS dial to -the runway heading (172 degrees). Otherwise, you'll get a very -confusing picture of which way to fly. -This approach configuration gives you a good opportunity to practice -soft landings. - - -Flight Simulation ------------------ - -Engine response is no longer instantaneous. Engine RPM (power) will -increase and decrease gradually to a newly selected setting. - -The aircraft simulation model has been changed substantially. Tim Tessin -uncovered a bug in pm.c that was substantially degrading the performance -of all aircraft in high angle of attack situations. It's been fixed. - -Several problems with the lift-curve determination have been fixed. -The lift coefficient is now determined by interpolation. The lift contribution -of flaps has been modified to be more consistent with reality. - -Aircraft control surface effectiveness has been increased substantially. -I believe that this increase in consistent with a more realistic simulation. - -ACM now models aircraft motion on the ground more accurately. ACM actually -models the spring and motion damping effects of the landing gear struts, as -well as the contribution of ground friction by the wheels. - -A problem with the roll dynamics of the flight simulation model pointed out -by Tim Tessin has been fixed. The roll model (no pun intended) has been -substantially re-worked to be able to use standard NACA stability -derivatives to describe aircraft roll performance. - -The pitch and yaw dynamics have been modified to use NACA derivatives. - -The outside view has been modified. - -The F-16 flight model has been modified to be more well behaved; lateral -and longitudinal motion damping coefficients have been increased. - - -The Graphics ------------- - -The graphics have been re-vamped to be much faster on color workstations. -Monochrome graphics are slower. - -Object clipping has been improved in the V library to improve rendering -performance. - - -The Guts of ACM ---------------- - -ACM now participates in the X11 WM_CLOSEDOWN and WM_DELETE_WINDOW protocols. - -The directory structure has been modified to get the object description -files out of the source directory. Object files now all have a '.obj' -extension. The 'make install' target has been improved. - -Aircraft descriptions are now defined in the file "objects/inventory". - -Terrain layout is now described using a "scene" file. Acms accepts a -"-s scene-file-name" command line option. The file "default-scene" describes -the default layout. - -A periodic alarm facility has been added in the guts of ACM. See alarm.[hc] -for details. An example of its use can be found in navaid.c; it is used -to periodically update DME readouts on all aircraft. It is designed to be -compatible with variants of ACM that modify deltaT on the fly. - -The radar display has been modified to be more closely coupled to the V -library. This code was borrowed from the ACM 4.0 version. - -If no geometry specification is supplied, the ACM server now computes a -reasonable window geometry based on the screen's width. - -Keypad view selection has been added for Sun systems with some help from -Keith Fredericks (keith@cray.com). - - - -What's different with revision 2.4: ------------------------------------ - -Missiles now use a more realistic target tracking method, known as proportional -navigation guidance. - -Sustained aircraft load factors at high speeds are now limited to a range of -about +10.0 to -4.0 gees. - -More math portability problems have been worked-around. src/manifest.h -contains the definition NEEDS_COPYSIGN. You may comment this out if your -system supports the IEEE copysign function. - -This revision has been tested with X11R5. - - -What's different with revision 2.3: ------------------------------------ - -This revision repairs several portability problems uncovered in revision 2.2. - -A problem with IEEE math in interpolate.c has been worked-around. Invalid -interpolation requests (which shouldn't happen in ACM) will now result in -messages being printed to standard error. - -Several debugging code fragments are now only conditionally compiled. See -manifest.h for more information. - -A problem controlling aircraft resupply could generate unexpected errors -from a system's sqrt function ("sqrt: domain error", for example). It has been -fixed. - - -What's different with revision 2.2: ------------------------------------ - -Explosions now appear in the skies of ACM. Explosions will appear when an -aircraft is struck by a missile or cannon shell. Players go out with a -bang, too. - -The flight simulation model has been tweaked to allow for spins. I don't -think you can really spin an F-16, but if you'd like to try it in ACM, do -this: build up some airspeed in level flight and then go vertical (pitch -up to ninety degrees, or thereabouts). Cut the throttle and afterburner -and keep the nose pointed vertically. Eventually, the F-16 will begin to -fall back to earth -- and typically enter a spin. The only recovery -procedure that I've tried that works is to apply full forward (down) -elevator to break the stall; then re-apply power. - -Elevator trim has been added. The (J) key sets to the elevator trim to -be equal to the current elevator setting. The (U) key resets it to the -normal takeoff setting. Typically, you'll get the aircraft into the -pitch configuration that you want (e.g. level flight) and then press the -(J) key -- then move the elevator control to the neutral position -(the center of the HUD). - -Aircraft now have functioning landing gear. The (G) key acts as the landing -gear handle. A landing gear handle and status lights are located to the right -of the radar set. - -Each aircraft now carries a limited number of air-to-air missiles (eight, to -be precise). - -Aircraft can now be re-armed and re-fueled on the ground. -To do this, a player must land successfully at the team's home airfield -and come to a complete stop. After an interval of not greater than 30 -seconds, the aircraft will be completely re-armed and refueled. Aircraft -damage is repaired, as well. - -Acm's reaction to the resizing of its window has been improved substantially. - -The code handling the HUD altitude, airspeed, and heading ladders has been -improved. - -A problem with acms dumping core when it cannot access the graphics -description files has been fixed. Thanks go to Mark Moraes. - -Acm now makes an effort to select an appropriate X Visual to run in. These -changes are based on code supplied by Mark Hall. - -A problem with unwanted NoExpose events on monochrome displays was fixed -by Georges Lauri. - -Acm's usage of the X DISPLAY environment variable has been improved with the -help of some code from Michael Pall. Now systems where the ACM server is -running on the same system as the X server can get "unix:*" and "local:*" -connections. - - -GENERAL NOTES -------------- - -This software is divided into three major parts: the 3-D graphics routines, -the DIS library and the flight simulator itself. The 3-D stuff is contained -in the V directory. V/lib holds the library itself. V/test contains a -program that can be used to test your port of the V library. The dis -directory holds the Distributed Interactive Simulation library. - -`src' contains the remainder of the flight simulator. - -Comments and suggestions to improve this software are welcome. - -Several "features" in this revision of the software: - - * flaps and landing gear can be lowered at rediculously high speeds. - - * you can fly through mountains. - - * engines do not flame-out. - -README: patchlevel-4.8 diff -Nru acm-5.0/README.txt acm-6.0+20200416/README.txt --- acm-5.0/README.txt 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/README.txt 2020-04-16 12:05:35.000000000 +0000 @@ -0,0 +1,121 @@ +Air Combat Maneuvering 6.0 +-------------------------- + +ACM is an air combat maneuvering flight simulator program originally developed +by Riley Rainey until the version 5.0. Starting from that already good program, +I added several new features and extensions to make the program more suitable +for civil and instrumental flight. + +The following list summarizes the features of the program; please read the +reference manual for a detailed description: + +- Open source, mostly GNU GPL or public domain license. + +- Only C source code with small TCL launcher interface. + +- Very small CPU and memory footprint; does not require specialized hardware. + +- Simulated environment: ellipsoidal Earth (WGS-84 model), magnetic field + calculation (NOAA WMM model), Sun ephemeris, standard atmosphere, wind and + gusts, clouds. + +- Aircraft: several models available, both civil and military, 6 degrees of + freedom, bicycle or tricycle landing gear, aerodynamics simulation; + power-plant: propeller piston engine, jet engine with afterburner, rocket, + glider. + +- Instrumentation: magnetic compass, classic panel (attitude indicator, airspeed + indicator, altitude indicator, turn and slip indicator, climb speed + indicator), HSI and RNAV calculator, ADF, head-up display, autopilot, direct + stick control or rate stick control. + +- Weapon systems: radar, radar warning receiver, missiles, cannon, drop bombs; + robot opponents can be generated for ACM techniques practicing. + +- Multiplayer capability through the standard DIS network protocol; up to 31 + remote players supported. + +- Sound effects. + +- Extensible sceneries for several areas of the world, with navigation charts + including airports, NDB, VOR, ILS. + +- Allow to choose the departure date and time, airport and runway; allows to + fly freely around the globe (sceneries are loaded dynamically, where + available). + +Sources and binary packages are available from +http://www.icosaedro.it/acm/download.html + +Please read the INSTALL.txt file for more about system requirements, compilation +procedure and basic usage of the program. The doc/ directory contains a +detailed reference manual and other useful documents. + + +Layout of the package +--------------------- + +Here is summary of the contents of the ACM source package. +The Windows binary package may contain only the essential part of these files +and directories. + +acm.tcl Launcher for the src/acm.exe simulator. Requires the TCL interpreter. +CHANGES.txt Latest changes are listed here. +COPYING.txt GNU GPL license; most of the source refers to this one. +doc Documentation and reference manual. +doc/charts Basic navigation charts generated from the available sceneries + using the tools/chart/chart.exe program (see below). +doc/manual/acmdoc.html ACM Reference Manual (START HERE!). +doc/acm.man Very basic ACM "troff" manual page (Unix-like systems only). +objects Inventory of planes, zones, sceneries etc. acm.exe needs this dir. +objects/WMM.COF Coefficients for the World Magnetic Model library. +objects/zones.txt Zones of the Earth covered by the available seneries. +objects/zones/ The sceneries. USA sceneries generated from FAA data base. +src All the sources in C language. Makefiles made with make-makefile. +src/acm The actual simulator. +src/dis DIS protocol library and tools. +src/dis/server/dis_relay.exe DIS relay program. +src/gedit Very basic aircraft model editor. DOES NOT WORK ON 64-BITS PC. +src/util Utility libraries. +src/V Very efficient, lightweight, 3D graphic library. +src/wmm World Magnetic Model library. +test Test programs. +tools/build-doxygen-doc.sh Bash script to generate Doxygen docs from sources. + Mostly useful to check for missing or non-compliant DocBlocks. +tools/chart Program to generate navigation charts from ACM sceneries. +tools/faaairports Program to generate sceneries from the USA FAA data base. +CHANGES.txt Chronological list of the changes to the ACM program since its + version 2 back in the '90! +COPYING.txt GNU GPL license covering most of the code. Where not stated + otherwise, the license is public domain. +INSTALL.txt Basic installation instructions. See also the ACM Reference Manual. +Makefile Global, do-it-all makefile. Works on Linux only, though... + Under Windos + MinGW I had to issue the "make" command under the + src/acm directory (or any specific directory of interest). +README.txt This file. +TODO.txt Known bugs and wanted features. +acm.tcl Handy launcher interface. Requires the tck/tk interpreter. + + +Development of the source +------------------------- + +This version of ACM compiles and has been tested under these systems: + + - Slackware 14.2, x86_64 (Linux). + - Slackware 14.1, x86_32 (Linux). + - Windows 7 Starter, x86_32 + MinGW system development kit. + +Each Makefile has been generated using the make-makefile program available at +http://cvs.icosaedro.it:8080/viewvc/public/tools + +The CVS repository is available at: +http://cvs.icosaedro.it:8080/viewvc/public/acm (HTML interface) +http://www.icosaedro.it/cvs.html (anonymous cvs access instructions) + + +Enjoy! + +Umberto Salsi (salsi@icosaedro.it) +Bologna, Italy +2017-10-29 diff -Nru acm-5.0/src/acm/acm.c acm-6.0+20200416/src/acm/acm.c --- acm-5.0/src/acm/acm.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/acm.c 2018-04-02 06:09:56.000000000 +0000 @@ -0,0 +1,639 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1998 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#include +#include +#include +#include + +#include "../util/error.h" +#include "../util/memory.h" +#include "../util/reader.h" +#include "../util/units.h" +#include "air.h" +#include "box.h" +#include "damage.h" +#include "dis_if.h" +#include "drone.h" +#include "effects.h" +#include "gear.h" +#include "init.h" +#include "joystick.h" +#include "list.h" +#include "m61a1.h" +#include "manifest.h" +#include "mouse.h" +#include "patchlevel.h" +#include "players.h" +#include "pm.h" +#include "render.h" +#include "update.h" + +static char *objects = NULL; /* value of the -objects PATHs option */ +static char * name = NULL; + +// Frame rate (Hz). +static int frame_rate = 20; + +static int use_dis = 0; +static char *dis_relay_name = NULL; +static int dis_relay_port = 3000; +static int dis_site = -1; +static int dis_application = -1; +static int dis_exercise = 1; + +static char *departure_time; + + +/** + * Generic kill callback for remote entities. + * @param c Remote craft/missile/bomb/whatever to remove. + */ +static void disEntityKill(craft *c, char *reason) +{ + int pIndex = c->pIndex; + memory_dispose(c->aps); + gear_free(c); + drone_release_commands(c); + pm_hud_strings_free(c); + + if (c->flags & FL_RECORD) { + --recordCount; + } + + if (c->flags & FL_BLACK_BOX) + box_killPlayer(c->pIndex); + + dis_if_entityExit(c->disId); + memory_zero(c); + + c->pIndex = pIndex; + c->type = CT_FREE; +} + + +/** + * Entity creation callback to be set in the dis_if module. Invoked when a new + * remote entity state DIS PDU appears. + * @param eid Handle the dis_if module assigned to this new entity. + * @param etype DIS entity type. + * @param force One of the DISForceXxx constants. + * @param cptr Here we return NULL if we are not interested to follow this + * entity. Otherwise, here we set the craft or missile we associate to that + * new remote entity. + */ +static void +disEntityEnterCb(int eid, dis_entity_type * etype, DISForce force, craft ** cptr) +{ + int i, top, mtype; + craftType *p; + craft *tbl; + + *cptr = NULL; + + /* Determines which table to insert into: */ + if (etype->kind == DISKindPlatform) { + tbl = ptbl; + top = manifest_MAXPLAYERS; + mtype = CT_DIS_PLANE; + } + else if (etype->kind == DISKindMunition) { + tbl = mtbl; + top = manifest_MAXPROJECTILES; + mtype = CT_DIS_MUNITION; + } + else { + return; + } + + /* + * If no picture available for the entity, try UFO instead. + */ + p = inventory_craftTypeSearchByEntityType(etype); + if (p == NULL) { + printf("entering entity %s not found in the inventory\n", + dis_entityTypeToString(etype)); + p = inventory_craftTypeSearchByZoneAndName(NULL, "UFO"); + } + if( p == NULL ) + return; + + /* Search a free entry: */ + craft *c = NULL; + for (i = 0; i < top; ++i) { + if (tbl[i].type == CT_FREE) { + c = &tbl[i]; + break; + } + } + if (c == NULL ){ + if( tbl == ptbl ) + fprintf(stderr, "Sorry, cannot store remote craft, table is full: %d\n", manifest_MAXPLAYERS); + else + fprintf(stderr, "Sorry, cannot store remote munition, table is full: %d\n", manifest_MAXPROJECTILES); + return; + } + + memory_zero(c); + c->pIndex = i; /* here restores pIndex we just reset :-) */ + c->type = mtype; + c->force = force; + c->createTime = curTime; + c->vl = NULL; + c->disId = eid; + c->cinfo = p; + memory_strcpy(c->name, sizeof(c->name), "DIS"); + c->flags = 0; + c->radarMode = RM_OFF; + c->curRadarTarget = -1; + if( c->type == CT_DIS_PLANE ){ + pm_hud_strings_alloc(c); + gear_allocate(c); + gear_up(c); + } + c->update = dis_if_updateRemote; + c->kill = disEntityKill; + + *cptr = c; +} + +/** + * Detonation callback to be set in the dis_if module and invoked by the + * dis_module when a DIS detonation PDU is received. Establishes the damage of + * the target and possibly kills the target. Also creates an explosion effect. + * @param ftype dis_if_FIRE_M61A1 or dis_if_FIRE_AIM9M. + * @param firing Firing entity. + * @param target Target craft. + * @param time Ignored. + * @param worldLocation Point of impact, that is where the missile where when + * it exploded. + * @param entityLocation Location of the detonation in the reference system of + * the target (m). Used for damage assessment of missiles and bombs. + * @param munition The munition that hit the target (missile, bomb, cannon shell). + * @param dpdu Detonation DIS PDU. + */ +static void +disDetonationCb(int ftype, + craft *firing, + craft *target, + double time, + double *worldLocation, + double *entityLocation, + craft * munition, + dis_detonation_pdu *dpdu) +{ + VPoint Sg, rvel, tmp; + double exp_diameter, dist_meters, vel_meters_per_sec; + char reason[1000]; + + Sg.x = worldLocation[0]; + Sg.y = worldLocation[1]; + Sg.z = worldLocation[2]; + + /* If the target is a local player, damage him: */ + if (target != NULL && (target->type == CT_PLANE || target->type == CT_DRONE) ){ + + /* impact distance from C.G. */ + dist_meters = VMagnitude((VPoint *)entityLocation); + + /* impact velocity */ + tmp.x = units_FEETtoMETERS(target->Cg.x); + tmp.y = units_FEETtoMETERS(target->Cg.y); + tmp.z = units_FEETtoMETERS(target->Cg.z); + VReverseTransform_(&tmp, &target->XYZtoNED, &rvel); + rvel.x = dpdu->vel.x - rvel.x; + rvel.y = dpdu->vel.y - rvel.y; + rvel.z = dpdu->vel.z - rvel.z; + vel_meters_per_sec = VMagnitude(&rvel); + if( damage_absorbDISDamage(target, + &dpdu->burst.munition, + dpdu->burst.warhead, + dpdu->burst.fuze, + dist_meters, + vel_meters_per_sec, + &exp_diameter) == 0) { + snprintf(reason, sizeof(reason), "%s fired by %s", + ftype == dis_if_FIRE_M61A1 ? + "cannon shells" : + "something (presumably a missile)", + firing->name + ); + target->kill(target, reason); + + } else { + /* + * Ouch, damage_absorbDISDamage() not invoked, no explosion diameter. + * Here we have either to query the munition table, or set an + * arbitrary "average explosion diameter": + */ + exp_diameter = 10.0; + } + } + + /* Set a generic explosion effect: */ + effects_new_explosion(&Sg, &(VPoint){0.0, 0.0, 0.0}, exp_diameter, 15.0, 1.0); +} + +static int +disInit(void) +{ + int err; + + if( !(0 <= dis_exercise && dis_exercise <= 255) ) + error_external("exercise ID must be in [0,255], %d given", dis_exercise); + if( !(-1 <= dis_site && dis_site <= 65535) ) + error_external("site ID must be in [-1,65535], %d given", dis_site); + if( !(-1 <= dis_application && dis_application <= 65535) ) + error_external("application ID must be in [-1,65535], %d given", dis_application); + + err = dis_if_init(dis_relay_name, dis_relay_port, + dis_exercise, dis_site, dis_application, + disEntityEnterCb, disDetonationCb, m61a1_DISFire); + dis_if_setDRThresholds(manifest_DIS_LOCATION_THRESHOLD, manifest_DIS_ORIENTATION_THRESHOLD); + + return err; +} + + +static void +help() +{ + printf("ACM %s\n", patchlevel_REVISION_STRING); + printf( +"Copyright (C) 1991-1998 Riley Rainey (rrainey@ix.netcom.com)\n" +"Updated and modified by Umberto Salsi (salsi@icosaedro.it)\n" +"ACM comes with ABSOLUTELY NO WARRANTY.\n" +"This is free software, and you are welcome to distribute it under the\n" +"conditions described in the COPYING file.\n"); +} + + +static list_Type * +read_switches_from_file(const char *fname) +{ + FILE *f; + char commands[4096]; + char *argv[100]; + int argc; + int n, err, i; + list_Type *l; + + argv[0] = NULL; + argc = 1; + + f = fopen (fname, "r"); + if( f == NULL ){ + fprintf(stderr, "ERROR: failed to read file `%s'\n", fname); + return NULL; + } + n = fread(commands, 1, sizeof(commands) - 1, f); + err = ferror(f); + fclose(f); + if( err != 0 ){ + fprintf(stderr, "ERROR: failed to read file `%s'\n", fname); + return NULL; + } + if( n == sizeof(commands) - 1 ){ + fprintf(stderr, "ERROR: file `%s' too long\n", fname); + return NULL; + } + + if( n < 1 ) + return NULL; + + if( ! reader_split(commands, &argc, argv, 100) ){ + fprintf(stderr, "ERROR: too many arguments in file `%s'\n", fname); + return NULL; + } + if( argc == 0 ) + return NULL; + + l = list_new(); + for( i = 0; i < argc; i++ ) + list_add_elem(l, argv[i]); + return l; +} + + +static list_Type * +processCommandSwitches(list_Type *args) +{ + int i; + char *a; + list_Type *switches; + + switches = list_new(); + + for (i = 0; i < args->n; ++i) { + + a = args->arr[i]; + + if (strcmp(a, "-h") == 0 || strcmp(a, "-help") == 0 + || strcmp(a, "--help") == 0 || strcmp(a, "-version") == 0 + || strcmp(a, "-copyright") == 0) { + help(); + exit(0); + } + else if (strcmp(a, "-objects") == 0 && ++i < args->n) { + memory_dispose(objects); + objects = memory_strdup(args->arr[i]); + } + else if (strcmp(a, "-no-dis") == 0) { + /* + * FIXME: the -no-dis option now useless. + * Networking is enabled if any -dis-* option is set. + */ + use_dis = 0; + } + else if (strcmp(a, "-dis-relay-name") == 0 && ++i < args->n) { + memory_dispose(dis_relay_name); + dis_relay_name = memory_strdup(args->arr[i]); + use_dis = 1; + } + else if (strcmp(a, "-dis-relay-port") == 0 && ++i < args->n) { + dis_relay_port = strtol(args->arr[i], (char **) NULL, 0); + use_dis = 1; + } + else if (strcmp(a, "-dis-site") == 0 && ++i < args->n) { + dis_site = strtol(args->arr[i], (char **) NULL, 0); + use_dis = 1; + } + else if (strcmp(a, "-dis-appl") == 0 && ++i < args->n) { + dis_application = strtol(args->arr[i], (char **) NULL, 0); + use_dis = 1; + } + else if (strcmp(a, "-dis-exercise") == 0 && ++i < args->n) { + dis_exercise = strtol(args->arr[i], (char **) NULL, 0); + use_dis = 1; + } + else if (strcmp(a, "-dis-absolute-time") == 0) { + dis_if_haveAbsoluteTime = 1; + use_dis = 1; + } + else if (strncmp(a, "-dis", 4) == 0) { + fprintf(stderr, "Acm DIS arguments:\n" + " -dis-relay-name (default: use broadcasting)\n" + " -dis-relay-port (default: 3000)\n" + " -dis-exercise (default %d)\n" + " -dis-site (default %d)\n" + " -dis-appl (default %d)\n" + " -dis-absolute-time\n", + dis_exercise, dis_site, dis_application); + } + else if (strcmp(a, "-init") == 0 && ++i < args->n) { + list_Type *q; + + q = read_switches_from_file(args->arr[i]); + list_add_list(switches, q); + memory_dispose(q); + } + else if (strcmp(a, "-arcade") == 0) { + arcadeMode = 1; + } + else if (strcmp(a, "-da") == 0 && ++i < args->n) { + drone_set_aggressiveness( atof(args->arr[i]) ); + } + else if (strcmp(a, "-drone-mode") == 0 && ++i < args->n) { + if( strcmp(args->arr[i], "DOG_FIGHT") == 0 ) + drone_set_mode(drone_DOG_FIGHT_MODE); + else if( strcmp(args->arr[i], "HUNTING") == 0 ) + drone_set_mode(drone_HUNTING_MODE); + else + error_external("invalid argument for -drone-mode option, must be DOG_FIGHT or HUNTING: %s", args->arr[i]); + } + else if (strcmp(a, "-display") == 0 && ++i < args->n) { + setenv("DISPLAY", args->arr[i], 1); + } + else if (strcmp(a, "-geometry") == 0 && ++i < args->n) { + list_add_elem(switches, "-geometry"); + list_add_elem(switches, args->arr[i]); + } + else if (strcmp(a, "-eye_to_screen_cm") == 0 && ++i < args->n) { + eye_to_screen_cm = atof(args->arr[i]); + } + else if (strcmp(a, "-downward_view_angle_deg") == 0 && ++i < args->n) { + downward_view_angle_rad = units_DEGtoRAD( atof(args->arr[i]) ); + } + else if (strcmp(a, "-js") == 0 && i+1 < args->n) { + if (args->arr[i + 1][0] != '-') { + joystick_setPort(args->arr[++i]); + } + else { + joystick_setPort("/dev/cua0"); + } + } + else if (strcmp(a, "-name") == 0 && ++i < args->n) { + memory_dispose(name); + name = memory_strdup(args->arr[i]); + } + else if (strcmp(a, "-plane") == 0 && ++i < args->n) { + list_add_elem(switches, "-plane"); + list_add_elem(switches, args->arr[i]); + } + else if (strcmp(a, "-fuel") == 0 && ++i < args->n) { + list_add_elem(switches, "-fuel"); + list_add_elem(switches, args->arr[i]); + } + else if (strcmp(a, "-payload") == 0 && ++i < args->n) { + list_add_elem(switches, "-payload"); + list_add_elem(switches, args->arr[i]); + } + else if (strcmp(a, "-stealth") == 0) { + list_add_elem(switches, "-stealth"); + } + else if (strcmp(a, "-end-game") == 0) { + list_add_elem(switches, "-end-game"); + } + else if (strcmp(a, "-threshold-range") == 0 && ++i < args->n) { + double end_game_threshold_nm; + + end_game_threshold_nm = atof( args->arr[i] ); + if (end_game_threshold_nm < 1.0) { + end_game_threshold_nm = 1.0; + } + end_game_threshold_meters = units_FEETtoMETERS(end_game_threshold_nm*units_NmToFeetFactor); + } + else if (strcmp(a, "-force") == 0 && ++i < args->n) { + list_add_elem(switches, "-force"); + list_add_elem(switches, args->arr[i]); + } + else if (strcmp(a, "-departure-time") == 0 && ++i < args->n) { + memory_dispose(departure_time); + departure_time = memory_strdup(args->arr[i]); + } + else if (strcmp(a, "-latitude") == 0 && ++i < args->n) { + list_add_elem(switches, "-latitude"); + list_add_elem(switches, args->arr[i]); + } + else if (strcmp(a, "-longitude") == 0 && ++i < args->n) { + list_add_elem(switches, "-longitude"); + list_add_elem(switches, args->arr[i]); + } + else if (strcmp(a, "-altitude") == 0 && ++i < args->n) { + list_add_elem(switches, "-altitude"); + list_add_elem(switches, args->arr[i]); + } + else if (strcmp(a, "-heading") == 0 && ++i < args->n) { + list_add_elem(switches, "-heading"); + list_add_elem(switches, args->arr[i]); + } + else if (strcmp(a, "-airspeed-kt") == 0 && ++i < args->n) { + list_add_elem(switches, "-airspeed-kt"); + list_add_elem(switches, args->arr[i]); + } + else if (strcmp(a, "-visibility") == 0 && ++i < args->n) { + render_setVisibility( units_NMtoMETERS(atof(args->arr[i]) ) ); + } + else if( strcmp(a, "-clouds-range") == 0 && i+2 < args->n ){ + render_setClouds( units_FEETtoMETERS(atof(args->arr[i+1])), + units_FEETtoMETERS(atof(args->arr[i+2]))); + i += 2; + } + else if (strcmp(a, "-ground-mode") == 0 && ++i < args->n ){ + a = args->arr[i]; + if( strcmp(a, "flat") == 0 ) + render_setGroundDepth(render_GROUND_FLAT); + else if( strcmp(a, "tiled") == 0 ) + render_setGroundDepth(render_GROUND_TILED); + else + error_external("invalid -render-ground-mode: must be flat or tiled, %s given", a); + } + else if (strcmp(a, "-wind") == 0 && ++i < args->n) { + double wd, wv; + if( sscanf(args->arr[i], "%lf/%lf", &wd, &wv) != 2 ) + error_external("invalid parameter for -wind. Expected DIRECTION/VELOCITY"); + air_set_wind(wd, wv); + } + else if (strcmp(a, "-gust") == 0 && ++i < args->n) { + air_set_gust( atof(args->arr[i]) ); + } + else if (strcmp(a, "-no-sound") == 0 ) { + list_add_elem(switches, "-no-sound"); + } + else if (strcmp(a, "-frame-rate") == 0 && ++i < args->n) { + frame_rate = atoi(args->arr[i]); + if( frame_rate < 1 ) + frame_rate = 1; + } + else if (strcmp(a, "-transfer-entity-mode") == 0 && ++i < args->n) { + transferEntityIdBits = strtol ( args->arr[i], NULL, 0 ); + } + else if (strcmp(a, "-subject-entity-id") == 0 && ++i < args->n) { + dis_entity_id id; + if (dis_parseEntityID ( &id, args->arr[i], + strlen(args->arr[i])+1, ":/." ) == 0) { + subjectEntityID = id; + subjectEntitySpecified = 1; + } + else { + error_external("invalid entity ID \"%s\"", args->arr[i]); + } + } + else if (strcmp(a, "-mouse-mode") == 0 && ++i < args->n) { + a = args->arr[i]; + if( strcmp(a, "fast") == 0 ) + mouse_stick_mode = mouse_FAST; + else if( strcmp(a, "normal") == 0 ) + mouse_stick_mode = mouse_NORMAL; + else if( strcmp(a, "precise") == 0 ) + mouse_stick_mode = mouse_PRECISE; + else + error_external("invalid mouse mode \"%s\", must be fast|normal|precise", a); + } + else if (strcmp(a, "-hud-mode") == 0 ) { + list_add_elem(switches, "-hud-mode"); + } + else { + error_external("unknown command line option `%s' or missing mandatory value of the option", args->arr[i]); + } + } + + return switches; +} + + +int +main(int argc, char **argv) +{ + list_Type *args, *newPlayerSwitches; + int i; + + error_init("ACM-" patchlevel_REVISION_STRING); + + curTime = 0.0; + mouse_stick_mode = mouse_NORMAL; + eye_to_screen_cm = 50.0; + downward_view_angle_rad = units_DEGtoRAD(15.0); + + /* + * An endGameThreshold of -1.0 means "use the radar lock range for + * the current aircraft. + */ + + end_game_threshold_meters = -1.0; + end_game_mode = 0; + + /* + * When accepting control of an entity, the default is to use our + * site ID and keep everything else the same. + */ + + transferEntityIdBits = 0x4; + + dis_if_haveAbsoluteTime = 0; + + ptblCount = ctblCount = 0; + + /* Parse command line arguments. */ + args = list_new(); + for ( i = 1; i < argc; i++ ) + list_add_elem(args, argv[i]); + newPlayerSwitches = processCommandSwitches(args); + memory_dispose(args); + if( name == NULL ) + name = memory_strdup("Anonymous"); + + /* Init DIS module interface. */ + /* Define handler for DIS transfer control requests. */ + dis_if_setTransferControlRequestCallback ( dis_if_transferControlRequestHandler ); + dis_if_enableNetwork(use_dis); + if( disInit() != 0 ) + error_external("DIS protocol initialization failed"); + + /* Init ACM global variables. */ + init_init(objects, departure_time); + + /* Create 1 player. */ + if( ! players_new(name, newPlayerSwitches) == 0 ) + return 1; + + /* Do simulation until player dies or quits. */ + update_loop(frame_rate); + + /* Release all global stuff. */ + init_term(); + + memory_dispose(newPlayerSwitches); + memory_dispose(name); + memory_dispose(objects); + memory_dispose(dis_relay_name); + memory_dispose(departure_time); + return memory_report(); +} + + diff -Nru acm-5.0/src/acm/adf.c acm-6.0+20200416/src/acm/adf.c --- acm-5.0/src/acm/adf.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/adf.c 2020-04-16 12:05:39.000000000 +0000 @@ -0,0 +1,390 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1998 Riley Rainey + * Copyright (C) 2007 Umberto Salsi + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#include +#include +#include "../util/memory.h" +#include "pm.h" +#include "navaid.h" +#include "vpath_gallery.h" + +#define adf_IMPORT +#include "adf.h" + +/** Repeat station reception check every ... (s). */ +#define RECEPTION_CHECK_INTERVAL 1.0 + +/* Every station sends its Morse ID every ... (s). */ +#define ID_DELAY 10.0 + +/** + * State of the ADF display panel. + */ +typedef struct adf_data { + /** Next ADF in the list. */ + struct adf_data *next; + /** Associated viewer. */ + viewer * v; + /** If currently visible, as the panel slot is shared with radar and HSI. */ + _BOOL enabled; + /** Tuned frequency. */ + navaid_Channel frequency; + /** Tuned station, if in range. */ + navaid_Type *station; + /** Next planned station tuning check (simulation time, s). */ + double next_check; + /** Next expected ID transmission from tuned station (simulation time, s). */ + double id_update_at; + /** Current station ID, if available. */ + char *id; + /** Current needle heading (DEG). */ + int hdg; +} adf_data; + + +static adf_data *free_list = NULL; + + +/** + * Module cleanup function to be registered in the memory manager. + */ +static void adf_cleanup() +{ + adf_data *p; + + while( free_list != NULL ){ + p = free_list; + free_list = free_list->next; + memory_dispose(p); + } +} + + +void adf_enable(viewer *u) +{ + adf_data *adf; + + if( u->adf == NULL ){ + + /* Allocate memory for ADF status: */ + if( free_list == NULL ){ + adf = memory_allocate( sizeof(adf_data), NULL); + memory_registerCleanup(adf_cleanup); + } else { + adf = free_list; + free_list = adf->next; + } + + /* Initialize: */ + adf->v = u; + adf->frequency = 200; + adf->station = NULL; + adf->next_check = curTime + RECEPTION_CHECK_INTERVAL; + adf->id_update_at = curTime + ID_DELAY; + adf->id = NULL; + adf->hdg = 0; + + u->adf = adf; + } else { + adf = u->adf; + } + + if( ! adf->enabled ){ + adf->enabled = TRUE; + adf->station = NULL; + adf->next_check = curTime + RECEPTION_CHECK_INTERVAL; + adf->id_update_at = curTime + ID_DELAY; + adf->id = NULL; + } +} + + +void adf_disable(viewer *u) +{ + adf_data *adf; + + adf = u->adf; + if( adf == NULL ) + return; + + adf->enabled = FALSE; +} + + +static void adf_retune(adf_data *adf) +{ + adf->station = NULL; + adf->next_check = curTime + RECEPTION_CHECK_INTERVAL; + adf->id_update_at = curTime + ID_DELAY; + adf->id = NULL; +} + + +static void adf_update_reception(craft *c, adf_data *adf) +{ + navaid_Type *n; + + if( curTime < adf->next_check ) + return; + + adf->next_check = curTime + RECEPTION_CHECK_INTERVAL; + + n = navaid_reception_check(c, adf->frequency); + + if( n == NULL ){ + /* no station found. */ + adf->station = NULL; + adf->id_update_at = curTime + ID_DELAY; + adf->id = NULL; + + } else if( adf->station != n ){ + /* Station change: */ + adf->station = n; + adf->id_update_at = curTime + ID_DELAY; + adf->id = NULL; + } else { + /* Still the same station. Update station ID: */ + if( adf->id == NULL && curTime > adf->id_update_at ){ + adf->id = n->id; + } + } +} + + +static _BOOL is_auto_repeat( double *timeout ) +{ + _BOOL res; + + res = (curTime < *timeout); + *timeout = curTime + 0.1; + return res; +} + + +void adf_frq_inc(viewer * u, int step) +{ + adf_data *adf; + static double timeout = 0.0; + + adf = u->adf; + if( adf == NULL || ! adf->enabled ) + return; + + if( is_auto_repeat(&timeout) ) + step *= 2; + adf->frequency += step; + if( adf->frequency < navaid_NDB_CHANNEL_MIN ) + adf->frequency = navaid_NDB_CHANNEL_MIN; + if( adf->frequency > navaid_NDB_CHANNEL_MAX ) + adf->frequency = navaid_NDB_CHANNEL_MAX; + adf_retune(adf); +} + + +void adf_hdg_inc(viewer *u, int step) +{ + adf_data *adf; + static double timeout = 0.0; + + adf = u->adf; + if( adf == NULL || ! adf->enabled ) + return; + + if( is_auto_repeat(&timeout) ) + step *= 2; + adf->hdg += step; + while( adf->hdg < 0 ) + adf->hdg += 360; + while( adf->hdg >= 360 ) + adf->hdg -= 360; +} + + +static void adf_panel_string(viewer *u, double x, double y, double fh, + char *s1, char *s2, char *s3) +{ + double fw, fh2, fw2; + + fw = fh; + + fh2 = 1.5*fh; + fw2 = fh2; + + VDrawStrokeString(u->v, + (int) (x + 0.5), (int) (y + 0.5), + s1, strlen(s1), (int) (fh + 0.5), radarColor); + + VDrawStrokeString(u->v, + (int) (x + 13*fw - fw2*strlen(s2) + 0.5), (int) (y + 0.5), + s2, strlen(s2), (int) (fh2 + 0.5), whiteColor); + + VDrawStrokeString(u->v, + (int) (x + 14*fw + 0.5), (int) (y + 0.5), + s3, strlen(s3), (int) (fh + 0.5), radarColor); +} + + +void adf_panel_draw(viewer * u) +{ + adf_data *adf; + Alib_Window *w; + double x, y, fh, fw, il; + char s[100]; + + adf = u->adf; + if( adf == NULL || ! adf->enabled ) + return; + + adf_update_reception(u->c, adf); + + w = u->v->w; + Alib_setClipRect(w, &u->tuner); + Alib_fillRect(w, &u->tuner, panelBackgroundColor); + + fh = RectWidth(u->tuner) / 20.0; + fw = fh; + il = 1.2*fh*2.5; /* inter-line spacing */ + + x = u->tuner.a.x + fw; + y = u->tuner.a.y + il; + + /* + Displays mode: + */ + adf_panel_string(u, x, y, fh, "Mode", "ADF", ""); + y += il; + + /* + Displays frequency + */ + sprintf(s, "%d", adf->frequency); + adf_panel_string(u, x, y, fh, "FRQ", s, "KHz"); + y += il; + + /* + Displays station ID: + */ + if( adf->id != NULL ) + strcpy(s, adf->id); + else + strcpy(s, "----"); + adf_panel_string(u, x, y, fh, "STA", s, ""); + y += il; + + /* + DIsplays signal level "LVL": + */ + if( ! adf->enabled ) + adf_panel_string(u, x, y, fh, "LVL", "OFF", ""); + if( adf->station == NULL ) + adf_panel_string(u, x, y, fh, "LVL", "no sgn", ""); + else if( adf->id == NULL ) + adf_panel_string(u, x, y, fh, "LVL", "low", ""); + /* FIXME: actually, station ID still not received */ + else + adf_panel_string(u, x, y, fh, "LVL", "good", ""); + y += il; +} + + +void adf_draw(viewer * u) +{ + adf_data *adf; + Alib_Window *w; + int xc, yc, h, x, y; + VMatrix m; + VPoint rloc; + double scale, hdg, r, a; + Alib_Pixel color; + + adf = u->adf; + if( adf == NULL || ! adf->enabled ) + return; + + w = u->v->w; + + Alib_setClipRect(w, &u->indicator); + Alib_fillRect(w, &u->indicator, panelBackgroundColor); + + color = whiteColor; + + x = u->indicator.a.x; + y = u->indicator.a.y; + scale = RectWidth(u->indicator); + r = 0.44*scale; + xc = x + (int) (0.50*scale+0.5); + yc = y + (int) (0.50*scale+0.5); + + if (u->c->showMag) + hdg = pm_mag_heading(u->c); + else + hdg = u->c->curHeading; + + h = (int) (0.045*scale + 0.5); + + /* Displays "TH" or "MH": */ + VDrawStrokeString(u->v, + x + (int) (0.05*scale+0.5), y + (int) (0.06*scale), + (u->c->showMag)? "MH":"TH", 2, h, color); + + /* Draw compass scale: */ + VIdentMatrix(&m); + VRotate(&m, ZRotation, -hdg); + VScaleMatrix(&m, r, r, r); + VTranslate(&m, xc, yc, -1.0); + vpath_stroke( vpath_gallery_get_compass_scale(), &m, w, whiteColor); + + /* Draw fixed scale: */ + VIdentMatrix(&m); + VScaleMatrix(&m, r/0.90, r/0.90, r/0.90); + VTranslate(&m, xc, yc, -1.0); + vpath_stroke( vpath_gallery_get_compass_fixed_scale(), &m, w, whiteColor); + + /* Draw stylized aircraft: */ + VIdentMatrix(&m); + VScaleMatrix(&m, 0.25*r, 0.20*r, 0.25*r); + VTranslate(&m, xc, yc, -1.0); + vpath_stroke( vpath_gallery_get_stylized_aircraft(), &m, w, whiteColor); + + /* Draw selected HDG: */ + VIdentMatrix(&m); + VRotate(&m, ZRotation, -hdg + units_DEGtoRAD(adf->hdg)); + VScaleMatrix(&m, r, r, r); + VTranslate(&m, xc, yc, -1.0); + vpath_stroke( vpath_gallery_get_pointer_triangle(), &m, w, + magentaColor); + + /* Draw pointer: */ + + if( adf->station == NULL ){ + /* No signal -- pointer indicates right: */ + a = units_DEGtoRAD(90.0); + } else { + VTransform(&adf->station->Sg, &u->c->XYZtoNED, &rloc); + VReverseTransform(&rloc, &u->c->trihedral, &rloc); + a = atan2(rloc.y, rloc.x); + } + + VIdentMatrix(&m); + VRotate(&m, ZRotation, a); + VScaleMatrix(&m, 0.90*r, 0.90*r, 0.90*r); + VTranslate(&m, xc, yc, -1.0); + vpath_stroke( vpath_gallery_get_pointer_arrow(), &m, w, whiteColor); + +} diff -Nru acm-5.0/src/acm/adf.h acm-6.0+20200416/src/acm/adf.h --- acm-5.0/src/acm/adf.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/adf.h 2017-03-20 06:04:01.000000000 +0000 @@ -0,0 +1,79 @@ +/* + * acm : an aerial combat simulator for X + * Module implementing the ADF indicator. + * + * Copyright (C) 2007 Umberto Salsi + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#ifndef _adf_h +#define _adf_h + +#include "pm.h" + +#ifdef adf_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +/** + * Allocates and enables the ADF for this particular viewer. + * If u->adf is NULL, instantiate with a pointer to internal data. + */ +EXTERN void adf_enable(viewer *u); + +/** + * Disables and releases the ADF for this particular viewer, leaving u->adf set + * to NULL, or does nothing if already NULL. + */ +EXTERN void adf_disable(viewer *u); + +/** + * Increments station frequency. ADF channels ranges from 200 up to 415 KHz. + * Implements an auto-repeat detection feature that speeds-up this otherwise + * very slow interface. If the auto-repeat gets detected, the increment actually + * applied gets multiplied by a factor that ranges from 2 up to 20. + * @param u + * @param step Either +1 or -1. + */ +EXTERN void adf_frq_inc(viewer *u, int step); + +/** + * Increment heading pointer by 'step' DEG. + * Implements an auto-repeat detection feature that speeds-up this otherwise + * very slow interface. If the auto-repeat gets detected, the increment actually + * applied gets multiplied by a factor that ranges from 2 up to 20. + * @param u + * @param step Either +1 or -1. + */ +EXTERN void adf_hdg_inc(viewer *u, int step); + +/** + * Draws the ADF instrument in the TEWS panel. If no ADF active in this viewer, + * does nothing. + * @param u + */ +EXTERN void adf_panel_draw(viewer * u); + +/** + * Draws the ADF compass card and OBS pointer. If no ADF active in this viewer, + * does nothing. + * @param u + */ +EXTERN void adf_draw(viewer * u); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/aim120.c acm-6.0+20200416/src/acm/aim120.c --- acm-5.0/src/acm/aim120.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/aim120.c 2017-10-20 00:21:36.000000000 +0000 @@ -0,0 +1,417 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1998 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#include +#include +#include +#include "pm.h" +#include "../util/memory.h" +#include "missile.h" +#include "init.h" +#include "inventory.h" +#include "weapon.h" +#include "sounds.h" +#include "gear.h" +#include "../util/units.h" + +#define aim120_IMPORT +#include "aim120.h" + +static int hasFired[manifest_MAXPLAYERS]; +static int count[manifest_MAXPLAYERS]; + +/* + * AIM-120 selection function + * + * A selection function normally determines whether there are any weapons + * of this type on-board. If so, and the weapon system is functional + * (in other words, undamaged) then return 1; otherwise return 0. + */ + +static int +select_aim120(craft * c) +{ + hasFired[c->pIndex] = 0; + count[c->pIndex] = weapon_countOrdinance(c, weapon_AIM120); + return 1; + +} + + +#ifdef FIXME_NOT_USED +static double +Rmax(craft *c) +{ + return 40.0 * units_NmToFeetFactor; +} +#endif + + +#ifdef FIXME_NOT_USED +static void +computeASECircleParameters(craft *c, + double * ASE_diameter_millirad, + double * ASE_dot_az_millirad, + double * ASE_dot_el_millirad) +{ + double range_feet, rmax_feet = Rmax(c), hs, omegay, omegap, h; + VPoint v, t, vrel; + craft *target; + radarInfo *pr = NULL, *p; + int i; + + /* + * find target information entry in the radar info table + */ + + for (i = 0, p = c->rinfo; i < c->rtop; ++i, ++p) { + if (c->curRadarTarget == p->targetID ) { + pr = p; + break; + } + } + + /* + * Without a radar lock, display only the ASE circle. + * + * We represent this case by passing the ASE diameter as a negative value. + */ + + if ( c->curRadarTarget == -1 || pr == NULL) { + *ASE_diameter_millirad = -130.0; + *ASE_dot_az_millirad = 0.0; + *ASE_dot_az_millirad = 0.0; + return; + } + + target = &ptbl[c->curRadarTarget]; + + /* + * Range greater than Rmax? Place aircraft and target on + * a lead collision course. + */ + + VSub(&target->Cg, &c->Cg, &v); + + /* + * t becomes relative position of target wrt to aircraft body axes (feet) + */ + + t = pr->rel; + + VReverseTransform_( &v, &c->trihedral, &vrel ); + + /* + * If range is less than Rmax, compute lead collision based on aircraft + * plus missile velocity, not just our aircraft's velocity. + */ + + if (range_feet < rmax_feet) { + + vrel.x -= 1000.0; /* 1,000 fps is just a SWAG */ + + } + + hs = t.x * t.x + t.y * t.y; + + /* + * Omega values are rates of azimuth and elevation changes (rad/sec) + */ + + omegay = (vrel.y * t.x - vrel.x * t.y) / hs; + + omegap = (vrel.z * hs - t.z * (vrel.x * t.x + vrel.y * t.y)) / + (sqrt(hs) * (hs + t.z * t.z)); + + /* + * Just SWAGs here ... + */ + + *ASE_diameter_millirad = 130.0; + *ASE_dot_az_millirad = units_RADtoDEG(omegay) * 150.0; + *ASE_dot_el_millirad = units_RADtoDEG(omegap) * 150.0; + + h = sqrt ( + *ASE_dot_az_millirad * *ASE_dot_az_millirad + + *ASE_dot_el_millirad * *ASE_dot_el_millirad + ); + + /* + * Limit ASE "dot" to position just outside the circle + */ + + if (h > 70.0) { + *ASE_dot_az_millirad = *ASE_dot_az_millirad * 70.0 / h; + *ASE_dot_el_millirad = *ASE_dot_el_millirad * 70.0 / h; + } + +} +#endif + + +static int +update_aim120(craft * c) +{ + int i; + + if( ! hasFired[c->pIndex] ) + return 1; + + hasFired[c->pIndex] = 0; /* reset fire request */ + + /* + * Missile won't fire if we have "Weight on wheels" + * or if we run out of ammunition. + */ + + if( gear_someWheelGroundContact(c) + || count[c->pIndex] <= 0 ) + return 1; + + /* Get station from which to launch the missile: */ + i = weapon_getReadyStation(c, weapon_AIM120); + if (i < 0){ + fprintf(stderr, "Oops. Can't find an AIM-120\n"); + return 1; + } + + /* + * Decrement missiles counter. + * In arcade mode, we never run out of ammunition + */ + + if (arcadeMode == 0) { + c->station[i].id = -1; + count[c->pIndex]--; + } + + /* Launch missile from station i: */ + missile_fire(c, i); + sounds_playSound(c, sounds_MissileLaunch, FALSE); + + return 1; +} + +static int +fire_aim120(craft * c) +{ + hasFired[c->pIndex] = 1; + return 1; +} + + +#ifdef FIXME_NOT_USED +static double +missileTimeToImpact (craft * c, craftType * w) +{ + double v, t, root1, root2, r, a1, d, n; + + v = c->VT; + a1 = (w->maxThrust - 0.5 * c->rho * w->CDOrigin * v * v) + / (w->emptyWeight + w->maxFuel) * units_earth_g; + + if (c->curRadarTarget >= 0 && a1 >= 0.0) { + + d = c->targetDistance; + r = c->targetClosure; + + n = r * r + 2.0 * a1 * d; + if (n > 0) { + n = sqrt(n); + root1 = (-r + n) / a1; + root2 = (-r - n) / a1; + if (root1 >= 0.0) + if (root2 >= 0.0) + if (root1 < root2) + t = root1; + else + t = root2; + else + t = root1; + else if (root2 >= 0.0) + t = root2; + else + t = -1.0; + } + else + t = -1.0; + } + + else { + t = -1.0; + } + + return t; + +} +#endif + + +/* + * AIM-120 display function + * + * Update the HUD display strings associated with this weapon system. + * c = the aircraft. + * w = the missile's description record. + * dummy1, dummy2 = ignored, not set. + * + * This code may be called by drones, so the viewer may be NULL. + * + * Return a nonzero value if have a reasonable chance of scoring a kill. + */ + +static int +display_aim120(craft * c, craftType * w, viewer * unused, int dummy1, int dummy2) +{ + + char s[16]; + double d, a1, v, r, root1, root2, n, t; + int target; + + sprintf(s, "%d %s", count[c->pIndex], weapon_idToName(weapon_AIM120)); + strcpy(c->leftHUD[3], s); + +/* + * Compute time to target t. Gives < 0.0 if no target available or not + * reachable. + */ + + target = c->curRadarTarget; + v = VMagnitude(&c->Cg); + a1 = (w->maxThrust - 0.5 * c->air.rho * w->CDOrigin * v * v) + / (w->emptyWeight + w->maxFuel) * units_earth_g; + + if (target >= 0 && a1 >= 0.0) { + + d = c->targetDistance; + r = c->targetClosure; + + n = r * r + 2.0 * a1 * d; + if (n > 0) { + n = sqrt(n); + root1 = (-r + n) / a1; + root2 = (-r - n) / a1; + if (root1 >= 0.0) + if (root2 >= 0.0) + if (root1 < root2) + t = root1; + else + t = root2; + else + t = root1; + else if (root2 >= 0.0) + t = root2; + else + t = -1.0; + } + else + t = -1.0; + } + + else + t = -1.0; + +/* + * Update HUD display strings. + */ + + if (t < 0.0) + sprintf(s, "ARM --"); + else if (target >= 0 && t >= (w->armDelay + 0.5) && t <= 90.0) + sprintf(s, "LOCKED %d", (int) (t + 0.5)); + else if (t <= 90.0) + sprintf(s, "IN RANGE %d", (int) (t + 0.5)); + else + sprintf(s, "ARM %d", (int) (t + 0.5)); + + strcpy(c->leftHUD[2], s); + + strcpy(c->leftHUD[4], ""); + +/* + * Return TRUE if we are recommending a missile shot. + */ + + return target >= 0 && t >= (w->armDelay + 0.5) && t <= 90.0; +} + + +static weapon_Type aim120Desc = +{ + select_aim120, /* select */ + update_aim120, /* update */ + display_aim120, /* display procedure */ + fire_aim120, /* fire */ + (int (*)(craft *)) NULL, /* fire button release */ +}; + +weapon_Type * +aim120_new(void) +{ + + craftType *c; + FILE *f; + dis_entity_type em1 = + {2, 1, 225, 1, 2, 1, 0}; + dis_entity_type em2 = + {0, 0, 0, 0, 0, 0, 0}; + + c = inventory_craftTypeNew(NULL); + c->name = memory_strdup( weapon_idToName(weapon_AIM120) ); + + c->entityType = em1; + c->altEntityType = em2; + + aim120Desc.w = c; + + c->CDOrigin = 0.2; /* 5" radius of body */ + c->CDFactor = -2.56694; + + c->CDBOrigin = 0.0; + c->CDBFactor = 0.0; + + VIdentMatrix(&(c->I)); + c->I.m[0][0] = 0.0; + c->I.m[1][1] = 0.0; + c->I.m[2][2] = 0.0; + c->cmSlope = -1.88; + + c->wingS = 1.0; + +/* + * Assume 150.0 lb of weight is fuel and that it burns for about 4 seconds. + * That yields a fuel burn rate of 40 lb/s. + */ + + c->emptyWeight = 100.0; + c->maxFuel = 234.0; + c->maxThrust = 2500.0; + c->spFuelConsump = 16.0; /* Isp = 220, SFC = 3600.0 / Isp */ + +/* + * Three seconds arm delay: + */ + + c->armDelay = 3.0; + + f = init_fopen("missiles/aim9.obv", "r"); /* FIXME: missing custom image */ + c->object = VReadObject(f); + fclose(f); + + return &aim120Desc; +} diff -Nru acm-5.0/src/acm/aim120.h acm-6.0+20200416/src/acm/aim120.h --- acm-5.0/src/acm/aim120.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/aim120.h 2017-03-20 06:04:01.000000000 +0000 @@ -0,0 +1,36 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1998 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#ifndef _aim120_h +#define _aim120_h + +#include "weapon.h" + +#ifdef aim120_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +/** + * Creates weapon description record for the AIM-120 missile. + */ +EXTERN weapon_Type * aim120_new(void); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/aim9m.c acm-6.0+20200416/src/acm/aim9m.c --- acm-5.0/src/acm/aim9m.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/aim9m.c 2017-10-20 00:21:36.000000000 +0000 @@ -0,0 +1,271 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1994,1997 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#include +#include +#include +#include "pm.h" +#include "init.h" +#include "inventory.h" +#include "missile.h" +#include "../util/memory.h" +#include "weapon.h" +#include "sounds.h" +#include "gear.h" + +#define aim9m_IMPORT +#include "aim9m.h" + +static int select_aim9m(craft *); +static int display_aim9m(craft *, craftType *, viewer *, int, int); +static int update_aim9m(craft *); +static int fire_aim9m(craft *); + +static weapon_Type aim9mDesc = +{ + select_aim9m, /* select */ + update_aim9m, /* update */ + display_aim9m, /* display procedure */ + fire_aim9m, /* fire */ + (int (*)(craft *)) NULL, /* fire button release */ +}; + +static int hasFired[manifest_MAXPLAYERS]; +static int count[manifest_MAXPLAYERS]; + +/* + * AIM-9M selection function + * + * A selection function normally determines whether there are any weapons + * of this type on-board. If so, and the weapon system is functional + * (in other words, undamaged) then return 1; otherwise return 0. + */ + +static int +select_aim9m(craft * c) +{ + hasFired[c->pIndex] = 0; + count[c->pIndex] = weapon_countOrdinance(c, weapon_AIM9M); + return 1; +} + +static int +update_aim9m(craft * c) +{ + int i; + + if( ! hasFired[c->pIndex] ) + return 1; + + hasFired[c->pIndex] = 0; /* reset fire request */ + + /* + * Missile won't fire if we have "Weight on wheels" + * or if we run out of ammunition. + */ + + if( gear_someWheelGroundContact(c) + || count[c->pIndex] <= 0 ) + return 1; + + /* Get station from which to launch the missile: */ + i = weapon_getReadyStation(c, weapon_AIM9M); + if (i < 0){ + fprintf(stderr, "Oops. Can't find an AIM-9\n"); + return 1; + } + + /* + * Decrement missiles counter. + * In arcade mode, we never run out of ammunition + */ + + if (arcadeMode == 0) { + c->station[i].id = -1; + count[c->pIndex]--; + } + + /* Launch missile from station i: */ + missile_fire(c, i); + sounds_playSound(c, sounds_MissileLaunch, FALSE); + + return 1; +} + +static int +fire_aim9m(craft * c) +{ + hasFired[c->pIndex] = 1; + return 1; +} + +/* + * AIM-9M display function + * + * Update the HUD display strings associated with this weapon system. + * c = the aircraft. + * w = the missile's description record. + * dummy1, dummy2 = ignored, not set. + * + * This code may be called by drones, so the viewer may be NULL. + * + * Return a nonzero value if have a reasonable chance of scoring a kill. + */ + +static int +display_aim9m(craft * c, craftType * w, viewer * unused, int dummy1, int dummy2) +{ + + char s[16]; + double d, a1, v, r, root1, root2, n, t; + VPoint tmp; + int target; + + sprintf(s, "%d %s", count[c->pIndex], weapon_idToName(weapon_AIM9M)); + strcpy(c->leftHUD[3], s); + +/* + * Compute time to target t. Gives < 0.0 if no target available or not + * reachable. + */ + + v = VMagnitude(&c->Cg); + a1 = (w->maxThrust - 0.5 * c->air.rho * w->CDOrigin * v * v) + / (w->emptyWeight + w->maxFuel) * units_earth_g; + + if (c->curRadarTarget >= 0 && a1 >= 0.0) { + + d = c->targetDistance; + r = c->targetClosure; + + n = r * r + 2.0 * a1 * d; + if (n > 0) { + n = sqrt(n); + root1 = (-r + n) / a1; + root2 = (-r - n) / a1; + if (root1 >= 0.0) + if (root2 >= 0.0) + if (root1 < root2) + t = root1; + else + t = root2; + else + t = root1; + else if (root2 >= 0.0) + t = root2; + else + t = -1.0; + } + else + t = -1.0; + } + + else + t = -1.0; + +/* + * See if the missiles can lock onto any target. We'll constrain missile_getIRTarget() + * so that it will only select target's in a twenty degree boresight cone. + */ + + if (count[c->pIndex] > 0) { + target = missile_getIRTarget(c, &tmp, 0.17633); + } + else { + target = -1; + } + +/* + * Update HUD display strings. + */ + + if (t < 0.0) + sprintf(s, "ARM --"); + else if (target >= 0 && t >= (w->armDelay + 0.5) && t <= 15.0) + sprintf(s, "LOCKED %d", (int) (t + 0.5)); + else if (t <= 15.0) + sprintf(s, "IN RANGE %d", (int) (t + 0.5)); + else + sprintf(s, "ARM %d", (int) (t + 0.5)); + + strcpy(c->leftHUD[2], s); + + strcpy(c->leftHUD[4], ""); + +/* + * Return TRUE if we are recommending a missile shot. + */ + + return target >= 0 && t >= (w->armDelay + 0.5) && t <= 10.0; +} + + +weapon_Type * +aim9m_new(void) +{ + craftType *c; + FILE *f; + dis_entity_type em1 = + {2, 1, 225, 1, 1, 3, 0}; + dis_entity_type em2 = + {2, 1, 222, 1, 2, 1, 0}; + + c = inventory_craftTypeNew(NULL); + c->name = memory_strdup( weapon_idToName(weapon_AIM9M) ); + + c->entityType = em1; + c->altEntityType = em2; + + aim9mDesc.w = c; + + c->CDOrigin = 0.04; /* 5" radius of body */ + c->CDFactor = -2.56694; + + c->CDBOrigin = 0.0; + c->CDBFactor = 0.0; + + VIdentMatrix(&(c->I)); + c->I.m[0][0] = 0.0; + c->I.m[1][1] = 0.0; + c->I.m[2][2] = 0.0; + c->cmSlope = -1.88; + + c->wingS = 1.0; + +/* + * Assume 150.0 lb of weight is fuel and that it burns for about 4 seconds. + * That yields a fuel burn rate of 40 lb/s. + */ + + c->emptyWeight = 90.0; + c->maxFuel = 100.0; + c->maxThrust = 4000.0; + c->spFuelConsump = 40; + +/* + * Three second arming delay + */ + + c->armDelay = 1.0; + + f = init_fopen("missiles/aim9.obv", "r"); + c->object = VReadObject(f); + fclose(f); + + return &aim9mDesc; +} diff -Nru acm-5.0/src/acm/aim9m.h acm-6.0+20200416/src/acm/aim9m.h --- acm-5.0/src/acm/aim9m.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/aim9m.h 2017-03-22 02:03:59.000000000 +0000 @@ -0,0 +1,36 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1998 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#ifndef _aim9m_h +#define _aim9m_h + +#include "weapon.h" + +#ifdef aim9m_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +/** + * Creates weapon description record for the AIM-9M missile. + */ +EXTERN weapon_Type * aim9m_new(void); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/air.c acm-6.0+20200416/src/acm/air.c --- acm-5.0/src/acm/air.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/air.c 2017-05-01 20:51:22.000000000 +0000 @@ -0,0 +1,185 @@ +/* + * acm : an aerial combat simulator for X + * Air and wind properties module. + * Copyright (C) 1991-1998 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#include +#include "pm.h" +#include "../util/prng.h" +#include "../util/units.h" + +#define air_IMPORT +#include "air.h" + + +void air_update(air_Properties * air, double h) +{ + if (h < 36089.2) { + air->t = units_T0 - 3.56616e-3 * h; + air->p = units_P0 * pow(air->t / units_T0, 5.255912); /* lbf/ft^2 */ + } + else { + air->t = 389.97; + air->p = 472.6773 * exp(-units_earth_g * (h - 36089.2) / (units_RA * air->t)); /* lbf/ft^2 */ + } + + air->rho = air->p / (units_RA * air->t); /* slug/ft^3 */ + air->mach1 = sqrt(units_GM * units_RA * air->t); +} + + +/* + Wind has two components: a constant component const_wind[], and a gust + component gust[] that varies in intensity and frequence. The resulting + wind is + + wind[] = const_wind[] + gust[]. +*/ + + +static VPoint wind = { + 0.0 /* from N */, + 0.0 /* from E */, + 0.0 /* from zenith */ +}; +/* wind speed (ft/s) */ + + +static VPoint const_wind = { + 0.0 /* from N */, + 0.0 /* from E */, + 0.0 /* from zenith */ +}; +/* Constant wind speed (ft/s) */ + + +static double gust_max = 0.0; +/* Max gust speed (ft/s). */ + +static VPoint gust = { + 0.0 /* from N */, + 0.0 /* from E */, + 0.0 /* from zenith */ +}; +/* Current gust speed [ft/s] */ + + +static VPoint target_gust = { + 0.0 /* from N */, + 0.0 /* from E */, + 0.0 /* from zenith */ +}; +/* Target gust speed (ft/s) */ + + +void +air_set_wind( + double wd, /* wind direction (deg) */ + double wv) /* wind velocity (kt) */ +{ + wd = units_DEGtoRAD(wd); + wv = units_KTtoFPS(wv); + const_wind.x = wv * cos(wd); + const_wind.y = wv * sin(wd); + const_wind.z = 0.0; +} + + +void air_set_gust(double _gust_max) +{ + gust_max = _gust_max; +} + + +#define T1_2 0.5 + + +static void +air_update_gust() +{ + static double t_prev = 0.0, t_next = 0.0; + + double dt, x; + + /* + Update gust speed: + */ + + dt = curTime - t_prev; + t_prev = curTime; + gust.x += dt / T1_2 * (target_gust.x - gust.x); + gust.y += dt / T1_2 * (target_gust.x - gust.y); + gust.z += dt / T1_2 * (target_gust.x - gust.z); + + /* + Update target gust speed: + */ + + if( curTime <= t_next ) + return; + + x = 2.0 * prng_getDouble() - 1.0; /* -1.0 <= x <= +1.0 */ + target_gust.x = gust_max * x * x * x * x * x; + + x = 2.0 * prng_getDouble() - 1.0; /* -1.0 <= x <= +1.0 */ + target_gust.y = gust_max * x * x * x * x * x; + + x = 2.0 * prng_getDouble() - 1.0; /* -1.0 <= x <= +1.0 */ + target_gust.z = gust_max * x * x * x * x * x; + + /* + Evaluate time of the next gust evaluation. + + The idea behind this calculation is that the bigger is the + gust, the more is the frequency of the recalculation. So we + start with this (approximated) gust module calculation: + */ + + double m = fabs(target_gust.x) + fabs(target_gust.y) + fabs(target_gust.z); + + t_next = curTime + 10.0 / (m + 5.0); + +} + + +static double t_next_gust_upd = 20.0; + + +VPoint * air_get_wind(double h) +{ + /* + Update current gust speed: + */ + + if( curTime > t_next_gust_upd ){ + air_update_gust(); + t_next_gust_upd = curTime + 0.1; + } + + /* + Calculate total wind speed. The gust intensity decreases as the + altitude increases. + */ + + double k = 3000.0 / (h + 3000.0); + + wind.x = const_wind.x + k * gust.x; + wind.y = const_wind.y + k * gust.y; + wind.z = const_wind.z + k * gust.z; + + return &wind; +} diff -Nru acm-5.0/src/acm/air.h acm-6.0+20200416/src/acm/air.h --- acm-5.0/src/acm/air.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/air.h 2020-04-16 12:05:39.000000000 +0000 @@ -0,0 +1,88 @@ +/* + * acm : an aerial combat simulator for X + * Air and wind properties module. + * Copyright (C) 1991-1998 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +/** + * Air data properties routines. + * + * @author Riley Rainey + * @license GNU GPL + * @version $Date: 2020/01/08 05:58:14 $ + * @file + */ + +#ifndef _air_h +#define _air_h + +#include "../V/Vlibmath.h" + +#ifdef air_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +/** + * Calculated air properties. + */ +typedef struct { + + /** Density [slug/ft^3]. */ + double rho; + + /** Pressure [lbf/ft^2]. */ + double p; + + /** Temperature [Rankine]. */ + double t; + + /** Speed of sound [ft/s]. */ + double mach1; + +} air_Properties; + + +/** + * Calculate air properties at the given altitude in standard atmosphere. + * @param air Store here the air properties. + * @param h Altitude [ft]. + */ +EXTERN void air_update(air_Properties * air, double h); + +/** + * Sets wind direction. Default: no wind. + * @param wd Direction from which the wind come from [RAD]. + * @param wv Wind velocity [ft/s]. + */ +EXTERN void air_set_wind(double wd, double wv); + +/** + * Set maximum gust intensity. Default: no gust. + * @param gust_max Max gust intensity [ft/s]. + */ +EXTERN void air_set_gust(double gust_max); + +/** + * Return wind speed (ft/s) at the given altitude (m). + * @param h Altitude [m]. + * @return Wind speed vector. + */ +EXTERN VPoint * air_get_wind(double h); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/alarm.c acm-6.0+20200416/src/acm/alarm.c --- acm-5.0/src/acm/alarm.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/alarm.c 2017-03-22 01:59:33.000000000 +0000 @@ -0,0 +1,185 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1997 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#include +#include +#include "../util/memory.h" +#include "pm.h" + +#define alarm_IMPORT +#include "alarm.h" + +typedef struct _alarm_descriptor_t { + struct _alarm_descriptor_t *next; + double t; + alarm_id_t id; + void (*proc) (void *, void *); + char *arg1; + char *arg2; +} alarm_descriptor_t; + +/* + Pending alarms ordered by increasing time t. +*/ +static alarm_descriptor_t *alarm_list = NULL; + +/* + Recycled list of available blocks. +*/ +static alarm_descriptor_t *alarm_free_list = NULL; + +static alarm_id_t next_alarm_id = 0; + + +/** + * Module cleanup. + */ +static void alarm_cleanup() +{ + alarm_descriptor_t * p; + + while( alarm_list != NULL ){ + p = alarm_list; + alarm_list = p->next; + memory_dispose(p); + } + + while( alarm_free_list != NULL ){ + p = alarm_free_list; + alarm_free_list = p->next; + memory_dispose(p); + } +} + + +static alarm_descriptor_t * alarm_alloc() +{ + alarm_descriptor_t *p; + + if( alarm_free_list == NULL ){ + memory_registerCleanup(alarm_cleanup); + return memory_allocate(sizeof(alarm_descriptor_t), NULL); + } else { + p = alarm_free_list; + alarm_free_list = p->next; + return p; + } +} + + +static void alarm_free(alarm_descriptor_t *p) +{ + if( alarm_free_list == NULL ){ + alarm_free_list = p; + p->next = NULL; + } else { + p->next = alarm_free_list; + alarm_free_list = p; + } +} + + +void alarm_update(void) +{ + alarm_descriptor_t *p; + + while( alarm_list != NULL && alarm_list->t <= curTime ){ + + /* + We have to remove the entry first because some + call-back function also adds another entry to the list + itself, so changing the value of alarm_list itself: + */ + + p = alarm_list; + alarm_list = p->next; + + /* Invoke the call-back function: */ + (*p->proc) (p->arg1, p->arg2); + + /* We can now safely release the used entry: */ + alarm_free(p); + } +} + + +alarm_id_t alarm_add(double delta, void (*proc) (void *, void *), void *arg1, void *arg2) +{ + alarm_descriptor_t *n, *p, *q; + + n = alarm_alloc(); + n->id = next_alarm_id++; + n->t = curTime + delta; + n->proc = proc; + n->arg1 = arg1; + n->arg2 = arg2; + + /* + Add entry to the list preserving the increasing order of time: + */ + + if( alarm_list == NULL ){ + n->next = NULL; + alarm_list = n; + + } else { + q = alarm_list; + p = NULL; + while( q != NULL && q->t <= n->t ){ + p = q; + q = q->next; + } + if( p == NULL ){ + n->next = alarm_list; + alarm_list = n; + } else { + p->next = n; + n->next = q; + } + } + + return n->id; +} + + +void alarm_cancel(alarm_id_t id) +{ + alarm_descriptor_t *p, *q; + + if( alarm_list == NULL ){ + return; + + } else if( alarm_list->id == id ){ + p = alarm_list; + alarm_list = alarm_list->next; + alarm_free(p); + + } else { + p = alarm_list; + q = p->next; + while( q != NULL && q->id != id ){ + p = q; + q = q->next; + } + if( q == NULL ) + return; + p->next = q->next; + alarm_free(q); + } + +} diff -Nru acm-5.0/src/acm/alarm.h acm-6.0+20200416/src/acm/alarm.h --- acm-5.0/src/acm/alarm.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/alarm.h 2017-03-22 01:39:01.000000000 +0000 @@ -0,0 +1,61 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991,1992 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#ifndef _alarm_h +#define _alarm_h + +#ifdef alarm_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +typedef long alarm_id_t; + +/** + * Add a new entry into the alarm list. + * + * BEWARE. + * If any of the parameters arg1,arg2 makes reference to a data structure + * that may be removed before the call-back procedure be called, make sure + * to remove also any alarm that makes reference to these data. + * @param delta Calls proc when exactly delta seconds are elapsed, + * then remove this alarm. + * @param proc Call-back procedure with signature void(void *, void *). + * @param arg1 Utility parameter for proc. + * @param arg2 Utility parameter for proc. + * @return Univocal alarm identifier. + */ +EXTERN alarm_id_t alarm_add(double delta, void (*proc) (void *, void *), void *arg1, void *arg2); + +/** + * Removes the alarm from the pending alarms. Does nothing if the alarm was + * already thrown. + * @param id + */ +EXTERN void alarm_cancel(alarm_id_t id); + +/** + * Updates the alarms list. For alarms whose delay time is elapsed, the + * alarm entry is first removed, and then the corresponding call-back + * function is called. + */ +EXTERN void alarm_update(void); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/aps.c acm-6.0+20200416/src/acm/aps.c --- acm-5.0/src/acm/aps.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/aps.c 2017-10-28 08:08:46.000000000 +0000 @@ -0,0 +1,1951 @@ +/* + * acm - Auto-Pilot System module + * Copyright (C) 2007 Umberto Salsi + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +/* + The proportional-integrative control algorithm ("PI" from here on) is + extensively used in this module. The PI algo can be applied to a + black-box system + + y(t) = f(x(t), t) + + were + + t = time + x(t) = controlling variable (ex.: aileron position) + y(t) = resulting output (ex.: roll speed) + + The basic problem is how to adjust the value of x in order to achieve + and maintain a given target output y_T. The PI algo addresses just this + problem. It is expressed by this formula: + + x(t) = x_ss + Gp * err(t) + Gi * integral(err(z)*dz, z=0...t) + + were the integral of the error ranges from 0 to t, and the error is + defined by + + err(t) = y(t) - y_T + + and x_ss is a constant depending on the initial conditions, Gp is the + proportional gain, Gi is the integral gain. The time derivative of the + x(t) function is + + x_dot(t) = Gp * y_dot(t) + Gi * (y(t) - y_T) + + or, in the discrete domain: + + x(i+1) = x(i) + Gp * (y(i) - y(i-1)) + Gi * (y(i) - y_T) * dt + + were: + + i = current sample time + i-/+1 = previous or next sample time + x(i+1) = new calculated value for the controlling variable + y(i) = current value of the controlled variable + y(i-1) = previous value at t-dt of the controlled variable + + Try trickiest part of the PI algo is to choose a good controlled + variable y(t) and a good value for the proportionl gain Gp and the + integral gain Gi that work for all the aircraft models and in any + flight condition of speed and altitude. + + The table below summarizes the algo used with every autopilot subsystem: + + A* x(t) y(t) Algorithm used + -- -------- ---------------- ------------------------------------- + AP elevator pitch rate bare incremental algo + AW ailerons roll rate PI with varying target roll rate y_T + AC rudder lateral accel. PI +*/ + +#include +#include +#include "flaps.h" +#include "hsi.h" +#include "../util/memory.h" +#include "pm.h" +#include "terrain.h" +#include "gear.h" +#include "../util/units.h" + +#define aps_IMPORT +#include "aps.h" + +typedef struct { + craft * c; + + /* + Pitch rate control. + */ + _BOOL pitch_rate_enabled; + double pitch_rate_transfer; + double pitch_rate_target; /* pitch rate to hold (RAD/s) */ + double pc_prev_time; /* prev update time */ + double pc_prev_pitch_dot; /* previous pitch rate */ + double delta_Se; /* current elevator correction [-1.0,1.0] */ + + /* + * Bank rate control. + */ + _BOOL bank_rate_enabled; /* bank rate control enabled */ + double bank_rate_transfer; + double bank_rate_target; /* target rate of bank (RAD/s) */ + double bank_rate_prev_time; + double bank_rate_prev_a_dot; + double bank_rate_prev_a_dot_exp; + double delta_Sa; /* current ailerons correction [-1.0,+1.0] */ + + /* + Hold altitude and hold VS autopilot (AP) state. + */ + _BOOL ap_enabled; + _BOOL ap_hold_altitude; /* hold altitude or hold VS? */ + double ap_target_altitude; /* target altitude (m) */ + double ap_prev_time; /* previous update (s) */ + double ap_target_vs; /* target vertical speed (m/s) */ + double ap_prev_vs; /* previous v.s. (m/s) */ + + /* + Rudder auto-coordination (AC). + */ + _BOOL ac_enabled; + double ac_prev_a; /* the lateral accel. c->G.y ... */ + double ac_prev_time; /* ... at this time */ + double ac_delta_Sr; /* AC rudder correction */ + + /* + AutoThrottle (AT). + */ + _BOOL at_enabled; + double at_target_v; /* target IAS speed (ft/s) */ + double at_prev_v; /* speed at the previous... */ + double at_prev_time; /* ...time (s) */ + + /* + Auto-turn (AW). + */ + _BOOL aw_enabled; + double aw_bank_max; /* max bank angle (RAD) */ + double aw_w_target; /* target z turn rate (RAD/s) */ + double aw_prev_time; + + /* + Auto Landing (AL). + */ + _BOOL al_enabled; + double al_prev_adiff; + double al_prev_time; + double al_v_touchdown; /* 0.0 = still unknown (m/s) */ + _BOOL al_touchdown; /* bouncing fix: set when first contact with ground */ + + /* + Auto Navigation (AN). + */ + _BOOL an_enabled; + double an_prev_time; + double an_prev_cdi; + + /* + * Pitch and roll rate control. + */ + _BOOL rate_control_enabled; + + /* + Warning flags: + */ + _BOOL ap_warn; + _BOOL an_warn; + _BOOL al_warn; + _BOOL aw_warn; + _BOOL at_warn; + _BOOL ac_warn; + +} aps_Type; + + +static double qround(double value, double step) +/* + Round the given positive value to the nearest quantized value. + The quantum is 'step'. + Warning: does not work properly with negative values. +*/ +{ + /* + if( value < 0.0 ) + return -step * floor(-value / step + 0.5); + else + */ + return step * floor(value / step + 0.5); +} + + +static double +forceRange(double x, double min, double max) +{ + if( x >= min ){ + if( x <= max ){ + return x; + } else { + return max; + } + } else { + return min; + } +} + + +#define LO units_DEGtoRAD(30.0) +#define HI units_DEGtoRAD(60.0) + + +static double +get_pitch_rate(craft * c) +{ + double roll_abs, pitch_rate, k; + + roll_abs = fabs(c->curRoll); + if( roll_abs > HI ) + return c->q; + pitch_rate = c->q*cos(c->curRoll) - c->r*sin(c->curRoll); + if( roll_abs > LO ){ + k = (roll_abs - LO)/(HI - LO); + return (1.0-k)*pitch_rate + k*c->q; + } + return pitch_rate; + + /* + if( fabs(c->curRoll) < units_DEGtoRAD(30.0) ) + return c->q*cos(c->curRoll) - c->r*sin(c->curRoll); + else + return c->q; + */ +} + + +static void aps_destruct(void *p) +{ + aps_Type * aps = p; + if ( aps == NULL ) + return; + aps->c->aps = NULL; +} + + +/** + * Retrieves the APS data from aircraft. If not already set, allocates a new + * APS. + */ +static aps_Type * aps_get(craft * c) +{ + aps_Type * aps; + + if ( c->aps != NULL ) + return (aps_Type *) c->aps; + + aps = memory_allocate( sizeof( aps_Type ), aps_destruct ); + memset(aps, 0, sizeof(*aps)); + c->aps = aps; + aps->c = c; + + /* Rests pitch rate control: */ + aps->pitch_rate_enabled = FALSE; + aps->pitch_rate_transfer = 0.0; + aps->delta_Se = 0.0; + + /* Reset bank rate control: */ + aps->bank_rate_enabled = FALSE; + aps->bank_rate_transfer = 0.0; + aps->delta_Sa = 0.0; + + /* AP disabled: */ + aps->ap_enabled = FALSE; + + /* AC disabled: */ + aps->ac_enabled = FALSE; + aps->ac_delta_Sr = 0.0; + + /* AT disabled: */ + aps->at_enabled = FALSE; + + /* AW disabled: */ + aps->aw_enabled = FALSE; + aps->aw_bank_max = units_DEGtoRAD(25); + + /* AL disabled: */ + aps->al_enabled = FALSE; + + /* AN disabled: */ + aps->an_enabled = FALSE; + + /* Rate control disabled: */ + aps->rate_control_enabled = FALSE; + + /* + Reset warning flags: + */ + aps->ap_warn = FALSE; + aps->an_warn = FALSE; + aps->al_warn = FALSE; + aps->aw_warn = FALSE; + aps->ac_warn = FALSE; + + return aps; +} + + +/** + * Enables pitch control and set target pitch rate. + * @param c The aircraft. + * @param target Pitch rate to set (RAD/s). + */ +static void +pitch_rate_set(craft * c, double target) +{ + aps_Type * aps; + + aps = aps_get(c); + + if( ! aps->pitch_rate_enabled ){ + /* Smooth engaging: */ + aps->pc_prev_time = curTime; + aps->pc_prev_pitch_dot = get_pitch_rate(c); + } + + aps->pitch_rate_enabled = TRUE; + aps->pitch_rate_target = target; +} + + +/** + * Releases the pitch rate controller. + * @param c The aircraft. + */ +static void +pitch_rate_disable(craft * c) +{ + aps_Type * aps; + + if( c->aps == NULL ) + return; + + aps = (aps_Type *) c->aps; + + aps->pitch_rate_enabled = FALSE; +} + + +/* Min/max elevator correction: */ +#define PC_DELTA_SE_MAX 1.0 + +/* Warning if elevator correction outside this range: */ +#define PC_DELTA_SE_OUT_RANGE (0.5 * PC_DELTA_SE_MAX) + +#define PITCH_DOT_MAX units_DEGtoRAD(20.0) + + +/** + * If pitch rate control is enabled, and the nose or tail wheel is not in + * contact with the ground, updates the elevator correction to attain the + * pitch rate set. Otherwise, smoothly reset the elevator correction. + * Transition from direct law to rate control and vice-versa is smoothly + * performed within about 3 seconds. + * @param c The aircraft. + */ +static void +pitch_rate_update(craft * c) +{ + aps_Type * aps; + double dt, pitch_dot_exp, pitch_dot; + + if( c->aps == NULL ) + return; + + aps = (aps_Type *) c->aps; + + dt = curTime - aps->pc_prev_time; + + if( dt <= 0.0 ) + return; + + aps->pc_prev_time = curTime; + + if( aps->pitch_rate_enabled /* && ! gear_noseWheelGroundContact(c) */ ){ + + aps->pitch_rate_transfer += 0.33 * deltaT; + if ( aps->pitch_rate_transfer > 1.0 ) + aps->pitch_rate_transfer = 1.0; + + pitch_dot = get_pitch_rate(c); + + /* + * Basically, the target pitch rate is that set, but here we account + * for the transfer of control while the nose/tail wheel loose contact + * with the ground: + */ + pitch_dot_exp = aps->pitch_rate_transfer * aps->pitch_rate_target + + (1.0 - aps->pitch_rate_transfer) * pitch_dot; + pitch_dot_exp = forceRange(pitch_dot_exp, -PITCH_DOT_MAX, PITCH_DOT_MAX); + + /* Authority: */ + double k = c->cinfo->I.m[1][1] + / (-c->cinfo->cmSlope * (1.0 + c->IAS * c->IAS) * c->cinfo->wingS); + double Gp = 2000.0 * k; + double Gi = 5000.0 * k; + aps->delta_Se = aps->delta_Se + + Gp * (pitch_dot - aps->pc_prev_pitch_dot) + + Gi * (pitch_dot - pitch_dot_exp) * dt; + + if ( aps->delta_Se < -PC_DELTA_SE_OUT_RANGE + || aps->delta_Se > +PC_DELTA_SE_OUT_RANGE ){ + aps->ap_warn = TRUE; + } + + aps->delta_Se = forceRange(aps->delta_Se, + -PC_DELTA_SE_MAX, +PC_DELTA_SE_MAX); + + aps->pc_prev_pitch_dot = pitch_dot; + + } else { + /* Smooth release: */ + aps->pitch_rate_transfer -= 0.33 * deltaT; + if ( aps->pitch_rate_transfer < 0.0 ) + aps->pitch_rate_transfer = 0.0; + + if( aps->delta_Se != 0.0 ){ + aps->delta_Se *= 1.0 - 0.3*dt; + if( fabs(aps->delta_Se) < 1e-3 ) + aps->delta_Se = 0.0; + } + } +} + + +double +aps_get_delta_elevator(craft * c) +{ + aps_Type * aps; + + if ( c->aps == NULL ) + return 0.0; + + aps = (aps_Type *) c->aps; + return aps->pitch_rate_transfer * (aps->delta_Se - c->pitchComm); +} + + +static double +get_roll_rate(craft * c) +{ + double bank_abs, pitch_abs, bank_rate, tanCurPitch, k; + + bank_abs = fabs(c->curRoll); + pitch_abs = fabs(c->curPitch); + if( bank_abs > HI || pitch_abs > HI ) + return c->p; + tanCurPitch = tan(c->curPitch); + bank_rate = c->p + c->q*tanCurPitch*sin(c->curRoll) + c->r*tanCurPitch*cos(c->curRoll); + if( bank_abs > LO || pitch_abs > LO ){ + k = (bank_abs - LO)/(HI - LO); + return (1.0-k)*bank_rate + k*c->p; + } + return bank_rate; +} + + +/** + * Enables bank rate controller and set bank rate. + * @param c The aircraft. + * @param target Target bank rate (RAD/s). + */ +static void +bank_rate_set(craft * c, double target) +{ + aps_Type * aps; + double bank_rate; + + aps = aps_get(c); + if ( ! aps->bank_rate_enabled ){ + aps->bank_rate_enabled = TRUE; + /* Smooth engaging: */ + bank_rate = get_roll_rate(c); + aps->bank_rate_prev_a_dot = bank_rate; + aps->bank_rate_prev_a_dot_exp = bank_rate; + } + aps->bank_rate_target = target; +} + + +static void +bank_rate_disable(craft * c) +{ + aps_Type * aps; + + aps = aps_get(c); + aps->bank_rate_enabled = FALSE; +} + + +/* Max roll rate (RAD/s). */ +#define BANK_DOT_MAX units_DEGtoRAD(60.0) + +/* Max roll rate accel. (RAS/s^2). */ +#define BANK_DOT_DOT_MAX units_DEGtoRAD(600.0) + +/* Max aileron correction control range. */ +#define BANK_RATE_SA_MAX 1.0 + + +/** + * If the bank rate controller is enabled, and both the main wheels are not + * in contact with the ground, updates the ailerons correction to attain the + * bank rate set. Otherwise, smoothly resets the ailerons correction. + * @param c The aircraft. + */ +static void +bank_rate_update(craft * c) +{ + aps_Type * aps; + double a_dot, a_dot_exp, a_dot_dot_exp, delta_Sa; + + aps = aps_get(c); + + aps->bank_rate_prev_time = curTime; + + if ( aps->bank_rate_enabled && ! gear_mainWheelsGroundContact(c) ){ + aps->bank_rate_transfer += 0.3*deltaT; + if ( aps->bank_rate_transfer > 1.0 ) + aps->bank_rate_transfer = 1.0; + + a_dot = get_roll_rate(c); + + /* + * Basically, the target bank rate is that set, but here we account + * for the transfer of control while the main landing wheels loose + * contact with the ground: + */ + a_dot_exp = aps->bank_rate_transfer * aps->bank_rate_target + + (1.0 - aps->bank_rate_transfer) * a_dot; + + /* + Compute roll angle accel., apply limit then recalculate: + */ + a_dot_dot_exp = (a_dot_exp - a_dot) / deltaT; + a_dot_dot_exp = forceRange(a_dot_dot_exp, -BANK_DOT_DOT_MAX, BANK_DOT_DOT_MAX); + a_dot_exp = a_dot + a_dot_dot_exp * deltaT; + a_dot_exp = forceRange( a_dot_exp, -BANK_DOT_MAX, BANK_DOT_MAX); + + /* authority */ + double k = (0.003 * (1.0 + c->IAS * c->IAS)) * c->cinfo->wingS + * c->cinfo->wings * c->cinfo->Clda * c->cinfo->maxAileron + / c->cinfo->I.m[0][0]; + + delta_Sa = aps->delta_Sa + + 10.0 / k * (a_dot - a_dot_exp - aps->bank_rate_prev_a_dot + aps->bank_rate_prev_a_dot_exp) + + 30.0 / k * (a_dot - a_dot_exp) * deltaT; + + aps->delta_Sa = forceRange( delta_Sa, -BANK_RATE_SA_MAX, BANK_RATE_SA_MAX); + + aps->aw_warn = fabs(aps->delta_Sa) == BANK_RATE_SA_MAX; + + aps->bank_rate_prev_a_dot = a_dot; + aps->bank_rate_prev_a_dot_exp = a_dot_exp; + + } else { + aps->bank_rate_transfer -= deltaT; + if ( aps->bank_rate_transfer < 0.0 ) + aps->bank_rate_transfer = 0.0; + + if( aps->delta_Sa != 0.0 ){ + + /* Smooth release (-66% within 1.0 s): */ + aps->delta_Sa -= aps->delta_Sa * deltaT; + if( fabs(aps->delta_Sa) < 1e-3 ) + aps->delta_Sa = 0.0; + } + } +} + + +double +aps_get_delta_ailerons(craft * c) +{ + aps_Type * aps; + + if ( c->aps == NULL ) + return 0.0; + + aps = (aps_Type *) c->aps; + return aps->bank_rate_transfer * (aps->delta_Sa - c->rollComm); +} + + +/* + AutoPilot (AP) + ============== +*/ + + +_BOOL +aps_ap_enabled(craft * c) +{ + return (c->aps != NULL) && ( ((aps_Type *) (c->aps))->ap_enabled ); +} + + +void +aps_ap_enable(craft * c) +{ + aps_Type * aps; + + aps = aps_get(c); + + if ( aps->ap_enabled ) + return; + + aps_al_disable(c); + aps_rate_control_disable(c); + + aps->ap_enabled = TRUE; + aps->ap_hold_altitude = (fabs(c->Cg.z) < 100.0/60.0); + aps->ap_target_altitude = qround( c->w.z, units_FEETtoMETERS(100.0) ); + aps->ap_target_vs = units_FEETtoMETERS( - c->Cg.z ); + aps->ap_prev_time = 0.0; + aps->ap_prev_vs = aps->ap_target_vs; +} + + +void aps_ap_disable(craft * c) +{ + aps_Type * aps; + + if( c->aps == NULL ) + return; + + aps = aps_get(c); + + aps->ap_enabled = FALSE; + aps->ap_warn = FALSE; + + pitch_rate_disable(c); +} + + +void +aps_ap_toggle(craft * c) +{ + if( aps_ap_enabled(c) ) + aps_ap_disable(c); + else + aps_ap_enable(c); +} + + +void +aps_ap_set_vs(craft * c, double vs) +{ + aps_Type * aps; + + aps_ap_enable(c); + aps = aps_get(c); + aps->ap_hold_altitude = (fabs(vs) < units_FEETtoMETERS(100.0)/60.0); + if( aps->ap_hold_altitude ) + aps->ap_target_altitude = qround( c->w.z, units_FEETtoMETERS(100.0) ); + else + aps->ap_target_vs = vs; +} + + +#ifdef FIXME_NOT_USED + +static void +aps_ap_set_alt(craft * c, double altitude /* m */) +{ + aps_Type * aps; + + aps_ap_enable(c); + aps = aps_get(c); + aps->ap_hold_altitude = TRUE; + aps->ap_target_altitude = altitude; +} + +#endif + + +#define AP_DELTA_T 0.2 + +/* Min vertical speed in hold-altitude mode: */ +#define AP_VS_MIN units_FEETtoMETERS(-1000.0/60.0) /* m/s */ + +/* Max vertical speed in hold-altitude mode: */ +#define AP_VS_MAX units_FEETtoMETERS(100.0/60.0) /* m/s */ + +/* Min/max vertical accel.: */ +#define AP_VS_DOT_MAX (0.5 * 9.8) /* m/s^2 */ + + +static void +aps_ap_update(craft * c) +{ + aps_Type * aps; + double vs, vs_exp, vs_dot_exp, dt, err, a_dot; + + aps = aps_get(c); + + if( aps->ap_prev_time == 0.0 ){ + /* First time we are called. */ + dt = AP_DELTA_T; + } else { + dt = curTime - aps->ap_prev_time; + } + + if( dt < AP_DELTA_T ) + return; + + aps->ap_prev_time = curTime; + + aps->ap_warn = FALSE; + + if( ! aps->ap_enabled ) + return; + + /* Current vertical speed vs (m/s): */ + vs = -units_FEETtoMETERS(c->Cg.z); + + /* Current vertical acceleration vs_dot (m/s^2): */ + /* vs_dot = (vs - aps->ap_prev_vs) / dt; */ + + /* Expected vertical speed vs_exp (m/s): */ + + if ( aps->ap_hold_altitude ) { + + /* Current altitude error (m): */ + err = c->w.z - aps->ap_target_altitude; + + if( fabs(err) > units_FEETtoMETERS(150.0) ) + aps->ap_warn = TRUE; + + /* + Compute a vertical speed vs_exp suitable to + attain the target altitude (m/s): + */ + + vs_exp = forceRange(-err / 15.0, AP_VS_MIN, AP_VS_MAX); + + } else { + + vs_exp = aps->ap_target_vs; + + if( fabs(vs - vs_exp) > units_FEETtoMETERS(200.0/60.0) ) + aps->ap_warn = TRUE; + } + + /* + Expected vertical acceleration vs_dot_exp (m/s^2). + Set max accel. if the v.s. error is 500 fpm or greater. + */ + vs_dot_exp = forceRange((vs_exp - vs)/2.0, + -AP_VS_DOT_MAX, AP_VS_DOT_MAX); + + /* + The angle of the climb path is + + a = pitch - AOA + + where AOA is the angle of attack. At constant speed the AOA + is constant, so deriving this latter gives: + + a_dot = pitch_dot = c->q + + The vertical speed is + + vs = v*tan(a) + + where v=c->VT is the TAS. For small angles tan(a)=a, then: + + vs = v*a + + Since v is constant, deriving this latter gives: + + vs_dot = v*a_dot + + So changes in vertical acceleration can be controlled + through c->q: + + a_dot = vs_dot / v + */ + + a_dot = vs_dot_exp / units_FEETtoMETERS(c->VT + 0.1); + + pitch_rate_set(c, a_dot); + + aps->ap_prev_vs = vs; +} + + +/* + AutoCoordination (AC) + ===================== +*/ + +void +aps_ac_enable(craft * c) +{ + aps_Type * aps; + + aps = aps_get(c); + + if( aps->ac_enabled ) + return; + + aps->ac_enabled = TRUE; + aps->ac_prev_time = 0.0; + aps->ac_prev_a = c->G.y; + /* aps->ac_delta_Sr = 0.0; */ + aps->ac_warn = FALSE; +} + + +void +aps_ac_disable(craft * c) +{ + aps_Type * aps; + + if( c->aps == NULL ) + return; + + aps = aps_get(c); + + aps->ac_enabled = FALSE; + /* aps->ac_delta_Sr = 0.0; */ + aps->ac_warn = FALSE; + c->Sr = 0.0; +} + + +_BOOL +aps_ac_enabled(craft * c) +{ + return (c->aps != NULL) && ( ((aps_Type *) (c->aps))->ac_enabled ); +} + + +void +aps_ac_toggle(craft * c) +{ + if( aps_ac_enabled(c) ) + aps_ac_disable(c); + else + aps_ac_enable(c); +} + + +double +aps_ac_get_delta_rudder(craft * c) +{ + aps_Type * aps; + + if ( c->aps == NULL ) + return 0.0; + + aps = (aps_Type *) c->aps; + return aps->ac_delta_Sr; +} + + +#define AC_DELTA_T 0.01 +#define AC_SR_DOT_MAX 0.1 + +static void +aps_ac_update(craft * c) +{ + aps_Type * aps; + double dt, a, a_dot, a_dot_exp, delta_Sr; + + aps = aps_get(c); + + if( aps->ac_prev_time == 0.0 ){ + /* First time we are called. */ + dt = AC_DELTA_T; + } else { + dt = curTime - aps->ac_prev_time; + } + + if( dt < AC_DELTA_T ) + return; + + aps->ac_prev_time = curTime; + + aps->ac_warn = FALSE; + + if( aps->ac_enabled && ! gear_noseWheelGroundContact(c) ) { + + /* + Normal AC handling. Update aps->ac_delta_Sr so that to + reduce lateral acceleration c->G.y. + */ + + a = c->G.y; + a_dot = (a - aps->ac_prev_a) / dt; + a_dot_exp = - 0.5 * a; + double k = 2000.0 / (1.0 + c->IAS * c->IAS); /* authority */ + delta_Sr = aps->ac_delta_Sr + 1.0 * k * (a_dot - a_dot_exp); + aps->ac_delta_Sr = forceRange(delta_Sr, -1.0, 1.0); + + aps->ac_warn = fabs(aps->ac_delta_Sr) == 1.0; + + aps->ac_prev_a = a; + } + + else if ( aps->ac_delta_Sr != 0.0 ){ + + /* + Smooth release (-66% within 2 s): + */ + + if( aps->ac_delta_Sr != 0.0 ){ + aps->ac_delta_Sr -= aps->ac_delta_Sr / 2.0 * dt; + if( fabs(aps->ac_delta_Sr) < 1.e-3 ) + aps->ac_delta_Sr = 0.0; + } + } + +} + + +/* + AutoThrottle (AT) + ================= +*/ + +#define AT_V_STEP units_KTtoFPS(5.0) /* ft/s */ + + +void aps_at_enable(craft * c) +{ + aps_Type * aps; + double v; + + aps = aps_get(c); + + if( aps->at_enabled ) + return; + + v = c->IAS; + if( v < 0.0 ) v = 0.0; + aps->at_target_v = qround(v, AT_V_STEP); + aps->at_prev_v = v; + aps->at_prev_time = 0.0; + aps->at_enabled = TRUE; + aps->at_warn = FALSE; +} + + +void aps_at_disable(craft * c) +{ + aps_Type * aps; + + if( c->aps == NULL ) + return; + + aps = aps_get(c); + + if( ! aps->at_enabled ) + return; + + aps->at_enabled = FALSE; + aps->at_warn = FALSE; +} + + +_BOOL +aps_at_enabled(craft * c) +{ + return (c->aps != NULL) && ( ((aps_Type *) (c->aps))->at_enabled ); +} + + +void +aps_at_toggle(craft * c) +{ + if( aps_at_enabled(c) ) + aps_at_disable(c); + else + aps_at_enable(c); +} + + +double +aps_at_get_velocity(craft * c) +{ + aps_Type * aps; + + aps = (aps_Type *) c->aps; + + if ( aps == NULL || ! aps->at_enabled ) + return 0.0; + + return aps->at_target_v; +} + + +#define AT_DELTA_T 0.5 /* s */ +#define AT_V_DOT_MAX (+0.1*units_earth_g) +#define AT_V_DOT_MIN (-0.5*units_earth_g) +#define AT_REALIGN_TIME 15.0 /* time for vel. realignment (s) */ + + +static void +aps_at_update(craft * c) +{ + aps_Type * aps; + double dt, v, v_dot, exp_v_dot, thr; + _BOOL thr_alarm; + + aps = aps_get(c); + + if ( ! aps->at_enabled ) + return; + + if( aps->at_prev_time == 0.0 ){ + /* First time we are called. */ + dt = AT_DELTA_T; + } else { + dt = curTime - aps->at_prev_time; + } + + if ( dt < AT_DELTA_T ) + return; + + aps->at_warn = FALSE; + + v = c->IAS; /* ft/s */ + v_dot = (v - aps->at_prev_v) / dt; + exp_v_dot = forceRange( (aps->at_target_v - v) / AT_REALIGN_TIME, + AT_V_DOT_MIN, AT_V_DOT_MAX); + thr = (1.0 + 0.2 * (exp_v_dot - v_dot)) * c->rpm; + thr_alarm = FALSE; + if ( thr <= 0.2 ) { + thr = 0.2; + if ( v_dot >= 0.0 ) + thr_alarm = TRUE; + } + else if ( thr >= 1.0 ) { + thr = 1.0; + if ( v_dot <= 0.0 ) + thr_alarm = TRUE; + } + aps->at_warn = thr_alarm; + c->throttleComm = (int) (32768.0 * thr + 0.5); + aps->at_prev_v = v; + aps->at_prev_time = curTime; + +#ifdef DEBUG + printf("AT: v_target=%3.0f kt v=%3.0f kt v_dot=%g g exp_v_dot=%g g\n", + units_FPStoKT(aps->at_target_v), units_FPStoKT(v), v_dot/units_earth_g, exp_v_dot/units_earth_g); +#endif + +} + + +void +aps_at_inc_velocity(craft * c) +{ + aps_Type * aps; + + aps = aps_get(c); + aps->at_target_v = qround(aps->at_target_v + AT_V_STEP, AT_V_STEP); +} + + +void +aps_at_dec_velocity(craft * c) +{ + aps_Type * aps; + + aps = aps_get(c); + aps->at_target_v = qround( fabs(aps->at_target_v - AT_V_STEP), AT_V_STEP); +} + + +/* + AutoTurn (AW) + ============= + Controls z turn rate or x roll rate, depending on which value gets + set. +*/ + +#define AW_DELTA_T 0.02 + +void aps_bank_max_inc(craft * c) +{ + aps_Type * aps; + int b; + + if( c->aps == NULL ) + return; + + aps = aps_get(c); + + b = (int) (units_RADtoDEG(aps->aw_bank_max) + 0.5); + + if( b >= 25 ) + return; + + aps->aw_bank_max = units_DEGtoRAD(b + 5); +} + + +void aps_bank_max_dec(craft * c) +{ + aps_Type * aps; + int b; + + aps = aps_get(c); + + b = (int) (units_RADtoDEG(aps->aw_bank_max) + 0.5); + + if( b <= 5 ) + return; + + aps->aw_bank_max = units_DEGtoRAD(b - 5); +} + + +int aps_bank_max_get(craft * c) +{ + aps_Type * aps; + + if( c->aps == NULL ) + return 25; + + aps = aps_get(c); + + return (int) (units_RADtoDEG(aps->aw_bank_max) + 0.5); +} + + +void +aps_aw_enable(craft * c) +{ + aps_Type * aps; + + aps = aps_get(c); + + if ( aps->aw_enabled ) + return; + + aps_rate_control_disable(c); + + aps->aw_enabled = TRUE; + /* + aps->aw_bank_max = units_DEGtoRAD(25.0); + + This field must be initialized by aps_get once for all. + */ + aps->aw_w_target = c->r / cos(c->curRoll); + aps->aw_prev_time = 0.0; + aps->aw_warn = FALSE; + aps_ac_enable(c); +} + + +_BOOL +aps_aw_enabled(craft * c) +{ + return (c->aps != NULL) && ( ((aps_Type *) (c->aps))->aw_enabled ); +} + + +void +aps_aw_disable(craft * c) +{ + aps_Type * aps; + + if ( c->aps == NULL ) + return; + + aps = (aps_Type *) c->aps; + + if ( ! aps->aw_enabled ) + return; + + aps->aw_enabled = FALSE; + bank_rate_disable(c); +} + + +void +aps_aw_set(craft * c, double w) +/* + Sets the turn rate w (RAD/s) around the local earth vertical. + w > 0 ==> turn left + w < 0 ==> turn right +*/ +{ + aps_Type * aps; + + aps_aw_enable(c); + aps = (aps_Type *) c->aps; + aps->aw_w_target = w; +} + + +/****** not used +static void +aps_aw_bank_max_set(craft * c, double bank) +{ + aps_data * aps; + + aps = (aps_data *) c->aps; + if( aps == NULL ) + return; + aps->aw_bank_max = bank; +} +*******/ + + +/* + * FIXME: what to return if the roll rate is enabled rather than turn rate? + */ +double +aps_aw_get(craft * c) +{ + aps_Type * aps; + + if ( c->aps == NULL ) + return 0.0; + + aps = aps_get(c); + + if ( aps->aw_enabled ) + return aps->aw_w_target; + else + return 0.0; +} + + +static void +aps_aw_update(craft * c) +{ + aps_Type * aps; + double dt, a, a_exp, a_dot_exp; + + aps = aps_get(c); + if ( ! aps->aw_enabled ) + return; + + if( aps->aw_prev_time == 0.0 ){ + /* First time we are called. */ + dt = AW_DELTA_T; + } else { + dt = curTime - aps->aw_prev_time; + } + + if ( dt < AW_DELTA_T ) + return; + + aps->aw_prev_time = curTime; + + a = c->curRoll; + + /* + Compute angle of bank to attain the required turn speed: + */ + a_exp = atan( c->VT * aps->aw_w_target / units_earth_g ); + + a_exp = forceRange( a_exp, -aps->aw_bank_max, aps->aw_bank_max); + + /* + Compute the bank rate to attain the expected angle of bank: + */ + a_dot_exp = (a_exp - a) / 2.0; + a_dot_exp = forceRange(a_dot_exp, -units_DEGtoRAD(10.0), units_DEGtoRAD(10.0)); + + bank_rate_set(c, a_dot_exp); +} + + + + +/* + Auto Navigation (AN) + ==================== +*/ + +void +aps_an_enable(craft * c) +{ + aps_Type * aps; + + aps = aps_get(c); + aps_al_disable(c); + aps_rate_control_disable(c); + + aps->an_enabled = TRUE; + aps->an_prev_time = 0.0; + aps->an_prev_cdi = 0.0; + aps->an_warn = FALSE; +} + + +void +aps_an_disable(craft * c) +{ + aps_Type * aps; + + if( c->aps == NULL ) + return; + + aps = aps_get(c); + if( ! aps->an_enabled ) + return; + + bank_rate_disable(c); + aps->an_enabled = FALSE; + aps->an_warn = FALSE; +} + + +_BOOL +aps_an_enabled(craft * c) +{ + return (c->aps != NULL) && ( ((aps_Type *) (c->aps))->an_enabled ); +} + + +void +aps_an_toggle(craft * c) +{ + if( aps_an_enabled(c) ) + aps_an_disable(c); + else + aps_an_enable(c); +} + + +static double +min_angle_diff(double a, double b) +{ + double d; + + d = a - b; + if( d > M_PI ) + d = - 2.0*M_PI + d; + else if( d < - M_PI ) + d = 2.0*M_PI + d; + return d; +} + + +static double +normalize_angle(double x) +{ + while( x < 0 ) + x = x + 2.0*M_PI; + + while( x > 2.0*M_PI ) + x = x - 2.0*M_PI; + + return x; +} + + +static void +aps_an_update(craft * c) +{ + aps_Type * aps; + viewer *u; + double dt, r, obs, magvar, cdi, th_diff, th, w, + cdi_dot, cdi_expected, k; + + if( c->aps == NULL ) + return; + + aps = aps_get(c); + + if( ! aps->an_enabled ) + return; + + if( aps->an_prev_time == 0.0 ){ + /* First time we are called. */ + dt = 1.7; + } else { + dt = curTime - aps->an_prev_time; + } + + if ( dt < 1.7 ) + return; + + aps->an_warn = FALSE; + + /* + Get current radial: + */ + u = c->vl; + if( u == NULL || ! hsi_vor_radial(u, &r) ){ + aps_an_disable(c); + return; + } + + /* Target radial: */ + obs = units_DEGtoRAD( hsi_get_obs(u) ); + + /* Magnetic variation: */ + if( c->showMag ) + magvar = c->indicatedLocalVAR; + else + //magvar = c->hsiSelect->station->magvar; FIXME + magvar = 0.0; + + /* Course deviation: */ + cdi = min_angle_diff(r, obs); + if( cdi > units_DEGtoRAD(90.0) ) + cdi = units_DEGtoRAD(180.0) - cdi; + else if( cdi < - units_DEGtoRAD(90.0) ) + cdi = - units_DEGtoRAD(180.0) - cdi; + + /* + * Set turn speed only if cdi_dot available. + */ + if( aps->an_prev_time > 0.0 ){ + /* + Evaluates the velocity of CDI, then guess what the CDI will be + within, say, 10 seconds so to compensate the inertia of the plane + allowing also a smooth change of bank angle (it requires just about + 10 seconds to pass from -25 DEG to +25 DEG). + */ + cdi_dot = forceRange( (cdi - aps->an_prev_cdi)/dt, + units_DEGtoRAD(-5.0), units_DEGtoRAD(5.0)); + cdi_expected = forceRange(cdi + cdi_dot * 10.0, + units_DEGtoRAD(-10.0), units_DEGtoRAD(10.0)); + + /* + Compute approaching heading to OBS. The heading error CDI (i.e. the + diff. between the actual heading and the expected obs heading) + gets amplified by a factor k. This factor normally evaluates to + 20, but if the cdi moves too fast (i.e. we are close to the VOR) + it gets reduced up to 1.2 for smooth movements. The max approching + angle gets limited to +/-45 DEG. + */ + k = 1.2 + 18.8 / (1.0 + 500.0 * fabs(cdi_dot)); + th = normalize_angle(obs - magvar + - forceRange(k * cdi_expected, units_DEGtoRAD(-45.0), units_DEGtoRAD(45.0))); + + /* Heading correction: */ + th_diff = min_angle_diff(th, c->curHeading); + + w = forceRange( 0.05 * th_diff, + units_DEGtoRAD(-3.0), units_DEGtoRAD(3.0)); + + aps_aw_set(c, w); + /**** + bank_max = units_DEGtoRAD(5.0) + (25.0 - 5.0)/30.0 * fabs(th_diff); + if( bank_max > units_DEGtoRAD(25.0) ) + bank_max = units_DEGtoRAD(25.0); + aps_aw_bank_max_set(c, bank_max); + ****/ + } + + /* Update status: */ + aps->an_prev_time = curTime; + aps->an_prev_cdi = cdi; + +#ifdef DEBUG + printf("r=%.0f" + " obs=%.0f" + " curHeading=%.0f" + " w=%.1f" + "\n", + units_RADtoDEG(r), + units_RADtoDEG(obs), + units_RADtoDEG(c->curHeading), + units_RADtoDEG(w)); +#endif + +} + + +/* + AutoLanding (AL) + ================ +*/ + +void +aps_al_enable(craft * c) +{ + aps_Type * aps; + + aps = aps_get(c); + if ( aps->al_enabled ) + return; + + aps_an_disable(c); + aps_aw_disable(c); + aps_rate_control_disable(c); + aps_ap_enable(c); + aps_ac_enable(c); + + aps->al_enabled = TRUE; + aps->al_prev_adiff = 0.0; + aps->al_prev_time = 0.0; + aps->al_v_touchdown = 0.0; + aps->al_touchdown = FALSE; + aps->al_warn = FALSE; +} + + +void +aps_al_disable(craft * c) +{ + aps_Type * aps; + + if( c->aps == NULL ) + return; + + aps = aps_get(c); + if ( ! aps->al_enabled ) + return; + + aps->al_enabled = FALSE; + aps->al_warn = FALSE; + aps_aw_disable(c); +} + + +_BOOL +aps_al_enabled(craft * c) +{ + return (c->aps != NULL) && ( ((aps_Type *) (c->aps))->al_enabled ); +} + + +void +aps_al_toggle(craft * c) +{ + if( aps_al_enabled(c) ) + aps_al_disable(c); + else + aps_al_enable(c); +} + + +#define AL_ALIGN_TIME 30.0 +/* Expected time for LOC alignment (s). Decrease for faster realignment, + but beware of the Izz inertia and the rudder effectiveness because + values too small may introduce oscillations. +*/ + + +static void +aps_al_update(craft * c) +{ + aps_Type * aps; + viewer *u; + double dt, h, radial, adiff, adiff_dot, exp_adiff_dot, w, gs_offset, + v, vs, flare_thr; + int is_tricycle; + + aps = aps_get(c); + + if( ! aps->al_enabled ) + return; + + if( aps->al_prev_time == 0.0 ){ + /* First time we are called. */ + dt = 0.5; + } else { + dt = curTime - aps->al_prev_time; + } + + if ( dt < 0.5 ) + return; + + aps->al_prev_time = curTime; + + aps->al_warn = FALSE; + + h = units_METERStoFEET(c->w.z - terrain_localAltitude(c)) + - c->cinfo->rm.z - c->cinfo->Gm - c->cinfo->cmMax; + + u = c->vl; + + if( h > 250.0 /* ft */ ){ + /* + Get radial: + */ + if( u == NULL || ! hsi_loc_radial(u, &radial) ){ + aps_al_disable(c); + return; + } + + if (radial > M_PI / 2.0) { + adiff = radial - 2.0*M_PI; + } + else { + adiff = radial; + } + + adiff_dot = (adiff - aps->al_prev_adiff) / dt; + //adiff += adiff_dot * dt; /* guess adiff at next step */ + + exp_adiff_dot = forceRange( -0.69 /*log(2)*/ * adiff / AL_ALIGN_TIME, + units_DEGtoRAD(-0.1), units_DEGtoRAD(0.1)); + + w = 10.0 * (adiff_dot - exp_adiff_dot); + if( fabs(adiff) > units_DEGtoRAD(0.2) ) + w *= 2.0; + w = forceRange(w, units_DEGtoRAD(-3.0), units_DEGtoRAD(3.0)); + + aps_aw_set(c, w); + + aps->al_prev_adiff = adiff; + +#ifdef DEBUG + printf("adiff=%.1f" + " adiff_dot=%.3f" + " exp_adiff_dot=%.3f" + " w=%.1f " + "\n", + units_RADtoDEG(adiff), + units_RADtoDEG(w), + units_RADtoDEG(adiff_dot), + units_RADtoDEG(exp_adiff_dot)); +#endif + } + + v = units_FEETtoMETERS( c->IAS ); /* m/s */ + + /* + The flare maneuver starts when the radar altimeter indicates + flare_thr feet from the ground. This value is calculated + considering H_THR be a good value for a craft landing at V_THR + speed; other values are interpolated. + */ + + #define V_THR 160.0 /* kt */ + #define H_THR 50.0 /* ft */ + + flare_thr = H_THR / V_THR * units_METERStoNM(v)*3600.0; + + /* Bouncing fix: */ + if( !aps->al_touchdown && gear_mainWheelsGroundContact(c) ) + aps->al_touchdown = TRUE; + + if( h > 250.0 && hsi_gs_offset(u, &gs_offset) ){ + /* Follow GS, if available */ + + double vs_target; + + gs_offset = units_RADtoDEG( gs_offset ); + + if( gs_offset < -0.2 ){ + vs = 0.0; + } else { + vs_target = -0.0524 /* tan(3 DEG) */ * v; + vs = forceRange( (1.0 + 0.7*gs_offset) * vs_target, + 1.7*vs_target, 0.0); + } + + aps_ap_set_vs(c, vs); + + /* Ensure brakes be off: */ + gear_brakesDisengage(c); + + } else if( h < flare_thr ){ + /* + Flare maneuver. + + FIXME: for accuracy (and more realisitically) + determinate v.s. based on radar altimeter rather than + VSI. + */ + + /* Constant -1 DEG: */ + vs = -units_DEGtoRAD(1.0)*v; + + /* Linear curve: glide path angle = tan(1+2*h/flare_thr): */ + /* vs = -units_DEGtoRAD(1.0 + 2.0*h/flare_thr) * v; */ + + /* Quadratic curve: */ + /* vs = -units_DEGtoRAD(1.0 + h*h/(flare_thr*flare_thr)*2.0) * v; */ + + if( h < 0.5*flare_thr ){ + + /* Keep current engine setting: */ + aps_at_disable(c); + + if( aps->al_touchdown ){ + /* Main wheels in contact. */ + + /* If this is the first contact, set v_touchdown: */ + if( aps->al_v_touchdown == 0.0 ) + aps->al_v_touchdown = v; + + /* + Engine control: + + If thrust reverser available: + - set engine idle + - deploy thrust rev. + - set engine 75% power + - when speed < 0.4 v_touchdown, set engine idle + - when speed < 0.2 v_touchdown, retract thr. rev. + + If thrust rev. not available: + - set engine idle + */ + + if( c->cinfo->hasThrustReverser ){ + if( v > 0.4 * aps->al_v_touchdown ){ + if( c->thrust_reverse_on ){ + /* 75% power with thrust rev. */ + c->throttleComm = (int) (75.0/100.0 * 32768); + } else { + /* Engine idle: */ + c->throttleComm = (int) (20.0/100.0 * 32768); + pm_thrust_reverse_toggle(c); + } + } else { + /* Engine idle: */ + c->throttleComm = (int) (20.0/100.0 * 32768); + } + } else { + /* Engine idle: */ + c->throttleComm = (int) (20.0/100.0 * 32768); + } + + /* Extend speed brakes: */ + flaps_speed_brakes_extend(c); + /* note that the function above will be called several + times looping here, so ensuring the speed brakes + be fully extended */ + + /* + Pitch control. + Once the main wheels are on ground, we + have to deploy gently the nose/tail + wheel. To this aim we control the pitch + rate instead of the v.s. + */ + + is_tricycle = (c->cinfo->rn.x > c->cinfo->rm.x); + + if( aps_ap_enabled(c) ) + aps_ap_disable(c); + + if( ! is_tricycle && v > 0.85 * aps->al_v_touchdown ){ + pitch_rate_set(c, 0.0); + } else { + if( is_tricycle ){ + /* Gently lower the nose: */ + pitch_rate_set(c, -units_DEGtoRAD(2.0)); + } else { + /* Gently raise nose, avoiding to take-off again! */ + pitch_rate_set(c, units_DEGtoRAD(0.5)); + } + } + + if( gear_noseWheelGroundContact(c) ){ + /* All the wheels in contact. */ + + /* Keep current pitch so elevator transfers torque from nose to main: */ + pitch_rate_set(c, 0); + + /* + Brakes are enabled only on tricycle landing gears + when the nose is in contact and, if thrust rev. + available, when the speed is half the touchdown + speed: + */ + + if( is_tricycle + && ( !c->cinfo->hasThrustReverser + || v < 0.5 * aps->al_v_touchdown ) + ) + /* Brakes on: */ + gear_brakesEngage(c); + + if( v < 0.2 * aps->al_v_touchdown ){ + aps_al_disable(c); + aps_ap_disable(c); + aps_aw_disable(c); + pitch_rate_disable(c); + if( c->thrust_reverse_on ) + pm_thrust_reverse_toggle(c); + } + } + } else { + aps_ap_set_vs(c, vs); + } + + } else { + aps_ap_set_vs(c, vs); + } + + + } else if( h <= 250.0 ){ + /* ILS signal unreliable -- follow standard slope 3 DEG: */ + aps_ap_set_vs(c, -0.0524 /* tan(3 DEG) */ * v ); + } else { + aps_ap_set_vs(c, 0.0 ); + } +} + + +/** + * Enables pitch and roll rate control. + */ +void aps_rate_control_enable(craft * c) +{ + aps_Type * aps; + + aps = aps_get(c); + if ( aps->rate_control_enabled ) + return; + aps_an_disable(c); + aps_al_disable(c); + aps_aw_disable(c); + aps_ap_disable(c); + aps_ac_enable(c); + aps->rate_control_enabled = TRUE; +} + + +void aps_rate_control_disable(craft * c) +{ + aps_Type * aps; + + aps = aps_get(c); + if ( ! aps->rate_control_enabled ) + return; + aps->rate_control_enabled = FALSE; + pitch_rate_disable(c); + bank_rate_disable(c); +} + + +void aps_rate_control_toggle(craft * c) +{ + aps_Type * aps; + + aps = aps_get(c); + if ( aps->rate_control_enabled ) + aps_rate_control_disable(c); + else + aps_rate_control_enable(c); +} + + +_BOOL aps_rate_control_enabled(craft * c) +{ + return (c->aps != NULL) && ( ((aps_Type *) (c->aps))->rate_control_enabled ); +} + + +static void aps_rate_control_update(craft * c) +{ + aps_Type * aps; + double pitch_dot, bank_dot; + + aps = aps_get(c); + if ( ! aps->rate_control_enabled ) + return; + pitch_dot = - c->pitchComm * PITCH_DOT_MAX; + pitch_rate_set(c, pitch_dot); + bank_dot = - c->rollComm * BANK_DOT_MAX; + bank_rate_set(c, bank_dot); +} + + +/* + Warning detection + ================= +*/ + +_BOOL aps_ap_warn(craft *c) +{ + return (c->aps != NULL) + && ( ((aps_Type *) (c->aps))->ap_warn ); +} + + +_BOOL aps_at_warn(craft *c) +{ + return (c->aps != NULL) + && ( ((aps_Type *) (c->aps))->at_warn ); +} + + +_BOOL aps_al_warn(craft *c) +{ + return (c->aps != NULL) + && ( ((aps_Type *) (c->aps))->al_warn ); +} + + +_BOOL aps_an_warn(craft *c) +{ + return (c->aps != NULL) + && ( ((aps_Type *) (c->aps))->an_warn ); +} + + +_BOOL aps_aw_warn(craft *c) +{ + return (c->aps != NULL) + && ( ((aps_Type *) (c->aps))->aw_warn ); +} + + +_BOOL aps_ac_warn(craft *c) +{ + return (c->aps != NULL) + && ( ((aps_Type *) (c->aps))->ac_warn ); +} + + +void aps_update(craft * c) +{ + if ( c->aps == NULL ) + return; + + aps_at_update(c); + aps_an_update(c); + aps_al_update(c); + aps_ap_update(c); + aps_ac_update(c); + aps_aw_update(c); + aps_rate_control_update(c); + bank_rate_update(c); + pitch_rate_update(c); +} + + +void aps_off(craft * c) +{ + aps_at_disable(c); + aps_an_disable(c); + aps_al_disable(c); + aps_ap_disable(c); + aps_ac_disable(c); + aps_rate_control_disable(c); + aps_aw_disable(c); + bank_rate_disable(c); + pitch_rate_disable(c); +} + +/* End of aps.c */ diff -Nru acm-5.0/src/acm/aps.h acm-6.0+20200416/src/acm/aps.h --- acm-5.0/src/acm/aps.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/aps.h 2017-10-28 08:08:56.000000000 +0000 @@ -0,0 +1,199 @@ +/* + * acm - AutoPilot System module + * Copyright (C) 2007 Umberto Salsi + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +/** + * Auto-Pilot System (APS). Implements the following features: + * + * - AutoPilot (AP): hold altitude or hold climb ratio. + * - AutoCoordination (AC): rudder control in turns. + * - AutoTurn (AW): hold heading or hold turn ratio. + * - AutoNavigation (AN): follow HSI OBS. + * - AutoLanding (AL): follow ILS locator and glide plane. + * - AutoThrottle (AT): throttle control to keep IAS. + * - Rate control: pilot's stick position controls pitch ratio and roll ratio + * on a defined range. + * + * Keeps the status of the APS in the 'aps' fields of the 'craft' type. + * Each function may allocate the APS in the given craft if not already set, + * no need to call any specific initialization function. + */ + +#ifndef _aps_h +#define _aps_h + +#include "pm.h" + +#ifdef aps_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +/** + * Turns of the APS. + * @param c + */ +EXTERN void aps_off(craft * c); + +/** + * Enables AP: hold altitude (if climb ratio module less than +/-100 fpm) or + * hold climb ratio. + */ +EXTERN void aps_ap_enable(craft * c); + +/** + * Disables AP. + */ +EXTERN void aps_ap_disable(craft * c); + +/** + * Returns true if AP is enabled. + * @param c + * @return + */ +EXTERN _BOOL aps_ap_enabled(craft * c); + +/** + * AP enable/disable toggle. + * @param c + */ +EXTERN void aps_ap_toggle(craft * c); + +/** + * Set AP climb ratio. If current climb ratio is less than +/-100 fpm, hold + * altitude. + * @param c + * @param vs + */ +EXTERN void aps_ap_set_vs(craft * c, double vs /* m/s */); + +/** + * Returns the computed elevator correction as a number between -1.0 and +1.0. + * Returns 0.0 if AP disabled. + * @param c + * @return + */ +EXTERN double aps_get_delta_elevator(craft * c); + +/** + * Returns the computed ailerons correction as a number between-1.0 and +1.0. + * Returns 0.0 if AP not enabled. + * @param c + * @return + */ +EXTERN double aps_get_delta_ailerons(craft * c); + +/** Enables AC. */ +EXTERN void aps_ac_enable(craft * c); +/** Disables AC. */ +EXTERN void aps_ac_disable(craft * c); +/** Toggles AC status. */ +EXTERN void aps_ac_toggle(craft * c); +/** Returns true if AC currently enabled. */ +EXTERN _BOOL aps_ac_enabled(craft * c); +/** AC calculated rudder correction [-1,+1], or zero if disabled. */ +EXTERN double aps_ac_get_delta_rudder(craft * c); + +/** Enables AT. */ +EXTERN void aps_at_enable(craft * c); +/** Disables AT. */ +EXTERN void aps_at_disable(craft * c); +/** Toggles AT status. */ +EXTERN void aps_at_toggle(craft * c); +/** Returns true if AT currently enabled. */ +EXTERN _BOOL aps_at_enabled(craft * c); +/** Returns AT current target IAS (ft/s). */ +EXTERN double aps_at_get_velocity(craft * c); +/** Increments AT target IAS +5 KT. */ +EXTERN void aps_at_inc_velocity(craft * c); +/** Decrements AT target IAS -5 KT. */ +EXTERN void aps_at_dec_velocity(craft * c); + +/** Increments maximum bank angle +5 DEG. Max is 25; default is 25. */ +EXTERN void aps_bank_max_inc(craft * c); +/** Decrements maximum bank angle -5 DEG. Min is 5; default is 25. */ +EXTERN void aps_bank_max_dec(craft * c); +/** Returns current maximum allowed bank angle in turns (DEG). */ +EXTERN int aps_bank_max_get(craft * c); + +/** Enables AW. */ +EXTERN void aps_aw_enable(craft * c); +/** Disables AW. */ +EXTERN void aps_aw_disable(craft * c); +/** Returns true if AW currently enabled. */ +EXTERN _BOOL aps_aw_enabled(craft * c); + +/** + * Set AW turn rate around the current Earth vertical. + * @param c + * @param w Turn rate, left if positive (RAD/s). + */ +EXTERN void aps_aw_set(craft * c, double w); + +/** Returns current AW rate (RAD/s). */ +EXTERN double aps_aw_get(craft * c); + +/** Enables AN. */ +EXTERN void aps_an_enable(craft * c); +/** Disables AN. */ +EXTERN void aps_an_disable(craft * c); +/** Toggles AN. */ +EXTERN void aps_an_toggle(craft * c); +/** Returns true if AN currently enabled. */ +EXTERN _BOOL aps_an_enabled(craft * c); + +/** Enables AL on currently tuned ILS. Does nothing if no tuned ILS. */ +EXTERN void aps_al_enable(craft * c); +/** Disables AL. */ +EXTERN void aps_al_disable(craft * c); +/** Toggles AL. */ +EXTERN void aps_al_toggle(craft * c); +/** Returns true if AL currently enabled. */ +EXTERN _BOOL aps_al_enabled(craft * c); + +/** Enables rate control. */ +EXTERN void aps_rate_control_enable(craft * c); +/** Disables rate control. */ +EXTERN void aps_rate_control_disable(craft * c); +/** Toggles rate control. */ +EXTERN void aps_rate_control_toggle(craft * c); +/** Returns true if rate control currently enabled. */ +EXTERN _BOOL aps_rate_control_enabled(craft * c); + +/** Returns true if AP cannot attain the requested altitude or climb rate. */ +EXTERN _BOOL aps_ap_warn(craft * c); +/** Returns true if AT cannot attain the requested speed. */ +EXTERN _BOOL aps_at_warn(craft * c); +/** Returns true if AN cannot follow the VOR curse. */ +EXTERN _BOOL aps_an_warn(craft * c); +/** Returns true if AL cannot follow the ILS locator or glide slope. */ +EXTERN _BOOL aps_al_warn(craft * c); +/** Returns true if AW cannot attain the given turn rate. */ +EXTERN _BOOL aps_aw_warn(craft * c); +/** Returns true if the AC cannot compensate lateral acceleration. */ +EXTERN _BOOL aps_ac_warn(craft * c); + +/** + * Updates the internal state of the APS. Should be called frequently enough, + * at least every 0.1 s. Does nothing if no APS enabled. + * @param c + */ +EXTERN void aps_update(craft * c); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/astro.c acm-6.0+20200416/src/acm/astro.c --- acm-5.0/src/acm/astro.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/astro.c 2020-04-16 12:05:39.000000000 +0000 @@ -0,0 +1,304 @@ +/* + * IMPLEMENTATION NOTES + * + * NOTE 0. Earth motions accounted in this implementation: + * 1. Rotation around the polar axis. + * 2. Precession of the polar axis due to the Moon; nutations negligible. + * 3. Revolution around the Sun on an elliptic orbit at varying speed and + * varying distance. + * 4. Magic constant added to the time to account for light speed propagation + * and errors on the solstice date and perihelion date. + * Comparison with published ephemeris of years 2010 and 2017 matches within + * 0.1 DEG of latitude and 0.2 DEG of longitude - see test program. + * + * NOTE 1. Computing the position of the Sun in the geodetic Earth reference. + * We start the whole reasoning from a Sun-centric reference "S". The orbit of + * the Earth is the xy plane; the initial position of the Earth with components + * on the S reference is T_S = [r,0,0] being r the mean distance of the Earth + * from the Sun. + * We assume the Earth's polar axis be inclined toward the Sun by an angle sigma. + * + * The Earth rotates around the Sun on an ellipse; be r is initial distance from + * the Sun; the components of its position over time given in the S reference are: + * + * T_S(t) = [r*cos(omegaY*t + phiY), r*sin(omegaY*t + phiA), 0] + * + * where: + * + * omegaA = 2*PI / SIDERAL_YEAR, being SIDERAL_YEAR the revolution time of + * the Earth around the Sun in the S reference; + * + * phiA = phase to account for the actual start of the simulation. + * + * The distance from the Sun and the orbital angle of revolution depend on the + * time according to the Kepler laws; specific interpolation tables are computed + * just to solve this problem. + * + * For any point P, its components P_S in the S reference and its components T_G + * in the geodetic rotating Earth are related by: + * + * P_G = Rz(omegaD*t + phiD) * Ry(sigma) * (P_S - T_S(t)) + * + * where: + * + * Ry() and Rz() are "active" rotations around the y and z axis respectively, + * that is, the reference system rotates in the opposite direction; + * + * omegaD = 2*PI / SIDERAL_DAY, being SIDERAL_DAY the rotation period of the + * Earth around its polar axis measured in the S reference; + * phiA = phase to account for the actual start of the simulation. + * + * If the point P is the Sun itself P_S = [0,0,0] the formula above gives the + * position of the Sun with components in G: + * + * SUN_G(t) = Rz(omegaD*t + phiD) * Ry(sigma) * (- T_S(t)) + * + * Setting the correct values for phiY and phiD for any given departure time is + * a bit tricky, but note that with both values set to zero the date period is + * around the Summer solstice (21 of June) and the midnight is at the zero + * meridian. + * By setting the phase angle phiY we may set any other date, and this mainly + * affects the elevation of the Sun over the horizon. + * By setting the phase angle phiD we may set the current UTC on the simulated + * Earth. + * + * Equinox precession can be introduced by simply replacing the Ry(sigma) + * factor with the Rz(tss/(26000 years))Ry(sigma) where tss is the time elapsed + * since the summer solstice of reference and 26000 years is the precession + * period of the Earth axis. + * + * NOTE 2. The summer solstice of the year 2017 is assumed as a reference point + * for all the calculations. At this exact time the polar axis of the Earth was + * inclined toward the Sun, and from here we compute the state of the Earth for + * any future or past date, including the equinox precession. + */ + +#include +#include +#include +#include + +#include "../util/error.h" + +// LINKER_OPTIONS -lm + +#define astro_IMPORT +#include "astro.h" + +/** Earth sidereal polar axis rotation period (s). */ +#define astro_EARTH_SPIN_PERIOD (23.9344699 * 3600) + +/** Earth sidereal Sun orbit period (s). */ +#define astro_EARTH_ORBIT_PERIOD (365.256363004 * 86400.0) + +/** Minimal distance Earth to Sun (m). */ +#define astro_EARTH_ORBIT_PERIHELION (147.098291e9) + +/** Earth orbit eccentricity. */ +#define astro_EARTH_ORBIT_ECCENTRICITY (0.0167086) + +/** + * Earth polar axis angular inclination from the perpendicular to the orbit + * plane (RAD). This value refers to year 2017; the following parameters must + * refer to this same year. + */ +#define astro_EARTH_INCL (23.435*M_PI/180.0) + +/** + * Date and time of Earth solstice (ISO 8601 format). Allows to establish the + * orientation of the polar axis: in fact, at this exact time the polar axis + * is inclined toward the Sun. It should be the absolute time not affected by + * the light travel time and NOT the time the event can be observed from the + * Earth. I don't know if this is the case of the value I reported here, though. + */ +#define astro_EARTH_SUMMER_SOLSTICE_ZULU "2017-06-21T04:24" + +/** + * Date and time of Earth perihelion (ISO 8601 format). Allows to determine + * where the perihelion point of the orbit is in reference to our main reference + * point, the summer solstice, so that the varying orbital speed of the Earth + * and the correct distance of the Sun can be calculated. It should be the + * absolute time not affected by the light travel time and NOT the time the + * event can be observed from the Earth. I don't know if this is the case of the + * value I reported here, though. + */ +#define astro_EARTH_PERIHELION_ZULU "2017-01-04T14:18" + +/** If this module has been initialized. */ +static int initialized; +/** Offset to the simulator time to get time since summer solstice (s). */ +static double year_offset; +/** Offset to the simulator time to get angular rotation around polar axis. */ +static double day_offset; +/** + * Offset to the simulation time to get elapsed time since reference summer + * solstice. Used to calculate the Earth equinox precession. + */ +static double precession_offset; +static double perihelion_to_solstice_time; +static double theta_solstice; + +// Cached last position of the Sun. +static int last_available; +static double last_timestamp; +static VPoint last_sun; +#define astro_LAST_SUN_POSITION_EXPIRE_PERIOD (30) + +#define INTERPOLATION_TABLE_LEN (99) + +/** + * Interpolation table giving the Sun distance from Earth. The first value refers + * to the perihelion; the other values are computed at time steps of 1/INTERPOLATION_TABLE_LEN + * of the Earth sidereal period. Last entry duplicates the first one. + */ +static double rho_table[INTERPOLATION_TABLE_LEN]; + +/** + * Interpolation table giving the angular position of the Earth respect to the + * Sun measured from the perihelion. Each steps by 1/INTERPOLATION_TABLE_LEN + * ofthe Earth sidereal year, which means about 10 DEG. Last entry is + * (should be...) 360 DEG. + */ +static double theta_table[INTERPOLATION_TABLE_LEN]; + + +/** Converts ISO 8601 into Unix timestamp. */ +static int astro_zuluToTimestamp(char *zulu) +{ + zulu_Date d; + zulu_dateParse(zulu, &d); + return zulu_dateToTimestamp(&d); +} + + +/** + * Generates the interpolation tables distance and orbital angle of the Earth + * vs. time. + */ +static void astro_computeEarthTables() +{ + double p = (1 + astro_EARTH_ORBIT_ECCENTRICITY) * astro_EARTH_ORBIT_PERIHELION; + double e = astro_EARTH_ORBIT_ECCENTRICITY; + double a = astro_EARTH_ORBIT_PERIHELION / (1-e); // major axis + double b = astro_EARTH_ORBIT_PERIHELION * sqrt((1+e)/(1-e)); // minor axis + // dTheta = h/rho^2 * dt (Kepler law of equal areas) + double h = 2*M_PI*a*b/astro_EARTH_ORBIT_PERIOD; + double theta = 0; // initial theta + rho_table[0] = 0; // initial rho + theta_table[0] = theta; + double dt = astro_EARTH_ORBIT_PERIOD / (INTERPOLATION_TABLE_LEN - 1.0); + int i; + for(i = 1; i < INTERPOLATION_TABLE_LEN; i++){ + double rho = p / (1+e*cos(theta)); + theta += h * dt / (rho * rho); + rho_table[i] = rho; + theta_table[i] = theta; + } +} + + +/** + * Determines the orbital angle and distance of the Earth vs. Sun by + * interpolation of the tables. + * @param t Time elapsed since the perihelion (s). Multiple of the sidereal + * orbit period allowed as well. For time zero, for example, the minimal + * distance from the Sun and the angle zero are returned. + * @param rho Here returns the distance from the Sun (m). + * @param theta Here returns the orbital angle vs. summer solstice (RAD in [0,2*PI[). + */ +static void astro_earthRhoAndTheta(double t, double *rho, double *theta) +{ + t -= astro_EARTH_ORBIT_PERIOD * floor(t / astro_EARTH_ORBIT_PERIOD); + int i = t * (INTERPOLATION_TABLE_LEN - 1.0) / astro_EARTH_ORBIT_PERIOD; + double f = (INTERPOLATION_TABLE_LEN - 1.0) / astro_EARTH_ORBIT_PERIOD * t - i; + assert(0 <= i && i < INTERPOLATION_TABLE_LEN); + *rho = rho_table[i] + f * (rho_table[i+1] - rho_table[i]); + *theta = theta_table[i] + f * (theta_table[i+1] - theta_table[i]); +} + + +void astro_init(double simulation_time, zulu_Date *departure) +{ + /* + * Account here once for all for the light propagation delay Sun-to-Earth + * and error in the summer solstice and perihelion time we are currently using. + */ + simulation_time += 3.25*60; // 3.25 min seems to fit with data available + + int solstice_timestamp = astro_zuluToTimestamp(astro_EARTH_SUMMER_SOLSTICE_ZULU); + double since_solstice = zulu_dateToTimestamp(departure) - solstice_timestamp; + + year_offset = since_solstice; + // Normalize to [0,astro_EARTH_ORBIT_PERIOD[ range: + year_offset -= astro_EARTH_ORBIT_PERIOD * floor(year_offset / astro_EARTH_ORBIT_PERIOD); + year_offset -= simulation_time; + + zulu_Date solstice_date; + zulu_dateParse(astro_EARTH_SUMMER_SOLSTICE_ZULU, &solstice_date); + day_offset = 3600.0 * solstice_date.hour + + 60.0 * solstice_date.minutes + + solstice_date.seconds + + since_solstice; + // Normalize to [0,astro_EARTH_ROTATION_PERIOD[ range: + day_offset -= astro_EARTH_SPIN_PERIOD * floor(day_offset / astro_EARTH_SPIN_PERIOD); + day_offset -= simulation_time; + + precession_offset = - simulation_time + since_solstice; + + astro_computeEarthTables(); + + perihelion_to_solstice_time = astro_zuluToTimestamp(astro_EARTH_SUMMER_SOLSTICE_ZULU) + - astro_zuluToTimestamp(astro_EARTH_PERIHELION_ZULU); + + double dummy; + astro_earthRhoAndTheta(perihelion_to_solstice_time, &dummy, &theta_solstice); + + initialized = 1; + last_available = 0; +} + + +void astro_getSun(double simulation_time, VPoint *sun) +{ + if( ! initialized ) + error_internal("module not initialized", 0); + + // Return cached value most of the times: + if( last_available && simulation_time - last_timestamp < astro_LAST_SUN_POSITION_EXPIRE_PERIOD ){ + *sun = last_sun; + return; + } + + // Compute: + // rho = current distance from the Sun; + // year_angle = orbital angle since perihelion. + double year_angle, rho; + astro_earthRhoAndTheta(simulation_time + year_offset + perihelion_to_solstice_time, &rho, &year_angle); + // Convert angle to angle from summer solstice (polar axis facing the Sun): + year_angle -= theta_solstice; + year_angle -= 2*M_PI*floor(year_angle / (2*M_PI)); // normalize [0,2*PI[ + + VPoint p; + // (Minus sign actually needed next, not here) + p.x = - rho * cos(year_angle); + p.y = - rho * sin(year_angle); + p.z = 0; + + // FIXME: this matrix is constant. Or Earth precession should be accounted. + VMatrix m; + VIdentMatrix(&m); + // Equinox precession, 26000 years period: + VRotate(&m, ZRotation, (simulation_time + precession_offset) + /(26000.0*86400.0*365.25)); + VRotate(&m, YRotation, astro_EARTH_INCL); + VTransform_(&p, &m, &p); + + double day_angle = 2*M_PI/astro_EARTH_SPIN_PERIOD * (simulation_time + day_offset); + day_angle -= 2*M_PI*floor(day_angle / (2*M_PI)); + VIdentMatrix(&m); + VRotate(&m, ZRotation, day_angle); + VReverseTransform_(&p, &m, &p); + *sun = p; + last_sun = p; + last_available = 1; +} \ No newline at end of file diff -Nru acm-5.0/src/acm/astro.h acm-6.0+20200416/src/acm/astro.h --- acm-5.0/src/acm/astro.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/astro.h 2017-10-25 01:59:03.000000000 +0000 @@ -0,0 +1,45 @@ +/** + * Astronomical calculations. Currently, only the Earth position is calculated. + * The ACM program needs to know the position of the Sun to determinate the + * general brightness of the scene and to provide a further reference to + * pilots flying VFR. + * The returned values have been verified to be accurate within 0.1 DEG of + * latitude and 0.2 DEG of longitude (the apparent diameter of the Sun being + * only 0.5 DEG). + * + * @file + * @author Umberto Salsi + * @version $Date: 2017/10/25 01:59:03 $ + */ + +#ifndef ASTRO_H +#define ASTRO_H + +#include "../V/Vlibmath.h" +#include "../util/zulu.h" + +#ifdef astro_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +/** + * Initializes the module, and set the current position and rotation of the Earth + * in the Universe. + * @param simulation_time Simulation time (s). + * @param departure The state of the Earth is set at the specified date and time. + */ +EXTERN void astro_init(double simulation_time, zulu_Date *departure); + +/** + * Returns the current position of the Sun. Calculated values are cached and + * a new position is calculated only from time to time. + * @param simulation_time Simulation time (s). + * @param sun Here returns the current position of the Sun in the Earth geodetic + * reference (m). + */ +EXTERN void astro_getSun(double simulation_time, VPoint *sun); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/box.c acm-6.0+20200416/src/acm/box.c --- acm-5.0/src/acm/box.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/box.c 2017-10-22 14:38:44.000000000 +0000 @@ -0,0 +1,288 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1998 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ +#include +#include +#include + +#include "../util/error.h" +#include "../util/memory.h" +#include "pm.h" +#include "inventory.h" +#include "planes.h" + +#define box_IMPORT +#include "box.h" + +#define BB_HDR_SIZE (sizeof(char) + sizeof(char) + sizeof(short)) + +#define BB_TYPE_SHORT_STATE 0x00 +#define BB_TYPE_ADD_OBJECT 0x01 +#define BB_TYPE_DELETE_OBJECT 0x02 +#define BB_TYPE_END_OF_FRAME 0x03 + +typedef struct { + earth_LatLonAlt w; + VPoint Sg; + VPoint Cg; + double heading, pitch, roll; +} _BBShortState; + +typedef struct { + short type; /* craft type */ + char name[64]; /* craft name */ +} _BBNewObject; + +typedef struct { + unsigned char rectype; /* black box record type */ + unsigned char table; /* is it ptbl(0) or mtbl(1)? */ + unsigned short id; /* player or missile index */ + union { + _BBShortState short_state; + _BBNewObject object; + } u; +} BBRecord; + +static FILE *bbin = 0, *bbout = 0; + +static short rp_map[manifest_MAXPLAYERS], rm_map[manifest_MAXPROJECTILES]; +static short pp_map[manifest_MAXPLAYERS], pm_map[manifest_MAXPROJECTILES]; + + +static void +newBlackBoxCraft(int id, int type, char *name) +{ + register craft *c; + register int i, max; + register short *p; + + /* per PREfix */ + if (type != CT_PLANE && type != CT_DRONE && + type != CT_MISSILE && type != CT_CANNON) { + printf("Invalid craft type passed to newBlackBoxCraft()\n"); + } + + /* Initialize these vars in order to prevent warnings from gcc -Wall: */ + c = NULL; + max = 0; + p = NULL; + + switch (type) { + + case CT_PLANE: + case CT_DRONE: + if ((i = planes_newPlane(name)) >= 0) { + c = &ptbl[i]; + c->type = type; + c->flags = FL_BLACK_BOX; + memory_strcpy(c->name, sizeof(c->name), name); + pp_map[id] = i; + } + else { + fprintf(stderr, "No room in player table to add another black box object.\n"); + } + return; +/*NOTREACHED */ break; + + case CT_MISSILE: + case CT_CANNON: + c = mtbl; + max = manifest_MAXPROJECTILES; + p = rm_map; + break; + + default: error_internal("type=%d", type); + } + + for (i = 0; i < max; ++i, ++c) { + if (c->type == CT_FREE) { + c->type = type; + c->flags = FL_BLACK_BOX; + c->cinfo = inventory_craftTypeSearchByZoneAndName(NULL, name); + p[id] = i; + } + } +} + +void +box_startRecording(void) +{ + int i; + + if ((bbout = fopen("./black_box_output", "w")) == (FILE *) NULL) { + fprintf(stderr, "unable to open black box recording file\n"); + } + for (i = 0; i < manifest_MAXPLAYERS; ++i) { + rp_map[i] = -1; + } + for (i = 0; i < manifest_MAXPROJECTILES; ++i) { + rm_map[i] = -1; + } +} + +void +box_endRecording(void) +{ + if ( bbout == NULL ) return; + fclose(bbout); + bbout = (FILE *) NULL; +} + +void +box_startPlayback(void) +{ + int i; + + if ((bbin = fopen("./black_box_input", "r")) == (FILE *) NULL) { + fprintf(stderr, "unable to open black box playback file\n"); + } + for (i = 0; i < manifest_MAXPLAYERS; ++i) { + pp_map[i] = -1; + } + for (i = 0; i < manifest_MAXPROJECTILES; ++i) { + pm_map[i] = -1; + } +} + +/* + * Update items under the control of black box playback + */ + +void +box_input(void) +{ + register int i; + BBRecord rec; + craft *c; + + if (bbin) { + while (fread((char *) &rec, BB_HDR_SIZE, 1, bbin) == 1) { + + c = (rec.table == 0) ? &ptbl[pp_map[rec.id]] : + &mtbl[pm_map[-(int) rec.id]]; + + switch (rec.rectype) { + + case BB_TYPE_SHORT_STATE: + fread((char *) &rec.u.short_state, + sizeof(rec.u.short_state), 1, bbin); + if (pp_map[rec.id] == -1) + break; + c->prevSg = c->Sg; + c->w = rec.u.short_state.w; + c->Sg = rec.u.short_state.Sg; + c->Cg = rec.u.short_state.Cg; + c->curRoll = rec.u.short_state.roll; + c->curPitch = rec.u.short_state.pitch; + c->curHeading = rec.u.short_state.heading; + break; + + case BB_TYPE_ADD_OBJECT: + fread((char *) &rec.u.object, + sizeof(rec.u.object), 1, bbin); + newBlackBoxCraft(rec.id, rec.u.object.type, + rec.u.object.name); + break; + + case BB_TYPE_DELETE_OBJECT: + pp_map[rec.id] = -1; + c->kill(c, "(FIXME)"); + break; + + case BB_TYPE_END_OF_FRAME: + return; + + default: + fprintf(stderr, "unknown rectype in\ + black box recording: %d\n", rec.rectype); + fclose(bbin); + bbin = (FILE *) NULL; + break; + } + } + fclose(bbin); + bbin = (FILE *) NULL; + for (i = 0; i < manifest_MAXPLAYERS; ++i) { + if (pp_map[i] != CT_FREE) + ptbl[pp_map[i]].kill(&ptbl[pp_map[i]], "(FIXME)"); + } + } +} + +/* + * Write out black box records + */ + +void +box_output(void) +{ + register int i; + register craft *c; + BBRecord rec; + + if (bbout) { + for (i = 0, c = ptbl; i < manifest_MAXPLAYERS; ++i, ++c) { + + if (c->type != CT_FREE) { + + if (rp_map[i] == -1) { + rp_map[i] = i; + rec.rectype = BB_TYPE_ADD_OBJECT; + rec.table = 0; + rec.id = i; + rec.u.object.type = c->type; + memory_strcpy(rec.u.object.name, sizeof(rec.u.object.name), + c->cinfo->name); + fwrite((char *) &rec, BB_HDR_SIZE, 1, bbout); + fwrite((char *) &rec.u.object, + sizeof(rec.u.object), 1, bbout); + } + rec.rectype = BB_TYPE_SHORT_STATE; + rec.table = 0; + rec.id = i; + rec.u.short_state.w = c->w; + rec.u.short_state.Sg = c->Sg; + rec.u.short_state.Cg = c->Cg; + rec.u.short_state.roll = c->curRoll; + rec.u.short_state.pitch = c->curPitch; + rec.u.short_state.heading = c->curHeading; + fwrite((char *) &rec, BB_HDR_SIZE, 1, bbout); + fwrite((char *) &rec.u.object, + sizeof(rec.u.short_state), 1, bbout); + } + } + for (i = 0; i < manifest_MAXPROJECTILES; ++i) { + rm_map[i] = -1; + } + + rec.rectype = BB_TYPE_END_OF_FRAME; + rec.id = 0; + fwrite((char *) &rec, BB_HDR_SIZE, 1, bbout); + } +} + +void +box_killPlayer(int id) +{ + BBRecord rec; + + if (bbout) { + rec.rectype = BB_TYPE_DELETE_OBJECT; + rec.id = id; + fwrite((char *) &rec, BB_HDR_SIZE, 1, bbout); + } +} diff -Nru acm-5.0/src/acm/box.h acm-6.0+20200416/src/acm/box.h --- acm-5.0/src/acm/box.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/box.h 2020-04-16 12:05:39.000000000 +0000 @@ -0,0 +1,49 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991,1992 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +/** + * Black box recording and playback. + * + * FIXME: This module not finished yet, still undocumented (U.S.). + * + * @author Riley Rainey + * @license GNU GPL + * @version $Date: 2020/01/08 06:00:16 $ + * @file + */ + +#ifndef _box_h +#define _box_h + +#include "pm.h" + +#ifdef box_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +EXTERN void box_input(void); +EXTERN void box_killPlayer(int id); +EXTERN void box_output(void); +EXTERN void box_endRecording(void); +EXTERN void box_startPlayback(void); +EXTERN void box_startRecording(void); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/browse.c acm-6.0+20200416/src/acm/browse.c --- acm-5.0/src/acm/browse.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/browse.c 2017-10-22 14:39:08.000000000 +0000 @@ -0,0 +1,570 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1998 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#include +#include +#include +#include +#include "box.h" +#include "damage.h" +#include "dis_if.h" +#include "drone.h" +#include "inventory.h" +#include "joystick.h" +#include "pm.h" +#include "render.h" + +#define browse_IMPORT +#include "browse.h" + +#define MAX_MAPPED_STRING_LEN 20 +#define MAX_POPUP_STRING_LEN 40 + +#define REF_X -1.3 +#define REF_Y -1.1 + + +/* There's a bug lurking here, but for now ... */ + +#ifdef WINNT +#define SCALE_1 5.0 +#else +#define SCALE_1 7.0 +#endif + +struct _dis_browse { + char info[32]; + dis_if_Entity *p; + craftType *cinfo; /* craftType iff this an aircraft we can grab */ +}; + +#define BROWSE_MAX 256 +#define ITEM_LIMIT 5 +#define LINE_SPACING 0.2 + +static struct _dis_browse browse_info[BROWSE_MAX]; +static int bcount; + +/* + * Generate the stealth browsing table from the current DIS + * entity database + */ + +static void +buildBrowseInfoTable () +{ + abort(); +#ifdef xxxxxxxxxxxxxxxxxxxxxxxx + dis_if_Entity * e = dis_if_getEntityTable(), *ep; + long etop = dis_if_getEntityTop(); + int i=0; + craftType * cinfo; + char *marker; + + ep = e; + bcount = 0; + + /* + * Update the list of entities we might be interested in following + */ + + for (i = 0; i <= etop && bcount < BROWSE_MAX; ++i, ++ep) { + if (ep->entityType.kind == DISKindPlatform && + ep->entityType.domain == DISDomainAir) { + browse_info[bcount].p = ep; + + /* + * Was this an aircraft type defined in the inventory file? + * If so, mark it as "flyable". + */ + + cinfo = inventory_craftTypeSearchByEntityType( &ep->entityType ); + if (cinfo && cinfo->CLift) { + browse_info[bcount].cinfo = cinfo; + marker = "* "; + } + else { + browse_info[bcount].cinfo = NULL; + marker = " "; + } + + sprintf (browse_info[bcount].info, "%s%d,%d,%d", + marker, + ep->entityId.sim_id.site_id, + ep->entityId.sim_id.application_id, + ep->entityId.entity_id + ); + ++ bcount; + } + } +#endif +} + +#ifdef XXXXXXXXXXXXXXXXXXXXXXXXXXXXX +/* + * Display the stealth browser page in the MFD + */ + +void +browse_page(craft * c, viewer * u) +{ + XSegment seg[2048], m_seg[256]; + char buf[256]; + int slot_size, m_i = 0, i = 0, xc, yc, h, x, y; + int item_count; + static Alib_ZInfo z, zm; + double yy; + + + if (c->radarMode != RM_DIS_BROWSE) + return; + + z.depth = --u->v->w->depth; + z.color = (Alib_Pixel) (u->v->w->pixel[panelBackgroundColor]); + zm.depth = z.depth; + zm.color = (Alib_Pixel) (u->v->w->pixel[magentaColor]); + Alib_fillRectangle(u->v->w, &u->indicator, &z); + + slot_size = RectWidth(u->indicator); + xc = u->indicator.a.x + (slot_size + 1) / 2; + yc = u->indicator.a.y + (slot_size + 1) / 2; + + yy = 0.0; + + h = (int) (11.0 * u->xscaleFactor + 0.5); + y = (int) ((REF_Y + yy) * u->v->Scale.y / (SCALE_1 * 4)); + + /* + * Update the list of entities we might be interested in following + */ + + buildBrowseInfoTable (); + + /* + * display current DIS entity browsing page + */ + + item_count = 0; + for (i=u->browseBase; + iv->Scale.x / (SCALE_1 * 4)); + y = (int) ((REF_Y + yy) * u->v->Scale.y / (SCALE_1 * 4)); + if (u->browseSelectedItem == i) { + VDrawStrokeString(u->v, x + xc, y + yc, + buf, + strlen(buf), h, zm.color); + } + else { + VDrawStrokeString(u->v, x + xc, y + yc, + buf, + strlen(buf), h, z.color); + } + yy += LINE_SPACING; + } + + VSetClipRect(u->v, &u->indicator); + + VDrawSegments(u->v, m_seg, m_i, + (Alib_Pixel) (u->v->w->pixel[magentaColor])); + + VDrawSegments(u->v, seg, i, + (Alib_Pixel) (u->v->w->pixel[HUDPixel])); + + return; +} +#endif /* XXXXXXXXXXXXXXXXXX */ + +int +browse_controlRequestCallback( dis_pdu *pdu, void *pu ) +{ + abort(); +#ifdef xxxxxxxxxxxxxxxxxxxxxxxxxxxx + viewer *u = (viewer *) pu; + dis_if_Entity *e, *ep; + dis_simulation_addr my_addr; + dis_entity_id new_entity_id; + disx_ApplicationInfo *app; + craft *c; + + if ( pdu->hdr.pdu_type == PDUTypeAcknowledge && + pdu->acknowledge.resp_flag == 1) { + + /* + * "take over the craft" + * + * alter the viewer entry to reflect that we've hijacked an aircraft + * + * alter the ptbl (craft) entry to reflect that this is now an aircraft + * that we are responsible for modeling + */ + + u->viewer_state = ViewerStateNormal; + c = u->watchedCraft; + u->watchedCraft = u->c; + u->c = c; + + c->type = CT_PLANE; + c->vl = u; + + c->radarMode = RM_STANDBY; + + /* + * Until we can think of a better way to set fuel state, + * damage bits, etc. this will have to suffice. + */ + + (*c->cinfo->resupply) (c); + + /* FIXME: array 'entities' does not exist anymore */ + ep = &entities[c->disId]; + + ep->entryType = dis_if_LOCAL; + + app = dis_if_getApplicationInfo(); + disx_getSimulationAddress ( app, &my_addr ); + + /* SITE ID */ + + if ((transferEntityIdBits & 0x4)) { + new_entity_id.sim_id.site_id = my_addr.site_id; + } + else { + new_entity_id.sim_id.site_id = + ep->entityId.sim_id.site_id; + } + + /* APPLICATION ID */ + + if ((transferEntityIdBits & 0x2)) { + new_entity_id.sim_id.application_id = my_addr.application_id; + } + else { + new_entity_id.sim_id.application_id = + ep->entityId.sim_id.application_id; + } + + /* ENTITY ID */ + + if ((transferEntityIdBits & 0x1)) { + + /* Issue a new entity id (good within this application) */ + + dis_entity_id temp_id; + + disx_issueEntityID( app, &temp_id ); + new_entity_id.entity_id = temp_id.entity_id; + } + else { + + /* use existing entity ID */ + new_entity_id.entity_id = ep->entityId.entity_id; + } + + /* TODO: check for collisions in entity table if mode wasn't 0, or 7 */ + ep->entityId = new_entity_id; + + } + + /* + * Transfer Control Request was rejected. Return to stealth state. + */ + + else { + u->viewer_state = ViewerStatePiggyback; + XBell( u->dpy, 50 ); + } + + return 0; +#endif +} + + +int +browse_stealthCraft( craft *c, viewer *u, int item, int take_control) +{ + int i; + + /* + * Locate the browse info entry that corresponds to the + * designated craft. + */ + + if ( item == -1 ) { + + buildBrowseInfoTable (); + + for(i=0; ic == c) { + item = i; + break; + } + } + } + + /* follow that aircraft */ + if ( item != -1 ) { + u->browseSelectedItem = item; + } + else { + u->browseSelectedItem = -1; + } + + if ( end_game_mode && take_control && item != -1 ) { + browse_info[item].p->c->flags |= FL_END_GAME_DRONE; + u->viewer_state = ViewerStateControlPending; + drone_endGameDistanceCheck(browse_info[item].p->c, u); + } + else { + u->viewer_state = ViewerStatePiggyback; + } + u->watchedCraft = c; + + return 0; +} + +#ifdef XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +int +browse_keyEvent(craft * c, viewer * u, XEvent * ev, int player) +{ + + KeySym keysym; + XComposeStatus compose; + char buffer[MAX_MAPPED_STRING_LEN]; + int buflen = MAX_MAPPED_STRING_LEN; + + (void) XLookupString((XKeyEvent *) ev, buffer, buflen, + &keysym, &compose); + + if (player) { + + switch (keysym) { + +#ifdef sun + case XK_R7: +#else + case XK_Home: +#endif + + break; + + case XK_Prior: + u->browseBase -= ITEM_LIMIT; + if (u->browseBase < 0) { + u->browseBase = 0; + XBell ( u->dpy, 50 ); + } + break; + + case XK_Next: + u->browseBase += ITEM_LIMIT; + if (u->browseBase >= bcount) { + u->browseBase = bcount - ITEM_LIMIT + 1; + } + if (u->browseBase < 0) { + u->browseBase = 0; + XBell ( u->dpy, 50 ); + } + break; + +#ifdef sun + case XK_Up: +#else + case XK_KP_8: +#endif + render_setOutsideView(c, u, render_VIEW_FORWARD); + break; + +/* look right */ + +#ifdef sun + case XK_Right: +#else + case XK_KP_6: +#endif + render_setOutsideView(c, u, render_VIEW_RIGHT); + break; + +/* look left */ + +#ifdef sun + case XK_Left: +#else + case XK_KP_4: +#endif + render_setOutsideView(c, u, render_VIEW_LEFT); + break; + +/* look back */ + +#ifdef sun + case XK_Down: +#else + case XK_KP_2: +#endif + render_setOutsideView(c, u, render_VIEW_AFT); + break; + +/* look up */ + +#ifdef sun + case XK_R11: +#else + case XK_KP_5: +#endif + render_setOutsideView(c, u, render_VIEW_UP); + break; + + case XK_N: + case XK_n: + c->flags ^= FL_CHASE_VIEW; + break; + +#ifdef SPECIAL_KEYS + + case XK_o: + if (! damage_absorbDamage(c, 3) == 0) { + c->kill(c, "You asked to absorb some damage. The aircraft was destroyed. No further details are available."); + return -1; + } + break; + + + case XK_semicolon: + debug ^= 1; + break; + +#endif + + case XK_P: + case XK_p: + c->kill(c, "(FIXME)"); + return -1; +/*NOTREACHED */ break; + + case XK_braceleft: + box_startRecording(); + break; + + case XK_braceright: + box_endRecording(); + break; + + case XK_bracketleft: + box_startPlayback(); + break; + + case XK_k: + case XK_K: + joystick_calibrate(); + break; + + } + + } + return 0; +} +#endif /* XXXXXXXXXXXX */ + + +void +browse_selectCockpitItem( craft *c, + viewer *u, + int x, + int y, + unsigned long time + ) +{ + double dy, yscale; + int slot_size, item; + int yc; + + slot_size = RectWidth(u->indicator); + yc = u->indicator.a.y + (slot_size + 1) / 2; + + yscale = (int) (u->v->Scale.y / (SCALE_1 * 4)); + + if (c->radarMode != RM_DIS_BROWSE) { + return; + } + + /* + * Click on radar set? + */ + + if (x > u->indicator.a.x && x < u->indicator.a.x + slot_size && + y > u->indicator.a.y && y < u->indicator.a.y + slot_size) { + + /* get index of selected item */ + + dy = (y - yc) / yscale; + dy -= REF_Y; + item = (int) ( dy / LINE_SPACING ) + u->browseBase; + + if (item < bcount && item >= 0) { + + /* + * Double-Click? Activate control request + */ + + if (u->browseSelectedItem == item && + time - u->browseClickTime < 500) { + + /* + * We can only take control of aircraft that we have a + * definition for. When that's the case for a given + * entity, cinfo will be non-NULL. + */ + + if (browse_info[item].cinfo) { + + /* + * If we're in end-game mode, check for hostile + * aircraft in our proximity. Calling + * drone_endGameDistanceCheck once will cause it to be called + * once per second. + */ + + u->viewer_state = ViewerStateControlPending; + + if ( end_game_mode ) { + browse_info[item].p->c->flags |= FL_END_GAME_DRONE; + drone_endGameDistanceCheck(browse_info[item].p->c, u); + } + else { + dis_if_requestControl ( browse_info[item].p, + browse_controlRequestCallback, u ); + } + } + else { + //XBell( u->dpy, 50 ); + } + + } + else { + + browse_stealthCraft ( browse_info[item].p->c, u, item, 0 ); + + } + } + + } + + u->browseClickTime = time; +} \ No newline at end of file diff -Nru acm-5.0/src/acm/browse.h acm-6.0+20200416/src/acm/browse.h --- acm-5.0/src/acm/browse.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/browse.h 2020-04-16 12:05:39.000000000 +0000 @@ -0,0 +1,60 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1998 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +/** + * DIS entities browser and entity take over. + * + * FIXME: this modules does not work anymore, mostly trying to implement an + * experimental DIS feature, unfinished yet (U.S.). + * + * @author Riley Rainey + * @license GNU GPL + * @version $Date: 2020/01/08 06:00:49 $ + * @file + */ + +#ifndef _browse_h +#define _browse_h + +#include "../dis/dis/dis.h" +#include "pm.h" + +#ifdef browse_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +/** + * This callback is invoked by the DIS code when we receive a grant + * control PDU that we've been waiting for. + */ +EXTERN int browse_controlRequestCallback( dis_pdu *pdu, void *pu ); + +//EXTERN int browse_keyEvent(craft * c, viewer * u, XEvent * ev, int player); +//EXTERN void browse_page(craft * c, viewer * u); + +/** + * Switch attention to the designated aircraft. + */ +EXTERN int browse_stealthCraft(craft *c, viewer *u, int item, int take_control); + +EXTERN void browse_selectCockpitItem( craft *c, viewer *u, int x, int y, unsigned long time); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/ccip.c acm-6.0+20200416/src/acm/ccip.c --- acm-5.0/src/acm/ccip.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/ccip.c 2017-10-28 08:10:02.000000000 +0000 @@ -0,0 +1,608 @@ +#include +#include "air.h" +#include "damage.h" +#include "dis_if.h" +#include "draw.h" +#include "effects.h" +#include "init.h" +#include "inventory.h" +#include "../util/memory.h" +#include "pm.h" +#include "terrain.h" +#include "weapon.h" +#include "gear.h" +#include "../util/units.h" + +#define ccip_IMPORT +#include "ccip.h" + +static int select_mk82(craft *); +static int display_mk82(craft *, craftType *, viewer *, int, int); +static int update_mk82(craft *); +static int press_mk82(craft *); +static int release_mk82(craft *); + +static weapon_Type mk82Desc = +{ + select_mk82, /* select */ + update_mk82, /* update */ + display_mk82, /* display procedure */ + press_mk82, /* fire */ + release_mk82, /* fire button release */ +}; + +static char * ccip_update(craft * c); +static void ccip_kill(craft * c, char *reason); + + +static void +computeImpactPoint(craft *c, earth_LatLonAlt *ip) +{ + double t_sec, ground_speed_fps, loft_distance_feet; + double T1_sec, T2_sec; + double A, B, C, S4AC; + double sin_course, cos_course; + + /* + * Local terrain skin location + */ + + *ip = c->w; + ip->z = terrain_localAltitude(c); + + A = - 0.5 * units_earth_g; + B = - c->Cg.z; + C = units_METERStoFEET ( c->w.z - ip->z ); + + S4AC = sqrt ( B * B - 4.0 * A * C ); + + /* + * Compute time to impact using the solution to the quadratic formula: + * + * x = 0.5 * ( - earth_g ) * t^2 + v0 * t + x0 + * + * v0 = vertical velocity (up positive, feet-per-second) + * x0 = height above surface (feet) + */ + + if (S4AC >= 0.0) { + + T1_sec = ( - B + S4AC ) / ( 2.0 * A ); + T2_sec = ( - B - S4AC ) / ( 2.0 * A ); + + } + else { + /* complex root(s) */ + T1_sec = T2_sec = 10.0; /* FIXME: ??? */ + } + + t_sec = (T1_sec > T2_sec) ? T1_sec : T2_sec; + + ground_speed_fps = sqrt ( c->Cg.x * c->Cg.x + c->Cg.y * c->Cg.y ); + + loft_distance_feet = ground_speed_fps * t_sec; + + /* + * Based on instantaneous velocity, not aircraft orientation + */ + + cos_course = c->Cg.x / ground_speed_fps; + sin_course = c->Cg.y / ground_speed_fps; + + earth_updateLatLon(ip, cos_course, sin_course, units_FEETtoMETERS ( loft_distance_feet ) ); + +} + + +static int count[manifest_MAXPLAYERS]; +static int hasFired[manifest_MAXPLAYERS]; + +static int +select_mk82( craft * c ) +{ + hasFired[c->pIndex] = 0; + count[c->pIndex] = weapon_countOrdinance(c, weapon_MK82); + return 1; +} + +weapon_Type * +ccip_new(void) +{ + + craftType *c; + FILE *f; + dis_entity_type em1 = {2, 9, 225, 2, 73, 0, 0}; + dis_entity_type em2 = {0, 0, 0, 0, 0, 0, 0}; + + c = inventory_craftTypeNew(NULL); + c->name = memory_strdup( weapon_idToName(weapon_MK82) ); + + mk82Desc.w = c; + + c->entityType = em1; + c->altEntityType = em2; + + /* + * Unverified parameters calculated using DATCOM recommendations + */ + + c->CDOrigin = 0.081; + c->CDFactor = 0.0; + c->CDBOrigin = 0.0; + c->CDBFactor = 0.0; + c->emptyWeight = 510.0; + c->wingS = 1.0; /* FIXME */ + c->maxFuel = 0.0; + c->maxThrust = 0.0; + c->spFuelConsump = 0.0; + + /* + * dCL/da = 4.09 + * dCm,cg/da = -21.4 + */ + + f = init_fopen("missiles/sa10.obv", "r"); /* FIXME */ + c->object = VReadObject(f); + fclose(f); + + return &mk82Desc; +} + + +static int +dropOrdinance ( craft *c, int ind ) +{ + craft *m; + int i; + VPoint s, s1; + VPoint cY, mX, mY, mZ; + double v; + double disLocation[3]; + VPoint velocity; + double disVelocity[3]; + double disZeroVec[3]; + double disOrientation[3]; + + /* + * Find an empty projectile entry + */ + + for ((i = 0, m = &mtbl[0]); i < manifest_MAXPROJECTILES; (++i, ++m)) { + if (m->type == CT_FREE) { + m->type = CT_BOMB; + break; + } + } + + if (i == manifest_MAXPROJECTILES) + return -1; + + m->cinfo = inventory_craftTypeSearchByZoneAndName(NULL, "MK82"); + m->fuel = 0.0; + m->curThrust = 0.0; + m->owner = c->pIndex; + m->payload = 0.0; + m->armTimer = 0.0; + m->prevSg = c->Sg; + +/* + * Build trihedral based on the launching aircraft's current velocity vector + * rather than simply it's current direction vector. + * + * (1) build a unit velocity vector. + * (2) calculate bomb local Z axis from + * plane's-y-axis CROSS bomb's-unit-velocity-vector + * (3) calculate bomb's Y axis. + */ + + if ((v = VMagnitude(&c->Cg)) < 1.0) { + m->trihedral = c->trihedral; + m->curRoll = c->curRoll; + m->curPitch = c->curPitch; + m->curHeading = c->curHeading; + } + else { + mX = c->Cg; + mX.x /= v; + mX.y /= v; + mX.z /= v; + cY.x = c->trihedral.m[0][1]; + cY.y = c->trihedral.m[1][1]; + cY.z = c->trihedral.m[2][1]; + + VCrossProd(&mX, &cY, &mZ); + VCrossProd(&mZ, &mX, &mY); + + m->trihedral.m[0][0] = mX.x; + m->trihedral.m[1][0] = mX.y; + m->trihedral.m[2][0] = mX.z; + m->trihedral.m[0][1] = mY.x; + m->trihedral.m[1][1] = mY.y; + m->trihedral.m[2][1] = mY.z; + m->trihedral.m[0][2] = mZ.x; + m->trihedral.m[1][2] = mZ.y; + m->trihedral.m[2][2] = mZ.z; + + pm_euler(m); + } + + m->Cg = c->Cg; + VTransform(&(c->cinfo->wStation[ind]), &(c->trihedral), &s1); + VReverseTransform_(&s1, &c->XYZtoNED, &s); + m->Sg.x = c->prevSg.x + units_FEETtoMETERS(s.x); + m->Sg.y = c->prevSg.y + units_FEETtoMETERS(s.y); + m->Sg.z = c->prevSg.z + units_FEETtoMETERS(s.z); + earth_XYZToLatLonAlt(&m->Sg, &m->w); + earth_generateWorldToLocalMatrix(&m->w, &m->XYZtoNED); + m->armTimer = m->cinfo->armDelay; + m->flags = 0; + m->createTime = curTime; + + m->curRadarTarget = -1; + m->update = ccip_update; + m->kill = ccip_kill; + +/* + * ACM bombs are DIS "tracked munitions", so we are + * responsible for sending entity state PDU's for them + */ + + { + VPoint tmp; + + disLocation[0] = m->Sg.x; + disLocation[1] = m->Sg.y; + disLocation[2] = m->Sg.z; + tmp.x = units_FEETtoMETERS(m->Cg.x); + tmp.y = units_FEETtoMETERS(m->Cg.y); + tmp.z = units_FEETtoMETERS(m->Cg.z); + VReverseTransform_(&tmp, &m->XYZtoNED, &velocity); + disVelocity[0] = velocity.x; + disVelocity[1] = velocity.y; + disVelocity[2] = velocity.z; + disZeroVec[0] = 0.0; + disZeroVec[1] = 0.0; + disZeroVec[2] = 0.0; + disOrientation[0] = m->curHeading; + disOrientation[1] = m->curPitch; + disOrientation[2] = m->curRoll; + dis_if_entityEnter(c->force, m, + &m->cinfo->entityType, + &m->cinfo->altEntityType, + disLocation, disVelocity, + disZeroVec, disOrientation, + disZeroVec, &m->disId); + } + return 0; +} + + +static int +update_mk82(craft * c) +{ + int i; + + if( ! hasFired[c->pIndex] ) + return 1; + + hasFired[c->pIndex] = 0; /* reset fire request */ + + /* + * Bombs won't drop if we have "Weight on wheels" + * or if we run out of ammunition. + */ + + if( gear_someWheelGroundContact(c) + || count[c->pIndex] <= 0 ) + return 1; + + /* Get station from which to drop the bomb: */ + i = weapon_getReadyStation(c, weapon_MK82); + if (i < 0){ + fprintf(stderr, "Oops. Can't find an MK82\n"); + return 1; + } + + /* + * Decrement bombs counter. + * In arcade mode, we never run out of ammunition + */ + + if ( ! arcadeMode ) { + c->station[i].id = -1; + count[c->pIndex]--; + } + + /* Drop bomb from station i: */ + dropOrdinance (c, i); + /* playSound(c, SoundBombDrop); */ + + return 1; +} + +static int +display_mk82(craft *c, craftType *ct, viewer *u, int fpm_x, int fpm_y) +{ + char s[16]; + earth_LatLonAlt ip_wc; /* impact point (world) */ + VPoint ip_gc; /* impact point (geocentric XYZ coords) */ + VPoint ip_ned; /* impact point (NED coords) */ + VPoint ip_eye; /* impact point (eye space) */ + double x0, y0; /* cross center (viewport coords, pixels) */ + double xscale, yscale; /* world-to-viewport scale factors */ + +/* + * Update HUD display strings. + */ + + sprintf(s, "%d %s", count[c->pIndex], weapon_idToName(weapon_MK82)); + strcpy(c->leftHUD[3], s); + strcpy(c->leftHUD[2], ""); + strcpy(c->leftHUD[4], ""); + + /* Compute impact point ip_wc (world coords): */ + computeImpactPoint(c, &ip_wc); + + /* Compute impact point ip_gc (geocentric coords XYZ): */ + earth_LatLonAltToXYZ(&ip_wc, &ip_gc); + + /* Compute impact point ip_eye (pilot's eye coords): */ + VTransform(&ip_gc, &c->XYZtoNED, &ip_ned); + VReverseTransform(&ip_ned, &c->AXYZtoNED, &ip_eye); + /* Pilot's head position correction: */ + ip_eye.x -= units_FEETtoMETERS(c->cinfo->viewPoint.x); + ip_eye.y -= units_FEETtoMETERS(c->cinfo->viewPoint.y); + ip_eye.z -= units_FEETtoMETERS(c->cinfo->viewPoint.z); + + /* + Display CCIP circle only if the impact point is ahead of us and + closer than 45 DEG from HUD center: + */ + + if( ip_eye.x > 0.0 + && ip_eye.x * ip_eye.x > ip_eye.y * ip_eye.y + ip_eye.z * ip_eye.z ){ + + xscale = u->v->xres * u->v->dist / ip_eye.x; + yscale = u->v->yres * u->v->dist / ip_eye.x; + + /* Center of the CCIP circle: */ + x0 = u->v->focus.x + xscale * ip_eye.y; + y0 = u->v->focus.y + yscale * ip_eye.z; + + draw_Type *dd = draw_new(); + + /* Draw CCIP circle, 5 mm radius: */ + double r = 0.005 /* m */ * u->v->xres * u->zoom/100.0; + draw_circle(dd, x0, y0, r); + + /* Draw bomb fall line: */ + double nx = x0 - fpm_x; + double ny = y0 - fpm_y; + double n = sqrt(nx * nx + ny * ny); + double fpm_r = 8.0 * u->xscaleFactor; /* FPM circle radius */ + /* Draw BFL only if FPM and CCIP are far enough: */ + if( n > fpm_r + r ){ + nx /= n; + ny /= n; + draw_segment(dd, + fpm_x + nx * fpm_r, fpm_y + ny * fpm_r, + fpm_x + nx * (n - r), fpm_y + ny * (n - r)); + } + + draw_stroke(dd, u->v, HUDColor); + draw_free(dd); + } + +/* + * Return TRUE if we are recommending a bomb drop. + */ + + return 0; +} + +static int +press_mk82(craft *c) +/* Fire! */ +{ + hasFired[c->pIndex] = 1; + return 1; +} + +static int +release_mk82(craft *c) +{ + return 0; +} + + +/** + * Gravity bomb dynamics update. + * @param c + * @return "Exploded on the ground" or NULL if still falling down. + */ +static char * +ccip_update(craft * c) +{ + double q; + double FDrag, FWeight; + double dNorth, dEast, dmag; + VPoint F, Fg; + + if (c->w.z < terrain_localAltitude(c)) { + c->Cg = (VPoint) {0,0,0}; + c->w.z = terrain_localAltitude(c); + dis_if_updateLocal(c); + return "exploded on the ground"; + } + +/* + * Compute the resultant force vector on the bomb. + */ + + air_update(&c->air, units_METERStoFEET(c->w.z)); + c->prevSg = c->Sg; + c->VT = VMagnitude(&c->Cg); + q = c->air.rho * c->cinfo->wingS * c->VT * c->VT * 0.5; + FDrag = c->cinfo->CDOrigin * q; + + F.x = c->curThrust - FDrag; + F.y = 0.0; + F.z = 0.0; + +/* + * Now calculate changes in position (Sg) and velocity (Cg). + */ + + VTransform(&F, &c->AXYZtoNED, &Fg); + FWeight = c->cinfo->emptyWeight; + Fg.z += FWeight; + pm_calcGForces(c, &Fg, FWeight); + +/* + * Update the bomb's position and velocity. + */ + + dNorth = units_FEETtoMETERS(c->Cg.x * deltaT + Fg.x / FWeight + * units_earth_g * halfDeltaTSquared); + dEast = units_FEETtoMETERS(c->Cg.y * deltaT + Fg.y / FWeight + * units_earth_g * halfDeltaTSquared); + c->w.z -= units_FEETtoMETERS(c->Cg.z * deltaT + Fg.z / FWeight + * units_earth_g * halfDeltaTSquared); + + dmag = sqrt(dNorth * dNorth + dEast * dEast); + + earth_updateLatLon(&c->w, dNorth / dmag, dEast / dmag, dmag); + earth_LatLonAltToXYZ(&c->w, &c->Sg); + earth_generateWorldToLocalMatrix(&c->w, &c->XYZtoNED); + + c->Cg.x += Fg.x / FWeight * units_earth_g * deltaT; + c->Cg.y += Fg.y / FWeight * units_earth_g * deltaT; + c->Cg.z += Fg.z / FWeight * units_earth_g * deltaT; + + dis_if_updateLocal(c); + + return NULL; +} + + +/** + * Returns the distance between the two points. + * Return a negative value if the distance is greater then the range. + */ +static double distance(VPoint * a, VPoint * b, double range) +{ + double dx = a->x - b->x; + if( fabs(dx) > range ) return -1.0; + + double dy = a->y - b->y; + if( fabs(dy) > range ) return -1.0; + + double dz = a->z - b->z; + if( fabs(dz) > range ) return -1.0; + + double r = sqrt( dx * dx + dy * dy + dz * dz ); + + if( r > range ) + return -1.0; + + return r; +} + + +/** + * Gravity bomb explodes and gets removed from simulation. + * Test for damage of any local craft. + * Send explosion DIS event toward any remote craft that might be involved; + * if no potential remote target is involved, send explosion DIS event anyway + * but without target, just to display an explosion on any remote client. + * @param c + * @param reason + */ +static void ccip_kill(craft * bomb, char *reason) +{ + double worldLocation[3], entityLocation[3]; + VPoint worldVel, localVel; + int i; + craft *target; + double r, explosion_diameter_meters; + + worldLocation[0] = bomb->Sg.x; + worldLocation[1] = bomb->Sg.y; + worldLocation[2] = bomb->Sg.z; + +/* + * killBomb's calling sequence needs to be updated to allow for the + * entity detonation location to be passed. + */ + +/* + entityLocation[0] = 0.0; + entityLocation[1] = 0.0; + entityLocation[2] = 0.0; +*/ + + entityLocation[0] = bomb->Sg.x; + entityLocation[1] = bomb->Sg.y; + entityLocation[2] = bomb->Sg.z; + + localVel.x = units_FEETtoMETERS(bomb->Cg.x); + localVel.y = units_FEETtoMETERS(bomb->Cg.y); + localVel.z = units_FEETtoMETERS(bomb->Cg.z); + VReverseTransform_(&localVel, &bomb->XYZtoNED, &worldVel); + + /* Look for damaged targets: */ + for( i = 0; i < manifest_MAXPLAYERS; i++ ){ + target = &ptbl[i]; + + /* Ignores free entries in players table: */ + if( target->type == CT_FREE ) + continue; + + /* Distance of the blast from this craft (m): */ + r = distance(&target->Sg, &bomb->Sg, 900.0 /* m */); + if( r < 0.0 ) + continue; + + if( target->type == CT_PLANE || target->type == CT_DRONE ){ + + /* Local craft. Absorb damage: */ + if( damage_absorbDISDamage(target, + &bomb->cinfo->entityType, 0, 0, + r, + 0.0 /* dummy */, + &explosion_diameter_meters) == 0 + ){ + target->kill(target, "Mark 82 bomb"); + } + + } else if( target->type == CT_DIS_PLANE ){ + + /* Remote craft. Send detonation event, but don't remove bomb yet: */ + dis_if_detonation(&bomb->cinfo->entityType, + ptbl[bomb->owner].disId, + target->disId, + dis_if_ID_NONE, // don't remove remote bomb + worldLocation, + entityLocation, + (double *) &worldVel); + } + } + + /* Send explosion to the remote clients and remove their bomb entry: */ + dis_if_detonation(&bomb->cinfo->entityType, + ptbl[bomb->owner].disId, + dis_if_ID_NONE, + bomb->disId, + worldLocation, + entityLocation, + (double *) &worldVel); + + /* Set local explosion effect: */ + effects_new_explosion(&bomb->Sg, &(VPoint){0.0, 0.0, 0.0}, 50.0, 15.0, 1.0); + + /* Remove bomb: */ + dis_if_entityExit(bomb->disId); + pm_hud_strings_free(bomb); + bomb->type = CT_FREE; +} + diff -Nru acm-5.0/src/acm/ccip.h acm-6.0+20200416/src/acm/ccip.h --- acm-5.0/src/acm/ccip.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/ccip.h 2020-04-16 12:05:39.000000000 +0000 @@ -0,0 +1,48 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1998 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +/** + * CCIP - Constantly Computed Impact Point. + * + * This module implements the Mark 82 drop bomb and the HUD CCIP aiming + * interface. + * + * @author Riley Rainey + * @license GNU GPL + * @version $Date: 2020/01/08 06:01:16 $ + * @file + */ + +#ifndef _ccip_h +#define _ccip_h + +#include "weapon.h" + +#ifdef ccip_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +/** + * Creates weapon description record for the Mark 82 drop bomb. + */ +EXTERN weapon_Type * ccip_new(void); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/commands.c acm-6.0+20200416/src/acm/commands.c --- acm-5.0/src/acm/commands.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/commands.c 2017-10-28 08:10:39.000000000 +0000 @@ -0,0 +1,150 @@ +/* + * acm - Commands interpreter + * Copyright (C) 2007 Umberto Salsi + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#include +#include +#include "players.h" +#include "pm.h" +#include "terminal.h" + +#define commands_IMPORT +#include "commands.h" + +#define MAX_ARGC 5 + + +static void split_cmd(char *cmd, int *argc, char *argv[]) +{ + int n; + char *p; + + n = 0; + + p = strtok(cmd, " \t"); + while( p != NULL && n < MAX_ARGC ){ + argv[n] = p; + n++; + p = strtok(NULL, " \t"); + } + *argc = n; +} + + +static void parse_set(viewer *u, int argc, char *argv[]) +{ + if( argc != 3 ){ + terminal_write(u, "ERROR: expected `set VAR VALUE'\r\n"); + return; + } + + if( strcmp(argv[1], "xView") == 0 ) + u->v->Middl.x = atoi(argv[2]); + + else if( strcmp(argv[1], "yView") == 0 ){ + u->v->Middl.y = atoi(argv[2]); + + /********* + } else if( strcmp(argv[1], "dist") == 0 ){ + u->v->dist = atof(argv[2]); + resizePlayerWindow(u->c, u, u->width, u->win_height, FALSE, u->hud_mode); + + } else if( strcmp(argv[1], "xscaleFactor") == 0 ){ + u->xscaleFactor = atof(argv[2]); + resizePlayerWindow(u->c, u, u->width, u->win_height, FALSE, u->hud_mode); + + } else if( strcmp(argv[1], "Scale") == 0 ){ + u->v->Scale.x = atof(argv[2]); + u->v->Scale.y = atof(argv[2]); + u->v->Scale.z = atof(argv[2]); + resizePlayerWindow(u->c, u, u->width, u->win_height, FALSE, u->hud_mode); + ************/ + + + } else + terminal_write(u, "ERROR: unknow variable\r\n"); +} + + +static void print_double(viewer *u, char *name, double value, char *unit) +{ + char s[100]; + + terminal_write(u, name); + terminal_write(u, " = "); + sprintf(s, "%f", value); + terminal_write(u, s); + terminal_write(u, " "); + terminal_write(u, unit); + terminal_write(u, "\r\n"); +} + + +void commands_execute(viewer *u, char *cmd) +{ + int argc; + char *argv[MAX_ARGC]; + + split_cmd(cmd, &argc, argv); + + if( argc == 0 ) + return; + + if( strcmp(argv[0], "help") == 0 ){ + terminal_write(u, "Currently availablecommands\r\n" + " help\r\n" + " create\r\n" + ); + + } else if( strcmp(argv[0], "v") == 0 ){ + print_double(u, "Vs0", u->c->cinfo->Vs0, "KT"); + print_double(u, "Vs1", u->c->cinfo->Vs1, "KT"); + print_double(u, "Vfe", u->c->cinfo->Vfe, "KT"); + print_double(u, "Vno", u->c->cinfo->Vno, "KT"); + print_double(u, "Vne", u->c->cinfo->Vne, "KT"); + print_double(u, "Alpha Stall", units_RADtoDEG(u->c->cinfo->alpha_stall), "DEG"); + print_double(u, "MTOW", u->c->cinfo->MTOW, "lb"); + print_double(u, "Total Mass", + u->c->cinfo->emptyWeight + u->c->fuel + u->c->payload, "lb"); + + } else if( strcmp(argv[0], "create") == 0 ){ + /**** + if( players_new(STDERR_FILENO, ":0.0", "Mate", "|-geometry|937x737+0+0|-scale|1.5|-no-sound|1|-plane|C-172|-force|Other|-fuel|100|-payload|150" + ) != 0 ){ + terminal_write(u, "FAILED\r\n"); + } + *****/ + /***** + if( planes_newPlane("C-172") != 0 ){ + terminal_write(u, "FAILED\r\n"); + } + ******/ + /***** + newDrone(u->c, "C-172"); + ptbl[1].type = CT_PLANE; + *****/ + + } else if( strcmp(argv[0], "set") == 0 ){ + parse_set(u, argc, argv); + + } else { + terminal_write(u, "ERROR: unknown command. Type `help' for help.\r\n"); + } +} + + +/* End of the commands module */ diff -Nru acm-5.0/src/acm/commands.h acm-6.0+20200416/src/acm/commands.h --- acm-5.0/src/acm/commands.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/commands.h 2020-04-16 12:05:39.000000000 +0000 @@ -0,0 +1,44 @@ +/* + * acm - Commands interpreter, mostly for debugging + * Copyright (C) 2007 Umberto Salsi + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +/** + * Execute a command given as a string, returning results on the terminal + * (see module "terminal") currently active on the given viewer. Mostly + * useful for debugging at run-time. Useless for the end user. + * + * @author Umberto Salsi + * @license GNU GPL + * @version $Date: 2020/01/08 06:01:45 $ + * @file + */ + +#ifndef _commands_h +#define _commands_h + +#include "pm.h" + +#ifdef commands_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +EXTERN void commands_execute(viewer *u, char *cmd); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/damage.c acm-6.0+20200416/src/acm/damage.c --- acm-5.0/src/acm/damage.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/damage.c 2020-04-16 12:05:39.000000000 +0000 @@ -0,0 +1,275 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1998 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#include +#include +#include "pm.h" +#include "sounds.h" +#include "inventory.h" +#include "../util/prng.h" + +#define damage_IMPORT +#include "damage.h" + + +static long +selectSystem(void) +/* + Randomly select a subsystem to receive damage. Each subsystem has its + own probability to be damaged, the total probabbility being, obviously, + 100%. + + Return: damaged subsystem mask. +*/ +{ + + double r; + long i; + + r = prng_getDouble(); + if (r < 0.25) /* 25% */ + i = SYS_ENGINE1; + else if (r < 0.35) /* 10% */ + i = SYS_RADAR; + else if (r < 0.40) /* 5% */ + i = SYS_TEWS; + else if (r < 0.45) /* 5% */ + i = SYS_HYD1; + else if (r < 0.50) /* 5% */ + i = SYS_HYD2; + else if (r < 0.53) /* 3% */ + i = SYS_GEN1; + else if (r < 0.56) /* 3% */ + i = SYS_GEN2; + else if (r < 0.61) /* 5% */ + i = SYS_FLAPS; + else if (r < 0.69) /* 8% */ + i = SYS_SPEEDBRAKE; + else if (r < 0.78) /* 9% */ + i = SYS_FUEL; + else if (r < 0.85) /* 7% */ + i = SYS_HUD; + else if (r < 0.90) /* 5% */ + i = SYS_LEFTMAIN; + else if (r < 0.95) /* 5% */ + i = SYS_RIGHTMAIN; + else if (r < 0.97) /* 2% */ + i = SYS_WINGS; + else /* 3% */ + i = SYS_NOSEGEAR; + return i; +} + + +/** + * Set damage to the specified subsystem. If the subsystem is already + * damaged does nothing, but if it is a fuel leak (SYS_FUEL) then + * increments the current fuel leak rate. Also accounts for failures to + * other subsystems that depends on this one. + */ +static void +damageSystem(craft * c, long sys) +{ + if ((c->damageBits & sys) == 0 || (sys == SYS_FUEL)) { + + c->damageBits |= sys; + + switch (sys) { + + case SYS_ENGINE1: + c->throttle = 0; + break; + + case SYS_RADAR: + c->curRadarTarget = -1; + break; + + case SYS_FUEL: + + /* + * Fuel leaks can be up to 40 pounds per second here. + */ + + c->leakRate += 40.0 * prng_getDouble(); + break; + + case SYS_HYD1: + case SYS_HYD2: + if ( c->damageBits & SYS_HYD1 && c->damageBits & SYS_HYD2 ) { + c->damageBits |= SYS_SPEEDBRAKE; + c->damageBits |= SYS_FLAPS; + } + break; + + case SYS_GEN1: + case SYS_GEN2: + if ( c->damageBits & SYS_GEN1 && c->damageBits & SYS_GEN2 ) { + c->damageBits |= (SYS_HUD | SYS_RADAR | SYS_TEWS); + } + break; + } + + } +} + +#define DAMAGE_DEBUG 0 + +/** + * Target craft hit with d points of damage. Every point has 15% of + * probability to damage some subsystem, and 85% of probability to be + * absorbed by the aircraft frame. On structural damage, decrements + * target->structurePts. + * @param target Hit target aircraft. + * @param d Points of damage. + * @return True if the damage has been adsorbed and the target can still live; + * this means that human players can only die falling to the ground after a + * severe structural damage. + * False only if the craft is a drone and all the target->structurePts are + * exhausted, then the drone should be killed immediately. + */ +static _BOOL +damage_absorbDamage(craft * target, int d) +{ + + double n, x; + long sys; + + if( DAMAGE_DEBUG ) printf("damage_absorbDamage, %d points\n", d); + + /* + * Actual damage sustained is adjusted by a damage factor that forms a + * bell curve centered around 0.75 * d. + */ + + x = 0.5*(prng_getDouble() + prng_getDouble()) + 0.25; + + d = (int) (d * x + 0.5); + + if (d > 0) { + sounds_playSound(target, sounds_Explosion, FALSE); + } + + for (; d > 0; --d) { + + /* + * For each damage point absorbed, there is a 15 percent chance that + * it will be absorbed by some subsystem other than the actual + * airframe. + */ + + if (prng_getDouble() <= 0.15) { + if( DAMAGE_DEBUG ) printf("damage_absorbDamage: subsystem damaged\n"); + sys = selectSystem(); + damageSystem(target, sys); + } + + /* + * For each point absorbed by the airframe, there is a 20% chance that + * it'll be absorbed by the wing and induce a rolling moment or a 10 + * percent chance that it will hit a horizontal stabilizer and induce + * a pitching and rolling moment. + */ + + else { + + if ((n = prng_getDouble()) <= 0.20) { + if( DAMAGE_DEBUG ) printf("damage_absorbDamage: damaged CL\n"); + target->damageCL += (prng_getDouble() - 0.5) * 0.20; + } + else if (n <= 0.30) { + if( DAMAGE_DEBUG ) printf("damage_absorbDamage: damaged CL, CM\n"); + target->damageCL += (prng_getDouble() - 0.5) * 0.10; + target->damageCM += (prng_getDouble() - 0.5) * 0.20; + } + + if( target->structurePts <= 1 ){ + target->structurePts = 0; + damageSystem(target, SYS_WINGS); + if( target->type == CT_PLANE ) + return TRUE; /* human players fall to ground :-) */ + else + return FALSE; /* destroy immediately drones */ + } + if( DAMAGE_DEBUG ) printf("damage_absorbDamage: some structural damage\n"); + target->structurePts--; + } + + } + + return TRUE; + +} + +int +damage_absorbDISDamage(craft * target, + dis_entity_type *warhead_dis_type, + u_short warhead_type, + u_short fuze_type, + double distance_meters, + double velocity_meters_per_sec, + double *explosion_diameter_meters) +{ + int i; + int damage_points; + munition_map *pmm; + + *explosion_diameter_meters = 0.0; + + for(i = 0; ; i++){ + pmm = inventory_getMunition(i); + if( pmm == NULL ) + break; + if (dis_entityWildcardMatch(warhead_dis_type, &pmm->entity_type, &pmm->entity_mask)) { + if (pmm->warhead_mask == 0 || pmm->warhead_type == warhead_type) { + + if( DAMAGE_DEBUG ) printf("damage_absorbDISDamage: hit by %s\n", dis_entityTypeToString(&pmm->entity_type)); + + /* found a match; assess damage */ + + if (pmm->kinetic_flag) { + /* Kinetic warhead: */ + damage_points = (int) (0.5 * pmm->damage_factor * + velocity_meters_per_sec * velocity_meters_per_sec + 0.5); + if( DAMAGE_DEBUG ) printf("damage_absorbDISDamage: kinetic, damage factor %g, velocity %g m/s\n", pmm->damage_factor, velocity_meters_per_sec); + } else { + /* Blast warhead: */ + damage_points = (int) ( pmm->damage_factor / + (distance_meters * distance_meters + 1.0) + 0.5 ); + if( DAMAGE_DEBUG ) printf("damage_absorbDISDamage: blast, damage factor %g, distance %g m\n", pmm->damage_factor, distance_meters); + } + + *explosion_diameter_meters = pmm->explosion_diameter_meters; + + return damage_absorbDamage(target, damage_points); + } + } + } + + printf ("Warning: munition entity lookup failed\n"); + return 1; +} + +void +damage_reset(craft * c) +{ + c->damageBits = c->cinfo->damageBits; + c->structurePts = c->cinfo->structurePts; + c->leakRate = 0.0; + c->damageCL = 0.0; + c->damageCM = 0.0; +} diff -Nru acm-5.0/src/acm/damage.h acm-6.0+20200416/src/acm/damage.h --- acm-5.0/src/acm/damage.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/damage.h 2017-05-09 08:29:15.000000000 +0000 @@ -0,0 +1,111 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991,1992 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + + +#ifndef _damage_h +#define _damage_h + +#include "pm.h" + +#ifdef damage_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +#define damage_isFunctioning(c, sys) ((c->damageBits & sys) == 0) + +/* + * Each of these bits is true if the corresponding system is + * damaged (== not functioning). + * Some flags (for ex. FLAG_LOWFUEL) aren't proper "damages" + * are set to warn the pilot. + */ + +#define SYS_RADAR 0x0001 /* set if radar damaged */ +#define SYS_TEWS 0x0002 /* set if TEWS damaged */ +#define SYS_FLAPS 0x0004 /* set if flaps damaged */ +#define SYS_SPEEDBRAKE 0x0008 +#define SYS_HYD1 0x0010 +#define SYS_HYD2 0x0020 +#define SYS_GEN1 0x0040 +#define SYS_GEN2 0x0080 +#define SYS_ENGINE1 0x0100 /* set if engine #1 damaged */ +//#define SYS_ENGINE2 0x0200 /* set if engine #2 damaged (FIXME: NOT USED) */ +#define SYS_HUD 0x0400 /* set if HUD damaged */ +#define SYS_FUEL 0x0800 /* set if there is a fuel leak */ +#define SYS_NOSEGEAR 0x1000 +#define SYS_LEFTMAIN 0x2000 +#define SYS_RIGHTMAIN 0x4000 +#define SYS_WINGS 0x08000 /* if wings broken, no lift! */ +#define FLAG_LOWFUEL 0x10000 /* set when fuel < 1000 lb */ +#define FLAG_SPEEDBRAKE 0x20000 /* set when speedbrake is deployed */ +#define FLAG_WHEELBRAKE 0x40000 /* set when wheel brakes are applied */ +#define FLAG_MAX_G_LOAD 0x80000 /* near the max positive/neg. wings load */ +#define FLAG_STALL_WARN 0x100000 /* stall warning */ + +/** + * Repairs any damage, making a brand new aircraft :-). + */ +EXTERN void damage_reset(craft * c); + +/** + * Craft c is hit, assesses damage points. The points of damage depends on + * the type of the warhead, the velocity of impact (for "kinetic" + * warheads) and distance of the blast (for "blast" warhead). + * + * - For kinetic warhead, points are proportional to the product + * between 0.5 * warhead damage factor and the square of the + * velocity of impact. + * + * - For blast warhead, point are calculated as product between + * warhead damage factor / (distance^2 + 1.0). + * + * Actual damage sustained is adjusted by a damage factor that forms a + * bell curve centered around 0.75 * d. + * + * For each damage point absorbed, there is a 15 percent chance that it + * will be absorbed by some subsystem other than the actual airframe. + * + * For each point absorbed by the airframe, there is a 20% chance that + * it'll be absorbed by the wing and induce a rolling moment or a 10 + * percent chance that it will hit a horizontal stabilizer and induce a + * pitching and rolling moment. + * + * @param target The craft hit. + * @param warhead_dis_type DIS type of the warhead. + * @param warhead_type Type of warhead. + * @param fuze_type Ignored. + * @param distance_meters Distance from the blast (blast warhead only, m). + * @param velocity_meters_per_sec Velocity of impact (meaningful for kinetic + * warhead only, m/s). + * @param explosion_diameter_meters Here returns the explosion diameter for the + * warhead (m). + * @return False if the damage cannot be absorbed and the craft must be + * destroyed. + */ +EXTERN int damage_absorbDISDamage(craft * target, + dis_entity_type *warhead_dis_type, + u_short warhead_type, + u_short fuze_type, + double distance_meters, + double velocity_meters_per_sec, + double *explosion_diameter_meters); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/dis_if.c acm-6.0+20200416/src/acm/dis_if.c --- acm-5.0/src/acm/dis_if.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/dis_if.c 2018-04-02 06:09:56.000000000 +0000 @@ -0,0 +1,2766 @@ +/* + * Copyright (C) 1995 Mats Lofkvist CelsiusTech Electronics AB + * + * With additions by Riley Rainey, 1995-1998 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../util/error.h" +#include "../util/memory.h" +#include "../util/prng.h" +#include "../dis/dis/disx.h" +#include "../dis/dis/datum.h" +#include "inventory.h" +#include "pm.h" +#include "update.h" + +#define dis_if_IMPORT +#include "dis_if.h" + +/* + * If we may trust DIS timestamps from incoming DIS packets. If true, absolute + * timestamp from incoming DIS packets is used to build an actual Unix timestamp + * to mark the state of the entities, performing DR calculations and discarding + * stale entities (for example, from suddenly disconnected remote hosts). But + * all this may fail if some remote server is misconfigured. + * If set to false, DIS timestamp is ignored and out timestamp is assumed instead. + * + * FIXME: it is simpler and safer to simply ignore the DIS timestamp + * (and in general, we can't trust on any data coming from the net). + */ +#define dis_if_USE_DIS_TIMESTAMP 0 + +/** + * Default dead reckoning linear threshold (m). A new state packet is sent if + * the position of the entity as calculated using the stated DR algorithm applied + * to the last sent state packet deviates from the current position more than that. + */ +#define DEFAULT_LOCATION_THRESHOLD 2.0 + +/** + * Default dead reckoning rotational threshold (DEG). A new state packet is sent if + * the rotation of the entity as calculated using the stated DR algorithm applied + * to the last sent state packet deviates from the current rotation angles more + * than that. + */ +#define DEFAULT_ORIENTATION_THRESHOLD (3.0 * M_PI / 180.0) + +/** + * Send anyway a fresh state packet within this time interval since last state + * packet sent (s). + */ +#define dis_if_SEND_TIMEOUT_SECONDS 4.8 + +/** Entities silent from so much time are stale and then removed (s). */ +#define dis_if_RECV_TIMEOUT_SECONDS 12.0 + +/** + * Client callback through which ACM is notified new remote entity enters + * simulation. + */ +static dis_if_EntityEnterCb entityEnterCb; + +/** + * Client callback through which ACM is notified an existing remote entity + * exits simulation. + */ +static dis_if_DetonationCb detonationCb; + +/** + * Client callback through which ACM is notified a remote cannon burst has been + * fired. + */ +static dis_if_CannonFireCb cannonFireCb; + +static double locationThreshold = DEFAULT_LOCATION_THRESHOLD; +static double orientationThreshold = DEFAULT_ORIENTATION_THRESHOLD; + +static int exercise; +static int site; +static int application; + +/* + * Automatic site ID assignment. When the user sets -1 as site ID we generate + * a random value then we enter in "silent mode" listening all the incoming + * packets for a few seconds. During this time we look at all the currently + * used site IDs we see looking for collisions and, in that case, we generate + * another random site ID. + * + * When a relay server is used, we must also send some dummy initial packet + * to subscribe our host and start getting routed packets; this subscription + * has to be periodically renewed because the relay removes silent clients. + */ + +/* If randomly generated site ID is still under validation for collisions. */ +static int validating_site_id; +/* When validation started (time from time()). */ +static int validating_site_id_since; +/* Duration of the validation (s). */ +#define VALIDATING_SITE_ID_PERIOD 15 +/* If we have a relay server requiring subscription (i.e., a dummy packet) in + * order to start receiving packets from which read used site IDs. */ +static int validating_site_id_relay_have; +/* Last subscription sent to the relay server. Need to renew subscription + * because the relay server removes stale clients! */ +static int validating_site_id_relay_last_pkt; + +static disx_ApplicationInfo *app; + +static dis_if_OutstandingRequestInfo *request_chain_head = 0; +static dis_if_OutstandingRequestInfo *request_chain_tail = 0; + +/** + * If network enabled. If false, does not tries to connect, send or receive + * anything. + */ +static int network_enabled = 1; + +/** + * We must limit our PDU transmission rate on lower bandwidth connections. + * 0.0 turns off limiting. + */ +static double bandwidth_bps = 0.0; + +static double theTime; +static int absoluteTime = 0; + +/** + * All the allocated entities of type dis_if_Entity managed by this module. + */ +static varray_Type *entities; + +/** No. of local entities. */ +static int stats_local_entities_no; +/** No. of remote entities. */ +static int stats_remote_entities_no; +/** Timestamp start counting incoming processed packets. */ +static double stats_processed_packets_count_t0; +/** Counter of incoming processed packets. */ +static int stats_processed_packets_count; +/** Current estimated incoming processed packets per second. */ +static double stats_processed_packets_per_second; + +static int acknowledgePDU (dis_acknowledge_pdu *pdu); +static int transferControlPDU (dis_transfer_control_pdu *pdu); +static int setDataPDU (dis_set_data_pdu *pdu); +static int startPDU (dis_start_pdu *); +static int stopPDU (dis_stop_pdu *); +static int initializeEMInfo ( dis_if_Entity *e ); + +static dis_if_TransferControlRequestCallback transferControlRequestCallback = 0; + +int dis_if_readyToReceive() +{ + return app != NULL; +} + +void +dis_if_setTransferControlRequestCallback ( dis_if_TransferControlRequestCallback p ) +{ + transferControlRequestCallback = p; +} + +static dis_if_OutstandingRequestInfo * +addRequest( dis_request_id request_id ) +{ + dis_if_OutstandingRequestInfo *p = memory_allocate(sizeof(dis_if_OutstandingRequestInfo), NULL); + + memset (p, 0, sizeof(dis_if_OutstandingRequestInfo)); + p->request_id = request_id; + + p->next = NULL; + p->prev = request_chain_tail; + if ( request_chain_tail ) { + p->next = p; + } + if (request_chain_head == NULL) { + request_chain_head = p; + } + request_chain_tail = p; + + return p; +} + +/** + * Remove the specified request tracking structure from the + * request tracking list. + */ +static void +removeRequest(dis_if_OutstandingRequestInfo *pItem) +{ + dis_if_OutstandingRequestInfo *p = request_chain_head; + + /* + * The request list is a mundane doubly linked list. + */ + + if (pItem) { + if (pItem->prev == NULL) { + request_chain_head = p->next; + } + else { + pItem->prev->next = p->next; + } + + if (pItem->next == NULL) { + request_chain_tail = p->prev; + } + else { + pItem->next->prev = p->prev; + } + + memory_dispose( pItem ); + } +} + +static dis_if_OutstandingRequestInfo * +findRequestByRequestID ( dis_request_id request_id ) +{ + dis_if_OutstandingRequestInfo *p = request_chain_head; + + while ( p ) { + if (p->request_id == request_id) { + break; + } + p = p->next; + } + + return p; +} + + +disx_ApplicationInfo * +dis_if_getApplicationInfo(void) +{ + return app; +} + +varray_Type * +dis_if_getEntityTable(void) +{ + return entities; +} + +void +dis_if_enableNetwork(int enabled) +{ + network_enabled = enabled; +} + +static void +ACMtoDISVelocity(VPoint * in, dis_float_vector * out) +{ + out->x = units_FEETtoMETERS(in->x); + out->y = units_FEETtoMETERS(in->y); + out->z = units_FEETtoMETERS(in->z); +} + +static void +DIStoACMVelocity(dis_float_vector * in, VPoint * out) +{ + out->x = units_METERStoFEET(in->x); + out->y = units_METERStoFEET(in->y); + out->z = units_METERStoFEET(in->z); +} + +/** + * Find the entity with DIS ID id in the local entities table + * and return its index in the table. + * + * The id (handle) is returned on success, 0 is returned on failure. + */ +static int +findEntity(dis_entity_id * id) +{ + int i; + dis_if_Entity *e; + + for (i = varray_firstHandle(entities); i != 0; i = varray_nextHandle(entities)) { + e = varray_getValue(entities, i); + if (e->entityId.entity_id == id->entity_id && + e->entityId.sim_id.application_id == id->sim_id.application_id && + e->entityId.sim_id.site_id == id->sim_id.site_id) { + varray_releaseIterator(entities); + return i; + } + } + varray_releaseIterator(entities); + return 0; +} + +dis_if_Entity *dis_if_findEntityByDISID(dis_entity_id * id) +{ + int eid = findEntity(id); + if( eid == 0 ) + return NULL; + return varray_getValue(entities, eid); +} + +dis_if_Entity *dis_if_findEntityByID(int eid) +{ + if( varray_isValidHandle(entities, eid) ) + return varray_getValue(entities, eid); + else + return NULL; +} + +/** + * Find the local entity with Dis id id in the local entities table + * and return its index in the table. + * + * The id (handle) is returned on success, 0 is returned on failure. + */ +static int +findLocalEntity( const dis_entity_id * id ) +{ + int i; + dis_if_Entity *e; + + for (i = varray_firstHandle(entities); i != 0; i = varray_nextHandle(entities)) { + e = varray_getValue(entities, i); + if (e->isLocal && + e->entityId.entity_id == id->entity_id && + e->entityId.sim_id.application_id == id->sim_id.application_id && + e->entityId.sim_id.site_id == id->sim_id.site_id) { + varray_releaseIterator(entities); + return i; + } + } + varray_releaseIterator(entities); + return 0; +} + + +void +dis_if_setBandwidth(double bps) +{ + bandwidth_bps = bps; +} + + +/** + * Starts or re-start on collision the randomly generated site ID validation. + */ +static void startSiteIdValidation() +{ + int eid; + validating_site_id = 1; + validating_site_id_since = time(NULL); + site = prng_getIntInRange(1, 65534); + if( app != NULL ) + app->id.site_id = site; + /* Update site ID of the local entities: */ + for(eid = varray_firstHandle(entities); eid != dis_if_ID_NONE; eid = varray_nextHandle(entities)){ + dis_if_Entity *e = varray_getValue(entities, eid); + if( e->isLocal ) + e->entityId.sim_id.site_id = site; + } + varray_releaseIterator(entities); +} + + +/** + * Send a dummy empty packet to the relay host to subscribe us and to renew + * our subscription in order to continue receiving packets from which read + * the currently used site IDs. + */ +static void subscribeToRelayHost() +{ + dis_pdu pdu; + memory_zero(&pdu); + /* Send a PDU type the other clients will ignore: */ + pdu.hdr.pdu_type = PDUTypeOther; + disx_writePDU(app, &pdu); +} + + +/** + * Evaluates a site ID read from the network and set the validation status of + * our randomly generated site ID accordingly. This function can be called + * by the initialization function when site ID is set to -1, and once the + * connection has been fully established with a valid site ID, it is called + * again for each received packet looking for possible new collisions. + * If a collision is detected, generates a new site ID and restarts validation. + * @param in_use_site_id Site ID read from incoming packet, or -1 if no packets + * received just to update timeouts and renew subscription to the relay server. + */ +static void gotSiteId(int in_use_site_id) +{ + if( in_use_site_id == site ){ + /* Collision detected. Restart generation and validation: */ + startSiteIdValidation(); + return; + } + if( validating_site_id ){ + if( time(NULL) - validating_site_id_since > VALIDATING_SITE_ID_PERIOD ){ + /* Randomly generated site ID validated: no collisions. */ + validating_site_id = 0; + } else if( validating_site_id_relay_have + && time(NULL) - validating_site_id_relay_last_pkt > 3.0 ){ + /* Renew subscription to the relay server. */ + subscribeToRelayHost(); + validating_site_id_relay_last_pkt = time(NULL); + } + } +} + + +int dis_if_isValidatingSiteId() +{ + return validating_site_id; +} + + +int +dis_if_init(char *relay_host, int relay_port, + int xexercise, + int xsite, + int xapplication, + dis_if_EntityEnterCb xentityEnterCb, + dis_if_DetonationCb xdetonationCb, + dis_if_CannonFireCb xcannonFireCb) +{ + dis_Transceiver *xcvr; + dis_simulation_addr addr; + + if( entities ) + error_internal("DIS module already initialized", 0); + + entityEnterCb = xentityEnterCb; + detonationCb = xdetonationCb; + cannonFireCb = xcannonFireCb; + + exercise = xexercise; + + entities = varray_new(); + + stats_local_entities_no = 0; + stats_remote_entities_no = 0; + stats_processed_packets_count_t0 = theTime; + stats_processed_packets_count = 0; + stats_processed_packets_per_second = 0.0; + + /* + * Check relay host: + */ + if( relay_host != NULL ){ + while(isspace(*relay_host)) + relay_host++; + if( *relay_host == 0 ) + relay_host = NULL; + } + validating_site_id_relay_have = relay_host != NULL; + validating_site_id_relay_last_pkt = 0; + + /* + * Check site ID and special values. + */ + if( xsite == -1 ){ + if( network_enabled ){ + startSiteIdValidation(); + xsite = site; + } else { + xsite = 1; /* harmless, ignored value */ + validating_site_id = 0; + } + } else { + validating_site_id = 0; + } + + /* + * Check application ID and special values: + */ + if( xapplication == -1 ) + xapplication = getpid(); + + if( ! network_enabled ) + return 0; + + xcvr = dis_openTransceiver(0, relay_host, relay_port); + if( xcvr == NULL ){ + return -1; + } + app = disx_initializeApplication(xcvr, xexercise, xsite, xapplication); + if (app == NULL) { + dis_closeTransceiver(xcvr); + return -1; + } + +/* + * Get the actual simulation address assigned to us. + */ + + disx_getSimulationAddress(app, &addr); + site = addr.site_id; + application = addr.application_id; + return 0; +} + +int +dis_if_close(void) +{ + int i; + + if (entities) { + + /* Release currently live entities: */ + for(i = varray_firstHandle(entities); i != 0; i = varray_nextHandle(entities)) + dis_if_entityExit(i); + varray_releaseIterator(entities); + + /* Dispose spare detached entities: */ + while( (i = varray_getDetachedHandle(entities)) != 0 ) + memory_dispose(varray_getValue(entities, i)); + + memory_dispose(entities); + entities = NULL; + } + if(app){ + disx_closeApplication(app); + app = NULL; + } + stats_local_entities_no = 0; + stats_remote_entities_no = 0; + stats_processed_packets_count_t0 = 0.0; + stats_processed_packets_count = 0; + stats_processed_packets_per_second = 0.0; + network_enabled = 0; + validating_site_id = 0; + return 0; +} + +void +dis_if_setDRThresholds(double location, double orientation) +{ + locationThreshold = location; + orientationThreshold = orientation; +} + +/** 2^31/3600 bits per second. */ +#define timeFactor (596523.235556) + +#ifdef WINNT +#define rint(x) (double)( (int)(x) ) +#endif + +/** + * Convert a DIS timestamp to a double in UNIX format (seconds since 1970). + * + * If the timestamp _and_ the local time both are absolute times, + * the timestamp is used for the part of hour. The local time 'theTime' + * is used to get the hour part. The returned value will be + * the closest possible to 'theTime'. + * + * If either the timestamp or the local time are _not_ absolute, + * the local time is returned. This could be improved... + */ +static double +timeDISToDouble(dis_timestamp disTime) +{ +#if dis_if_USE_DIS_TIMESTAMP + double seconds; /* seconds into the current hour */ + double myseconds; /* ditto for 'theTime' */ + double diffseconds; + double myhour; /* hour part of 'theTime' */ + + /* if either time is not absolute, return the local time */ + if (disTime.type == 0 || absoluteTime == 0) + return theTime; + + seconds = disTime.time / timeFactor; + myseconds = fmod(theTime, 3600.0); + myhour = rint((theTime - myseconds) / 3600.0); + + diffseconds = myseconds - seconds; + + if (diffseconds > 1800.0) + return 3600.0 * (myhour + 1) + seconds; + else if (diffseconds < -1800.0) + return 3600.0 * (myhour - 1) + seconds; + else + return 3600.0 * myhour + seconds; +#else + return theTime; +#endif +} + +/** + * Convert a double in UNIX format (seconds since 1970) to a DIS timestamp. + */ +static dis_timestamp +timeDoubleToDIS(double time, int isAbsolute) +{ + uint32_t tmp; + dis_timestamp res; + + tmp = (uint32_t) (fmod(time, 3600.0) * timeFactor); + if (tmp > 2147483647L) /* 2^31 - 1 */ + res.timexxx = 2147483647UL; + else + res.timexxx = tmp; + if( isAbsolute ) + res.timexxx |= 0x8000000UL; + return res; +} + +void +dis_if_setTime(double time) +{ + theTime = time; + absoluteTime = 0; +} + + +void +dis_if_setTimeAbsolute(void) +{ + struct timeval tv; + + gettimeofday(&tv, NULL); + theTime = tv.tv_sec + tv.tv_usec / 1000000.0; + absoluteTime = 1; +} + + +/** + * Remove the stale or destroyed entity. + */ +static void +entityExit(int eid, char *reason) +{ + dis_if_Entity *e = varray_getValue(entities, eid); + e->c->kill(e->c, reason); +} + +/** + * Read in the entity state data from the entity state PDU es + * and write it to the local entity with id (index) eid. + */ +static void +getEntityStateData(int eid, dis_entity_state_pdu * es) +{ + dis_if_Entity *e = varray_getValue(entities, eid); + e->lastTime = timeDISToDouble(es->hdr.time_stamp); + e->lastLocation[0] = es->pos.x; + e->lastLocation[1] = es->pos.y; + e->lastLocation[2] = es->pos.z; + e->lastVelocity[0] = es->vel.x; + e->lastVelocity[1] = es->vel.y; + e->lastVelocity[2] = es->vel.z; + e->lastOrientation[0] = es->orientation.phi; + e->lastOrientation[1] = es->orientation.theta; + e->lastOrientation[2] = es->orientation.psi; + e->lastLinearAcc[0] = es->dr_parm.linear_acc.x; + e->lastLinearAcc[1] = es->dr_parm.linear_acc.y; + e->lastLinearAcc[2] = es->dr_parm.linear_acc.z; + e->lastAngularVel[0] = es->dr_parm.angular_vel.x; + e->lastAngularVel[1] = es->dr_parm.angular_vel.y; + e->lastAngularVel[2] = es->dr_parm.angular_vel.z; + + if (es->marking.charset == DISCharSetASCII) + memory_strcpy((char *) e->markings, sizeof(e->markings), (char *) es->marking.marking); + else + e->markings[0] = '\0'; + + dis_processNewDRParameters(es, &e->dr); +} + +/** + * Process the entity state PDU esPDU for a new (currently unknown) + * entity. + * @param esPDU + * @return Entity ID or 0 if not added to the entities list. + */ +static int +entityEnter(dis_entity_state_pdu * esPDU) +{ + int eid; + craft *c = NULL; + dis_if_Entity *e; + + /* Get new entity and entity handle: */ + eid = varray_getDetachedHandle(entities); + if( eid == 0 ){ + /* Allocate entity: */ + e = memory_allocate(sizeof(dis_if_Entity), NULL); + eid = varray_addValue(entities, e); + } else { + /* Recycle existing entity block: */ + e = varray_getValue(entities, eid); + } + + /* It's safe to reset everything: */ + memory_zero(e); + + e->isLocal = 0; + e->state = dis_if_ENTITY_STATE_SIMULATING; + e->pending_state = dis_if_ENTITY_STATE_NONE; + e->emit_while_frozen = 0; + e->forceId = esPDU->force_id; + e->entityId = esPDU->id; + e->entityType = esPDU->type; + e->altEntityType = esPDU->alt_type; + e->em = NULL; + + /* + * We only care about setting the dead reckoning thresholds + * so that we can assume control of an entity. + */ + + dis_setDRThresholds(&e->dr, dis_if_SEND_TIMEOUT_SECONDS, + locationThreshold, orientationThreshold); + + getEntityStateData(eid, esPDU); + + /* + * Pass entity information to the main ACM code. Based on the DIS + * entity type, it will determine if this is worth tracking. + */ + + (entityEnterCb) ( eid, &esPDU->type, esPDU->force_id, &c ); + + if (c) { + /* ACM says it's worth tracking */ + e->c = c; + return eid; + + } else { + /* must not be an entity we care about ... */ + e->c = NULL; + dis_if_entityExit(eid); + return 0; + } +} + +/** + * Process an incoming entity state PDU. + * Zero is returned on success. + */ +static int +entityStatePDU(dis_entity_state_pdu * esPDU) +{ + int eid = findEntity(&esPDU->id); + + if (esPDU->appearance & DISAppearanceDamageDestroyed) { + /* deactivated or destroyed entity. if we know about it, exit it */ + if (eid != 0) { + dis_if_Entity *e = varray_getValue(entities, eid); + e->c->kill(e->c, "destroyed or deactivated"); + } + return 0; + } + else { + /* normal entity state PDU. if we know about it, update data, + otherwise enter it */ + if (eid != 0) { + getEntityStateData(eid, esPDU); + return 0; + } + else { + eid = entityEnter(esPDU); + if (eid != 0) { + return 0; + } + else + return -1; + } + } +} + + /* + * These munition types are renderable with ACM's cannon simulation + * code. + */ + +static dis_entity_type cannon_types[] = +{ + {2, 2, 225, 2, 1, 0, 0}, + {2, 2, 225, 2, 2, 0, 0}, + {2, 2, 225, 2, 3, 0, 0}, + {2, 2, 225, 2, 4, 0, 0}, + {2, 2, 222, 2, 1, 0, 0}, + {0, 0, 0, 0, 0, 0, 0} +}; + + +/** + * Process an incoming fire PDU. + * + * Zero is returned on success. + */ +static int +firePDU(dis_fire_pdu * fPDU) +{ + int owner, eid; + dis_entity_type *dp; + + for (dp = cannon_types; dp->kind != 0; ++dp) { + if (fPDU->burst.munition.kind == dp->kind && + fPDU->burst.munition.domain == dp->domain && + fPDU->burst.munition.country == dp->country && + fPDU->burst.munition.category == dp->category && + fPDU->burst.munition.subcategory == dp->subcategory) { + break; + } + } + + /* Not one of the ones that we model? Then do nothing. */ + if (dp->kind == 0) { + return 0; + } + + eid = findEntity(&fPDU->firing_id); + if (eid != 0) { + dis_if_Entity *e = varray_getValue(entities, eid); + owner = e->c->pIndex; + } + else { + owner = 0; + } + + VPoint pos, vel; + pos = fPDU->pos; + DIStoACMVelocity((dis_float_vector *)&fPDU->vel, &vel); + + cannonFireCb(owner, &pos, &vel, fPDU->burst.quantity); + + return 0; +} + +/** + * Process an incoming detonation PDU. + * + * Zero is returned on success. + */ +static int +detonationPDU(dis_detonation_pdu * dPDU) +{ + int munition_eid, ftype; + double time, worldLocation[3], entityLocation[3]; + craft *munition; + dis_if_Entity *firing, *target; + + if (detonationCb == NULL) { + munition_eid = findEntity(&dPDU->munition_id); + if (munition_eid != 0) { + dis_if_entityExit(munition_eid); + } + return 0; + } + + firing = dis_if_findEntityByDISID(&dPDU->firing_id); + if (firing == NULL) + return -1; + + target = dis_if_findEntityByDISID(&dPDU->target_id); + if (target == NULL) + return -2; + + if (dPDU->burst.munition.category == 2) /* Ballistic */ + ftype = dis_if_FIRE_M61A1; + else + ftype = dis_if_FIRE_AIM9M; + /* FIXME: add AIM-120 */ + + time = timeDISToDouble(dPDU->hdr.time_stamp); + + worldLocation[0] = dPDU->pos.x; + worldLocation[1] = dPDU->pos.y; + worldLocation[2] = dPDU->pos.z; + + entityLocation[0] = dPDU->loc.x; + entityLocation[1] = dPDU->loc.y; + entityLocation[2] = dPDU->loc.z; + + munition_eid = findEntity(&dPDU->munition_id); + if( munition_eid != 0 && varray_isValidHandle(entities, munition_eid) ){ + dis_if_Entity *e = varray_getValue(entities, munition_eid); + munition = e->c; + } else { + munition = NULL; + } + + /* + * Send detonation event to ACM so that an explosion effect is set and + * damage calculations are performed on local aircraft. Note that the + * munition itself is not removed from managed entities; this task is up + * to an eventual "entity exit" event. + */ + detonationCb(ftype, firing->c, target->c, time, worldLocation, + entityLocation, munition, dPDU); + return 0; +} + + +/* +static void printEM(dis_em_emission_pdu *em) +{ + int i; + assert(em->hdr.pdu_type == PDUTypeEmission); + printf(" no. of systems: %d\n", em->num_systems); + if( em->num_systems == 0 ) + return; + for(i = 0; i < em->num_systems; i++){ + dis_em_system_info *s = &em->system[0]; + printf(" system no. %d: no. of beams %d\n", i, s->num_beams); + } +} +*/ + +/** + * Process an incoming EM emission PDU. + * + * Zero is returned on success. + */ +static int +emissionPDU(dis_em_emission_pdu * pdu) +{ + dis_if_Entity *e; + int emitterEid; + + emitterEid = findEntity(&pdu->emitter_id); + if (emitterEid == 0) + return -1; + + e = varray_getValue(entities, emitterEid); + +/* + * First emission received? + */ + + if (e->em == NULL){ + initializeEMInfo(e); + } +/* + * Not the first emission. Free the old PDU variable fields and insert + * the new one. + */ + + else { + dis_freePDUComponents((dis_pdu *) & e->em->em); + } + e->em->em = *pdu; + e->em->lastTime = theTime; + return 0; +} + +static int +dis_if_isLocalEntity (const dis_entity_id *id) +{ + return findLocalEntity(id) != 0; +} + + +int +dis_if_canSimulate ( int eid ) +{ + dis_if_Entity *e; + + if( ! varray_isValidHandle(entities, eid) ) + return 0; + e = varray_getValue(entities, eid); + return e->isLocal && e->state == dis_if_ENTITY_STATE_SIMULATING; +} + + +static void updateProcessedPacketsPerSecond(int processed) +{ + double dt; + stats_processed_packets_count += processed; + dt = theTime - stats_processed_packets_count_t0; + if( dt < 0.0 || dt >= 10.0 ){ + stats_processed_packets_count_t0 = theTime; + stats_processed_packets_count = 0; + stats_processed_packets_per_second = 0.0; + } else if( dt >= 1.0 ){ + stats_processed_packets_per_second = + 0.80 * stats_processed_packets_per_second + + 0.20 * stats_processed_packets_count / dt; + stats_processed_packets_count_t0 = theTime; + stats_processed_packets_count = 0; + } +} + + +static int +messagePDU ( dis_comment_pdu *pdu ) +{ + char s[1000]; + int s_len; + char *c; + + if( pdu->num_variable_data != 1 + || pdu->variable_datum->datum_id != datum_AltDescription ) + return -1; + s_len = pdu->variable_datum->value_length / 8; + if( s_len >= sizeof(s) ) + s_len = sizeof(s) - 1; + // Note that here we really need strncpy() and NOT memory_strcpy() because + // the first also reset the whole field and NUL-termination is not needed. + strncpy(s, (char *) pdu->variable_datum->value.ptr_value, s_len); + s[s_len] = 0; + c = s; + while(*c != 0){ + if( !(32 <= *c && *c <= 126) ) + *c = '?'; + c++; + } + printf("FIXME: message received: \"%s\"\n", s); + return 0; +} + + +int +dis_if_receive(void) +{ + int err, free_needed; + dis_pdu pdu; + int processed = 0; + + + if ( ! network_enabled || ! app ) + return 0; + + err = 0; + while ( disx_readPDU(app, &pdu) ) { + + /* Some handling funcs store the PDU: do not release! */ + free_needed = 1; + + /* ignore other exercises */ + if (pdu.hdr.exercise_id != exercise) + goto free_pdu; + + switch (pdu.hdr.pdu_type) { + + case PDUTypeOther: + /* Clients in validation state may send this type of PDU to subscribe + * to the relay server. We ignore it. */ + break; + + case PDUTypeEntityState: + /* don't read our own broadcasts */ + if (dis_if_isLocalEntity(&pdu.entity_state.id)) + goto free_pdu; + if( validating_site_id ) + gotSiteId(pdu.entity_state.id.sim_id.site_id); + err = entityStatePDU(&pdu.entity_state); + processed++; + break; + + case PDUTypeFire: + /* don't read our own broadcasts */ + if (dis_if_isLocalEntity(&pdu.fire.firing_id)) + goto free_pdu; + if( validating_site_id ) + gotSiteId(pdu.fire.firing_id.sim_id.site_id); + err = firePDU(&pdu.fire); + processed++; + break; + + case PDUTypeDetonation: + /* don't read our own broadcasts */ + if (dis_if_isLocalEntity(&pdu.detonation.firing_id)) + goto free_pdu; + if( validating_site_id ) + gotSiteId(pdu.detonation.firing_id.sim_id.site_id); + err = detonationPDU(&pdu.detonation); + processed++; + break; + + case PDUTypeEmission: + /* don't read our own broadcasts */ + if (dis_if_isLocalEntity(&pdu.em_emission.emitter_id)) + goto free_pdu; + if( validating_site_id ) + gotSiteId(pdu.em_emission.emitter_id.sim_id.site_id); + err = emissionPDU(&pdu.em_emission); + free_needed = err != 0; + processed++; + break; + + case PDUTypeSetData: + /* don't read our own broadcasts */ + if (dis_if_isLocalEntity(&pdu.set_data.orig_id)) + goto free_pdu; + if( validating_site_id ) + gotSiteId(pdu.set_data.orig_id.sim_id.site_id); + err = setDataPDU( &pdu.set_data ); + free_needed = err != 0; + processed++; + break; + + case PDUTypeStopFreeze: + /* don't read our own broadcasts */ + if (dis_if_isLocalEntity(&pdu.stop.orig_id)) + goto free_pdu; + if( validating_site_id ) + gotSiteId(pdu.stop.orig_id.sim_id.site_id); + err = stopPDU( &pdu.stop ); + free_needed = err != 0; + processed++; + break; + + case PDUTypeStartResume: + /* don't read our own broadcasts */ + if (dis_if_isLocalEntity(&pdu.start.orig_id)) + goto free_pdu; + if( validating_site_id ) + gotSiteId(pdu.start.orig_id.sim_id.site_id); + err = startPDU( &pdu.start ); + free_needed = err != 0; + processed++; + break; + + case PDUTypeTransferControl: + /* don't read our own broadcasts */ + if (dis_if_isLocalEntity(&pdu.transfer_control.orig_id)) + goto free_pdu; + if( validating_site_id ) + gotSiteId(pdu.transfer_control.orig_id.sim_id.site_id); + err = transferControlPDU( &pdu.transfer_control ); + free_needed = err != 0; + processed++; + break; + + case PDUTypeAcknowledge: + /* don't read our own broadcasts */ + if (dis_if_isLocalEntity(&pdu.acknowledge.orig_id)) + goto free_pdu; + if( validating_site_id ) + gotSiteId(pdu.acknowledge.orig_id.sim_id.site_id); + err = acknowledgePDU( &pdu.acknowledge ); + free_needed = err != 0; + processed++; + break; + + case PDUTypeComment: + /* don't read our own broadcasts */ + if (dis_if_isLocalEntity(&pdu.message.orig_id)) + goto free_pdu; + if( validating_site_id ) + gotSiteId(pdu.message.orig_id.sim_id.site_id); + err = messagePDU( &pdu.message ); + free_needed = 1; + processed++; + break; + + default: + fprintf(stderr, "Ignoring unexpected/unsupported DIS PDU type %d\n", pdu.hdr.pdu_type); + err = 0; + break; + } + +/* + * Free any dynamically allocated variable components that are part of this + * PDU. + */ + + free_pdu: + if (free_needed) { + dis_freePDUComponents(&pdu); + } + + } + + updateProcessedPacketsPerSecond(processed); + + if( processed == 0 && validating_site_id ){ + /* + * No packets received. We still need to update timeouts and renew the + * subscription to the relay server: + */ + gotSiteId(-1); + } + +/* + * Check for timeouts on remote entities and look for pending state changes. + */ + + stats_local_entities_no = 0; + stats_remote_entities_no = 0; + int i; + for (i = varray_firstHandle(entities); i != 0; i = varray_nextHandle(entities)) { + dis_if_Entity *e = varray_getValue(entities, i); + if( e->isLocal ) + stats_local_entities_no++; + else + stats_remote_entities_no++; + if ( ! e->isLocal && theTime - e->lastTime > dis_if_RECV_TIMEOUT_SECONDS) { + char s[99]; + sprintf(s, "stale -- no packets received since %.0f s", + theTime - e->lastTime); + entityExit(i, s); + + } else if ( e->pending_state != dis_if_ENTITY_STATE_NONE ) { + if (theTime >= e->pending_time) { + e->state = e->pending_state; + e->pending_state = dis_if_ENTITY_STATE_NONE; + } + } + } + varray_releaseIterator(entities); + + return err != 0; +} + + +int +dis_if_snoop ( int millisec ) +{ + int interval_millisec = 500; + + if( ! network_enabled || ! app ) + return 0; + + if (dis_if_haveAbsoluteTime) + dis_if_setTimeAbsolute(); + else + dis_if_setTime(curTime); + + dis_if_receive(); + + while ( millisec > 0 ) { + if ( millisec < interval_millisec ) { + interval_millisec = millisec; + } +#ifdef WINNT + Sleep(interval_millisec); +#else + usleep ( interval_millisec * 1000 ); +#endif + + update_simulationTime (); + + if (dis_if_haveAbsoluteTime) + dis_if_setTimeAbsolute(); + else + dis_if_setTime(curTime); + dis_if_receive(); + + millisec -= interval_millisec; + } + + return 0; +} + + +int dis_if_transferControlRequestHandler(dis_if_Entity *e, dis_transfer_control_pdu *pdu) +{ + int result = dis_if_RESULT_UNABLE; + craftType *cinfo; + + switch (pdu->transfer_type) { + + /* + * Someone would like use to take control of an entity + * + * If it is an aircraft we can model, then make it a drone. + */ + + case DISTransferTypeEntityControllerRequest: + cinfo = inventory_craftTypeSearchByEntityType( &e->entityType ); + if ( cinfo != NULL ) { + e->c->type = CT_DRONE; + e->c->cinfo = cinfo; + /* TODO: provision the aircraft; landing gear, etc */ + result = dis_if_RESULT_REQUEST_OK; + } + break; + + /* + * Control of this entity is requested by someone else. + * + * Change type to DIS aircraft and we're done. + */ + + case DISTransferTypeEntityRequest: + result = dis_if_RESULT_REQUEST_OK; + e->c->type = CT_DIS_PLANE; + } + + return result; +} + + +/** + * Determines if an entity should emit entity state PDUs based on + * protocol rules + */ +static int +dis_shouldTransmitPDUs ( dis_if_Entity *e ) +{ + int result = 0; + + if (e->isLocal) { + if ( e->state == dis_if_ENTITY_STATE_SIMULATING ) { + result = 1; + } + else if ( e->state == dis_if_ENTITY_STATE_STOPPED && + e->emit_while_frozen ) { + result = 1; + } + } + + return result; +} + +/** + * Send an entity state PDU for the local entity with id (index) eid. + * + * Zero is returned on success. + */ +static int +sendEntityState(dis_if_Entity *e) +{ + dis_entity_state_pdu pdu, *esPDU = &pdu; + int i; + + if ( ! network_enabled || ! app || validating_site_id ) + return 0; + + if (dis_shouldTransmitPDUs ( e ) == 0) { + return 0; + } + + esPDU->hdr.pdu_type = PDUTypeEntityState; + esPDU->hdr.time_stamp = timeDoubleToDIS(theTime, absoluteTime); + esPDU->id = e->entityId; + esPDU->force_id = e->forceId; + esPDU->art_parm_count = 0; + esPDU->type = e->entityType; + esPDU->alt_type = e->altEntityType; + esPDU->pos.x = e->location[0]; + esPDU->pos.y = e->location[1]; + esPDU->pos.z = e->location[2]; + esPDU->vel.x = (float) e->velocity[0]; + esPDU->vel.y = (float) e->velocity[1]; + esPDU->vel.z = (float) e->velocity[2]; + esPDU->orientation.phi = (float) e->orientation[0]; + esPDU->orientation.theta = (float) e->orientation[1]; + esPDU->orientation.psi = (float) e->orientation[2]; + esPDU->appearance = e->appearance; + esPDU->dr_parm.algorithm = DISDRMethodRVW; + esPDU->dr_parm.linear_acc.x = (float) e->linearAcceleration[0]; + esPDU->dr_parm.linear_acc.y = (float) e->linearAcceleration[1]; + esPDU->dr_parm.linear_acc.z = (float) e->linearAcceleration[2]; + esPDU->dr_parm.angular_vel.x = (float) e->angularVelocity[0]; + esPDU->dr_parm.angular_vel.y = (float) e->angularVelocity[1]; + esPDU->dr_parm.angular_vel.z = (float) e->angularVelocity[2]; + esPDU->marking.charset = DISCharSetASCII; + memset(esPDU->marking.marking, 0, sizeof(esPDU->marking.marking)); + // We really need strncpy() here, NOT memory_strcpy(): + strncpy((char *) esPDU->marking.marking, (char *) e->markings, sizeof(esPDU->marking.marking)); + esPDU->capabilities = 0; + esPDU->art_parm = NULL; + + if ( ! disx_writePDU(app, (dis_pdu *) esPDU) ) { + return -2; + } + else { + dis_processNewDRParameters(esPDU, &e->dr); + e->lastTime = theTime; + for (i = 0; i < 3; i++) { + e->lastLocation[i] = e->location[i]; + e->lastVelocity[i] = e->velocity[i]; + e->lastLinearAcc[i] = e->linearAcceleration[i]; + e->lastOrientation[i] = e->orientation[i]; + e->lastAngularVel[i] = e->angularVelocity[i]; + } + + return 0; + } +} + +/** + * Set the position data of the entity with id (index) eid to the given + * values. + */ +static void +setPosData(int eid, double loc[3], double vel[3], double linAcc[3], + double ori[3], double angVel[3]) +{ + int i; + dis_if_Entity *e = varray_getValue(entities, eid); + for (i = 0; i < 3; i++) { + e->location[i] = loc[i]; + e->velocity[i] = vel[i]; + e->linearAcceleration[i] = linAcc[i]; + e->orientation[i] = ori[i]; + e->angularVelocity[i] = angVel[i]; + } +} + +/* + * Construct an EM emission PDU that reflects the current state of our + * radar set. We set 1 radar system with 0 or 1 beams. + */ +static int +constructEmissionPDU(dis_if_Entity *e, int mode, int update) +{ + dis_em_emission_pdu *em; + dis_em_system_info *s; + dis_beam_info b; + int num_beams = 0; + dis_track_info target; + + if( e->em == NULL ){ + e->em = (dis_if_EntityEM *) memory_allocate(sizeof(dis_if_EntityEM), NULL); + memory_zero(e->em); + e->em->em.hdr.pdu_type = PDUTypeEmission; + } + + e->em->mode = mode; + em = &e->em->em; + + if( network_enabled && ! validating_site_id ) + disx_issueEventID(app, &em->event); + else + memory_zero(&em->event); + + // Creates 1 radar system: + if( em->num_systems == 0 ){ + em->system = memory_allocate(sizeof(dis_em_system_info), NULL); + memory_zero(em->system); + } + em->num_systems = 1; + s = em->system; + + em->state_update = update; + + s->location.x = 0.0f; + s->location.y = 0.0f; + s->location.z = 0.0f; + s->emitter_system.name = 0; + s->emitter_system.function = DISEmitterFuncAirborneFireControl; + s->emitter_system.id = 1; + + // Set 0 or 1 beams: + memory_zero(&b); + switch (mode) { + + case 0: + num_beams = 0; + break; + +/* + * Three-bar track while scan mode + */ + + case 1: + num_beams = 1; + b.beam_id = 1; + b.beam_parm_index = 0; + b.beam_function = DISBeamFuncAcquisitionAndTracking; + b.fundamental.freq = 9000.0f; + b.fundamental.erp = 100.0f; + b.fundamental.prf = 18000.0f; + b.fundamental.pulse_width = 1.0f; + b.fundamental.beam_azimuth_center = 0.0f; + b.fundamental.beam_azimuth_sweep = units_DEGtoRAD(60); + b.fundamental.beam_elev_center = 0.0f; + b.fundamental.beam_elev_sweep = units_DEGtoRAD(60); + b.fundamental.beam_sweep_sync = 0.0f; + b.pad = 0; + b.jamming_mode = 0; + break; + +/* + * Four bar 20 x 30 ACM mode + */ + + case 2: + num_beams = 1; + b.beam_id = 1; + b.beam_parm_index = 1; + b.beam_function = DISBeamFuncAcquisitionAndTracking; + b.fundamental.freq = 9000.0f; + b.fundamental.erp = 100.0f; + b.fundamental.prf = 18000.0f; + b.fundamental.pulse_width = 1.0f; + b.fundamental.beam_azimuth_center = 0.0f; + b.fundamental.beam_azimuth_sweep = units_DEGtoRAD(30); + b.fundamental.beam_elev_center = 0.0f; + b.fundamental.beam_elev_sweep = units_DEGtoRAD(20); + b.fundamental.beam_sweep_sync = 0.0f; + b.pad = 0; + b.jamming_mode = 0; + break; + +/* + * Single target track + */ + + case 3: + num_beams = 1; + b.beam_id = 1; + b.beam_parm_index = 2; + b.beam_function = DISBeamFuncAcquisitionAndTracking; + b.fundamental.freq = 9000.0f; + b.fundamental.erp = 100.0f; + b.fundamental.prf = 18000.0f; + b.fundamental.pulse_width = 1.0f; + b.fundamental.beam_azimuth_center = 0.0f; /* wrong, don't care */ + b.fundamental.beam_azimuth_sweep = 0.0f; + b.fundamental.beam_elev_center = 0.0f; /* wrong, don't care */ + b.fundamental.beam_elev_sweep = 0.0f; + b.fundamental.beam_sweep_sync = 0.0f; + b.pad = 0; + b.jamming_mode = 0; + break; + + default: + error_internal("invalid radar mode: %d", mode); + } + + // Set tracked target: + int num_targets = 0; + if( num_beams > 0 ){ + e->em->cur_target = e->c->curRadarTarget; + + craft *c = e->c; + if( c->curRadarTarget >= 0 + && ! varray_isValidHandle(entities, ptbl[c->curRadarTarget].disId) + ){ + /* + * Target missing or already killed and removed. Update craft/missile + * target: + */ + c->curRadarTarget = -1; + } + + if (c->curRadarTarget >= 0) { + num_targets = 1; + dis_if_Entity *curRadarTarget = varray_getValue(entities, ptbl[c->curRadarTarget].disId); + target.target = curRadarTarget->entityId; + target.emitter_id = 1; + target.beam_id = 1; + } + } + + /* + * Set beam in the radar system avoiding dynamic memory allocation as much + * as possible by using the existing data structure already available in the + * emission PDU. We must set the system, the beam in the system, and the + * target in the beam. + */ + if( num_beams == 0 ){ + // No beams and no targets. Dispose any existing beam data: + if( s->num_beams > 0 ){ + int i; + for(i = 0; i < s->num_beams; i++){ + if( s->beam[0].num_targets > 0 ){ + memory_dispose(s->beam[0].tracked_target); + } + memory_dispose(s->beam); + } + s->beam = NULL; + } + s->num_beams = 0; + + } else { + // One beam to set. + if( s->num_beams == 0 ){ + if( num_targets > 0 ){ + b.num_targets = 1; + b.tracked_target = memory_allocate(sizeof(dis_track_info), NULL); + b.tracked_target[0] = target; + } + s->beam = memory_allocate(sizeof(dis_beam_info), NULL); + } else { + if( s->beam[0].num_targets == 0 ){ + if( num_targets > 0 ){ + b.num_targets = 1; + b.tracked_target = memory_allocate(sizeof(dis_track_info), NULL); + b.tracked_target[0] = target; + } + } else { + if( num_targets == 0 ){ + memory_dispose(s->beam[0].tracked_target); + } else { + b.num_targets = 1; + b.tracked_target = s->beam[0].tracked_target; + b.tracked_target[0] = target; + } + } + } + s->num_beams = 1; + s->beam[0] = b; + } + + return 0; +} + +void +dis_if_entityEnter(DISForce force, + craft * c, + dis_entity_type * e1, + dis_entity_type * e2, + double loc[3], + double vel[3], + double linAcc[3], + double ori[3], + double angVel[3], + int *neid) +{ + int eid; + dis_if_Entity *e; + + /* Get new entity and entity handle: */ + eid = varray_getDetachedHandle(entities); + if( eid == 0 ){ + /* Allocate entity: */ + e = memory_allocate(sizeof(dis_if_Entity), NULL); + eid = varray_addValue(entities, e); + } else { + /* Recycle existing entity block: */ + e = varray_getValue(entities, eid); + } + + /* It's safe to reset everything: */ + memory_zero(e); + + e->isLocal = 1; + e->c = c; + e->state = dis_if_ENTITY_STATE_SIMULATING; + e->pending_state = dis_if_ENTITY_STATE_NONE; + e->emit_while_frozen = 0; + + if( network_enabled ){ + disx_issueEntityID(app, &e->entityId); + } else { + memory_zero(&e->entityId); /* FIXME: ???? */ + } + + e->forceId = force; + e->entityType = *e1; + e->altEntityType = *e2; + + e->markings[0] = '\0'; + e->appearance = 0; + setPosData(eid, loc, vel, linAcc, ori, angVel); + + *neid = eid; + + constructEmissionPDU(e, 0, 0); + + dis_setDRThresholds(&e->dr, dis_if_SEND_TIMEOUT_SECONDS, + locationThreshold, orientationThreshold); +} + +void +dis_if_setEntityMarkings(int eid, char *markings) +{ + dis_if_Entity *e = varray_getValue(entities, eid); + // Note that here we really need strncpy() and NOT memory_strcpy() because + // the first also reset the whole field and NUL-termination is not needed. + strncpy((char *) e->markings, markings, MARKINGS_LEN); +} + +void +dis_if_getEntityMarkings(int eid, char *markings, int max) +{ + dis_if_Entity *e = varray_getValue(entities, eid); + // Note that here we really need strncpy() and NOT memory_strcpy() because + // the first also reset the whole field and NUL-termination is not needed. + strncpy(markings, (char *) e->markings, max); +} + +void +dis_if_setEntityAppearance(int eid, dis_entity_appearance x) +{ + dis_if_Entity *e = varray_getValue(entities, eid); + e->appearance = x; +} + +dis_entity_appearance +dis_if_getEntityAppearance(int eid) +{ + dis_if_Entity *e = varray_getValue(entities, eid); + return e->appearance; +} + + +void +dis_if_entityExit(int eid) +{ + dis_if_Entity *e; + + e = varray_getValue(entities, eid); + + e->appearance = DISAppearanceDamageDestroyed; + sendEntityState(e); + + if (e->em) { + dis_freePDUComponents((dis_pdu *) &e->em->em); + memory_dispose(e->em); + e->em = NULL; + } + varray_detach(entities, eid); +} + + +int +dis_if_setEntityState(int eid, double loc[3], double vel[3], + double linAcc[3], + double ori[3], double angVel[3]) +{ + if ( ! network_enabled || ! app || validating_site_id ) + return 0; + + double delta, min_delta; + int sendESPDU = 0, sendEMPDU = 0, i, j; + dis_euler_angles ori_e; + dis_if_Entity *e = varray_getValue(entities, eid); + + assert(e->isLocal); + + setPosData(eid, loc, vel, linAcc, ori, angVel); + +/* + * EM emission PDU possibly needed ? + */ + + delta = theTime - e->lastTime; + + if (e->em && e->em->mode > 0 + && (delta > dis_if_SEND_TIMEOUT_SECONDS || e->em->em.state_update) ) { + sendEMPDU = 1; + for (i = 0; i < e->em->em.num_systems; ++i) { + for (j = 0; j < e->em->em.system[0].num_beams; ++j) { + e->em->em.system[i].beam[j].fundamental.beam_sweep_sync += (float) delta; + } + } + e->em->lastTime = theTime; + e->em->em.state_update = 0; + } + + ori_e.phi = ori[0]; + ori_e.theta = ori[1]; + ori_e.psi = ori[2]; + + sendESPDU = dis_testDRThresholds(&e->dr, delta, (VPoint *) loc, &ori_e); + + /* + * Are we limiting PDU transmissions? + * + * If so, ensure enough time has passed since + * our last entity state transmission. + */ + + if (bandwidth_bps > 0.0) { + min_delta = 1440.0 * varray_length(entities) / bandwidth_bps; + if (delta < min_delta) { + sendESPDU = 0; + } + } + + if (sendESPDU != 0) { + sendEntityState(e); + } + + if ( sendEMPDU && e->state == dis_if_ENTITY_STATE_SIMULATING ) { + e->em->em.hdr.time_stamp = timeDoubleToDIS(theTime, absoluteTime); + if( network_enabled && ! validating_site_id ){ + // Set (or refresh because of the site ID validation) our ID: + e->em->em.emitter_id = e->entityId; + disx_writePDU(app, (dis_pdu *) & e->em->em); + } + } + return sendESPDU || sendEMPDU; +} + + +int +dis_if_getEntityState(int eid, double loc[3], double vel[3], double ori[3]) +{ + int i; + VMatrix orientation; + dis_linear_vel_vector drvel; + if( ! varray_isValidHandle(entities, eid) ) + return 0; + dis_if_Entity *e = varray_getValue(entities, eid); + assert( ! e->isLocal ); + if( ! e->isLocal ){ + /* Remote entity. */ + dis_computeDRPosition(&e->dr, + theTime - e->lastTime, + (VPoint *) & e->location, + &drvel, + &orientation); + + e->velocity[0] = drvel.x; + e->velocity[1] = drvel.y; + e->velocity[2] = drvel.z; + + VMatrixToEuler(&orientation, + &e->orientation[0], + &e->orientation[1], + &e->orientation[2]); + + for (i = 0; i < 3; i++) { + loc[i] = e->location[i]; + vel[i] = e->velocity[i]; + ori[i] = e->orientation[i]; + } + + } else { + /* Local entity. */ + for (i = 0; i < 3; i++) { + loc[i] = e->location[i]; + vel[i] = 0.0; + ori[i] = e->orientation[i]; + } + + } + return 1; +} + +int +dis_if_fire(int ftype, int firingEid, int targetEid, int rounds, + double location[3], double velocity[3], double range, + int *eventId, int *missileEid) +{ + /* FIXME: TODO */ + *eventId = 0; + *missileEid = 0; + + return 0; +} + + +static dis_entity_id null_id = {{0, 0}, 0}; + +int +dis_if_fireCannon(craft * c, VPoint * pos, VPoint * vel, int quantity, int rate) +{ + dis_fire_pdu fire; + int status; + dis_if_Entity *e; + + if ( ! network_enabled || ! app || validating_site_id) + return 0; + + fire.hdr.pdu_type = PDUTypeFire; + + e = varray_getValue(entities, c->disId); + fire.firing_id = e->entityId; + fire.target_id = null_id; + fire.munition_id = null_id; + + disx_issueEventID(app, &fire.event); + + fire.fire_mission_index = 0; /* NO_FIRE_MISSION */ + fire.pos = *pos; + fire.burst.munition = cannon_types[1]; + fire.burst.warhead = 0; + fire.burst.fuze = 0; + fire.burst.quantity = quantity; + fire.burst.rate = rate; + + ACMtoDISVelocity(vel, (void *) &fire.vel); + + fire.range = 0.0f; + + fire.hdr.time_stamp = timeDoubleToDIS(theTime, absoluteTime); + + status = disx_writePDU(app, (dis_pdu *) & fire); + return (status == 0) ? 0 : -1; +} + + +int +dis_if_detonation(dis_entity_type * munition_type, + int firingEid, int targetEid, int munitionEid, + double worldLocation[3], double entityLocation[3], + double vel[3]) +{ + dis_detonation_pdu pdu; + int status; + dis_if_Entity *firing, *target, *munition; + + if ( ! network_enabled || ! app || validating_site_id ) + return 0; + + pdu.hdr.pdu_type = PDUTypeDetonation; + + if( ! varray_isValidHandle(entities, firingEid) ){ + /* only local entities may set a detonation, should never happen */ + return -3; + } + firing = varray_getValue(entities, firingEid); + if ( ! firing->isLocal ) { + /* should never happen, only local entities may set detonation */ + return -1; + } + + if( targetEid != dis_if_ID_NONE && varray_isValidHandle(entities, targetEid) ) + /* Target entity available. */ + target = varray_getValue(entities, targetEid); + else + /* Either no target set, or targeted entity not available. */ + target = NULL; + + if (targetEid != dis_if_ID_NONE && target == NULL) { + /* Set target isn't available anymore in our table. */ + return -2; + } + pdu.firing_id = firing->entityId; + if (target != NULL) { + pdu.target_id = target->entityId; + } + else { + pdu.target_id = null_id; + } + + if (munitionEid != dis_if_ID_NONE) + munition = varray_getValue(entities, munitionEid); + else + munition = NULL; + + if (munition != NULL) { + pdu.munition_id = munition->entityId; + } + else { + pdu.munition_id = null_id; + } + + disx_issueEventID(app, &pdu.event); + + pdu.vel.x = (float) vel[0]; + pdu.vel.y = (float) vel[1]; + pdu.vel.z = (float) vel[2]; + + pdu.pos.x = worldLocation[0]; + pdu.pos.y = worldLocation[1]; + pdu.pos.z = worldLocation[2]; + + pdu.burst.munition = *munition_type; + +/* + * This code will need some extra work ... + */ + + if (pdu.burst.munition.category == 2) { + pdu.burst.warhead = DISWarheadKinetic; + pdu.burst.fuze = DISFuzeContact; + pdu.burst.quantity = 1; + pdu.burst.rate = 0; + pdu.result = DISDetonationResultEntityImpact; + } + else { + pdu.burst.warhead = DISWarheadHEFragment; + pdu.burst.fuze = DISFuzeProximity; + pdu.burst.quantity = 1; + pdu.burst.rate = 0; + pdu.result = DISDetonationResultDetonation; + } + + pdu.loc.x = (float) entityLocation[0]; + pdu.loc.y = (float) entityLocation[1]; + pdu.loc.z = (float) entityLocation[2]; + + pdu.result = 0; + pdu.num_art_parms = 0; + pdu.art_parm = NULL; + + pdu.hdr.time_stamp = timeDoubleToDIS(theTime, absoluteTime); + + status = disx_writePDU(app, (dis_pdu *) & pdu); + return (status == 0) ? 0 : -1; +} + +/** + * Initialize EM info data structures. Returns zero on success, -1 on error. + */ +static int +initializeEMInfo ( dis_if_Entity *e ) +{ + int result = 0; + + if (e->em == NULL) { + +/* + * Allocate EM emission information structure and initialize it to reflect + * that this is an external entity (mode == -1). + */ + + e->em = (dis_if_EntityEM *) memory_allocate(sizeof(dis_if_EntityEM), NULL); + memory_zero(e->em); + e->em->mode = -1; + e->em->cur_target = -1; + + } + return result; +} + + +int +dis_if_setRadarMode(craft * c, int mode, int update) +{ + int status; + dis_if_Entity *e; + + e = varray_getValue(entities, c->disId); + + if ( e->em == NULL) { + initializeEMInfo ( e ); + } + + if ( e->em->mode == mode) { + return 0; + } + + constructEmissionPDU(e, mode, 1); + e->em->em.hdr.time_stamp = timeDoubleToDIS(theTime, absoluteTime); + e->em->lastTime = theTime; + if ( ! network_enabled || ! app || validating_site_id ) + return 0; + status = disx_writePDU(app, (dis_pdu *) & e->em->em); + return (status == 0) ? 0 : -1; +} + + +int +dis_if_radarTargetChanged(craft * c) +{ + int status; + dis_if_Entity *e; + + e = varray_getValue(entities, c->disId); + if ( e->em == NULL) { + initializeEMInfo(e); + } + + if (e->em->cur_target == c->curRadarTarget) { + return 0; + } + constructEmissionPDU(e, e->em->mode, 1); + e->em->em.hdr.time_stamp = timeDoubleToDIS(theTime, absoluteTime); + e->em->lastTime = theTime; + if ( ! network_enabled || ! app || validating_site_id ) + return 0; + status = disx_writePDU(app, (dis_pdu *) & e->em->em); + return (status == 0) ? 0 : -1; +} + + +int +dis_if_getBeamCount(craft * c) +{ + dis_if_Entity *e = varray_getValue(entities, c->disId); + if (e->em && e->em->em.num_systems > 0) { + return e->em->em.system[0].num_beams; + } + return 0; +} + + +void +dis_if_getRadarParameters(craft * c, int j, double *az_center, double *az_width, + double *el_center, double *el_width, double *erp) +{ + dis_if_Entity *e = varray_getValue(entities, c->disId); + dis_beam_info *b = &e->em->em.system[0].beam[j]; + *az_center = b->fundamental.beam_azimuth_center; + *az_width = b->fundamental.beam_azimuth_sweep; + *el_center = b->fundamental.beam_elev_center; + *el_width = b->fundamental.beam_elev_sweep; + *erp = b->fundamental.erp; +} + +static int +transferControlPDU ( dis_transfer_control_pdu *pdu ) +{ + dis_if_Entity *e; + int eid; + dis_acknowledge_pdu reply_pdu; + int status = 0; + int error_return_needed = 0; + + if( app == NULL || validating_site_id ) + return -1; + + reply_pdu.hdr = pdu->hdr; + reply_pdu.hdr.pdu_type = PDUTypeAcknowledge; + reply_pdu.hdr.time_stamp = timeDoubleToDIS( theTime, absoluteTime ); + + reply_pdu.orig_id = pdu->recv_id; + reply_pdu.recv_id = pdu->orig_id; + reply_pdu.request_id = pdu->request_id; + + /* + * Request applies to one of our entities? + */ + + eid = findLocalEntity( &pdu->target_id ); + if ( eid != 0 ) { + + e = varray_getValue(entities, eid); + + if (pdu->recv_id.sim_id.site_id == site && + ( pdu->recv_id.sim_id.application_id == ALL_APPLIC || + pdu->recv_id.sim_id.application_id == application )) { + + reply_pdu.acknowledge_flag = 36; /* per CALSPAN */ + reply_pdu.resp_flag = 1; /* per CALSPAN */ + + switch (pdu->transfer_type) { + + /* + * Someone wants us to take control of an entity + */ + + case DISTransferTypeEntityControllerRequest: + + /* + * the transferControlRequestCallback function is + * responsible for determining if we can feasibly take + * control of the entity. + */ + + if ( (transferControlRequestCallback != NULL) & + ((*transferControlRequestCallback)(e, pdu) == 0) ) { + + status = disx_writePDU( app, (dis_pdu *) & reply_pdu ); + status = (status == 0) ? 0 : -1; + + if (status == 0) { + e->isLocal = 1; + } + } + else { + error_return_needed = 1; + } + break; + + /* + * Control of this entity is requested by someone else. + */ + + case DISTransferTypeEntityRequest: + + if (transferControlRequestCallback != NULL && + (*transferControlRequestCallback)(e, pdu) == 0) { + + status = disx_writePDU( app, (dis_pdu *) & reply_pdu ); + status = (status == 0) ? 0 : -1; + + if (status == 0) { + e->isLocal = 0; + } + } + else { + error_return_needed = 1; + } + break; + } + + } + } + else { + /* + * The target entity was not local to us. Still, the PDU might + * look like it is destined for us. In this case, return an + * error reply. + */ + + if (pdu->recv_id.sim_id.site_id == site && + ( pdu->recv_id.sim_id.application_id == ALL_APPLIC || + pdu->recv_id.sim_id.application_id == application )) { + + error_return_needed = 1; + } + } + + if (error_return_needed) { + + reply_pdu.acknowledge_flag = 36; /* per CALSPAN */ + reply_pdu.resp_flag = 5; /* error state, per CALSPAN */ + + status = disx_writePDU(app, (dis_pdu *) & reply_pdu); + status = (status == 0) ? 0 : -1; + } + + return status; +} + +static int +acknowledgePDU ( dis_acknowledge_pdu *pdu ) +{ + dis_if_Entity *e; + dis_if_OutstandingRequestInfo *preq; + + preq = findRequestByRequestID ( pdu->request_id ); + + if ( preq != NULL && + preq->request_type == OUTSTANDING_REQUEST_TRANSFER_CONTROL ) { + + e = preq->e; + + /* + * no longer need to track the request + */ + + removeRequest ( preq ); + + /* + * Were we expecting to be granted control? If not, there is some sort + * of error. + * + * This is a non-standard exchange defined by CALSPAN. We are + * processing a response to a control request. The request was + * originated by us, the response we just received comes from the + * controlling application. + */ + + if ( pdu->acknowledge_flag == 36 ) { + + /* + * response flag set to "1" to indicate a success + * "5" indicates a failure + */ + + switch (pdu->resp_flag) { + case 1: + if (e->controlRequestCallback) { + (e->controlRequestCallback)( (dis_pdu *) pdu, + e->callbackData ); + } + e->isLocal = 1; + e->state = dis_if_ENTITY_STATE_SIMULATING; + e->pending_state = dis_if_ENTITY_STATE_NONE; + break; + + case 5: + if (e->controlRequestCallback) { + (e->controlRequestCallback)( (dis_pdu *) pdu, + e->callbackData ); + } + break; + + default: + printf("Unrecognized response flag in Acknowledge DIS PDU: %d\n", + pdu->resp_flag ); + break; + } + + e->controlRequestCallback = NULL; + e->callbackData = NULL; + } + } + + return 0; +} + + +int +dis_if_sendMessage(int senderEid, char *s) +{ + dis_comment_pdu pdu, *msgPDU = &pdu; + dis_variable_datum datum; + + dis_if_Entity *sender = varray_getValue(entities, senderEid); + + if ( ! network_enabled || ! app || validating_site_id ) + return 0; + + msgPDU->hdr.pdu_type = PDUTypeComment; + msgPDU->hdr.time_stamp = timeDoubleToDIS(theTime, absoluteTime); + msgPDU->orig_id = sender->entityId; + msgPDU->recv_id.entity_id = 0; // ? + msgPDU->num_variable_data = 1; + msgPDU->variable_datum = &datum; + datum.datum_id = datum_AltDescription; // ? + datum.value_length = 8*strlen(s); + datum.value.ptr_value = (u_char *) s; + + if (disx_writePDU(app, (dis_pdu *) msgPDU) != 0) { + return -1; + } + return 0; +} + +int +dis_if_requestControl (dis_if_Entity *e, + int (*callbackFn)(dis_pdu*, void *), + void *arg) +{ + dis_pdu pdu; + int status; + dis_if_OutstandingRequestInfo *preq; + + + if ( app == NULL || validating_site_id || e->isLocal) + return -1; + + memset ( &pdu, 0, sizeof(pdu) ); + e->callbackData = arg; + e->controlRequestCallback = callbackFn; + + pdu.hdr.pdu_type = PDUTypeTransferControl; + pdu.hdr.time_stamp = timeDoubleToDIS(theTime, absoluteTime); + + pdu.transfer_control.request_id = disx_issueRequestID ( app ); + + pdu.transfer_control.orig_id.sim_id.site_id = site; + pdu.transfer_control.orig_id.sim_id.application_id = application; + pdu.transfer_control.orig_id.entity_id = NO_ENTITY; + + pdu.transfer_control.recv_id.sim_id = e->entityId.sim_id; + pdu.transfer_control.recv_id.entity_id = NO_ENTITY; + + pdu.transfer_control.target_id = e->entityId; + + pdu.transfer_control.reliability_service = 1; + pdu.transfer_control.num_record_sets = 0; + pdu.transfer_control.transfer_type = DISTransferTypeEntityRequest; + + /* + * Add tracking information so that we know about this + * outstanding request. + */ + + preq = addRequest ( pdu.transfer_control.request_id ); + if (preq) { + preq->request_type = OUTSTANDING_REQUEST_TRANSFER_CONTROL; + preq->e = e; + /* requests can timeout, but we don't track that, yet */ + preq->timeout_time = theTime + 5.0; + } + + status = disx_writePDU( app, & pdu ); + return (status == 0) ? 0 : -1; +} + +static int +setDataPDU (dis_set_data_pdu *pdu) +{ + int eid; + dis_data_pdu reply_pdu; + unsigned int i; + int status; + + if( app == NULL ) + return -1; + + reply_pdu.hdr = pdu->hdr; + reply_pdu.hdr.pdu_type = PDUTypeData; + reply_pdu.hdr.time_stamp = timeDoubleToDIS( theTime, absoluteTime ); + + reply_pdu.orig_id = pdu->recv_id; + reply_pdu.recv_id = pdu->orig_id; + reply_pdu.request_id = pdu->request_id; + + disx_initializeDatumInfo (&reply_pdu.datum_info); + + eid = findEntity(&pdu->recv_id); + if (eid == 0) { + return -1; + } + /* + else { + e = &entities[eid]; + } + */ + + for (i=0; idatum_info.num_fixed_data; ++i) { + switch ( pdu->datum_info.variable_datum[i].datum_id ) { + case datum_OrientationX: + break; + case datum_OrientationY: + break; + case datum_OrientationZ: + break; + + case datum_XVelocity: + break; + case datum_YVelocity: + break; + case datum_ZVelocity: + break; + } + } + + for (i=0; idatum_info.num_variable_data; ++i) { + switch ( pdu->datum_info.variable_datum[i].datum_id ) { + case datum_GeocentricCoordinatesX: + break; + case datum_GeocentricCoordinatesY: + break; + case datum_GeocentricCoordinatesZ: + break; + } + } + + /* + * Send reply + */ + + status = disx_writePDU(app, (dis_pdu *) & reply_pdu); + return (status == 0) ? 0 : -1; +} + +static int +stopPDU (dis_stop_pdu *pdu) +{ + dis_if_Entity *e; + int eid; + int status = 0; + int need_reply = 1; + int all_local_entities = 0; + dis_acknowledge_pdu reply_pdu; + struct timeval tv; + double changeTime; + + if( app == NULL || validating_site_id ) + return -1; + reply_pdu.hdr = pdu->hdr; + reply_pdu.hdr.pdu_type = PDUTypeAcknowledge; + reply_pdu.hdr.time_stamp = timeDoubleToDIS( theTime, absoluteTime ); + + reply_pdu.orig_id = pdu->recv_id; + reply_pdu.recv_id = pdu->orig_id; + + reply_pdu.request_id = pdu->request_id; + reply_pdu.acknowledge_flag = DISAcknowledgeFlagStop; + reply_pdu.resp_flag = DISRequestStatusComplete; + + if (pdu->recv_id.sim_id.site_id == ALL_SITES) { + all_local_entities = 1; + } + else if (pdu->recv_id.sim_id.site_id == site && + pdu->recv_id.sim_id.application_id == ALL_APPLIC) { + all_local_entities = 1; + } + else if (pdu->recv_id.sim_id.site_id == site && + pdu->recv_id.sim_id.application_id == application && + pdu->recv_id.entity_id == ALL_ENTITIES) { + all_local_entities = 1; + } + + dis_timeToTimeval( &pdu->real_time, &tv ); + changeTime = tv.tv_sec + tv.tv_usec / 1000000.0; + + if ( all_local_entities ) { + int i; + + for(i = varray_firstHandle(entities); i != 0; i = varray_nextHandle(entities)){ + e = varray_getValue(entities, i); + + if ( ! e->isLocal ) { + continue; + } + + if ( changeTime <= theTime ) { + e->state = dis_if_ENTITY_STATE_STOPPED; + } + else { + e->pending_state = dis_if_ENTITY_STATE_STOPPED; + e->pending_time = changeTime; + } + + if ( pdu->behavior & DISFrozenBehaviorRunClock ) { + } + + if ( pdu->behavior & DISFrozenBehaviorTransmit ) { + e->emit_while_frozen = 1; + } + + if ( pdu->behavior & DISFrozenBehaviorReceive ) { + } + } + varray_releaseIterator(entities); + } + else { + + eid = findEntity(&pdu->recv_id); + if (eid == 0) { + /* cannot comply, entity not found */ + reply_pdu.orig_id.entity_id = NO_ENTITY; + reply_pdu.resp_flag = DISRequestStatusOther; + } + else { + e = varray_getValue(entities, eid); + + if (e->isLocal) { + + if ( changeTime <= theTime ) { + e->state = dis_if_ENTITY_STATE_STOPPED; + } + else { + e->pending_state = dis_if_ENTITY_STATE_STOPPED; + e->pending_time = changeTime; + } + + if ( pdu->behavior & DISFrozenBehaviorRunClock ) { + } + + if ( pdu->behavior & DISFrozenBehaviorTransmit ) { + e->emit_while_frozen = 1; + } + + if ( pdu->behavior & DISFrozenBehaviorReceive ) { + } + } + else { + need_reply = 0; + } + } + } + + /* + * Send reply + */ + if (need_reply) { + status = disx_writePDU(app, (dis_pdu *) & reply_pdu); + } + return (status == 0) ? 0 : -1; +} + +static int +startPDU (dis_start_pdu *pdu) +{ + dis_if_Entity *e; + int eid; + int status = 0; + int need_reply = 1; + int all_local_entities = 0; + dis_acknowledge_pdu reply_pdu; + struct timeval tv; + double changeTime; + + if( app == NULL || validating_site_id ) + return -1; + reply_pdu.hdr = pdu->hdr; + reply_pdu.hdr.pdu_type = PDUTypeAcknowledge; + reply_pdu.hdr.time_stamp = timeDoubleToDIS( theTime, absoluteTime ); + + reply_pdu.orig_id = pdu->recv_id; + reply_pdu.recv_id = pdu->orig_id; + + reply_pdu.request_id = pdu->request_id; + reply_pdu.acknowledge_flag = DISAcknowledgeFlagStop; + reply_pdu.resp_flag = DISRequestStatusComplete; + + if (pdu->recv_id.sim_id.site_id == ALL_SITES) { + all_local_entities = 1; + } + else if (pdu->recv_id.sim_id.site_id == site && + pdu->recv_id.sim_id.application_id == ALL_APPLIC) { + all_local_entities = 1; + } + else if (pdu->recv_id.sim_id.site_id == site && + pdu->recv_id.sim_id.application_id == application && + pdu->recv_id.entity_id == ALL_ENTITIES) { + all_local_entities = 1; + } + + dis_timeToTimeval( &pdu->real_time, &tv ); + changeTime = tv.tv_sec + tv.tv_usec / 1000000.0; + + if ( all_local_entities ) { + int i; + + for(i = varray_firstHandle(entities); i != 0; i = varray_nextHandle(entities)){ + e = varray_getValue(entities, i); + + if ( ! e->isLocal ) { + continue; + } + + if ( changeTime <= theTime ) { + e->state = dis_if_ENTITY_STATE_SIMULATING; + } + else { + e->pending_state = dis_if_ENTITY_STATE_SIMULATING; + e->pending_time = changeTime; + } + + e->emit_while_frozen = 0; + } + varray_releaseIterator(entities); + } + else { + eid = findEntity( &pdu->recv_id ); + if (eid == 0) { + /* cannot comply. entity not found */ + reply_pdu.orig_id.entity_id = NO_ENTITY; + reply_pdu.resp_flag = DISRequestStatusOther; + } + else { + e = varray_getValue(entities, eid); + + /* + * Is entity local ? + */ + + if ( e->isLocal ) { + + if ( changeTime <= theTime ) { + e->state = dis_if_ENTITY_STATE_SIMULATING; + } + else { + e->pending_state = dis_if_ENTITY_STATE_SIMULATING; + e->pending_time = changeTime; + } + + e->emit_while_frozen = 0; + } + else { + need_reply = 0; + } + } + } + + /* + * Send reply + */ + + if (need_reply) { + status = disx_writePDU(app, (dis_pdu *) & reply_pdu); + } + return (status == 0) ? 0 : -1; +} + +int dis_if_getNumberOfLocalEntities() +{ + return stats_local_entities_no; +} + +int dis_if_getNumberOfRemoteEntities() +{ + return stats_remote_entities_no; +} + +double dis_if_getProcessedPacketsPerSecond() +{ + return stats_processed_packets_per_second; +} + + +char *dis_if_updateRemote(craft *c) +{ + double location[3]; + double velocity[3]; + double orientation[3]; + VPoint tmp; + VMatrix ABCtoXYZ; + + if( ! dis_if_getEntityState(c->disId, location, velocity, orientation) ) + return "entity not tracked anymore"; + + c->prevSg = c->Sg; + c->Sg.x = location[0]; + c->Sg.y = location[1]; + c->Sg.z = location[2]; + + earth_XYZToLatLonAlt(&c->Sg, &c->w); + earth_generateWorldToLocalMatrix(&c->w, &c->XYZtoNED); + + tmp.x = units_METERStoFEET(velocity[0]); + tmp.y = units_METERStoFEET(velocity[1]); + tmp.z = units_METERStoFEET(velocity[2]); + VTransform_(&tmp, &c->XYZtoNED, &c->Cg); + + /* Compute the "ABCtoNED" trihedral from the DIS Euler angles: */ + c->curRoll = pm_normalize_roll( orientation[0] ); + c->curPitch = pm_normalize_pitch( orientation[1] ); + c->curHeading = pm_normalize_yaw( orientation[2] ); + + VEulerToMatrix(c->curRoll, c->curPitch, c->curHeading, + &ABCtoXYZ); + VMatrixMultByRank(&ABCtoXYZ, &c->XYZtoNED, &c->trihedral, 3); + + /* Now derive NED heading, pitch and roll from adjusted trihedral: */ + pm_euler(c); + + return NULL; +} + + +void dis_if_updateLocal(craft *c) +{ + VPoint velocity, linearAcceleration; + double location[3], disVelocity[3], disLinearAcceleration[3]; + double orientation[3], angularVelocity[3]; + VPoint tmp; + VMatrix ABCtoXYZ, NEDtoXYZ; + static double base = -1; + + if (base < 0) + base = curTime; + +/* + * Well, this is a bit strange, but ACM's coordinate system for positions + * is meters in the Geocentric; for velocities are expressed as feet per + * second in the local NED [north-east-down] system. + */ + + location[0] = c->Sg.x; + location[1] = c->Sg.y; + location[2] = c->Sg.z; + + tmp.x = units_FEETtoMETERS(c->Cg.x); + tmp.y = units_FEETtoMETERS(c->Cg.y); + tmp.z = units_FEETtoMETERS(c->Cg.z); + VReverseTransform_(&tmp, &c->XYZtoNED, &velocity); + disVelocity[0] = velocity.x; + disVelocity[1] = velocity.y; + disVelocity[2] = velocity.z; + +/* + * Derive ECI [Geocentric] heading, pitch, roll + */ + VMatrixTranspose(&c->XYZtoNED, &NEDtoXYZ); + /* the trihedral is an "ABCtoNED" transformation */ + VMatrixMultByRank(&c->trihedral, &NEDtoXYZ, &ABCtoXYZ, 3); + VMatrixToEuler(&ABCtoXYZ, &orientation[0], &orientation[1], &orientation[2]); + + /* + * Body frame angular velocities. + */ + + angularVelocity[0] = c->p; /* x-axis */ + angularVelocity[1] = c->q; /* y-axis */ + angularVelocity[2] = c->r; /* z-axis */ + + /* + * Transform linear acceleration vector + * from body coordinates to ECI system + */ + + tmp = c->linAcc; + tmp.x = units_FEETtoMETERS(tmp.x); + tmp.y = units_FEETtoMETERS(tmp.y); + tmp.z = units_FEETtoMETERS(tmp.z); + VTransform_(&tmp, &ABCtoXYZ, &linearAcceleration); + disLinearAcceleration[0] = linearAcceleration.x; + disLinearAcceleration[1] = linearAcceleration.y; + disLinearAcceleration[2] = linearAcceleration.z; + + dis_if_setEntityState(c->disId, location, disVelocity, + disLinearAcceleration, orientation, angularVelocity); +} \ No newline at end of file diff -Nru acm-5.0/src/acm/dis_if.h acm-6.0+20200416/src/acm/dis_if.h --- acm-5.0/src/acm/dis_if.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/dis_if.h 2020-04-16 12:05:39.000000000 +0000 @@ -0,0 +1,640 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1998 Riley Rainey + * Copyright (C) 1995 Mats Lofkvist CelsiusTech Electronics AB + * Additions Copyright (c) 1998 Web Simulations, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +/** + * Interface routines between the ACM program and the DIS protocol that + * manages an internal array of local and remote entities. + * + *

Entity ID or entity handle.

+ * The "entity ID", or "eid" for short, is an handle of type int assigned by + * this module to each tracked DIS entity, either local or remote, be it a craft, + * a missile or a projectile. The zero value IS NOT a valid entity ID and can be + * used to indicate "no DIS entity assigned"; the dis_if_ID_NONE macro makes + * this value more apparent. This entity ID should not be confused with the + * "DIS entity ID", this latter being part of the DIS protocol. + * + *

DIS entity identification

+ * All the participants to the simulation must share the same exercise ID. + * Each participant shall generate its own local entities and shall send its own + * state to the other participants; each entity must be univocally identified + * by: DIS application ID, DIS site ID and DIS entity ID. The first 2 parameters + * can be set once for all in the initialization function of this module. + * The DIS entity ID is a counter assigned by the DIS library to each new DIS + * entity registered by the local application. Then, each participant MUST have + * a distinct application and site IDs, and MUST share the same exercise ID. + * + *

Local entities.

+ * A local entity (aircraft or missile) is registered in this module by ACM + * by calling dis_if_entityEnter(), updated with dis_if_setEntityState() and finally + * killed with dis_if_entityExit(). This module will take care to send all the + * corresponding DIS packets to the participants. + * The state of the local entities is broadcasted to the other players + * periodically or after any meaningful state change according to the set + * DR thresholds. The only exception to this rule are the cannon shells: each + * cannon burst creates a "craft" that carries a certain number of rounds, but + * each burst is not a tracked entity and each client is responsible for + * simulating its dynamics once a "fire" event PDU is received from a remote + * client. + * + *

Remote entities.

+ * ACM must also call dis_if_receive() to process incoming DIS packets. New + * entities entering and old entities exiting the simulation are notified to ACM + * through the callback function it specified in the initialization functions. + * ACM may then call dis_if_getEntityState() to retrieve a "dead reckoning" DR + * updated state of the remote entity. + * "Silent" remote entities are removed automatically after some time; ACM is + * notified as usual about that. + * + *

Credits

+ * This module was originally written by Mats Lofkvist specifically for the ACM + * program and then maintained by Riley Rainey up to ACM 5. Source cleaning + * and documentation integrated by Umberto Salsi for the ACM 6 release. + * + * @author Mats Lofkvist -- CelsiusTech Electronics AB + * @author Riley Rainey + * @license GNU GPL + * @version $Date: 2020/01/08 06:03:07 $ + * @file + */ + +#ifndef dis_if_H +#define dis_if_H + +#include "../util/varray.h" +#include "pm.h" +#include "../dis/dis/disx.h" + +#ifdef dis_if_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +/* fire types */ +//#define dis_if_FIRE_OTHER 0 /* FIXME: not used */ +#define dis_if_FIRE_M61A1 1 +#define dis_if_FIRE_AIM9M 2 +#define dis_if_FIRE_AIM120 3 + +/** + * Unassigned entity ID. + */ +#define dis_if_ID_NONE (0) + +#define MARKINGS_LEN 11 + +typedef int (*dis_if_RequestControlCallback)(dis_pdu *, void *); + +typedef struct { + /** Current mode. */ + int mode; + /** Current radar target (ptbl index). */ + int cur_target; + /** Time of last update. */ + double lastTime; + /** Last emission PDU sent or received for this emitter. */ + dis_em_emission_pdu em; + /** Systems passed to us. */ + /** Track/jam target info. */ + dis_track_info *target; +} dis_if_EntityEM; + +typedef enum { + /** Created, but non participating. */ + dis_if_ENTITY_STATE_WAIT, + /** Actively simulating. */ + dis_if_ENTITY_STATE_SIMULATING, + /** Stopped/Frozen. */ + dis_if_ENTITY_STATE_STOPPED, + /** used in pending state. */ + dis_if_ENTITY_STATE_NONE +} dis_if_EntytyState; + +/** + * Local or remote DIS entity. + */ +typedef struct { + /** If this entity is local or remote. */ + int isLocal; + /** Entity state; per [1] 4.5.5.5.3. */ + dis_if_EntytyState state; + dis_if_EntytyState pending_state; + /** Time of state change. */ + double pending_time; + /** 1 to send entity state updates. */ + int emit_while_frozen; + /** Pointer to craft structure in ptbl. */ + craft *c; + /** + * For local entity, it is the last time a packet has been sent. + * For remote entity, it is the last time a packet has been receive. + * Currently both times are set using our timestamp (seconds since Unix + * epoch). + */ + double lastTime; + /** DISForce enum. */ + u_char forceId; + dis_entity_id entityId; + dis_entity_type entityType; + dis_entity_type altEntityType; + /** Dead reckoning parameters. */ + dis_dr_parameters dr; + /** EM emission PDU information, or NULL if not available. */ + dis_if_EntityEM *em; + unsigned char markings[MARKINGS_LEN+1]; + unsigned int appearance; + double location[3]; + double velocity[3]; + double linearAcceleration[3]; + double orientation[3]; + double angularVelocity[3]; + double lastLocation[3]; + double lastVelocity[3]; + double lastLinearAcc[3]; + double lastOrientation[3]; + double lastAngularVel[3]; + dis_if_RequestControlCallback controlRequestCallback; + void *callbackData; +} dis_if_Entity; + +typedef enum { + OUTSTANDING_REQUEST_TRANSFER_CONTROL = 0, +} dis_if_OutstandingRequest; + +typedef struct dis_if_OutstandingRequestInfo { + /** Type of pending request. */ + dis_if_OutstandingRequest request_type; + /** DIS request identifier. */ + dis_request_id request_id; + /** Entity involved in request. */ + dis_if_Entity *e; + /** When will the request expire. */ + double timeout_time; + struct dis_if_OutstandingRequestInfo *next; + struct dis_if_OutstandingRequestInfo *prev; +} dis_if_OutstandingRequestInfo; + +/** + * Callback invoked by this module when a new remote entity enter the simulation. + * The arguments are the id of the new entity and its type + * (one of dis_if_ENTITY_XXX). + */ +typedef void (*dis_if_EntityEnterCb) (int eid, + dis_entity_type * etype, DISForce force, craft ** cptr); + +/** + * Callback invoked by this module when a remote detonation occurs. + * The arguments are the type of fire detonating (one of dis_if_FIRE_XXX), + * the id of the firing entity, the id of the target entity, + * the time of the detonation and the location of the detonation in + * world coordinates and in target body coordinates. + * @param ftype dis_if_FIRE_M61A1 or dis_if_FIRE_AIM9M. + * @param firing Firing entity. + * @param target Target craft that might so result damaged or destroyed. + * @param time DIS PDU timestamp. + * @param worldLocation Point of impact, that is where the missile was when + * it exploded. + * @param entityLocation Ignored by ACM. + * @param m The missile or munition that hit the target. + * @param dpdu Detonation DIS PDU. + */ +typedef void (*dis_if_DetonationCb) (int ftype, + craft *firing, + craft *target, + double time, + double worldLocation[3], + double entityLocation[3], + craft * munition, + dis_detonation_pdu *dpdu); + +/** + * Callback invoked by this module when the remote cannon firing burst DIS PDU + * arrives. The m61a1 modules already provides a function for that. + */ +typedef void (*dis_if_CannonFireCb) (int owner, VPoint *pos, VPoint *vel, int rounds); + +/** This host have true UTC time. */ +EXTERN int dis_if_haveAbsoluteTime; + +/** + * Tells if networking is currently configured and ready to receive DIS packets. + * If packets do really arrive is another story, but there are other monitoring + * functions available to check that. + * @return True if ready to receive DIS packets. + */ +EXTERN int dis_if_readyToReceive(void); + +/** + * When initialized with site ID -1, this function tells if currently still + * trying to validate a randomly generated site ID for possible collisions with + * already used site IDs on the same exercise. While validating, no packet is + * sent and the user is not really visible from the other participants. + * @return True if still validating a randomly generated site ID. + */ +EXTERN int dis_if_isValidatingSiteId(void); + +/** + * Initialize the DIS library. Network communication can be configured in one of + * these modes: + * + * 1. Stand-alone mode: no networking. Client must call dis_if_enableNetwork(0) + * to enable this mode; the other parameters of this function are then ignored. + * + * 2. Broadcast mode: all the capable interfaces are configured in + * broadcasting mode and bind to the specified UDP port number for both sending + * and receiving. + * + * 3. Relay mode: packets are sent to the specified relay host and port number; + * the local computer gets an ephemeral UDP port number from the operating + * system. + * + * Each participant MUST have a distinct application and site IDs, and MUST + * share the same exercise ID. Received packets with different exercise ID are + * simply discarded. + * + * If the site ID is set to -1, a random value is chosen and a validation period + * of 15 seconds starts. During the validation period packets are received and + * decoded as usual, but not packet is sent; if a site ID collision is detected, + * another random value is chosen and the validation period restarts. + * Client program may poll the dis_if_isValidationSiteId() function to check + * if this module is currently sending packets or not. + * + * If the application ID is set to -1, the current process number is assigned. + * + * @param relay_host Name or network address of the relay server. If NULL or + * empty, uses packets broadcasting instead. + * @param relay_port UDP port of the relay server if in relay mode, or UDP port + * number shared for local network broadcasting ([0,65535]). + * @param exercise The exercise ID of the simulation application in [0,255]. + * Simulation applications participating in the same simulation MUST have + * the same exercise IDs. + * @param site Site number in [-1,65535]. + * @param application The DIS application id in [-1,65535]. + * @param entityEnterCb User callback for entity enter. + * @param detonationCb User callback for detonation. + * @param cannonFireCb Cannon fire callback. The m61a1 modules already provides + * a suitable function that can be passed here. + * @return Zero is returned on success, -1 on failure. + */ +EXTERN int dis_if_init(char *relay_host, int relay_port, + int exercise, int site, int application, + dis_if_EntityEnterCb entityEnterCb, + dis_if_DetonationCb detonationCb, + dis_if_CannonFireCb cannonFireCb); + +/** + * Close down the DIS library. + * @return Zero is returned on success. + */ +EXTERN int dis_if_close(void); + +/** + * Set the dead reckoning thresholds for location and orientation. + * The values shall be given in meters and radians (phi, theta, psi). + */ +EXTERN void dis_if_setDRThresholds(double location, double orientation); + +/** + * Set the current time in the DIS library. + */ +EXTERN void dis_if_setTime(double time); + +/** + * Set the current time in the DIS library using the system time, + * and mark the time as absolute, i.e. true UTC time. + * This will improve the dead reckoning performance on networks + * with significant delays between players _iff_ all hosts have + * true UTC time (with millisecond precision!). + * + * If this is used when players do _not_ have synchronized clocks, + * the result will be very strange positions for external players!! + * + * @return Zero is returned on success. + */ +EXTERN void dis_if_setTimeAbsolute(void); + +/** + * Process all available incoming PDU's from the network. + * User callbacks will be called for entering entities, + * exiting entities, firing entities and detonations. + * + * @return Zero is returned on success. + */ +EXTERN int dis_if_receive(void); + +/** + * Returns true if the entity ID is a valid handle, it is local and it is in + * the simulating state. + */ +EXTERN int dis_if_canSimulate ( int eid ); + +/** + * Enter a local entity. + * The initial location, velocity, linear acceleration, orientation + * and angular velocity will be set from the corresponding arguments. + * Velocity and acceleration shall be given in world coordinates. + * All parameter units are based on meters, radians and seconds. + * + * The world coordinate system used in DIS is GCC (geocentric Cartesian + * coordinates), an earth-centered right-handed Cartesian system with + * the positive X-axis passing through the Prime Meridian at the Equator, + * with the positive Y-axis passing through 90 degrees East longitude + * at the Equator and with the positive Z-axis passing through the + * North Pole. + * + * The body coordinate system used in DIS is centered at the center of + * the entity's bounding volume (excluding articulated parts) and have + * the positive x-axis pointing to the front of the entity, the positive + * y-axis pointing to the right side of the entity and the positive z-axis + * pointing out of the bottom of the entity. + * + * @param force + * @param c + * @param e1 Primary entity type. + * @param e2 Secondary entity type. + * @param location Geocentric Cartesian coordinates (m). + * @param velocity Velocity (m/s). + * @param linearAcceleration + * @param orientation Phi, theta and psi angles, in the order. + * @param angularVelocity Angular velocity is given as [angular velocity around + * body x-axis, ditto y, ditto z]. + * @param eid Here returns the handle to be used for further reference. + */ +EXTERN void dis_if_entityEnter(DISForce force, + craft * c, + dis_entity_type * e1, + dis_entity_type * e2, + double location[3], + double velocity[3], + double linearAcceleration[3], + double orientation[3], + double angularVelocity[3], + int *eid); + +/** + * Remove the entity with id eid from the simulation. If local entity, sends a + * "destroyed" DIS PDU if it is a local entity. + * @param eid Entity ID. + */ +EXTERN void dis_if_entityExit(int eid); + +/** + * Update the state information for a local entity. The information will be + * broadcasted on the network only if it is necessary to keep the other hosts + * dead reckoning from exceeding the thresholds. + * See dis_if_entityEnter for information about the arguments. + * @param eid Entity ID. + * @param location + * @param velocity + * @param linearAcceleration + * @param orientation Phi, theta and psi angles, in the order. + * @param angularVelocity + * @return True if a DIS packet of type Entity State and/or a DIS packet of + * type Emission has been sent. + */ +EXTERN int dis_if_setEntityState(int eid, double location[3], double velocity[3], + double linearAcceleration[3], + double orientation[3], double angularVelocity[3]); + +/** + * Return state information for a remote or local entity. For local entity, the + * last registered state informations are returned. For remote entity, the state + * information is dead reckoned from the last received data on the entity. + * @param eid Entity handle. + * @param location + * @param velocity + * @param orientation + * @return True if entity available and the its state set, false if the entity + * does not exist (anymore). + */ +EXTERN int dis_if_getEntityState(int eid, double location[3], double velocity[3], + double orientation[3]); + +/** + * Returns the entity given its DIS entity ID. + * @param id + * @return Entity or NULL if not found. + */ +EXTERN dis_if_Entity *dis_if_findEntityByDISID(dis_entity_id * id); + +/** + * Returns the entity with given its index. + * @param eid + * @return Entity or NULL if not found. + */ +EXTERN dis_if_Entity *dis_if_findEntityByID(int eid); + +/** + * Broadcast information about an entity firing a weapon. + * The type of fire is given by ftype as one of the dis_if_FIRE_XXX types. + * The id's of the firing entity and the target entity are given with + * firingEid and targetEid or as dis_if_ID_NONE if not known. + * The number of rounds, location of the source of fire, the velocity + * vector of the rounds and the range of the rounds are given with + * the corresponding arguments. + * The id of the event generated is returned in eventId. + * If the fire type is a missile, a missile entity is created and its + * id is returned in missileEid. The user program should generate + * position data for the missile during its lifetime by calling + * dis_if_setEntityState(). + * + * FIXME: dis_if_fire() not used. Not yet implemented. + * + * @return Zero is returned on success. + */ +EXTERN int dis_if_fire(int ftype, int firingEid, int targetEid, int rounds, + double location[3], + double velocity[3], + double range, + int *eventId, int *missileEid); + +/** + * Broadcast information about a detonation of a local entity. + * The type of fire is given by ftype as one of the dis_if_FIRE_XXX types. + * The id's of the firing entity and the target entity are given with + * firingEid and targetEid or as dis_if_ID_NONE if not known. + * The id of the corresponding fire event is given as eventId or as + * dis_if_ID_NONE if not known. + * If the detonation is from a missile, the id of the missile is given + * as missileEid or as dis_if_ID_NONE. The library will exit the + * missile entity. + * The location of the detonation in world coordinates and in target + * body coordinates are given as worldLocation and entityLocation. + * + * @param munition_type Munition DIS entity ID. + * @param firingEid Firing craft (this module's ID). + * @param targetEid Target craft (this module's ID). + * @param munitionEid Munition (this module's ID). + * @param worldLocation Location of the explosion. + * @param entityLocation Location of the detonation in the reference system of + * the target (m). Used for damage assessment of missiles and bombs. + * @param vel Velocity of the munition (world coord., m/s). Damages due to + * kinetic weapons (that is, cannon shells) depends on it. + * @return + * 0 = Network disabled or successfully sent PDU. + * -1 = Firing entity is not local. + * -2 = Target isn't available anymore in our table. + * -3 = Firing entity not available (player died in the meanwhile?) + */ +EXTERN int dis_if_detonation(dis_entity_type * munition_type, + int firingEid, + int targetEid, + int munitionEid, + double worldLocation[3], + double entityLocation[3], + double vel[3]); + +/** + * Networking is enabled by default. Disabling networking no attempt will be + * made to transmit or receive anything. All the rest will work as expected. + * If networking disabled before initializing this module, the DIS protocol + * is not initialized and an attempt to re-enable the network brings to abort. + */ +EXTERN void dis_if_enableNetwork(int enabled); + +EXTERN void dis_if_setEntityMarkings(int eid, char *markings); + +EXTERN void dis_if_getEntityMarkings(int eid, char *markings, int max); + +EXTERN void dis_if_setEntityAppearance(int eid, dis_entity_appearance x); + +EXTERN dis_entity_appearance dis_if_getEntityAppearance(int eid); + +/** + * Notify the world that our current radar target changed. + */ +EXTERN int dis_if_radarTargetChanged(craft * c); + +/** + * Set local entities current radar mode (modes are 0=off, 1=wide scan). + */ +EXTERN int dis_if_setRadarMode(craft * c, int mode, int update); + +/** + * Get the number of radar beams emitted from this aircraft. + * The dis_if_getRadarParameters() will return each specific beam. + */ +EXTERN int dis_if_getBeamCount(craft * c); + +/** + * Get parameters describing the specified radar beam. + * @param c Emitter. + * @param j Beam number, in the range from 0 up to dis_if_getBeamCount(c)-1. + * @param az_center Azimuth relative to the emitter (RAD). + * @param az_width Beam half width (RAD). + * @param el_center Elevation relative to the emitter (RAD). + * @param el_width Beam half height (RAD). + * @param erp Energy, dBm = 10.0 * log10 (e_watts / 0.001). + */ +EXTERN void dis_if_getRadarParameters(craft * c, + int j, + double *az_center, + double *az_width, + double *el_center, + double *el_width, + double *erp); + + +/** + * Set and estimate of the available network bandwidth + * in bits per second. This value is used to limit entity + * state transmissions in an effort to keep UDP traffic + * as close to real-time as possible. + */ +EXTERN void dis_if_setBandwidth(double bps); + +/** + * Process incoming PDUs for the specified number of milliseconds, thus + * priming the entity table. This is called only during program + * initialization, when a complete entity table is required. + */ +EXTERN int dis_if_snoop ( int millisec ); + +EXTERN int dis_if_requestControl (dis_if_Entity *e, + dis_if_RequestControlCallback callbackFn, + void *arg); + +typedef int (*dis_if_TransferControlRequestCallback)(dis_if_Entity *, dis_transfer_control_pdu *); + +EXTERN void dis_if_setTransferControlRequestCallback ( dis_if_TransferControlRequestCallback ); + + +#define dis_if_RESULT_REQUEST_OK 0 +#define dis_if_RESULT_UNABLE 1 + +/** + * This routine is responsible for handling entity transfer control requests + * at the simulation level. It determines if the control transfer is + * feasible, adjusts simulation level data structures as needed, and returns + * an indication to the caller (the DIS interface) whether the request + * should proceed, or not. + */ +EXTERN int dis_if_transferControlRequestHandler(dis_if_Entity *e, dis_transfer_control_pdu *pdu); + +EXTERN int dis_if_fireCannon(craft * c, VPoint * pos, VPoint * vel, int quantity, int rate); + +EXTERN disx_ApplicationInfo * dis_if_getApplicationInfo(void); + + +EXTERN varray_Type * dis_if_getEntityTable(void); + +/** + * Returns the number of local entities currently handled. + * @return + */ +EXTERN int dis_if_getNumberOfLocalEntities(void); + +/** + * Returns the number of remote entities currently handled. + * @return + */ +EXTERN int dis_if_getNumberOfRemoteEntities(void); + +/** + * Returns the current number of received DIS packets processed per second + * (estimated). + * @return + */ +EXTERN double dis_if_getProcessedPacketsPerSecond(void); + +/** + * Updates the state of the remote craft according to the most updated DIS data + * available. + * @param c Remote craft to update. + * @return NULL on success, or "not tracked anymore" if no data available. + */ +EXTERN char *dis_if_updateRemote(craft *c); + +/** + * Acquires the state of the local craft, possibly broadcasting a DIS state + * packet. + * @param c Local craft. + */ +EXTERN void dis_if_updateLocal(craft *c); + +/** + * Sends a broadcast text message all the users will see in their emulated + * terminal (F1). + * EXPERIMENTAL, does not work yet. + */ +EXTERN int dis_if_sendMessage(int senderEid, char *s); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/draw.c acm-6.0+20200416/src/acm/draw.c --- acm-5.0/src/acm/draw.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/draw.c 2017-10-28 08:18:53.000000000 +0000 @@ -0,0 +1,327 @@ +/* + * ACM - Draw utilities module + * Copyright (C) 2007 Umberto Salsi + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#include +#include +#include + +#include "../util/memory.h" + +#define draw_IMPORT +#include "draw.h" + +typedef struct draw_Type { + struct draw_Type *next; + + int segs_n; /* segs[0..segs_n-1] currently used */ + int segs_size; /* allocated segments, segs_size >= segs_n */ + Alib_Segment * segs; /* pointer to the allocated segments */ +} draw_data; + +static draw_data *free_list = NULL; + +#define SEGMENT2(a,b,c,d) \ + seg->x1 = (int) (a); \ + seg->y1 = (int) (b); \ + seg->x2 = (int) (c); \ + seg->y2 = (int) (d); \ + seg++; + + +static void draw_destruct(void *p) +{ + draw_data *dd = p; + if( dd == NULL ) + return; + memory_dispose(dd->segs); +} + + +void draw_free(draw_data *dd) +{ + if( dd == NULL ) + return; + + dd->next = free_list; + free_list = dd; +} + + +static void draw_cleanup() +{ + draw_data *dd; + + while( free_list != NULL ){ + dd = free_list; + free_list = dd->next; + memory_dispose(dd); + } +} + + +draw_data * draw_new() +{ + draw_data *dd; + + if( free_list == NULL ){ + memory_registerCleanup(draw_cleanup); + dd = memory_allocate(sizeof(draw_data), draw_destruct); + dd->segs_size = 0; + dd->segs = NULL; + } else { + dd = free_list; + free_list = dd->next; + } + + dd->next = NULL; + dd->segs_n = 0; + + return dd; +} + + +static void required_segs(draw_data *dd, int n) +/* + Expands dd so that at least n free segs be available. +*/ +{ + if( dd->segs_size - dd->segs_n >= n ) + return; + + dd->segs_size = 2*dd->segs_size + 100; + if( dd->segs_size - dd->segs_n < n ) + dd->segs_size = dd->segs_n + n; + dd->segs = memory_realloc(dd->segs, dd->segs_size * sizeof(Alib_Segment)); +} + + +void draw_segment(draw_data *dd, double x1, double y1, double x2, double y2) +{ + int i; + Alib_Segment *seg; + + required_segs(dd, 1); + i = dd->segs_n; + seg = &dd->segs[i]; + SEGMENT2(x1 + 0.5, y1 + 0.5, x2 + 0.5, y2 + 0.5); + dd->segs_n += 1; +} + + +void draw_rect(draw_data *dd, double x1, double y1, double x2, double y2) +{ + int i; + Alib_Segment *seg; + + required_segs(dd, 4); + i = dd->segs_n; + seg = &dd->segs[i]; + + /* Rounding: */ + x1 += 0.5; + y1 += 0.5; + x2 -= 0.5; + y2 -= 0.5; + + SEGMENT2(x1, y1, x2, y1); + SEGMENT2(x2, y1, x2, y2); + SEGMENT2(x2, y2, x1, y2); + SEGMENT2(x1, y2, x1, y1); + dd->segs_n += 4; +} + + +#define MAX_CIRCLE_ERR 0.7 + +void draw_circle(draw_data *dd, double xo, double yo, double r) +{ + int i, j, steps; + Alib_Segment *seg; + double da, x1, y1, x2, y2, co, si; + + /* Rounding: */ + /* FIXME: improper rounding, as it should be -0.5 rather thatn +0.5 */ + xo += 0.5; + yo += 0.5; + r += 0.5; + + if( r < 1.0 ) + return; + + /* Angle step for max MAX_CIRCLE_ERR error: */ + da = 2.0 * acos((r-MAX_CIRCLE_ERR)/r); + + steps = (int) ceil(2.0 * M_PI / da); + if( steps < 4 ) + steps = 4; + steps = (steps + 3) * 4 / 4; + da = 2.0 * M_PI / steps; + + co = cos(da); + si = sin(da); + + x1 = 0.70710678 * r; + y1 = 0.70710678 * r; + + required_segs(dd, steps); + i = dd->segs_n; + seg = &dd->segs[i]; + + for( j = steps; j > 0; j-- ){ + x2 = co * x1 - si * y1; + y2 = co * y1 + si * x1; + SEGMENT2(xo + x1, yo + y1, xo + x2, yo + y2); + x1 = x2; + y1 = y2; + } + + dd->segs_n += steps; +} + + +void draw_arc(draw_data *dd, double xo, double yo, double r, double a1, double a2) +{ + int i, j, steps; + double a, da, co, si, x1, y1, x2, y2; + Alib_Segment *seg; + + if( r < 1.0 ) + return; + + /*** + if( a1 < 0.0 ) + a1 = 2*M_PI + a1; + + if( a2 < 0.0 ) + a2 = 2*M_PI + a2; + + if( a1 > 2*M_PI ) + a1 = fmod(a1, 2*M_PI); + + if( a2 > 2*M_PI ) + a2 = fmod(a2, 2*M_PI); + ***/ + + if( a1 > a2 ){ + a = a1; a1 = a2; a2 = a; + } + + if( a1 == a2 ) + return; + + /* Rounding: */ + xo += 0.5; + yo += 0.5; + + /* Angle step for max MAX_CIRCLE_ERR error: */ + da = 2.0 * acos((r-MAX_CIRCLE_ERR)/r); + + steps = (int) ceil((a2-a1) / da); + if( steps < 1 ) + steps = 1; + da = (a2-a1) / steps; + + co = cos(da); + si = sin(da); + x1 = r*cos(a1); + y1 = r*sin(a1); + required_segs(dd, steps); + i = dd->segs_n; + seg = &dd->segs[i]; + + for( j = steps; j > 0; j-- ){ + x2 = co * x1 - si * y1; + y2 = co * y1 + si * x1; + SEGMENT2(xo + x1, yo + y1, xo + x2, yo + y2); + x1 = x2; + y1 = y2; + } + dd->segs_n += steps; +} + + +#define POINTER_APERTURE_COS 0.9397 /* cos(20 DEG) */ +#define POINTER_APERTURE_SIN 0.3420 /* sin(20 DEG) */ + +void draw_pointer(draw_data *dd, double xo, double yo, double a, double l) +{ + double co, si, co1, si1, co2, si2, p0x, p0y, p1x, p1y, p2x, p2y; + + co = cos(a); + si = sin(a); + + p0x = xo + l*co; + p0y = yo + l*si; + + co1 = co*POINTER_APERTURE_COS - si*POINTER_APERTURE_SIN; + si1 = co*POINTER_APERTURE_SIN + si*POINTER_APERTURE_COS; + p1x = xo + 0.2*l*co1; + p1y = yo + 0.2*l*si1; + + co2 = co*POINTER_APERTURE_COS + si*POINTER_APERTURE_SIN; + si2 = -co*POINTER_APERTURE_SIN + si*POINTER_APERTURE_COS; + p2x = xo + 0.2*l*co2; + p2y = yo + 0.2*l*si2; + + draw_segment(dd, p0x, p0y, p1x, p1y); + draw_segment(dd, p0x, p0y, p2x, p2y); + draw_segment(dd, p1x, p1y, p2x, p2y); +} + + +void draw_stroke(draw_data *dd, Viewport *v, Alib_Pixel color) +{ + if( dd->segs_n == 0 ) + return; + + VDrawSegments(v, dd->segs, dd->segs_n, color); +} + + +void draw_fill(draw_data *dd, Viewport *v, Alib_Pixel color) +{ + if( dd->segs_n == 0 ) + return; + + draw_stroke(dd, v, color); + + /* FIXME: + FillPolygonNoClipping(v->w, dd->segs, dd->segs_n, z); + */ +} + + +void draw_string_centered(Viewport *v, double xo, double yo, double fh, + char *s, Alib_Pixel color) +{ + int fw, l, width, height; + + fw = VFontWidthPixels(v, (int) (fh+0.5)); + + l = strlen(s); + width = l * fw; + height = (int)(fh + 0.5); + + VDrawStrokeString(v, + (int) (xo - 0.5*width + 0.5), + (int) (yo + 0.5*height + 0.5), + s, l, (int)(fh + 0.5), color); +} + + +/* End of the draw module. */ diff -Nru acm-5.0/src/acm/draw.h acm-6.0+20200416/src/acm/draw.h --- acm-5.0/src/acm/draw.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/draw.h 2017-10-28 08:19:01.000000000 +0000 @@ -0,0 +1,81 @@ +/* + * ACM - Drawing utilities + * Copyright (C) 2007 Umberto Salsi + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +/** + * This module implements some drawing procedures based on the Vlib + * module. The main difference is that floating point numbers are used + * instead of integer numbers, and the list of segments gets allocated + * dynamically. + * + * Every path, once generated, can be draw on the screen several times, in + * different positions and with some transformation. + */ + +#ifndef _DRAW_H +#define _DRAW_H + +#include "../V/Vlib.h" + +#ifdef draw_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +typedef struct draw_Type draw_Type; + +/** + * Returns a new, empty path. Can be released with draw_free() or disposed off + * with memory_dispose(). + * @return + */ +EXTERN draw_Type * draw_new(void); + +/** + * Releases a path which is not going to be used anymore. Released paths are + * saved in a spare list to be reused later. + * @param dd + */ +EXTERN void draw_free(draw_Type *dd); + +EXTERN void draw_segment(draw_Type *dd, double x1, double y1, double x2, double y2); + +EXTERN void draw_rect(draw_Type *dd, double x1, double y1, double x2, double y2); + +EXTERN void draw_circle(draw_Type *dd, double xo, double yo, double r); + +EXTERN void draw_arc(draw_Type *dd, double xo, double yo, double r, double a1, double a2); + +/** + * Creates a pointer of length l with pivot at (xo,yo) and rotated 'a' RAD. + * a=0 means the pointer is oriented toward right, and it rotates + * clockwise on the screen. + */ +EXTERN void draw_pointer(draw_Type *dd, double xo, double yo, double a, double l); + +/** Send draw data to the specified viewport using the specified color */ +EXTERN void draw_stroke(draw_Type *dd, Viewport *v, Alib_Pixel color); + +/** FIXME: it does not work yet */ +EXTERN void draw_fill(draw_Type *dd, Viewport *v, Alib_Pixel color); + +EXTERN void draw_string_centered(Viewport *v, double xo, double yo, double fh, + char *s, Alib_Pixel color); + +#undef EXTERN +#endif /* _DRAW_H */ diff -Nru acm-5.0/src/acm/drone.c acm-6.0+20200416/src/acm/drone.c --- acm-5.0/src/acm/drone.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/drone.c 2017-10-28 08:19:56.000000000 +0000 @@ -0,0 +1,867 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1996 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + + /* + * The original "Smart Drone" code was created by + * Jason Nyberg (nyberg@ctron.com). Enhancements added by Riley Rainey. + * + * 2007-07-23 Umberto Salsi + * - made a proper "module" + * - drone now has a data structure by its own (see (craft)->drone field) + * - the 'aggressiveness' now sets the % of the max vertical load + */ + +#include +#include + +#include "../util/error.h" +#include "../util/memory.h" +#include "../util/prng.h" +#include "../util/units.h" +#include "pm.h" +#include "alarm.h" +#include "aps.h" +#include "browse.h" +#include "dis_if.h" +#include "flaps.h" +#include "gear.h" +#include "inventory.h" +#include "players.h" +#include "prompt.h" +#include "radar.h" +#include "weapon.h" + +#define drone_IMPORT +#include "drone.h" +#include "aps.h" + +static drone_Mode mode = drone_DOG_FIGHT_MODE; +static double aggressiveness = 0.5; + +/* Drone status: */ +#define DM_ATTACK 0 /* normal drone attack mode */ +#define DM_RETURN 1 /* return to drone activation point + (interceptStartPoint) */ +#define DM_RETURN_CAPTURED 2 /* in return mode and moving towards return pt */ + +#define MIN_VEL 300 /* min speed (KIAS) */ +#define MED_VEL 350 /* medium speed (KIAS) */ +#define MAX_VEL 400 /* max speed (KIAS) */ + +#define MIN_ALTITUDE 15000 /* min altitude (ft) */ + +/** + * Drone state. + */ +typedef struct _drone_data { + /* + * If takes commands over existing player's aircraft, here saves the original + * update procedure before replacing with the drone specific algorithm; + * restores when user leaves the drone mode and gets back commands. + */ + char * (*update_original)(craft *c); + int curOpponent; /* who this drone is trying to kill; -1 = none */ + int curDroneMode; /* drone operating mode (DM_* constants ) */ + int holdCount; /* non-zero when drones holding fire */ + VPoint interceptStartPoint; /* geocentric coordinates location + where an end-game intercept was + initiated */ +} drone_Type; + + +void drone_set_mode(drone_Mode drone_mode) +{ + mode = drone_mode; +} + + +void drone_set_aggressiveness(double a) +{ + if( a < 0.05 ) + a = 0.05; + else if( a > 1.0 ) + a = 1.0; + aggressiveness = a; +} + + +static char *drone_update(craft *c); +static void drone_kill(craft *c, char *reason); + + +static craft * +create_new_drone_craft(craft * p, int force, char *model) +{ + int i; + craft *c; + VPoint s, tmp; + double v; + double disLocation[3]; + double disZeroVec[3]; + double disOrientation[3]; + + /* + Allocate new craft data structure: + */ + for (i = 0; i < manifest_MAXPLAYERS; ++i) { + if (ptbl[i].type == CT_FREE) { + break; + } + } + + if (i == manifest_MAXPLAYERS) + return NULL; + + c = &ptbl[i]; + + /* + Set craft state: + */ + c->pIndex = i; + c->type = CT_DRONE; + c->force = force; + c->createTime = curTime; + c->vl = NULL; + c->trihedral = p->trihedral; + c->Cg = p->Cg; + c->VT = p->VT; + c->Sg = p->Sg; + c->w = p->w; + c->terrain_altitude_timeout = curTime - 10.0; /* ensure will be updated */ + /* c->terrain_altitude = UNKNOWN; */ + c->XYZtoNED = p->XYZtoNED; + c->air = p->air; + c->mach = p->mach; + c->G = p->G; + c->linAcc = p->linAcc; + c->prevSg = p->prevSg; + c->p = p->p; + c->q = p->q; + c->r = p->r; + c->pitchComm = 0.0; + c->rollComm = 0.0; + c->steerComm = 0.0; + c->rudderComm = 0.0; + c->throttleComm = 32768; + c->throttle = 32768; + c->Se = p->Se; + c->Sa = p->Sa; + c->Sr = p->Sr; + c->SeTrim = 0.0; + c->SaTrim = 0.0; + c->curHeading = p->curHeading; + c->curPitch = p->curPitch; + c->curRoll = p->curRoll; + c->curThrust = 0.0; + c->curFlap = 0.0; + c->flapSetting = 0.0; + c->curSpeedBrake = 0.0; + c->speedBrakeSetting = 0.0; + c->throttle = 32768; + c->rpm = 1.0; + c->alpha = p->alpha; + c->beta = p->beta; + c->fuel = 0.0; + c->payload = 0.0; + c->flags = 0; + c->damageBits = 0; + c->structurePts = 0; + c->leakRate = 0.0; + c->damageCL = 0.0; + c->damageCM = 0.0; + c->radarMode = RM_ACM; + c->nextRadarTime = 0.0; + c->cinfo = inventory_craftTypeSearchByZoneAndName(NULL, model); + sprintf(c->name, "Drone%d", i); + c->curRadarTarget = -1; + c->targetDistance = 0.0; + c->targetClosure = 0.0; + /* skip fields: relPos, rval */ + pm_hud_strings_alloc(c); + /* skip fields: curWeapon, station */ + /* skip fields: rinfo, rtop */ + c->showMag = FALSE; + c->aps = NULL; + c->curThrust = (c->cinfo->thrust) (c); + gear_allocate(c); + gear_up(c); + + if( mode == drone_DOG_FIGHT_MODE ){ + + /* + Position the drone about 1500 meters ahead of the player's craft. + */ + + s.x = 1500.0 + 500.0 * prng_getDouble2(); + s.y = 200.0 * prng_getDouble2(); + s.z = 200.0 * prng_getDouble2(); + + c->curHeading = pm_normalize_yaw( p->curHeading + + units_DEGtoRAD(30.0) * prng_getDouble2() ); + c->curRoll = 0.0; + c->curPitch = units_DEGtoRAD(2.0); + + v = p->VT + 50.0 * prng_getDouble2(); + + VSetPoint(&c->Cg, v*cos(c->curHeading), v*sin(c->curHeading), 0.0); + + } else { /* mode == DRONE_HUNTING_MODE */ + + /* + Position the drone up to 50 NM away, random altitude, + random direction, random heading. + */ + + s.x = 50000.0 * prng_getDouble2(); + s.y = 50000.0 * prng_getDouble2(); + s.z = 5000.0 - p->w.z + (11000.0 - 5000.0)/2.0 * prng_getDouble2(); + + c->curHeading = pm_normalize_yaw( 2*M_PI * prng_getDouble2() ); + c->curRoll = 0.0; + c->curPitch = units_DEGtoRAD(2.0); + + v = 350.0 + 50.0 * prng_getDouble2(); + + VSetPoint(&c->Cg, v*cos(c->curHeading), v*sin(c->curHeading), 0.0); + + } + + c->r = c->q = c->p = 0.0; + + VEulerToMatrix(c->curRoll, c->curPitch, c->curHeading, + &(c->trihedral)); + + VTransform_(&s, &(p->trihedral), &tmp); + + /* convert NED (meters) to Geocentric (meters) */ + + VReverseTransform_(&tmp, &(c->XYZtoNED), &c->Sg); + c->Sg.x += p->Sg.x; + c->Sg.y += p->Sg.y; + c->Sg.z += p->Sg.z; + c->prevSg = c->Sg; + + c->update = drone_update; + c->kill = drone_kill; + + earth_XYZToLatLonAlt(&c->Sg, &c->w); + earth_generateWorldToLocalMatrix(&c->w, &c->XYZtoNED); + +/* + * Rearm and fuel the aircraft. + */ + + (*c->cinfo->resupply) (c); + + weapon_selectByName(c, weapon_AIM9M); /* will set properly next */ + + disLocation[0] = c->Sg.x; + disLocation[1] = c->Sg.y; + disLocation[2] = c->Sg.z; + disZeroVec[0] = 0.0; + disZeroVec[1] = 0.0; + disZeroVec[2] = 0.0; + disOrientation[0] = c->curHeading; + disOrientation[1] = c->curPitch; + disOrientation[2] = c->curRoll; + dis_if_entityEnter(force, c, + &c->cinfo->entityType, + &c->cinfo->altEntityType, + disLocation, disZeroVec, + disZeroVec, disOrientation, + disZeroVec, &c->disId); + dis_if_setRadarMode(c, 1, 1); + return c; +} + + +void drone_take_commands(craft *c) +{ + drone_Type *dd; + + gear_up(c); + flaps_up(c); + flaps_up(c); + flaps_up(c); + flaps_up(c); + flaps_speed_brakes_retract(c); + flaps_speed_brakes_retract(c); + flaps_speed_brakes_retract(c); + flaps_speed_brakes_retract(c); + aps_off(c); + + c->type = CT_DRONE; + /* ignore = */ weapon_selectByName(c, weapon_AIM9M); + + dd = (drone_Type *) c->drone; + if( dd == NULL ) + dd = memory_allocate(sizeof(drone_Type), NULL); + + dd->curOpponent = -1; + dd->curDroneMode = DM_ATTACK; + dd->holdCount = 0; + /* dd->inceptStartPoint = ignored in DM_ATTACK mode; */ + + c->drone = dd; + dd->update_original = c->update; + c->update = drone_update; +} + + +void drone_new(craft * p) +{ + int force = p->force == DISForceOpposing? DISForceFriendly : DISForceOpposing; + char *model = force == DISForceFriendly? "F-16" : "MiG-29"; + craft *c = create_new_drone_craft(p, force, model); + if( c == NULL ){ + prompt_craft_print(p, "Memory exhausted -- can't create new drone"); + return; + } + + drone_take_commands(c); + + char s[100]; + sprintf(s, "%s drone generated for %s practice [%d]", c->name, + (mode == drone_DOG_FIGHT_MODE)? "dog fight" : "hunting", mode); + + prompt_craft_print(p, s); +} + + +void drone_release_commands(craft *c) +{ + drone_Type *dd = c->drone; + + if( dd == NULL ) + return; + + c->update = dd->update_original; + memory_dispose(c->drone); + c->drone = NULL; + c->type = CT_PLANE; +} + + +void drone_reset_opponent(craft *c) +{ + drone_Type *dd; + + if( c->drone == NULL ) + return; + + dd = (drone_Type *) c->drone; + dd->curOpponent = -1; + dd->holdCount = 0; +} + + +/* + * convert target plane coords from world to drone's + */ + +static void +myCoordSys(craft * c, craft * p, VPoint * pos, VPoint * vel) +{ + VPoint tpos; + + VTransform(&p->prevSg, &c->XYZtoNED, &tpos); + VReverseTransform_(&tpos, &c->trihedral, pos); + VTransform_(&p->Cg, &c->XYZtoNED, &tpos); + VReverseTransform_(&tpos, &c->trihedral, vel); +} + +static void +unholdFireAlarm(void *arg1, void *arg2) +{ + craft *c = (craft *) arg1; + drone_Type *dd; + + if( c->drone == NULL ) + return; + + dd = (drone_Type *) c->drone; + + if (dd->holdCount > 0) { + dd->holdCount--; + } +} + +/* + * Dumbly choose the closest hostile plane to be target + */ + +static int +pickTarget(craft * c) +{ + int i, target = -1; + craft *p; + double d, min; + VPoint pos, vel; + + min = 100000000.0; + for (i = 0, p = ptbl; i < manifest_MAXPLAYERS; ++i, ++p) { + + if ( p != c && p->force != c->force + && (p->type == CT_PLANE || + p->type == CT_DIS_PLANE || + p->type == CT_DRONE) + ) { + + myCoordSys(c, p, &pos, &vel); + + d = VMagnitude( &pos ); + + if (d < min) { + min = d; + target = p->pIndex; + } + } + } + + return target; +} + +/* + * droneFlyTo + * + * Generate sitck/rudder controls to move the plane to the specified + * geocentric point. + */ + +static void +droneFlyTo ( craft *c, VPoint *pos ) +{ + double phi, rho, w, f, pitch_rate, roll_rate; + craftType *p; + VPoint q; + + /***** Example: climb toward north + VPoint q; + q.x = 100.0; + q.y = 0.0; + q.z = -20.0; + + VReverseTransform(&q, &c->trihedral, pos); + *****/ + + /* + Avoid too low altitudes + */ + + if( c->w.z < units_FEETtoMETERS(MIN_ALTITUDE) ){ + VTransform(pos, &c->trihedral, &q); + if( q.z >= 0.0 ){ + q.z = -0.5*sqrt(q.x*q.x + q.y*q.y); + } + VReverseTransform(&q, &c->trihedral, pos); + } + + /* d = sqrt(pos->x * pos->x + pos->y * pos->y + pos->z * pos->z); */ + + /* + * Compute total lift force 'f': + */ + + p = c->cinfo; + w = p->emptyWeight + c->fuel + c->payload; + f = c->G.z * w; /* current vertical load (pounds) */ + phi = atan2 ( pos->y, -pos->z ); + + /* + * If the target is behind our 3/9-line, we are defensive. Pull maximum + * G's into the target (after rolling into him). + * + * If we are behind of the target, perform pure pursuit (until the code + * gets a bit smarter). + */ + + if (f < -aggressiveness * p->maxLoadZPositive) { + /* + * Close to the positive structural load limit. + */ + if ( c->q > 0.0 ) + pitch_rate = 0.95 * c->q; + else + pitch_rate = 0.0; + + } else if (f > aggressiveness * p->maxLoadZNegative) { + /* + * Close to the negative structural load limit. + */ + if ( c->q < 0.0 ) + pitch_rate = 0.95 * c->q; + else + pitch_rate = 0.0; + + } else if (pos->x < 0.0) { + /* + * Target behind me. + * Wait for lift vector to be close to where we want it before + * pulling G's. + */ + if ((fabs(phi) > units_DEGtoRAD(130.0)) + || fabs(phi) < units_DEGtoRAD(50.0)) { + pitch_rate = units_DEGtoRAD(20.0); + } else { + pitch_rate = 0.0; + } + + } else { + rho = atan2(-pos->z, pos->x) - units_DEGtoRAD(2.0); + if( rho > 0.0 ){ + pitch_rate = fmin(rho, units_DEGtoRAD(20.0)); + } else { + pitch_rate = 0.0; + } + } + + c->pitchComm -= deltaT * (pitch_rate - c->q); + if (c->pitchComm > 1.0) + c->pitchComm = 1.0; + else if (c->pitchComm < -1.0) + c->pitchComm = -1.0; + + /* + * Put the lift vector on the target. + * A lot of conventional 1V1 air combat involves keeping your lift + * vector on the target aircraft. Phi is the computed angle between our + * target and the lift vector (simplified to be just the negative Z-axis). + */ + + roll_rate = 0.5 * phi; + if ( roll_rate > units_DEGtoRAD(30.0) ) + roll_rate = units_DEGtoRAD(30.0); + else if ( roll_rate < -units_DEGtoRAD(30.0) ) + roll_rate = -units_DEGtoRAD(30.0); + + c->rollComm -= deltaT * (roll_rate - c->p); + if (c->rollComm > 1.0) + c->rollComm = 1.0; + else if (c->rollComm < -1.0) + c->rollComm = -1.0; + + /* + * Don't use the rudder, for now. + */ + + c->rudderComm = 0.0; + + /* + * Adjust engine power + */ + + if( c->IAS < units_KTtoFPS(MIN_VEL) ){ + c->throttleComm = 32768; /* max power + AB */ + pm_after_burner_on(c); + } else if( c->IAS < units_KTtoFPS(MED_VEL) ){ + c->throttleComm = 32768; /* max power */ + pm_after_burner_off(c); + } else if( c->IAS < units_KTtoFPS(MAX_VEL) ){ + c->throttleComm = 32768/2; /* medium power */ + pm_after_burner_off(c); + } else { + c->throttleComm = 32768/4; /* idle */ + pm_after_burner_off(c); + } + +} + +/* + * Drone flight management in Attack Mode (this is most common) + */ + +static int +droneCalculationsAttackMode ( craft * c ) +{ + drone_Type *dd; + double htime; + VPoint pos, vel; + _BOOL doFire; + + dd = (drone_Type *) c->drone; + + /* + * Our opponent has exited? Return to engagement initiation point. + */ + + if ( (c->flags & FL_END_GAME_DRONE ) ) { + if ( dd->curOpponent != -1 && + ptbl[dd->curOpponent].type == CT_FREE ) { + dd->curDroneMode = DM_RETURN; + } + } + + /* + * No opponent, or opponent isn't there anymore + */ + + else if (dd->curOpponent == -1 || + ptbl[dd->curOpponent].type == CT_FREE) { + dd->curOpponent = pickTarget(c); + dd->holdCount = 0; + } + + if (dd->curOpponent != -1) { + + myCoordSys(c, &(ptbl[dd->curOpponent]), &pos, &vel); + + droneFlyTo ( c, &pos ); + + /* + * Fire at the target, if appropriate. + * Tryes first with AIM-120, then AIM-9M. + * + * We'll have to figure out a way to do lead pursuit in order to + * fire the cannon; we do pure pursuit now, which is the + * (somewhat) right thing to fire a missile. + */ + + if (dd->holdCount == 0 ) { + + /* + Select weapon. Try AIM-120 first, then AIM-9M. + */ + + if( weapon_getReadyStation(c, weapon_AIM120) >= 0 + && weapon_selectByName(c, weapon_AIM120) ) + doFire = TRUE; /* Uses AIM-120 */ + + else if( weapon_getReadyStation(c, weapon_AIM9M) >= 0 + && weapon_selectByName(c, weapon_AIM9M) ) + doFire = TRUE; /* Uses AIM-9M */ + + else + doFire = FALSE; /* No suitable weapon available. */ + + if( doFire && weapon_displaySelected(c, (viewer *) NULL, 0, 0) == 1) { + weapon_fire(c); + htime = 10.0 + 10.0 * prng_getDouble2(); + alarm_add(htime, unholdFireAlarm, c, NULL); + dd->holdCount++; + } + } + + + } + + return 0; +} + +/* + * Drone flight management in Return Modes + */ + +static int +droneCalculationsReturnMode ( craft * c ) +{ + drone_Type *dd; + VPoint tpos, pos, vel; + double dist_meters, closure_meters_per_sec; + int result = 0; + + dd = (drone_Type *) c->drone; + + /* + * Generate body relative position of return point + */ + + VTransform(&dd->interceptStartPoint, &c->XYZtoNED, &tpos); + VReverseTransform_(&tpos, &c->trihedral, &pos); + + /* + * Convert NED velocity to body-relative velocity + */ + + VReverseTransform_(&c->Cg, &c->trihedral, &vel); + + dist_meters = VMagnitude( &pos ); + + closure_meters_per_sec = + ( vel.x * pos.x + vel.y * pos.y + vel.z * pos.z ) / dist_meters; + + droneFlyTo ( c, &pos ); + + /* + * If we are in return mode and turned within 30 degrees towards + * the return point, enter the "return-captured" mode. + */ + + if ( dd->curDroneMode == DM_RETURN ) { + + if ( closure_meters_per_sec > 0.866 * units_FEETtoMETERS(c->VT) ) { + dd->curDroneMode = DM_RETURN_CAPTURED; + } + } + + /* + * If we are in return-capture mode and start to move away from the + * intercept point, then we're done; destroy the aircraft. + */ + + else { + if ( closure_meters_per_sec < 0.0 ) { + result = 1; + } + } + + return result; +} + + +/** + * Update flight and combat management of the drone. + * @return FALSE stands for mission in progress, TRUE for drone self-destroy + * request on mission concluded. + */ +static _BOOL +drone_calculations( craft * c ) +{ + drone_Type *dd; + + dd = (drone_Type *) c->drone; + + switch (dd->curDroneMode) { + + case DM_ATTACK: + return droneCalculationsAttackMode ( c ); + + case DM_RETURN: + return droneCalculationsReturnMode ( c ); + + case DM_RETURN_CAPTURED: + return droneCalculationsReturnMode ( c ); + + default: + error_internal("dd->curDroneMode=%d", dd->curDroneMode); + } +} + + +static char *drone_update(craft *c) +{ + if( drone_calculations(c) ) + return "mission completed, self destroy"; + + char *killReason = pm_flightCalculations(c); + if (killReason != NULL) + return killReason; + + weapon_update(c); + flaps_update(c); + radar_droneUpdate(c); + dis_if_updateLocal(c); + return NULL; +} + + +static void drone_kill(craft *c, char *reason) +{ + players_kill(c, reason); +} + + +void +drone_endGameDistanceCheck(void * p1, void *p2) +{ + double range_meters; + VPoint del; + craft *p; + craft *c = (craft * ) p1; + viewer *u = (viewer *) p2; + int i; + int done = 0; + double threshold_meters; + + if ( c->type == CT_DIS_PLANE && (c->flags & FL_END_GAME_DRONE) ) { + + /* + * Determine the appropriate range threshold; if one was specified + * on the command line, use that. Otherwise use the lock range from + * the aircraft definition. + */ + + if ( end_game_threshold_meters <= 0.0 ) { + threshold_meters = units_FEETtoMETERS( c->cinfo->radarTRange * units_NmToFeetFactor ); + } + else { + threshold_meters = end_game_threshold_meters; + } + + for ((i = 0, p = ptbl); (i < manifest_MAXPLAYERS) && ( ! done ); (++i, ++p)) { + + /* + * Skip this entry if: + * + * 1) It's the entry for our own aircraft. + * 2) The craft isn't a hostile. + */ + + if (p->pIndex == c->pIndex || c->force == p->force ) { + continue; + } + + if ( p->type == CT_PLANE || + p->type == CT_DIS_PLANE || + p->type == CT_DRONE) { + + VSub(&p->Sg, &c->Sg, &del); + + range_meters = VMagnitude( &del ); + + /* + * If the distance is within our threshold, then + * initiate a control request. + */ + + if ( range_meters <= threshold_meters ) { + + /* + * Record start point of engagement; we will return + * to this point after a kill. + */ + if( c->drone != NULL ) + ((drone_Type *)(c->drone))->interceptStartPoint = c->Sg; + + dis_if_requestControl ( dis_if_findEntityByID(c->disId), + browse_controlRequestCallback, u ); + + done = 1; + } + + } + } + } + + /* + * This craft is no longer a DIS plane. No need to continue proximity + * testing. + */ + + else { + done = 1; + } + + /* + * If nothing was within our threshold range, look again after one + * second has elapsed. + */ + + if ( ! done ) { + alarm_add(1.0, drone_endGameDistanceCheck, p1, p2); + } +} diff -Nru acm-5.0/src/acm/drone.h acm-6.0+20200416/src/acm/drone.h --- acm-5.0/src/acm/drone.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/drone.h 2017-10-28 08:15:22.000000000 +0000 @@ -0,0 +1,90 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1998 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + + /** + * The original "Smart Drone" code was created by + * Jason Nyberg (nyberg@ctron.com). Enhancements added by Riley Rainey. + * Further modifications by Umberto Salsi: limits speed to reasonable values; + * "G" within structural limits as set in the model definition; avoid to + * too low altitudes (but still the drone may crash on the ground :->); + * smoother maneuvering. + * + * @file + */ + +#ifndef _drone_h +#define _drone_h + +#include "pm.h" + +#ifdef drone_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +typedef enum {drone_DOG_FIGHT_MODE, drone_HUNTING_MODE} drone_Mode; + +/** + * Set how the drone is generated: 1500 ft behind you + * (DRONE_DOG_FIGHT_MODE) or randomly up to 50 NM far away in any + * direction from you (DRONE_HUNTING_MODE). + */ +EXTERN void drone_set_mode(drone_Mode drone_mode); + +/** + * Set drone aggressiveness as % of the max vertical load factor. + * For example, the value 0.7 means the drones will maneuver with a maximum + * vertical load not greater than the 70% of maxLoadZPositive/Negative + * (see the inventory file). The default is 0.5. + */ +EXTERN void drone_set_aggressiveness(double a); + +/** + * Creates e new drone opponent for practicing ACM. + */ +EXTERN void drone_new(craft * p); + +/** + * Attach the drone data structure to an existing craft. Do nothing + * if it is already a drone. Release with drone_release_commands(). + */ +EXTERN void drone_take_commands(craft *c); + +/** + * Remove drone data structure from craft. + */ +EXTERN void drone_release_commands(craft *c); + +/** + * Remove current opponent. + */ +EXTERN void drone_reset_opponent(craft *c); + +/** + * This alarm function is invoked periodically (once per second) to look + * for hostile aircraft in the proximity of this DIS entity -- the entity is + * owned by another application at this point, we may ask to take control + * of it, if a hostile aircraft comes within range. + * @param p1 Craft. + * @param p2 Viewer. + */ +EXTERN void drone_endGameDistanceCheck(void * p1, void *p2); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/effects.c acm-6.0+20200416/src/acm/effects.c --- acm-5.0/src/acm/effects.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/effects.c 2017-10-22 14:41:13.000000000 +0000 @@ -0,0 +1,329 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1997 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#include +#include +#include "../V/VObjects.h" +#include "pm.h" +#include "../util/memory.h" +#include "../util/prng.h" + +#define effects_IMPORT +#include "effects.h" + +typedef struct _explosion_data { + struct _explosion_data * next; /* linked list of released blocks */ + + double escale; /* overall size (m) */ + int duration; /* dust expiry time (units of deltaT) */ + int flameDuration; /* flame expiry time (units of deltaT) */ +} explosion_data; + +static explosion_data * explosion_data_free_list; + +/** + * If cleanup already invoked, then the program is terminating and is killing + * any remaining entity, so placing new explosions is useless and has no effect. + */ +static int no_more_explosions; + + +/* + * Better to fill-in all the data structures because several parts of the + * program relies on their availability and crashes otherwise. The alternative + * would be to put several if() here and there to check for NULL entries, but + * simply assigning something reasonable makes the program simpler, faster and + * easier to debug. + */ +static VObject explosion_obj = { + "Explosion", + (VPoint) {0.0, 0.0, 0.0}, + (VPoint) {0.0, 0.0, 0.0}, + (VPoint) {0.0, 0.0, 0.0}, + (VPoint) {0.0, 0.0, 0.0}, + 0.0, + 0, + NULL, + NULL +}; + +#define SPIKES 16 +#define FLAME_SPIKES 8 +#define SMOKE_INNER 0.2 +#define SMOKE_RADIUS 1.0 +#define SMOKE_MIN_RADIUS 0.5 +#define SMOKE_VARIATION (SMOKE_RADIUS - SMOKE_MIN_RADIUS) +#define FLAME_RADIUS 0.5 +#define FLAME_MIN_RADIUS 0.3 + +static VObject *explosionTemplate; + +static craftType *explosion_craft; + +static VColor_Type *effectBlackColor; + + +static void explosion_free(explosion_data * ed) +{ + ed->next = explosion_data_free_list; + explosion_data_free_list = ed; +} + + +static void effects_kill_explosion(craft * e, char *reason) +{ + explosion_free( (explosion_data *) e->effects ); + e->effects = NULL; + e->type = CT_FREE; +} + +/** + * Releases internal data structures. Also release data for any mtbl[] + * of type CT_EXPLOSION. + * + * WARNING. This also removes data that might be used by some craft of + * type CT_EXPLOSION, so all the crafts of this type should be already + * released. + */ +static void effects_cleanup() +{ + int i; + craft *c; + explosion_data * ed; + + for(i = 0; i < manifest_MAXPROJECTILES; i++ ){ + c = &mtbl[i]; + if( c->type == CT_EXPLOSION ){ + effects_kill_explosion(c, "program terminated"); + } + } + + if( explosionTemplate ){ + VDestroyObject(explosionTemplate); + explosionTemplate = NULL; + } + + if( explosion_craft != NULL ){ + memory_dispose(explosion_craft); + explosion_craft = NULL; + } + + while( explosion_data_free_list != NULL ){ + ed = explosion_data_free_list; + explosion_data_free_list = ed->next; + memory_dispose(ed); + } + + no_more_explosions = 1; +} + + +static char * +effects_explosion_calculations(craft * e) +{ + explosion_data * ed = (explosion_data *) e->effects; + + --(ed->flameDuration); + if ((--ed->duration) <= 0) + return "flames and smoke vanished"; + else + return NULL; +} + + +static explosion_data * explosion_malloc() +{ + explosion_data * ed; + + if( explosion_data_free_list == NULL ){ + return memory_allocate( sizeof(explosion_data), NULL ); + } else { + ed = explosion_data_free_list; + explosion_data_free_list = ed->next; + return ed; + } +} + + +double copysign(double x, double y) +{ + return (y < 0.0) ? -fabs(x) : fabs(x); +} + +static VObject * +buildExplosion(void) +{ + + register int i, numSpikes, numFlame, numRed, poly; + register VObject *obj; + VColor_Type *redFlameColor, *orangeFlameColor, *color; + VPoint vp[3]; + double x, s; + + numSpikes = SPIKES; + numFlame = FLAME_SPIKES; + numRed = numFlame / 2; + + effectBlackColor = VColor_getByName("black", 0); + redFlameColor = VColor_getByName("red", 0); + orangeFlameColor = VColor_getByName("orange", 0); + + obj = (VObject *) memory_allocate(sizeof(VObject), NULL); + obj->name = memory_strdup("explosion"); + obj->numPolys = numSpikes + numFlame; + obj->polygon = (VPolygon **) memory_allocate(obj->numPolys * sizeof(VPolygon *), NULL); + obj->order = (unsigned short *) NULL; + + poly = 0; + + for (i = 0; i < numSpikes; ++i) { + x = prng_getDouble2(); + s = copysign(1.0, x); + x = fabs(x); + vp[0].x = (SMOKE_MIN_RADIUS + x * SMOKE_VARIATION) * s; + x = prng_getDouble2(); + s = copysign(1.0, x); + x = fabs(x); + vp[0].y = (SMOKE_MIN_RADIUS + x * SMOKE_VARIATION) * s; + x = prng_getDouble2(); + s = copysign(1.0, x); + x = fabs(x); + vp[0].z = (SMOKE_MIN_RADIUS + x * SMOKE_VARIATION) * s; + vp[1].x = prng_getDouble2() * SMOKE_INNER; + vp[1].y = prng_getDouble2() * SMOKE_INNER; + vp[1].z = prng_getDouble2() * SMOKE_INNER; + vp[2].x = prng_getDouble2() * SMOKE_INNER; + vp[2].y = prng_getDouble2() * SMOKE_INNER; + vp[2].z = prng_getDouble2() * SMOKE_INNER; + obj->polygon[poly++] = VCreatePolygon(3, vp, effectBlackColor); + } + + for (i = 0; i < numFlame; ++i) { + x = prng_getDouble2(); + s = copysign(1.0, x); + x = fabs(x); + vp[0].x = (FLAME_MIN_RADIUS + x * FLAME_RADIUS) * s; + x = prng_getDouble2(); + s = copysign(1.0, x); + x = fabs(x); + vp[0].y = (FLAME_MIN_RADIUS + x * FLAME_RADIUS) * s; + x = prng_getDouble2(); + s = copysign(1.0, x); + x = fabs(x); + vp[0].z = (FLAME_MIN_RADIUS + x * FLAME_RADIUS) * s; + vp[1].x = prng_getDouble2() * SMOKE_INNER; + vp[1].y = prng_getDouble2() * SMOKE_INNER; + vp[1].z = prng_getDouble2() * SMOKE_INNER; + vp[2].x = prng_getDouble2() * SMOKE_INNER; + vp[2].y = prng_getDouble2() * SMOKE_INNER; + vp[2].z = prng_getDouble2() * SMOKE_INNER; + if (i < numRed) + color = redFlameColor; + else + color = orangeFlameColor; + obj->polygon[poly++] = VCreatePolygon(3, vp, color); + } + + return obj; + +} + + +static int +placeExplosion(Viewport * v, craft * obj, VMatrix * mtx, VPolySet *ps) +{ + explosion_data * ed; + int i, k, n; + VPolygon **e, *p; + VPoint tmp, *q; + + ed = (explosion_data *) obj->effects; + n = explosionTemplate->numPolys; + e = explosionTemplate->polygon; + + for (i = 0; i < n; ++i) { + if (ed->flameDuration > 0 || e[i]->color == effectBlackColor) { + p = VCopyPolygon(e[i]); + for ((k = 0, q = p->vertex); k < p->numVtces; (++k, ++q)) { + tmp.x = q->x * ed->escale + obj->Sg.x; + tmp.y = q->y * ed->escale + obj->Sg.y; + tmp.z = q->z * ed->escale + obj->Sg.z; + *q = tmp; + } + VTransformPolygon(p, &v->eyeSpace); + VPolySet_Add(ps, p); + } + } + + return 0; +} + + +static void effects_init() +{ + memory_registerCleanup(effects_cleanup); + explosionTemplate = buildExplosion(); + + explosion_craft = memory_allocate( sizeof(craft), NULL ); + memset(explosion_craft, 0, sizeof(craft)); + explosion_craft->object = &explosion_obj; + explosion_craft->objname = "Explosion"; + explosion_craft->placeProc = placeExplosion; + + explosion_data_free_list = NULL; +} + + +void +effects_new_explosion(VPoint * loc, VPoint *vel, double s_meters, double dur1, double dur2) +{ + + int i; + craft *e; + explosion_data * ed; + + if( no_more_explosions ){ + return; + } + + if( explosionTemplate == NULL ) + effects_init(); + + for (i = 0; i < manifest_MAXPROJECTILES; ++i) { + if (mtbl[i].type == CT_FREE) { + + ed = explosion_malloc(); + ed->escale = s_meters; + ed->duration = (int) (dur1 / deltaT + 0.5); + ed->flameDuration = (int) (dur2 / deltaT + 0.5); + + e = &mtbl[i]; + e->type = CT_EXPLOSION; + e->effects = ed; + memory_strcpy(e->name, sizeof(e->name), "Explosion"); + e->Sg = *loc; + earth_XYZToLatLonAlt(&e->Sg, &e->w); + e->Cg = *vel; + e->cinfo = explosion_craft; + e->curHeading = e->curRoll = e->curPitch = 0.0; + e->update = effects_explosion_calculations; + e->kill = effects_kill_explosion; + break; + } + } +} diff -Nru acm-5.0/src/acm/effects.h acm-6.0+20200416/src/acm/effects.h --- acm-5.0/src/acm/effects.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/effects.h 2017-10-30 02:45:08.000000000 +0000 @@ -0,0 +1,42 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1998 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#ifndef _effects_h +#define _effects_h + +#include "pm.h" + +#ifdef effects_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +/** + * Add a new "explosion craft" to the list of aircraft. + * @param loc Location of the explosion (geocentric, m). + * @param vel Initial velocity of the explosion (NED, ft/s). + * @param s_meters Overall radius of the explosion (m). + * @param dur1 Dust duration (s). + * @param dur2 Flame duration (s). + */ +EXTERN void effects_new_explosion(VPoint * loc, VPoint *vel, double s_meters, + double dur1, double dur2); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/events.c acm-6.0+20200416/src/acm/events.c --- acm-5.0/src/acm/events.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/events.c 2017-10-28 08:21:06.000000000 +0000 @@ -0,0 +1,867 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1998 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#include +#include +#include +#include +#include + +#include "../util/error.h" +#include "adf.h" +#include "aps.h" +#include "box.h" +#include "browse.h" +#include "commands.h" +#include "dis_if.h" +#include "drone.h" +#include "flaps.h" +#include "gear.h" +#include "hud.h" +#include "hsi.h" +#include "instruments.h" +#include "joystick.h" +#include "mouse.h" +#include "pm.h" +#include "prompt.h" +#include "radar.h" +#include "render.h" +#include "sounds.h" +#include "terminal.h" +#include "weapon.h" +#include "windows.h" + +#define events_IMPORT +#include "events.h" + +#define MAX_MAPPED_STRING_LEN 20 +#define MAX_POPUP_STRING_LEN 40 + +#define FLIGHT_STATE_FILE "./acm-flight-state" + +/* + To prevent unwanted quits from the program, it is requested to + press SHIFT-Q two times within 2 seconds. Anyway, the user can + still close the window. Here we store the last time the SHIFT-Q + was pressed: +*/ +static double pressed_XK_Q_time = -5.0; + + +static void +doButtonEvent(craft * c, viewer * u, gui_Event * ev) +{ + if ( ! u->hasFocus | ! u->hasComm ) return; + + if (ev->code == gui_EVENT_LBUTTONDOWN) { + weapon_fire(c); + } + else if (ev->code == gui_EVENT_MBUTTONDOWN) { + browse_selectCockpitItem( c, u, + ev->x, + ev->y, + time(NULL) ); + } + else if (ev->code == gui_EVENT_RBUTTONDOWN) { + weapon_selectNextAvailable(c); + } +} + + +static void +doButtonReleaseEvent(craft * c, viewer * u, gui_Event * ev) +{ + + if (ev->code == gui_EVENT_LBUTTONUP) + weapon_ceaseFire(c); +} + + +/* + Handle key press event. Returns TRUE if player gets killed or player + asked to terminate the program. +*/ +static _BOOL +doKeyEvent(craft * c, viewer * u, int key) +{ + + if ( ! u->hasFocus ) { + return FALSE; + } + + if ( ! u->hasComm ){ + if ( key == 'd' ) + u->hasComm = TRUE; + return FALSE; + } + + if ( terminal_enabled(u) && (key != gui_KEY_F(1)) ){ + terminal_input_char(u, key); + { + char line[100]; + if( terminal_read_string(u, line, 100) ) + commands_execute(u, line); + } + return FALSE; + } + + switch (key) { + + case gui_KEY_F(1): + terminal_toggle(u); + break; + + case 'd': + u->hasComm = FALSE; + break; + + case 'H': + windows_set_layout(c, u, gui_getWidth(u->gui), gui_getHeight(u->gui), !u->hud_mode); + break; + + case 'A': + aps_ap_toggle(c); + break; + + case 'E': + aps_rate_control_toggle(c); + break; + + case 'Z': + aps_ap_toggle(c); + if( aps_ap_enabled(c) ) + aps_ap_set_vs(c, 0.0); + break; + + case 'X': + aps_ac_toggle(c); + break; + + case 'T': + aps_at_toggle(c); + break; + + case 'N': + aps_an_toggle(c); + break; + + case 'L': + aps_al_toggle(c); + break; + + case '(': + aps_bank_max_dec(c); + break; + + case ')': + aps_bank_max_inc(c); + break; + + case 'M': + /* Toggle MH<->TH display */ + c->showMag = ! c->showMag; + break; + + case '<': + aps_an_disable(c); + aps_al_disable(c); + aps_aw_set(c, units_DEGtoRAD(-3.0)); + break; + + case '>': + aps_an_disable(c); + aps_al_disable(c); + aps_aw_set(c, units_DEGtoRAD(3.0)); + break; + + case ',': + aps_an_disable(c); + aps_al_disable(c); + aps_aw_set(c, units_DEGtoRAD(-1.5)); + break; + + case '.': + aps_an_disable(c); + aps_al_disable(c); + aps_aw_set(c, units_DEGtoRAD(1.5)); + break; + + case '|': + aps_an_disable(c); + aps_al_disable(c); + aps_aw_set(c, units_DEGtoRAD(0.0)); + break; + + case '/': + aps_an_disable(c); + aps_al_disable(c); + aps_aw_disable(c); + break; + + case '\\': + dis_if_sendMessage(c->disId, "sending message to all the participants through DIS"); + break; + + + case gui_KEY_UP: + c->pitchComm = c->pitchComm + 0.01; + if ( c->pitchComm > 1.0 ) c->pitchComm = 1.0; + break; + + case gui_KEY_DOWN: + c->pitchComm = c->pitchComm - 0.01; + if ( c->pitchComm < -1.0 ) c->pitchComm = -1.0; + break; + + case 'z': + c->rudderComm = c->rudderComm + 0.01; + if ( c->rudderComm > 1.0 ) c->rudderComm = 1.0; + break; + + case 'c': + c->rudderComm = c->rudderComm - 0.01; + if ( c->rudderComm < -1.0 ) c->rudderComm = -1.0; + break; + + case 'x': + c->rudderComm = 0.0; + break; + + case gui_KEY_HOME: + aps_off(c); + c->SeTrim = 0.0; + c->SaTrim = 0.0; + break; + + case 'j': + /* Adjust Elevator Trim */ + c->SeTrim -= c->pitchComm; + break; + + case 'y': + flaps_up(c); + break; + + case 'h': + flaps_down(c); + break; + + case 'w': + flaps_speed_brakes_retract(c); + break; + + case 's': + flaps_speed_brakes_extend(c); + break; + + case 't': + if( u->hud_mode ) + hud_timer_toggle(u); + else + instruments_timer_toggle(u); + break; + + case '1': + case gui_KEY_PGDW: + + aps_al_disable(c); + aps_an_disable(c); + aps_ap_disable(c); + aps_at_disable(c); + aps_aw_disable(c); + + c->throttleComm = 0.20 * 32768.0; + break; + + case '2': + case gui_KEY_PAD_MINUS: + if ( aps_at_enabled(c) ) { + aps_at_dec_velocity(c); + } + else { + c->throttleComm -= 512; + if ( c->throttleComm < 6553 ) + c->throttleComm = 6553; + } + break; + + case '3': + case gui_KEY_PAD_PLUS: + if ( aps_at_enabled(c) ) { + aps_at_inc_velocity(c); + } + else { + c->throttleComm += 512; + if ( c->throttleComm >= 32768 ) + c->throttleComm = 32768; + } + break; + + case '4': + case gui_KEY_PGUP: + + aps_al_disable(c); + aps_an_disable(c); + aps_at_disable(c); + aps_ap_disable(c); + aps_aw_disable(c); + + c->throttleComm = 32768; + break; + + case '!': + pm_thrust_reverse_toggle(c); + break; + + case 'a': + pm_after_burner_toggle(c); + break; + + case ' ': + /* Switch NAVn/RNAVn receivers: */ + aps_al_disable(c); + aps_an_disable(c); + hsi_switch_mode(u); + break; + + case '7': + aps_an_disable(c); + hsi_obs_inc(u, -1); + adf_hdg_inc(u, -1); + break; + + case '8': + aps_an_disable(c); + hsi_obs_inc(u, +1); + adf_hdg_inc(u, +1); + break; + + case '9': + aps_al_disable(c); + aps_an_disable(c); + hsi_frq_inc(u, -1); + adf_frq_inc(u, -1); + break; + + case '0': + aps_al_disable(c); + aps_an_disable(c); + hsi_frq_inc(u, +1); + adf_frq_inc(u, +1); + break; + + case gui_KEY_F(3): + hsi_theta_inc(u, -1); + break; + + case gui_KEY_F(4): + hsi_theta_inc(u, +1); + break; + + case gui_KEY_F(5): + hsi_rho_inc(u, -1); + break; + + case gui_KEY_F(6): + hsi_rho_inc(u, +1); + break; + + case 'b': + if( gear_brakesEngaged(c) ) + gear_brakesDisengage(c); + else + gear_brakesEngage(c); + break; + + case 'g': + gear_handle_toggle(c); + break; + + case 'l': + drone_new(c); + break; + + case gui_KEY_PAD_8: + render_setOutsideView(c, u, render_VIEW_FORWARD); + prompt_viewer_print(u, "Front view"); + break; + +/* look right */ + + case gui_KEY_PAD_6: + render_setOutsideView(c, u, render_VIEW_RIGHT); + prompt_viewer_print(u, "Right view"); + break; + +/* look left */ + + case gui_KEY_PAD_4: + render_setOutsideView(c, u, render_VIEW_LEFT); + prompt_viewer_print(u, "Left view"); + break; + +/* look back */ + + case gui_KEY_PAD_2: + render_setOutsideView(c, u, render_VIEW_AFT); + prompt_viewer_print(u, "Rear view"); + break; + +/* look up */ + + case gui_KEY_PAD_5: + render_setOutsideView(c, u, render_VIEW_UP); + prompt_viewer_print(u, "Up view"); + break; + + case gui_KEY_PAD_0: + render_setOutsideView(c, u, render_VIEW_DOWN); + prompt_viewer_print(u, "Down view"); + break; + + case 'n': + if( c->flags & FL_CHASE_VIEW ){ + render_setOutsideView(c, u, render_VIEW_FORWARD); + prompt_viewer_print(u, "Front view"); + + } else if( c->cinfo->object == NULL ){ + prompt_viewer_print(u, "Sorry, no object model available for this plane."); + + } else { + render_setOutsideView(c, u, render_VIEW_CHASE); + prompt_viewer_print(u, "Chase view"); + + } + break; + + case 'q': + c->curRadarTarget = radar_getNewTarget(c); + dis_if_radarTargetChanged(c); + break; + + case 'D': + /* Debug */ + FSPageToggle(); + break; + + case 'r': + aps_al_disable(c); + aps_an_disable(c); + + switch (c->radarMode) { + + case RM_OFF: + case RM_STANDBY: + if( u->c->cinfo->radarOutput > 0.0 ){ + /* we really have a radar -- enable it */ + radar_setMode(c, RM_NORMAL); + } else { + /* no radar -- HSI mode */ + radar_setMode(c, RM_HSI); + hsi_enable(u); + } + break; + + case RM_NORMAL: + case RM_ACM: + case RM_STT: + radar_setMode(c, RM_HSI); + hsi_enable(u); + break; + + case RM_HSI: + hsi_disable(u); + radar_setMode(c, RM_ADF); + adf_enable(u); + break; + + case RM_ADF: + adf_disable(u); + radar_setMode(c, RM_OFF); + break; + + default: + adf_disable(u); + radar_setMode(c, RM_OFF); + hsi_enable(u); + break; + } + + break; + +/* this is a hack to allow change of beam parameter index +in the outgoing electromagnetic emission pdu's + */ + case 'R': + /* Cycle through radar modes: */ + hsi_disable(u); + adf_disable(u); + aps_al_disable(c); + aps_an_disable(c); + switch (c->radarMode) { + case RM_OFF: + case RM_HSI: + case RM_ADF: + case RM_STANDBY: + radar_setMode(c, RM_NORMAL); + break; + case RM_NORMAL: + radar_setMode(c, RM_ACM); + break; + case RM_ACM: + radar_setMode(c, RM_STT); + break; + case RM_STT: + radar_setMode(c, RM_STANDBY); + break; + default: + error_internal("c->radarMode=%d", c->radarMode); + } + break; + +#ifdef FIXME_INCOMPLETE_OR_BUGGED + + case XK_i: + fp = fopen(FLIGHT_STATE_FILE, "w"); + if ( fp == NULL ) { + char s[1000]; + + sprintf("Error opening the file " FLIGHT_STATE_FILE + " for writing: %s", strerror(errno)); + prompt_craft_print(c, s); + } + else { + fwrite((char *) &ptbl[c->pIndex], + sizeof(craft), 1, fp); + fclose(fp); + prompt_craft_print(c, "Flight state saved in file " + FLIGHT_STATE_FILE); + } + break; + + case XK_I: + fp = fopen(FLIGHT_STATE_FILE, "r"); + if ( fp == NULL ) { + char s[1000]; + + sprintf("Error opening the file " FLIGHT_STATE_FILE + " for reading: %s", strerror(errno)); + prompt_craft_print(c, s); + } + else { + fread((char *) &pentry, sizeof(craft), 1, fp); + fclose(fp); + + c->flags = pentry.flags; + c->Sg = pentry.Sg; + c->prevSg = pentry.prevSg; + c->Cg = pentry.Cg; + c->trihedral = pentry.trihedral; + c->curHeading = pentry.curHeading; + c->curPitch = pentry.curPitch; + c->curRoll = pentry.curRoll; + c->p = pentry.p; + c->q = pentry.q; + c->r = pentry.r; + c->damageBits = pentry.damageBits; + c->structurePts = pentry.structurePts; + c->damageCL = pentry.damageCL; + c->damageCM = pentry.damageCM; + c->curThrust = pentry.curThrust; + c->throttle = pentry.throttle; + + /* FIXME: there are missing fields */ + + prompt_craft_print(c, "Flight state restored from file " + FLIGHT_STATE_FILE); + } + break; + + case XK_semicolon: + debug ^= 1; + break; +#endif /* FIXME_INCOMPLETE_OR_BUGGED */ + + case 27: + prompt_viewer_print(u, "To exit the program, press SHIFT-Q two times"); + break; + + case 'Q': + if ( pressed_XK_Q_time + 2.0 >= curTime ){ + c->kill(c, NULL); + return TRUE; + } + else { + pressed_XK_Q_time = curTime; + prompt_viewer_print(u, "Press SHIFT-Q again within 2 sec. to exit the program"); + } + break; + +#ifndef WINNT + case 'P': + system("xwd -name " manifest_ACM " -out /tmp/acm-dump-`date +%s`"); + prompt_viewer_print(u, "Screen dumped in file /tmp/acm-dump-*"); + break; +#endif + +#ifdef FIXME_INCOMPLETE_OR_BUGGED + + case XK_braceleft: + box_startRecording(); + prompt_viewer_print(u, "Black box recording started"); + break; + + case XK_braceright: + box_endRecording(); + prompt_viewer_print(u, "Black box recording stopped"); + break; + + case XK_bracketleft: + box_startPlayback(); + prompt_viewer_print(u, "Black box playback started"); + break; + +#endif + + case 'K': + joystick_calibrate(); + break; + + case gui_KEY_F(7): + instruments_altimeter_correction(u, -1); + break; + + case gui_KEY_F(8): + instruments_altimeter_correction(u, +1); + break; + + case gui_KEY_F(9): + instruments_attitude_reset(u); + break; + + case gui_KEY_F(11): + instruments_attitude_adjust_pitch(u, -units_DEGtoRAD(0.5)); + break; + + case gui_KEY_F(12): + instruments_attitude_adjust_pitch(u, units_DEGtoRAD(0.5)); + break; + + case '+': + windows_zoom_in(u); + break; + + case '-': + windows_zoom_out(u); + break; + + case '$': + if( c->type == CT_PLANE ) + drone_take_commands(c); + else + drone_release_commands(c); + break; + + case 'M' - 64: /* ctrl-m */ + sounds_enable(c, ! sounds_isEnabled(c)); + if( sounds_isEnabled(c) ) + prompt_viewer_print(u, "Sounds enabled."); + else + prompt_viewer_print(u, "Sounds muted."); + break; + + default: + prompt_viewer_print(u, "Invalid key."); + break; + + } + + return FALSE; +} + + +/** + * Process all events from this viewer. + * + * Return TRUE on: + * + * - close request of the window: in this case the viewer u gets closed + * and released + * + * - player gets killed or terminated: in this case the viewer u and all + * the other viewers attached to the craft c gets closed and the craft c + * gets released + */ +static _BOOL +doWindowEvent(viewer * u) +{ + gui_Event ev; + craft *c; + + c = u->c; + + while( gui_getEvent(u->gui, &ev) ) { + + switch (ev.code) { + + case gui_EVENT_KEYDOWN: +/* + if (u->viewer_state == ViewerStateBrowsing || + u->viewer_state == ViewerStatePiggyback) { + if (browse_keyEvent( c, u, &ev, 1)) { + return FALSE; + } + } + else { +*/ + if( doKeyEvent(c, u, ev.key) ){ + return TRUE; + } +/* + } +*/ + break; + + case gui_EVENT_LBUTTONDOWN: + case gui_EVENT_MBUTTONDOWN: + case gui_EVENT_RBUTTONDOWN: + doButtonEvent(c, u, &ev); + break; + + case gui_EVENT_LBUTTONUP: + case gui_EVENT_MBUTTONUP: + case gui_EVENT_RBUTTONUP: + doButtonReleaseEvent(c, u, &ev); + break; + + case gui_EVENT_WINDOW_SIZE_CHANGE: + windows_set_layout(c, u, ev.x, ev.y, u->hud_mode); + break; + + case gui_EVENT_WINDOW_FOCUS_IN: + u->hasFocus = TRUE; + break; + + case gui_EVENT_WINDOW_FOCUS_OUT: + u->hasFocus = FALSE; + u->hasComm = FALSE; + break; + + case gui_EVENT_WINDOW_EXPOSE: + Alib_invalidate(u->w); + break; + + case gui_EVENT_WINDOW_CLOSE: + c->kill(c, NULL); + return TRUE; + + default: + break; + } + } + + return FALSE; /* done with all pending events for this viewer */ + +} + + +/* + Process events for each viewer +*/ +void +events_window_keyb_buttons(void) +{ + viewer *u; + + u = vl_head; + + while( u != NULL ){ + + mouse_getPosition(u->c, u); + + if( doWindowEvent(u) ){ + + /* + Viewer or craft terminated. We can't + continue scanning the linked list of + viewers because we don't know how many + viewers were attached to this craft, so + we have to restart from the first + viewer: + */ + + u = vl_head; + + } else { + + u = u->vl_next; + } + } +} + + +static int last_switches = 0; + + +int +events_joystick(craft * c, viewer * u, double throttle, int switches) +{ + + int switch_xor = switches ^ last_switches; + +/* + * Change in state of any buttons ? + */ + + if (switch_xor != 0) { + + if (switch_xor & 1) { + +/* + * Button 1 press + */ + if (switches & 1) { + weapon_fire(c); + } + +/* + * Button 1 release + */ + + else { + weapon_ceaseFire(c); + } + } + +/* + * Button 2 press + */ + + if (switch_xor & 2) { + if (switches & 2) { + weapon_selectNextAvailable(c); + } + } + + } + + last_switches = switches; + + return 0; +} + diff -Nru acm-5.0/src/acm/events.h acm-6.0+20200416/src/acm/events.h --- acm-5.0/src/acm/events.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/events.h 2017-03-20 06:04:01.000000000 +0000 @@ -0,0 +1,39 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1998 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#ifndef _events_h +#define _events_h + +#include "pm.h" + +#ifdef events_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +/** + * Scan all the viewers for X Window pending events concerning windows events, + * key events and button events. Then call proper handling function. + */ +EXTERN void events_window_keyb_buttons(void); + +EXTERN int events_joystick(craft * c, viewer * u, double throttle, int switches); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/flaps.c acm-6.0+20200416/src/acm/flaps.c --- acm-5.0/src/acm/flaps.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/flaps.c 2017-03-20 06:04:01.000000000 +0000 @@ -0,0 +1,110 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1997 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#include "pm.h" +#include "damage.h" + +#define flaps_IMPORT +#include "flaps.h" + +int +flaps_down(craft * c) +{ + + c->flapSetting += 10.0 * M_PI / 180.0; + if (c->flapSetting > c->cinfo->maxFlap) + c->flapSetting = c->cinfo->maxFlap; + return 0; +} + +int +flaps_up(craft * c) +{ + + c->flapSetting -= 10.0 * M_PI / 180.0; + if (c->flapSetting < 0.0) + c->flapSetting = 0.0; + return 0; +} + +void +flaps_update(craft * c) +{ + + if (damage_isFunctioning(c, SYS_FLAPS)) { + + if (c->flapSetting > c->curFlap) { + c->curFlap += c->cinfo->flapRate * deltaT; + if (c->curFlap > c->flapSetting) + c->curFlap = c->flapSetting; + } + else if (c->flapSetting < c->curFlap) { + c->curFlap -= c->cinfo->flapRate * deltaT; + if (c->curFlap < c->flapSetting) + c->curFlap = c->flapSetting; + } + } + + if (damage_isFunctioning(c, SYS_SPEEDBRAKE)) { + + if (c->speedBrakeSetting > c->curSpeedBrake) { + c->curSpeedBrake += c->cinfo->speedBrakeRate * deltaT; + if (c->curSpeedBrake > c->speedBrakeSetting) + c->curSpeedBrake = c->speedBrakeSetting; + } + else if (c->speedBrakeSetting < c->curSpeedBrake) { + c->curSpeedBrake -= c->cinfo->speedBrakeRate * deltaT; + if (c->curSpeedBrake < c->speedBrakeSetting) + c->curSpeedBrake = c->speedBrakeSetting; + } + } + +/* + * Set some status flags + */ + + if (c->fuel < (c->cinfo->maxFuel * 0.15)) + c->damageBits |= FLAG_LOWFUEL; + else + c->damageBits &= ~FLAG_LOWFUEL; + + if (c->speedBrakeSetting > 0.0) + c->damageBits |= FLAG_SPEEDBRAKE; + else + c->damageBits &= ~FLAG_SPEEDBRAKE; +} + +int +flaps_speed_brakes_extend(craft * c) +{ + + c->speedBrakeSetting += c->cinfo->speedBrakeIncr; + if (c->speedBrakeSetting > c->cinfo->maxSpeedBrake) + c->speedBrakeSetting = c->cinfo->maxSpeedBrake; + return 0; +} + +int +flaps_speed_brakes_retract(craft * c) +{ + + c->speedBrakeSetting -= c->cinfo->speedBrakeIncr; + if (c->speedBrakeSetting < 0.0) + c->speedBrakeSetting = 0.0; + return 0; +} diff -Nru acm-5.0/src/acm/flaps.h acm-6.0+20200416/src/acm/flaps.h --- acm-5.0/src/acm/flaps.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/flaps.h 2017-03-20 06:04:01.000000000 +0000 @@ -0,0 +1,37 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1998 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#ifndef _flaps_h +#define _flaps_h + +#include "pm.h" + +#ifdef flaps_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +EXTERN void flaps_update(craft * c); +EXTERN int flaps_down(craft * c); +EXTERN int flaps_up(craft * c); +EXTERN int flaps_speed_brakes_extend(craft * c); +EXTERN int flaps_speed_brakes_retract(craft * c); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/gear.c acm-6.0+20200416/src/acm/gear.c --- acm-5.0/src/acm/gear.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/gear.c 2017-10-28 08:23:17.000000000 +0000 @@ -0,0 +1,1278 @@ +/* + * ACM - Landing gear module + * Copyright (C) 2008 Umberto Salsi + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#include +#include +#include + +#include "../util/error.h" +#include "../util/memory.h" +#include "../util/units.h" +#include "sounds.h" +#include "damage.h" +#include "pm.h" +#include "prompt.h" +#include "terrain.h" + +#define gear_IMPORT +#include "gear.h" + +#define GEARDOWN (M_PI / 2.0) +#define MU_SKID 0.85 + + +typedef struct gear_Type { + /** If gear is in locked down position and can sustain the weight. */ + _BOOL isHandleDown; + /** Nose, left, right gear extension angle (RAD). */ + double noseAngle; + double leftAngle; + double rightAngle; + /** If nose, left, right are in contact with ground. */ + _BOOL noseGroundContact; + _BOOL leftGroundContact; + _BOOL rightGroundContact; + /** Current nose wheel steering angle (RAD). */ + double noseSteeringAngle; + /** If brakes engaged. */ + _BOOL isBraking; + /** Braking smoothing factor in [0,1]. */ + double brakingFactor; +} gear_Type; + + +static gear_Type * get(craft * c) +{ + gear_Type * g; + g = (gear_Type *) c->gear; + if( g == NULL ) + error_internal("missing gear data structure for %s", c->name); + return g; +} + + +void gear_free(craft * c) +{ + memory_dispose(c->gear); + c->gear = NULL; +} + + +void gear_allocate(craft * c) +{ + gear_Type * g = memory_allocate( sizeof(gear_Type), NULL ); + g->isHandleDown = FALSE; + g->noseAngle = 0.0; + g->leftAngle = 0.0; + g->rightAngle = 0.0; + g->noseGroundContact = FALSE; + g->leftGroundContact = FALSE; + g->rightGroundContact = FALSE; + g->noseSteeringAngle = 0.0; + g->isBraking = FALSE; + g->brakingFactor = 0.0; + c->gear = g; +} + + +_BOOL gear_isHandleDown(craft * c) +{ + gear_Type * g; + g = get(c); + return g->isHandleDown; +} + + +static _BOOL gear_isUp(craft * c) +{ + gear_Type * g; + g = get(c); + return g->noseAngle == 0.0 + && g->leftAngle == 0.0 + && g->rightAngle == 0.0; +} + + +/************* +static _BOOL gear_isDown(craft * c) +{ + gear * g; + g = get(c); + return g->noseAngle == GEARDOWN + && g->leftAngle == GEARDOWN + && g->rightAngle == GEARDOWN; +} + + +static _BOOL gear_isMoving(craft * c) +{ + return ! gear_isUp(c) && ! gear_isDown(c); +} +**********/ + +int gear_nosePosition(craft * c) +{ + gear_Type * g; + g = get(c); + if( g->noseAngle == 0.0 ) + return 0; + else if( g->noseAngle == GEARDOWN ) + return 2; + else + return 1; +} + + +int gear_leftPosition(craft * c) +{ + gear_Type * g; + g = get(c); + if( g->leftAngle == 0.0 ) + return 0; + else if( g->leftAngle == GEARDOWN ) + return 2; + else + return 1; +} + + +int gear_rightPosition(craft * c) +{ + gear_Type * g; + g = get(c); + if( g->rightAngle == 0.0 ) + return 0; + else if( g->rightAngle == GEARDOWN ) + return 2; + else + return 1; +} + + +void gear_up(craft *c) +{ + gear_Type * g; + g = get(c); + g->isHandleDown = FALSE; + g->noseAngle = 0.0; + g->leftAngle = 0.0; + g->rightAngle = 0.0; +} + + +void gear_down(craft *c) +{ + gear_Type * g; + g = get(c); + g->isHandleDown = TRUE; + g->noseAngle = GEARDOWN; + g->leftAngle = GEARDOWN; + g->rightAngle = GEARDOWN; +} + + +_BOOL gear_allWheelsGroundContact(craft * c) +{ + gear_Type * g; + g = get(c); + return g->noseGroundContact && g->leftGroundContact && g->rightGroundContact; +} + + +_BOOL gear_someWheelGroundContact(craft * c) +{ + gear_Type * g; + g = get(c); + return g->noseGroundContact || g->leftGroundContact || g->rightGroundContact; +} + + +_BOOL gear_noseWheelGroundContact(craft * c) +{ + gear_Type * g; + g = get(c); + return g->noseGroundContact; +} + + +_BOOL gear_mainWheelsGroundContact(craft * c) +{ + gear_Type * g; + g = get(c); + return g->leftGroundContact || g->rightGroundContact; +} + + +void gear_handle_up(craft *c) +{ + gear_Type * g; + g = get(c); + if( ! g->isHandleDown ) + return; + g->isHandleDown = FALSE; + sounds_playSound(c, sounds_GearUp, FALSE); +} + + +void gear_handle_down(craft *c) +{ + gear_Type * g; + g = get(c); + if( g->isHandleDown ) + return; + g->isHandleDown = TRUE; + sounds_playSound(c, sounds_GearDown, FALSE); +} + + +void gear_handle_toggle(craft *c) +{ + gear_Type * g; + g = get(c); + if( g->isHandleDown ) + gear_handle_up(c); + else + gear_handle_down(c); +} + + +_BOOL gear_brakesEngaged(craft * c) +{ + gear_Type * g; + g = get(c); + return g->isBraking; +} + + +void gear_brakesEngage(craft * c) +{ + gear_Type * g; + g = get(c); + g->isBraking = TRUE; +} + + +void gear_brakesDisengage(craft * c) +{ + gear_Type * g; + g = get(c); + g->isBraking = FALSE; +} + + +void gear_ground_altitude_pitch(craft *c, double *altitude, double *pitch) +{ + craftType *p; + double w, l, zn, zm, delta_cn, delta_cm, ne, me, F, M, dF_dcn, dF_dcm, + dM_dcn, dM_dcm, new_F, new_M, z, dcn, dcm, err2max; + int i; + + + void force_and_moment(double ne, double me, double *F, double *M) + /* + * Calculate static forces due to springs for the aircraft at + * rest on the horizontal ground. 'ne' is the nose oleo extension, + * 'me' is the main oleo extension. + * + * Return total vertical force applied to the CM and total moment + * around y axis. + */ + { + double s, z, cosa, sina, Fn, Fm, ln, lm; + + /* + Compute sine and cosine of the rest pitch angle + */ + + if( p->rn.x > p->rm.x ) + s = 1.0; + else + s = -1.0; + + z = zn + ne - zm - me; + cosa = l / sqrt(l*l + z*z); + sina = s * z / sqrt(l*l + z*z); + + Fn = (p->cnMax - ne)*p->Kn / cosa; + Fm = (p->cmMax - me)*p->Km / cosa; + *F = w - Fn - Fm; + + ln = p->rn.x*cosa + (zn + ne)*sina; + lm = p->rm.x*cosa + (zm + me)*sina; + *M = Fn*ln + Fm*lm; + } + + + p = c->cinfo; + w = p->emptyWeight + c->fuel + c->payload; /* weight (lbf) */ + l = fabs(p->rn.x - p->rm.x); + zn = p->rn.z + p->Gn; + zm = p->rm.z + p->Gm; + + /* + * We are looking for the zero of the total force F(ne,me) and total + * moment M(ne,me) being ne,me the extension of the springs. We + * start from the middle point then moving the point (ne,me) in + * the box [0,cnMax]x[0,cmMax]: + */ + + ne = 0.5*p->cnMax; + me = 0.5*p->cmMax; + + /* + * Partial derivatives are numerically calculated using these steps: + */ + + delta_cn = 1e-5 * p->cnMax; + delta_cm = 1e-5 * p->cmMax; + + /* + * The loop continues until the changes in ne,me become less than + * about one hundredth of the max extension. Calculate the square + * of this error: + */ + + err2max = 1e-6 * (p->cnMax * p->cnMax + p->cmMax * p->cmMax); + + i = 0; + do { + + /* + * Evaluate the derivatives of F(ne,me) and M(ne,me): this + * gives the plane that best approximates the functions F,M + * around the point (ne,me): + * + * dF = dF_dcn dcn + dF_dcm * dcm dM = dM_dcn dcn + dM_dcm + * * dcm + */ + + force_and_moment(ne, me, &F, &M); +#ifdef DEBUG + printf("FIXME: ne=%f me=%f F=%f M=%f\n", ne, me, F, M); +#endif + + force_and_moment(ne + delta_cn, me, &new_F, &new_M); + dF_dcn = (new_F - F) / delta_cn; + dM_dcn = (new_M - M) / delta_cn; + + force_and_moment(ne, me + delta_cm, &new_F, &new_M); + dF_dcm = (new_F - F) / delta_cm; + dM_dcm = (new_M - M) / delta_cm; + + /* + * Move the point (ne,me) along the approximating planes in + * order to cancel F,M: + * + * -F = dF_dcn dcn + dF_dcm * dcm -M = dM_dcn dcn + dM_dcm + * * dcm + * + * Resolving this system of equations gives us dcn,dcm. + */ + + dcm = (dM_dcn*F - dF_dcn*M) / (dF_dcn*dM_dcm - dF_dcm*dM_dcn); + me += dcm; + + dcn = -F/dF_dcn -dF_dcm/dF_dcn*dcm; + ne += dcn; + + if( ne < 0.0 ) ne = 0.0; + if( ne > p->cnMax - delta_cn ) ne = p->cnMax - delta_cn; + + if( me < 0.0 ) me = 0.0; + if( me > p->cmMax - delta_cm ) me = p->cmMax - delta_cm; + + i++; +#ifdef DEBUG + printf("FIXME: %d) ne=%.0f%% me=%.0f%%\n", + i, 100.0 * ne / p->cnMax, 100.0 * me / p->cmMax); +#endif + if( i > 9 ){ + + /* + * Usually two or three loops are enough, but + * still there are cases in which this algo does + * not converge. + */ + + printf("WARNING: unbalanced gear parameters, can't find a good rest position.\n"); + break; + } + + } while( dcn*dcn + dcm*dcm > err2max ); + + + z = zn + ne - zm - me; + if( p->rn.x < p->rm.x ) + z = -z; + *pitch = asin( z / sqrt(l*l + z*z) ); + + *altitude = (zm + me)*cos(*pitch) + (-p->rm.x)*sin(*pitch); + +#ifdef DEBUG + printf("FIXME: alt=%f pitch=%f\n", *altitude, units_RADtoDEG(*pitch)); +#endif +} + + +static void +gear_move_up_down(craft *c) +{ + gear_Type * g; + g = get(c); + if (damage_isFunctioning(c, SYS_NOSEGEAR)) { + if (g->isHandleDown) { + if (g->noseAngle != GEARDOWN) { + g->noseAngle += c->cinfo->gearRate * deltaT; + if (g->noseAngle > GEARDOWN) + g->noseAngle = GEARDOWN; + } + } + else { + if (g->noseAngle != 0.0) { + g->noseAngle -= c->cinfo->gearRate * deltaT; + if (g->noseAngle < 0.0) + g->noseAngle = 0.0; + } + } + } + + if (damage_isFunctioning(c, SYS_LEFTMAIN)) { + if (g->isHandleDown) { + if (g->leftAngle != GEARDOWN) { + g->leftAngle += 0.8*c->cinfo->gearRate * deltaT; + if (g->leftAngle > GEARDOWN) + g->leftAngle = GEARDOWN; + } + } + else { + if (g->leftAngle != 0.0) { + g->leftAngle -= 0.8*c->cinfo->gearRate * deltaT; + if (g->leftAngle < 0.0) + g->leftAngle = 0.0; + } + } + } + + if (damage_isFunctioning(c, SYS_RIGHTMAIN)) { + if (g->isHandleDown) { + if (g->rightAngle != GEARDOWN) { + g->rightAngle += 0.9*c->cinfo->gearRate * deltaT; + if (g->rightAngle > GEARDOWN) + g->rightAngle = GEARDOWN; + } + } + else { + if (g->rightAngle != 0.0) { + g->rightAngle -= 0.9*c->cinfo->gearRate * deltaT; + if (g->rightAngle < 0.0) + g->rightAngle = 0.0; + } + } + } +} + + +static double +spring_and_damper_force(double K, double D, double eMax, double e, double e_dot) +/* + * Compute spring + damper force + * K = spring factor (lbf/s^2) + * D = damper factor (lbf s /ft) + * eMax = max extension (ft) + * e = current extension (ft) + * e_dot = extension rate (ft/s) + * + * Return: the resultant vertical force (lbf), always <= 0.0. If the result + * is 0.0, the wheel lost contact with ground. + */ +{ + double spring, damper; + + if( e >= eMax ) + return 0.0; + + spring = - K * (eMax - e); + + if( e < 0.1 ) + /* add resistance in the last 0.1 feet */ + spring -= 100 * K * (e - 0.1); + + damper = D * e_dot; + + if( damper + spring > 0.0 ){ + /* wheel lost contact with ground */ + spring = 0.0; + damper = 0.0; + } + + return spring + damper; +} + + +static inline double sgn(double x) +{ + if( x > 0.0 ) + return 1.0; + else if( x < 0.0 ) + return -1.0; + else + return 0.0; +} + + +#define SLIP_MAX units_DEGtoRAD(3) + + +static _BOOL /* return TRUE if wheel is skidding */ +wheel_friction( + double deflection, /* steering angle, positive right (RAD) */ + double vx, double vy, /* forward and rightward velocity (ft/s)*/ + double Fn, /* normal force (lbf) */ + double muStatic, /* rolling, near rest mu factor */ + double muKinetic, /* rolling mu factor */ + double muLateral, /* lateral mu factor */ + VPoint *F /* resulting friction force (lbf) */ + , char *debug /* FIXME: remove */ +) +/* + * This function computes the friction force F of the wheel due to the + * rolling friction and the lateral friction. The rolling friction brakes + * the longitudinal motion, while the lateral friction is responsible for + * the steering and the lateral skidding. Basically the longitudinal force + * is proportional to the normal force: + * + * force = mu Fn + * + * where mu becomes larger at small speed (muStatic) and smaller at high + * speed (muKinetic). + * + * SLIP_MAX is the maximum angle of slip between wheel rolling direction + * and actual velocity. Below this angle the lateral friction is linerly + * dependent on the slip angle: + * + * force = Fn muSkid * slip / SLIP_MAX + * + * above that angle the lateral force is constant: + * + * force = Fn muSkid + * + * This model for wheel steering is well described in this paper: + * + * How to Drive Like a Racecar Driver: Vehicle Stabilization at the Limits + * of Handling Yung-Hsiang (Judy) Hsu, Shad Laws, Chris Gerdes Stanford + * University http://ddl.stanford.edu/atthelimits + * + * See also: + * + * Tire Model in Driving Simulator + * http://code.eng.buffalo.edu/dat/sites/tire/tire.html where the relation + * between steering and braking forces and the relation between velocity + * and varying mu coefficients are discussed. In our model the nose wheel + * can steer but cannot brake, and vice-versa the left and right wheels + * can brake but do not steer. + * + * The Physics of Racing Brian Beckman http://phors.locost7.info/contents.htm + */ +{ + _BOOL skid; + double rx, ry, v_lateral, k, v_forward, F_forward, F_lateral, slip; + + skid = FALSE; + + if( deflection == 0.0 ){ + rx = 1.0; + ry = 0.0; + } else { + rx = cos(deflection); + ry = sin(deflection); + } + + /* + * Evaluate the longitudinal static or rolling friction along the + * longitudinal vector (rx,ry): + */ + + v_forward = vx*rx + vy*ry; + k = v_forward / 0.5; + if( fabs(k) > 1.0 ) + k = sgn(k); + if( fabs(v_forward) < 0.5 /* ft/s */ ) + F_forward = - k * muStatic * Fn; + else + F_forward = - k * muKinetic * Fn; + + /* + * Evaluate the lateral friction along the lateral vector (-ry,rx): + */ + + v_lateral = rx*vy - ry*vx; + k = v_lateral / 3.0; + if( fabs(k) > 1.0 ) + k = sgn(k); + /* + * Slip angle between wheel direction and velocity, normalized to + * the range +/-90 DEG: + */ + slip = atan2( v_lateral, v_forward ); + if( ! (slip >= -M_PI && slip <= M_PI) ) + slip = 0.5 * M_PI * sgn(v_lateral); + if( slip > 0.5*M_PI ) + slip = M_PI - slip; + else if( slip < -0.5*M_PI ) + slip = -slip - M_PI; + + if( fabs(slip) < SLIP_MAX ){ + /* linear behavior: */ + F_lateral = - k * muLateral * fabs(slip) / SLIP_MAX * Fn; + } else { + /* saturation */ + if( fabs(slip) > 2*SLIP_MAX && fabs(k) > 0.5 ) + skid = TRUE; + F_lateral = - k * muLateral * Fn; + } + + //F_lateral = 0.0; /* FIXME */ + //F_forward = 0.0; /* FIXME */ + + F->x = F_forward * rx - F_lateral * ry; + F->y = F_forward * ry + F_lateral * rx; + F->z = 0.0; + +#ifdef DEBUG + printf("FIXME: %5s, Fn=%6.0f v=%5.1f %5.1f defl=%5.1f slip=%5.1f F=%7.0f %7.0f\n", + debug, Fn, vx, vy, units_RADtoDEG(deflection), units_RADtoDEG(slip), F->x, F->y); +#endif + + return skid; +} + + +double gear_get_drag(craft * c) +{ + gear_Type * g; + + if( gear_isUp(c) ) + return 0.0; + g = get(c); + return (sin(g->noseAngle) + sin(g->leftAngle) + sin(g->rightAngle)) + / 3.0 * c->cinfo->cGearDrag; +} + + +char * +gear_ground_dynamics(craft * c, VPoint *gearF, VPoint *gearM) +{ + gear_Type * g; + craftType *p; + double ne, ne_dot, re, re_dot, le, le_dot; + VPoint nw, nw_dot, rw, rw_dot, lw, lw_dot; + VPoint r, r_dot, q, q_dot; + double ground_z, muStatic, muKinetic, k, v; + VPoint F, M, mt, Cg, Fl, Fr, Fn, FnMu, FlMu, FrMu; + VPoint omega; + VMatrix NEDtoSWC, AXYZtoSWC; + _BOOL skid; + + g = get(c); + gear_move_up_down(c); + + /* + * Update braking factor. + * Engage/disengage within 1 s. + */ + if (g->isBraking){ + g->brakingFactor += deltaT; + if( g->brakingFactor > 1.0 ) + g->brakingFactor = 1.0; + } else { + g->brakingFactor -= deltaT; + if( g->brakingFactor < 0.0 ) + g->brakingFactor = 0.0; + } + + if( g->noseAngle < GEARDOWN + && g->leftAngle < GEARDOWN + && g->rightAngle < GEARDOWN ){ + /* none of the wheels is fully extended */ + VSetPoint(gearF, 0, 0, 0); + VSetPoint(gearM, 0, 0, 0); + return NULL; + } + + ground_z = units_METERStoFEET(c->w.z - terrain_localAltitude(c)); + if( ground_z <= 0.0 ){ + return "sunken under the terrain..."; + } else if( ground_z > 500.0 ){ + /* very far from the terrain */ + VSetPoint(gearF, 0, 0, 0); + VSetPoint(gearM, 0, 0, 0); + return NULL; + } + + p = c->cinfo; + +/* + * The Simplified Word Coordinates (SWC) is a reference frame centered + * on the aircraft CM with the z axis pointing downward to the ground and + * the x axis oriented as the current heading. This frame makes easier to + * detect wheels contact with the ground. The ground is the plane z=ground_z + * (ft). We compute two useful rotational matrices: + * + * NEDtoSWC that rotates from NED to SWC, and + * + * AXYZtoSWC that rotates from aircraft frame to SWC + */ + + VIdentMatrix(&NEDtoSWC); + VRotate(&NEDtoSWC, ZRotation, -c->curHeading); + + AXYZtoSWC = c->AXYZtoNED; + VRotate(&AXYZtoSWC, ZRotation, -c->curHeading); + +/* + * Cg (ft/s) is the CM ground speed vector with components in SWC. + */ + + VTransform(&c->Cg, &NEDtoSWC, &Cg); + v = VMagnitude(&Cg); + +/* + * Set nose wheel steering angle c->curNWDef (RAD). + * + * Since mouse and joystick give very little force feedback, steering at + * high speed often results in a catastrophic disaster :-) We have two + * choices here: locking the nose wheel at high speed or gently reduce the + * steering effectiveness. We follow this latter way. + * + * The criteria is: given the pilot's steering input, calculate an angle + * of steering that produces the same centripetal acceleration at any speed + * above some limit speed V_THR. This result is achieved as follows. + * + * The radius of steering for the point between the two main wheels (that + * typically is also very close to the CM) is + * + * r = Q / tan(c->curNWDef) + * + * where Q=abs(c->rn.x - c->rm.x) is the distance between the nose and the + * main gears. For little angles, this formula becomes + * + * r = Q / c->curNWDef + * + * The centripetal acceleration of the CM for v < V_THR is + * + * a = v*v/r = v*v*k*c->curNWDef/Q with k=1.0 + * + * For speeds above V_THR we reduce the steering angle by a factor "k" + * such that the resulting centripetal acceleration be the same we had at + * v=V_THR with the given pilot's input: + * + * k = (V_THR/v)^2 + */ + +#define V_THR units_KTtoFPS(10.0) + + if( v < V_THR ) + k = 1.0; + else + k = V_THR*V_THR / (v * v); + //g->noseSteeringAngle = - k * (c->steerComm * c->cinfo->maxNWDef); + g->noseSteeringAngle = - k * (c->rollComm * c->cinfo->maxNWDef); + +/* + * muStatic and muKinetic are the friction mu coefficients of the left and + * right wheels, that varies depending on brakes on/off. Since the nose + * wheel does not brake, it always uses p->muStatic and p->muKinetic. + */ + + if (g->isBraking) { + muStatic = p->muBStatic; + muKinetic = p->muBKinetic; + } + else { + muStatic = p->muStatic; + muKinetic = p->muKinetic; + } + + /* + * Compute brake force rate. + */ + + muStatic = (1.0 - g->brakingFactor) * p->muStatic + g->brakingFactor * p->muBStatic; + muKinetic = (1.0 - g->brakingFactor) * p->muKinetic + g->brakingFactor * p->muBKinetic; + +/* + * A few theory about how oleo strut extension and extension rate are + * calculated: + * + * r = position of the gear strut attachment in AXYZ (ex. rn + Gn) + * q = [0,0,1] unity vector giving the oleo extension direction + * e = oleo extension (ranging from 0 to cnMax or cmMax for nose or main) + * M = AXYZtoSWC (for brevity) + * + * The wheel position in AXYZ will be ("==" means "definition"): + * + * w == r + eq + * + * Vector components can also conveniently be expressed in the SWC frame: + * + * r' == Mr (components of r in SWC, NOT the position in SWC!) + * + * q' == Mq (components of q in SWC) + * + * The wheel position in SWC requires to rotate the components of w and + * add the position of the CM in the SWC frame, Sg: + * + * w' == Mw + Sg + * = r' + eq' + Sg (1) + * + * If the wheel is in contact with ground, the z component of the eq. 1 + * must be zero, from which we obtain the oleo extension: + * + * e = - (r'.z + Sg.z) / q'.z (2) + * + * Speeds in SWC can be easily calculated introducing the rotational speed + * vector applied to the CM with components in SWC: + * + * omega == [c->p, c->q, c->r] + * + * from which for any vector r in components AXYZ, its components in SWC + * are r' = Mr and its velocity in components SWC is r'_dot = omega x r'. + * We can now calculate the derivative of e, needed to calculate the + * damping. We obtain this value deriving (2): + * + * e_dot = - ([omega x r'].z + Cg.z) / q'.z - e [omega x q'].z / q'.z + * + * Finally, the velocity of the wheel in SWC is the derivative of eq. 1: + * + * w'_dot = omega x r' + e_dot q' + e * q'_dot + Cg + * + * We will now calculate e, e_dot and w'_dot for each wheel: + */ + + /* Angular velocity vector, components in SWC: */ + VSetPoint(&omega, c->p, c->q, c->r); + + /* Stroke unity vector and its derivative, components in SWC: */ + VSetPoint(&q, 0, 0, 1); + VTransform_(&q, &AXYZtoSWC, &q); + VCrossProd(&omega, &q, &q_dot); + + /* NOSE GEAR */ + ne = 0.0; /* dummy */ + ne_dot = 0.0; /* dummy */ + VSetPoint(&nw, 0.0, 0.0, 0.0); /* dummy */ + VSetPoint(&nw_dot, 0.0, 0.0, 0.0); /* dummy */ + if( g->noseAngle == GEARDOWN ){ + /* + * Gear down and locked. + */ + + /* Strut attachment position, components in SWC: */ + r = p->rn; + r.z += p->Gn; + VTransform_(&r, &AXYZtoSWC, &r); + + if( r.z < 1e-3 ){ + /* Wheel is certainly not in contact. */ + g->noseGroundContact = FALSE; + ne = p->cnMax; /* FIXME: not needed */ + } else { + /* Possible contact with ground. Calculate oleo extension: */ + ne = (ground_z - r.z) / q.z; + if( ne < 0.0 ){ + g->noseGroundContact = TRUE; + return "nose gear smash"; + } else if( ne > p->cnMax ){ + /* Not in contact: */ + g->noseGroundContact = FALSE; + ne = p->cnMax; + } else { + /* In contact: */ + /* Oleo extension rate: */ + VCrossProd(&omega, &r, &r_dot); + ne_dot = - (r_dot.z + Cg.z) / q.z - ne * q_dot.z / q.z; + + /* Wheel position, aircraft frame: */ + nw.x = p->rn.x; + nw.y = p->rn.y; + nw.z = p->rn.z + p->Gn + ne; + + /* Wheel velocity vs. ground, components in SWC: */ + nw_dot.x = r_dot.x + ne_dot * q.x + ne * q_dot.x + Cg.x; + nw_dot.y = r_dot.y + ne_dot * q.y + ne * q_dot.y + Cg.y; + nw_dot.z = r_dot.z + ne_dot * q.z + ne * q_dot.z + Cg.z; + + if( ! g->noseGroundContact + && fabs(nw_dot.x) + fabs(nw_dot.y) > 1.0 && ne_dot <= 0 ){ + /* First contact. */ + sounds_playSound(c, sounds_Touchdown, FALSE); + } + g->noseGroundContact = TRUE; + } + } + + } else { + /* + * Gear up or not fully extended. + */ + g->noseGroundContact = FALSE; + } + + + /* RIGHT GEAR */ + re = 0.0; /* dummy */ + re_dot = 0.0; /* dummy */ + VSetPoint(&rw, 0.0, 0.0, 0.0); /* dummy */ + VSetPoint(&rw_dot, 0.0, 0.0, 0.0); /* dummy */ + if( g->leftAngle == GEARDOWN ){ + /* + * Gear down and locked. + */ + + /* Strut attachment position, components in SWC: */ + r = p->rm; + r.z += p->Gm; + VTransform_(&r, &AXYZtoSWC, &r); + + if( r.z < 1e-3 ){ + /* Wheel is certainly not in contact. */ + g->rightGroundContact = FALSE; + re = p->cmMax; /* FIXME: not needed */ + } else { + /* Possible contact with ground. Calculate oleo extension: */ + re = (ground_z - r.z) / q.z; + if( re < 0.0 ){ + g->rightGroundContact = TRUE; + return "right gear smash"; + } else if( re > p->cmMax ){ + /* Not in contact: */ + g->rightGroundContact = FALSE; + re = p->cmMax; + } else { + /* In contact: */ + /* Oleo extension rate: */ + VCrossProd(&omega, &r, &r_dot); + re_dot = - (r_dot.z + Cg.z) / q.z - re * q_dot.z / q.z; + + /* Wheel position, aircraft frame: */ + rw.x = p->rm.x; + rw.y = p->rm.y; + rw.z = p->rm.z + p->Gm + re; + + /* Wheel velocity vs. ground, components in SWC: */ + rw_dot.x = r_dot.x + re_dot * q.x + re * q_dot.x + Cg.x; + rw_dot.y = r_dot.y + re_dot * q.y + re * q_dot.y + Cg.y; + rw_dot.z = r_dot.z + re_dot * q.z + re * q_dot.z + Cg.z; + + if( ! g->rightGroundContact + && fabs(rw_dot.x) + fabs(rw_dot.y) > 1.0 && re_dot < 0 ){ + /* First contact. */ + sounds_playSound(c, sounds_Touchdown, FALSE); + } + g->rightGroundContact = TRUE; + } + } + + } else { + /* + * Gear up or not fully extended. + */ + g->rightGroundContact = FALSE; + } + + + /* LEFT GEAR */ + le = 0.0; /* dummy */ + le_dot = 0.0; /* dummy */ + VSetPoint(&lw, 0.0, 0.0, 0.0); /* dummy */ + VSetPoint(&lw_dot, 0.0, 0.0, 0.0); /* dummy */ + if( g->rightAngle == GEARDOWN ){ + /* + * Gear down and locked. + */ + + /* Strut attachment position, components in SWC: */ + r = p->rm; + r.y = -r.y; + r.z += p->Gm; + VTransform_(&r, &AXYZtoSWC, &r); + + if( r.z < 1e-3 ){ + /* Wheel is certainly not in contact. */ + g->leftGroundContact = FALSE; + le = p->cmMax; /* FIXME: not needed */ + } else { + /* Possible contact with ground. Calculate oleo extension: */ + le = (ground_z - r.z) / q.z; + if( le < 0.0 ){ + g->leftGroundContact = TRUE; + return "left gear smash"; + } else if( le > p->cmMax ){ + /* Not in contact: */ + g->leftGroundContact = FALSE; + le = p->cmMax; + } else { + /* In contact: */ + /* Oleo extension rate: */ + VCrossProd(&omega, &r, &r_dot); + le_dot = - (r_dot.z + Cg.z) / q.z - le * q_dot.z / q.z; + + /* Wheel position, aircraft frame: */ + lw.x = p->rm.x; + lw.y = -p->rm.y; + lw.z = p->rm.z + p->Gm + le; + + /* Wheel velocity vs. ground, components in SWC: */ + lw_dot.x = r_dot.x + le_dot * q.x + le * q_dot.x + Cg.x; + lw_dot.y = r_dot.y + le_dot * q.y + le * q_dot.y + Cg.y; + lw_dot.z = r_dot.z + le_dot * q.z + le * q_dot.z + Cg.z; + + if( ! g->leftGroundContact + && fabs(lw_dot.x) + fabs(lw_dot.y) > 1.0 && le_dot < 0 ){ + /* First contact. */ + sounds_playSound(c, sounds_Touchdown, FALSE); + } + g->leftGroundContact = TRUE; + } + } + + } else { + /* + * Gear up or not fully extended. + */ + g->leftGroundContact = FALSE; + } + +#ifdef DEBUG + printf("FIXME: ne=%.0f%% re=%.0f%% le=%.0f%%\n", + 100.0 * ne / p->cnMax, 100.0 * re / p->cmMax, 100.0 * le / p->cmMax); + printf("FIXME: ne_dot=%f re_dot=%f le_dot=%f\n", ne_dot, re_dot, le_dot); +#endif + +/* + * Compute forces Fn,Fr,Fl (AXYZ) due to the static reaction of the wheels + * against the terreain. If the terrain were perfectly smooth and clean, + * this force would sustain the aircraft, but it would be impossible to + * brake and to steer. + * + * The spring constant p->Km and the damping factor p->Dm in the inventory + * refers to the two main landing gear right+left as a whole, that's why + * of the 0.5 factor appearing in front of these coefficients. + * + * To these forces we have to add also the longitudinal friction and lateral + * friction FnMu,FrMu,FlMu (AXYZ). These forces allow to brake and steer + * the aircraft. + */ + + /* NOSE GEAR: */ + + VSetPoint(&Fn, 0.0, 0.0, 0.0); + + /* Add force Fn.z (AXYZ) due to spring and damper: */ + if( g->noseGroundContact ){ + Fn.z = spring_and_damper_force(p->Kn, p->Dn, p->cnMax, ne, ne_dot); + if( Fn.z < - 1.0 /* FIXME */ * p->emptyWeight ) + return "nose gear collapsed under too high vertical load"; + if( Fn.z == 0.0 ) + g->noseGroundContact = FALSE; + } + + /* Add friction and steering effects: */ + if( g->noseGroundContact ){ + VPoint f; + double fm, deflection; + + /* Calculate terrain normal force f (SWC): */ + fm = Fn.z * Fn.z; + VTransform_(&Fn, &AXYZtoSWC, &f); + VSetPoint(&f, 0, 0, fm / f.z); + + /* Set actual static force Fn (AXYZ): */ + VReverseTransform_(&f, &AXYZtoSWC, &Fn); + + if( p->rn.x > p->rm.x ) /* tricycle gear */ + deflection = g->noseSteeringAngle; + else /* bicycle */ + deflection = - g->noseSteeringAngle; + + skid = wheel_friction(deflection, + nw_dot.x, nw_dot.y, + -f.z, + p->muStatic, p->muKinetic, MU_SKID, /* no brakes */ + &f, "nose"); + + /* Convert f (SWC) in FnMu (AXYZ): */ + VReverseTransform_(&f, &AXYZtoSWC, &FnMu); + + if( skid ){ + sounds_playSound(c, sounds_Touchdown, 0); + prompt_craft_print(c, "WARNING: nose wheel is skidding"); + } + + if( fabs(FnMu.y) > 1.0 * /* FIXME */ p->emptyWeight ) + return "nose gear broken under too high lateral force"; + + } else { + + /* Nose wheel isn't in contact with ground: */ + + VSetPoint(&FnMu, 0, 0, 0); + } + + /* RIGHT GEAR: */ + + VSetPoint(&Fr, 0.0, 0.0, 0.0); + + /* Add force Fr.z (AXYZ) due to spring and damper: */ + if( g->rightGroundContact ){ + Fr.z = spring_and_damper_force(0.5*p->Km, 0.5*p->Dm, p->cmMax, re, re_dot); + if( Fr.z < - 1.5 /* FIXME */ * p->emptyWeight ) + return "right gear collapsed under too high vertical load"; + if( Fr.z == 0.0 ) + g->rightGroundContact = FALSE; + } + + /* Add friction and braking: */ + if( g->rightGroundContact ){ + VPoint f; + double fm; + + /* Calculate terrain normal force f (SWC): */ + fm = Fr.z * Fr.z; + VTransform_(&Fr, &AXYZtoSWC, &f); + VSetPoint(&f, 0, 0, fm / f.z); + + /* Set actual static force Fr (AXYZ): */ + VReverseTransform_(&f, &AXYZtoSWC, &Fr); + + skid = wheel_friction(0.0, + rw_dot.x, rw_dot.y, + -f.z, + muStatic, muKinetic, MU_SKID, + &f, "right"); + + VReverseTransform_(&f, &AXYZtoSWC, &FrMu); + + if( skid ){ + sounds_playSound(c, sounds_Touchdown, 0); + prompt_craft_print(c, "WARNING: right wheel is skidding"); + } + + if( fabs(FrMu.y) > 1.0 * /* FIXME */ p->emptyWeight ) + return "right gear broken under too high lateral force"; + + } else { + + /* Right wheel isn't in contact with ground: */ + + VSetPoint(&FrMu, 0, 0, 0); + } + + /* LEFT GEAR: */ + + VSetPoint(&Fl, 0.0, 0.0, 0.0); + + /* Add force Fl.z (AXYZ) due to spring and damper: */ + if( g->leftGroundContact ){ + Fl.z = spring_and_damper_force(0.5*p->Km, 0.5*p->Dm, p->cmMax, le, le_dot); + if( Fl.z < - 1.5 /* FIXME */ * p->emptyWeight ) + return "left gear collapsed under too high vertical load"; + if( Fl.z == 0.0 ) + g->leftGroundContact = FALSE; + } + + /* Add friction and braking: */ + if( g->leftGroundContact ){ + VPoint f; + double fm; + + /* Calculate terrain normal force f (SWC): */ + fm = Fl.z * Fl.z; + VTransform_(&Fl, &AXYZtoSWC, &f); + VSetPoint(&f, 0, 0, fm / f.z); + + /* Set actual static force Fl (AXYZ): */ + VReverseTransform_(&f, &AXYZtoSWC, &Fl); + + skid = wheel_friction(0.0, + lw_dot.x, lw_dot.y, + -f.z, + muStatic, muKinetic, MU_SKID, + &f, "left"); + + VReverseTransform_(&f, &AXYZtoSWC, &FlMu); + + if( skid ){ + sounds_playSound(c, sounds_Touchdown, 0); + prompt_craft_print(c, "WARNING: left wheel is skidding"); + } + + if( fabs(FlMu.y) > 1.0 * /* FIXME */ p->emptyWeight ) + return "left gear broken under too high lateral force"; + + } else { + + /* Left wheel isn't in contact with ground: */ + + VSetPoint(&FlMu, 0, 0, 0); + } + +/* + * Here we sum up all the forces F and F*Mu at every wheel to get the total + * force F (AXYZ) applyed to the CM. The result is F (AXYZ). + */ + + F.x = Fn.x + Fl.x + Fr.x + FnMu.x + FlMu.x + FrMu.x; + + F.y = Fn.y + Fl.y + Fr.y + FnMu.y + FlMu.y + FrMu.y; + + F.z = Fn.z + Fl.z + Fr.z + FnMu.z + FlMu.z + FrMu.z; + +/* + * Every wheel gives its contribute to the total moment M (AXYZ). + */ + + VCrossProd(&nw, &Fn, &M); + VCrossProd(&nw, &FnMu, &mt); VAdd(&M, &mt, &M); + VCrossProd(&lw, &Fl, &mt); VAdd(&M, &mt, &M); + VCrossProd(&lw, &FlMu, &mt); VAdd(&M, &mt, &M); + VCrossProd(&rw, &Fr, &mt); VAdd(&M, &mt, &M); + VCrossProd(&rw, &FrMu, &mt); VAdd(&M, &mt, &M); + + *gearF = F; + *gearM = M; + +/* + * Since we are inside this function, it means we are very close to the + * ground. On a tricycle landing gear the tail will drag for pitch greater + * than 20 DEG. + * + * FIXME: that's not very realistic as we should use the parameter TailExtent + * of the inventory file to compute the actual maximum angle of rotation. The + * roll angle should also be considered, since also wing tips can drag. + */ + + if( (g->noseGroundContact || g->leftGroundContact || g->rightGroundContact) /* some wheel still in contact */ + && (p->rn.x > p->rm.x) /* is bicycle */ + && (c->curPitch > units_DEGtoRAD(20.0)) /* rotation above 20 DEG */ + ) { + return "rotation above 20 DEG, dragging tail to the runway"; + } + + return NULL; +} diff -Nru acm-5.0/src/acm/gear.h acm-6.0+20200416/src/acm/gear.h --- acm-5.0/src/acm/gear.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/gear.h 2017-10-28 08:22:24.000000000 +0000 @@ -0,0 +1,133 @@ +/* + * ACM - Landing gear module + * Copyright (C) 2008 Umberto Salsi + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +/** + * Aircraft gear dynamics, including steering, aerodynamic drag, drag over the + * terrain. + * @file + */ + +#ifndef _gear_h +#define _gear_h + +#include "pm.h" + +#ifdef gear_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +/** + * Allocates the gear state data structure c->gear. The gear is initialized + * up and locked, zero steering angle, no brakes applied. + */ +EXTERN void gear_allocate(craft * c); + +/** + * Release the gear state data structure c->gear and sets that field to + * null. Does nothing if already NULL. + */ +EXTERN void gear_free(craft *c); + +/** + * Set initial handle and gear state, no animation, no sound. + * @param c + */ +EXTERN void gear_up(craft *c); + +/** + * Set initial handle and gear state, no animation, no sound. + * @param c + */ +EXTERN void gear_down(craft *c); + +EXTERN _BOOL gear_isHandleDown(craft * c); + +/** Move gear handle with gear animation and sound. */ +EXTERN void gear_handle_up(craft *c); +/** Move gear handle with gear animation and sound. */ +EXTERN void gear_handle_down(craft *c); +/** Move gear handle with gear animation and sound. */ +EXTERN void gear_handle_toggle(craft *c); + +/** + * Returns the nose landing gear position: 0 = up, 1 = moving, 2 = down. + */ +EXTERN int gear_nosePosition(craft * c); + +/** + * Returns the left landing gear position: 0 = up, 1 = moving, 2 = down. + */ +EXTERN int gear_leftPosition(craft * c); + +/** + * Returns the right landing gear position: 0 = up, 1 = moving, 2 = down. + */ +EXTERN int gear_rightPosition(craft * c); + +/** + * Returns true if all wheel are in ground contact. + */ +EXTERN _BOOL gear_allWheelsGroundContact(craft * c); + +/** + * Returns true if at least one wheel is in ground contact. + */ +EXTERN _BOOL gear_someWheelGroundContact(craft * c); + +/** + * Returns true if the nose/tail wheel is in ground contact. + */ +EXTERN _BOOL gear_noseWheelGroundContact(craft * c); + +/** + * Returns true if any of the two main wheels is in ground contact. + */ +EXTERN _BOOL gear_mainWheelsGroundContact(craft * c); + +EXTERN _BOOL gear_brakesEngaged(craft * c); +EXTERN void gear_brakesEngage(craft * c); +EXTERN void gear_brakesDisengage(craft * c); + +/** + * Return the rest altitude of the CM over the terrain (ft) and the rest + * pitch (RAD) at which the plane can be gently deployed over the runway. The + * spring compression are set in order to sustain the total gross weight + * empty+fuel+payload. + * + * ATTENTION. Fuel quantity and payload must be already set before calling + * this function. + */ +EXTERN void gear_ground_altitude_pitch(craft *c, double *altitude, double *pitch); + +/** + * Returns the gear contribute to the drag factor. + * @return Gear contribute to the drag factor. + */ +EXTERN double gear_get_drag(craft * c); + +/** + * Return the total force and moment due to the friction of the wheels on + * the ground, components in aircraft XYZ. Return NULL on success, or the + * reason of the crash. + */ +EXTERN char * gear_ground_dynamics(craft * c, VPoint *gearF, VPoint *gearM); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/hsi.c acm-6.0+20200416/src/acm/hsi.c --- acm-5.0/src/acm/hsi.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/hsi.c 2017-08-10 17:29:32.000000000 +0000 @@ -0,0 +1,1010 @@ +/* + * acm : an aerial combat simulator for X + * HSI tuner and HSI indicator module + * Copyright (C) 1991-1998 Riley Rainey + * Copyright (C) 2007 Umberto Salsi + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#include +#include +#include "../util/memory.h" +#include "pm.h" +#include "navaid.h" +#include "../util/units.h" +#include "vpath_gallery.h" + +#define hsi_IMPORT +#include "hsi.h" + +/* how many NAV receivers */ +#define HSI_NAV_MAX 2 + +/* how many RNAV calculators */ +#define HSI_RNAV_MAX 5 + +/* repeat station reception check every ... (s) */ +#define RECEPTION_CHECK_INTERVAL 4.0 + +/* + * Every station sends its Morse ID every ... (s) + * + * In the reality different stations can send their ID at different intervals + * of time. + */ +#define ID_DELAY 10.0 + +/* + * If we are lucky, the DME station will reply to our requests every so + * many seconds. This module simulates a DME receiver that performs some + * estimations in order to update the DME readout. + * + * In the reality, DMEs may or may not respond at all, and the responses + * come at random intervals of times. + */ +#define DME_DELAY 3.0 + +/* + * Every CDI dot means that angular deviation. + */ +#define CDI_DOT_STEP units_DEGtoRAD(1.7) + +/* + * Constant that maps the current angular deviation to some displacement + * of the CDI segment as drawn inside a circumference of unit radius. + */ +#define CDI_DOT_K (0.9 / CDI_MAX_DEVIATION) + +/* + * Number of dots to the left and to the right of the OBS indicator. + */ +#define CDI_DOT_NO 5 + +/* + * The CDI stops if the angular deviation is greater than that. We allow + * the CDI segment to go half-dot beyond the last dot, just to alert the + * pilot that the indicator is out of scale. + */ +#define CDI_MAX_DEVIATION ((CDI_DOT_NO + 0.5)*CDI_DOT_STEP) + +/* + * The GS indicator stops at +/-2.5 DEG deviation + */ +#define GS_OFFSET_MAX units_DEGtoRAD(2.5) + +/* + * Constant that maps the current GS deviation to some displacement of the + * GS indicator. + */ +#define GS_OFFSET_K (1.0/units_DEGtoRAD(2)) + + +/* + * Way point: can be either a NAVAID station (VOR, DME, ILS) or a proper WP + * relative to some VOR/DME station for the RNAV calculator. + */ +typedef struct { + navaid_Channel frequency; /* selected freq. */ + navaid_Type *station; /* NAVAID station, possibly NULL */ + double station_at; /* last reception check */ + double radial; /* current radial occupied */ + double id_update_at; /* when to update the id field (s) */ + char *id; /* station name -- invalid if NULL */ + + int obs; /* OBS (DEG, 0-359) */ + _BOOL is_wp; /* if it is a WP, the following fields have meaning: */ + + /* RNAV data -- meaningful only if is_wp */ + int rho; /* distance VOR-WP (tenth of NM, 1-2000) */ + int theta; /* WP bearing relative to the VOR (DEG, 0-359) */ + double cos_theta, sin_theta; + + /* Handling of the DME signal: */ + double dme_response; /* last response from DME, invalid if < 0 (NM) */ + double dme_response_at; /* last response received at this time (s) */ + double dme_response_dot; /* time derivative of the responses (NM/s) */ + double dme; /* estimated distance, invalid if < 0 (NM) */ + + /* Values to be displayed: */ + double radial_readout; /* current radial relative to the WP (RAD) */ + double dme_readout; /* distance from WP (NM) */ +} waypoint; + + +typedef struct _hsi_data { + struct _hsi_data *next; + + _BOOL enabled; + int idx; /* index of the current WP displayed */ + waypoint wps[HSI_NAV_MAX + HSI_RNAV_MAX]; +} hsi_data; + +/* Released HSI available for re-use. */ +static hsi_data *free_list = NULL; + +static vpath_Type + * obs_pointer = NULL, + * cdi_segment = NULL, + * vor_orientation = NULL, + * gs_dots = NULL, + * gs_pointer = NULL; + + +static void hsi_cleanup() +{ + hsi_data *p; + + while( free_list != NULL ){ + p = free_list; + free_list = free_list->next; + memory_dispose(p); + } + + memory_dispose(obs_pointer); obs_pointer = NULL; + memory_dispose(cdi_segment); cdi_segment = NULL; + memory_dispose(vor_orientation); vor_orientation = NULL; + memory_dispose(gs_dots); gs_dots = NULL; + memory_dispose(gs_pointer); gs_pointer = NULL; +} + + +/* Set the "no DME readout" status */ +static void hsi_reset_dme(waypoint *wp) +{ + wp->dme_response = -1.0; /* still no DME response */ + wp->dme_response_at = curTime; + wp->dme_response_dot = 0.0; + wp->dme = -1.0; /* still no DME estimation */ +} + + +void hsi_enable(viewer *u) +{ + int i; + hsi_data *hsi; + waypoint *wp; + + if( u->hsi == NULL ){ + + /* Allocate memory for HSI status: */ + if( free_list == NULL ){ + hsi = memory_allocate( sizeof(hsi_data), NULL ); + memory_registerCleanup(hsi_cleanup); + } else { + hsi = free_list; + free_list = hsi->next; + } + + /* Initialize: */ + hsi->idx = 0; + for( i = 0; i < HSI_NAV_MAX + HSI_RNAV_MAX; i++ ){ + wp = &hsi->wps[i]; + wp->frequency = navaid_VOR_CHANNEL_MIN; + wp->station = NULL; + wp->station_at = 0.0; + wp->radial = 0.0; + wp->obs = 0; + wp->is_wp = (i >= HSI_NAV_MAX); + wp->rho = 10; /* 1.0 NM */ + wp->theta = 0; + wp->id = NULL; + hsi_reset_dme(wp); + wp->radial_readout = 0.0; + wp->dme_readout = 0.0; + } + + u->hsi = hsi; + } else { + hsi = u->hsi; + } + + hsi->enabled = TRUE; +} + + +void hsi_disable(viewer *u) +{ + hsi_data *hsi; + + hsi = u->hsi; + if( hsi == NULL ) + return; + + hsi->enabled = FALSE; +} + + +static void hsi_retune(waypoint *wp) +{ + /* Reset VOR receiver: */ + wp->station = NULL; + wp->station_at = curTime; + wp->radial = 0.0; + wp->id = NULL; + wp->radial_readout = 0.0; + wp->dme_readout = 0.0; + + /* Reset DME receiver: */ + hsi_reset_dme(wp); +} + + + + +void hsi_update(viewer * u) +{ + navaid_Type *n; + VPoint v; + double d; + + hsi_data *hsi = u->hsi; + if( hsi == NULL || ! hsi->enabled ) + return; + + waypoint *wp = &hsi->wps[hsi->idx]; + + /* + * Determinate the station 'n', possibly re-scanning all the + * receivable stations at this freq. + */ + if( curTime < wp->station_at + RECEPTION_CHECK_INTERVAL ){ + n = wp->station; + + } else { + wp->station_at = curTime; + + n = navaid_reception_check(u->c, wp->frequency); + + if( n != NULL && wp->is_wp && (n->type & navaid_VOR) == 0 ){ + /* can't tune LOC in RNAV mode: */ + n = NULL; + } + } + + if( n == NULL ){ + /* no station found. */ + wp->station = NULL; + wp->id = NULL; + hsi_reset_dme(wp); + + } else if( wp->station != n ){ + /* Station change: */ + wp->station = n; + wp->id_update_at = curTime + ID_DELAY; + wp->id = NULL; + wp->radial = 0.0; + hsi_reset_dme(wp); + wp->dme_response_at = curTime; + + } else { + + /* Still the same station. Update station ID: */ + if( wp->id == NULL && curTime > wp->id_update_at ) + wp->id = n->id; + + /* Update occupied radial: */ + VTransform(&u->c->Sg, &n->lt, &v); + wp->radial = pm_heading(&v); + if( ! wp->is_wp ) + wp->radial_readout = wp->radial; + + /* Update DME: */ + if( (n->type & navaid_DME) != 0 + && curTime > wp->dme_response_at + DME_DELAY ){ + /* Got DME signal! */ + d = units_METERStoNM( VMagnitude(&v) ); + if( wp->dme_response >= 0.0 ){ + wp->dme_response_dot = (d - wp->dme_response) + / (curTime - wp->dme_response_at); + } + wp->dme_response = d; + wp->dme_response_at = curTime; + wp->dme = d; + + } else if( wp->dme_response >= 0.0 ){ + /* + No response from DME but previous data available. + Compute estimated value. + */ + wp->dme = fabs( wp->dme_response + + wp->dme_response_dot * (curTime - wp->dme_response_at) ); + } + + /* + * Update values to be read by pilot and HSI display: + */ + if( wp->is_wp ){ + /* + RNAV. Convert polar coords (dme,radial) relative + to the VOR/DME to polar coords (dme_readout,radial_readout) + relative to the WP: + */ + v.x = wp->dme * cos(wp->radial) - 0.1 * wp->rho * wp->cos_theta; + v.y = wp->dme * sin(wp->radial) - 0.1 * wp->rho * wp->sin_theta; + v.z = 0.0; + wp->radial_readout = pm_heading(&v); + wp->dme_readout = VMagnitude(&v); + + } else { + /* + * NAV. Simply copy better estimation of the + * distance: + */ + wp->dme_readout = wp->dme; + } + } +} + + +void hsi_switch_mode(viewer * u) +{ + hsi_data *hsi; + + hsi = u->hsi; + if( hsi == NULL || ! hsi->enabled ) + return; + + hsi->idx++; + if( hsi->idx >= HSI_NAV_MAX + HSI_RNAV_MAX ) + hsi->idx = 0; + + hsi_retune( &hsi->wps[ hsi->idx ] ); +} + + +static _BOOL is_auto_repeat( double *timeout ) +{ + _BOOL res; + + res = (curTime < *timeout); + *timeout = curTime + 0.1; + return res; +} + + +void hsi_frq_inc(viewer * u, int step) +{ + hsi_data *hsi; + waypoint *wp; + static double timeout = 0.0; + + hsi = u->hsi; + if( hsi == NULL || ! hsi->enabled ) + return; + + wp = &hsi->wps[hsi->idx]; + if( is_auto_repeat(&timeout) ) + step *= 2; + wp->frequency += step; + if( wp->frequency < navaid_VOR_CHANNEL_MIN ) + wp->frequency = navaid_VOR_CHANNEL_MIN; + if( wp->frequency > navaid_VOR_CHANNEL_MAX ) + wp->frequency = navaid_VOR_CHANNEL_MAX; + hsi_retune(wp); +} + + +void hsi_obs_inc(viewer * u, int step) +{ + hsi_data *hsi; + waypoint *wp; + static double timeout = 0.0; + + hsi = u->hsi; + if( hsi == NULL || ! hsi->enabled ) + return; + + wp = &hsi->wps[hsi->idx]; + if( is_auto_repeat(&timeout) ) + step *= 2; + wp->obs += step; + while( wp->obs < 0 ) + wp->obs += 360; + while( wp->obs >= 360 ) + wp->obs -= 360; +} + + +void hsi_theta_inc(viewer * u, int step) +{ + hsi_data *hsi; + waypoint *wp; + static double timeout = 0.0; + + hsi = u->hsi; + if( hsi == NULL || ! hsi->enabled ) + return; + + wp = &hsi->wps[hsi->idx]; + if( ! wp->is_wp ) + return; + if( is_auto_repeat(&timeout) ) + step *= 2; + wp->theta += step; + while( wp->theta < 0 ) + wp->theta += 360; + while( wp->theta >= 360 ) + wp->theta -= 360; + wp->cos_theta = cos( units_DEGtoRAD(wp->theta) ); + wp->sin_theta = sin( units_DEGtoRAD(wp->theta) ); + wp->dme_response_dot = 0.0; +} + + +void hsi_rho_inc(viewer * u, int step) +{ + hsi_data *hsi; + waypoint *wp; + static double timeout = 0.0; + + hsi = u->hsi; + if( hsi == NULL || ! hsi->enabled ) + return; + + wp = &hsi->wps[hsi->idx]; + if( ! wp->is_wp ) + return; + if( is_auto_repeat(&timeout) ) + step *= 5; + wp->rho += step; + if( wp->rho < 0 ) + wp->rho = 0; + if( wp->rho > 2000 /* 200 NM */ ) + wp->rho = 2000; + wp->dme_response_dot = 0.0; +} + + +int hsi_get_obs(viewer *u) +{ + hsi_data *hsi; + + hsi = u->hsi; + if( hsi == NULL || ! hsi->enabled ) + return 0; + + return hsi->wps[ hsi->idx ].obs; +} + + +_BOOL hsi_vor_radial(viewer *u, double *r) +{ + hsi_data *hsi; + waypoint *wp; + + hsi = u->hsi; + if( hsi == NULL || ! hsi->enabled ) + return FALSE; + + wp = &hsi->wps[ hsi->idx ]; + + if( wp->station == NULL + || (wp->station->type & navaid_VOR) == 0 ) + return FALSE; /* no station tuned */ + + if( wp->is_wp && wp->dme < 0.0 ) + return FALSE; /* RNAV can't compute */ + + *r = wp->radial_readout; + return TRUE; +} + + +_BOOL hsi_dme(viewer *u, double *dist) +{ + hsi_data *hsi; + waypoint *wp; + + hsi = u->hsi; + if( hsi == NULL || ! hsi->enabled ) + return FALSE; + + wp = &hsi->wps[ hsi->idx ]; + if( wp->station == NULL || wp->dme < 0.0 ) + return FALSE; + + *dist = wp->dme_readout; + return TRUE; +} + + +_BOOL hsi_loc_radial(viewer *u, double *r) +{ + hsi_data *hsi; + waypoint *wp; + + hsi = u->hsi; + if( hsi == NULL || ! hsi->enabled ) + return FALSE; + + wp = &hsi->wps[ hsi->idx ]; + + if( wp->station == NULL + || (wp->station->type & navaid_LOC) == 0 ) + return FALSE; + + *r = wp->radial_readout; + return TRUE; +} + + +_BOOL hsi_gs_offset(viewer *u, double *offset) +{ + hsi_data *hsi; + waypoint *wp; + VPoint p; + + hsi = u->hsi; + if( hsi == NULL || ! hsi->enabled ) + return FALSE; + + wp = &hsi->wps[ hsi->idx ]; + + if( wp->station == NULL + || (wp->station->type & navaid_GS) == 0 ) + return FALSE; + + VTransform(&u->c->Sg, &wp->station->gst, &p); + *offset = atan2(-p.z, p.x) - wp->station->slope; + return TRUE; +} + + +static void hsi_panel_string(viewer *u, double x, double y, double fh, + char *s1, char *s2, char *s3) +{ + double fw, fh2, fw2; + + fw = fh; + + fh2 = 1.5*fh; + fw2 = fh2; + + VDrawStrokeString(u->v, + (int) (x + 0.5), (int) (y + 0.5), + s1, strlen(s1), (int) (fh + 0.5), radarColor); + + VDrawStrokeString(u->v, + (int) (x + 13*fw - fw2*strlen(s2) + 0.5), (int) (y + 0.5), + s2, strlen(s2), (int) (fh2 + 0.5), whiteColor); + + VDrawStrokeString(u->v, + (int) (x + 14*fw + 0.5), (int) (y + 0.5), + s3, strlen(s3), (int) (fh + 0.5), radarColor); +} + + +void hsi_panel_draw(viewer * u) +{ + hsi_data *hsi; + waypoint *wp; + Alib_Window *w; + double x, y, fh, fw, il; + int f; + char s[100], r[100]; + + hsi = u->hsi; + if( hsi == NULL || ! hsi->enabled ) + return; + + wp = &hsi->wps[hsi->idx]; + + w = u->v->w; + Alib_setClipRect(w, &u->tuner); + Alib_fillRect(w, &u->tuner, panelBackgroundColor); + + fh = RectWidth(u->tuner) / 20.0; + fw = fh; + il = 1.2*fh*2.5; /* inter-line spacing */ + + x = u->tuner.a.x + fw; + y = u->tuner.a.y + il; + + /* + * Displays mode: + */ + if( wp->is_wp ) + sprintf(s, "RNAV%d", hsi->idx - HSI_NAV_MAX + 1); + else + sprintf(s, "NAV%d", hsi->idx + 1); + hsi_panel_string(u, x, y, fh, "Mode", s, ""); + y += il; + + /* + * Displays frequency + */ + f = 10800 + 5 * (wp->frequency - navaid_VOR_CHANNEL_MIN); + sprintf(s, "%d.%02d", f / 100, f % 100); + hsi_panel_string(u, x, y, fh, "FRQ", s, "MHz"); + y += il; + + /* + * Displays station ID: + */ + if( wp->id != NULL ) + strcpy(s, wp->station->id); + else + strcpy(s, "----"); + hsi_panel_string(u, x, y, fh, "STA", s, ""); + y += il; + + + /* + * Display DME: + */ + if( wp->dme >= 0.0 ){ + sprintf(s, "%0.1f", wp->dme_readout); + } else { + strcpy(s, "---.-"); + } + hsi_panel_string(u, x, y, fh, "DME", s, "NM"); + y += il; + + /* + * Displays WP setting: + */ + if( wp->is_wp ){ + sprintf(s, "%3d", wp->theta); + sprintf(r, "%d.%d", wp->rho / 10, wp->rho % 10); + } else { + strcpy(s, ""); + strcpy(r, ""); + } + hsi_panel_string(u, x, y, fh, "RAD", s, "DEG"); + y += il; + hsi_panel_string(u, x, y, fh, "DST", r, "NM"); + y += il; +} + + +static void add_dot(vpath_Type *p, double ox, double oy, double r) +{ + VPoint a, b, c, d; + + VSetPoint(&a, ox + r, oy, 0.0); + VSetPoint(&b, ox, oy + r, 0.0); + VSetPoint(&c, ox - r, oy, 0.0); + VSetPoint(&d, ox, oy - r, 0.0); + + vpath_moveTo(p, &a); + vpath_lineTo(p, &b); + vpath_lineTo(p, &c); + vpath_lineTo(p, &d); + vpath_lineTo(p, &a); +} + + +static void build_vpaths() +/* + * Build Vpats specific of the HSI. Every vpath is build over the xy plane in + * screen coords.: x=right, y=down. Vpaths that have a circular symmetry or + * need to be rotated, are build around the origin (0,0) and have a radius + * of 1.0 so that they can be easily rotated, scaled and translated to the + * final screen location. + */ +{ + int i; + double l1, l2, l3, dev; + + if( obs_pointer != NULL ) + return; /* all the vpats already done */ + + /* + * Build obs_pointer, including CDI scale + */ + + l1 = 0.06; /* OBS pointer half-width */ + l2 = 0.60; /* CDI segment half-length */ + + obs_pointer = vpath_new(); + vpath_moveTo(obs_pointer, &(VPoint){0.0, -1.00, 0.0}); + vpath_lineTo(obs_pointer, &(VPoint){ l1, -1.00+3.0*l1, 0.0}); + vpath_lineTo(obs_pointer, &(VPoint){ l1, -l2, 0.0}); + vpath_lineTo(obs_pointer, &(VPoint){ -l1, -l2, 0.0}); + vpath_lineTo(obs_pointer, &(VPoint){ -l1, -1.00+3.0*l1, 0.0}); + vpath_lineTo(obs_pointer, &(VPoint){0.0, -1.00, 0.0}); + + vpath_moveTo(obs_pointer, &(VPoint){l1, l2, 0.0}); + vpath_lineTo(obs_pointer, &(VPoint){l1, 1.0, 0.0}); + vpath_lineTo(obs_pointer, &(VPoint){-l1, 1.0, 0.0}); + vpath_lineTo(obs_pointer, &(VPoint){-l1, l2, 0.0}); + vpath_lineTo(obs_pointer, &(VPoint){l1, l2, 0.0}); + + for( i = 1; i <= CDI_DOT_NO; i++ ){ + dev = i * CDI_DOT_STEP * CDI_DOT_K; + + add_dot(obs_pointer, dev, 0.0, 0.03); + add_dot(obs_pointer, -dev, 0.0, 0.03); + } + + /* + * Build CDI segment + */ + + cdi_segment = vpath_new(); + vpath_moveTo(cdi_segment, &(VPoint){l1, -l2, 0.0}); + vpath_lineTo(cdi_segment, &(VPoint){l1, l2, 0.0}); + vpath_lineTo(cdi_segment, &(VPoint){-l1, l2, 0.0}); + vpath_lineTo(cdi_segment, &(VPoint){-l1, -l2, 0.0}); + vpath_lineTo(cdi_segment, &(VPoint){l1, -l2, 0.0}); + + /* + * Build VOR orientation indicator + */ + + vor_orientation = vpath_new(); + vpath_moveTo(vor_orientation, &(VPoint){0.0, -0.50, 0.0}); + vpath_lineTo(vor_orientation, &(VPoint){2.0*l1, -0.50 + 2.0*l1, 0.0}); + vpath_lineTo(vor_orientation, &(VPoint){-2.0*l1, -0.50 + 2.0*l1, 0.0}); + vpath_lineTo(vor_orientation, &(VPoint){0.0, -0.50, 0.0}); + + /* + * Build GS scale + */ + + gs_dots = vpath_new(); + add_dot(gs_dots, 0.0, 0.0, 0.05); + add_dot(gs_dots, 0.0, 0.5, 0.03); + add_dot(gs_dots, 0.0, 1.0, 0.03); + add_dot(gs_dots, 0.0, -0.5, 0.03); + add_dot(gs_dots, 0.0, -1.0, 0.03); + + /* + * Build GS pointer + */ + + l3 = 0.10; + gs_pointer = vpath_new(); + vpath_moveTo(gs_pointer, &(VPoint){0.0, 0.0, 0.0}); + vpath_lineTo(gs_pointer, &(VPoint){-l3, 2.0*l3, 0.0}); + vpath_lineTo(gs_pointer, &(VPoint){-l3, -2.0*l3, 0.0}); + vpath_lineTo(gs_pointer, &(VPoint){0.0, 0.0, 0.0}); +} + + +void hsi_draw(viewer * u) +{ + hsi_data *hsi; + waypoint *wp; + Alib_Window *w; + Alib_Pixel white, magenta; + int xc, yc, h, x, y; + int vor_orient; + VMatrix m; + double scale, obs_scale, gs_scale, hdg, gs_offset, r, diff, dev; + char s[8]; + + hsi = u->hsi; + if( hsi == NULL || ! hsi->enabled ) + return; + + wp = &hsi->wps[hsi->idx]; + + w = u->w; + Alib_setClipRect(w, &u->indicator); + Alib_fillRect(w, &u->indicator, panelBackgroundColor); + + build_vpaths(); + white = whiteColor; + magenta = magentaColor; + + x = u->indicator.a.x; + y = u->indicator.a.y; + scale = RectWidth(u->indicator); + r = 0.44*scale; + obs_scale = 0.80 * r; + gs_scale = 0.60 * r; + + xc = x + (int) (0.48*scale+0.5); + yc = y + (int) (0.50*scale+0.5); + + if (u->c->showMag) + hdg = pm_mag_heading(u->c); + else + hdg = u->c->curHeading; + + h = (int) (0.045*scale + 0.5); + + /* + * Displays "TH" or "MH" + */ + VDrawStrokeString(u->v, + x + (int) (0.05*scale+0.5), y + (int) (0.06*scale), + (u->c->showMag)? "MH":"TH", 2, h, whiteColor); + + /* + * Display the OBS value. + */ + VDrawStrokeString(u->v, + x + (int) (0.85*scale), y + (int) (0.06*scale), + "OBS", 3, h, whiteColor); + sprintf(s, "%03d", wp->obs); + VDrawStrokeString(u->v, + x + (int) (0.85*scale), y + (int) (0.13*scale), + s, 3, h, whiteColor); + + /* Draw compass scale: */ + VIdentMatrix(&m); + VRotate(&m, ZRotation, -hdg); + VScaleMatrix(&m, r, r, r); + VTranslate(&m, xc, yc, -1.0); + vpath_stroke( vpath_gallery_get_compass_scale(), &m, w, white); + + /* Draw compass fixed scale: */ + VIdentMatrix(&m); + VScaleMatrix(&m, r/0.90, r/0.90, r/0.90); + VTranslate(&m, xc, yc, -1.0); + vpath_stroke( vpath_gallery_get_compass_fixed_scale(), &m, w, white); + + /* Draw stylized aircraft: */ + VIdentMatrix(&m); + VScaleMatrix(&m, 0.25*r, 0.20*r, 0.25*r); + VTranslate(&m, xc, yc, -1.0); + vpath_stroke( vpath_gallery_get_stylized_aircraft(), &m, w, white); + + /* Draw OBS pointer with CDI scale: */ + VIdentMatrix(&m); + VRotate(&m, ZRotation, units_DEGtoRAD(wp->obs) - hdg); + VScaleMatrix(&m, obs_scale, obs_scale, obs_scale); + VTranslate(&m, xc, yc, -1.0); + vpath_stroke( obs_pointer, &m, w, white); + + +/* + * Draw the Course Deviation Indicator + */ + + if( wp->station != NULL + && wp->station->type & (navaid_VOR|navaid_LOC) + && (! wp->is_wp || wp->dme >= 0.0) ) { + +/* + * Full localizer/SDF offsets will vary based on the beam width of the + * transmitter (typical localizer values are 3 to 6 degrees). + * + * VOR offsets are 1.7 degrees per dot on the HSI. + * ILS course offsets are 0.4 degrees per dot. + */ + + diff = wp->radial_readout; + + if( wp->station->type & navaid_LOC ){ + /* + * Calculate actual angular deviation from the + * LOCATOR as angle between -M_PI and +M_PI: + */ + if( diff > M_PI ) + diff = diff - 2*M_PI; + + vor_orient = 0; + } + else { + diff = diff - units_DEGtoRAD(wp->obs); + + /* + * Calculate actual angular deviation from the + * selected OBS as angle between -M_PI and +M_PI: + */ + if( diff > M_PI ){ + diff = diff - 2*M_PI; + } + else if( diff < -M_PI ){ + diff = 2*M_PI + diff; + } + + if( fabs(diff) <= M_PI/2 ){ + /* + * We are in the "FROM" half-plane: + */ + vor_orient = -1; + diff = -diff; + } else { + /* + * We are in the "TO" half-plane. Reduce + * angular reviation relative to the + * complementar radial OBS+M_PI: + */ + vor_orient = 1; + if( diff > 0 ) + diff = diff - M_PI; + else + diff = M_PI + diff; + } + + } + + /* Draw CDI segment: */ + VIdentMatrix(&m); + + /* Little hack for LOC CDI: increase sensibility from CDI_DOT_STEP + to 0.4 DEG/DOT: */ + if( wp->station->type & navaid_LOC ){ + diff *= CDI_DOT_STEP / units_DEGtoRAD(0.4); + } + + if( diff > CDI_MAX_DEVIATION ) + dev = CDI_MAX_DEVIATION; + else if( diff < -CDI_MAX_DEVIATION ) + dev = -CDI_MAX_DEVIATION; + else + dev = diff; + + VTranslate(&m, CDI_DOT_K * dev, 0.0, 0.0); + VRotate(&m, ZRotation, units_DEGtoRAD(wp->obs) - hdg); + VScaleMatrix(&m, obs_scale, obs_scale, obs_scale); + VTranslate(&m, xc, yc, -1.0); + vpath_stroke( cdi_segment, &m, w, magenta); + + /* Draw VOR TO/FROM indicator: */ + if( vor_orient != 0 ){ + + VIdentMatrix(&m); + + if( vor_orient == 1 ){ + + VRotate(&m, ZRotation, units_DEGtoRAD(wp->obs) - hdg); + + } else if( vor_orient == -1 ){ + + VRotate(&m, ZRotation, units_DEGtoRAD(wp->obs) - hdg + M_PI); + } + + VScaleMatrix(&m, obs_scale, obs_scale, obs_scale); + VTranslate(&m, xc, yc, -1.0); + vpath_stroke( vor_orientation, &m, w, white); + } + + } + + /* Draw the Glide Slope scale: */ + VIdentMatrix(&m); + VScaleMatrix(&m, gs_scale, gs_scale, gs_scale); + VTranslate(&m, xc + 1.15*r, yc, -1.0); + vpath_stroke(gs_dots, &m, w, white); + + /* Draw the Glide Slope Deviation Indicator: */ + if( wp->station != NULL && wp->station->type & navaid_GS ){ + + if( ! hsi_gs_offset(u, &gs_offset) ) { } + gs_offset = -gs_offset; + + if( gs_offset > GS_OFFSET_MAX ) + dev = GS_OFFSET_MAX; + else if( gs_offset < -GS_OFFSET_MAX ) + dev = -GS_OFFSET_MAX; + else + dev = gs_offset; + + VIdentMatrix(&m); + VTranslate(&m, 0.0, -dev*GS_OFFSET_K, 0.0); + VScaleMatrix(&m, gs_scale, gs_scale, gs_scale); + VTranslate(&m, xc + 1.10*r, yc, -1.0); + vpath_stroke(gs_pointer, &m, w, magenta); + } +} + + +void hsi_free(viewer *u) +{ + hsi_data *hsi; + + hsi = u->hsi; + if( hsi == NULL ) + return; + + hsi->next = free_list; + free_list = u->hsi; + u->hsi = NULL; +} diff -Nru acm-5.0/src/acm/hsi.h acm-6.0+20200416/src/acm/hsi.h --- acm-5.0/src/acm/hsi.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/hsi.h 2017-07-20 16:01:32.000000000 +0000 @@ -0,0 +1,154 @@ +/* + * acm : an aerial combat simulator for X + * HSI tuner and HSI indicator module + * Copyright (C) 1991-1998 Riley Rainey + * Copyright (C) 2007 Umberto Salsi + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +/** + * HSI panel. + * + * The HSI panel receives signals from VOR, DME, LOCATOR and GS stations, + * then it feeds the data to the HSI display (course deviation indicator and + * glide slope deviation indicator). For VOR+DME stations, implements also + * the RNAV computer. + * + * VOR, LOC and GS antennas all transmit a continuous signal that gives + * angular informations. On the contrary, DME stations provide their response + * to the transponder on board at random intervals of time, so the distance + * has to be extrapolated in order to feed with continuous values the RNAV + * calculator. Nevertheless DME and expecially CDI indications calculated + * on WP by the RANV computer are quite unstable. + * + * BEWARE. In the following functions hsi_xxx_inc(u, step) usually the value + * of the step should be +1 (increment) or -1 (decrement) simply to indicate + * the direction of the change. Every function internally implements an + * auto-repeat detection feature that speeds-up this otherwise very slow + * interface. If the auto-repeat gets detected, the increment actually + * applied gets multiplied by a factor that ranges from 2 up to 20. + * + * @file + */ + +#ifndef _hsi_h +#define _hsi_h + +#include "pm.h" + +#ifdef hsi_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +/** + * Enables the HSI for this particular viewer. If u->hsi is NULL, + * instantiate with a pointer to internal data. + */ +EXTERN void hsi_enable(viewer *u); + +/** + * Disables the HSI for this particular viewer. If u->hsi is NULL, + * instantiate with a pointer to internal data. + */ +EXTERN void hsi_disable(viewer *u); + +/** + * Release HSI data u->hsi. + */ +EXTERN void hsi_free(viewer *u); + +/** + * Loops between NAV1, NAV2, RNAV1, ... modes. + */ +EXTERN void hsi_switch_mode(viewer *u); + +/** + * Increment station frequency by step channels. VOR/ILS/DME channels ranges + * from 0 (108.00 MHz) up to 199 (117.95 MHz) by steps of 1 (0.05 MHz). + */ +EXTERN void hsi_frq_inc(viewer *u, int step); + +/** + * Increment OBS pointer by 'step' DEG. + */ +EXTERN void hsi_obs_inc(viewer *u, int step); + +/** + * Increment waypoint theta angle by 'step' DEG. + */ +void hsi_theta_inc(viewer *u, int step); + +/** + * Increment waypoint distance from VOR by 'step' tenth of NM. + */ +EXTERN void hsi_rho_inc(viewer *u, int step); + +/** + * Updates the internal state of the HSI. Does nothing if no HSI enabled in this + * viewer. + * @param u + */ +EXTERN void hsi_update(viewer * u); + +/** + * Draw HSI tuner panel (uses the TEWS panel). If no HSI active in this viewer, + * do nothing. + */ +EXTERN void hsi_panel_draw(viewer * u); + +/** + * Draw HSI compass, OBS, CDI and GS (uses the radar panel). If no HSI + * active in this viewer, do nothing. + */ +EXTERN void hsi_draw(viewer * u); + +/** + * Return the currently selected OBS, or 0 if HSI not active. + */ +EXTERN int hsi_get_obs(viewer *u); + +/** + * Return in 'r' the radial (RAD) occupied by the aircraft in the VOR or + * WP horizontal plane xy, with x aligned with the magnetic north at the + * station location, y oriented magnetic east, -PI≤r≤PI. Return FALSE + * if no station tuned in the HSI or not a VOR and neither a WP. + */ +EXTERN _BOOL hsi_vor_radial(viewer *u, double *r); + +/** + * Return in 'r' the radial (RAD) occupied by the aircraft in the LOCATOR + * plane xy, with x aligned with the LOCATOR bearing, i.e. r==0 means we + * are aligned with LOC. Return FALSE if no station tuned in the HSI or + * not a LOCATOR. + */ +EXTERN _BOOL hsi_loc_radial(viewer *u, double *r); + +/** + * Return in 'dist' the distance (NM) from the DME/ILS-DME station or WP + * currently selected in the HSI panel. Return FALSE if HSI not enabled or + * no DME available. + */ +EXTERN _BOOL hsi_dme(viewer *u, double *dist); + +/** + * Return the offset angle (RAD) from the GS plane, positive if the aircraft + * is too high. Return FALSE if no station tuned in the HSI or not an ILS. + */ +EXTERN _BOOL hsi_gs_offset(viewer *u, double *offset); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/hud.c acm-6.0+20200416/src/acm/hud.c --- acm-5.0/src/acm/hud.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/hud.c 2017-10-25 11:21:28.000000000 +0000 @@ -0,0 +1,1039 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1998 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#include +#include +#include +#include + +#include "../util/memory.h" +#include "../util/units.h" +#include "../util/zulu.h" +#include "aps.h" +#include "damage.h" +#include "draw.h" +#include "m61a1.h" +#include "pm.h" +#include "vpath.h" +#include "weapon.h" + +#define hud_IMPORT +#include "hud.h" + +#define DESIGNATOR_SIZE 20 + +#define HUD(u) ((hud_Type *)u->hud) + +static int blink = 0; +static double blink_toggle_time = 0.0; + + +typedef struct _hud_data { + struct _hud_data *next; + + _BOOL enabled; + + int timer_op; /* timer operation: 0=do not display, 1=run, 2=stop */ + int timer_freezed; /* store the time when timer_op is 2 */ + double timer_offset; /* store the offset time when timer_op is 1 or 2 */ +} hud_Type; + + +static hud_Type *free_list = NULL; + +static vpath_Type + * hud_vpath = NULL, + * fpm_vpath = NULL; + + +static void hud_cleanup() +{ + hud_Type *hud; + + while( free_list != NULL ){ + hud = free_list; + free_list = free_list->next; + memory_dispose(hud); + } + + memory_dispose(hud_vpath); + memory_dispose(fpm_vpath); +} + + +void hud_enable(viewer *u) +{ + hud_Type *hud; + + if( u->hud == NULL ){ + if( free_list == NULL ){ + hud = memory_allocate( sizeof(hud_Type), NULL ); + memory_registerCleanup(hud_cleanup); + } else { + hud = free_list; + free_list = hud->next; + hud->next = NULL; + } + hud->next = NULL; + hud->timer_op = 0; + u->hud = hud; + } + HUD(u)->enabled = TRUE; +} + + +void hud_disable(viewer *u) +{ + if( u->hud == NULL ) + return; + HUD(u)->enabled = FALSE; +} + + + +void +hud_timer_toggle(viewer *u) +/* + Actually, it cycles between the states timer_op 0, 1 and 2. +*/ +{ + if( u->hud == NULL || !HUD(u)->enabled ) + return; + + HUD(u)->timer_op = (HUD(u)->timer_op + 1) % 3; + + if ( HUD(u)->timer_op == 1 ) { + HUD(u)->timer_offset = curTime; + + } else if ( HUD(u)->timer_op == 2 ) { + HUD(u)->timer_freezed = (int) (curTime - HUD(u)->timer_offset + 0.5); + + } +} + + +static void +doBankIndicator(craft * c, viewer * u) +{ + double xscale, yscale, r, r2, r3, r4, cosa, sina, bank, + x1, y1, x2, y2, x3, y3; + int x0, y0, a, blink_bank; + draw_Type *dd; + + xscale = u->xscaleFactor; + yscale = u->yscaleFactor; + r = 200.0 * xscale; /* tick mark start radius */ + r2 = 1.05*r; /* tick mark end radious */ + r3 = 0.99*r; + r4 = 0.94*r; + x0 = u->v->focus.x; + y0 = u->v->focus.y + (int) (-150.0*yscale + r); + dd = draw_new(); + VSetClipRect(u->v, &u->v->rect); + + for( a = -30; a <= 30; a += 10 ){ + cosa = cos( units_DEGtoRAD(a) ); + sina = sin( units_DEGtoRAD(a) ); + draw_segment(dd, x0 + sina*r, y0 - cosa*r, x0 + sina*r2, y0 - cosa*r2); + } + + bank = c->curRoll; + blink_bank = 0; + if( bank < units_DEGtoRAD(-40) ){ + bank = units_DEGtoRAD(-40); + blink_bank = blink; + } else if( bank > units_DEGtoRAD(+40) ){ + bank = units_DEGtoRAD(+40); + blink_bank = blink; + } + if( ! blink_bank ){ + x1 = x0 + sin(bank)*r3; + y1 = y0 - cos(bank)*r3; + x2 = x0 + sin(bank + units_DEGtoRAD(2))*r4; + y2 = y0 - cos(bank + units_DEGtoRAD(2))*r4; + x3 = x0 + sin(bank - units_DEGtoRAD(2))*r4; + y3 = y0 - cos(bank - units_DEGtoRAD(2))*r4; + draw_segment(dd, x1, y1, x2, y2); + draw_segment(dd, x1, y1, x3, y3); + draw_segment(dd, x2, y2, x3, y3); + } + + draw_stroke(dd, u->v, HUDColor); + draw_free(dd); +} + + +#define TurnAndSlipIndicatorWidth 100 + + +static void +doTurnAndSlipIndicator(craft * c, viewer * u) +/* + Displays the rate of turn (DEG/s), the lateral acceleration (g) + and a timer (s). +*/ +{ + double xscale, yscale, w; + int tx, ty, t, blink_turn, blink_w; + int w_tick; + int w_t; + double a; + draw_Type *dd; + int h, m, s; + char buffer[20]; + Alib_Pixel color; + + xscale = u->xscaleFactor; + yscale = u->yscaleFactor; + w_t = (int) (xscale * TurnAndSlipIndicatorWidth / 2.0); + w_tick = (int) (xscale * TurnAndSlipIndicatorWidth / 4.0); + tx = u->v->focus.x - (int) (xscale * 160); + ty = u->v->focus.y + (int) (yscale * 200); + dd = draw_new(); + VSetClipRect(u->v, &u->v->rect); + color = HUDColor; + + /* + Draw scale: + */ + w = 6 * yscale; + draw_segment(dd, tx-w_t, ty, tx+w_t, ty); + draw_segment(dd, tx-w_t, ty, tx-w_t, ty-w); /* -3.0 DEG/s */ + draw_segment(dd, tx-w_tick, ty, tx-w_tick, ty-w); /* -1.5 DEG/s */ + draw_segment(dd, tx, ty, tx, ty-w); /* 0 DEG/s */ + draw_segment(dd, tx+w_tick, ty, tx+w_tick, ty-w); /* +1.5 DEG/s */ + draw_segment(dd, tx+w_t, ty, tx+w_t, ty-w); /* +3.0 DEG/s */ + + /* + Draw turn rate needle: + */ + a = units_RADtoDEG( (c->q*sin(c->curRoll) + c->r*cos(c->curRoll)) + / cos(c->curPitch) ); + blink_turn = 0; + if( a > 3.5 ){ + a = 3.5; + blink_turn = blink; + } else if( a < -3.5 ){ + a = -3.5; + blink_turn = blink; + } + if( ! blink_turn ){ + int x0 = tx + a / 3.0 * w_t; + int y0 = ty - 4 * yscale; + w = 4 * xscale; + draw_segment(dd, x0 - w, y0, x0 - w - w, y0 - w); + draw_segment(dd, x0 - w - w, y0 - w, x0 + w + w, y0 - w); + draw_segment(dd, x0 + w + w, y0 - w, x0 + w, y0); + } + + /* + Draw lateral accel. needle: + */ + a = c->G.y; + blink_turn = 0; + if( a < -0.5 ){ + a = -0.5; + blink_turn = blink; + } else if( a > 0.5 ){ + a = 0.5; + blink_turn = blink; + } + if( ! blink_turn ){ + t = tx - (int) rint(2.0*a*w_t); + draw_segment(dd, t, ty+2*yscale, t, ty+9*yscale); + } + if( aps_ac_enabled(c) + && ( ! aps_ac_warn(c) || ! blink ) ){ + VDrawStrokeString(u->v, + tx - w_t, ty + (int) (yscale * 12), + "AC", 2, + xscale * 8.0, color); + } + + draw_stroke(dd, u->v, HUDColor); + draw_free(dd); + + /* + Draw AutoTurn status: + */ + if ( aps_aw_enabled(c) + && ( ! aps_aw_warn(c) || ! blink ) ){ + + w = aps_aw_get(c); + + blink_w = FALSE; + + if( w < units_DEGtoRAD(-3.1) ){ + w = units_DEGtoRAD(-3.0); + blink_w = blink; + } else if( w > units_DEGtoRAD(3.1) ){ + w = units_DEGtoRAD(3.0); + blink_w = blink; + } + + if ( ! blink_w ) + VDrawStrokeString(u->v, + tx + (int) (w * w_t / units_DEGtoRAD(3.0) - xscale * 6.0 + 0.5), + ty + (int) (yscale * 4.0 + 0.5), + "o", 1, xscale * 12.0, color); + } + + /* + Draw timer: + */ + + if ( HUD(u)->timer_op == 0 ) { + return; + + } else if ( HUD(u)->timer_op == 1 ) { + t = (int) (curTime - HUD(u)->timer_offset); + + } else { + t = HUD(u)->timer_freezed; + } + + if (t >= 3600) { + h = t / 3600; + t = t % 3600; + m = t / 60; + s = t % 60; + sprintf(buffer, "%d:%02d:%02d", h, m, s); + } else if (t >= 60) { + m = t / 60; + s = t % 60; + sprintf(buffer, "%d:%02d", m, s); + } else { + sprintf(buffer, "%d", t); + } + + VDrawStrokeString(u->v, tx - w_t, ty + (int) (yscale * 30.0), + buffer, strlen(buffer), + yscale * 12.0, color); +} + + +static void draw_dashed_line(vpath_Type *p, VPoint *a, VPoint *b, int n) +{ + int i; + VPoint c, d; + + n = 2*n - 1; + c = *a; + for( i = 1; i <= n; i++ ){ + VSetPoint(&d, + a->x + i*(b->x - a->x)/n, + a->y + i*(b->y - a->y)/n, + a->z + i*(b->z - a->z)/n); + if( (i & 1) == 1 ){ + vpath_moveTo(p, &c); + vpath_lineTo(p, &d); + } else { + c = d; + } + } +} + + +static vpath_Type * build_hud_vpath() +{ + vpath_Type * p; + int angle, s_len; + VPoint a, b, c; + VMatrix m, n; + char s[10]; + double fw, fh; + + p = vpath_new(); + + /**** Bare cross: + vpath_moveTo(p, &(VPoint){-0.1, 0.0, 1.0}); + vpath_lineTo(p, &(VPoint){+0.1, 0.0, 1.0}); + + vpath_moveTo(p, &(VPoint){0.0, 0.1, 1.0}); + vpath_lineTo(p, &(VPoint){0.0, -0.1, 1.0}); + + return p; + ****/ + +/* + Since the HUD pitch ladder is drawn over a sphere of radius 1.0, + it is convenient representing all the distances as angles under + which every item can be seen from the center of the sphere. + + + . + | + +---------- . v...--------+ 15 + | | D . | . + | | ............| . + . ^ . . . + | . . . + .<--A-->. . . + | . . + .<------B------>. . + | . + .<--------D-------->. + | +*/ + +#define A units_DEGtoRAD(1.0) /* ladder inner point */ +#define B units_DEGtoRAD(2.0) /* ladder outer point */ +#define C units_DEGtoRAD(0.5) /* ladder "comma" */ +#define D units_DEGtoRAD(2.5) /* label yaw angle */ + + /* Draw horizon line, right side: */ + VSetPoint(&a, cos(A), sin(A), 0.0); + VSetPoint(&b, cos(2*B), sin(2*B), 0.0); + vpath_moveTo(p, &a); + vpath_lineTo(p, &b); + + /* Draw horizon line, left side: */ + a.y = -a.y; + b.y = -b.y; + vpath_moveTo(p, &a); + vpath_lineTo(p, &b); + + /* Draw ladder pitch marks, step 5 DEG: */ + + fh = sin(units_DEGtoRAD(0.7)); + fw = sin(units_DEGtoRAD(0.4)); + + for( angle = -85; angle <= 85; angle += 5 ){ + + if( angle == 0 ) + continue; + + VIdentMatrix(&m); + VRotate(&m, YRotation, units_DEGtoRAD(angle)); + + /* Draw the right side of the ladder peg: */ + VSetPoint(&a, cos(A), sin(A), 0.0); + VSetPoint(&b, cos(B), sin(B), 0.0); + VSetPoint(&c, cos(B), sin(B), sin(C)); + if( angle < 0 ) + c.z = -c.z; + + VTransform(&a, &m, &a); + VTransform(&b, &m, &b); + VTransform(&c, &m, &c); + + if( angle > 0 ){ + vpath_moveTo(p, &a); + vpath_lineTo(p, &b); + vpath_lineTo(p, &c); + } else { + draw_dashed_line(p, &a, &b, 3); + vpath_moveTo(p, &b); + vpath_lineTo(p, &c); + } + + /* Reverse y, then draw the left side of the peg: */ + a.y = -a.y; + b.y = -b.y; + c.y = -c.y; + + if( angle > 0 ){ + vpath_moveTo(p, &a); + vpath_lineTo(p, &b); + vpath_lineTo(p, &c); + } else { + draw_dashed_line(p, &a, &b, 3); + vpath_moveTo(p, &b); + vpath_lineTo(p, &c); + } + + /* Now the label, right side: */ + sprintf(s, "%d", abs(angle)); + s_len = strlen(s); + VIdentMatrix(&n); + VScaleMatrix(&n, fw, fh, 1.0); + VRotate(&n, XRotation, units_DEGtoRAD(90)); + VRotate(&n, ZRotation, units_DEGtoRAD(90)); + VTranslate(&n, 1.0, sin(D) - 0.5*s_len*fw, 0.5*fh); + VMatrixMult(&n, &m, &n); + vpath_draw_string(p, s, s_len, &n); + + /* Label, left side: */ + VTranslate(&n, 0.0, -2.0*sin(D), 0.0); + vpath_draw_string(p, s, s_len, &n); + + } + + /* -1, -2 and -3 pitch marks: */ + for( angle = -1; angle >= -3; angle-- ){ + + VIdentMatrix(&m); + VRotate(&m, YRotation, units_DEGtoRAD(angle)); + + /* Draw the right side of the ladder peg: */ + VSetPoint(&a, cos(A), sin(A), 0.0); + VSetPoint(&b, cos(B), sin(B), 0.0); + VTransform(&a, &m, &a); + VTransform(&b, &m, &b); + draw_dashed_line(p, &a, &b, 3); + + /* Reverse y, then draw the left side of the peg: */ + a.y = -a.y; + b.y = -b.y; + draw_dashed_line(p, &a, &b, 3); + } + + return p; +} + + +static vpath_Type * build_fpm_vpath() +{ + #define FPM_A_STEP 45 /* DEG */ + vpath_Type *p; + int a; + + p = vpath_new(); + + vpath_moveTo(p, &(VPoint){0.0, 0.0, 1.0}); + + for( a = FPM_A_STEP; a <= 360; a += FPM_A_STEP ){ + vpath_lineTo(p, &(VPoint){0.0, sin(units_DEGtoRAD(a)), cos(units_DEGtoRAD(a))}); + } + + vpath_moveTo(p, &(VPoint){0.0, 0.0, -1.0}); + vpath_lineTo(p, &(VPoint){0.0, 0.0, -2.0}); + + vpath_moveTo(p, &(VPoint){0.0, 1.0, 0.0}); + vpath_lineTo(p, &(VPoint){0.0, 2.0, 0.0}); + + vpath_moveTo(p, &(VPoint){0.0, -1.0, 0.0}); + vpath_lineTo(p, &(VPoint){0.0, -2.0, 0.0}); + + return p; +} + + +#define LADDER_WIDTH 325.0 +#define LADDER_HEIGHT 430.0 + + +static void +doLadder(craft * c, viewer * u, double vel) +{ + + _BOOL plotFPM; + int windX, windY, w, tx, ty, x, y; + VPoint tmp, tmp1, t1; + VMatrix m; + double v, d; + Alib_Rect rect; + Alib_Pixel color; + + tx = (int) (LADDER_WIDTH * u->xscaleFactor * 0.5 + 0.5); + ty = (int) (LADDER_HEIGHT * u->yscaleFactor + 0.5); + Alib_setRect(&rect, u->v->focus.x - tx, u->hud_yCenter - 0.37 * ty, + u->v->focus.x + tx, u->hud_yCenter + 0.63 * ty); + VSetClipRect(u->v, &rect); + if( Alib_isEmptyRect(&u->v->rect) ) + return; + + color = HUDColor; + +/* + * Build a transformation matrix to be used to display the flight + * path ladder (artificial horizon). + * + * One thing we do is to keep the ladder centered on the flight path + * marker. The correction angle "v" is calculated to make that happen. + */ + + if (fabs(c->Cg.x) < 5.0 && fabs(c->Cg.y) < 5.0) { + v = 0.0; + } + else { + t1.x = cos(c->curHeading) * c->Cg.x + + sin(c->curHeading) * c->Cg.y; + t1.y = -sin(c->curHeading) * c->Cg.x + + cos(c->curHeading) * c->Cg.y; + v = atan2(t1.y, t1.x); + } + + if( hud_vpath == NULL ){ + hud_vpath = build_hud_vpath(); + fpm_vpath = build_fpm_vpath(); + } + + VIdentMatrix(&m); + VRotate(&m, ZRotation, v); + VRotate(&m, YRotation, -c->curPitch); + VRotate(&m, XRotation, -c->curRoll); + VRotate(&m, ZRotation, units_DEGtoRAD(-90)); + VRotate(&m, XRotation, units_DEGtoRAD(-90)); + vpath_perspective_stroke(hud_vpath, &m, u->v, color); + +/* + * Determine the location of the flight path marker + */ + + VReverseTransform_(&c->Cg, &c->trihedral, &tmp); + + + if (vel < 50.0 || tmp.x == 0.0) { + plotFPM = ! blink; + windX = u->v->focus.x; + windY = u->v->focus.y; + } + else if (tmp.x > 0.0) { + plotFPM = TRUE; + windX = u->v->focus.x + ((int) (tmp.y * u->v->Scale.x / tmp.x) / 4); + windY = u->v->focus.y + ((int) (tmp.z * u->v->Scale.y / tmp.x) / 4); + } + else { + plotFPM = FALSE; + windX = 0.0; + windY = 0.0; + } + + if (plotFPM) { + + d = 8.0 * u->xscaleFactor; + VIdentMatrix(&m); + VScaleMatrix(&m, d, d, d); + VRotate(&m, ZRotation, units_DEGtoRAD(-90)); + VRotate(&m, XRotation, units_DEGtoRAD(-90)); + VTranslate(&m, windX, windY, -1.0); + vpath_stroke(fpm_vpath, &m, u->w, color); + + } + +/* + * Gather weapon display info (and maybe draw a reticle). + * + * WARNING. This function must be called before drawing the target + * designator, as this will also set the m61a1_lcos_last_post global + * variable that will be used next. + */ + + weapon_displaySelected(c, u, (int) floor(windX), (int) floor(windY)); + +/* + * Draw a target designator around the current primary radar target. + */ + + if (c->curRadarTarget >= 0) { + + w = (int) (DESIGNATOR_SIZE * u->xscaleFactor); + + VTransform(&ptbl[c->curRadarTarget].Sg, &c->XYZtoNED, &tmp1); + VReverseTransform_(&tmp1, &c->trihedral, &tmp); + +/* radar target is assumed to be ahead of us (tmp.z > 0.0) */ + + tx = (u->v->Middl.x + (((int) (tmp.y * u->v->Scale.x / tmp.x)))) >> 2; + ty = (u->v->Middl.y + (((int) (tmp.z * u->v->Scale.y / tmp.x)))) >> 2; + + +/* + * If the LCOS reticule was drawn by weapon_displaySelected(), then + * m61a1_lcos_last_pos contains its position on the screen. We avoid to + * draw the target designator if this latter is too close to the LCOS. + * + * If no LCOS reticle was plotted or if the distance to the LCOS reticle is + * sufficient, then plot a radar target designator box. + */ + + if( c->curWeapon == weapon_M61A1 ){ + x = m61a1_lcos_last_pos.x; + y = m61a1_lcos_last_pos.y; + d = sqrt((double) ((x - tx) * (x - tx) + (y - ty) * (y - ty))); + } + + if( c->curWeapon != weapon_M61A1 || d > w * 2.5 ){ + draw_Type *dd; + + dd = draw_new(); + draw_segment(dd, tx - w, ty - w, tx + w, ty - w); + draw_segment(dd, tx + w, ty - w, tx + w, ty + w); + draw_segment(dd, tx + w, ty + w, tx - w, ty + w); + draw_segment(dd, tx - w, ty + w, tx - w, ty - w); + draw_stroke(dd, u->v, color); + draw_free(dd); + } + } + + /* Bare nose pointer: */ + Alib_drawArc(u->v->w, u->v->focus.x - 2, u->v->focus.y - 2, + 4, 4, 0, 360 * 64, color); + +} + + +#ifdef FIXME_TESTING_CODE_FOR_VLIB +#define DASH_LEN 7 + +static void draw_dashed_line2(Viewport *v, int x1, int y1, int x2, int y2) +{ + int len, n, i, d, x, y, nx, ny; + double dx, dy; + draw_Type *dd; + + len =sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)); + n = (int) (len / DASH_LEN + 0.5); + if( (n & 1) == 0 ) + n++; + + dx = (x2 - x1)/(double)n; + dy = (y2 - y1)/(double)n; + + x = x1; y = y1; + + dd = draw_new(); + d = 1; + for( i = 1; i <= n; i++ ){ + nx = x1 + (int)(i*dx + 0.5); ny = y1 + (int)(i*dy + 0.5); + if( d ){ + draw_segment(dd, x, y, nx, ny); + } + x = nx; y = ny; + d = !d; + } + draw_stroke(dd, v, v->w->pixel[magentaColor]); + draw_free(dd); +} + + +static void FIXME_draw_dashed_rect(Viewport *v, Alib_Rect *rr) +{ + Alib_Window *w; + Alib_Rect r2, *r; + + + w = v->w; + Alib_setClipRect(w, rr); + + r2 = *rr; + Alib_expandRect(&r2, -1, -1); + r = &r2; + //printf("FIXME: r=%d %d %d %d\n", r2.a.x, r2.a.y, r2.b.x, r2.b.y); + + draw_dashed_line2(v, r->a.x, r->a.y, r->b.x-1, r->a.y); + draw_dashed_line2(v, r->a.x, r->a.y, r->a.x, r->b.y-1); + draw_dashed_line2(v, r->a.x, r->b.y-1, r->b.x-1, r->b.y-1); + draw_dashed_line2(v, r->b.x-1, r->a.y, r->b.x-1, r->b.y-1); + + draw_dashed_line2(v, v->focus.x, v->focus.y - 20, v->focus.x, v->focus.y + 20); + draw_dashed_line2(v, v->focus.x - 20, v->focus.y, v->focus.x + 20, v->focus.y); +} +#endif + + +void +hud_draw(viewer * u) +{ + craft *c; + int i, x, x1, y, fth, xscale1, yscale1; + double xscale, yscale, fontH, vel; + char buffer[80]; + Alib_Pixel color; + + //FIXME_draw_dashed_rect(u->v, &u->v->rect); + + if( u->hud == NULL || !HUD(u)->enabled ) + return; + + c = u->c; + + if( ! damage_isFunctioning(c, SYS_HUD) ) + return; + + xscale = u->xscaleFactor; + yscale = u->yscaleFactor; + color = HUDColor; + + /* Stall warning */ + if( ! blink && c->damageBits & FLAG_STALL_WARN ){ + fontH = (int) (24 * yscale); + int fontW = fontH; + x = u->v->focus.x - 5 * fontW / 2; + y = u->v->focus.y + 4 * fontH; + strcpy(buffer, "STALL"); + VDrawStrokeString(u->v, x, y, buffer, strlen(buffer), fontH, color); + } + + xscale1 = (int) (xscale * 2048.0); + yscale1 = (int) (yscale * 2048.0); + fontH = (int) (12.0 * yscale + 0.5); + fth = (int) (18.0 * yscale + 0.5); + + if( curTime >= blink_toggle_time ){ + blink = ! blink; + if( blink ) + blink_toggle_time = curTime + 0.05; + else + blink_toggle_time = curTime + 0.5; + } + + if (u->viewDirection.x < 0.90) + return; + + /* Angle of Attack */ + if ((vel = VMagnitude(&c->Cg)) < 50.0) + sprintf(buffer, "a=0.0"); + else + sprintf(buffer, "a=%.1f", units_RADtoDEG(c->alpha)); + x = u->v->focus.x + 150 * xscale1 / 2048; + y = u->v->focus.y - u->velScale.length / 2 - (int) (yscale * 50); + VDrawStrokeString(u->v, x, y, buffer, strlen(buffer), fontH, color); + + /* Accelerometer */ + x1 = u->v->focus.x - 220 * xscale1 / 2048; + sprintf(buffer, "%4.1fg", - c->G.z); + VDrawStrokeString(u->v, x1, y, buffer, strlen(buffer), fontH, color); + + /* + APS lights: + */ + + x = u->v->focus.x + 100.0*xscale; + y = u->v->focus.y - 90.0*yscale; + i = fontH * 2; /* interline */ + + /* Rate control law: */ + if( aps_rate_control_enabled(c) ){ + VDrawStrokeString(u->v, x, y, "Rate", 4, fontH, color); + } + + /* Auto Pilot */ + if( aps_ap_enabled(c) && ( ! aps_ap_warn(c) || ! blink ) ){ + VDrawStrokeString(u->v, x, y, "VS/ALT", 6, fontH, color); + } + + /* Auto Landing */ + y += i; + if( aps_al_enabled(c) && ( ! aps_al_warn(c) || ! blink ) ){ + VDrawStrokeString(u->v, x, y, "Land", 4, fontH, color); + } + + /* Auto Nav */ + y += i; + if ( aps_an_enabled(c) && ( ! aps_an_warn(c) || ! blink ) ){ + VDrawStrokeString(u->v, x, y, "NAV", 3, fontH, color); + } + + /* Auto Throttle */ + y += i; + if ( aps_at_enabled(c) && ( ! aps_at_warn(c) || ! blink ) ){ + VDrawStrokeString(u->v, x, y, "THR", 3, fontH, color); + } + + /* Auto Turn */ + y += i; + if ( aps_aw_enabled(c) && ( ! aps_aw_warn(c) || ! blink ) ){ + VDrawStrokeString(u->v, x, y, "Turn", 4, fontH, color); + } + + /* Auto Coord */ + y += i; + if ( aps_ac_enabled(c) && ( ! aps_ac_warn(c) || ! blink ) ){ + VDrawStrokeString(u->v, x, y, "Coord", 5, fontH, color); + } + + /* Vertical velocity */ + x = u->v->focus.x + 130 * xscale1 / 2048; + y = u->velScale.yorg + (int) (2 * yscale * fontH); + sprintf(buffer, "%+6d0", (int) (-c->Cg.z * 6.0)); + VDrawStrokeString(u->v, x, y, buffer, strlen(buffer), fontH, color); + + /* Compass, altitude and airspeed cards */ + + scale_drawCompass(u->v, &(u->hdgScale), + units_RADtoDEG(c->showMag? pm_mag_heading(c) : c->curHeading) * 100.0); + + scale_draw(u->v, &(u->altScale), units_METERStoFEET(c->w.z)); + + /* TAS: */ + //vel = c->VT; + /* Airspeed along the x axis (the Pitot tube indicates this): */ + vel = c->VT * cos(c->alpha) * cos(c->beta); + if( vel < 0.0 ) vel = 0.0; + scale_draw(u->v, &(u->velScale), units_FPStoKT(vel)); + + /* + AutoThrottle + */ + if ( aps_at_enabled(c) + && ( ! aps_at_warn(c) || ! blink ) ){ + x = u->v->focus.x - 150 * xscale1 / 2048; + y = u->hud_yCenter - 10 * yscale1 / 2048; + sprintf(buffer, "AT%3d IAS", (int) (units_FPStoKT( aps_at_get_velocity(c) ) + 0.5)); + VDrawStrokeString(u->v, x, y, + buffer, strlen(buffer), fontH, color); + } + + /* Mach number */ + if (c->mach >= 0.20) { + sprintf(c->leftHUD[1], " %4.2f", c->mach); + } + else { + strcpy(c->leftHUD[1], ""); + } + + x = u->v->focus.x - 220 * xscale1 / 2048; + y = u->hud_yCenter - 200 * yscale1 / 2048; + + for (i = 0; i < 5; ++i) { + VDrawStrokeString(u->v, x, y, c->leftHUD[i], + strlen(c->leftHUD[i]), fontH, color); + y += fth; + } + + x = u->v->focus.x + 160 * xscale1 / 2048; + y = u->hud_yCenter - 200 * yscale1 / 2048; + + for (i = 0; i < 5; ++i) { + VDrawStrokeString(u->v, x, y, c->rightHUD[i], + strlen(c->rightHUD[i]), fontH, color); + y += fth; + } + + doLadder(c, u, vel); + + doBankIndicator(c, u); + + doTurnAndSlipIndicator(c, u); +} + + +static int fspage_show = 0; /* FIXME: put in data struct tied to the viewer */ + +static void TermPrintLn(viewer * u, char *s) +{ + static int x = 0, y = 0, h = 0, dy = 0; + + if( s == NULL ){ + if( u->hud_mode ) + h = RectHeight(u->v->rect) / 40; + else + h = RectHeight(u->v->rect) / 25; + if( h > 9 ) + h = 9; + dy = (int) (h * 1.5 + 0.5); + x = dy; + y = dy; + return; + } + + VDrawStrokeString(u->v, x, y, s, strlen(s), h, whiteColor); + y += dy; +} + + +void hud_free(viewer *u) +{ + if( u->hud == NULL ) + return; + + HUD(u)->next = free_list; + free_list = u->hud; + u->hud = NULL; +} + + +void FSPageToggle() +{ + fspage_show = ! fspage_show; +} + + +static void +doFSPage(craft * c, viewer * u) +{ + + double VAR; + char buf[256], buf1[256]; + + VSetClipRect(u->v, &u->v->rect); + + TermPrintLn(u, NULL); + + TermPrintLn(u, c->cinfo->name); + TermPrintLn(u, c->cinfo->description); + + zulu_Date d; + zulu_timestampToDate(departure_timestamp + curTime, &d); + sprintf(buf, "%04d-%02d-%02dT%02d:%02d", d.year, d.month, d.day, + d.hour, d.minutes); + TermPrintLn(u, buf); + + sprintf (buf, "G: %+.2f %+.2f %+.2f", c->G.x, c->G.y, c->G.z); + TermPrintLn(u, buf); + + sprintf (buf, "Ail/Elev/Rdr: %+.3f %+.3f %+.3f", c->Sa, c->Se, c->Sr); + TermPrintLn(u, buf); + + sprintf (buf, "Euler: %+.1f %+.1f %+.1f", + units_RADtoDEG(c->curRoll), + units_RADtoDEG(c->curPitch), + units_RADtoDEG(c->curHeading)); + TermPrintLn(u, buf); + + sprintf (buf, "Euler rates: %+.2f %+.2f %+.2f", + units_RADtoDEG(c->p + c->q*tan(c->curPitch)*sin(c->curRoll) + c->r*tan(c->curPitch)*cos(c->curRoll)), + units_RADtoDEG(c->q*cos(c->curRoll) - c->r*sin(c->curRoll)), + units_RADtoDEG(c->q*sin(c->curRoll)/cos(c->curPitch) + c->r*cos(c->curRoll)/cos(c->curPitch))); + TermPrintLn(u, buf); + + sprintf (buf, "Omega: %+.2f %+.2f %+.2f", + units_RADtoDEG(c->p), units_RADtoDEG(c->q), units_RADtoDEG(c->r)); + TermPrintLn(u, buf); + + earth_latitudeToString(buf, sizeof(buf), c->w.latitude, earth_LLM_DMS); + TermPrintLn(u, buf); + + earth_longitudeToString(buf, sizeof(buf), c->w.longitude, earth_LLM_DMS); + strcat (buf, " "); + sprintf (buf1, "%d m", (int)(c->w.z+0.5)); + strcat (buf, buf1); + TermPrintLn(u, buf); + + if (c->showMag) { + VAR = units_RADtoDEG( c->indicatedLocalVAR ); + sprintf(buf, "VAR %.1f%c", fabs(VAR), VAR < 0 ? 'E' : 'W'); + TermPrintLn(u, buf); + } + + sprintf(buf, "T = %.0f C", units_RankineToCelsius(c->air.t)); + TermPrintLn(u, buf); + sprintf(buf, "P = %.0f hPa", c->air.p * units_LbToKgFactor * units_earth_g + / units_FootToMeterFactor * 0.01); + TermPrintLn(u, buf); + sprintf(buf, "rho = %.3f Kg/m^3", units_SlugToKg(c->air.rho) + / (units_FootToMeterFactor*units_FootToMeterFactor*units_FootToMeterFactor)); + TermPrintLn(u, buf); + sprintf(buf, "c = %.0f m/s", c->air.mach1 * units_FootToMeterFactor); + TermPrintLn(u, buf); +} + + +void +doFlightStatusPage(craft * c, viewer * u) +{ + + if ( ! fspage_show ) + return; + + doFSPage(c, u); + return; + +} diff -Nru acm-5.0/src/acm/hud.h acm-6.0+20200416/src/acm/hud.h --- acm-5.0/src/acm/hud.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/hud.h 2017-03-20 06:04:01.000000000 +0000 @@ -0,0 +1,41 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1998 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#ifndef _hud_h +#define _hud_h + +#include "pm.h" + +#ifdef hud_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +EXTERN void hud_enable(viewer *u); +EXTERN void hud_disable(viewer *u); +EXTERN void hud_draw(viewer *u); +EXTERN void hud_timer_toggle(viewer *u); +EXTERN void hud_free(viewer *u); + +/* FIXME: these functions should not stay in this module: */ +EXTERN void doFlightStatusPage(craft * c, viewer * u); +EXTERN void FSPageToggle(void); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/init.c acm-6.0+20200416/src/acm/init.c --- acm-5.0/src/acm/init.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/init.c 2017-10-25 11:26:03.000000000 +0000 @@ -0,0 +1,214 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1998 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#include +#include +#include +#include +#include +#include +#include + +#include "../V/Vlib.h" +#include "../util/error.h" +#include "../util/memory.h" +#include "../wmm/wmm.h" +#include "alarm.h" +#include "astro.h" +#include "dis_if.h" +#include "inventory.h" +#include "planes.h" +#include "pm.h" +#include "vpath_gallery.h" +#include "weapon.h" + +#define init_IMPORT +#include "init.h" + + +#ifdef WINNT +#define SEPARATOR ";" +#else +#define SEPARATOR ":" +#endif + +#define DEFAULT_OBJECT_DIRS \ + "." \ + SEPARATOR "objects" \ + SEPARATOR "../objects" \ + SEPARATOR "../../objects" + +static char ** objects_dirs = NULL; + + +static void +init_fileNotFoundError(char * path) +{ + fprintf(stderr, "acm: file `%s' not found. Attempts made:\n", path); + fprintf(stderr, " %s\n", path); + char **p = objects_dirs; + while ( *p != NULL ) { + fprintf(stderr, " %s/%s\n", *p, path); + p++; + } + fprintf(stderr, "Relative paths are resolved against the current working directory:\n"); + char cwd[999]; + fprintf(stderr, " %s\n", getcwd(cwd, sizeof(cwd))); + fprintf(stderr, "Hint: use the option -objects path1" SEPARATOR "path2" SEPARATOR "...\n"); +} + + +FILE * init_fopen(char *path, char *access) +{ + return fopen(init_findFile(path), access); +} + + +char * init_findFile(char *path) +{ + static char resolved[999]; + struct stat statbuf; + + memory_strcpy(resolved, sizeof(resolved), path); + if (stat(resolved, &statbuf) == 0) + return resolved; + + char **p = objects_dirs; + while ( *p != NULL ) { + snprintf(resolved, sizeof(resolved), "%s/%s", *p, path); + if (stat(resolved, &statbuf) == 0) + return resolved; + p++; + } + + init_fileNotFoundError(path); + exit(1); +} + + +void init_init(char *objects, char *departure_date) +{ + if( objects == NULL ) + objects = DEFAULT_OBJECT_DIRS; + objects = memory_strdup(objects); + int size = 0; + int i = 0; + objects_dirs = NULL; + char *s = strtok(objects, SEPARATOR); + do { + if ( i >= size ) { + size = 2 * size + 10; + objects_dirs = memory_realloc(objects_dirs, size * sizeof( char * )); + } + if ( s == NULL ){ + /* REMEMBER: last elements of objects_dirs[] must be NULL: */ + objects_dirs[i++] = NULL; + break; + } else { + objects_dirs[i++] = memory_strdup(s); + } + s = strtok(NULL, SEPARATOR); + } while ( 1 ); + memory_dispose(objects); + + zulu_Date departure; + if( departure_date == NULL || *departure_date == 0 ){ + departure_timestamp = time(NULL); + zulu_timestampToDate(departure_timestamp, &departure); + } else { + if( ! zulu_dateParse(departure_date, &departure) ) + error_external("invalid departure date and time '%s'.\n" + "Check format and range of each field, examples:\n\n" + " 2017-10 (2017-10-01T00:00:00 assumed)\n" + " 2017-10-20 (00:00:00 assumed time)\n" + " 2017-10-20T12:34 (00 seconds assumed)\n" + " 2017-10-20T12:34:56\n\n" + "Allowed year range is [1583,9999].", + departure_date); + departure_timestamp = zulu_dateToTimestamp(&departure); + } + + wmm_init( init_findFile("WMM.COF") ); + wmm_setCurrentTime( zulu_dateToYear(&departure) ); + + astro_init(0, &departure); + + craft *p; + for ((i = 0, p = ptbl); i < manifest_MAXPLAYERS; (++i, ++p)) { + p->pIndex = i; + p->type = CT_FREE; + } + + for ((i = 0, p = mtbl); i < manifest_MAXPROJECTILES; (++i, ++p)) { + p->pIndex = i; + p->type = CT_FREE; + } + + HUDColor = gui_getColorIndexString(NULL, "#00ee00"); + whiteColor = gui_getColorIndexString(NULL, "white"); + blackColor = gui_getColorIndexString(NULL, "black"); + yellowColor = gui_getColorIndexString(NULL, "#ee0"); + redColor = gui_getColorIndexString(NULL, "#f44"); + magentaColor = gui_getColorIndexString(NULL, "orange"); + radarColor = gui_getColorIndexString(NULL, "#0c0"); + panelBackgroundColor = gui_getColorIndexString(NULL, "#111"); + + + inventory_init(); + weapon_init(); + zones = zones_new( init_findFile("zones.txt") ); + + /* + * Add the periodic resupply check procedure + * FIXME: fuel and weapons resupply currently disabled + */ + /* id = */ alarm_add(manifest_RESUPPLY_INTERVAL, planes_doResupply, NULL, NULL); +} + + +void init_term(void) +{ + int i; + + for( i = 0; i < manifest_MAXPLAYERS; i++ ){ + if( ptbl[i].type != CT_FREE ){ + ptbl[i].kill(&ptbl[i], "program terminated"); + } + } + + for( i = 0; i < manifest_MAXPROJECTILES; i++ ){ + if( mtbl[i].type != CT_FREE ){ + mtbl[i].kill(&mtbl[i], "simulation ended"); + } + } + + dis_if_close(); + vpath_gallery_free_all(); + + for( i=0; ; i++){ + if( objects_dirs[i] != NULL ) + memory_dispose(objects_dirs[i]); + else + break; + } + memory_dispose(objects_dirs); + objects_dirs = NULL; + + memory_dispose(zones); + zones = NULL; +} diff -Nru acm-5.0/src/acm/init.h acm-6.0+20200416/src/acm/init.h --- acm-5.0/src/acm/init.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/init.h 2017-10-22 14:43:34.000000000 +0000 @@ -0,0 +1,66 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1998 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#ifndef _init_h +#define _init_h + +#include + +#ifdef init_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +/** + * Overall initialization of the program. + * @param objects List of directories where to search for configuration files. + * @param departure_date Departure zulu date and time formatted as one of: + * - "YYYY-MM-DDThh:mm:ss" + * - "YYYY-MM-DDThh:mm" + * - "YYYY-MM-DD" + * - "YYYY-MM" + * If NULL or empty, the current zulu time is used. + */ +EXTERN void init_init(char *objects, char *departure_date); + +/** + * Terminates... the initialization module! + */ +EXTERN void init_term(void); + +/** + * Find an important configuration data file, or die trying. First tries the + * path alone, then it tries each objects directory joined with it, in the + * order. + * @param path File to search. + * @return Resolved path to an existing file as a pointer to an internal + * statically allocated buffer; do not overwrite and copy as necessary! + */ +EXTERN char * init_findFile(char *path); + +/** + * Opens a file. + * @param path File to open. Applies init_findFile() to the search. + * @param access Access mode. + * @return Opened file. If not found or access denied, its a fatal error. + */ +EXTERN FILE * init_fopen(char *path, char *access); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/instruments.c acm-6.0+20200416/src/acm/instruments.c --- acm-5.0/src/acm/instruments.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/instruments.c 2017-10-20 00:26:57.000000000 +0000 @@ -0,0 +1,1489 @@ +/* + * acm : an aerial combat simulator for X + * Classic instruments module + * Copyright (C) 2007 Umberto Salsi + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#include +#include +#include +#include +#include + +#include "../util/memory.h" +#include "../util/units.h" +#include "../V/Vlibmath.h" +#include "aps.h" +#include "draw.h" +#include "pm.h" +#include "vpath.h" + +#define instruments_IMPORT +#include "instruments.h" + +/** + * The viewer object associated to every aircraft contains a pointer + * to an instance of this struct, giving the state of the classic + * instruments. + */ +typedef struct instruments_Type { + + /** + * Disposed structs are linked in a recycle pool; set to NULL for + * currently used structs. + */ + struct instruments_Type *next; + + /** + * If classic instruments panel is enabled, then every instrument + * needs to be updated. + */ + _BOOL enabled; + + /** Anemometer: cosine of the stall angle. */ + double cos_alpha_stall; + + /** Attitude: last update time (s). */ + double attitude_erection_upd; + /** Attitude: pilot's pitch offset; default zero (RAD). */ + double attitude_pitch_offset; + /** Attitude: normalized gyro orientation (NED reference). */ + VPoint attitude_gyro; + /** Attitude current bank. */ + double attitude_bank; + /** Attitude current pitch. */ + double attitude_pitch; + + /** Altimeter: pressure offset in [2800,3100] inHg*100; default 2992. */ + int altimeter_p0; + + /** VSI: last update time (s). */ + double vsi_last_upd; + /** VSI: last computed vertical speed (ft/min). */ + double vsi_last_vs; + + /** Timer: current operation mode (0=off, 1=run, 2=stop). */ + int timer_op; + /** Timer: displayed value in 'stop' mode (s). */ + int timer_freezed; + /** Timer: time offset relative to the ACM clock in mode 'run' and 'stop' + * (s). + */ + double timer_offset; + +} instruments_Type; + +/** + * Linked list of recycled instruments_data structures. + */ +static instruments_Type *free_list = NULL; + +/** Maps a viewer into instruments_data pointer. */ +#define INST(u) ((instruments_Type *)(u->inst)) + +/** 'Blinking' display toggle. */ +static _BOOL blink = FALSE; +static double blink_toggle_time = 0.0; + +static Alib_Pixel + black_color, + white_color, + attitude_bank_sky_color, + attitude_bank_ground_color, + attitude_pitch_sky_color, + attitude_pitch_ground_color; + +static vpath_Type * ball_ladder_vpath = NULL; + +static vpath_Type *anemometer_vpath = NULL; + + +/** Bank scale ring outer radius (in 1/1000 of the available slot half width). */ +#define ATTITUDE_BANK_OUTER_RADIUS 1000 + +/** Bank scale ring inner radius (in 1/1000 of the available slot half width). */ +#define ATTITUDE_BANK_INNER_RADIUS 700 + +/** Bank scale ring, upper half (sky) on a circle of radius 1000. */ +static Alib_Polygon *attitude_bank_half_upper_ring; + +/** Bank scale ring, lower half (ground) on a circle of radius 1000. */ +static Alib_Polygon *attitude_bank_half_lower_ring; + +/** Bank scale ring, zero bank tick mark. */ +static Alib_Polygon *attitude_bank_zero_tick_mark; + +/** Bank needle. */ +static Alib_Polygon *attitude_bank_needle; + +/** Pitch needle. */ +static Alib_Polygon *attitude_pitch_needle; + + +static int inited; + + +static void instruments_cleanup() +{ + instruments_Type *p; + + while( free_list != NULL ){ + p = free_list; + free_list = free_list->next; + memory_dispose(p); + } + + memory_dispose(ball_ladder_vpath); + ball_ladder_vpath = NULL; + + memory_dispose(anemometer_vpath); + anemometer_vpath = NULL; + + memory_dispose(attitude_bank_half_upper_ring); + memory_dispose(attitude_bank_half_lower_ring); + memory_dispose(attitude_bank_zero_tick_mark); + memory_dispose(attitude_bank_needle); + memory_dispose(attitude_pitch_needle); + + inited = 0; +} + +/** + * Initializes this module. + */ +static void instruments_init() +{ + int i; + + if( inited ) + return; + inited = 1; + memory_registerCleanup(instruments_cleanup); + + + black_color = gui_getColorIndexString(NULL, "#000000"); + white_color = gui_getColorIndexString(NULL, "#ffffff"); + attitude_bank_sky_color = gui_getColorIndexString(NULL, "#0083cb"); + attitude_bank_ground_color = gui_getColorIndexString(NULL, "#6c5735"); + attitude_pitch_sky_color = gui_getColorIndexString(NULL, "#0074b3"); + attitude_pitch_ground_color = gui_getColorIndexString(NULL, "#5f4c2f"); + + /* + * Attitude's polygons are drawn on a circle of radius + * ATTITUDE_BANK_OUTER_RADIUS units. + */ + + // Create attitude_bank_half_upper_ring: + attitude_bank_half_upper_ring = Alib_Polygon_new(); + int angle_deg; + for(angle_deg = 0; angle_deg <= 180; angle_deg += 10){ + double a = units_DEGtoRAD(angle_deg); + Alib_Polygon_addPointXY(attitude_bank_half_upper_ring, + ATTITUDE_BANK_OUTER_RADIUS * cos(a), + - ATTITUDE_BANK_OUTER_RADIUS * sin(a)); + } + Alib_Polygon_addPointXY(attitude_bank_half_upper_ring, + -ATTITUDE_BANK_INNER_RADIUS, 0); + for(angle_deg = 170; angle_deg >= 0; angle_deg -= 10){ + double a = units_DEGtoRAD(angle_deg); + Alib_Polygon_addPointXY(attitude_bank_half_upper_ring, + ATTITUDE_BANK_INNER_RADIUS * cos(a), + - ATTITUDE_BANK_INNER_RADIUS * sin(a)); + } + + // Create attitude_bank_half_lower_ring: + attitude_bank_half_lower_ring = Alib_Polygon_clone(attitude_bank_half_upper_ring); + for(i = attitude_bank_half_lower_ring->npts - 1; i >= 0; i--) + attitude_bank_half_lower_ring->pts[i].y *= -1; + + // Create zero bank tick mark: + attitude_bank_zero_tick_mark = Alib_Polygon_new(); + Alib_Polygon_addPointXY(attitude_bank_zero_tick_mark, + 0, -ATTITUDE_BANK_INNER_RADIUS); + Alib_Polygon_addPointXY(attitude_bank_zero_tick_mark, + -100, -ATTITUDE_BANK_OUTER_RADIUS); + Alib_Polygon_addPointXY(attitude_bank_zero_tick_mark, + 100, -ATTITUDE_BANK_OUTER_RADIUS); + + // Create bank needle: + attitude_bank_needle = Alib_Polygon_new(); + Alib_Polygon_addPointXY(attitude_bank_needle, -100, -ATTITUDE_BANK_INNER_RADIUS + 200); + Alib_Polygon_addPointXY(attitude_bank_needle, 100, -ATTITUDE_BANK_INNER_RADIUS + 200); + Alib_Polygon_addPointXY(attitude_bank_needle, 0, -ATTITUDE_BANK_INNER_RADIUS); + + // Create pitch needle: + //Alib_Point poly[] = { {0, 200}, {170, 50}, {500, 50}, {500, 0}, + // {140, 0}, {0, 130}, {-140, 0}, {-500, 0}, {-500, 50}, {-170, 50} }; + Alib_Point poly[] = { {0,80}, {500, 200}, {0, 0}, {-500, 200} }; + attitude_pitch_needle = Alib_Polygon_new(); + i = sizeof(poly) / sizeof(Alib_Point) - 1; + for( ; i >= 0; i--) + Alib_Polygon_addPoint(attitude_pitch_needle, &poly[i]); +} + + +/** + * Draws a needle rotating counter-clock wise around (xo,yo), len pixels long. + */ +static void drawNeedle(Alib_Window *w, int xo, int yo, double angle, double len, Alib_Pixel color) +{ + static Alib_Point pts[] = { {200, -70}, {1000, -5}, {1000, 5}, {200, 70} }; + Alib_Matrix m; + Alib_MatrixIdentity(&m); + Alib_MatrixRotate(&m, angle); + Alib_MatrixScale(&m, 0.001 * len); + Alib_MatrixTranslate(&m, xo, yo); + Alib_fillPolygonWithMatrix(w, pts, 4, &m, color); +} + + +/** + * Draws the turn and slip indicator. + * @param u Viewer instance of the aircraft. + * @param x0 Horizontal position of the center of the dial. + * @param y0 Vertical position of the center of the dial. + * @param width Width and height of the dial. + */ +static void instruments_turnslip_draw(viewer *u, double xo, double yo, double width) +{ + double radius, x1, y1, r, co, si, a, r1, r2, l, m; + draw_Type *dd; + int j; + + radius = 0.48 * width; + + dd = draw_new(); + + draw_circle(dd, xo, yo, radius); + + /* + Yaw rate: + */ + x1 = xo; + y1 = yo + 0.25 * radius; + + r = 0.90 * radius; + for( j=-30; j<= 30; j+=15 ){ + co = cos( units_DEGtoRAD(j) ); + si = sin( units_DEGtoRAD(j) ); + draw_segment(dd, x1 + r*si, y1 - r*co, x1 + radius*si, y1 - radius*co); + } + + /* + This instrument measures the rotational speed around the craft + z axis: + */ + + a = u->c->r; + a = fmin(a, units_DEGtoRAD(5.0)); + a = fmax(a, -units_DEGtoRAD(5.0)); + //draw_pointer(dd, x1, y1, -M_PI/2.0 + a*30.0/3.0, 0.87*radius); + drawNeedle(u->w, x1, y1, M_PI/2.0 - a*30.0/3.0, 0.87*radius, white_color); + + /* + Slip indicator: + */ + + x1 = xo; + y1 = yo - 1.5*radius; + + /* curved glass: */ + r1 = 2.0*radius; + r2 = 2.25*radius; + l = units_DEGtoRAD(15.0); + draw_arc(dd, x1, y1, r1, units_DEGtoRAD(90.0) - l, units_DEGtoRAD(90.0) + l); + draw_arc(dd, x1, y1, r2, units_DEGtoRAD(90.0) - l, units_DEGtoRAD(90.0) + l); + co = cos(l); + si = sin(l); + draw_segment(dd, x1 - r1*si, y1 + r1*co, x1 - r2*si, y1 + r2*co); + draw_segment(dd, x1 + r1*si, y1 + r1*co, x1 + r2*si, y1 + r2*co); + + /* center marks of the curved glass: */ + co = cos(units_DEGtoRAD(4.0)); + si = sin(units_DEGtoRAD(4.0)); + draw_segment(dd, x1 - r1*si, y1 + r1*co, x1 - r2*si, y1 + r2*co); + draw_segment(dd, x1 + r1*si, y1 + r1*co, x1 + r2*si, y1 + r2*co); + + /* ball: */ + a = atan2(-u->c->G.y, -u->c->G.z); + /* max angular displacement of the ball (approximated for little angles): */ + m = l - (r2-r1)/(r1+r2); + a = fmin(a, m); + a = fmax(a, -m); + co = cos(a); + si = sin(a); + draw_circle(dd, x1 + (r1+r2)/2.0*si, y1 + (r1+r2)/2.0*co, 0.95*(r2-r1)/2.0); + + draw_stroke(dd, u->v, white_color); + draw_free(dd); +} + + +/* + ANEMOMETER + ========== +*/ + + +#define ANEMOMETER_MAX_VEL 450.0 +#define ANEMOMETER_MAX_ANGLE units_DEGtoRAD(320.0) +#define ANEMOMETER_LINEARITY 0.8 +#define ANEMOMETER_OFFSET 30.0 + + +static void instruments_anemometer_init(viewer * u) +{ + instruments_Type *d = INST(u); + craftType *p = u->c->cinfo; + + d->cos_alpha_stall = cos(p->alpha_stall); +} + + +static double map_vel_to_angle(double vel) +{ + double a; + static double k = 0.0; + + if( k == 0.0 ) + k = 1.0 / (sqrt(ANEMOMETER_MAX_VEL - ANEMOMETER_OFFSET + ANEMOMETER_LINEARITY*ANEMOMETER_LINEARITY) - ANEMOMETER_LINEARITY); + vel = fmax(vel - ANEMOMETER_OFFSET, 0.0); + a = k*(sqrt(vel + ANEMOMETER_LINEARITY*ANEMOMETER_LINEARITY) - ANEMOMETER_LINEARITY); + a = fmin(a, 1.0); + return a * ANEMOMETER_MAX_ANGLE; +} + + +static void instruments_draw_bold_arc(draw_Type *dd, double xo, double yo, double r, + double a1, double a2) +{ + draw_arc(dd, xo, yo, r, a1, a2); + draw_arc(dd, xo, yo, r - 1.0, a1, a2); + draw_arc(dd, xo, yo, r + 1.0, a1, a2); +} + + +static vpath_Type * build_anemometer_vpath() +{ + int i, j, n, l; + double radius, r, r1, r2, r3, fh, fw, si, co, vel, a; + vpath_Type *p; + double v[200]; + char buf[10]; + VMatrix m; + + p = vpath_new(); + + radius = 1.0; + + /* + Build array v[] of the velocity to display + */ + n = 0; + /* add speeds from 40 up to 150 kt step 10: */ + for( i = 40; i <= 250; i+= 10 ) + v[n++] = (double) i; + /* add speeds from 200 up to ANEMOMETER_MAX_VEL kt step 50: */ + for( i = 200; i <= ANEMOMETER_MAX_VEL; i += 10 ) + v[n++] = (double) i; + v[n++] = -1.0; + + i = 0; + j = 0; + r = 0.83 * radius; /* labels center radius */ + r1 = 0.60 * radius; /* nock - inner radius */ + r2 = 0.65 * radius; /* short nock - outer radius */ + r3 = 0.72 * radius; /* long nock - outer radius */ + while( v[j] >= 0.0 ){ + vel = v[j]; + a = map_vel_to_angle(vel); + co = cos(a); + si = sin(a); + + if( + (vel <= 120.0 && (int) vel % 20 == 0) + || ((int) vel % 50 == 0) + ){ + sprintf(buf, "%d", (int) vel); + l = strlen(buf); + VIdentMatrix(&m); + fh = 0.10*radius; + fw = 2.0 * fh / l; /* same width (fw*l) for any length (l) */ + VScaleMatrix(&m, fw, fh, 1.0); + VTranslate(&m, r*si - 0.5*fw*l, - r*co + 0.5*fh, 0.0); + vpath_draw_string(p, buf, l, &m); + + vpath_moveTo(p, &(VPoint){r1*si, - r1*co, 0.0}); + vpath_lineTo(p, &(VPoint){r3*si, - r3*co, 0.0}); + } else { + vpath_moveTo(p, &(VPoint){r1*si, - r1*co, 0.0}); + vpath_lineTo(p, &(VPoint){r2*si, - r2*co, 0.0}); + } + + j++; + } + + + /* + "KT": + */ + + strcpy(buf, "KT"); + l = strlen(buf); + fh = 0.15 * radius; + fw = fh; + VIdentMatrix(&m); + VScaleMatrix(&m, fw, fh, 1.0); + VTranslate(&m, -0.5*fw*l, 0.3*radius + 0.5*fh, 0.0); + vpath_draw_string(p, buf, l, &m); + + return p; +} + + +static void instruments_anemometer_draw(viewer *u, double xo, double yo, double width) +{ + double radius, a, b, r1, r2, ias; + draw_Type *dd; + VMatrix m; + + radius = 0.48 * width; + + dd = draw_new(); + draw_circle(dd, xo, yo, radius); + double cos_alpha_stall = INST(u)->cos_alpha_stall; + + /* + Speed limit arcs + */ + + craftType *p = u->c->cinfo; + + r1 = 0.55 * radius; + r2 = 0.50 * radius; + + // White arc: + if( p->Vs0 > 0.0 && p->Vfe > 0.0 ){ + instruments_draw_bold_arc(dd, xo, yo, r1, + map_vel_to_angle(p->Vs0 * cos_alpha_stall) - 0.5*M_PI, + map_vel_to_angle(p->Vfe) - 0.5*M_PI); + } + if( p->Vs0 > 0.0 && p->Vs1 > 0.0 ){ + instruments_draw_bold_arc(dd, xo, yo, r2, + map_vel_to_angle(p->Vs0 * cos_alpha_stall) - 0.5*M_PI, + map_vel_to_angle(p->Vs1 * cos_alpha_stall) - 0.5*M_PI); + } + + // Green arc: + if( p->Vs1 > 0.0 && p->Vfe > 0.0 && p->Vno > 0.0 ){ + draw_Type *green = draw_new(); + b = map_vel_to_angle(p->Vno) - 0.5*M_PI; + instruments_draw_bold_arc(green, xo, yo, r1, + map_vel_to_angle(p->Vfe) - 0.5*M_PI, b); + instruments_draw_bold_arc(green, xo, yo, r2, + map_vel_to_angle(p->Vs1 * cos_alpha_stall) - 0.5*M_PI, b); + draw_stroke(green, u->v, radarColor); + draw_free(green); + } + + // Yellow arc: + if( p->Vno > 0.0 && p->Vne > 0.0 ){ + draw_Type *yellow = draw_new(); + a = map_vel_to_angle(p->Vno) - 0.5*M_PI; + b = map_vel_to_angle(p->Vne) - 0.5*M_PI; + instruments_draw_bold_arc(yellow, xo, yo, r1, a, b); + instruments_draw_bold_arc(yellow, xo, yo, r2, a, b); + draw_stroke(yellow, u->v, yellowColor); + draw_free(yellow); + } + + // Red line (actually here we draw a short arc): + if( p->Vne > 0.0 ){ + a = map_vel_to_angle(p->Vne); + draw_Type *red = draw_new(); + instruments_draw_bold_arc(red, xo, yo, r1, + a - 0.5*M_PI, + a + units_DEGtoRAD(3) - 0.5*M_PI); + instruments_draw_bold_arc(red, xo, yo, r2, + a - 0.5*M_PI, + a + units_DEGtoRAD(3) - 0.5*M_PI); + draw_stroke(red, u->v, redColor); + draw_free(red); + } + + if( anemometer_vpath == NULL ) + anemometer_vpath = build_anemometer_vpath(); + + VIdentMatrix(&m); + VScaleMatrix(&m, radius, radius, radius); + VTranslate(&m, xo, yo, -1.0); + vpath_stroke(anemometer_vpath, &m, u->w, white_color); + + /* Mach number: */ + char s[5]; + snprintf(s, sizeof(s), "%.2f", u->c->mach); + double fh = 0.12*radius; + double fw = VFontWidthPixels(u->v, (int) (fh+0.5)); + VDrawStrokeString(u->v, + (int) (xo - 0.5 * fw * strlen(s) + 0.5), + (int) (yo - 0.35*radius + 0.5), + s, strlen(s), (int)(fh+0.5), white_color); + + /* Draw pointer: */ + ias = units_FPStoKT( u->c->IAS ); + if( ias < ANEMOMETER_OFFSET ) + ias = ANEMOMETER_OFFSET; + a = map_vel_to_angle( ias ); + //draw_pointer(dd, xo, yo, a - M_PI/2.0, 0.60 * radius); + draw_stroke(dd, u->v, white_color); + + draw_free(dd); + + drawNeedle(u->w, xo, yo, M_PI/2.0 - a, 0.60 * radius, white_color); +} + + +/* + ATTITUDE INDICATOR + ================== +*/ + +#define ATTITUDE_MAX_PITCH_OFFSET units_DEGtoRAD(10.0) +#define ATTITUDE_MAX_PITCH units_DEGtoRAD(70.0) +#define ATTITUDE_MAX_BANK units_DEGtoRAD(70.0) +#define ATTITUDE_UPDATE_PERIOD 0.2 + + +static void instruments_attitude_update(viewer *u) +{ + VPoint *gyro, g; + double m, k, dt; + + /* + Erection system: the gyro axis (smoothly) follows the local + vertical: + */ + dt = curTime - INST(u)->attitude_erection_upd; + if( dt > ATTITUDE_UPDATE_PERIOD ){ + INST(u)->attitude_erection_upd = curTime; + gyro = &INST(u)->attitude_gyro; + VTransform_(&u->c->G, &u->c->trihedral, &g); + m = VMagnitude(&g); + if( m > 0.98 && m < 1.02 /* erection cut-out */){ + k = 0.005 * dt / m; + g.x = gyro->x + k * g.x; + g.y = gyro->y + k * g.y; + g.z = gyro->z + k * g.z; + m = VMagnitude(&g); + if( m > 1e-6 ){ + k = 1.0 / m; + gyro->x = k * g.x; + gyro->y = k * g.y; + gyro->z = k * g.z; + } + } + } + + /* + Compute gyro angles of bank and pitch: + */ + + VReverseTransform_(&INST(u)->attitude_gyro, &u->c->trihedral, &g); + double bank = atan2(-g.y, -g.z); /* positive turning right */ + double pitch = atan2(g.x, sqrt(g.y*g.y + g.z*g.z)); /* positive pulling up */ + + int tilt = FALSE; + + if( bank > ATTITUDE_MAX_BANK ){ + tilt = TRUE; + bank = ATTITUDE_MAX_BANK; + } else if( bank < -ATTITUDE_MAX_BANK ){ + tilt = TRUE; + bank = -ATTITUDE_MAX_BANK; + } + + if( pitch > ATTITUDE_MAX_PITCH ){ + tilt = TRUE; + pitch = ATTITUDE_MAX_PITCH; + } else if( pitch < -ATTITUDE_MAX_PITCH ){ + tilt = TRUE; + pitch = -ATTITUDE_MAX_PITCH; + } + + if( tilt ){ + g.x = sin(pitch) * cos(bank); + g.y = -sin(bank); + g.z = -cos(pitch) * cos(bank); + VTransform_(&g, &u->c->trihedral, &INST(u)->attitude_gyro); + } + + INST(u)->attitude_bank = bank; + INST(u)->attitude_pitch = pitch; +} + + +static void instruments_attitude_init(viewer *u) +{ + INST(u)->attitude_pitch_offset = 0.0; + + /* Init gyro randomly oriented: */ + INST(u)->attitude_gyro.x = 0.2; + INST(u)->attitude_gyro.y = 0.2; + INST(u)->attitude_gyro.z = -0.959; + INST(u)->attitude_erection_upd = curTime; + // Initialize bank and pitch angles: + instruments_attitude_update(u); +} + + +void instruments_attitude_adjust_pitch(viewer * u, double delta) +{ + if( u->inst == NULL ) + return; + + INST(u)->attitude_pitch_offset += delta; + INST(u)->attitude_pitch_offset = fmin(INST(u)->attitude_pitch_offset, + ATTITUDE_MAX_PITCH_OFFSET); + INST(u)->attitude_pitch_offset = fmax(INST(u)->attitude_pitch_offset, + -ATTITUDE_MAX_PITCH_OFFSET); +} + + +void instruments_attitude_reset(viewer * u) +{ + VPoint g; + + if( u->inst == NULL ) + return; + + g.x = 0.0; g.y = 0.0; g.z = -1.0; + VTransform_(&g, &u->c->trihedral, &INST(u)->attitude_gyro); + // Initialize bank and pitch angles: + instruments_attitude_update(u); +} + + +/** + Draw arc on attitude ball. The arc starts from (pitch1,yaw1) and ends on + (pitch2,yaw2). Longer arcs are split in two or more segments. +*/ +static void build_ball_draw_arc( + double pitch1, double yaw1, + double pitch2, double yaw2) +{ + int n, i; + VPoint a, b, c; + double m; + + pitch1 = units_DEGtoRAD(pitch1); + yaw1 = units_DEGtoRAD(yaw1); + pitch2 = units_DEGtoRAD(pitch2); + yaw2 = units_DEGtoRAD(yaw2); + + n = (int) (fmax( fabs(pitch2-pitch1), fabs(yaw2-yaw1) ) + / units_DEGtoRAD(5) + 0.5); + + if( n < 1 ) + n = 1; + + VSetPoint(&a, cos(pitch1)*sin(yaw1), -sin(pitch1), -cos(pitch1)*cos(yaw1)); + VSetPoint(&b, cos(pitch2)*sin(yaw2), -sin(pitch2), -cos(pitch2)*cos(yaw2)); + + vpath_moveTo(ball_ladder_vpath, &a); + + for( i=1; i<=n; i++ ){ + + VSetPoint(&c, a.x + (double)i/n*(b.x-a.x), + a.y - (double)i/n*(b.y-a.y), + a.z + (double)i/n*(b.z-a.z)); + + m = VMagnitude(&c); + + VSetPoint(&c, c.x/m, c.y/m, c.z/m); + + vpath_lineTo(ball_ladder_vpath, &c); + } +} + + +static void build_ball_draw_str(int pitch, int yaw) +{ + VMatrix m; + double fh, fw; + char s[10]; + int s_len; + + sprintf(s, "%d", abs(pitch)); + s_len = strlen(s); + + fh = 0.05; + fw = 0.05; + + VIdentMatrix(&m); + VScaleMatrix(&m, fw, fh, 1.0); + VTranslate(&m, -s_len*fw/2, fh/2, -1.0); + VRotate(&m, YRotation, units_DEGtoRAD(yaw)); + VRotate(&m, XRotation, units_DEGtoRAD(-pitch)); + vpath_draw_string(ball_ladder_vpath, s, s_len, &m); + + VIdentMatrix(&m); + VScaleMatrix(&m, fw, fh, 1.0); + VTranslate(&m, -s_len*fw/2, fh/2, -1.0); + VRotate(&m, YRotation, units_DEGtoRAD(-yaw)); + VRotate(&m, XRotation, units_DEGtoRAD(-pitch)); + vpath_draw_string(ball_ladder_vpath, s, s_len, &m); +} + + +static void build_ball_ladder() +{ + ball_ladder_vpath = vpath_new(); + + /* Pitch ladder: */ + build_ball_draw_arc( 30,-15, 30,+15); build_ball_draw_str( 30, 20 ); + build_ball_draw_arc( 25, -3, 25, +3); + build_ball_draw_arc( 20,-10, 20,+10); build_ball_draw_str( 20, 15 ); + build_ball_draw_arc( 15, -3, 15, +3); + build_ball_draw_arc( 10, -5, 10, +5); build_ball_draw_str( 10, 10 ); + build_ball_draw_arc( 5, -3, 5, +3); + build_ball_draw_arc( 0,-45, 0,+45); + build_ball_draw_arc( -5, -3, -5, +3); + build_ball_draw_arc(-10, -5, -10, +5); build_ball_draw_str(-10, 10 ); + build_ball_draw_arc(-15, -3, -15, +3); + build_ball_draw_arc(-20,-10, -20,+10); build_ball_draw_str(-20, 15 ); + build_ball_draw_arc(-25, -3, -25, +3); + build_ball_draw_arc(-30,-15, -30,+15); build_ball_draw_str(-30, 20 ); +} + + +#define ATTITUDE_EDGES_MAX_NUMBER 200 + +static int attitude_pitch_dome_edges_number; +static VPoint attitude_pitch_dome_sky_edges[200]; +static VPoint attitude_pitch_dome_ground_edges[200]; + + +static void build_attitude_pitch_dome_background() +{ + int i, lon_deg, lat_deg; + VPoint p; + double t, lon_rad, lat_rad; + + int lon_step = 10; + int lon_max = 40; + int lat_step = 10; + int lat_max = 40; + + i = 0; + + /* + * We are drawing the edges of the "north" half doom. + * "x" goes right, "y" goes down, "z" goes forward. + * This doom is then parallel projected to the xy plane of the screen, giving + * a nice 3D effect while it rotates. + * + * Add points of the horizon line: + */ + lat_rad = 0; + for(lon_deg = -lon_max; lon_deg <= lon_max; lon_deg += lon_step){ + lon_rad = units_DEGtoRAD(lon_deg); + t = cos(lat_rad); + p = (VPoint) {t * sin(lon_rad), -sin(lat_rad), -t * cos(lon_rad)}; + attitude_pitch_dome_sky_edges[i] = p; + p.y = -p.y; + attitude_pitch_dome_ground_edges[i] = p; + i++; + } + + // Add points to the right ("meridian" at lon 30E): + lon_deg = lon_max; + lon_rad = units_DEGtoRAD(lon_deg); + for(lat_deg = lat_step; lat_deg <= lat_max; lat_deg += lat_step){ + lat_rad = units_DEGtoRAD(lat_deg); + t = cos(lat_rad); + p = (VPoint) {t * sin(lon_rad), -sin(lat_rad), -t * cos(lon_rad)}; + attitude_pitch_dome_sky_edges[i] = p; + p.y = -p.y; + attitude_pitch_dome_ground_edges[i] = p; + i++; + } + + // Add points to the upper edge ("parallel" at lat 30N): + lat_deg = lat_max; + lat_rad = units_DEGtoRAD(lat_deg); + for(lon_deg = lon_max - lon_step; lon_deg >= -lon_max; lon_deg -= lon_step){ + lon_rad = units_DEGtoRAD(lon_deg); + t = cos(lat_rad); + p = (VPoint) {t * sin(lon_rad), -sin(lat_rad), -t * cos(lon_rad)}; + attitude_pitch_dome_sky_edges[i] = p; + p.y = -p.y; + attitude_pitch_dome_ground_edges[i] = p; + i++; + } + + // Add points to the left edge ("meridian" at lon 30W): + lon_deg = -lon_max; + lon_rad = units_DEGtoRAD(lon_deg); + for(lat_deg = lat_max - lat_step; lat_deg >= lat_step; lat_deg -= lat_step){ + lat_rad = units_DEGtoRAD(lat_deg); + t = cos(lat_rad); + p = (VPoint) {t * sin(lon_rad), -sin(lat_rad), -t * cos(lon_rad)}; + attitude_pitch_dome_sky_edges[i] = p; + p.y = -p.y; + attitude_pitch_dome_ground_edges[i] = p; + i++; + } + + assert( i < ATTITUDE_EDGES_MAX_NUMBER ); + attitude_pitch_dome_edges_number = i; +} + + +/** + * Draw the pitch scale dome background. + * @param u + * @param R Maps the points of a unit radius dome to the screen. + */ +static void instruments_attitude_draw_pitch_dome_background(viewer * u, VMatrix *R) +{ + if( attitude_pitch_dome_edges_number == 0 ) + build_attitude_pitch_dome_background(); + + Alib_Point sky[ATTITUDE_EDGES_MAX_NUMBER], ground[ATTITUDE_EDGES_MAX_NUMBER]; + int i; + for( i = attitude_pitch_dome_edges_number - 1; i >= 0; i-- ){ + VPoint p; + VTransform(&attitude_pitch_dome_sky_edges[i], R, &p); + sky[i].x = p.x + 0.5; sky[i].y = p.y + 0.5; + VTransform(&attitude_pitch_dome_ground_edges[i], R, &p); + ground[i].x = p.x + 0.5; ground[i].y = p.y + 0.5; + } + + Alib_fillPolygon(u->w, sky, attitude_pitch_dome_edges_number, + attitude_pitch_sky_color); + Alib_fillPolygon(u->w, ground, attitude_pitch_dome_edges_number, + attitude_pitch_ground_color); +} + + +static void instruments_attitude_draw(viewer * u, double xo, double yo, double width) +{ + Alib_Window *w; + int j; + double bank, pitch, radius, a, r, co, si; + VMatrix R; + Alib_Matrix bankMatrix; + + w = u->v->w; + radius = 0.48 * width; + bank = INST(u)->attitude_bank; + pitch = INST(u)->attitude_pitch; + + Alib_setClipRect(w, &u->attitude); + + /* + Draw pitch scale. First, build a rotational matrix + acting on vectors of the screen frame: x axis pointing right, + y axis down, z forward: + */ + + r = 0.60 * width; /* radius of the rotating pitch scale dome */ + + VIdentMatrix(&R); + VRotate(&R, XRotation, pitch); + VRotate(&R, ZRotation, -bank); + VScaleMatrix(&R, r, r, r); + VTranslate(&R, xo, yo, 0.0); + + Alib_setClipRect(u->w, &u->attitude); + Alib_Rect rect = u->attitude; + Alib_expandRect(&rect, -0.35*radius, -0.35*radius); + Alib_setClipRect(u->w, &rect); + instruments_attitude_draw_pitch_dome_background(u, &R); + if( ball_ladder_vpath == NULL ) + build_ball_ladder(); + vpath_stroke(ball_ladder_vpath, &R, w, white_color); + Alib_setClipRect(u->w, &u->attitude); + + + /* + * Draw bank scale background. Upper half is blue, lower half is brown. + */ + r = radius; + Alib_MatrixIdentity(&bankMatrix); + Alib_MatrixRotate(&bankMatrix, bank); + Alib_MatrixScale(&bankMatrix, 0.001 * r); + Alib_MatrixTranslate(&bankMatrix, xo, yo); + Alib_fillPolygonWithMatrix(u->w, + attitude_bank_half_upper_ring->pts, + attitude_bank_half_upper_ring->npts, + &bankMatrix, attitude_bank_sky_color); + Alib_fillPolygonWithMatrix(u->w, + attitude_bank_half_lower_ring->pts, + attitude_bank_half_lower_ring->npts, + &bankMatrix, attitude_bank_ground_color); + + /* + Bank scale tick marks: + */ + + // Zero bank tick mark: + Alib_fillPolygonWithMatrix(u->w, attitude_bank_zero_tick_mark->pts, + attitude_bank_zero_tick_mark->npts, &bankMatrix, white_color); + + // 10, 20, 30, 60 and 90 DEG bank tick marks: + for( j = 10; j <= 90; j+=10 ){ + if( !( j <= 30 || (j % 30) == 0 ) ) + continue; + a = units_DEGtoRAD(j); + co = cos(a); + si = sin(a); + int outer; + if( j % 30 == 0 ) + outer = ATTITUDE_BANK_OUTER_RADIUS; // major tick outer radius + else + outer = (ATTITUDE_BANK_OUTER_RADIUS + ATTITUDE_BANK_INNER_RADIUS) / 2; // minor tick outer radius + + // bank left tick: + Alib_Point f = (Alib_Point) {ATTITUDE_BANK_INNER_RADIUS * si, -ATTITUDE_BANK_INNER_RADIUS * co}; + Alib_Point g = (Alib_Point) {outer * si, -outer * co}; + Alib_MatrixTransformPoint(&f, &bankMatrix, &f); + Alib_MatrixTransformPoint(&g, &bankMatrix, &g); + Alib_drawLine(u->w, f.x, f.y, g.x, g.y, white_color); + + // bank right tick: + f = (Alib_Point) {-ATTITUDE_BANK_INNER_RADIUS * si, -ATTITUDE_BANK_INNER_RADIUS * co}; + g = (Alib_Point) {-outer * si, -outer * co}; + Alib_MatrixTransformPoint(&f, &bankMatrix, &f); + Alib_MatrixTransformPoint(&g, &bankMatrix, &g); + Alib_drawLine(u->w, f.x, f.y, g.x, g.y, white_color); + } + + /* + Bank needle: + */ + + Alib_Matrix m; + Alib_MatrixIdentity(&m); + Alib_MatrixScale(&m, 0.001 * r); + Alib_MatrixTranslate(&m, xo, yo); + Alib_fillPolygonWithMatrix(u->w, + attitude_bank_needle->pts, + attitude_bank_needle->npts, + &m, magentaColor); + + /* + Pitch needle: + */ + + Alib_MatrixTranslate(&m, 0, radius * INST(u)->attitude_pitch_offset); + Alib_fillPolygonWithMatrix(u->w, + attitude_pitch_needle->pts, + attitude_pitch_needle->npts, + &m, magentaColor); +} + + +/* + ALTIMETER + ========= +*/ + + +static void instruments_altimeter_init(viewer *u) +{ + INST(u)->altimeter_p0 = 2992; +} + + +void instruments_altimeter_correction(viewer *u, int delta) +{ + int p0; + + if( u->inst == NULL ) + return; + + p0 = INST(u)->altimeter_p0; + + p0 += delta; + if( p0 < 2800 ) + p0 = 2800; + else if( p0 > 3100 ) + p0 = 3100; + + INST(u)->altimeter_p0 = p0; +} + + +static void instruments_altimeter_draw(viewer * u, double xo, double yo, double width) +{ + Alib_Window *w; + double alt, radius, r, r1, r2, a, fw, fh, co, si, x; + int j, hi, lo, p0; + draw_Type *dd; + char buf[20]; + + w = u->v->w; + Alib_setClipRect(w, &u->altimeter); + + radius = 0.48 * width; + + dd = draw_new(); + + draw_circle(dd, xo, yo, radius); + + j = 0; + r = 0.85 * radius; /* tick mark with number */ + r1 = 0.92 * radius; /* tick mark without number */ + r2 = 0.70 * radius; /* center circonf. for numbers */ + fh = 0.15 * radius; + for( a = 0.0; a < units_DEGtoRAD(359.9); a += units_DEGtoRAD(360.0/20.0) ){ + co = cos(a); + si = sin(a); + if( j % 10 == 0 ){ + sprintf(buf, "%d", j/10); + draw_string_centered(u->v, xo + r2*si, yo - r2*co, fh, buf, white_color); + draw_segment(dd, xo + r*si, yo - r*co, xo + radius*si, yo - radius*co); + } else { + draw_segment(dd, xo + r1*si, yo - r1*co, xo + radius*si, yo - radius*co); + } + j = j+5; + } + + /* FIXME: what if alt<0? */ + + alt = units_METERStoFEET(u->c->w.z); + /* apply altitude correction: */ + p0 = INST(u)->altimeter_p0; + alt = alt + 949.9 * (p0*0.01 - 29.92); + if( alt < -0.5 ) + alt = 1e5+alt; + + j = (int) (alt + 0.5); + j = (j + 5) / 10 * 10; + lo = j % 100; + hi = j / 100; + + /* Thousand pointer: */ + a = fmod(alt, 10000.0) * M_PI / 5000.0; + //draw_pointer(dd, xo, yo, a - units_DEGtoRAD(90.0), 0.5*radius); + drawNeedle(u->w, xo, yo, units_DEGtoRAD(90.0) - a, 0.5*radius, white_color); + + /* Hundreds pointer: */ + a = fmod(alt, 1000.0) * M_PI / 500.0; + //draw_pointer(dd, xo, yo, a - units_DEGtoRAD(90.0), 0.8*radius); + drawNeedle(u->w, xo, yo, units_DEGtoRAD(90.0) - a, 0.8*radius, white_color); + + /* Digital value, flight level part: */ + fh = 0.18*radius; + fw = VFontWidthPixels(u->v, (int) (fh+0.5)); + sprintf(buf, "%03d", hi); + x = fw * 1.0; + VDrawStrokeString(u->v, + (int) (xo - fw * (strlen(buf)-1) + 0.5), + (int) (yo - 0.2*radius + 0.5), + buf, strlen(buf), (int)(fh+0.5), white_color); + + /* Digital value, last two digits: */ + fh = 0.12*radius; + fw = VFontWidthPixels(u->v, (int)(fh+0.5)); + sprintf(buf, "%02d", lo); + VDrawStrokeString(u->v, + (int) (xo + x + 0.5), + (int) (yo - 0.2*radius + 0.5), + buf, strlen(buf), (int)(fh+0.5), white_color); + + /* + Draw altitude correction: + */ + draw_string_centered(u->v, xo, yo + 0.1*radius, 0.10*radius, "inHg hPa", white_color); + sprintf(buf, "%2.2f %04d", 0.01*p0, (int)(1013.25/29.92 * 0.01 * p0 + 0.5)); + draw_string_centered(u->v, xo, yo+0.30*radius, 0.10*radius, buf, white_color); + + draw_string_centered(u->v, xo, yo-0.5*radius, 0.10*radius, "FEET", white_color); + + draw_stroke(dd, u->v, white_color); + draw_free(dd); +} + + +/* + Vertical speed indicator (VSI) + ============================== +*/ + +static double vario[] = {0.0, 100.0, 200.0, 300.0, 400.0, 500.0, 1000.0, + 2000.0, 3000.0, 4000.0, -1.0}; + + +static double map_vario_to_angle(double v) +{ + static double k = 0.0; + double a; + + if( k == 0.0 ){ + /* limit of the scale at 4000 ft/min: */ + k = M_PI / (sqrt(4500.0 + 15.0*15.0) - 15.0); + } + + v = fmin(v, 4000.0); + v = fmax(v, -4000.0); + + a = k * (sqrt(fabs(v) + 15.0*15.0) - 15.0); + + if( v < 0.0 ) + a = -a; + + return a; +} + + +static void instruments_vsi_init(viewer *u) +{ + INST(u)->vsi_last_upd = curTime; + INST(u)->vsi_last_vs = - u->c->Cg.z * 60.0; /* vertical speed, ft/min */ +} + + +#define VSI_K (1.0/4.0) +/* + If the vertical speed changes abruptly from vs(0) to some vs_actual, + then in our model of the instrument lag the indicated vertical speed + will be: + + vs(t) = (vs(0) - vs_actual) * exp(-VSI_K*t) + vs_actual + + where 1/VSI_K is the "time constant" (i.e. an extimation of the lag time). +*/ + + +static void instruments_vsi_update(viewer *u) +{ + double vs, dt; + + vs = - u->c->Cg.z * 60.0; /* vertical speed, ft/min */ + dt = curTime - INST(u)->vsi_last_upd; + INST(u)->vsi_last_vs += VSI_K * (vs - INST(u)->vsi_last_vs) * dt; + INST(u)->vsi_last_upd = curTime; +} + + +static void instruments_vsi_draw(viewer * u, double xo, double yo, double width) +{ + Alib_Window *w; + double climb, radius, r, r1, r2, r3, a, fh, co, si; + int j; + draw_Type *dd; + char buf[20]; + + w = u->v->w; + Alib_setClipRect(w, &u->vsi); + + radius = 0.48 * width; + + dd = draw_new(); + + draw_circle(dd, xo, yo, radius); + + r1 = 0.87 * radius; /* tick mark with number */ + r2 = 0.92 * radius; /* tick mark without number */ + r3 = 0.70 * radius; /* center of the number */ + fh = 0.12 * radius; + j = 0; + while( vario[j] >= 0 ){ + climb = vario[j]; + a = map_vario_to_angle(climb); + co = cos(a); + si = sin(a); + sprintf(buf, "%.0f", climb/100); + if( (int) (climb + 0.5) % 500 == 0 ){ + draw_string_centered(u->v, xo - r3*co, yo - r3*si, fh, buf, white_color); + draw_string_centered(u->v, xo - r3*co, yo + r3*si, fh, buf, white_color); + r = r1; + } else { + r = r2; + } + draw_segment(dd, xo - r*co, yo - r*si, xo - radius*co, yo - radius*si); + /* FIXME: because of a bug in Vlib, drawing a segment over another + segment results in no segment drawn at all! This if() fixes that: */ + if( j != 0 ) + draw_segment(dd, xo - r*co, yo + r*si, xo - radius*co, yo + radius*si); + j++; + } + + a = map_vario_to_angle(INST(u)->vsi_last_vs); + //draw_pointer(dd, xo, yo, a - M_PI, 0.80*radius); + drawNeedle(u->w, xo, yo, M_PI - a, 0.80*radius, white_color); + +#ifdef DEBUG + /* actual v.s.: */ + climb = - u->c->Cg.z * 60.0; /* climb ratio, ft/min */ + a = map_vario_to_angle(climb); + draw_pointer(dd, xo, yo, a - M_PI, 0.40*radius); +#endif + + draw_string_centered(u->v, xo, yo-0.3*radius, 0.15*radius, "FPM", white_color); + draw_string_centered(u->v, xo, yo+0.3*radius, 0.12*radius, "x100", white_color); + + draw_stroke(dd, u->v, white_color); + draw_free(dd); +} + + +/* + AutoPilot System lights panel + ============================= +*/ + +static void instruments_ap_panel(viewer *u, double x1, double y1, double x2, double y2) +{ + Alib_Window *w; + double margin, width, h, fh; + + void draw_light(char *label, int order, _BOOL on) + { + double xa, ya, xb, yb; + Alib_Rect r; + + xa = x1 + order*width + margin; + ya = y1 + margin; + xb = x1 + order*width + width - margin; + yb = y1 + h - margin; + if( on ){ + Alib_setRect(&r, xa, ya, xb, yb); + Alib_fillRect(w, &r, magentaColor); + } + draw_string_centered(u->v, (xa+xb)/2.0, (ya+yb)/2.0, + fh, label, black_color); + } + + + w = u->w; + Alib_setClipRect(w, &u->stripe); + + /* size of every light: */ + width = (x2-x1)/7.0; + h = y2-y1; + + /* margin around each light: */ + margin = 0.1*h; + + /* font height: */ + fh = 0.5 * (h - 2.0*margin); + + draw_light("Rate", 0, aps_rate_control_enabled(u->c)); + + draw_light("VS/ALT", 1, aps_ap_enabled(u->c) + && ( ! aps_ap_warn(u->c) || ! blink )); + + draw_light("Nav", 2, aps_an_enabled(u->c) + && ( ! aps_an_warn(u->c) || ! blink )); + + draw_light("Land", 3, aps_al_enabled(u->c) + && ( ! aps_al_warn(u->c) || ! blink )); + + draw_light("Turn", 4, aps_aw_enabled(u->c) + && ( ! aps_aw_warn(u->c) || ! blink )); + + draw_light("Thr", 5, aps_at_enabled(u->c) + && ( ! aps_at_warn(u->c) || ! blink )); + + draw_light("Coord", 6, aps_ac_enabled(u->c) + && ( ! aps_ac_warn(u->c) || ! blink )); +} + + +/* + TIMER + ===== +*/ + + +static void instruments_timer_init(viewer *u) +{ + INST(u)->timer_op = 0; /* do not display */ +} + + +void instruments_timer_toggle(viewer *u) +{ + if( u->inst == NULL ) + return; + + INST(u)->timer_op = (INST(u)->timer_op + 1) % 3; + + if ( INST(u)->timer_op == 1 ) { + INST(u)->timer_offset = curTime; + + } else if ( INST(u)->timer_op == 2 ) { + INST(u)->timer_freezed = (int) (curTime - INST(u)->timer_offset + 0.5); + + } +} + + +static void instruments_timer_draw(viewer *u, double x1, double y1, double x2, double y2) +{ + Alib_Window *w; + int t, l; + double h, fh, fw; + char buffer[20]; + Alib_Rect rect; + + if ( INST(u)->timer_op == 0 ) { + return; + + } else if ( INST(u)->timer_op == 1 ) { + t = (int) (curTime - INST(u)->timer_offset); + + } else { + t = INST(u)->timer_freezed; + } + + if (t >= 3600) { + int h, m, s; + h = t / 3600; + t = t % 3600; + m = t / 60; + s = t % 60; + sprintf(buffer, "%d:%02d:%02d", h, m, s); + } else if (t >= 60) { + int m, s; + m = t / 60; + s = t % 60; + sprintf(buffer, "%d:%02d", m, s); + } else { + sprintf(buffer, "%d", t); + } + + /* + Background: + */ + w = u->v->w; + h = y2 - y1; + Alib_setRect(&rect, x1, y1, x2, y2); + Alib_setClipRect(w, &rect); + + fh = h/2.0; + fw = VFontWidthPixels(u->v, (int)(fh+0.5)); + l = strlen(buffer); + + VDrawStrokeString(u->v, + (int) (x2 - (l+2)*fw + 0.5), + (int) (y1 + h/2.0 + fh/2.0 + 0.5), + buffer, l, (int)(fh+0.5), white_color); +} + + +void instruments_update(viewer * u) +{ + if( u->inst == NULL ) + return; + + instruments_attitude_update(u); + instruments_vsi_update(u); +} + + +void instruments_draw(viewer * u) +{ + Alib_Window *w; + double width; + Alib_Rect rect; + + /* Update instruments. */ + + if( u->inst == NULL || ! INST(u)->enabled ) + return; + + w = u->v->w; + + /* We have only the flux gate, not an inertial platform: */ + u->c->showMag = TRUE; + + /* Update blink flag: */ + if( curTime >= blink_toggle_time ){ + blink = ! blink; + if( blink ) + blink_toggle_time = curTime + 0.1; + else + blink_toggle_time = curTime + 0.3; + } + + /* Clear area of the classic instruments: */ + Alib_setRect(&rect, 0, u->stripe.a.y, gui_getWidth(u->gui), u->engine.a.y); + Alib_setClipRect(w, &rect); + Alib_fillRect(w, &rect, panelBackgroundColor); + + width = RectWidth(u->vsi); /* FIXME: see FIXME above */ + + /* Instruments that occupy a standard slot: */ + instruments_turnslip_draw (u, u->turn.a.x+width/2.0, u->turn.a.y+width/2.0, width); + instruments_anemometer_draw(u, u->anemometer.a.x+width/2.0, u->anemometer.a.y+width/2.0, width); + instruments_attitude_draw (u, u->attitude.a.x+width/2.0, u->attitude.a.y+width/2.0, width); + instruments_altimeter_draw (u, u->altimeter.a.x+width/2.0, u->altimeter.a.y+width/2.0, width); + instruments_vsi_draw (u, u->vsi.a.x+width/2, u->vsi.a.y+width/2, width); + + /* Timer and auto-pilot system lights goes in the stripe: */ + instruments_timer_draw (u, u->stripe.a.x, u->stripe.a.y, width, u->stripe.b.y); + instruments_ap_panel (u, width, u->stripe.a.y, u->stripe.b.x, u->stripe.b.y); +} + + +void instruments_enable(viewer * u) +{ + if( u->inst == NULL ){ + instruments_init(); + if( free_list == NULL ){ + u->inst = memory_allocate( sizeof(instruments_Type), NULL ); + } else { + u->inst = free_list; + free_list = free_list->next; + INST(u)->next = NULL; + } + instruments_anemometer_init(u); + instruments_attitude_init(u); + instruments_altimeter_init(u); + instruments_vsi_init(u); + instruments_timer_init(u); + } + INST(u)->enabled = TRUE; +} + + +void instruments_disable(viewer * u) +{ + if( u->inst == NULL ) + return; + INST(u)->enabled = FALSE; +} + + +_BOOL instruments_isEnabled(viewer * u) +{ + return (u->inst != NULL) && INST(u)->enabled; +} + + +void instruments_free(viewer *u) +{ + if( u->inst == NULL ) + return; + + INST(u)->next = free_list; + free_list = u->inst; + u->inst = NULL; +} diff -Nru acm-5.0/src/acm/instruments.h acm-6.0+20200416/src/acm/instruments.h --- acm-5.0/src/acm/instruments.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/instruments.h 2017-08-16 08:36:06.000000000 +0000 @@ -0,0 +1,115 @@ +/* + * acm : an aerial combat simulator for X + * Classic instruments module + * Copyright (C) 2007 Umberto Salsi + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +/** + * This module takes care to update and draw the upper strip of the controls + * panel containing the classic instruments, which includes: + * + * - timer + * - APS lights + * - turn and slip indicator + * - anemometer + * - artificial horizon + * - altimeter + * - vertical speed indicator + * + * A data structure holding the state of these instruments is allocated and + * attached to the aircraft data structure only after a request by the pilot, + * and hereafter updated. + * + * @file + */ + +#ifndef _instruments_h +#define _instruments_h + +#include "pm.h" + +#ifdef instruments_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +/** + * Enables the classic instruments panel. The state of each instrument is created + * and saved into the aircraft's "instruments" field if does not exist already. + * @param u + */ +EXTERN void instruments_enable(viewer * u); + +/** + * Disables the classic instruments panel. Does nothing if a classic instruments + * data structure does not already exist. + * @param u + */ +EXTERN void instruments_disable(viewer * u); + +/** + * Returns true if the classic instruments panel is currently enabled. + * @param u + * @return + */ +EXTERN _BOOL instruments_isEnabled(viewer * u); + +/** + * The little aircraft frame in front of the attitude indicator can be + * adjusted in pitch by the pilot moving up and down by delta RAD up to + * +/-10 DEG. + */ +EXTERN void instruments_attitude_adjust_pitch(viewer * u, double delta); + +/** + * Erects gyro vertical to case orientation. + */ +EXTERN void instruments_attitude_reset(viewer * u); + +/** + * Sets altimeter altitude correction. 'delta' is hundreds of inHg, for + * example if the current altitude correction is 29.92 inHg (the default) + * and delta==-1, the new altitude correction will be 29.91 inHg. + */ +EXTERN void instruments_altimeter_correction(viewer *u, int delta); + +/** + * Starts/stops/resets timer. + */ +EXTERN void instruments_timer_toggle(viewer *u); + +/** + * Updates the state the instruments if their data structure has been already + * created. Does nothing if no instruments data structure not allocated. + */ +EXTERN void instruments_update(viewer * u); + +/** + * Draws the instruments if their data structure has been already created. + * Does nothing if data structure not allocated or allocated but currently not + * enabled (that is, HUD displayed instead). + */ +EXTERN void instruments_draw(viewer * u); + +/** + * Releases the data structure u->inst (if not NULL). Data "released" + * are not actually released from memory, but reused if required. + */ +EXTERN void instruments_free(viewer *u); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/interpolate.c acm-6.0+20200416/src/acm/interpolate.c --- acm-5.0/src/acm/interpolate.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/interpolate.c 2017-04-03 06:58:15.000000000 +0000 @@ -0,0 +1,80 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991,1992 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#include +#include +#include "../util/memory.h" +#include "../util/error.h" + +#define interpolate_IMPORT +#include "interpolate.h" + +static void interpolate_destruct(void *p) +{ + interpolate_Table *oldp = p; + if ( oldp != NULL ) { + memory_dispose(oldp->entry); + } +} + + +interpolate_Table * interpolate_new(int size) +{ + interpolate_Table *t = memory_allocate(sizeof(interpolate_Table), interpolate_destruct); + t->entry = memory_allocate(size * sizeof(interpolate_Entry), NULL); + return t; +} + + +double interpolate_value(interpolate_Table * table, double x) +{ + int i, count = table->count; + + if ( ! (x >= table->minX && x <= table->entry[count - 1].x) ) { + error_internal("interpolate(..., %g): value out of the range [%g,%g]\n", + x, table->minX, table->entry[count - 1].x); + } + + for (i = 0; i < count; ++i) { + if (x <= table->entry[i].x) { + return (table->entry[i].m * x + table->entry[i].b); + } + } + + /* should never reach this point */ + error_internal("i=%d", i); +} + + +interpolate_Table * interpolate_clone (interpolate_Table *oldp) +{ + interpolate_Table * newp; + int i; + + if ( oldp == NULL ) + return NULL; + + newp = memory_allocate(sizeof(interpolate_Table), interpolate_destruct); + *newp = *oldp; + newp->entry = memory_allocate(sizeof(interpolate_Entry) * (oldp->count), NULL); + for (i=0; icount; ++i) { + newp->entry[i] = oldp->entry[i]; + } + + return newp; +} diff -Nru acm-5.0/src/acm/interpolate.h acm-6.0+20200416/src/acm/interpolate.h --- acm-5.0/src/acm/interpolate.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/interpolate.h 2017-04-16 08:19:11.000000000 +0000 @@ -0,0 +1,75 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991,1992,1997 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +/** + * Some data structures to perform fast 2-D interpolation + * + * A lot of aircraft information is in tabular form. We perform linear + * interpolation to determine values. In order to speed up that process, + * we'll create preprocessed tables. Each entry in the table contains the + * upper bound of the domain value (x) and the equation of the line that + * defines the data for that interval (y = m * x + b). + * + * @file + */ + +#ifndef _interpolate_h +#define _interpolate_h + +#include + +#ifdef interpolate_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +typedef struct { + double x; /* upper x value for this interval */ + double m; /* slope of line in this interval */ + double b; /* y-intercept of line in this interval */ +} interpolate_Entry; + +typedef struct { + int count; /* entry count in the interpolation table */ + double minX; /* minimum x value that can be interpolated */ + interpolate_Entry *entry; /* vector of interpolation entries */ +} interpolate_Table; + +/** + * Allocates a new interpolation table. + * @param size Number of entries. + * @return New allocated table. Can be released with memory_dispose(). + */ +EXTERN interpolate_Table * interpolate_new(int size); + +/** + * Determine the value of a function of one variable by interpolation. + * Interpolation tables are built by the 'ibuild' utility. + */ +EXTERN double interpolate_value(interpolate_Table * table, double x); + +/** + * Returns a copy of the given table. + * @param oldp + * @return Copy of the given table. Can be released with memory_dispose(). + */ +EXTERN interpolate_Table * interpolate_clone (interpolate_Table *oldp); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/inventory.c acm-6.0+20200416/src/acm/inventory.c --- acm-5.0/src/acm/inventory.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/inventory.c 2018-04-02 06:09:56.000000000 +0000 @@ -0,0 +1,1791 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1998 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#include +#include +#include +#include +#include + +#include "../util/error.h" +#include "../util/memory.h" +#include "../util/reader.h" +#include "../util/units.h" +#include "init.h" +#include "planes.h" +#include "pm.h" +#include "weapon.h" + +#define inventory_IMPORT +#include "inventory.h" + +/** + * The entity_object_map is used to map DIS entity types to a + * displayable object. + */ +typedef struct _entity_object_map { + dis_entity_type entity_type; + dis_entity_type entity_mask; + char * object_name; + VObject *obj; +} entity_object_map; + +/** + * Currently active craft types. This double-linked list includes: + * - Aircraft types loaded from the inventory file. + * - Missiles created in the respective modules. + * - Drop bombs created in the ccip module. + * - Cannon shells created by the m61a1 module. + * - Runways, the name being the name of the airport and the polygons being + * one or several runways of that airport. + * - Features. + */ +static craftType *craft_types; + +// Recycled craft types. +static craftType *craft_types_pool; + + +craftType * inventory_craftTypeNew(zone_Type *zone) +{ + craftType *c; + if( craft_types_pool == NULL ){ + c = memory_allocate(sizeof(craftType), NULL); + memset(c, 0, sizeof(craftType)); + } else { + c = craft_types_pool; + craft_types_pool = c->next; + } + c->next = craft_types; + c->prev = NULL; + c->zone = zone; + if( craft_types != NULL ) + craft_types->prev = c; + craft_types = c; + return c; +} + + +/** + * Removes a craft type and put into the recycle pool. + * @param c + */ +void inventory_craftTypeRelease(craftType *c) +{ + if( c->prev == NULL ){ + if( c->next != NULL ) + c->next->prev = NULL; + craft_types = c->next; + } else { + c->prev->next = c->next; + if( c->next != NULL ) + c->next->prev = c->prev; + } + + memory_dispose(c->name); + if( c->object != NULL ) + VDestroyObject (c->object); + memory_dispose(c->objname); + memory_dispose(c->description); + memory_dispose(c->modelname); + memory_dispose(c->CLift); + memory_dispose(c->CDb); + memory_dispose(c->CnBeta); + memory_dispose(c->ClBeta); + memory_dispose(c->Thrust); + memory_dispose(c->ABThrust); + int i; + for (i=0; istation[i].type); + } + memset(c, 0, sizeof(craftType)); + c->next = craft_types_pool; + craft_types_pool = c; +} + + + +struct lex_record; + +typedef enum { + RESERVED_WORD, + vtDOUBLE, + vtLONG, + vtANGLE, + vtNMILES, + vtKNOTS, + vtTABLE, + vtPOINT, + vtSTRING, + vtSTATION, + vtENTITY +} value_type; + +typedef enum { + Nil, + EndOfFile, + +/* + * Reserved words must be added to this section + */ + + TOKEN_NUMBER, + RW_PUNCTUATION, + TOKEN_STRING, + TOKEN_LEFT_BRACE, + TOKEN_RIGHT_BRACE, + TOKEN_COMMA, + TOKEN_COLON, + TOKEN_SEMICOLON, + RW_INCLUDE, + RW_USE, + RW_AIRCRAFT, + RW_DESCRIPTION, + RW_ENGINE_TYPE, + RW_HARDPOINT, + RW_KINETIC, + RW_EXPLOSIVE, + +/* + * Fields in the craftType structure must be added in this section + */ + + Object, + InternalModel, + AspectRatio, + BetaStall, + CLift, + CDb, + CnBeta, + ClBeta, + CDBOrigin, + CDBFactor, + CDBPhase, + CYbeta, + Clda, + Cldr, + Clp, + Cmq, + Cnr, + maxAileron, + maxRudder, + effElevator, + effRudder, + Ixx, + Iyy, + Izz, + CmAlpha, + MaxFlap, + CFlap, + FlapDrag, + FlapRate, + CGearDrag, + GearRate, + MaxSpeedBrake, + CSpeedBrake, + SpeedBrakeRate, + SpeedBrakeIncr, + WingArea, + WingSpan, + WingChord, + WingHeight, + EmptyWeight, + MaxLoadZPositive, + MaxLoadZNegative, + MaxFuel, + EngineType, + MaxThrust, + MaxABThrust, + Thrust, + ABThrust, + HasThrustReverser, + EngineLag, + SpFuelConsump, + SpABFuelConsump, + GroundingPoint, + ViewPoint, + MuStatic, + MuKinetic, + MuBStatic, + MuBKinetic, + MaxNWDef, + Rm, + Rn, + Dm, + Dn, + Km, + Kn, + Gm, + Gn, + CmMax, + CnMax, + TailExtent, + MTOW, + Vs0, + Vs1, + Vfe, + Vno, + Vne, + StructurePts, + RadarOutput, + RadarTRange, + RadarDRange, + TEWSThreshold, + HardPoint0, + HardPoint1, + HardPoint2, + HardPoint3, + HardPoint4, + HardPoint5, + HardPoint6, + HardPoint7, + HardPoint8, + WeaponStation, + WeaponCount, + DISEntityType, + Description +} field_id; + +struct keyword_info { + char *word; + value_type type; + field_id id; + char *ptr; +}; + + +static craftType xxx; + +#define A(x) (char *) x + +#define B(x) ParseEngineType(&c.engineType) + +static struct keyword_info keywords[] = +{ + {"Description", vtSTRING, Description, A(&xxx.description)}, + {"Object", vtSTRING, Object, A(&xxx.objname)}, + {"InternalModel", vtSTRING, InternalModel, A(&xxx.modelname)}, + {"AspectRatio", vtDOUBLE, AspectRatio, A(&xxx.aspectRatio)}, + {"BetaStall", vtANGLE, BetaStall, A(&xxx.betaStall)}, + {"CLift", vtTABLE, CLift, A(&xxx.CLift)}, + {"CDb", vtTABLE, CDb, A(&xxx.CDb)}, + {"CnBeta", vtTABLE, CnBeta, A(&xxx.CnBeta)}, + {"ClBeta", vtTABLE, ClBeta, A(&xxx.ClBeta)}, + {"CDBOrigin", vtDOUBLE, CDBOrigin, A(&xxx.CDBOrigin)}, + {"CDBFactor", vtDOUBLE, CDBFactor, A(&xxx.CDBFactor)}, + {"CDBPhase", vtANGLE, CDBPhase, A(&xxx.CDBPhase)}, + {"CYBeta", vtDOUBLE, CYbeta, A(&xxx.CYbeta)}, + {"Clda", vtDOUBLE, Clda, A(&xxx.Clda)}, + {"Cldr", vtDOUBLE, Cldr, A(&xxx.Cldr)}, + {"Clp", vtDOUBLE, Clp, A(&xxx.Clp)}, + {"Cmq", vtDOUBLE, Cmq, A(&xxx.Cmq)}, + {"Cnr", vtDOUBLE, Cnr, A(&xxx.Cnr)}, + {"MaxAileron", vtANGLE, maxAileron, A(&xxx.maxAileron)}, + {"MaxRudder", vtANGLE, maxRudder, A(&xxx.maxRudder)}, + {"EffElevator", vtDOUBLE, effElevator, A(&xxx.effElevator)}, + {"EffRudder", vtDOUBLE, effRudder, A(&xxx.effRudder)}, + {"Ixx", vtDOUBLE, Ixx, A(&xxx.I.m[0][0])}, + {"Iyy", vtDOUBLE, Iyy, A(&xxx.I.m[1][1])}, + {"Izz", vtDOUBLE, Izz, A(&xxx.I.m[2][2])}, + {"CmAlpha", vtDOUBLE, CmAlpha, A(&xxx.cmSlope)}, + {"MaxFlap", vtANGLE, MaxFlap, A(&xxx.maxFlap)}, + {"CFlap", vtDOUBLE, CFlap, A(&xxx.cFlap)}, + {"CFlapDrag", vtDOUBLE, FlapDrag, A(&xxx.cFlapDrag)}, + {"FlapRate", vtANGLE, FlapRate, A(&xxx.flapRate)}, + {"CGearDrag", vtDOUBLE, CGearDrag, A(&xxx.cGearDrag)}, + {"GearRate", vtANGLE, GearRate, A(&xxx.gearRate)}, + {"MaxSpeedBrake", vtANGLE, MaxSpeedBrake, A(&xxx.maxSpeedBrake)}, + {"CSpeedBrake", vtDOUBLE, CSpeedBrake, A(&xxx.cSpeedBrake)}, + {"SpeedBrakeRate", vtANGLE, SpeedBrakeRate, A(&xxx.speedBrakeRate)}, + {"SpeedBrakeIncr", vtANGLE, SpeedBrakeIncr, A(&xxx.speedBrakeIncr)}, + {"WingArea", vtDOUBLE, WingArea, A(&xxx.wingS)}, + {"WingHalfSpan", vtDOUBLE, WingSpan, A(&xxx.wings)}, + {"WingHeight", vtDOUBLE, WingHeight, A(&xxx.wingh)}, + {"Chord", vtDOUBLE, WingChord, A(&xxx.c)}, + {"EmptyWeight", vtDOUBLE, EmptyWeight, A(&xxx.emptyWeight)}, + {"MaxLoadZPositive", vtDOUBLE, MaxLoadZPositive, A(&xxx.maxLoadZPositive)}, + {"MaxLoadZNegative", vtDOUBLE, MaxLoadZNegative, A(&xxx.maxLoadZNegative)}, + {"MaxFuel", vtDOUBLE, MaxFuel, A(&xxx.maxFuel)}, + {"MaxThrust", vtDOUBLE, MaxThrust, A(&xxx.maxThrust)}, + {"MaxABThrust", vtDOUBLE, MaxABThrust, A(&xxx.maxABThrust)}, + {"Thrust", vtTABLE, Thrust, A(&xxx.Thrust)}, + {"ABThrust", vtTABLE, ABThrust, A(&xxx.ABThrust)}, + {"HasThrustReverser", vtLONG, HasThrustReverser, A(&xxx.hasThrustReverser)}, + {"EngineLag", vtDOUBLE, EngineLag, A(&xxx.engineLag)}, + {"SpFuelConsump", vtDOUBLE, SpFuelConsump, A(&xxx.spFuelConsump)}, + {"SpABFuelConsump", vtDOUBLE, SpABFuelConsump, A(&xxx.spABFuelConsump)}, + {"ViewPoint", vtPOINT, ViewPoint, A(&xxx.viewPoint)}, + {"MuStatic", vtDOUBLE, MuStatic, A(&xxx.muStatic)}, + {"MuKinetic", vtDOUBLE, MuKinetic, A(&xxx.muKinetic)}, + {"MuBStatic", vtDOUBLE, MuBStatic, A(&xxx.muBStatic)}, + {"MuBKinetic", vtDOUBLE, MuBKinetic, A(&xxx.muBKinetic)}, + {"MaxNWDef", vtANGLE, MaxNWDef, A(&xxx.maxNWDef)}, + {"Rm", vtPOINT, Rm, A(&xxx.rm)}, + {"Rn", vtPOINT, Rn, A(&xxx.rn)}, + {"Dm", vtDOUBLE, Dm, A(&xxx.Dm)}, + {"Dn", vtDOUBLE, Dn, A(&xxx.Dn)}, + {"Km", vtDOUBLE, Km, A(&xxx.Km)}, + {"Kn", vtDOUBLE, Kn, A(&xxx.Kn)}, + {"Gm", vtDOUBLE, Gm, A(&xxx.Gm)}, + {"Gn", vtDOUBLE, Gn, A(&xxx.Gn)}, + {"CmMax", vtDOUBLE, CmMax, A(&xxx.cmMax)}, + {"CnMax", vtDOUBLE, CnMax, A(&xxx.cnMax)}, + {"TailExtent", vtPOINT, TailExtent, A(&xxx.tailExtent)}, + {"MTOW", vtDOUBLE, MTOW, A(&xxx.MTOW)}, + {"Vs0", vtDOUBLE, Vs0, A(&xxx.Vs0)}, + {"Vs1", vtDOUBLE, Vs1, A(&xxx.Vs1)}, + {"Vfe", vtDOUBLE, Vfe, A(&xxx.Vfe)}, + {"Vno", vtDOUBLE, Vno, A(&xxx.Vno)}, + {"Vne", vtDOUBLE, Vne, A(&xxx.Vne)}, + {"StructurePoints", vtLONG, StructurePts, A(&xxx.structurePts)}, + {"RadarOutput", vtDOUBLE, RadarOutput, A(&xxx.radarOutput)}, + {"RadarTRange", vtNMILES, RadarTRange, A(&xxx.radarTRange)}, + {"RadarDRange", vtNMILES, RadarDRange, A(&xxx.radarDRange)}, + {"TEWSThreshold", vtDOUBLE, TEWSThreshold, A(&xxx.TEWSThreshold)}, + {"HardPoint1", vtPOINT, HardPoint1, A(&xxx.wStation[1])}, + {"HardPoint2", vtPOINT, HardPoint2, A(&xxx.wStation[2])}, + {"HardPoint3", vtPOINT, HardPoint3, A(&xxx.wStation[3])}, + {"HardPoint4", vtPOINT, HardPoint4, A(&xxx.wStation[4])}, + {"HardPoint5", vtPOINT, HardPoint5, A(&xxx.wStation[5])}, + {"HardPoint6", vtPOINT, HardPoint6, A(&xxx.wStation[6])}, + {"HardPoint7", vtPOINT, HardPoint7, A(&xxx.wStation[7])}, + {"HardPoint8", vtPOINT, HardPoint8, A(&xxx.wStation[8])}, + {"HardPoint0", vtPOINT, HardPoint0, A(&xxx.wStation[0])}, + {"WeaponCount", vtLONG, WeaponCount, A(&xxx.sCount)}, + {"WeaponStation", vtSTATION, WeaponStation, 0}, + + {"include", RESERVED_WORD, RW_INCLUDE, 0}, + {"use", RESERVED_WORD, RW_USE, 0}, + {"aircraft", RESERVED_WORD, RW_AIRCRAFT, 0}, + {"description", RESERVED_WORD, RW_DESCRIPTION, 0}, + {"EngineType", RESERVED_WORD, RW_ENGINE_TYPE, 0}, + {"hardpoint", RESERVED_WORD, RW_HARDPOINT, 0}, + {"kinetic", RESERVED_WORD, RW_KINETIC, 0}, + {"explosive", RESERVED_WORD, RW_EXPLOSIVE, 0}, + {"blast", RESERVED_WORD, RW_EXPLOSIVE, 0}, + + {"DISEntityType", vtENTITY, DISEntityType, A(&xxx.entityType)}, + {"DISAltEntityType", vtENTITY, DISEntityType, A(&xxx.altEntityType)}, + + {NULL, RESERVED_WORD, Nil, 0} +}; + +typedef union { + struct keyword_info *kw; + double double_value; + interpolate_Table *table_value; + char *string_value; + long long_value; +} lex_val; + +static lex_val lex_value; + +struct lex_record { + char *filename; + FILE *f; + int lineno; + int lookahead_valid; + int lookahead; + int stack_top; + lex_val value_stack[16]; +}; + + +#define push_value(p, type, val) \ + p->value_stack[p->stack_top++].type = val + +#define pop_value(p, type) (p->value_stack[--p->stack_top].type) + +#define input(p) (p->lookahead_valid \ + ? (p->lookahead_valid = 0, p->lookahead) \ + : (((p->lookahead = getc(p->f)) == '\n') \ + ? (p->lineno++, p->lookahead) \ + : p->lookahead)) + +#define unput(p, c) { p->lookahead = c; p->lookahead_valid = 1; } + +static char token[256]; +static int token_length = 0; + +#define STATE_INITIAL 0 +#define STATE_WORD 1 +#define STATE_NUMBER 2 +#define STATE_STRING 3 +#define STATE_COMMENT 4 + + +static struct lex_record * +OpenSourceFile(char *name) +{ + struct lex_record *p; + FILE *f; + + if ((f = fopen(name, "r")) == (FILE *) NULL) { + return (struct lex_record *) NULL; + } + + p = (struct lex_record *) memory_allocate(sizeof(struct lex_record), NULL); + + p->filename = memory_strdup(name); + p->lineno = 1; + p->lookahead_valid = 0; + p->stack_top = 0; + p->f = f; + + return p; +} + +static void +ParseError(struct lex_record *p, char *s) +{ + error_external("%s:%): %s", p->filename, p->lineno, s); +} + +static field_id +NextTokenx(struct lex_record *p) +{ + register int c, state = STATE_INITIAL; + register struct keyword_info *q; + + token_length = 0; + + while ((c = input(p)) != EOF) { + + switch (state) { + + case STATE_INITIAL: + + if (isalpha(c)) { + token[token_length++] = c; + state = STATE_WORD; + } + else if (isspace(c)) { + continue; + } + else if (isdigit(c) || c == '-' || c == '+' || c == '.') { + token[token_length++] = c; + state = STATE_NUMBER; + } + else if (c == '"') { + state = STATE_STRING; + } + else if (c == '#') { + state = STATE_COMMENT; + } + else { + token[0] = c; + token[1] = '\0'; + switch (c) { + case ',': + return TOKEN_COMMA; + case ':': + return TOKEN_COLON; + case ';': + return TOKEN_SEMICOLON; + case '{': + return TOKEN_LEFT_BRACE; + case '}': + return TOKEN_RIGHT_BRACE; + default: + ParseError(p, "invalid character"); + state = STATE_INITIAL; + } + } + break; + + case STATE_WORD: + case STATE_NUMBER: + if (isspace(c) || c == ':' || c == ',' || c == '{' || c == '}') { + token[token_length] = '\0'; + unput(p, c); + if (state == STATE_WORD) { + for (q = keywords; q->word; ++q) { + if (strcmp(q->word, token) == 0) { + lex_value.kw = q; + return q->id; + } + } + return Nil; + } + else { + errno = 0; + char *end; + lex_value.double_value = strtod( token, &end ); + if( end == token || *end != 0 ) + error_external("%s:%d: invalid syntax for number: %s", p->filename, p->lineno, token); + if (errno == ERANGE) + error_external("%s:%d: floating point number out of the range: %s", p->filename, p->lineno, token); + return TOKEN_NUMBER; + } + } + else { + token[token_length++] = c; + } + break; + + case STATE_STRING: + + switch (c) { + + case '"': + token[token_length] = '\0'; + return TOKEN_STRING; + + case '\n': + ParseError(p, "strings cannot span a line"); + unput(p, c); + state = STATE_INITIAL; + break; + + case '\\': + + switch (c = input(p)) { + + case EOF: + ParseError(p, "Premature End-of-file"); + break; + + case 'n': + token[token_length++] = '\n'; + break; + + case 't': + token[token_length++] = '\t'; + break; + + default: + token[token_length++] = c; + break; + } + + default: + token[token_length++] = c; + break; + } + break; + + case STATE_COMMENT: + while (c != EOF) { + if (c == '\n') + break; + c = input(p); + } + state = STATE_INITIAL; + break; + + } + } + + return EndOfFile; +} + +static field_id +NextToken(struct lex_record * p) +{ + field_id t; + + t = NextTokenx(p); + return t; +} + +/* + * Skip to the specified token, if token is Nil, then skip to the end of the + * current line. + */ + +static void +Resync(struct lex_record *p, field_id token) +{ + field_id t; + int c; + + if (token == Nil) { + while ((c = input(p)) != EOF) { + if (c == '\n') + break; + } + } + else { + while ((t = NextToken(p)) != EndOfFile) { + if (t == token) + break; + } + } + +} + +/* + * Parse syntax: '{' number ',' number ',' number '}' + */ + +static int +ParsePoint(struct lex_record *p) +{ + + if (NextToken(p) != TOKEN_LEFT_BRACE) { + Resync(p, TOKEN_RIGHT_BRACE); + return -1; + } + + if (NextToken(p) != TOKEN_NUMBER) { + Resync(p, TOKEN_RIGHT_BRACE); + return -1; + } + + push_value(p, double_value, lex_value.double_value); + + if (NextToken(p) != TOKEN_COMMA) { + Resync(p, TOKEN_RIGHT_BRACE); + return -1; + } + + if (NextToken(p) != TOKEN_NUMBER) { + Resync(p, TOKEN_RIGHT_BRACE); + return -1; + } + + push_value(p, double_value, lex_value.double_value); + + if (NextToken(p) != TOKEN_COMMA) { + Resync(p, TOKEN_RIGHT_BRACE); + return -1; + } + + if (NextToken(p) != TOKEN_NUMBER) { + Resync(p, TOKEN_RIGHT_BRACE); + return -1; + } + + push_value(p, double_value, lex_value.double_value); + + if (NextToken(p) != TOKEN_RIGHT_BRACE) { + Resync(p, TOKEN_RIGHT_BRACE); + return -1; + } + + return 0; +} + +static int +ParseValue(struct lex_record *p) +{ + if (NextToken(p) != TOKEN_NUMBER) { + Resync(p, Nil); + return -1; + } + push_value(p, double_value, lex_value.double_value); + return 0; +} + +/* + * Parse syntax: n.n.n.n.n.n.n + */ + +static int +ParseDISEntityType(struct lex_record *p) +{ + + long i, av; + field_id t; + + for (i = 0; i < 7; ++i) { + + t = NextToken(p); + + if (t != TOKEN_NUMBER) { + if (t == EndOfFile) { + return -2; + } + Resync(p, Nil); + return -1; + } + + if (lex_value.double_value > 0) { + av = (long) (lex_value.double_value + 0.5); + } + else { + av = (long) (lex_value.double_value - 0.5); + } + push_value(p, long_value, av); + + if (i < 6 && NextToken(p) != TOKEN_COLON) { + Resync(p, Nil); + return -1; + } + } + + return 0; +} + + +static int +ParseEntityMapEntry(struct lex_record *p, entity_object_map *po) +{ + long ival, result; + + memset (po, 0, sizeof(entity_object_map)); + + result = ParseDISEntityType(p); + + /* end-of-file */ + if (result == -2) { + return -1; + } + + /* other error */ + if (result != 0) { + Resync(p, TOKEN_SEMICOLON); + return -1; + } + + ival = pop_value(p, long_value); + if (ival == -1) { + po->entity_mask.extra = 0; + } + else { + po->entity_mask.extra = 1; + po->entity_type.extra = (unsigned char) ival; + } + + ival = pop_value(p, long_value); + if (ival == -1) { + po->entity_mask.specific = 0; + } + else { + po->entity_mask.specific = 1; + po->entity_type.specific = (unsigned char) ival; + } + + ival = pop_value(p, long_value); + if (ival == -1) { + po->entity_mask.subcategory = 0; + } + else { + po->entity_mask.subcategory = 1; + po->entity_type.subcategory = (unsigned char) ival; + } + + ival = pop_value(p, long_value); + if (ival == -1) { + po->entity_mask.category = 0; + } + else { + po->entity_mask.category = 1; + po->entity_type.category = (unsigned char) ival; + } + + ival = pop_value(p, long_value); + if (ival == -1) { + po->entity_mask.country = 0; + } + else { + po->entity_mask.country = 1; + po->entity_type.country = (unsigned short) ival; + } + + ival = pop_value(p, long_value); + if (ival == -1) { + po->entity_mask.domain = 0; + } + else { + po->entity_mask.domain = 1; + po->entity_type.domain = (unsigned char) ival; + } + + ival = pop_value(p, long_value); + if (ival == -1) { + po->entity_mask.kind = 0; + } + else { + po->entity_mask.kind = 1; + po->entity_type.kind = (unsigned char) ival; + } + + if (NextToken(p) != TOKEN_COMMA) { + Resync(p, TOKEN_SEMICOLON); + return -1; + } + + if (NextToken(p) != TOKEN_STRING) { + Resync(p, TOKEN_SEMICOLON); + return -1; + } + + po->object_name = memory_strdup( token ); + + if (NextToken(p) != TOKEN_SEMICOLON) { + Resync(p, TOKEN_SEMICOLON); + return -1; + } + + return 0; +} + + +entity_object_map *eo_map; +int eo_map_count; + +static int inventory_compileMapEntities(char *name, int *count, entity_object_map **pmap) +{ + struct lex_record *p; + int code = 0; + entity_object_map po; + int n = 0; + + *pmap = NULL; + *count = 0; + + if ((p = OpenSourceFile(name)) == NULL) { + fprintf(stderr, "unable to open entity map file\n"); + return -1; + } + + while (ParseEntityMapEntry(p, &po) == 0 && code == 0) { + *pmap = memory_realloc(*pmap, sizeof(entity_object_map) * (n+1) ); + (*pmap)[n] = po; + n++; + } + + *count = n; + + fclose(p->f); + memory_dispose(p->filename); + memory_dispose((char *) p); + return code; +} + +/* + * munition_entity_type , warhead_type , explosion_diameter , damage_factor ; + */ +munition_map *mun_map; +int mun_map_count; + +static int +ParseMunitionMapEntry(struct lex_record *p, munition_map *po) +{ + long ival, result; + field_id t; + + memset (po, 0, sizeof(munition_map)); + + result = ParseDISEntityType(p); + + /* end-of-file */ + if (result == -2) { + return -1; + } + + /* other error */ + if (result != 0) { + Resync(p, TOKEN_SEMICOLON); + return -1; + } + + ival = pop_value(p, long_value); + if (ival == -1) { + po->entity_mask.extra = 0; + } + else { + po->entity_mask.extra = 1; + po->entity_type.extra = (unsigned char) ival; + } + + ival = pop_value(p, long_value); + if (ival == -1) { + po->entity_mask.specific = 0; + } + else { + po->entity_mask.specific = 1; + po->entity_type.specific = (unsigned char) ival; + } + + ival = pop_value(p, long_value); + if (ival == -1) { + po->entity_mask.subcategory = 0; + } + else { + po->entity_mask.subcategory = 1; + po->entity_type.subcategory = (unsigned char) ival; + } + + ival = pop_value(p, long_value); + if (ival == -1) { + po->entity_mask.category = 0; + } + else { + po->entity_mask.category = 1; + po->entity_type.category = (unsigned char) ival; + } + + ival = pop_value(p, long_value); + if (ival == -1) { + po->entity_mask.country = 0; + } + else { + po->entity_mask.country = 1; + po->entity_type.country = (unsigned short) ival; + } + + ival = pop_value(p, long_value); + if (ival == -1) { + po->entity_mask.domain = 0; + } + else { + po->entity_mask.domain = 1; + po->entity_type.domain = (unsigned char) ival; + } + + ival = pop_value(p, long_value); + if (ival == -1) { + po->entity_mask.kind = 0; + } + else { + po->entity_mask.kind = 1; + po->entity_type.kind = (unsigned char) ival; + } + + if (NextToken(p) != TOKEN_COMMA) { + Resync(p, TOKEN_SEMICOLON); + return -1; + } + + if (NextToken(p) != TOKEN_NUMBER) { + Resync(p, TOKEN_SEMICOLON); + return -1; + } + + /* warhead type */ + + if (lex_value.double_value >= 0) { + ival = (int) (lex_value.double_value + 0.5); + } + else { + ival = (long)(lex_value.double_value - 0.5); + } + + if (ival == -1) { + po->warhead_mask = 0; + } + else { + po->warhead_mask = 1; + po->warhead_type = (unsigned short) ival; + } + + if (NextToken(p) != TOKEN_COMMA) { + Resync(p, TOKEN_SEMICOLON); + return -1; + } + + /* explosion diameter */ + + if (NextToken(p) != TOKEN_NUMBER) { + Resync(p, TOKEN_SEMICOLON); + return -1; + } + + po->explosion_diameter_meters = units_FEETtoMETERS(lex_value.double_value); + + if (NextToken(p) != TOKEN_COMMA) { + Resync(p, TOKEN_SEMICOLON); + return -1; + } + + /* damage factor */ + + if (NextToken(p) != TOKEN_NUMBER) { + Resync(p, TOKEN_SEMICOLON); + return -1; + } + + po->damage_factor = lex_value.double_value; + + if (NextToken(p) != TOKEN_COMMA) { + Resync(p, TOKEN_SEMICOLON); + return -1; + } + + /* warhead class: kinetic or explosive */ + + t = NextToken(p); + + if (t != RW_KINETIC && t != RW_EXPLOSIVE) { + Resync(p, TOKEN_SEMICOLON); + return -1; + } + + po->kinetic_flag = (t == RW_KINETIC) ? 1 : 0; + + if (NextToken(p) != TOKEN_SEMICOLON) { + Resync(p, TOKEN_SEMICOLON); + return -1; + } + + return 0; +} + +static int inventory_compileMunitionsMap(char *name, int *count, munition_map **pmap) +{ + struct lex_record *p; + int code = 0; + munition_map po; + int n = 0; + + *pmap = NULL; + *count = 0; + + if ((p = OpenSourceFile(name)) == NULL) { + fprintf(stderr, "unable to open entity map file\n"); + return -1; + } + + while (ParseMunitionMapEntry(p, &po) == 0 && code == 0) { + *pmap = memory_realloc(*pmap, sizeof(munition_map) * (n+1) ); + (*pmap)[n] = po; + n++; + } + + *count = n; + + fclose(p->f); + memory_dispose(p->filename); + memory_dispose((char *) p); + return code; +} + +/* + * Parse syntax: '{' number_list '}' + * + * Where number_list is a collection of zero or more comma separated + * numbers. The list of numbers must be an even count. + * + */ + +static int +ParseTable(struct lex_record *p) +{ + field_id t; + double x[64], y[64]; + int count = 0, i; + interpolate_Table *table; + interpolate_Entry *entry; + + if (NextToken(p) != TOKEN_LEFT_BRACE) { + Resync(p, TOKEN_RIGHT_BRACE); + return -1; + } + + while ((t = NextToken(p)) != TOKEN_RIGHT_BRACE) { + + if (t == EndOfFile) + return -1; + + if (t == TOKEN_NUMBER) { + + if (count == 64) { + ParseError(p, "too many table entries"); + return -1; + } + + x[count] = lex_value.double_value; + + if (NextToken(p) != TOKEN_COMMA) { + Resync(p, TOKEN_RIGHT_BRACE); + return -1; + } + + if (NextToken(p) != TOKEN_NUMBER) { + Resync(p, TOKEN_RIGHT_BRACE); + return -1; + } + y[count++] = lex_value.double_value; + + t = NextToken(p); + + if (t == TOKEN_RIGHT_BRACE) + goto done; + else if (t != TOKEN_COMMA) { + Resync(p, TOKEN_RIGHT_BRACE); + return -1; + } + } + else { + Resync(p, TOKEN_RIGHT_BRACE); + return -1; + } + } + + done: + +/* + * Build an interpolation table + */ + + table = interpolate_new(count - 1); + entry = table->entry; + table->minX = x[0]; + table->count = count - 1; + table->entry = entry; + + for (i = 1; i < count; ++i) { + entry[i - 1].x = x[i]; + entry[i - 1].m = ((y[i] - y[i - 1]) / (x[i] - x[i - 1])); + entry[i - 1].b = (y[i] - (x[i] * entry[i - 1].m)); + } + + push_value(p, table_value, table); + + return 0; +} + + +/* + * Parse syntax: number weapon-type number number number + */ + +static int +ParseStation(struct lex_record *p) +{ + + long i, a1, b1, c1; + char *ptr; + + if (NextToken(p) != TOKEN_NUMBER) { + Resync(p, Nil); + return -1; + } + + i = (long) (lex_value.double_value + 0.5); + + if (NextToken(p) != TOKEN_STRING) { + Resync(p, Nil); + return -1; + } + + ptr = memory_strdup(token); + + if (NextToken(p) != TOKEN_NUMBER) { + Resync(p, Nil); + return -1; + } + + a1 = (long) (lex_value.double_value + 0.5); + + if (NextToken(p) != TOKEN_NUMBER) { + Resync(p, Nil); + return -1; + } + + b1 = (long) (lex_value.double_value + 0.5); + + if (NextToken(p) != TOKEN_NUMBER) { + Resync(p, Nil); + return -1; + } + + c1 = (long) (lex_value.double_value + 0.5); + + push_value(p, long_value, c1); + push_value(p, long_value, b1); + push_value(p, long_value, a1); + push_value(p, string_value, ptr); + push_value(p, long_value, i); + + return 0; +} + +/** + * Reads next aircraft model. + * The current token must be "aircraft" (RW_AIRCRAFT). + */ +static int +ParseAircraft(struct lex_record *p, craftType *c) +{ + field_id t; + long n=0, i; + double d; + VPoint pt; + interpolate_Table *table; + dis_entity_type entity; + char s[256]; + struct keyword_info *kw; + craftType *used; + + // Parse all inside global "xxx" and, if we succeeded, copy into *c. + memset(&xxx, 0, sizeof(xxx)); + xxx.engineType = inventory_NoEngine; + + if (NextToken(p) != TOKEN_STRING) { + return -1; + } + + xxx.name = memory_strdup(token); + + if (NextToken(p) != TOKEN_LEFT_BRACE) { + return -1; + } + + while ((t = NextToken(p)) != EndOfFile) { + + if (t >= Object || t == RW_USE || t == RW_ENGINE_TYPE ) { + + kw = lex_value.kw; + + switch (kw->type) { + + case RESERVED_WORD: + + /* + * use "aircraft-type-name" + * + * uses a previously defined aircraft as the starting point for defining another + */ + + if (kw->id == RW_USE) { + if ( NextToken(p) == TOKEN_STRING ) { + char * ptmp = xxx.name; + + n = 1; + used = inventory_craftTypeSearchByZoneAndName(NULL, token); + if (used) { + xxx = *used; + xxx.CLift = interpolate_clone (used->CLift ); + xxx.CDb = interpolate_clone (used->CDb ); + xxx.CnBeta = interpolate_clone (used->CnBeta ); + xxx.ClBeta = interpolate_clone (used->ClBeta ); + xxx.Thrust = interpolate_clone (used->Thrust ); + xxx.ABThrust = interpolate_clone (used->ABThrust); + //if (used->name) { + // xxx.name = memory_strdup( used->name ); + //} + xxx.name = ptmp; + if (used->description) { + xxx.description = memory_strdup( used->description ); + } + if (used->modelname) { + xxx.modelname = memory_strdup( used->modelname ); + } + if (used->objname) { + xxx.objname = memory_strdup( used->objname ); + } + for (i=0; istation[i].type ) { + xxx.station[i].type = memory_strdup( used->station[i].type) ; + } + } + + + n = 0; + + } + else { + sprintf(s, "\"%s\" is not a valid aircraft type", token); + ParseError(p, s); + } + } + + } else if (kw->id == RW_ENGINE_TYPE) { + if ( NextToken(p) == TOKEN_STRING ) { + if( strcmp(token, "NoEngine") == 0 ) + xxx.engineType = inventory_NoEngine; + else if( strcmp(token, "GenericPistonEngine") == 0 ) + xxx.engineType = inventory_GenericPistonEngine; + else if( strcmp(token, "GenericJetEngine") == 0 ) + xxx.engineType = inventory_GenericJetEngine; + else if( strcmp(token, "GenericRocketEngine") == 0 ) + xxx.engineType = inventory_GenericRocketEngine; + else { + sprintf(s, "unknown engine type: \"%s\"", token); + ParseError(p, s); + } + + } else { + sprintf(s, "unexpected token: \"%s\"", token); + ParseError(p, s); + } + + } else { + sprintf(s, "unexpected token: \"%s\"", token); + ParseError(p, s); + } + break; + + case vtSTRING: + if (NextToken(p) == TOKEN_STRING) { + n = 0; + *((char **) kw->ptr) = memory_strdup(token); + } + else + n = -1; + break; + + case vtDOUBLE: + case vtNMILES: + case vtKNOTS: + if ((n = ParseValue(p)) == 0) { + d = pop_value(p, double_value); + if (kw->type == vtNMILES) + d *= units_NmToFeetFactor; + else if (kw->type == vtKNOTS) + d *= units_NmToFeetFactor / 3600; + *((double *) kw->ptr) = d; + } + break; + + case vtANGLE: + if ((n = ParseValue(p)) == 0) { + d = units_DEGtoRAD(pop_value(p, double_value)); + *((double *) kw->ptr) = d; + } + break; + + case vtLONG: + if ((n = ParseValue(p)) == 0) { + d = pop_value(p, double_value); + *((long *) kw->ptr) = (long) (d + 0.5); + } + break; + + case vtTABLE: + if ((n = ParseTable(p)) == 0) { + table = pop_value(p, table_value); + *((interpolate_Table **) kw->ptr) = table; + } + break; + + case vtPOINT: + if ((n = ParsePoint(p)) == 0) { + pt.z = pop_value(p, double_value); + pt.y = pop_value(p, double_value); + pt.x = pop_value(p, double_value); + *(VPoint *) kw->ptr = pt; + } + break; + + case vtSTATION: + if ((n = ParseStation(p)) == 0) { + i = pop_value(p, long_value); + + char * wname = pop_value(p, string_value); + int wid = weapon_nameToId(wname); + + if( wid < 0 ) + error_external("unknown weapon `%s'", wname); + + xxx.station[i].id = wid; + xxx.station[i].type = wname; + + xxx.station[i].info = + pop_value(p, long_value); + xxx.station[i].info2 = + pop_value(p, long_value); + xxx.station[i].info3 = + pop_value(p, long_value); + } + break; + + case vtENTITY: + if ((n = ParseDISEntityType(p)) == 0) { + entity.extra = (unsigned char) + pop_value(p, long_value); + entity.specific = (unsigned char) + pop_value(p, long_value); + entity.subcategory = (unsigned char) + pop_value(p, long_value); + entity.category = (unsigned char) + pop_value(p, long_value); + entity.country = (unsigned char) + pop_value(p, long_value); + entity.domain = (unsigned char) + pop_value(p, long_value); + entity.kind = (unsigned char) + pop_value(p, long_value); + *((dis_entity_type *) kw->ptr) = entity; + } + break; + } + + if (n != 0) { + sprintf(s, "invalid syntax for %s\ + parameter", kw->word); + ParseError(p, s); + } + } + else if (t == TOKEN_RIGHT_BRACE) { + if( xxx.objname != NULL ){ + char *path = reader_resolveRelativePath(p->filename, xxx.objname); + memory_dispose(xxx.objname); + xxx.objname = path; + } + + // Success! + xxx.zone = c->zone; + xxx.prev = c->prev; + xxx.next = c->next; + *c = xxx; + return 0; + } + else { + sprintf(s, "\"%s\" was found where another token was\ + expected", token); + ParseError(p, s); + return -1; + } + } + + return -1; +} + + +static void +maxCLift(craftType *c, double *max_clift, double *stall_alpha) +/* + Return the max CLift and the corresponding stall AoA. +*/ +{ + double m = 0.0, a = 0.0, n; + int i; + + for( i = 1; i < c->CLift->count; i++ ){ + + /* Retrieve the original "y" value from the table: */ + n = c->CLift->entry[i-1].b + + c->CLift->entry[i-1].x * c->CLift->entry[i-1].m; + + if( i == 0 || n > m ){ + m = n; + a = c->CLift->entry[i-1].x; + } + } + + *max_clift = m; + *stall_alpha = a; +} + + +/* Standard air density at sea level: */ +#define RHO 0.07648 /* lb/ft^3 */ + +/* Max vertical pos/neg gust speed: */ +#define MAX_GUST 30.0 /* ft/s */ + + +static void +compileSpeedLimits(craftType *c) +{ + double max_clift, alpha_stall; + + maxCLift(c, &max_clift, &alpha_stall); + + c->alpha_stall = alpha_stall; + + /* + Calculate Vs0, stall speed at MTOW with full flaps: + */ + + if( c->Vs0 == 0.0 && c->MTOW > 0.0 ){ + + double clift = max_clift + c->cFlap * sin(c->maxFlap); + + c->Vs0 = units_FPStoKT( sqrt( 2.0*c->MTOW * units_earth_g + / (RHO * c->wingS * clift) ) ); + } + + /* + Calculate Vs1, stall speed at MTOW without flaps: + */ + + if( c->Vs1 == 0.0 && c->MTOW > 0.0 ){ + + c->Vs1 = units_FPStoKT( sqrt( 2.0*c->MTOW * units_earth_g + / (RHO * c->wingS * max_clift) ) ); + } + + /* + Calculate Vno: + */ + + if( c->Vno == 0.0 ){ + + double b = 6.302; + + c->Vno = units_FPStoKT( 2.0 * (c->maxLoadZNegative + c->emptyWeight) * units_earth_g + / (RHO * c->wingS * b * MAX_GUST) ); + } +} + + +/** + * Parse "aircraft" record. + * @param p + * @return True on success. + */ +static int parseAircraft(struct lex_record *p) +{ + craftType *c = inventory_craftTypeNew(NULL); + if ( ParseAircraft(p, c) != 0 ){ + inventory_craftTypeRelease(c); + return 0; + } + +/* + * Initialize some other interesting values + */ + + if( c->objname != NULL ){ + FILE *f = fopen(c->objname, "r"); + if( f == NULL ){ + error_external("%s: file %s not found", p->filename, c->objname); + return 0; + } + c->object = VReadDepthCueuedObject(f, 1); + fclose(f); + } else { + c->object = NULL; + } + c->placeProc = NULL; + c->damageBits = 0; + c->thrust = planes_getThrustCalculator(c); + c->resupply = planes_genericResupply; + +/* + * Some older values are now derived from more precise information + */ + + c->CLOrigin = interpolate_value(c->CLift, 0.0); + c->CLSlope = (interpolate_value(c->CLift, units_DEGtoRAD(10.0)) + - c->CLOrigin) / units_DEGtoRAD(10.0); + compileSpeedLimits(c); + return 1; +} + + +static int parseInventoryFile(char *filename) +{ + struct lex_record *p; + field_id t; + int success = 1; + char *subfile; + + if ((p = OpenSourceFile(filename)) == NULL) { + error_external("%s: failed opening inventory file", filename); + } + + t = NextToken(p); + while (1) { + if( t == EndOfFile ){ + break; + + } else if( t == RW_AIRCRAFT ){ + success = parseAircraft(p); + if( ! success ) + break; + t = NextToken(p); + + } else if( t == RW_INCLUDE ){ + t = NextToken(p); + if( t != TOKEN_STRING ) + error_external("%s:%d: expected double-quoted string after 'include'", p->filename, p->lineno); + subfile = reader_resolveRelativePath(filename, token); + success = parseInventoryFile(subfile); + memory_dispose(subfile); + if( ! success ){ + error_external("%s:%d: failed including '%s'", + p->filename, p->lineno, token); + break; + } + t = NextToken(p); + + } else { + error_external("%s:%d: expected either 'include' or 'aircraft'", p->filename, p->lineno); + } + } + + fclose(p->f); + memory_dispose(p->filename); + memory_dispose((char *) p); + + return success; +} + + +craftType * +inventory_craftTypeSearchByZoneAndName(zone_Type *zone, char *name) +{ + craftType *c = craft_types; + while( c != NULL ){ + if( zone == c->zone && strcmp(name, c->name) == 0 ) + return c; + c = c->next; + } + return NULL; +} + + + +/* + * Find (or possible generate) the craftType entry associated with a + * given DIS entity type. + */ +craftType * +inventory_craftTypeSearchByEntityType( const dis_entity_type * id ) +{ + int depthcue = 1; + entity_object_map *ep; + + + craftType *c = craft_types; + while( c != NULL ){ + if (c->entityType.kind == id->kind && + c->entityType.domain == id->domain && + c->entityType.country == id->country && + c->entityType.category == id->category && + c->entityType.subcategory == id->subcategory && + c->entityType.specific == id->specific && + c->entityType.extra == id->extra) { + return c; + } + c = c->next; + } + + /* + * Well, there wasn't a craft type defined that matched the desired + * entity type. So, we'll look for an entry in the patterns contained + * in the eo_map. If we find a match, create a new craftType entry + * and return it. + */ + + ep = eo_map; + int i; + for (i = 0; i < eo_map_count; ++ i) { + + FILE *f1; + + if (dis_entityWildcardMatch(id, &ep->entity_type, &ep->entity_mask)) { + + c = inventory_craftTypeNew(NULL); + char *p = strrchr (ep->object_name, '.'); + f1 = init_fopen (ep->object_name, "r"); + c->name = memory_strdup(ep->object_name); + c->objname = memory_strdup(ep->object_name); + c->entityType = *id; + c->altEntityType = *id; + c->object = NULL; + if (p != NULL && (strcmp (p, ".dxf") == 0 || + strcmp (p, ".DXF") == 0)) { + c->object = VReadDepthCueuedDXFObject (f1, depthcue); + } + else { + c->object = VReadDepthCueuedObject (f1, depthcue); + } + + if (c->object == NULL) + error_internal("failed to read object from file: %s", ep->object_name); + ep->obj = c->object; + fclose (f1); + return c; + } + ++ ep; + } + + return c; +} + + +void inventory_purgeZone(zone_Type *zone) +{ + craftType *c = craft_types; + while( c != NULL ){ + if( c->zone == zone ){ + craftType *q = c; + c = c->next; + inventory_craftTypeRelease(q); + } else { + c = c->next; + } + } +} + + +static void inventory_cleanup() +{ + /* Releases munitions map: */ + memory_dispose(mun_map); + mun_map = NULL; + mun_map_count = 0; + + /* Releases aircraft inventory and recycle pool: */ + while( craft_types != NULL ){ + craftType *next = craft_types->next; + inventory_craftTypeRelease(craft_types); + craft_types = next; + } + while( craft_types_pool != NULL ){ + craftType *next = craft_types_pool->next; + memory_dispose(craft_types_pool); + craft_types_pool = next; + } + + /* Releases entity-to-object map: */ + int i; + for (i = 0; i < eo_map_count; ++ i) { + memory_dispose(eo_map[i].object_name); + } + memory_dispose(eo_map); + eo_map = NULL; + eo_map_count = 0; +} + + +void inventory_init() +{ + char name[999]; + + memory_strcpy(name, sizeof(name), init_findFile("aircraft.txt")); + if ( ! parseInventoryFile(name) ) + error_external("Fatal error compiling aircraft inventory"); + + memory_strcpy(name, sizeof(name), init_findFile("object-map.txt")); + if (inventory_compileMapEntities(name, &eo_map_count, &eo_map) != 0) + error_external("Fatal error reading object-map.txt"); + + memory_strcpy(name, sizeof(name), init_findFile("munition-map.txt")); + if (inventory_compileMunitionsMap(name, &mun_map_count, &mun_map) != 0) + error_external("Fatal error reading munition-map.txt"); + + memory_registerCleanup(inventory_cleanup); +} + + +munition_map * inventory_getMunition(int i) +{ + if( 0 <= i && i < mun_map_count ) + return &mun_map[i]; + else + return NULL; +} + + +void inventory_printValidAircraft() +{ + craftType *c = craft_types; + while( c != NULL ){ + if( c->CLift != NULL ) + printf("%s\n", c->name); + c = c->next; + } +} diff -Nru acm-5.0/src/acm/inventory.h acm-6.0+20200416/src/acm/inventory.h --- acm-5.0/src/acm/inventory.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/inventory.h 2017-10-30 02:45:08.000000000 +0000 @@ -0,0 +1,283 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1998 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +/** + * This modules manages several data structures: + * + * - Munitions defined in the munition file. + * + * - Craft types. Crafts types includes: aircraft, airports (with each runway + * being represented by several polygons) and generic features from the scenery. + * Airports and features are related to some zone they were loaded from and + * can be added and removed along with the zones. Aircraft are defined in the + * corresponding configuration file. + */ + +#ifndef _inventory_h +#define _inventory_h + +#include "../V/Vlib.h" +#include "../V/VObjects.h" +#include "../dis/dis/dis.h" +#include "interpolate.h" +#include "manifest.h" +#include "zone.h" + +#ifdef inventory_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + + +/** + * Maps munition entity/warhead combinations to explosions sizes and damage. + */ +typedef struct { + dis_entity_type entity_type; + dis_entity_type entity_mask; + /** Type of warhead; currently always 1; no other values defined. */ + u_short warhead_type; + /** 0 = any, 1 = specific type of warhead. */ + u_short warhead_mask; + double explosion_diameter_meters; + double damage_factor; + /* If kinetic, only relative velocity matters; if blast type, only explosion + * diameter matters to asses damage. */ + int kinetic_flag; +} munition_map; + + +typedef struct { + int id; /* weapon type weapon_* */ + char *type; /* type of weapon at this station */ + int info; /* extra info (weapon specific) */ + int info2; /* " " */ + int info3; /* " " */ + double info4; /* time offset to next round firing (s) */ +} weaponStation; + + +typedef enum { + + /** Glider. */ + inventory_NoEngine, + + /** Generic piston engine with propeller. */ + inventory_GenericPistonEngine, + + /** Generic jet engine. */ + inventory_GenericJetEngine, + + /** Generic rocket engine (thrust does not depends on air density). */ + inventory_GenericRocketEngine + +} inventory_EngineType; + +// Forward declaration. +struct craft; + +/** + * Function that calculates the current thrust for the aircraft and updates the + * current RPM value based on the current throttle setting, afterburner status, + * speed and altitude. There is one for each type of aircraft/engine. + * @param cinfo Specific craft informations. + * @return Current engine thrust (lbf). + */ +typedef double inventory_ThrustCalculator(struct craft *cinfo); + +/* + * This structure describes a class of aircraft (e.g. an F-16C). + */ + +typedef struct craftType { + struct craftType *prev, *next; + + /** + * Zone this craft type belongs to. Set only for runways and features; + * NULL in any other type of "craft". + */ + zone_Type *zone; + + char *name; /* short name of aircraft class */ + char *description; /* long name */ + char *modelname; /* compiled object model to drive this aircraft type */ + + double aspectRatio; /* wing aspect ratio */ + double CLOrigin, CLSlope; /* Defines the CL characteristic eqn */ + double betaStall; /* Stall angle for rudder */ + double CDOrigin, CDFactor; /* Defines the CD Characteristic eqn */ + interpolate_Table *CLift; /* compute lift coefficient */ + interpolate_Table *CDb; /* compute body + wave drag coeff */ + interpolate_Table *CnBeta; /* compute yaw moment due to sideslip */ + interpolate_Table *ClBeta; /* compute roll moment due to sideslip */ + double CDBOrigin, CDBFactor; /* Defines the CD Characteristic eqn */ + double CDBPhase; + double CYbeta; /* Side-force from side-slip (dCY/dBeta) */ + double Clda; /* roll moment from aileron offset */ + double Cldr; /* roll moment from rudder offset */ + double Clp; /* roll damping */ + + double Cmq; /* damping in pitch */ + double Cnr; /* damping in yaw */ + + double maxAileron; /* maximum aileron offset */ + double maxRudder; /* maximum rudder offset */ + + double effElevator; /* Elevator effectiveness */ + double effRudder; /* Rudder effectiveness */ + + VMatrix I; /* Moments of Inertia about CG in AXYZ (lb ft^2) */ + double cmSlope; /* CmAlpha curve slope */ + + double maxFlap; /* maximum flap setting (RAD) */ + double cFlap; /* lift coefficient of flaps */ + double cFlapDrag; /* drag coefficient of lowered flaps */ + double flapRate; /* flap movement rate (RAD/s) */ + + double cGearDrag; /* drag coefficient of lowered gear */ + double gearRate; /* landing gear movement rate (RAD/s) */ + + double maxSpeedBrake; /* maximum speed brake setting (RAD) */ + double cSpeedBrake; /* drag coefficient of 90 degree speed brake */ + double speedBrakeRate; /* rate of speed brake movement (RAD/s) */ + double speedBrakeIncr; /* number of radians than one keystroke moves brake */ + + double wingS; /* wing area (ft^2) */ + double wings; /* wing half-span (ft) */ + double wingh; /* wing areodyn. center height above the CM (ft) */ + double c; /* mean aerodynamic chord (MAC) (ft) */ + double emptyWeight; /* empty mass (lb) */ + double maxLoadZPositive; /* max climb wing load (lbf) */ + double maxLoadZNegative; /* max sink wing load (lbf) */ + double maxFuel; /* maximum internal fuel (lb) */ + + inventory_EngineType engineType; + double maxThrust; /* max static thrust, military power (lbf) */ + double maxABThrust; /* max static thrust, afterburner on (lbf) */ + interpolate_Table *Thrust; /* Change in thrust due to mach number */ + interpolate_Table *ABThrust; /* Change in thrust due to mach number */ + int hasThrustReverser;/* 0 = no, otherwise yes */ + double engineLag; /* controls lag between throttle and RPM */ + double spFuelConsump; /* specific fuel consump(lb fuel/lbf T x hr) */ + double spABFuelConsump; + VPoint viewPoint; /* pilot's viewing location wrt CG (ft) */ + + double muStatic; /* static coefficient of friction no-brakes */ + double muKinetic; /* moving coefficient of friction no-brakes */ + double muBStatic; /* static brakes-on */ + double muBKinetic; /* moving brakes-on */ + + double maxNWDef; /* maximum nose wheel deflection (RAD) */ + VPoint rm, rn; /* location if main/nose gear attachments */ + double Dm, Dn; /* main/nose oleo damping factor */ + double Km, Kn; /* main/nose oleo spring factor */ + double Gm, Gn; /* main/nose strut length with tire */ + double cmMax, cnMax; /* main/nose maximum oleo extension distance */ + VPoint tailExtent; /* as we rotate, this part may drag */ + + /* Speed limits at MTOW (0.0 = unknown): */ + double MTOW; /* max takeoff weight (lb) */ + double alpha_stall; /* stall AoA (RAD) */ + double Vs0; /* stall speed, full flaps (kt) */ + double Vs1; /* stall speed, no flaps (kt) */ + double Vfe; /* max speed with flaps (kt) */ + double Vno; /* normal operation speed (kt) */ + double Vne; /* never exceed speed (kt) */ + + double armDelay; /* arming delay for missiles */ + long damageBits; /* initial bit mask of damaged systems */ + long structurePts; /* maximum structural damage */ + + double radarOutput; /* radar output (watts) */ + double radarTRange; /* tracking (lock) radar range (nm) */ + double radarDRange; /* detection radar range (nm) */ + double TEWSThreshold; + + long sCount; /* number of weapon stations */ + VPoint wStation[manifest_STATIONS]; /* weapon's stations (launch points) */ + weaponStation station[manifest_STATIONS]; /* what can be at each weapon station */ + + inventory_ThrustCalculator *thrust; /* computes current thrust */ + void (*resupply) (struct craft *); /* the plane's rearm & refuel procedure */ + int (*placeProc) (Viewport *, struct craft *, VMatrix *, VPolySet *ps); + + /* Object placement procedure (for special craft; see place.c) */ + char *objname; /* name of file containing the object */ + VObject *object; /* what it looks like */ + dis_entity_type entityType; /* craft type used in DIS */ + dis_entity_type altEntityType; /* alternate craft type used in DIS */ +} craftType; + +/** + * Compile the aircraft inventory, DIS entity/munition maps. + */ +EXTERN void inventory_init(void); + +/** + * Returns next, empty available entry in the craft models table. + * @param zone Zone the static items (runway, feature, ...) belongs to. + * Leave to NULL for real aircraft types which, being mobile, are not bound to + * any specific zone. + * @return Empty and reset data structure. + */ +EXTERN craftType * inventory_craftTypeNew(zone_Type *zone); + +/** + * Releases a craft type. There is normally no need for the client to invoke + * this function. + */ +EXTERN void inventory_craftTypeRelease(craftType *c); + +/** + * Search a specific craft type by zone and name. + * @param zone Zone the craft belongs to: NULL for real aircraft; zone for + * surface items (runways, features). + * @param name Name of the craft type. + * @return Found craft type, or NULL. + */ +EXTERN craftType * inventory_craftTypeSearchByZoneAndName(zone_Type *zone, char *name); + +/** + * Retrieves craft type informations. First look among the already known + * aircraft (file objects/inventory) then search in objects/object-map.txt. + * @param id + * @return Craft type informations, or NULL if not found. + */ +EXTERN craftType * inventory_craftTypeSearchByEntityType(const dis_entity_type * id ); + +/** + * Removes craft types belonging to the given zone. + * @param zone + */ +EXTERN void inventory_purgeZone(zone_Type *zone); + +/** + * Returns munition at given index. + * @param i Munition index, starting from 0. + * @return Munition, or NULL if invalid index. + */ +EXTERN munition_map * inventory_getMunition(int i); + +/** + * Print on standard output a list of the currently defined aircraft types. + */ +EXTERN void inventory_printValidAircraft(void); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/joystick.c acm-6.0+20200416/src/acm/joystick.c --- acm-5.0/src/acm/joystick.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/joystick.c 2017-09-06 22:30:14.000000000 +0000 @@ -0,0 +1,535 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1998 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + + +#define joystick_IMPORT +#include "joystick.h" + +#ifdef WINNT + +// No joystick support under Win32. Provides dummy functions instead. + +void joystick_setPort(char * name){} + +void joystick_calibrate(void){} + +void joystick_getPosition(double *x1, double *y1, + double *x2, double *y2, int *switches) +{ + *x1 = *y1 = *x2 = *y2 = 0.0; + *switches = 0; +} + +int joystick_processInput(void) +{ + return -1; +} + +#else + +#include +#include +#include +#include +#include + +static int min[4] = {999, 999, 999, 999}; +static int max[4] = {-1, -1, -1, -1}; +static int home[4]; +static int value[5] = {128, 128, 128, 128, 0}; + +static char *joystick_port = NULL; + +void +joystick_setPort (char * name) +{ + joystick_port = name; +} + +/* + * ProcessJoystickInput() + * + * This procedure should be called just before you call GetJoystickInput(). + * In processes any pending input from the Workstation Gameport. + */ + +static int init = 0, state; + +int +joystick_processInput() +{ + static int fd; + static int x1, y1, x2, y2, switches; + int flags, n, i, updated = 0; + unsigned char bytes[512], *p; + + if (init < 0) { + return init; + } else if (init == 0) { + struct termios term; + + init = -1; + + if (!joystick_port) { + return init; + } + + if ((fd = open(joystick_port, O_RDWR)) < 0) { + perror("joystick port open failed"); + return -1; + } + +/* + * Set POSIX non-blocking I/O + */ + + if ((flags = fcntl(fd, F_GETFL, 0)) == -1) { + perror("F_GETFL failed"); + return -1; + } + if (fcntl(fd, F_SETFL, flags | O_NONBLOCK) != 0) { + perror("F_SETFL failed"); + return -1; + } + +/* + * Assert both DTR and RTS (these pins supply power to + * the Workstation Gameport). + */ + +#ifdef TIOCM_RTS + flags = TIOCM_RTS | TIOCM_DTR; + if (ioctl(fd, TIOCMSET, &flags) == -1) { + perror("ioctl failed"); + return -1; + } +#endif + +/* + * Condition the TTY line to talk to the converter + */ + + if (tcgetattr(fd, &term) != 0) { + perror("tcgetattr failed"); + return -1; + } + term.c_iflag = IGNBRK | IGNPAR; + term.c_oflag = 0; + term.c_cflag = CLOCAL | CS8 | CSTOPB | CREAD; + term.c_lflag &= ~(ECHO | ICANON); + for (i = 0; i < NCCS; ++i) { + term.c_cc[i] = -1; + } + term.c_cc[VMIN] = 1; + term.c_cc[VTIME] = 0; + cfsetospeed(&term, B9600); + cfsetispeed(&term, B9600); + if (tcsetattr(fd, TCSAFLUSH, &term) != 0) { + perror("tcsetattr failed"); + return -1; + } + state = 0; + init = 1; + } +/* + * Read a whole bunch of characters from the tty + */ + + n = read(fd, bytes, sizeof bytes); + if (n != -1) { + printf("%d ->", n); + for (state = 0; state < n; state++) printf(" %d", bytes[state]); + printf("\n"); + } + +/* + * And then process them ... + */ + + for (p = bytes; n > 0; --n) { + + switch (state) { + + case 0: + if ((*p & 0x80) != 0) { + switches = (((int) *p) >> 3) & 0x0F; + x1 = (((int) *p) & 0x07) << 5; + state = 1; + } + break; + + case 1: + if ((*p & 0x80) != 0) { state = 0; break; } + x1 += (((int) *p) >> 2) & 0x1F; + y1 = (((int) *p) & 0x03) << 6; + state = 2; + break; + + case 2: + if ((*p & 0x80) != 0) { state = 0; break; } + y1 += (((int) *p) >> 1) & 0x3F; + x2 = (((int) *p) & 0x01) << 7; + state = 3; + break; + + case 3: + if ((*p & 0x80) != 0) { state = 0; break; } + x2 += ((int) *p) & 0x7F; + state = 4; + break; + + case 4: + if ((*p & 0x80) != 0) { state = 0; break; } + y2 = ((int) *p) << 1; + state = 5; + break; + + case 5: + if ((*p & 0x80) != 0) { state = 0; break; } + y2 += ((int) *p) & 0x01; + value[0] = 255 - x1; + value[1] = 255 - y1; + value[2] = x2; + value[3] = y2; + value[4] = switches; + state = 0; + updated = 1; + // printf("%d %d %d -> %d %d\n", switches, x1, y1, x2, y2); + break; + } + ++p; + } + return updated; +} +void +joystick_calibrate() +{ + int i; + + printf("\n\nCenter the joystick, click when ready!\n\n"); + for (;;) + if (joystick_processInput()) + if (value[4] != 0) break; + for (i = 0; i < 4; i++) home[i] = value[i]; + for (;;) if (joystick_processInput()) if (value[4] == 0) break; + + printf("\n\nPosition stick in minimum and maximum values, then click\n\n"); + for (;;) + { + if (joystick_processInput()) + { + for (i = 0; i < 4; i++) + { + if (value[i] < min[i]) min[i] = value[i]; + if (value[i] > max[i]) max[i] = value[i]; + } + if (value[4] != 0) break; + } + } + for (;;) if (joystick_processInput()) if (value[4] == 0) break; + printf("\n\nJoystick Calibrated\n"); +} + +static double +fixJoy(int i) +{ + // Forward joysticks. + if (min[i] < max[i]) + { + if (value[i] <= home[i]) + return (double) (value[i] - min[i]) / (double)(home[i] - min[i]) - 1.0; + else + return (double) (value[i] - home[i]) / (double)(max[i] - home[i]); + } + // Backwards joysticks. + else + if (value[i] >= home[i]) + return ((double)(min[i] - value[i]) / (double)(min[i] - home[i]) - 1.0); + else + return ((double)(home[i] - value[i]) / (double)(home[i] - max[i])); +} + +void +joystick_getPosition(double *x1, double *y1, + double *x2, double *y2, int *switches) +{ + if (min[0] == 999) + { + *x1 = 0.0; *y1 = 0.0; *x2 = 0.0; *y2 = 0.0; *switches = value[4]; + return; + } + + *x1 = fixJoy(0); + if (*x1 < -1.0) *x1 = -1.0; + + *y1 = fixJoy(1); + if (*y1 < -1.0) *y1 = -1.0; + + *x2 = fixJoy(2); + if (*x2 < -1.0) *x2 = -1.0; + + *y2 = fixJoy(3); + if (*y2 < -1.0) *y2 = -1.0; + *switches = value[4]; +} + +#endif + + +/* + * 2017-03-20 Umberto Salsi: + * The source code below for Colorado Spectrum Workstation Gameport(TM) was + * in the "joystick-cms.c" but apparently not used. Save here just in case. + */ + +#ifdef ___________NOT__USED______________ + +/* + * Colorado Spectrum Workstation Gameport(TM) + * + * Interface Notes by Riley Rainey (rainey@netcom.com) + * + * The Colorado Spectrum Workstation Gameport allows you to connect + * a PC joystick to a serial port on your Unix workstation. It presents + * a DB-9 plug that can be attached directly into any system that has a + * PC-style 9 pin serial port. I created a simple adapter cable to convert a + * Sparc IPX DIN-8 serial connector to the 9-pin that this unit requires. + * + * The Workstation Gameport costs about $100. + * Colorado Spectrum accepts credit card phone orders: +1 (970) 225-6929 + * + * The workstation gameport emits asynchronous six byte sequences + * up to 30 times per second. If the state of switches and joystick pots + * does not change, no packet is emitted. The data rate is 9600 bps; + * eight data bits and two stop bits. + * + * Byte Contents + * ---- ---------------------------------------------- + * 0 Sync Byte (always zero) + * 1 Switches (J2s2, J2s1, J1s2, J1s1, 0, 0, 0, 0) + * 2 J1x + * 3 J1y + * 4 J2x + * 5 J2y + * + * The driver (this module) must ensure that both DTR and RTS + * are raised to supply power to the joystick adapter. + */ + +#include +#include +#include +#include +#include + +static int max[4] = +{255, 255, 255, 255}; +static int home[4] = +{128, 128, 128, 128}; +static int value[5] = +{128, 128, 128, 128, 0}; + +static char *joystick_port = NULL; + +void +joystick_setPort(char *name) +{ + joystick_port = name; +} + +void +joystick_calibrate(void) +{ + int i; + + for (i = 0; i < 4; ++i) { + home[i] = value[i]; + } +} + +void +joystick_getPosition(double *x1, double *y1, + double *x2, double *y2, int *switches) +{ + *x1 = (double) (value[0] - home[0]) / (max[0] - home[0]); + if (*x1 < -1.0) { + *x1 = -1.0; + } + *y1 = (double) (value[1] - home[1]) / (max[1] - home[1]); + if (*y1 < -1.0) { + *y1 = -1.0; + } + *x2 = (double) (value[2] - home[2]) / (max[2] - home[2]); + if (*x2 < -1.0) { + *x2 = -1.0; + } + *y2 = (double) (value[3] - home[3]) / (max[3] - home[3]); + if (*y2 < -1.0) { + *y2 = -1.0; + } + *switches = value[4]; +} + +/* + * ProcessJoystickInput() + * + * This procedure should be called just before you call GetJoystickInput(). + * In processes any pending input from the Workstation Gameport. + */ + +static int init = 0, state; + +int +joystick_processInput(void) +{ + static int fd; + static int x1, y1, x2, switches; + int flags, n, i, updated = 0; + unsigned char bytes[512], *p; + + if (init < 0) { + return init; + } + else if (init == 0) { + struct termios term; + + init = -1; + + if (!joystick_port) { + return init; + } + + if ((fd = open(joystick_port, O_RDWR)) < 0) { + perror("joystick port open failed"); + return -1; + } + +/* + * Set POSIX non-blocking I/O + */ + + if ((flags = fcntl(fd, F_GETFL, 0)) == -1) { + perror("F_GETFL failed"); + return -1; + } + if (fcntl(fd, F_SETFL, flags | O_NONBLOCK) != 0) { + perror("F_SETFL failed"); + return -1; + } + +/* + * Assert both DTR and RTS (these pins supply power to + * the Workstation Gameport). + */ + +#ifdef TIOCM_RTS + flags = TIOCM_RTS | TIOCM_DTR; + if (ioctl(fd, TIOCMSET, &flags) == -1) { + perror("ioctl failed"); + return -1; + } +#endif + +/* + * Condition the TTY line to talk to the converter + */ + + if (tcgetattr(fd, &term) != 0) { + perror("tcgetattr failed"); + return -1; + } + term.c_iflag = IGNBRK | IGNPAR; + term.c_oflag = 0; + term.c_cflag = CLOCAL | CS8 | CSTOPB | CREAD; + term.c_lflag &= ~(ECHO | ICANON); + for (i = 0; i < NCCS; ++i) { + term.c_cc[i] = -1; + } + term.c_cc[VMIN] = 1; + term.c_cc[VTIME] = 0; + cfsetospeed(&term, B9600); + cfsetispeed(&term, B9600); + if (tcsetattr(fd, TCSAFLUSH, &term) != 0) { + perror("tcsetattr failed"); + return -1; + } + state = 0; + init = 1; + } +/* + * Read a whole bunch of characters from the tty + */ + + n = read(fd, bytes, sizeof bytes); + +/* + * And then process them ... + */ + + for (p = bytes; n > 0; --n) { + + switch (state) { + + case 0: + if (*p == 0) { + state = 1; + } + break; + + case 1: + if ((*p & 0x0f) == 0 || 1) { + switches = *p >> 4; + state = 2; + } + else { + state = 0; + } + break; + + case 2: + x1 = *p; + state = 3; + break; + + case 3: + y1 = *p; + state = 4; + break; + + case 4: + x2 = *p; + state = 5; + break; + + case 5: + state = 0; + value[0] = x1; + value[1] = y1; + value[2] = x2; + value[3] = *p; + value[4] = switches; + updated = 1; + break; + } + ++p; + } + return updated; +} + + +#endif /* ___NOT__USED___ */ \ No newline at end of file diff -Nru acm-5.0/src/acm/joystick.h acm-6.0+20200416/src/acm/joystick.h --- acm-5.0/src/acm/joystick.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/joystick.h 2017-03-20 06:04:01.000000000 +0000 @@ -0,0 +1,42 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1998 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#ifndef _joystick_h +#define _joystick_h + +#ifdef joystick_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +EXTERN void joystick_setPort (char * name); + +EXTERN void joystick_calibrate(void); + +EXTERN void joystick_getPosition(double *x1, double *y1, + double *x2, double *y2, int *switches); + +/** + * This procedure should be called just before you call joystick_getPosition(). + * It processes any pending input from the Workstation Gameport. + */ +EXTERN int joystick_processInput(void); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/list.c acm-6.0+20200416/src/acm/list.c --- acm-5.0/src/acm/list.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/list.c 2017-03-22 00:54:11.000000000 +0000 @@ -0,0 +1,53 @@ +#include +#include "../util/memory.h" + +#define list_IMPORT +#include "list.h" + +static void list_destruct(void *p) +{ + list_Type *l = p; + int i; + + if( l == NULL ) + return; + + for( i = l->n-1; i >=0; i-- ) + memory_dispose(l->arr[i]); + memory_dispose(l->arr); +} + + +list_Type * list_new() +{ + list_Type *l; + + l = memory_allocate(sizeof( list_Type ), list_destruct); + l->size = 0; + l->n = 0; + l->arr = NULL; + return l; +} + + +void list_add_elem(list_Type *l, char *s) +{ + if( l->n >= l->size ){ + l->size = l->size * 2 + 50; + l->arr = memory_realloc(l->arr, l->size * sizeof(char *)); + } + + l->arr[ l->n++ ] = memory_strdup(s); +} + + +void list_add_list(list_Type *l, list_Type *q) +{ + int i; + + if( q == NULL ) + return; + + for( i = 0; i < q->n; i++ ) + list_add_elem(l, q->arr[i]); +} diff -Nru acm-5.0/src/acm/list.h acm-6.0+20200416/src/acm/list.h --- acm-5.0/src/acm/list.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/list.h 2017-04-09 12:04:37.000000000 +0000 @@ -0,0 +1,52 @@ +/** + * Dynamic array of pointers to elements. + * + * FIXME: missing getter with index range check. + * + * FIXME: missing list manipulation functions: setter, remove, sorting. + * Probably not needed by this program. + * + * FIXME: BUG: repeated element causes abort releasing memory for "double free". + * + * @file + */ + +#ifndef _LIST_H_ +#define _LIST_H_ + +#ifdef list_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +typedef struct { + int size; + int n; + char **arr; +} list_Type; + +/** + * Returns a new empty list. + * @return New empty list. Can be released with memory_dispose(), which also + * releases each element. + */ +EXTERN list_Type * list_new(void); + +/** + * Appends an element to the list. + * @param l Subject list. + * @param s Element to append, which is internally duplicated in memory. Can be + * NULL. + */ +EXTERN void list_add_elem(list_Type *l, char *s); + +/** + * Appends all the elements of another list. + * @param l Subject list. + * @param q Elements to append. + */ +EXTERN void list_add_list(list_Type *l, list_Type *q); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/m61a1.c acm-6.0+20200416/src/acm/m61a1.c --- acm-5.0/src/acm/m61a1.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/m61a1.c 2018-04-02 06:09:56.000000000 +0000 @@ -0,0 +1,873 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1997 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#include +#include +#include +#include "sounds.h" +#include "damage.h" +#include "dis_if.h" +#include "effects.h" +#include "init.h" +#include "inventory.h" +#include "pm.h" +#include "weapon.h" +#include "../util/prng.h" +#include "../util/memory.h" +#include "../util/units.h" + +#define m61a1_IMPORT +#include "m61a1.h" + +#define BORE_CROSS_SIZE 7 +#define MUZZLE_VELOCITY (3.2808 * 1036.0) +#define TRACER_MOD 10 +#define OFFSET_ANGLE (units_DEGtoRAD(3.0)) /* the gun points up at this angle */ +#define RATE_OF_FIRE (3000.0 / 60.0) /* rounds per second */ +#define FUZZ (units_DEGtoRAD(1.0)) /* distribution due to vibration */ + +static int select_m61a1(craft *); +static int display_m61a1(craft *, craftType *, viewer *, int, int); +static int update_m61a1(craft *); +static int fire_m61a1(craft *); +static int release_m61a1(craft *); +static void lcos(craft * c, viewer * u); +static int isCannonHit(double min, craft * c); + +static weapon_Type m61a1Desc = +{ + select_m61a1, /* select */ + update_m61a1, /* update */ + display_m61a1, /* display procedure */ + fire_m61a1, /* fire */ + release_m61a1, /* fire button release */ +}; + +/* + * We'll take a running average of our pitch and yaw rates to keep the + * aiming reticle from jumping all over the screen. + */ + +#define HIST 8 + +typedef struct { + double pitch_hist[HIST]; + double yaw_hist[HIST]; + int cur; /* current entry in the histories */ + int count; /* number of valid entries */ + double pitch_total; + double yaw_total; +} hist_t; + +static hist_t history[manifest_MAXPLAYERS]; + +static void m61a1_lookForCannonImpacts(craft * burst); + +/* + * M61A1 selection function + * + * A selection function normally determines whether there are any weapons + * of this type on-board. If so, and the weapon system is functional + * (in other words, undamaged) then return 1; otherwise return 0. + */ + +static int +select_m61a1(craft * c) +{ + + hist_t *p; + + p = &history[c->pIndex]; + p->count = p->cur = 0; + p->pitch_total = p->yaw_total = 0.0; + +/* + * FIXME. The cannon must be located at station zero, for now. We should + * change that. + */ + + if (c->station[0].id == weapon_M61A1 && c->station[0].info > 0) { + c->station[0].info4 = 0.0; + return 1; + } + else + return 0; + +} + +/* + * M61A1 display function + * + * Update the HUD display strings associated with this weapon system. + */ + +/*ARGSUSED */ +static int +display_m61a1(craft * c, craftType * w, viewer * u, int fpm_x, int fpm_y) +{ + + char s[16]; + int tx, ty, m; + Alib_Segment seg[2]; + hist_t *p; + + p = &history[c->pIndex]; + if ((m = p->cur = p->cur + 1) >= HIST) + m = p->cur = 0; + if (p->count != HIST) + (p->count)++; + else { + p->pitch_total -= p->pitch_hist[m]; + p->yaw_total -= p->yaw_hist[m]; + } + p->pitch_hist[m] = c->q; + p->yaw_hist[m] = c->r; + p->pitch_total += c->q; + p->yaw_total += c->r; + + strcpy(c->leftHUD[2], "LCOS"); + sprintf(s, "%.3d %s", c->station[0].info, weapon_idToName(weapon_M61A1)); + strcpy(c->leftHUD[3], s); + if (c->station[0].info3) + strcpy(c->leftHUD[4], "FIRING"); + else + strcpy(c->leftHUD[4], ""); + +/* + * Draw the boresight cross + */ + + m = (int) ((double) BORE_CROSS_SIZE * u->xscaleFactor); + + tx = u->v->focus.x; + ty = u->v->focus.y - (int)(u->v->yres * u->zoom/100.0 * eye_to_screen_cm * 0.01 * OFFSET_ANGLE); + seg[0].x1 = tx - m; + seg[0].x2 = tx + m; + seg[0].y1 = seg[0].y2 = ty; + seg[1].x1 = seg[1].x2 = tx; + seg[1].y1 = ty - m; + seg[1].y2 = ty + m; + VDrawSegments(u->v, seg, 2, HUDColor); + +/* + * Plot the reticle. + */ + + lcos(c, u); + + return 0; + +} + +static int +fire_m61a1(craft * c) +{ + c->station[0].info3 |= 1; + if (c->station[0].info > 0) { + sounds_playSound(c, sounds_CannonFiring, TRUE); + } + return 0; +} + +static int +release_m61a1(craft * c) +{ + c->station[0].info3 &= ~1; + c->station[0].info4 = 0.0; + sounds_stopSound(c, sounds_CannonFiring); + return 0; +} + +static char * +m61a1_update(craft * burst) +{ + double dNorth, dEast, dmag; + +/* + * Kill projectile streams after 10.0 seconds of flight or when + * they strike the ground. + */ + + if (curTime - burst->createTime > 10.0) + return "lifetime expired"; + + /* FIXME: actually, this is the impact with the sea level... */ + if (burst->w.z < 0.0) { + return "impact with the ground"; + } + + burst->prevSg = burst->Sg; + + dNorth = units_FEETtoMETERS(burst->Cg.x * deltaT); + dEast = units_FEETtoMETERS(burst->Cg.y * deltaT); + burst->w.z -= units_FEETtoMETERS(burst->Cg.z * deltaT + units_earth_g * halfDeltaTSquared); + + dmag = sqrt(dNorth * dNorth + dEast * dEast); + + earth_updateLatLon(&burst->w, dNorth / dmag, dEast / dmag, dmag); + earth_LatLonAltToXYZ(&burst->w, &burst->Sg); + + burst->Cg.z += units_earth_g * deltaT; + + // FIXME: not sure why we should look for cannon impacts only for local shells. + // Should we include CT_DIS_CANNON too in the calculation? + + if( burst->type == CT_CANNON ) + m61a1_lookForCannonImpacts(burst); + + return NULL; + +} + + +static void +m61a1_kill(craft * burst, char *reason) +{ + burst->type = CT_FREE; +} + + +static int +update_m61a1(craft * c) +{ + + craft *burst; + int i; + VPoint tmp, tmp1, mvel; + double fuzz, fuzzAngle, phiY, phiZ, tm, mv = MUZZLE_VELOCITY; + + if (c->station[0].info3 == 0) + return 0; + +/* + * Got any ammunition ? + */ + + if (c->station[0].info <= 0) + return -1; + +/* + * It is possible (especially on today's faster machines) that no rounds + * actually left the barrel during this time interval. + */ + + if (c->station[0].info4 > deltaT) { + c->station[0].info4 -= deltaT; + } + else { + +/* + * Allocate a projectile record + */ + + for ((i = 0, burst = &mtbl[0]); i < manifest_MAXPROJECTILES; (++i, ++burst)) + if (burst->type == CT_FREE) { + break; + } + if (i == manifest_MAXPROJECTILES) + return -1; + + memory_zero(burst); + burst->type = CT_CANNON; + burst->pIndex = i; + burst->disId = dis_if_ID_NONE; + +/* + * Determine how far we're fuzzed off the ideal boresight. + */ + + fuzz = 2.0 * prng_getDouble() - 1.0; /* -1.0 <= fuzz <= 1.0 */ + fuzz = fuzz * FUZZ; + fuzzAngle = 2.0 * M_PI * prng_getDouble(); + +/* + * Determine the initial velocity of the projectile stream. + */ + + phiZ = fuzz * sin(fuzzAngle); + phiY = fuzz * cos(fuzzAngle); + tm = mv * cos(OFFSET_ANGLE + phiZ); + + tmp.x = tm * cos(phiY); + tmp.y = tm * sin(phiY); + tmp.z = mv * sin(-OFFSET_ANGLE + phiZ); + VTransform(&tmp, &(c->trihedral), &mvel); + + burst->owner = c->pIndex; + burst->createTime = curTime; + burst->curRoll = c->curRoll; + burst->curPitch = c->curPitch; + burst->curHeading = c->curHeading; + + burst->Cg = c->Cg; + burst->Cg.x += mvel.x; + burst->Cg.y += mvel.y; + burst->Cg.z += mvel.z; + + /* Determine the initial position. */ + VTransform_(&c->cinfo->wStation[0], &c->trihedral, &tmp1); + VReverseTransform_(&tmp1, &c->XYZtoNED, &tmp); + burst->Sg.x = c->Sg.x + units_FEETtoMETERS(tmp.x); + burst->Sg.y = c->Sg.y + units_FEETtoMETERS(tmp.y); + burst->Sg.z = c->Sg.z + units_FEETtoMETERS(tmp.z); + earth_XYZToLatLonAlt(&burst->Sg, &burst->w); + burst->prevSg = burst->Sg; + + earth_XYZToLatLonAlt(&burst->Sg, &burst->w); + earth_generateWorldToLocalMatrix(&burst->w, &burst->XYZtoNED); + + /* Subtract the number of rounds fired. */ + burst->offset = c->station[0].info4; + burst->interval = deltaT; + burst->rounds = 1 + (int) (RATE_OF_FIRE * (deltaT - burst->offset)); + burst->rounds = (burst->rounds > c->station[0].info) ? + c->station[0].info : burst->rounds; + + /* Compute time interval until the next round leaves the barrel (in a + * subsequent time interval). + */ + c->station[0].info4 = 1.0 / RATE_OF_FIRE - + fmod(deltaT - burst->offset, 1.0 / RATE_OF_FIRE); + + /* Include tracer information */ + burst->tracerMod = TRACER_MOD; + burst->tracerVal = c->station[0].info2 % burst->tracerMod; + if ( ! arcadeMode ) { + c->station[0].info -= burst->rounds; + } + c->station[0].info2 += burst->rounds; + + burst->cinfo = inventory_craftTypeSearchByZoneAndName(NULL, weapon_idToName(weapon_M61A1)); + + burst->update = m61a1_update; + burst->kill = m61a1_kill; + + dis_if_fireCannon(c, &burst->Sg, &burst->Cg, burst->rounds, (int) RATE_OF_FIRE); + + } + + if (c->station[0].info <= 0) { + sounds_stopSound(c, sounds_CannonFiring); + } + return 0; + +} + + +void m61a1_DISFire(int owner, VPoint *pos, VPoint *vel, int rounds) +{ + int i; + craft *burst; + + for ((i = 0, burst = mtbl); i < manifest_MAXPROJECTILES; (++i, ++burst)) { + if (burst->type == CT_FREE) { + break; + } + } + if (i == manifest_MAXPROJECTILES) { + return; + } + memory_zero(burst); + burst->pIndex = i; + burst->disId = dis_if_ID_NONE; // not a tracked entity + burst->type = CT_DIS_CANNON; + strcpy(burst->name, "M61A1"); + burst->owner = owner; + burst->createTime = curTime; + burst->curRoll = 0.0; + burst->curPitch = 0.0; + burst->curHeading = 0.0; + burst->Sg = *pos; + burst->Cg = *vel; + earth_XYZToLatLonAlt(pos, &burst->w); // (needed, check renderer) + burst->prevSg = burst->Sg; + burst->rounds = rounds; + burst->tracerMod = TRACER_MOD; + burst->tracerVal = 0; + burst->offset = 0.0; + burst->interval = deltaT; + burst->cinfo = inventory_craftTypeSearchByZoneAndName(NULL, weapon_idToName(weapon_M61A1)); + burst->update = m61a1_update; + burst->kill = m61a1_kill; +} + + +static int +placeCannon(Viewport * vp, craft * burst, VMatrix * m, VPolySet *ps) +{ + + double t, startT; + VPoint v, s; + int i, k, n; + VPoint *q, tmp; + VPolygon **p, *poly; + +/* + * Reduce the shell path to a set of parametric equations. + */ + + v.x = burst->Sg.x - burst->prevSg.x; + v.y = burst->Sg.y - burst->prevSg.y; + v.z = burst->Sg.z - burst->prevSg.z; + +/* + * Now add each tracer shell to the view. + */ + + startT = (burst->offset + (burst->tracerVal / RATE_OF_FIRE)) / burst->interval; + + for (t = startT; t <= 1.0; t += TRACER_MOD / (RATE_OF_FIRE * burst->interval)) { + + s.x = -v.x * t; + s.y = -v.y * t; + s.z = -v.z * t; + +/* TODO: check should be based on local altitude */ +/* underground? don't plot it */ + + if (burst->w.z + s.z < 0.0) { + continue; + } + + n = burst->cinfo->object->numPolys; + p = burst->cinfo->object->polygon; + for (i = 0; i < n; ++i) { + poly = VCopyPolygon(p[i]); + for ((k = 0, q = poly->vertex); k < poly->numVtces; (++k, ++q)) { + VTransform(q, m, &tmp); + tmp.x += s.x; + tmp.y += s.y; + tmp.z += s.z; + *q = tmp; + } + VTransformPolygon(poly, &vp->eyeSpace); + VPolySet_Add(ps, poly); + } + } + + return 0; +} + +weapon_Type * +m61a1_new(void) +{ + + craftType *c; + FILE *f; + dis_entity_type em1 = + {2, 9, 225, 2, 1, 0, 0}; + dis_entity_type em2 = + {2, 1, 222, 2, 3, 0, 0}; + + c = inventory_craftTypeNew(NULL); + c->name = memory_strdup( weapon_idToName(weapon_M61A1) ); + + c->entityType = em1; + c->altEntityType = em2; + + c->placeProc = placeCannon; + + f = init_fopen("tracer.obv", "r"); + c->object = VReadObject(f); + fclose(f); + + m61a1Desc.w = c; + + return &m61a1Desc; +} + +/* + * plotReticle : draws the aiming reticle onto the HUD. + * + * An aiming reticle is a circle with an inner arc that clues the + * pilot as to the range of the target. Twelve tic marks are used + * to demarcate the range -- each tic represents 1000 feet of + * distance. + */ + +static struct { + double x, y; +} ticTable[12] = { + + { + 0.0, -1.0 + }, + { + 0.5, -0.866 + }, + { + 0.866, -0.5 + }, + { + 1.0, 0.0 + }, + { + 0.866, 0.5 + }, + { + 0.5, 0.866 + }, + { + 0.0, 1.0 + }, + { + -0.5, 0.866 + }, + { + -0.866, 0.5 + }, + { + -1.0, 0.0 + }, + { + -0.866, -0.5 + }, + { + -0.5, -0.866 + } +}; + +/*ARGSUSED */ +static void +plotReticle(craft * c, viewer * u, int x, int y, int range) +{ + +#define RETICLE_SIZE 65 +#define RANGE_SIZE 59 +#define TICK_SIZE (RETICLE_SIZE + 12) + + int i, size, xt, yt, size1, xt1, yt1, nseg, arc; + Alib_Segment seg[16]; + register double rs, rt; + + size = (int) (RETICLE_SIZE * u->xscaleFactor); + if ((size & 1) == 0) + ++size; /* insure it is an odd value */ + xt = x - size / 2; + yt = y - size / 2; + rs = size / 2; + rt = ((TICK_SIZE + 1) / 2) * u->xscaleFactor; + + for (i = 0; i < 12; i++) { + seg[i].x1 = x + + (int) (rs * ticTable[i].x + 0.5); + seg[i].y1 = y + + (int) (rs * ticTable[i].y + 0.5); + seg[i].x2 = x + + (int) (rt * ticTable[i].x + 0.5); + seg[i].y2 = y + + (int) (rt * ticTable[i].y + 0.5); + } + + nseg = 12; + Alib_drawArc(u->v->w, xt, yt, size, size, 0, + 360 * 64, HUDColor); + + if (range != -1) { + if (range > 12000) + range = 12000; + arc = -range * 23040 / 12000; + size1 = (int) (RANGE_SIZE * u->xscaleFactor); + if ((size1 & 1) == 0) + ++size1; + if (size == size1) + --size1; + xt1 = x - size1 / 2; + yt1 = y - size1 / 2; + Alib_drawArc(u->v->w, xt1, yt1, size1, size1, + 90 * 64, arc, HUDColor); + } + VDrawSegments(u->v, seg, nseg, HUDColor); + +} + +void +lcos(craft * c, viewer * u) +{ + +/* + * How does this LCOS thing work, anyway? + * + * First, let me say that this may or, more probably, may not look + * anything like the technique used in a real fighter's gun sighting + * system. Having said that, here's the basic assumptions and steps + * used to generate the reticle on the HUD: + * + * 1) Using radar, we know the distance to the target. Assuming that the + * radar is in working order and is locked onto something. + * + * 2) We know the muzzle velocity of the shells we're firing and can + * use that value to closely estimate the flight time of the shells + * to a target that's a certain distance away (the target). Call + * this value "fTime". + * + * 3) Use the muzzle velocity vector to determine the + * relative position (w.r.t. our craft) of a shell "fTime" seconds into + * its flight. Call this vector "pos". + * + * 4) Gravity will accelerate the shells. Use d = 0.5 * g * t ^ 2 + * to add a distance (along the Z axis that will approximate the + * effect of gravity. Add that to "pos". + * + * 5) We know our pitch and yaw rates. These rotations will have the + * effect of visually "bending" the cannon stream, from the pilot's + * perspective. Use the values to generate a matrix to transform + * "pos" by an amount proportional to our "fTime" value. + * + * 6) Convert our "pos" vector to screen x,y coordinates and call + * plotReticle. + */ + + double fTime, range, gm, pitch_rate, yaw_rate; + VPoint pos, tmp; + VPoint zg, z; + VMatrix rotation; + int clue, x, y; + hist_t *hist; + + hist = &history[c->pIndex]; + +/* Step 1 */ + + if (c->curRadarTarget >= 0) + range = c->targetDistance; + else + range = 2500.0; + +/* Step 2 */ + + fTime = range / MUZZLE_VELOCITY; + +/* Step 3 */ + + pos.x = fTime * MUZZLE_VELOCITY * cos(OFFSET_ANGLE); + pos.y = 0.0; + pos.z = -fTime * MUZZLE_VELOCITY * sin(OFFSET_ANGLE); + +/* Step 4 */ + + zg.x = zg.y = 0.0; + zg.z = 1.0; + + VReverseTransform_(&zg, &c->trihedral, &z); + + gm = 0.5 * units_earth_g * fTime * fTime; + pos.x += z.x * gm; + pos.y += z.y * gm; + pos.z += z.z * gm; + +/* Step 5 */ + + VIdentMatrix(&rotation); + + pitch_rate = hist->pitch_total / (double) hist->count; + yaw_rate = hist->yaw_total / (double) hist->count; + + if (pitch_rate != 0.0) + VRotate(&rotation, YRotation, -pitch_rate * fTime); + if (yaw_rate != 0.0) + VRotate(&rotation, ZRotation, -yaw_rate * fTime); + + VTransform(&pos, &rotation, &tmp); + +/* Step 6 */ + + x = (u->v->Middl.x + (int) (tmp.y * u->v->Scale.x / tmp.x)) >> 2; + y = (u->v->Middl.y + (int) (tmp.z * u->v->Scale.y / tmp.x)) >> 2; + + if (c->curRadarTarget >= 0) + clue = (int) c->targetDistance; + else + clue = -1; + + plotReticle(c, u, x, y, clue); + + m61a1_lcos_last_pos.x = x; + m61a1_lcos_last_pos.y = y; +} + +typedef struct _entry { + double time; + double min; + VPoint Sg; + VPoint rvel; + craft *c; + struct _entry *next; +} entry; + + +/** + * Track cannon shells and look for impacts with aircraft. This algorithm + * tracks each shell's flight. + */ +static void +m61a1_lookForCannonImpacts(craft * burst) +{ + + craft *c; + entry p[manifest_MAXPLAYERS], *list, *q, *r, *rprev; + VPoint v, s0, prevSg, Vm, zeroVec = {0, 0, 0}; + double t, d, roundT, startT, explosion_diameter_meters; + int j; + double worldLocation[3], entityLocation[3]; + + startT = burst->offset / burst->interval; + + Vm.x = burst->Sg.x - burst->prevSg.x; + Vm.y = burst->Sg.y - burst->prevSg.y; + Vm.z = burst->Sg.z - burst->prevSg.z; + + for (roundT = startT; roundT < 1.0; roundT += 1.0 / (RATE_OF_FIRE * burst->interval)) { + + prevSg.x = burst->prevSg.x - Vm.x * (1.0 - roundT); + prevSg.y = burst->prevSg.y - Vm.y * (1.0 - roundT); + prevSg.z = burst->prevSg.z - Vm.z * (1.0 - roundT); + + list = (entry *) NULL; + for (c = ptbl, j = 0; j < manifest_MAXPLAYERS; ++j, ++c) { + + if (c->type == CT_FREE || burst->owner == c->pIndex) + continue; + +/* + * Reduce the relative motion of this object to a the parametric system + * of equations: + * x(t) = vx * t + s0x + * y(t) = vy * t + s0y + * z(t) = vz * t + s0z + * + * We can then compute the time of perigee (closest pass) along with + * the associated minimum distance. + */ + + v.x = c->Sg.x - c->prevSg.x - Vm.x; + v.y = c->Sg.y - c->prevSg.y - Vm.y; + v.z = c->Sg.z - c->prevSg.z - Vm.z; + s0.x = c->prevSg.x - prevSg.x; + s0.y = c->prevSg.y - prevSg.y; + s0.z = c->prevSg.z - prevSg.z; + +/* + * Compute time of minimum distance between the two objects (note that units + * here are UPDATE_INTERVAL seconds). + */ + + t = -(v.x * s0.x + v.y * s0.y + v.z * s0.z) / + (v.x * v.x + v.y * v.y + v.z * v.z); + +/* + * If the closest pass occurs during this update interval, check for a hit. + * We'll build a linked list of all craft that this projectile may strike + * during this period, arranged in ascending order by time of "perigee" + * (closest pass). We'll then test for strikes. If a projectile misses + * the first object, then it may have struck subsequent objects in the + * list ... + */ + +/* + * One special case occurs when a target or missile's turn suddenly + * changes the perigee time from positive to negative. If the missile + * is within hitting range at t=0 and the time of perigee is negative, + * then zap 'em. + */ + + if (t < 0.0) { + d = sqrt(s0.x * s0.x + s0.y * s0.y + + s0.z * s0.z); + if (isCannonHit(d, c)) { + t = 0.0; + } + } + if (t >= 0.0 && t <= 1.0) { + q = &p[j]; + + q->Sg = prevSg; + q->Sg.x += Vm.x * t; + q->Sg.y += Vm.y * t; + q->Sg.z += Vm.z * t; + + q->rvel = v; + + if (list == (entry *) NULL) { + q->next = list; + list = q; + } + else if (list->time > t) { + q->next = list; + list = q; + } + else { + for (rprev = list, r = list->next; r != (entry *) NULL;) { + if (r->time > t) + break; + rprev = r; + r = r->next; + } + if (rprev != list) + rprev->next = q; + q->next = r; + } + q->time = t; + q->c = c; + q->min = sqrt(pow(v.x * t + s0.x, 2.0) + + pow(v.y * t + s0.y, 2.0) + + pow(v.z * t + s0.z, 2.0)); + } + } + +/* + * Now look for cannon hits in the list of perigees. + */ + + for (r = list; r != (entry *) NULL; r = r->next) + if (isCannonHit(r->min, r->c)) { + effects_new_explosion(&(r->Sg), &zeroVec, 1.0, 2.0, 0.5); + /* can only damage local player */ + if (r->c->type != CT_DIS_PLANE) + if (damage_absorbDISDamage(r->c, &burst->cinfo->entityType, 0, 0, + 0.0, + VMagnitude(&r->rvel), + &explosion_diameter_meters) == 0) { + + r->c->kill(r->c, "cannon fire"); + } + worldLocation[0] = r->Sg.x; + worldLocation[1] = r->Sg.y; + worldLocation[2] = r->Sg.z; + entityLocation[0] = 0.0; + entityLocation[1] = 0.0; + entityLocation[2] = 0.0; + dis_if_detonation( + &burst->cinfo->entityType, /* munition type */ + ptbl[burst->owner].disId, /* munition owner */ + r->c->disId, /* target */ + burst->disId, /* always zero -- not a tracked entity */ + worldLocation, entityLocation, + (double *) &r->rvel ); + break; + } + } +} + +/*ARGSUSED */ +int +isCannonHit(double min, craft * c) +{ + + return (min < 3.0) ? 1 : 0; +} diff -Nru acm-5.0/src/acm/m61a1.h acm-6.0+20200416/src/acm/m61a1.h --- acm-5.0/src/acm/m61a1.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/m61a1.h 2017-07-11 07:54:00.000000000 +0000 @@ -0,0 +1,60 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1998 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#ifndef _m61a1_h +#define _m61a1_h + +#include "pm.h" +#include "weapon.h" + +#ifdef m61a1_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +/** + The display routine of this modules saves here the position of the + LCOS reticule on the HUD. The HUD module then uses this value to + decide if to draw or not the designator marker. +*/ +EXTERN Alib_Point m61a1_lcos_last_pos; + +/** + Creates a new description record for the M61A1 cannon. +*/ +EXTERN weapon_Type * m61a1_new(void); + +/** + * The dis_if should invoke this function when a fire DIS PDU arrives involving + * a cannon burst. This function add a "craft" item carrying the rounds. + * All units and reference systems are those usual in this program (not the DIS + * ones). + * Cannon burst are NOT tracked by the dis_if module, and no state update events + * are send by the shooter. This implies the disId field of a burst is set to + * zero because there is no a corresponding tracked entity in the dis_if module, + * and each remote client is responsible to simulate the dynamics of the burst. + * @param owner Index of shooter in the ptbl[] array. Ignored, anyway. + * @param pos Position of the burst. + * @param vel Velocity of the burst. + * @param rounds Number of rounds. + */ +EXTERN void m61a1_DISFire(int owner, VPoint *pos, VPoint *vel, int rounds); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/magnetic_compass.c acm-6.0+20200416/src/acm/magnetic_compass.c --- acm-5.0/src/acm/magnetic_compass.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/magnetic_compass.c 2017-08-10 17:26:26.000000000 +0000 @@ -0,0 +1,299 @@ +/* + * acm : an aerial combat simulator for X + * Magnetic compass module + * Copyright (C) 2007 Umberto Salsi + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#include +#include +#include "../util/memory.h" +#include "pm.h" +#include "vpath.h" + +#define magnetic_compass_IMPORT +#include "magnetic_compass.h" + +typedef struct _magnetic_compass_data { + double last_time; /* last update */ + double hdg; /* current indicated value (RAD) */ + double hdg_dot; /* current rotation speed (RAD/s) */ + double x_rot, y_rot; /* compass roll and pitch angles in aircraft frame */ +} magnetic_compass_data; + + +static vpath_Type * compass_scale_path = NULL; + + +static void magnetic_compass_cleanup() +{ + memory_dispose(compass_scale_path); + compass_scale_path = NULL; +} + + +void magnetic_compass_enable(viewer *u) +{ + magnetic_compass_data *mc; + + if( u->magnetic_compass == NULL ){ + mc = memory_allocate(sizeof(magnetic_compass_data), NULL); + mc->last_time = curTime; + mc->hdg = 0.0; + mc->hdg_dot = 0.0; + mc->x_rot = 0.0; + mc->y_rot = 0.0; + + u->magnetic_compass = mc; + } else { + mc = u->magnetic_compass; + } +} + + +void magnetic_compass_disable(viewer *u) +{ + magnetic_compass_free(u); +} + + +#define TILT_ANGLE units_DEGtoRAD(18) + +void magnetic_compass_update(viewer *u) +{ + magnetic_compass_data *mc; + double x_rot, y_rot, MH, dt; + _BOOL tilted; + VPoint aH, cH; + VMatrix R; + + mc = u->magnetic_compass; + if( mc == NULL ) + return; + + if( ! u->c->showMag ){ + // Magnetic field components not available. + mc->last_time = curTime; // avoid abrupt turn if c->showMag enabled again + return; + } + + dt = curTime - mc->last_time + 0.01 /* div by zero workaround! */; + mc->last_time = curTime; + + /* + Update compass roll and pitch angles based on the local vertical + u->c->G: + */ + tilted = FALSE; + + x_rot = atan2(u->c->G.y, -u->c->G.z); + y_rot = -atan2(u->c->G.x, -u->c->G.z); + + mc->x_rot += (x_rot - mc->x_rot) * 0.002 / dt; + if( mc->x_rot < -TILT_ANGLE ){ + mc->x_rot = -TILT_ANGLE; + tilted = TRUE; + } + if( mc->x_rot > TILT_ANGLE ){ + mc->x_rot = TILT_ANGLE; + tilted = TRUE; + } + + mc->y_rot += (y_rot - mc->y_rot) * 0.002 / dt; + if( mc->y_rot < -TILT_ANGLE ){ + mc->y_rot = -TILT_ANGLE; + tilted = TRUE; + } + if( y_rot > TILT_ANGLE ){ + y_rot = TILT_ANGLE; + tilted = TRUE; + } + + if( tilted ) + mc->hdg_dot = 0.0; + + /* Local magnetic field aH in aircraft frame (nT): */ + VReverseTransform_(&u->c->actualMagneticField, &u->c->trihedral, &aH); + + /* Local magnetic field cH in compass frame (nT): */ + VIdentMatrix(&R); + VRotate(&R, YRotation, mc->y_rot); + VRotate(&R, XRotation, mc->x_rot); + VReverseTransform_(&aH, &R, &cH); + + /* + MH is the magnetic heading in the compass frame, i.e. projection + if cH on the local horizontal plane x-y of the aircraft: + */ + if( fabs(cH.x) + fabs(cH.y) < 1e-5 ) + return; + MH = atan2(-cH.y, cH.x); + if( MH < 0.0 ) + MH += 2*M_PI; + + /* Update rotational speed: */ + mc->hdg_dot += + + /* Apply torque due to the magnetic field. 42000 nT is the max intensity + * of the mag. field on the Earth; 0.1 is a quite arbitrary factor + * accounting for the magnetic dipole of the compass. */ + 0.1/42000 * dt * sin( MH - mc->hdg ) * sqrt(cH.x*cH.x + cH.y*cH.y) + + /* Apply viscosity (quite arbitrary coeff.). */ + - 0.007 * mc->hdg_dot; + + mc->hdg += mc->hdg_dot * dt; + + while( mc->hdg < 0.0 ) + mc->hdg += 2*M_PI; + while( mc->hdg >= 2*M_PI ) + mc->hdg -= 2*M_PI; +} + + +/** + * Return the scale of the compass, drawn on a cone of radius 1.0 + * and height 1.0. The axis of the cone is y and the pivot point is + * the origin. + */ +static vpath_Type * get_compass_scale_path() +{ + vpath_Type *path; + int a, s_len; + double r, notch_short, notch_long, notch_len; + double fh, fw, slant, margin; + VPoint p, q; + VMatrix M, L; + char *s; + static char *labels[] = {"N", "3", "6", "E", "12", "15", "S", "21", + "24", "W", "30", "33"}; + + path = vpath_new(); + + r = 1.0; /* radius and cone height */ + notch_short = 0.12 * r; + notch_long = 0.25 * r; + slant = units_DEGtoRAD(45); + fh = 0.20 * r; /* font height */ + fw = 0.12 * r; /* font width */ + margin = 0.03 * r; /* long notch to char margin */ + + for( a = 0; a < 360; a += 5 ){ + + /* Transformation for this notch + label */ + VIdentMatrix(&M); + VRotate(&M, XRotation, -slant); + VTranslate(&M, 0.0, r, -r); + VRotate(&M, YRotation, -units_DEGtoRAD(a)); + + /* Draw notch */ + if( a % 10 == 0 ) + notch_len = notch_long; + else + notch_len = notch_short; + + VSetPoint(&p, 0.0, 0.0, 0.0); + VSetPoint(&q, 0.0, -notch_len, 0.0); + VTransform(&p, &M, &p); + VTransform(&q, &M, &q); + vpath_moveTo(path, &p); + vpath_lineTo(path, &q); + + /* Draw label */ + if( a % 30 == 0 ){ + + s = labels[a/30]; + s_len = strlen(s); + + VIdentMatrix(&L); + VScaleMatrix(&L, fw, fh, 1.0); + VTranslate(&L, -0.5 * (fw * s_len), -notch_len - margin, 0.0); + VMatrixMult(&L, &M, &L); + + vpath_draw_string(path, s, s_len, &L); + } + + } + + return path; +} + + +void magnetic_compass_draw(viewer * u) +{ + magnetic_compass_data *mc; + Alib_Window *w; + double x, y, width, h, r, xmargin, ymargin; + VMatrix M; + Alib_Rect rect; + + if( ! u->c->showMag ){ + // Components of the magnetic field not available. + return; + } + + mc = u->magnetic_compass; + if( mc == NULL ) + return; + + if( u->viewDirection.x < 0.90 ) + return; + + w = u->v->w; + x = 0.85 * gui_getWidth(u->gui); + y = 0.0; + width = gui_getWidth(u->gui) - x; + h = 0.50 * width; + r = 0.45 * width; /* actual radius of the scale cone */ + + Alib_setRect(&rect, x, 0, gui_getWidth(u->gui), h); + Alib_setClipRect(w, &rect); + Alib_fillRect(w, &rect, panelBackgroundColor); + + VIdentMatrix(&M); + + /* Set scale size */ + VScaleMatrix(&M, r, r, r); + + /* Rotate based on the current magnetic compass state */ + VRotate(&M, YRotation, mc->hdg); + VRotate(&M, XRotation, mc->y_rot); + VRotate(&M, ZRotation, mc->x_rot); + + /* Move to the final screen location */ + VTranslate(&M, x + width/2, y - r + h*2/3, 0.0); + + /* Draw compass scale */ + xmargin = 0.20 * width; + ymargin = 0.10 * h; + Alib_setRect(&rect, x + xmargin, y + ymargin, x + width - xmargin, y + h - ymargin); + Alib_setClipRect(w, &rect); + if( compass_scale_path == NULL ){ + compass_scale_path = get_compass_scale_path(); + memory_registerCleanup(magnetic_compass_cleanup); + } + vpath_stroke(compass_scale_path, &M, w, whiteColor); + + /* Draw reference line */ + Alib_drawLine(w, x + 0.5*width, y + 0.10*h, x + 0.5*width, y + 0.90*h, + magentaColor); +} + + +void magnetic_compass_free(viewer *u) +{ + memory_dispose(u->magnetic_compass); + u->magnetic_compass = NULL; +} diff -Nru acm-5.0/src/acm/magnetic_compass.h acm-6.0+20200416/src/acm/magnetic_compass.h --- acm-5.0/src/acm/magnetic_compass.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/magnetic_compass.h 2017-10-13 02:41:33.000000000 +0000 @@ -0,0 +1,70 @@ +/* + * acm : an aerial combat simulator for X + * Magnetic compass module + * Copyright (C) 2007 Umberto Salsi + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +/** + * This module simulates the magnetic compass for didactic purposes. + * Components of the local magnetic vector are calculated by the wmm module. + * + * The compass rotates under the effect of the torque produced by the Earth + * magnetic field and it is braked by its inertia and by the viscosity of + * the fluid. + * + * @file + */ + +#ifndef _magnetic_compass_h +#define _magnetic_compass_h + +#include "pm.h" + +#ifdef magnetic_compass_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +/** + * Enables the magnetic compass for this particular viewer. + * If u->magnetic_compass is NULL, instantiate with a pointer to internal data. + */ +EXTERN void magnetic_compass_enable(viewer *u); + +/** + * Disable the magnetic compass for this particular viewer. + */ +EXTERN void magnetic_compass_disable(viewer *u); + +/** + * Release magnetic_compass data u->magnetic_compass. + */ +EXTERN void magnetic_compass_free(viewer *u); + +/** + * Magnetic compass state update. + */ +EXTERN void magnetic_compass_update(viewer * u); + +/** + * Draw magnetic compass only if MH display is enabled; does nothing in TH mode. + * If no magnetic compass active in this viewer, do nothing. + */ +EXTERN void magnetic_compass_draw(viewer * u); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/Makefile acm-6.0+20200416/src/acm/Makefile --- acm-5.0/src/acm/Makefile 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/Makefile 2017-10-22 14:44:27.000000000 +0000 @@ -0,0 +1,196 @@ +# This file generated by make-makefile, do not edit! +# Create Makefile-include.txt instead for your customizations. +CC := gcc +CFLAGS := -Wall -Werror -g -fmax-errors=99 -Wuninitialized -Wmissing-prototypes -Wredundant-decls +LIBS := + +.PHONY: all +all: + make acm.exe adf.o aim120.o aim9m.o air.o alarm.o aps.o astro.o box.o browse.o ccip.o commands.o damage.o dis_if.o draw.o drone.o effects.o events.o flaps.o gear.o hsi.o hud.o init.o instruments.o interpolate.o inventory.o joystick.o list.o m61a1.o magnetic_compass.o manifest.o missile.o mouse.o navaid.o panel.o patchlevel.o place.o planes.o players.o pm.o prompt.o radar.o render.o runway.o scale.o sounds.o terminal.o terrain.o update.o viewer.o vpath.o vpath_gallery.o weapon.o weapon_null.o windows.o zone.o zones.o + +include Makefile-include.txt + +.PHONY: test +test: acm.exe + ./acm.exe + + +.PHONY: clean +clean: + rm -f *.o *.exe *.stackdump acm + +acm.o: acm.c ../V/Alib.h ../V/VColor.h ../V/VObjects.h ../V/VPoly.h ../V/Vlib.h ../V/Vlibmath.h ../dis/dis/dis.h ../dis/dis/disx.h ../dis/dis/earth.h ../util/error.h ../util/gui.h ../util/memory.h ../util/reader.h ../util/units.h ../util/varray.h air.h box.h damage.h dis_if.h drone.h effects.h gear.h init.h interpolate.h inventory.h joystick.h list.h m61a1.h manifest.h mouse.h patchlevel.h players.h pm.h render.h scale.h update.h weapon.h zone.h zones.h + $(CC) $(CFLAGS) -c acm.c -o acm.o + +acm.exe: ../V/Alib.o ../V/VColor.o ../V/VGlyph.o ../V/VObjects.o ../V/VPoly.o ../V/VRoman.o ../V/Vlib.o ../V/Vlibmath.o ../dis/dis/datum.o ../dis/dis/dis.o ../dis/dis/disx.o ../dis/dis/earth.o ../dis/dis/xdr.o ../dis/dis/xdr_dis.o ../util/audio.o ../util/error.o ../util/gui.o ../util/memory.o ../util/prng.o ../util/reader.o ../util/sparsearray.o ../util/timer.o ../util/units.o ../util/varray.o ../util/wav.o ../util/zulu.o ../wmm/Geomagnetism.o ../wmm/wmm.o acm.o adf.o aim120.o aim9m.o air.o alarm.o aps.o astro.o box.o browse.o ccip.o commands.o damage.o dis_if.o draw.o drone.o effects.o events.o flaps.o gear.o hsi.o hud.o init.o instruments.o interpolate.o inventory.o joystick.o list.o m61a1.o magnetic_compass.o manifest.o missile.o mouse.o navaid.o panel.o patchlevel.o place.o planes.o players.o pm.o prompt.o radar.o render.o runway.o scale.o sounds.o terminal.o terrain.o update.o viewer.o vpath.o vpath_gallery.o weapon.o weapon_null.o windows.o zone.o zones.o + $(CC) $(CFLAGS) -o acm.exe ../V/Alib.o ../V/VColor.o ../V/VGlyph.o ../V/VObjects.o ../V/VPoly.o ../V/VRoman.o ../V/Vlib.o ../V/Vlibmath.o ../dis/dis/datum.o ../dis/dis/dis.o ../dis/dis/disx.o ../dis/dis/earth.o ../dis/dis/xdr.o ../dis/dis/xdr_dis.o ../util/audio.o ../util/error.o ../util/gui.o ../util/memory.o ../util/prng.o ../util/reader.o ../util/sparsearray.o ../util/timer.o ../util/units.o ../util/varray.o ../util/wav.o ../util/zulu.o ../wmm/Geomagnetism.o ../wmm/wmm.o acm.o adf.o aim120.o aim9m.o air.o alarm.o aps.o astro.o box.o browse.o ccip.o commands.o damage.o dis_if.o draw.o drone.o effects.o events.o flaps.o gear.o hsi.o hud.o init.o instruments.o interpolate.o inventory.o joystick.o list.o m61a1.o magnetic_compass.o manifest.o missile.o mouse.o navaid.o panel.o patchlevel.o place.o planes.o players.o pm.o prompt.o radar.o render.o runway.o scale.o sounds.o terminal.o terrain.o update.o viewer.o vpath.o vpath_gallery.o weapon.o weapon_null.o windows.o zone.o zones.o $(LIBS) -lm + +adf.o: adf.c adf.h ../V/Alib.h ../V/VColor.h ../V/VObjects.h ../V/VPoly.h ../V/Vlib.h ../V/Vlibmath.h ../dis/dis/dis.h ../dis/dis/earth.h ../util/gui.h ../util/memory.h ../util/units.h air.h interpolate.h inventory.h manifest.h navaid.h pm.h scale.h vpath.h vpath_gallery.h zone.h zones.h + $(CC) $(CFLAGS) -c adf.c -o adf.o + +aim120.o: aim120.c aim120.h ../V/Alib.h ../V/VColor.h ../V/VObjects.h ../V/VPoly.h ../V/Vlib.h ../V/Vlibmath.h ../dis/dis/dis.h ../dis/dis/earth.h ../util/gui.h ../util/memory.h ../util/units.h air.h gear.h init.h interpolate.h inventory.h manifest.h missile.h pm.h scale.h sounds.h weapon.h zone.h zones.h + $(CC) $(CFLAGS) -c aim120.c -o aim120.o + +aim9m.o: aim9m.c aim9m.h ../V/Alib.h ../V/VColor.h ../V/VObjects.h ../V/VPoly.h ../V/Vlib.h ../V/Vlibmath.h ../dis/dis/dis.h ../dis/dis/earth.h ../util/gui.h ../util/memory.h ../util/units.h air.h gear.h init.h interpolate.h inventory.h manifest.h missile.h pm.h scale.h sounds.h weapon.h zone.h zones.h + $(CC) $(CFLAGS) -c aim9m.c -o aim9m.o + +air.o: air.c air.h ../V/Alib.h ../V/VColor.h ../V/VObjects.h ../V/VPoly.h ../V/Vlib.h ../V/Vlibmath.h ../dis/dis/dis.h ../dis/dis/earth.h ../util/gui.h ../util/prng.h ../util/units.h interpolate.h inventory.h manifest.h pm.h scale.h zone.h zones.h + $(CC) $(CFLAGS) -c air.c -o air.o + +alarm.o: alarm.c alarm.h ../V/Alib.h ../V/VColor.h ../V/VObjects.h ../V/VPoly.h ../V/Vlib.h ../V/Vlibmath.h ../dis/dis/dis.h ../dis/dis/earth.h ../util/gui.h ../util/memory.h ../util/units.h air.h interpolate.h inventory.h manifest.h pm.h scale.h zone.h zones.h + $(CC) $(CFLAGS) -c alarm.c -o alarm.o + +aps.o: aps.c aps.h ../V/Alib.h ../V/VColor.h ../V/VObjects.h ../V/VPoly.h ../V/Vlib.h ../V/Vlibmath.h ../dis/dis/dis.h ../dis/dis/earth.h ../util/gui.h ../util/memory.h ../util/units.h air.h flaps.h gear.h hsi.h interpolate.h inventory.h manifest.h pm.h scale.h terrain.h zone.h zones.h + $(CC) $(CFLAGS) -c aps.c -o aps.o + +astro.o: astro.c astro.h ../V/Vlibmath.h ../util/error.h ../util/memory.h ../util/zulu.h + $(CC) $(CFLAGS) -c astro.c -o astro.o + +box.o: box.c box.h ../V/Alib.h ../V/VColor.h ../V/VObjects.h ../V/VPoly.h ../V/Vlib.h ../V/Vlibmath.h ../dis/dis/dis.h ../dis/dis/earth.h ../util/error.h ../util/gui.h ../util/memory.h ../util/units.h air.h interpolate.h inventory.h manifest.h planes.h pm.h scale.h zone.h zones.h + $(CC) $(CFLAGS) -c box.c -o box.o + +browse.o: browse.c browse.h ../V/Alib.h ../V/VColor.h ../V/VObjects.h ../V/VPoly.h ../V/Vlib.h ../V/Vlibmath.h ../dis/dis/dis.h ../dis/dis/disx.h ../dis/dis/earth.h ../util/gui.h ../util/units.h ../util/varray.h air.h box.h damage.h dis_if.h drone.h interpolate.h inventory.h joystick.h manifest.h pm.h render.h scale.h zone.h zones.h + $(CC) $(CFLAGS) -c browse.c -o browse.o + +ccip.o: ccip.c ccip.h ../V/Alib.h ../V/VColor.h ../V/VObjects.h ../V/VPoly.h ../V/Vlib.h ../V/Vlibmath.h ../dis/dis/dis.h ../dis/dis/disx.h ../dis/dis/earth.h ../util/gui.h ../util/memory.h ../util/units.h ../util/varray.h air.h damage.h dis_if.h draw.h effects.h gear.h init.h interpolate.h inventory.h manifest.h pm.h scale.h terrain.h weapon.h zone.h zones.h + $(CC) $(CFLAGS) -c ccip.c -o ccip.o + +commands.o: commands.c commands.h ../V/Alib.h ../V/VColor.h ../V/VObjects.h ../V/VPoly.h ../V/Vlib.h ../V/Vlibmath.h ../dis/dis/dis.h ../dis/dis/earth.h ../util/gui.h ../util/units.h air.h interpolate.h inventory.h list.h manifest.h players.h pm.h scale.h terminal.h zone.h zones.h + $(CC) $(CFLAGS) -c commands.c -o commands.o + +damage.o: damage.c damage.h ../V/Alib.h ../V/VColor.h ../V/VObjects.h ../V/VPoly.h ../V/Vlib.h ../V/Vlibmath.h ../dis/dis/dis.h ../dis/dis/earth.h ../util/gui.h ../util/prng.h ../util/units.h air.h interpolate.h inventory.h manifest.h pm.h scale.h sounds.h zone.h zones.h + $(CC) $(CFLAGS) -c damage.c -o damage.o + +dis_if.o: dis_if.c dis_if.h ../V/Alib.h ../V/VColor.h ../V/VObjects.h ../V/VPoly.h ../V/Vlib.h ../V/Vlibmath.h ../dis/dis/datum.h ../dis/dis/dis.h ../dis/dis/disx.h ../dis/dis/earth.h ../util/error.h ../util/gui.h ../util/memory.h ../util/prng.h ../util/units.h ../util/varray.h air.h interpolate.h inventory.h manifest.h pm.h scale.h update.h zone.h zones.h + $(CC) $(CFLAGS) -c dis_if.c -o dis_if.o + +draw.o: draw.c draw.h ../V/Alib.h ../V/VColor.h ../V/VPoly.h ../V/Vlib.h ../V/Vlibmath.h ../util/gui.h ../util/memory.h ../util/units.h + $(CC) $(CFLAGS) -c draw.c -o draw.o + +drone.o: drone.c drone.h ../V/Alib.h ../V/VColor.h ../V/VObjects.h ../V/VPoly.h ../V/Vlib.h ../V/Vlibmath.h ../dis/dis/dis.h ../dis/dis/disx.h ../dis/dis/earth.h ../util/error.h ../util/gui.h ../util/memory.h ../util/prng.h ../util/units.h ../util/varray.h air.h alarm.h aps.h browse.h dis_if.h flaps.h gear.h interpolate.h inventory.h list.h manifest.h players.h pm.h prompt.h radar.h scale.h weapon.h zone.h zones.h + $(CC) $(CFLAGS) -c drone.c -o drone.o + +effects.o: effects.c effects.h ../V/Alib.h ../V/VColor.h ../V/VObjects.h ../V/VPoly.h ../V/Vlib.h ../V/Vlibmath.h ../dis/dis/dis.h ../dis/dis/earth.h ../util/gui.h ../util/memory.h ../util/prng.h ../util/units.h air.h interpolate.h inventory.h manifest.h pm.h scale.h zone.h zones.h + $(CC) $(CFLAGS) -c effects.c -o effects.o + +events.o: events.c events.h ../V/Alib.h ../V/VColor.h ../V/VObjects.h ../V/VPoly.h ../V/Vlib.h ../V/Vlibmath.h ../dis/dis/dis.h ../dis/dis/disx.h ../dis/dis/earth.h ../util/error.h ../util/gui.h ../util/units.h ../util/varray.h adf.h air.h aps.h box.h browse.h commands.h dis_if.h drone.h flaps.h gear.h hsi.h hud.h instruments.h interpolate.h inventory.h joystick.h manifest.h mouse.h pm.h prompt.h radar.h render.h scale.h sounds.h terminal.h weapon.h windows.h zone.h zones.h + $(CC) $(CFLAGS) -c events.c -o events.o + +flaps.o: flaps.c flaps.h ../V/Alib.h ../V/VColor.h ../V/VObjects.h ../V/VPoly.h ../V/Vlib.h ../V/Vlibmath.h ../dis/dis/dis.h ../dis/dis/earth.h ../util/gui.h ../util/units.h air.h damage.h interpolate.h inventory.h manifest.h pm.h scale.h zone.h zones.h + $(CC) $(CFLAGS) -c flaps.c -o flaps.o + +gear.o: gear.c gear.h ../V/Alib.h ../V/VColor.h ../V/VObjects.h ../V/VPoly.h ../V/Vlib.h ../V/Vlibmath.h ../dis/dis/dis.h ../dis/dis/earth.h ../util/error.h ../util/gui.h ../util/memory.h ../util/units.h air.h damage.h interpolate.h inventory.h manifest.h pm.h prompt.h scale.h sounds.h terrain.h zone.h zones.h + $(CC) $(CFLAGS) -c gear.c -o gear.o + +hsi.o: hsi.c hsi.h ../V/Alib.h ../V/VColor.h ../V/VObjects.h ../V/VPoly.h ../V/Vlib.h ../V/Vlibmath.h ../dis/dis/dis.h ../dis/dis/earth.h ../util/gui.h ../util/memory.h ../util/units.h air.h interpolate.h inventory.h manifest.h navaid.h pm.h scale.h vpath.h vpath_gallery.h zone.h zones.h + $(CC) $(CFLAGS) -c hsi.c -o hsi.o + +hud.o: hud.c hud.h ../V/Alib.h ../V/VColor.h ../V/VObjects.h ../V/VPoly.h ../V/Vlib.h ../V/Vlibmath.h ../dis/dis/dis.h ../dis/dis/earth.h ../util/gui.h ../util/memory.h ../util/units.h air.h aps.h damage.h draw.h interpolate.h inventory.h m61a1.h manifest.h pm.h scale.h vpath.h weapon.h zone.h zones.h + $(CC) $(CFLAGS) -c hud.c -o hud.o + +init.o: init.c init.h ../V/Alib.h ../V/VColor.h ../V/VObjects.h ../V/VPoly.h ../V/Vlib.h ../V/Vlibmath.h ../dis/dis/dis.h ../dis/dis/disx.h ../dis/dis/earth.h ../util/error.h ../util/gui.h ../util/memory.h ../util/units.h ../util/varray.h ../util/zulu.h ../wmm/wmm.h air.h alarm.h astro.h dis_if.h interpolate.h inventory.h manifest.h planes.h pm.h scale.h vpath.h vpath_gallery.h weapon.h zone.h zones.h + $(CC) $(CFLAGS) -c init.c -o init.o + +instruments.o: instruments.c instruments.h ../V/Alib.h ../V/VColor.h ../V/VObjects.h ../V/VPoly.h ../V/Vlib.h ../V/Vlibmath.h ../dis/dis/dis.h ../dis/dis/earth.h ../util/gui.h ../util/memory.h ../util/units.h air.h aps.h draw.h interpolate.h inventory.h manifest.h pm.h scale.h vpath.h zone.h zones.h + $(CC) $(CFLAGS) -c instruments.c -o instruments.o + +interpolate.o: interpolate.c interpolate.h ../util/error.h ../util/memory.h + $(CC) $(CFLAGS) -c interpolate.c -o interpolate.o + +inventory.o: inventory.c inventory.h ../V/Alib.h ../V/VColor.h ../V/VObjects.h ../V/VPoly.h ../V/Vlib.h ../V/Vlibmath.h ../dis/dis/dis.h ../dis/dis/earth.h ../util/error.h ../util/gui.h ../util/memory.h ../util/reader.h ../util/units.h air.h init.h interpolate.h manifest.h planes.h pm.h scale.h weapon.h zone.h zones.h + $(CC) $(CFLAGS) -c inventory.c -o inventory.o + +joystick.o: joystick.c joystick.h + $(CC) $(CFLAGS) -c joystick.c -o joystick.o + +list.o: list.c list.h ../util/memory.h + $(CC) $(CFLAGS) -c list.c -o list.o + +m61a1.o: m61a1.c m61a1.h ../V/Alib.h ../V/VColor.h ../V/VObjects.h ../V/VPoly.h ../V/Vlib.h ../V/Vlibmath.h ../dis/dis/dis.h ../dis/dis/disx.h ../dis/dis/earth.h ../util/gui.h ../util/memory.h ../util/prng.h ../util/units.h ../util/varray.h air.h damage.h dis_if.h effects.h init.h interpolate.h inventory.h manifest.h pm.h scale.h sounds.h weapon.h zone.h zones.h + $(CC) $(CFLAGS) -c m61a1.c -o m61a1.o + +magnetic_compass.o: magnetic_compass.c magnetic_compass.h ../V/Alib.h ../V/VColor.h ../V/VObjects.h ../V/VPoly.h ../V/Vlib.h ../V/Vlibmath.h ../dis/dis/dis.h ../dis/dis/earth.h ../util/gui.h ../util/memory.h ../util/units.h air.h interpolate.h inventory.h manifest.h pm.h scale.h vpath.h zone.h zones.h + $(CC) $(CFLAGS) -c magnetic_compass.c -o magnetic_compass.o + +manifest.o: manifest.c manifest.h ../util/units.h + $(CC) $(CFLAGS) -c manifest.c -o manifest.o + +missile.o: missile.c missile.h ../V/Alib.h ../V/VColor.h ../V/VObjects.h ../V/VPoly.h ../V/Vlib.h ../V/Vlibmath.h ../dis/dis/dis.h ../dis/dis/disx.h ../dis/dis/earth.h ../util/error.h ../util/gui.h ../util/memory.h ../util/units.h ../util/varray.h air.h damage.h dis_if.h effects.h interpolate.h inventory.h manifest.h planes.h pm.h scale.h terrain.h zone.h zones.h + $(CC) $(CFLAGS) -c missile.c -o missile.o + +mouse.o: mouse.c mouse.h ../V/Alib.h ../V/VColor.h ../V/VObjects.h ../V/VPoly.h ../V/Vlib.h ../V/Vlibmath.h ../dis/dis/dis.h ../dis/dis/earth.h ../util/gui.h ../util/units.h air.h events.h interpolate.h inventory.h joystick.h manifest.h pm.h scale.h zone.h zones.h + $(CC) $(CFLAGS) -c mouse.c -o mouse.o + +navaid.o: navaid.c navaid.h ../V/Alib.h ../V/VColor.h ../V/VObjects.h ../V/VPoly.h ../V/Vlib.h ../V/Vlibmath.h ../dis/dis/dis.h ../dis/dis/earth.h ../util/error.h ../util/gui.h ../util/memory.h ../util/units.h ../wmm/wmm.h air.h interpolate.h inventory.h manifest.h pm.h scale.h zone.h zones.h + $(CC) $(CFLAGS) -c navaid.c -o navaid.o + +panel.o: panel.c panel.h ../V/Alib.h ../V/VColor.h ../V/VObjects.h ../V/VPoly.h ../V/Vlib.h ../V/Vlibmath.h ../dis/dis/dis.h ../dis/dis/earth.h ../util/error.h ../util/gui.h ../util/memory.h ../util/units.h adf.h air.h aps.h damage.h draw.h gear.h hsi.h interpolate.h inventory.h manifest.h planes.h pm.h radar.h scale.h terrain.h vpath.h zone.h zones.h + $(CC) $(CFLAGS) -c panel.c -o panel.o + +patchlevel.o: patchlevel.c patchlevel.h + $(CC) $(CFLAGS) -c patchlevel.c -o patchlevel.o + +place.o: place.c place.h ../V/Alib.h ../V/VColor.h ../V/VObjects.h ../V/VPoly.h ../V/Vlib.h ../V/Vlibmath.h ../dis/dis/dis.h ../dis/dis/earth.h ../util/gui.h ../util/units.h air.h interpolate.h inventory.h manifest.h pm.h scale.h zone.h zones.h + $(CC) $(CFLAGS) -c place.c -o place.o + +planes.o: planes.c planes.h ../V/Alib.h ../V/VColor.h ../V/VObjects.h ../V/VPoly.h ../V/Vlib.h ../V/Vlibmath.h ../dis/dis/dis.h ../dis/dis/earth.h ../util/error.h ../util/gui.h ../util/units.h air.h alarm.h damage.h gear.h interpolate.h inventory.h manifest.h pm.h scale.h terrain.h weapon.h zone.h zones.h + $(CC) $(CFLAGS) -c planes.c -o planes.o + +players.o: players.c players.h ../V/Alib.h ../V/VColor.h ../V/VObjects.h ../V/VPoly.h ../V/Vlib.h ../V/Vlibmath.h ../dis/dis/dis.h ../dis/dis/disx.h ../dis/dis/earth.h ../util/error.h ../util/gui.h ../util/memory.h ../util/units.h ../util/varray.h air.h box.h browse.h dis_if.h drone.h effects.h flaps.h gear.h hsi.h hud.h instruments.h interpolate.h inventory.h list.h magnetic_compass.h manifest.h patchlevel.h planes.h pm.h prompt.h render.h scale.h sounds.h terrain.h update.h viewer.h weapon.h windows.h zone.h zones.h + $(CC) $(CFLAGS) -c players.c -o players.o + +pm.o: pm.c pm.h ../V/Alib.h ../V/VColor.h ../V/VObjects.h ../V/VPoly.h ../V/Vlib.h ../V/Vlibmath.h ../dis/dis/dis.h ../dis/dis/disx.h ../dis/dis/earth.h ../util/gui.h ../util/memory.h ../util/units.h ../util/varray.h ../wmm/wmm.h air.h aps.h damage.h dis_if.h gear.h interpolate.h inventory.h manifest.h planes.h prompt.h scale.h terrain.h zone.h zones.h + $(CC) $(CFLAGS) -c pm.c -o pm.o + +prompt.o: prompt.c prompt.h ../V/Alib.h ../V/VColor.h ../V/VObjects.h ../V/VPoly.h ../V/Vlib.h ../V/Vlibmath.h ../dis/dis/dis.h ../dis/dis/disx.h ../dis/dis/earth.h ../util/gui.h ../util/memory.h ../util/prng.h ../util/units.h ../util/varray.h air.h dis_if.h init.h interpolate.h inventory.h list.h manifest.h patchlevel.h pm.h scale.h zone.h zones.h + $(CC) $(CFLAGS) -c prompt.c -o prompt.o + +radar.o: radar.c radar.h ../V/Alib.h ../V/VColor.h ../V/VObjects.h ../V/VPoly.h ../V/Vlib.h ../V/Vlibmath.h ../dis/dis/dis.h ../dis/dis/disx.h ../dis/dis/earth.h ../util/error.h ../util/gui.h ../util/units.h ../util/varray.h air.h damage.h dis_if.h draw.h interpolate.h inventory.h manifest.h pm.h scale.h sounds.h zone.h zones.h + $(CC) $(CFLAGS) -c radar.c -o radar.o + +render.o: render.c render.h ../V/Alib.h ../V/VColor.h ../V/VObjects.h ../V/VPoly.h ../V/Vlib.h ../V/Vlibmath.h ../dis/dis/dis.h ../dis/dis/disx.h ../dis/dis/earth.h ../util/gui.h ../util/memory.h ../util/units.h ../util/varray.h ../util/zulu.h air.h astro.h browse.h damage.h dis_if.h gear.h hud.h instruments.h interpolate.h inventory.h magnetic_compass.h manifest.h panel.h place.h pm.h prompt.h scale.h sounds.h terminal.h terrain.h zone.h zones.h + $(CC) $(CFLAGS) -c render.c -o render.o + +runway.o: runway.c runway.h ../V/VColor.h ../V/VPoly.h ../V/Vlibmath.h ../util/memory.h ../util/units.h + $(CC) $(CFLAGS) -c runway.c -o runway.o + +scale.o: scale.c scale.h ../V/Alib.h ../V/VColor.h ../V/VPoly.h ../V/Vlib.h ../V/Vlibmath.h ../util/error.h ../util/gui.h ../util/units.h + $(CC) $(CFLAGS) -c scale.c -o scale.o + +sounds.o: sounds.c sounds.h ../V/Alib.h ../V/VColor.h ../V/VObjects.h ../V/VPoly.h ../V/Vlib.h ../V/Vlibmath.h ../dis/dis/dis.h ../dis/dis/earth.h ../util/audio.h ../util/error.h ../util/gui.h ../util/memory.h ../util/units.h air.h init.h interpolate.h inventory.h manifest.h pm.h scale.h zone.h zones.h + $(CC) $(CFLAGS) -c sounds.c -o sounds.o + +terminal.o: terminal.c terminal.h ../V/Alib.h ../V/VColor.h ../V/VObjects.h ../V/VPoly.h ../V/Vlib.h ../V/Vlibmath.h ../dis/dis/dis.h ../dis/dis/earth.h ../util/gui.h ../util/memory.h ../util/units.h air.h interpolate.h inventory.h manifest.h pm.h scale.h zone.h zones.h + $(CC) $(CFLAGS) -c terminal.c -o terminal.o + +terrain.o: terrain.c terrain.h ../V/Alib.h ../V/VColor.h ../V/VObjects.h ../V/VPoly.h ../V/Vlib.h ../V/Vlibmath.h ../dis/dis/dis.h ../dis/dis/earth.h ../util/gui.h ../util/units.h air.h interpolate.h inventory.h manifest.h pm.h scale.h zone.h zones.h + $(CC) $(CFLAGS) -c terrain.c -o terrain.o + +update.o: update.c update.h ../V/Alib.h ../V/VColor.h ../V/VObjects.h ../V/VPoly.h ../V/Vlib.h ../V/Vlibmath.h ../dis/dis/dis.h ../dis/dis/disx.h ../dis/dis/earth.h ../util/gui.h ../util/memory.h ../util/timer.h ../util/units.h ../util/varray.h air.h alarm.h box.h dis_if.h events.h interpolate.h inventory.h manifest.h pm.h prompt.h radar.h render.h scale.h zone.h zones.h + $(CC) $(CFLAGS) -c update.c -o update.o + +viewer.o: viewer.c viewer.h ../V/Alib.h ../V/VColor.h ../V/VObjects.h ../V/VPoly.h ../V/Vlib.h ../V/Vlibmath.h ../dis/dis/dis.h ../dis/dis/earth.h ../util/gui.h ../util/memory.h ../util/units.h air.h hsi.h hud.h instruments.h interpolate.h inventory.h magnetic_compass.h manifest.h pm.h prompt.h render.h scale.h terminal.h zone.h zones.h + $(CC) $(CFLAGS) -c viewer.c -o viewer.o + +vpath.o: vpath.c vpath.h ../V/Alib.h ../V/VColor.h ../V/VGlyph.h ../V/VPoly.h ../V/VRoman.h ../V/Vlib.h ../V/Vlibmath.h ../util/gui.h ../util/memory.h ../util/units.h + $(CC) $(CFLAGS) -c vpath.c -o vpath.o + +vpath_gallery.o: vpath_gallery.c vpath_gallery.h ../V/Alib.h ../V/VColor.h ../V/VPoly.h ../V/Vlib.h ../V/Vlibmath.h ../util/gui.h ../util/memory.h ../util/units.h vpath.h + $(CC) $(CFLAGS) -c vpath_gallery.c -o vpath_gallery.o + +weapon.o: weapon.c weapon.h ../V/Alib.h ../V/VColor.h ../V/VObjects.h ../V/VPoly.h ../V/Vlib.h ../V/Vlibmath.h ../dis/dis/dis.h ../dis/dis/earth.h ../util/gui.h ../util/units.h aim120.h aim9m.h air.h ccip.h interpolate.h inventory.h m61a1.h manifest.h pm.h scale.h weapon_null.h zone.h zones.h + $(CC) $(CFLAGS) -c weapon.c -o weapon.o + +weapon_null.o: weapon_null.c weapon_null.h ../V/Alib.h ../V/VColor.h ../V/VObjects.h ../V/VPoly.h ../V/Vlib.h ../V/Vlibmath.h ../dis/dis/dis.h ../dis/dis/earth.h ../util/gui.h ../util/units.h air.h interpolate.h inventory.h manifest.h pm.h scale.h weapon.h zone.h zones.h + $(CC) $(CFLAGS) -c weapon_null.c -o weapon_null.o + +windows.o: windows.c windows.h ../V/Alib.h ../V/VColor.h ../V/VObjects.h ../V/VPoly.h ../V/Vlib.h ../V/Vlibmath.h ../dis/dis/dis.h ../dis/dis/earth.h ../util/gui.h ../util/units.h air.h hud.h instruments.h interpolate.h inventory.h manifest.h pm.h prompt.h scale.h zone.h zones.h + $(CC) $(CFLAGS) -c windows.c -o windows.o + +zone.o: zone.c zone.h ../V/Alib.h ../V/VColor.h ../V/VObjects.h ../V/VPoly.h ../V/Vlib.h ../V/Vlibmath.h ../dis/dis/dis.h ../dis/dis/earth.h ../util/error.h ../util/gui.h ../util/memory.h ../util/reader.h ../util/units.h air.h interpolate.h inventory.h manifest.h navaid.h pm.h runway.h scale.h zones.h + $(CC) $(CFLAGS) -c zone.c -o zone.o + +zones.o: zones.c zones.h ../V/Vlibmath.h ../dis/dis/earth.h ../util/error.h ../util/memory.h ../util/reader.h zone.h + $(CC) $(CFLAGS) -c zones.c -o zones.o + +# Checksum of the original file: 4005364219 diff -Nru acm-5.0/src/acm/Makefile-include.txt acm-6.0+20200416/src/acm/Makefile-include.txt --- acm-5.0/src/acm/Makefile-include.txt 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/Makefile-include.txt 2017-09-05 21:58:06.000000000 +0000 @@ -0,0 +1,15 @@ +# OS specific compilation options: +ifeq ($(OS),Windows_NT) + CC = c:/mingw/bin/gcc + CFLAGS += -mconsole -mwindows + LIBS += -lws2_32 -lwinmm +else + UNAME_S := $(shell uname -s) + ifeq ($(UNAME_S),Linux) + CFLAGS += + LIBS += -lX11 -lasound -pthread + else + CFLAGS += + LIBS += -lX11 -lasound -pthread + endif +endif \ No newline at end of file diff -Nru acm-5.0/src/acm/manifest.c acm-6.0+20200416/src/acm/manifest.c --- acm-5.0/src/acm/manifest.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/manifest.c 2017-03-22 00:58:09.000000000 +0000 @@ -0,0 +1,6 @@ +/* + * Dummy empty implementation: this module only exports declarations. + */ + +#define manifest_IMPORT +#include "manifest.h" diff -Nru acm-5.0/src/acm/manifest.h acm-6.0+20200416/src/acm/manifest.h --- acm-5.0/src/acm/manifest.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/manifest.h 2017-10-28 08:27:33.000000000 +0000 @@ -0,0 +1,68 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1996 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#ifndef _manifest_h +#define _manifest_h + +#include "../util/units.h" + +#ifdef manifest_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +/** Maximum number of players and drones. */ +#define manifest_MAXPLAYERS 32 + +/** Maximum number of chasers. */ +#define manifest_MAXCHASERS 1 + +/** Maximum number of missiles and cannon streams. */ +#define manifest_MAXPROJECTILES (manifest_MAXPLAYERS * 1) + +#define manifest_MAXEXPLOSIONS manifest_MAXPROJECTILES + +/** Max number of weapon stations launch points per aircraft. */ +#define manifest_STATIONS 9 + +/** + * We'll check every now and again to see if any aircraft are waiting to + * be resupplied. RESUPPLY_EVERY defines the number of seconds + * between each check (30 seconds, here). + */ +#define manifest_RESUPPLY_INTERVAL (30.0) + +/** + * When on the ground, we won't allow planes to stray too far from their + * team's airport. manifest_MAX_GROUND_DISTANCE defines that distance. + */ +#define manifest_MAX_GROUND_DISTANCE (3.0 * units_NmToFeetFactor) + +/** + * The maximum allowed dead reckoning errors for DIS. + * (Note: the units are meters and radians.) + */ +#define manifest_DIS_LOCATION_THRESHOLD 3.0 +#define manifest_DIS_ORIENTATION_THRESHOLD units_DEGtoRAD(2) + +/** Identifies X-Window resources related to this program. */ +#define manifest_ACM "acm" + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/missile.c acm-6.0+20200416/src/acm/missile.c --- acm-5.0/src/acm/missile.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/missile.c 2017-10-28 08:28:10.000000000 +0000 @@ -0,0 +1,765 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1998 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#include +#include +#include +#include "pm.h" +#include "dis_if.h" +#include "effects.h" +#include "damage.h" +#include "inventory.h" +#include "planes.h" +#include "terrain.h" +#include "../util/error.h" +#include "../util/memory.h" +#include "../util/units.h" + +#define missile_IMPORT +#include "missile.h" + +/** + * Estimated closer point to the target. + */ +typedef struct missile_CloserPoint { + + /** Target. */ + craft *c; + + /** Time to target (s). */ + double time; + + /** Distance to target (m). */ + double min; + + /** Position of the missile (world coordinates, m). */ + VPoint Sg; + + /** Position of explosion relative in the target frame (m). */ + VPoint rpos; + + /** Velocity of the missile in target frame (m/s). */ + VPoint rvel; + + /** Next estimated entry. */ + struct missile_CloserPoint *next; + +} missile_CloserPoint; + +static int mdebug = 0; +static int isMissileHit(double min, craft * c); +static int missile_lookForImpacts(craft *m); +static void missile_trackTarget(craft * c); +static void missile_kill(craft * c, char *reason); + +/** + * Tells if the craft is above (0), in (1), below (2) the clouds. + * Returns 0 when no clouds at all. + */ +static int inCloud(craft * c) +{ + int state; + + if (clouds_top <= clouds_base || c->w.z > clouds_top) { + state = 0; + } + else if (c->w.z > clouds_base) { + state = 1; + } + else { + state = 2; + } + return state; +} + + +static char * +missile_update(craft * c) +{ + double q; + double FDrag, FWeight; + double dNorth, dEast, dmag; + VPoint F, Fg; + +/* + * Check for ground impact. We do this at the beginning to permit us to + * kill ground targets. + */ + + if (c->w.z < terrain_localAltitude(c)) { + q = -c->prevSg.z / (c->Sg.z - c->prevSg.z); + c->Sg.x = c->prevSg.x + q * (c->Sg.x - c->prevSg.x); + c->Sg.y = c->prevSg.y + q * (c->Sg.y - c->prevSg.z); + c->Sg.z = 0.0; + return "hit the ground"; + } + + missile_trackTarget(c); + +/* + * If we haven't armed the missile, yet. Decrement the delay timer. + * If the FL_BALLISTIC flag is set, we have no target; self-destruct + * if the timer expires. + */ + + if (c->armTimer != 0.0) { + if ((c->armTimer -= deltaT) < 0.0) { + if (c->flags & FL_BALLISTIC) { + return "no target -- self destruct"; + } + c->armTimer = 0.0; + } + } + +/* + * Re-orient the body of the missile towards it's intended target. + */ + + c->prevSg = c->Sg; + + air_update(&c->air, units_METERStoFEET(c->w.z)); + +/* + * Compute the resultant force vector on the missile. + */ + + c->VT = VMagnitude(&c->Cg); + q = c->air.rho * c->cinfo->wingS * c->VT * c->VT * 0.5; + FDrag = c->cinfo->CDOrigin * q; + + F.x = c->curThrust - FDrag; + F.y = 0.0; + F.z = 0.0; + +/* + * Now calculate changes in position (Sg) and velocity (Cg). + */ + + if ((c->fuel -= planes_fuelUsed(c)) <= 0.0) { +/* + if (c->curThrust > 0.0) + if (mdebug) + printf("Missile burnout; velocity = %g fps (%g kt)\n", c->VT, + units_FPStoKT(c->VT)); +*/ + c->fuel = 0.0; + c->curThrust = 0.0; + } + +/* + * The missile's trihedral matrix is managed by + * missile_trackTarget(). + */ + + VTransform(&F, &c->AXYZtoNED, &Fg); + FWeight = c->cinfo->emptyWeight + c->fuel + c->payload; + Fg.z += FWeight; + pm_calcGForces(c, &Fg, FWeight); + +/* + if (mdebug) { + printf("v = %g kt, Fg = { %g, %g, %g }\n", units_FPStoKT(c->VT), + Fg.x, Fg.y, Fg.z); + printf("F = { %g, %g, %g }\n", F.x, F.y, F.z); + } +*/ + +/* + * Update the missile's position and velocity. + */ + + dNorth = units_FEETtoMETERS(c->Cg.x * deltaT + Fg.x / FWeight + * units_earth_g * halfDeltaTSquared); + dEast = units_FEETtoMETERS(c->Cg.y * deltaT + Fg.y / FWeight + * units_earth_g * halfDeltaTSquared); + c->w.z -= units_FEETtoMETERS(c->Cg.z * deltaT + Fg.z / FWeight + * units_earth_g * halfDeltaTSquared); + + dmag = sqrt(dNorth * dNorth + dEast * dEast); + + earth_updateLatLon(&c->w, dNorth / dmag, dEast / dmag, dmag); + earth_LatLonAltToXYZ(&c->w, &c->Sg); + earth_generateWorldToLocalMatrix(&c->w, &c->XYZtoNED); + + c->Cg.x += Fg.x / FWeight * units_earth_g * deltaT; + c->Cg.y += Fg.y / FWeight * units_earth_g * deltaT; + c->Cg.z += Fg.z / FWeight * units_earth_g * deltaT; + +/* + if (mdebug) { + printf("Altitude = %g ft\n", units_METERStoFEET(c->w.z)); + printf("Euler angles { %g, %g, %g }\n", units_RADtoDEG(c->curRoll), + units_RADtoDEG(c->curPitch), units_RADtoDEG(c->curHeading)); + printf("Cg = { %g, %g, %g }\n", c->Cg.x, c->Cg.y, c->Cg.z); + printf("Sg = { %g, %g, %g }\n", c->Sg.x, c->Sg.y, c->Sg.z); + } +*/ + + if( missile_lookForImpacts(c) ) + return "target hit"; + + dis_if_updateLocal(c); + + return NULL; +} + + +int +missile_fire(craft * c, int ind) +{ + char * missileName; + craftType * missile; + register craft *m; + register int i; + VPoint s, s1; + VPoint cY, mX, mY, mZ; + double v; + double disLocation[3]; + VPoint velocity; + double disVelocity[3]; + double disZeroVec[3]; + double disOrientation[3]; + + for ((i = 0, m = &mtbl[0]); i < manifest_MAXPROJECTILES; (++i, ++m)) + if (m->type == CT_FREE) { + m->type = CT_MISSILE; + break; + } + + if (i == manifest_MAXPROJECTILES) + return -1; + + missileName = c->cinfo->station[ind].type; + missile = inventory_craftTypeSearchByZoneAndName(NULL, missileName); + if( missile == NULL ) + error_internal("firing unknow missile type `%s'", missileName); + memory_strcpy(m->name, sizeof(m->name), missile->name); + m->cinfo = missile; + m->fuel = missile->maxFuel; + m->payload = 0.0; + m->curThrust = missile->maxThrust; + m->owner = c->pIndex; + +/* + * Build trihedral based on the launching aircraft's current velocity vector + * rather than simply it's current direction vector. + * + * (1) build a unit velocity vector. + * (2) calculate missiles local Z axis from + * plane's-y-axis CROSS missile's-unit-velocity-vector + * (3) calculate missile's Y axis. + */ + + if ((v = VMagnitude(&c->Cg)) < 1.0) { + m->trihedral = c->trihedral; + m->curRoll = c->curRoll; + m->curPitch = c->curPitch; + m->curHeading = c->curHeading; + } + else { + mX = c->Cg; + mX.x /= v; + mX.y /= v; + mX.z /= v; + cY.x = c->trihedral.m[0][1]; + cY.y = c->trihedral.m[1][1]; + cY.z = c->trihedral.m[2][1]; + + VCrossProd(&mX, &cY, &mZ); + VCrossProd(&mZ, &mX, &mY); + + m->trihedral.m[0][0] = mX.x; + m->trihedral.m[1][0] = mX.y; + m->trihedral.m[2][0] = mX.z; + m->trihedral.m[0][1] = mY.x; + m->trihedral.m[1][1] = mY.y; + m->trihedral.m[2][1] = mY.z; + m->trihedral.m[0][2] = mZ.x; + m->trihedral.m[1][2] = mZ.y; + m->trihedral.m[2][2] = mZ.z; + + pm_euler(m); + } + + m->Cg = c->Cg; + VTransform(&(c->cinfo->wStation[ind]), &(c->trihedral), &s1); + VReverseTransform_(&s1, &c->XYZtoNED, &s); + m->Sg.x = c->prevSg.x + units_FEETtoMETERS(s.x); + m->Sg.y = c->prevSg.y + units_FEETtoMETERS(s.y); + m->Sg.z = c->prevSg.z + units_FEETtoMETERS(s.z); + earth_XYZToLatLonAlt(&m->Sg, &m->w); + earth_generateWorldToLocalMatrix(&m->w, &m->XYZtoNED); + m->armTimer = missile->armDelay; + m->flags = FL_HAS_GYRO; + m->createTime = curTime; + +/* + * kludge + */ + + m->curRadarTarget = c->curRadarTarget; + +/* + * ACM missiles are DIS "tracked munitions", so we are + * responsible for sending entity state PDU's for them + */ + + { + VPoint tmp; + + disLocation[0] = m->Sg.x; + disLocation[1] = m->Sg.y; + disLocation[2] = m->Sg.z; + tmp.x = units_FEETtoMETERS(m->Cg.x); + tmp.y = units_FEETtoMETERS(m->Cg.y); + tmp.z = units_FEETtoMETERS(m->Cg.z); + VReverseTransform_(&tmp, &m->XYZtoNED, &velocity); + disVelocity[0] = velocity.x; + disVelocity[1] = velocity.y; + disVelocity[2] = velocity.z; + disZeroVec[0] = 0.0; + disZeroVec[1] = 0.0; + disZeroVec[2] = 0.0; + disOrientation[0] = m->curHeading; + disOrientation[1] = m->curPitch; + disOrientation[2] = m->curRoll; + dis_if_entityEnter(c->force, m, + &missile->entityType, + &missile->altEntityType, + disLocation, disVelocity, + disZeroVec, disOrientation, + disZeroVec, &m->disId); + } + m->update = missile_update; + m->kill = missile_kill; + return 0; +} + +/** + * Kill missile|cannon with possible target hit. + * @param c Missile|cannon. + * @param target Hit target, or NULL. + * @param rpos Location of the explosion in the target frame (m). + */ +static void +missile_targetHit(craft * missile, craft * target, VPoint * rpos) +{ + VPoint worldVel; + worldVel.x = units_FEETtoMETERS(missile->Cg.x); + worldVel.y = units_FEETtoMETERS(missile->Cg.y); + worldVel.z = units_FEETtoMETERS(missile->Cg.z); + VReverseTransform_(&worldVel, &missile->XYZtoNED, &worldVel); + + dis_if_detonation(&missile->cinfo->entityType, + ptbl[missile->owner].disId, + target->disId, + missile->disId, + (double *) &missile->Sg, + (double *) rpos, + (double *) &worldVel); +} + + +static void missile_kill(craft * missile, char *reason) +{ + /* Set a generic explosion effect: */ + effects_new_explosion(&missile->Sg, &(VPoint){0.0, 0.0, 0.0}, 50.0, 15.0, 1.0); + + dis_if_entityExit(missile->disId); + + missile->type = CT_FREE; + pm_hud_strings_free(missile); +} + + +/** + * Returns true if the missile hit something. + * @param m + * @return True if the missile hit something. + */ +static int +missile_lookForImpacts(craft *m) +{ + + craft *c; + missile_CloserPoint p[manifest_MAXPLAYERS], *list, *q, *r, *rprev; + VPoint mv, v, s0; + double t, d, explosion_diameter_meters; + int j; + + if (m->type != CT_MISSILE || m->armTimer > 0.0) + return 0; + + // Missile vel. in world coords. (ft/s): + VReverseTransform_(&m->Cg, &m->XYZtoNED, &mv); + + list = (missile_CloserPoint *) NULL; + for (c = ptbl, j = 0; j < manifest_MAXPLAYERS; ++j, ++c) { + + if (c->type == CT_FREE) + continue; + +/* + * Reduce the relative motion of "c" to a the parametric system + * of equations: + * + * x(t) = vx * t + s0x + * y(t) = vy * t + s0y + * z(t) = vz * t + s0z + * + * where x,y,z is the position of "c" relative to "m" in world coord. (m). + * + * We can then compute the time of perigee (closest pass) along with + * the associated minimum distance. + */ + VPoint cv; + VReverseTransform_(&c->Cg, &c->XYZtoNED, &cv); + v.x = units_FEETtoMETERS(cv.x - mv.x); + v.y = units_FEETtoMETERS(cv.y - mv.y); + v.z = units_FEETtoMETERS(cv.z - mv.z); + s0.x = c->Sg.x - m->Sg.x; + s0.y = c->Sg.y - m->Sg.y; + s0.z = c->Sg.z - m->Sg.z; + +/* + * Compute time of minimum distance between the two objects. + */ + + t = -(v.x * s0.x + v.y * s0.y + v.z * s0.z) / + (v.x * v.x + v.y * v.y + v.z * v.z); + + if (mdebug) + printf("perigee in %g seconds with player %d\n", t, j); + +/* + * If the closest pass occurs within a given time interval, check for a hit. + * + * We'll build a linked list of all craft that this projectile may strike + * during this period, arranged in ascending order by time of "perigee" + * (closest pass). We'll then test for strikes. If a projectile misses + * the first object, then it may have struck subsequent objects in the + * list ... + */ + +/* + * One special case occurs when a target or missile's turn suddenly + * changes the perigee time from positive to negative. If the missile + * is within hitting range at t=0 and the time of perigee is negative, + * then zap 'em. + */ + + if (t < 0.0) { + d = sqrt(s0.x * s0.x + s0.y * s0.y + + s0.z * s0.z); + if (isMissileHit(d, c)) { + t = 0.0; + } + } + + if (t >= 0.0 && t <= 0.05) { + q = &p[j]; + + // Position of the explosion (world coords., m): + q->Sg = m->Sg; + q->Sg.x += units_FEETtoMETERS(mv.x) * t; + q->Sg.y += units_FEETtoMETERS(mv.y) * t; + q->Sg.z += units_FEETtoMETERS(mv.z) * t; + + // Position of the explosion (target local frame, m): + q->rpos.x = -v.x * t - s0.x; + q->rpos.y = -v.y * t - s0.y; + q->rpos.z = -v.z * t - s0.z; + VTransform_(&q->rpos, &c->XYZtoNED, &q->rpos); + VReverseTransform_(&q->rpos, &c->AXYZtoNED, &q->rpos); + + // Vel. of the missile (target local frame, m/s): + VSetPoint(&q->rvel, -v.x, -v.y, -v.z); + + if (list == (missile_CloserPoint *) NULL) { + q->next = list; + list = q; + } + else if (list->time > t) { + q->next = list; + list = q; + } + else { + for (rprev = list, r = list->next; r != (missile_CloserPoint *) NULL;) { + if (r->time > t) + break; + rprev = r; + r = r->next; + } + rprev->next = q; + q->next = r; + } + q->time = t; + q->c = c; + q->min = VMagnitude(&q->rpos); + } + } + +/* + * Now look for missile hits in the list of perigees. + */ + + for (r = list; r != (missile_CloserPoint *) NULL; r = r->next){ + if (isMissileHit(r->min, r->c)) { + m->Sg = r->Sg; /* Set detonation point for missile_kill() */ + missile_targetHit(m, r->c, &r->rpos); + /* can only damage local player */ + if (r->c->type != CT_DIS_PLANE){ + if (damage_absorbDISDamage(r->c, + &m->cinfo->entityType, 0, 0, + r->min, + VMagnitude(&r->rvel), + &explosion_diameter_meters) == 0) { + r->c->kill(r->c, "air-to-air missile"); + } + if( explosion_diameter_meters > 0 ) + /* Something on the target has been damaged (this is NOT + * the explosion of the missile): */ + effects_new_explosion(&(r->Sg), &r->rvel, + explosion_diameter_meters, 10.0, 3.0); + } + return 1; + } + } + return 0; +} + +/*ARGSUSED */ +static int +isMissileHit(double min, craft * c) +{ + + return (min < 15.0) ? 1 : 0; +} + +#define IRMaxRange units_FEETtoMETERS(15.0 * units_NmToFeetFactor) + +static int +isIRVisible(craft * m, craft * c, VPoint * t, double IRScanSlope) +{ + + VPoint relPos, tmp; + int cstate, mstate; + + if (c->type == CT_FREE) + return 0; + +/* + * If the seeker is in clouds, or the target is not at the same level + * (e.g seeker is above clouds, but target is below), then the target is + * not IR visible. + */ + + if ((mstate = inCloud(m)) == 1) { + return 0; + } + + if ((cstate = inCloud(c)) != mstate) { + return 0; + } + + VTransform(&c->prevSg, &m->XYZtoNED, &tmp); + VReverseTransform_(&tmp, &m->trihedral, t); + + if (sqrt(t->x * t->x + t->y * t->y + t->z * t->z) > IRMaxRange) + return 0; + + if (t->x <= 0.0) + return 0; + + relPos.z = t->z / (t->x * IRScanSlope); + relPos.y = t->y / (t->x * IRScanSlope); + + return (sqrt(relPos.z * relPos.z + relPos.y * relPos.y) > 1.0) ? 0 : 1; +} + +int +missile_getIRTarget(craft * c, VPoint * t, double scanSlope) +{ + + int i, n; + craft *p; + VPoint tNew, tMin; + double m1, min; + + if (c->curRadarTarget != -1 + && c->type != CT_FREE + && isIRVisible(c, &ptbl[c->curRadarTarget], t, scanSlope)) + return c->curRadarTarget; + +/* + * Look for a target. Designate the closest one as a new target. + */ + + min = 1000000.0; + n = -1; + for (i = 0, p = ptbl; i < manifest_MAXPLAYERS; ++i, ++p) { + if (p == c) + continue; + if (p->type != CT_FREE) + if (isIRVisible(c, p, &tNew, scanSlope)) { + m1 = VMagnitude(&tNew); + if (m1 < min) { + n = i; + min = m1; + tMin = tNew; + } + } + } + + *t = tMin; + return n; +} + +/* + * Track target using proportional navigation guidance (N = 4). + */ + +#define AIM9SLOPE 0.57735 + +static void +missile_trackTarget(craft * c) +{ + + VMatrix mtx, mtx1; + VPoint t, t1, v, vrel, zeroVec = {0,0,0}; + double h, maxTurn, omegap, omegay; + double hs; + double deltaRoll, deltaPitch, deltaYaw; + craft *target; + +/* + * Now let's get to target tracking; the missile won't start tracking until + * 0.60 seconds has elapsed. Then, if we don't already have a target + * designated, get one. + */ + + if (curTime - c->createTime < 0.60) { + deltaPitch = 0.0; + deltaYaw = 0.0; + goto change; + } + else if ((c->curRadarTarget = missile_getIRTarget(c, &t, AIM9SLOPE)) == -1) { + +/* + * Not target; missile goes ballistic + */ + + deltaPitch = 0.0; + deltaYaw = 0.0; + goto change; + +#ifdef manifest_FLIGHTDEBUG + if (mdebug) + printf("Missile elects to self-destruct\n"); +#endif + effects_new_explosion(&(c->Sg), &zeroVec, 5.0, 10.0, 3.0); + missile_kill(c, "lost IR target"); + return; + } + +/* + * We'll steer towards the target at a rate proportional to the + * rate of change of the target's position in the missile's XZ (pitch) + * and XY (yaw) planes. + */ + + target = &ptbl[c->curRadarTarget]; + + v.x = target->Cg.x - c->Cg.x; + v.y = target->Cg.y - c->Cg.y; + v.z = target->Cg.z - c->Cg.z; + + t.x = units_METERStoFEET(t.x); + t.y = units_METERStoFEET(t.y); + t.z = units_METERStoFEET(t.z); + + VReverseTransform_( &v, &c->trihedral, &vrel ); + + hs = t.x * t.x + t.y * t.y; + + omegay = (vrel.y * t.x - vrel.x * t.y) / hs; + + omegap = (vrel.z * hs - t.z * (vrel.x * t.x + vrel.y * t.y)) / + (sqrt(hs) * (hs + t.z * t.z)); + + deltaPitch = omegap * 4.0 * deltaT; + deltaYaw = omegay * 4.0 * deltaT; + + h = sqrt( deltaPitch * deltaPitch + deltaYaw * deltaYaw ); + +/* + * We'll constrain missile turns to about 20 degree/second unless it's velocity + * would make that greater than a 25g load factor. + */ + + if ( c->VT > 0.0 ) { + maxTurn = (units_earth_g / c->VT) * sqrt( 25.0 * 25.0 - 1.0 ); + } + else { + maxTurn = 0.0; + } + + if (maxTurn > units_DEGtoRAD(20.0)) { + maxTurn = units_DEGtoRAD(20.0); + } + maxTurn *= deltaT; + +#ifdef manifest_FLIGHTDEBUG + if (mdebug) + printf("\nturn rate = %g; maxTurn = %g\n", h, maxTurn); +#endif + + if (h > maxTurn) { + deltaPitch *= maxTurn / h; + deltaYaw *= maxTurn / h; + } + +/* + * Re-orient the missile and velocity vector. + */ + + change: + + deltaRoll = 0.0; + +#ifdef manifest_FLIGHTDEBUG + if (mdebug) { + printf("Missile changes: pitch/yaw: %g %g (deg).\n", + units_RADtoDEG(deltaPitch), units_RADtoDEG(deltaYaw)); + printf("position [%g, %g, %g]\n", t.x, t.y, t.z); + printf("target pitch/yaw rates: %g, %g (deg/sec)\n", + units_RADtoDEG(omegap), units_RADtoDEG(omegay)); + } +#endif + + VEulerToMatrix(deltaRoll, -deltaPitch, deltaYaw, &mtx); + + VReverseTransform_(&c->Cg, &c->trihedral, &t); + VTransform(&t, &mtx, &t1); + VTransform(&t1, &c->trihedral, &c->Cg); + + VMatrixMultByRank(&mtx, &c->trihedral, &mtx1, 3); + c->trihedral = mtx1; + pm_euler(c); + +} \ No newline at end of file diff -Nru acm-5.0/src/acm/missile.h acm-6.0+20200416/src/acm/missile.h --- acm-5.0/src/acm/missile.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/missile.h 2017-05-08 14:21:41.000000000 +0000 @@ -0,0 +1,46 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1998 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +/** + * Common routines for any specific type of missile. + * @file + */ + +#ifndef _missile_h +#define _missile_h + +#include "pm.h" + +#ifdef missile_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +/** + * Fires a missile. + * @param c Shooting craft. + * @param ind Station index of the missile. + * @return 0=missile fired. -1=projectiles table full, sorry! + */ +EXTERN int missile_fire(craft * c, int ind); + +EXTERN int missile_getIRTarget(craft * c, VPoint * t, double scanSlope); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/mouse.c acm-6.0+20200416/src/acm/mouse.c --- acm-5.0/src/acm/mouse.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/mouse.c 2017-08-01 15:39:38.000000000 +0000 @@ -0,0 +1,131 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991,1992 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#include +#include "pm.h" +#include "events.h" +#include "joystick.h" + +#define mouse_IMPORT +#include "mouse.h" + + +void +mouse_getPosition(craft * c, viewer * u) +{ + + _BOOL gotValues; + int x, y; + double pitchComm, rollComm, steerComm; + + gotValues = FALSE; + +/* + * Sample joystick, if present + */ + +/* + if (joystick_processInput() >= 0) { + double dummy, throttle; + int sw; + + XSync(u->dpy, False); + joystick_getPosition(&rollComm, &pitchComm, &dummy, &throttle, &sw); + steerComm = rollComm; + events_joystick(c, u, throttle, sw); + gotValues = TRUE; + } +*/ + +/* + * No joystick, sample mouse + */ + + //else + { + int width, height; + + gui_getPointerPosition(u->gui, &x, &y); + + width = gui_getWidth(u->gui); + height = gui_getHeight(u->gui); + + if (x >= 0 && y >= 0 && x < width && y < height) { + int r; + + /* + x/y mouse movements should give a response in pitch/roll + command independent from the format of the window: + */ + + if( width < height ) + r = width / 2; + else + r = height / 2; + + x = x - (width / 2); + y = y - (height / 2); + + rollComm = - (double) x / (double) r; + if( rollComm < -1.0 ) + rollComm = -1.0; + else if( rollComm > 1.0 ) + rollComm = 1.0; + + steerComm = rollComm; + + pitchComm = - (double) y / (double) r; + if( pitchComm < -1.0 ) + pitchComm = -1.0; + else if( pitchComm > 1.0 ) + pitchComm = 1.0; + + if( mouse_stick_mode == mouse_NORMAL ){ + + /* quadratic response */ + if (rollComm < 0.0) + rollComm = -rollComm * rollComm; + else + rollComm = rollComm * rollComm; + + if (pitchComm < 0.0) + pitchComm = -pitchComm * pitchComm; + else + pitchComm = pitchComm * pitchComm; + + } else if( mouse_stick_mode == mouse_PRECISE ){ + + /* cubic response */ + rollComm = rollComm * rollComm * rollComm; + pitchComm = pitchComm * pitchComm * pitchComm; + + } else { + /* linear response */ + } + + gotValues = TRUE; + + } + } + + if ( gotValues && u->hasFocus && u->hasComm && c->type != CT_DRONE ) { + c->pitchComm = pitchComm; + c->rollComm = rollComm; + c->steerComm = steerComm; + } +} diff -Nru acm-5.0/src/acm/mouse.h acm-6.0+20200416/src/acm/mouse.h --- acm-5.0/src/acm/mouse.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/mouse.h 2017-03-20 06:04:00.000000000 +0000 @@ -0,0 +1,55 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1998 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#ifndef _mouse_h +#define _mouse_h + +#include "pm.h" + +#ifdef mouse_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +/** + * Mouse-to-command response law. The current position of the mouse pointer in + * the window is mapped to the range [-1,1] in horizontal and vertical to set + * ailerons and elevator rotation, respectively. The mapping ranges from linear + * (very fast response to user input, low precision) to cubic (very slow response, + * high precision). Ailerons and elevator are in thei neutral position when the + * mouse pointer is exactly in the middle of the window. + */ +enum { + /** Linear. */ + mouse_FAST, + /** Quadratic. */ + mouse_NORMAL, + /** Cubic. */ + mouse_PRECISE +} mouse_stick_mode; + +/** + * Get stick input from mouse and set c->pitchComm, c->rollComm, and c->steerComm + * as values in the range [-1.0 ... +1.0]. If detached, keeps the current + * values. + */ +void mouse_getPosition(craft * c, viewer * u); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/navaid.c acm-6.0+20200416/src/acm/navaid.c --- acm-5.0/src/acm/navaid.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/navaid.c 2017-10-22 14:45:27.000000000 +0000 @@ -0,0 +1,371 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991,1992,1997 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#include +#include +#include + +#include "../util/error.h" +#include "../util/memory.h" +#include "../util/units.h" +#include "../wmm/wmm.h" +#include "pm.h" + +#define navaid_IMPORT +#include "navaid.h" + + +/** Double-linked list of known registered NAVAIDs. */ +static navaid_Type *navaids; + +/** Linked list of recycled NAVAIDs. */ +static navaid_Type *pool; + + +static void navaid_cleanup(void) +{ + navaid_Type *n = navaids, *p; + while (n) { + p = n; + n = n->next; + memory_dispose(p); + } + navaids = NULL; + + n = pool; + while (n) { + p = n; + n = n->next; + memory_dispose(p); + } + pool = NULL; +} + + +static navaid_Type * navaid_new() +{ + navaid_Type *n; + if( pool != NULL ){ + n = pool; + pool = pool->next; + } else { + n = memory_allocate(sizeof(navaid_Type), NULL); + } + n->prev = NULL; + n->next = navaids; + if( navaids != NULL ) + navaids->prev = n; + navaids = n; + return n; +} + + +/** + * Removes navaid from active list an put into the pool. + */ +static void navaid_release(navaid_Type *n) +{ + if( n->prev == NULL ) + navaids = n->next; + else + n->prev->next = n->next; + + if( n->next != NULL ) + n->next->prev = n->prev; + + n->next = pool; + pool = n; +} + + +navaid_Type * navaid_reception_check(craft * c, navaid_Channel f) +{ + navaid_Type *n; + VPoint p; + double range, dist, d; + + // nearest VOR station found: + navaid_Type *last_found = NULL; + double last_dist = 0.0; + + for (n = navaids; n; n = n->next) { + if (f == n->frequency) { + if (n->type & navaid_LOC) { + VTransform(&c->Sg, &n->lt, &p); + if ( + p.x > 0.0 && fabs(p.y / p.x) < 1.192 /* = 50 DEG */ + && VMagnitude(&p) < 33e3 /* LOC, typical max range 18 NM */ + ) { + // LOC in range found: return immediately + return n; + } + } + else if (n->type & (navaid_VOR|navaid_DME)){ + if ( n->frequency < 80 /* 112.00 MHz */ ) { + /* terminal VOR, range 40 NM */ + range = units_NMtoMETERS(40); + } + else { + /* en-route VOR, range 200 NM */ + range = units_NMtoMETERS(200); + } + + /* + Compute aircraft position relative to the station + in its magnetic north/east/down frame: + */ + VTransform(&c->Sg, &n->lt, &p); + + /* + Ignore station if it can't be received: + */ + if( p.z > 0.0 ){ + /* + Aircraft below horizon of the radio station. + Reduce radio range due to the Earth curvature. + + The value of the constant K below was derived from + a pure geometric calculation based on an Earth mean + radius of 6367 Km, giving a maximum reception range of + + d=K*(sqrt(transmitter_alt)+sqrt(aircraft_alt)) + + Other sources suggest a greater value K=4126 with + all the distances in meters, but I adopted a more + conservative approach. + */ + #define K 3568.0 + d = K*( sqrt(fabs(n->loc.z)) + sqrt(fabs(c->w.z)) ); /* m */ + if( d < range ) + range = d; + } + dist = VMagnitude(&p); + if( dist > range ) /* too far from station */{ + continue; + printf("%s: too far\n", n->id); + } + + if ( last_found == NULL || last_dist > dist ) { + // VOR found: continue looping searching + // for possible nearest stations with same freq. + last_found = n; + last_dist = dist; + } + } + else if(n->type & navaid_NDB){ + if (n->type & (navaid_OMARKER|navaid_MMARKER|navaid_IMARKER)) { + range = units_NMtoMETERS(20); + } + else { + range = units_NMtoMETERS(100); + } + VTransform(&c->Sg, &n->lt, &p); + dist = VMagnitude(&p); + if ( dist < range + && (last_found == NULL || last_dist > dist) ) { + // NDB in range found: continue looping searching + // for possible nearest stations + last_found = n; + last_dist = dist; + } + } + else { + error_internal("unexpected navaid type %d", n->type); + } + } + } + + if( last_found == NULL ){ + // no stations found in range + return NULL; + } + else { + // nearest in range station found + return last_found; + } +} + +void navaid_add_vor_dme_ndb(zone_Type *zone, char *ident, char *type, earth_LatLonAlt * w, double freq) +{ + // Automatic module initialization: + if( navaids == NULL && pool == NULL ) + memory_registerCleanup(navaid_cleanup); + + navaid_Type *n = navaid_new(); + + n->zone = zone; + memory_strcpy(n->id, sizeof(n->id), ident); + + n->loc = *w; + + if (strcmp(type, "VORTAC") == 0) { + n->type = navaid_VOR | navaid_DME; + } + else if (strcmp(type, "TACAN") == 0) { + n->type = navaid_VOR | navaid_DME; + } + else if (strcmp(type, "VOR/DME") == 0) { + n->type = navaid_VOR | navaid_DME; + } + else if (strcmp(type, "VOR") == 0) { + n->type = navaid_VOR; + } + else if (strcmp(type, "DME") == 0) { + n->type = navaid_DME; + } + else if (strcmp(type, "NDB") == 0) { + n->type = navaid_NDB; + } + else if (strcmp(type, "OMARKER") == 0) { + n->type = navaid_NDB | navaid_OMARKER; + } + else if (strcmp(type, "OMARKER/COMLO") == 0) { + n->type = navaid_NDB | navaid_OMARKER; + } + else if (strcmp(type, "MMARKER") == 0) { + n->type = navaid_NDB | navaid_MMARKER; + } + else if (strcmp(type, "IMARKER") == 0) { + n->type = navaid_NDB | navaid_IMARKER; + } + else if (strcmp(type, "NDB") == 0) { + n->type = navaid_NDB; + } + else { + fprintf(stderr, "%s: %s: unexpected NAV of the type `%s'. Ignore.\n", + zone_getPath(zone), ident, type); + navaid_release(n); + return; + } + + earth_generateWorldToLocalMatrix(w, &n->lt); + if( n->type & navaid_VOR ){ + wmm_MagneticField mf; + wmm_getMagneticField(0.0, w->latitude, w->longitude, w->z, &mf); + n->bearing = - mf.Decl; + VRotate(&n->lt, ZRotation, n->bearing); + } else { + n->bearing = 0; + } + + earth_LatLonAltToXYZ(w, &n->Sg); + + if (n->type & (navaid_VOR | navaid_DME)) { + n->frequency = navaid_VOR_CHANNEL_MIN + (int) ((freq - 108.00) * 20.0 + 0.5); + if( n->frequency < navaid_VOR_CHANNEL_MIN + || n->frequency > navaid_VOR_CHANNEL_MAX ){ + fprintf(stderr, "%s: %s VOR/DME: frequency %g out of range. Ignore.\n", + zone_getPath(zone), ident, freq); + navaid_release(n); + return; + } + } + else { + n->frequency = (int) freq; + if( n->frequency < navaid_NDB_CHANNEL_MIN + || n->frequency > navaid_NDB_CHANNEL_MAX ){ + fprintf(stderr, "%s: %s: frequency out of range %g for NDB station. Ignore.\n", + zone_getPath(zone), ident, freq); + navaid_release(n); + return; + } + } +} + +void navaid_add_ils(zone_Type *zone, char *ident, char *type, earth_LatLonAlt * w, + earth_LatLonAlt * gsw, double freq, double loc_width, + double loc_bearing, double gs_angle) +{ + // Automatic module initialization: + if( navaids == NULL && pool == NULL ) + memory_registerCleanup(navaid_cleanup); + + navaid_Type *n = navaid_new(); + n->zone = zone; + memory_strcpy(n->id, sizeof(n->id), ident); + n->bearing = units_DEGtoRAD(loc_bearing); + n->loc = *w; + earth_generateWorldToLocalMatrix(w, &n->lt); + VRotate(&n->lt, ZRotation, -n->bearing - M_PI); + earth_LatLonAltToXYZ(w, &n->Sg); + + n->gs_loc = *gsw; + earth_generateWorldToLocalMatrix(gsw, &n->gst); + VRotate(&n->gst, ZRotation, -n->bearing - M_PI); + + n->slope = units_DEGtoRAD(gs_angle); + n->beam_width = units_DEGtoRAD(loc_width); + + if (strcmp(type, "ILS") == 0 + || strcmp(type, "LOC/GS") == 0 ) { + n->type = navaid_LOC | navaid_GS; + } + else if (strcmp(type, "ILS/DME") == 0) { + n->type = navaid_LOC | navaid_GS | navaid_DME; + } + else if (strcmp(type, "LOCALIZER") == 0 + || strcmp(type, "LDA") == 0 + || strcmp(type, "SDF") == 0 ) { + n->type = navaid_LOC; + } + else if (strcmp(type, "LOC/DME") == 0 + || strcmp(type, "LDA/DME") == 0 + || strcmp(type, "SDF/DME") == 0 ) { + n->type = navaid_LOC | navaid_DME; + } + else { + fprintf(stderr, "%s: %s: unknown ILS type `%s'. Ignore.\n", + zone_getPath(zone), ident, type); + navaid_release(n); + return; + } + + if( (n->type & navaid_GS) && !(1 <= gs_angle && gs_angle <= 5) ){ + fprintf(stderr, "%s: %s: invalid slope angle: %g DEG. Ignore.\n", + zone_getPath(zone), ident, gs_angle); + navaid_release(n); + return; + } + + n->frequency = navaid_VOR_CHANNEL_MIN + (int) ((freq - 108.00) * 20.0 + 0.5); + if( n->frequency < navaid_VOR_CHANNEL_MIN + || n->frequency > navaid_VOR_CHANNEL_MAX ){ + fprintf(stderr, "%s: %s ILS: frequency %g out of the range. Ignore.\n", + zone_getPath(zone), ident, freq); + navaid_release(n); + return; + } + + if( navaids == NULL ) + memory_registerCleanup(navaid_cleanup); +} + + +void navaid_purgeZone(zone_Type *zone) +{ + navaid_Type *n = navaids; + while( n != NULL ){ + if( n->zone == zone ){ + navaid_Type *q = n; + n = n->next; + navaid_release(q); + } else { + n = n->next; + } + } +} diff -Nru acm-5.0/src/acm/navaid.h acm-6.0+20200416/src/acm/navaid.h --- acm-5.0/src/acm/navaid.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/navaid.h 2017-10-20 00:48:11.000000000 +0000 @@ -0,0 +1,158 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991,1992 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#ifndef _navaid_h +#define _navaid_h + +#include "pm.h" + +#ifdef navaid_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +/** + * Every navaid_Type station has a frequency encoded as int number + * whose value is here indicated as "channel". + * + * Channels in the range 0-199 encode frequency between 108.00 MHz + * and 117.95 MHz (VOR, DME and ILS stations). + * + * Channels in the range 200-529 encode frequency between 200 KHz + * and 529 KHz (NDB stations). + */ + +#define navaid_VOR_CHANNEL_MIN 0 +#define navaid_VOR_CHANNEL_MAX 199 +#define navaid_NDB_CHANNEL_MIN 200 +#define navaid_NDB_CHANNEL_MAX 529 + + +/** + * Type of radio station. The following combination of flags are allowed: + * + * navaid_LOC (possibly + navaid_LOC + navaid_GS) + * navaid_DME + * navaid_VOR (possibly + navaid_DME) + * navaid_NDB (possibly + navaid_OMARKER|navaid_MMARKER|navaid_IMARKER) + */ +#define navaid_LOC 0x0001 +#define navaid_VOR 0x0002 +#define navaid_DME 0x0004 +#define navaid_GS 0x0008 +#define navaid_NDB 0x0010 +#define navaid_OMARKER 0x0020 +#define navaid_MMARKER 0x0040 +#define navaid_IMARKER 0x0080 + +typedef int navaid_Channel; + +typedef struct navaid_Type { + + /** Linked list of registered NAVAIDs. */ + struct navaid_Type *prev, *next; + + /** The zone (that is, the scenery) from which this NAVAID was read. */ + zone_Type *zone; + + /** Type of radio station. */ + unsigned short type; + + /** Identifier (e.g. "IHNL"). */ + char id[5]; + + /** Channel number. */ + navaid_Channel frequency; + + /** Location of the station. */ + earth_LatLonAlt loc; + + /** Geocentric location of the station. */ + VPoint Sg; + + /** + * VOR station: magnetic bearing, that is local magnetic deviation, + * positive east. Localizer station: geographic bearing, normally aligned + * with its runway. Zero for any other type of station. + */ + double bearing; + + /** Beam width for localizers (rad). */ + double beam_width; + + /** Location of the glide-slope. */ + earth_LatLonAlt gs_loc; + + /** Angle of glide slope (rad). */ + double slope; + + /** + * Transform geocentric to local coordinates with the x axis facing the + * bearing direction. + */ + VMatrix lt; + + /** + * Transform geocentric to glide slope local coordinates. + */ + VMatrix gst; + +} navaid_Type; + +/** + * Adds ILS to the internal list of known NAVAIDs. + * @param zone Zone this ILS belongs to. + * @param ident Station identifier; gets trunked to max 4 chars. + * @param type Station type. + * @param w Station location. + * @param gsw Glide slope location. + * @param freq Station frequency. + * @param loc_width Localizer beam width (DEG). + * @param loc_bearing Localizer geographic bearing (DEG). + * @param gs_angle Glide slope angle (DEG). + */ +EXTERN void navaid_add_ils(zone_Type *zone, char *ident, char *type, earth_LatLonAlt * w, + earth_LatLonAlt * gsw, double freq, double loc_width, + double loc_bearing, double gs_angle); + +/** + * Adds VOR or NDB to the internal list of known NAVAIDs. On error, a message is + * sent to stderr and the function returns non-zero. + * @param zone Zone this NAVAID belongs to. + * @param ident Station identifier; gets trunked to max 4 chars. + * @param type Station type. + * @param w Station location. + * @param freq Station frequency. + */ +EXTERN void navaid_add_vor_dme_ndb(zone_Type *zone, char *ident, char *type, earth_LatLonAlt * w, + double freq); + +/** + * Search for a NAVAID receivable at the frequency specified. + * Return the station found, or NULL if no station can be received. + */ +EXTERN navaid_Type * navaid_reception_check(craft * c, navaid_Channel f); + +/** + * Releases all the NAVAIDs related to the specified zone. + */ +EXTERN void navaid_purgeZone(zone_Type *zone); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/panel.c acm-6.0+20200416/src/acm/panel.c --- acm-5.0/src/acm/panel.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/panel.c 2017-10-20 00:50:08.000000000 +0000 @@ -0,0 +1,862 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 2008 Umberto Salsi + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#include +#include + +#include "../util/error.h" +#include "../util/memory.h" +#include "../util/units.h" +#include "adf.h" +#include "aps.h" +#include "hsi.h" +#include "pm.h" +#include "damage.h" +#include "draw.h" +#include "planes.h" +#include "radar.h" +#include "terrain.h" +#include "vpath.h" +#include "gear.h" + +#define panel_IMPORT +#include "panel.h" + +#define GEARDOWN (M_PI / 2.0) + +#define FLAP_ANGLE_SCALE 2.0 +/* + The angular deflection of the flaps is amplified for readability: + + (actual drawing angle) = FLAP_ANGLE_SCALE * (actual flaps deflection) +*/ + +#define MAX_BANK_ANGLE_SCALE 9.0 +#define MAX_BANK_ANGLE_OFFSET units_DEGtoRAD(-225) +/* + The max angle of bank scale ranges from 5 to 25 DEG with stepd of 5 + DEG. For readability, the scale is expanded and rotated so that 5 DEG + appears to the left, and 25 DEG to the right. These are the coefficients + of the linear transformation: + + (actual drawing angle) = MAX_BANK_ANGLE_OFFSET + + MAX_BANK_ANGLE_SCALE * (current max bank angle) +*/ + + +#define LIGHTS_N 14 +/* max no. of lights allowed in the lights panel */ + + +static struct { + long mask; + char *name; + int blink; /* does this lights blink when on? */ +} *pptr, panelVec[] = { + + /* Sub-system failure indicators: */ + { SYS_ENGINE1, "OIL", TRUE }, + { SYS_HYD1, "HYD1", TRUE }, + { SYS_HYD2, "HYD2", TRUE }, + { SYS_GEN1, "GEN1", TRUE }, + { SYS_GEN2, "GEN2", TRUE }, + { SYS_FLAPS, "FLAP", TRUE }, + { SYS_SPEEDBRAKE, "SPBRK", TRUE }, + { SYS_RADAR, "RADAR", TRUE }, + { SYS_TEWS, "TEWS", TRUE }, + { SYS_HUD, "HUD", TRUE }, + + /* Status and warning indicators: */ + { FLAG_MAX_G_LOAD, "G-LOAD", TRUE }, + { FLAG_LOWFUEL, "FUEL", FALSE }, + { FLAG_SPEEDBRAKE, "SPD BRK", FALSE }, + { FLAG_WHEELBRAKE, "BRAKES", FALSE }, + { 0, (char *) 0 } +}; + + +static vpath_Type *panel_fixed = NULL; +static vpath_Type *panel_flap = NULL; +static vpath_Type *panel_bank_pointer = NULL; +static vpath_Type *panel_handle_up = NULL; + + +static vpath_Type * radar_altimeter_scale = NULL; +/* + The radar-altimeter scale is 1.0 wide. The zero altitude is the line + between (0,0) and (1,0); the 100 ft mark is a line between (0,1) and + (1,1); the 200 ft mark is at (0,2)-(1,2) and so on. Above 500 ft the + step becomes 200 ft. So in general the altitude h (ft) is located at + + y = -h/100 if h <= 500 ft + y = -5 - (h-500)/200 if h > 500 ft +*/ + + +static void panel_cleanup() +{ + memory_dispose(panel_fixed); + memory_dispose(panel_flap); + memory_dispose(panel_bank_pointer); + memory_dispose(panel_handle_up); + memory_dispose(radar_altimeter_scale); +} + + +/** + * Prepare all the VPath needed for the panel, either fixed drawings + * (labels, scales, etc.) and the moving parts (flaps, pointers, etc.). + * This virtual drawings take place in a square box 1.0x1.0 with origin in + * its top-left corner, so that, once properly scaled and translated to + * their actual position in screen, they can be drawn. + */ +static void panel_create_vpaths() +{ + vpath_Type *p; + double x, y, co, si, r, r1, r2, r3, r4, w, h; + int a; + VMatrix m; + char s[10]; + + if( panel_fixed != NULL ) + return; + + memory_registerCleanup(panel_cleanup); + + /* + Fixed drawings: + */ + + p = vpath_new(); + + /* Wing profile without flap: */ + + VIdentMatrix(&m); + VScaleMatrix(&m, 0.030, 0.030, 1.0); + VTranslate(&m, 0.05, 0.05, 0.0); + vpath_draw_string(p, "FLAPS", 5, &m); + vpath_moveTo(p, &(VPoint){0.05, 0.15, 0.0}); + vpath_lineTo(p, &(VPoint){0.07, 0.13, 0.0}); + vpath_lineTo(p, &(VPoint){0.13, 0.12, 0.0}); + vpath_lineTo(p, &(VPoint){0.23, 0.13, 0.0}); + vpath_lineTo(p, &(VPoint){0.22, 0.15, 0.0}); + vpath_lineTo(p, &(VPoint){0.23, 0.17, 0.0}); + vpath_lineTo(p, &(VPoint){0.08, 0.17, 0.0}); + vpath_lineTo(p, &(VPoint){0.065, 0.165, 0.0}); + vpath_lineTo(p, &(VPoint){0.05, 0.15, 0.0}); + + /* Flaps deflection scale, with angle amplified by 2 for readability: */ + x = 0.25; + y = 0.15; + r1 = 0.17; /* notchs internal radius */ + r2 = 0.19; /* short notchs external radius */ + r3 = 0.21; /* long notchs external radius */ + r4 = 0.25; /* label's center radius */ + for( a = 0; a <= 40; a += 5 ){ + co = cos( FLAP_ANGLE_SCALE * units_DEGtoRAD(a) ); + si = sin( FLAP_ANGLE_SCALE * units_DEGtoRAD(a) ); + if( a % 10 == 0 ) + r = r3; + else + r = r2; + vpath_moveTo(p, &(VPoint){x + r1*co, y + r1*si, 0.0}); + vpath_lineTo(p, &(VPoint){x + r*co, y + r*si, 0.0}); + + /* Draw label: */ + if( a % 10 == 0 ){ + sprintf(s, "%d", a); + w = 0.025; /* font width */ + h = 0.030; /* font height */ + VIdentMatrix(&m); + VScaleMatrix(&m, w, h, 1.0); + VTranslate(&m, x + r4*co - 0.5*strlen(s)*w, + y + r4*si + 0.5*h, 0.0); + vpath_draw_string(p, s, strlen(s), &m); + } + } + + /* Max bank fixed scale: */ + VIdentMatrix(&m); + VScaleMatrix(&m, 0.03, 0.03, 1.0); + VTranslate(&m, 0.65, 0.05, 0.0); + vpath_draw_string(p, "MAX BANK", 8, &m); + x = 0.80; + y = 0.30; + r1 = 0.08; /* notchs internal radius */ + r3 = 0.11; /* long notchs external radius */ + r4 = 0.15; /* label's center radius */ + for( a = 5; a <= 25; a += 5 ){ + co = cos( MAX_BANK_ANGLE_OFFSET + MAX_BANK_ANGLE_SCALE * units_DEGtoRAD(a) ); + si = sin( MAX_BANK_ANGLE_OFFSET + MAX_BANK_ANGLE_SCALE * units_DEGtoRAD(a) ); + vpath_moveTo(p, &(VPoint){x + r1*co, y + r1*si, 0.0}); + vpath_lineTo(p, &(VPoint){x + r3*co, y + r3*si, 0.0}); + + /* Draw label: */ + sprintf(s, "%d", a); + w = 0.025; /* font width */ + h = 0.030; /* font height */ + VIdentMatrix(&m); + VScaleMatrix(&m, w, h, 1.0); + VTranslate(&m, x + r4*co - 0.5*strlen(s)*w, + y + r4*si + 0.5*h, 0.0); + vpath_draw_string(p, s, strlen(s), &m); + } + + /* Max bank, knob: */ + r1 = 0.06; + vpath_moveTo(p, &(VPoint){0.80 + r1, 0.30, 0.0}); + for( a = 30; a <= 360; a += 30 ){ + vpath_lineTo(p, &(VPoint){0.80 + r1*cos(units_DEGtoRAD(a)), + 0.30 + r1*sin(units_DEGtoRAD(a)), 0.0}); + } + + /* Handle attachment: */ + + /* Gear lights: */ + + panel_fixed = p; + + /* + Flap with pivot in (0,0,0) indicating 0 DEG deflection: + */ + + p = vpath_new(); + vpath_moveTo(p, &(VPoint){-0.02, 0.00, 0.0}); + vpath_lineTo(p, &(VPoint){ 0.00, -0.02, 0.0}); + vpath_lineTo(p, &(VPoint){ 0.15, 0.00, 0.0}); + vpath_lineTo(p, &(VPoint){ 0.00, 0.02, 0.0}); + vpath_lineTo(p, &(VPoint){-0.02, 0.00, 0.0}); + panel_flap = p; + + /* + Max bank knob, oriented right: + */ + + p = vpath_new(); + vpath_lineTo(p, &(VPoint){0.06, 0.00, 0.0}); + vpath_lineTo(p, &(VPoint){0.025, 0.0, 0.0}); + panel_bank_pointer = p; + + /* + Handle up, centered on its fulcrum: + */ + + p = vpath_new(); + vpath_moveTo(p, &(VPoint){-0.05, -0.25, 0.0}); + vpath_lineTo(p, &(VPoint){ 0.05, -0.25, 0.0}); + vpath_lineTo(p, &(VPoint){ 0.05, -0.05, 0.0}); + vpath_lineTo(p, &(VPoint){-0.05, -0.05, 0.0}); + vpath_lineTo(p, &(VPoint){-0.05, -0.25, 0.0}); + + vpath_moveTo(p, &(VPoint){-0.02, -0.05, 0.0}); + vpath_lineTo(p, &(VPoint){-0.02, 0.00, 0.0}); + vpath_lineTo(p, &(VPoint){-0.01, 0.01, 0.0}); + vpath_lineTo(p, &(VPoint){ 0.01, 0.01, 0.0}); + vpath_lineTo(p, &(VPoint){ 0.02, 0.00, 0.0}); + vpath_lineTo(p, &(VPoint){ 0.02, -0.05, 0.0}); + + vpath_moveTo(p, &(VPoint){-0.03, -0.05, 0.0}); + vpath_lineTo(p, &(VPoint){-0.03, 0.10, 0.0}); + vpath_lineTo(p, &(VPoint){ 0.03, 0.10, 0.0}); + vpath_lineTo(p, &(VPoint){ 0.03, -0.05, 0.0}); + panel_handle_up = p; + + /* + Handle down: + */ + + /* We simply draw the handle up with y axis reversed. */ + +} + + +static void panel_gear_and_flaps_draw(craft * c, viewer * u) +{ + int x, y, pos[3]; + Alib_Window *w; + double xscale, yscale, curMaxBank; + VMatrix m; + static _BOOL blink = FALSE; + static double blink_toggle_time = 0.0; + + + void gear_light(double xpos, double ypos, double gear_pos, char *label) + { + int h, v, width, height, len, fh, fw; + Alib_Rect r; + + h = x + xscale*xpos; + v = y + yscale*ypos; + width = 0.25*xscale; + height = 0.20*yscale; + Alib_setRect(&r, h, v, h + width, v + height); + if( (gear_pos == 0.0) || (blink && (gear_pos < GEARDOWN)) ) + Alib_fillRect(u->w, &r, panelBackgroundColor); + else + Alib_fillRect(u->w, &r, radarColor); + + Alib_drawRect(u->w, &r, blackColor); + Alib_expandRect(&r, 1, 1); + Alib_drawRect(u->w, &r, blackColor); + + len = strlen(label); + fh = height/6; + fw = fh; + VDrawStrokeString(u->v, + h + width/2 - len*fw/2, + v + height/2 + fh/2, + label, len, fh, blackColor); + } + + + if( curTime > blink_toggle_time ){ + blink = ! blink; + if( blink ) + blink_toggle_time = curTime + 0.5; + else + blink_toggle_time = curTime + 0.7; + } + + if( panel_fixed == NULL ) + panel_create_vpaths(); + + w = u->w; + x = u->gear.a.x; + y = u->gear.a.y; + xscale = (double) RectWidth(u->gear); + yscale = (double) RectHeight(u->gear); + + Alib_setClipRect(w, &u->gear); + + + /* + Update gear lights status: + */ + + pos[0] = gear_nosePosition(c); + pos[1] = gear_leftPosition(c); + pos[2] = gear_rightPosition(c); + + /* + Fixed drawings + */ + + VIdentMatrix(&m); + VScaleMatrix(&m, xscale, yscale, 1.0); + VTranslate(&m, x, y, -1.0); + vpath_stroke(panel_fixed, &m, w, whiteColor); + + /* + * Draw flaps current state + */ + + VIdentMatrix(&m); + VRotate(&m, ZRotation, FLAP_ANGLE_SCALE * c->curFlap); + VScaleMatrix(&m, xscale, yscale, 1.0); + VTranslate(&m, x + 0.25*xscale, y + 0.15*yscale, -1.0); + vpath_stroke(panel_flap, &m, w, whiteColor); + + /* + * Draw flaps commanded setting + */ + + VIdentMatrix(&m); + VRotate(&m, ZRotation, FLAP_ANGLE_SCALE * c->flapSetting); + VScaleMatrix(&m, xscale, yscale, 1.0); + VTranslate(&m, x + 0.25*xscale, y + 0.15*yscale, -1.0); + vpath_stroke(panel_flap, &m, w, magentaColor); + + /* + Draw max bank setting + */ + + curMaxBank = units_DEGtoRAD( aps_bank_max_get(c) ); + VIdentMatrix(&m); + VRotate(&m, ZRotation, MAX_BANK_ANGLE_OFFSET + + MAX_BANK_ANGLE_SCALE*curMaxBank); + VScaleMatrix(&m, xscale, yscale, 1.0); + VTranslate(&m, x + 0.8*xscale, y + 0.30*yscale, -1.0); + vpath_stroke(panel_bank_pointer, &m, w, magentaColor); + + /* + Draw gear handle + */ + + if( gear_isHandleDown(c) ){ + VIdentMatrix(&m); + VScaleMatrix(&m, xscale, /* upside-down */ -yscale, 1.0); + } else { + VIdentMatrix(&m); + VScaleMatrix(&m, xscale, yscale, 1.0); + } + VTranslate(&m, x + 0.25*xscale, y + 0.70*yscale, -1.0); + vpath_stroke(panel_handle_up, &m, w, whiteColor); + + /* + Draw gear lights: + */ + + if( c->cinfo->rn.x > c->cinfo->rm.x ){ + /* Tricycle: */ + gear_light(0.55, 0.55, pos[0], "Nose"); + gear_light(0.40, 0.80, pos[1], "Left"); + gear_light(0.70, 0.80, pos[2], "Right"); + + } else { + /* Bicycle: */ + gear_light(0.55, 0.80, pos[0], "Tail"); + gear_light(0.40, 0.55, pos[1], "Left"); + gear_light(0.70, 0.55, pos[2], "Right"); + } +} + + +#define MAX_ALTITUDE 2500 +#define THR_ALTITUDE 500 + +#ifdef FIXME_UNUSED_BUT_STILL_USEFUL_REFERENCE +static double normalized_h(double h) +/* + Map the altitude h >= 0.0 ft to the range [0.0,1.0]. + Altituded above MAX_ALTITUDE ft are mapped into 1.0. +*/ +{ + if( h > MAX_ALTITUDE ) + return 1.0; + if( h < 0.0 ) + return 0.0; + if( h <= THR_ALTITUDE ) + return h/THR_ALTITUDE*0.5; + else + return 0.5 + 0.5*(h - THR_ALTITUDE)/(MAX_ALTITUDE - THR_ALTITUDE); +} +#endif + + +static double map_altitude_to_y(double h) +/* Maps altitude h (ft) to y of the radar_altimeter_scale */ +{ + if( h <= 500.0 ) + return -0.01*h; + else + return -5.0 - 0.005*(h - 500.0); +} + + +#ifdef FIXME_UNUSED_BUT_STILL_USEFUL_REFERENCE +static double map_y_to_altitude(double y) +/* Maps y of the radar_altimeter_scale into the altitude h (ft) */ +{ + if( y >= -5.0 ) + return -100.0*y; + else + return 500.0 - 200.0*(y - 5.0); +} +#endif + + +static void build_radar_altimeter_scale() +{ + vpath_Type *p; + int h_inc, h, s_len; + double fw, fh, y, s_width; + char s[10]; + VMatrix m; + + p = vpath_new(); + + vpath_moveTo(p, &(VPoint){0.0, 0.0, 0.0}); + vpath_lineTo(p, &(VPoint){1.0, 0.0, 0.0}); + + fw = 0.15; + fh = 1.6*fw; + h_inc = 100; + + for( h = 100; h <= 2500; h += h_inc ){ + if( h == 500 ) h_inc = 200; + + y = map_altitude_to_y(h); + + sprintf(s, "%d", h); + s_len = strlen(s); + s_width = fw*s_len; + VIdentMatrix(&m); + VScaleMatrix(&m, fw, fh, 1.0); + VTranslate(&m, 0.5 - 0.5*s_width, y + fh/2.0, 0.0); + vpath_draw_string(p, s, s_len, &m); + + vpath_moveTo(p, &(VPoint){0.0, y, 0.0}); + vpath_lineTo(p, &(VPoint){0.5 - 0.5*s_width - 0.1, y, 0.0}); + + vpath_moveTo(p, &(VPoint){1.0, y, 0.0}); + vpath_lineTo(p, &(VPoint){0.5 + 0.5*s_width + 0.1, y, 0.0}); + } + + radar_altimeter_scale = p; +} + + +static void panel_radar_altimeter(viewer *u) +{ + double yscale, y0, h; + craft *c; + Alib_Rect clip; + Alib_Window *w; + VMatrix m; + + w = u->w; + + /* Clear area: */ + Alib_setClipRect(w, &u->radar_altimeter); + + /* Draw frame: */ + Alib_drawRect(w, &u->radar_altimeter, whiteColor); + + /* Clip to internal frame: */ + clip = u->radar_altimeter; + Alib_expandRect(&clip, -1, -1); + Alib_setClipRect(w, &clip); + + /* Get current altitude over the ground: */ + c = u->c; + h = units_METERStoFEET(c->w.z - terrain_localAltitude(c)) + - c->cinfo->rm.z - c->cinfo->Gm - c->cinfo->cmMax; + + /* + Mapping between screen y and altitude h: + + y = y0 - yscale*map_altitude_to_y(h) and its reverse: + h = map_y_to_altitude((y - y0)/yscale) + + The reference mark is located at the center of the scale. + */ + + y0 = RectMiddleY(clip); + yscale = 0.25*RectHeight(clip); /* 2 marks above and below reference */ + + if( h > 2900.0 ){ + + Alib_drawLine(w, clip.a.x, clip.a.y, clip.b.x, clip.b.y, + whiteColor); + + } else { + double y_h; + Alib_Rect g; + + y_h = y0 - yscale * map_altitude_to_y(h); + + /* Draw sky: */ + /*** + g = clip; + g.b.y = (int) (y_h + 0.5); + AlibFillRectangle(w, &g, attitudeSkyColor->cIndex); + ***/ + + /* Draw ground: */ + g = clip; + g.a.y = (int) (y_h + 0.5); + if( g.a.y < clip.b.y ){ + int i, x, B, H, W; + H = RectHeight(g); + W = RectWidth(g); + B = W/4; + Alib_fillRect(w, &g, yellowColor); + for( i = g.a.x + B; i < g.b.x + W + H; i += 2*B ){ + for( x = i; x < i + B; x++ ){ + Alib_drawLine(w, x, g.a.y, x - H, g.a.y + H, blackColor); + } + } + } + + /* Draw scale: */ + VIdentMatrix(&m); + VScaleMatrix(&m, RectWidth(clip), yscale, 1.0); + VTranslate(&m, clip.a.x, y_h, -1.0); + if( radar_altimeter_scale == NULL ) + build_radar_altimeter_scale(); + vpath_stroke(radar_altimeter_scale, &m, w, whiteColor); + + } + + /* Draw reference mark: */ + Alib_drawLine(w, clip.a.x, y0+0.5, clip.b.x, y0+0.5, magentaColor); + Alib_drawLine(w, clip.a.x, y0+0.5+1.0, clip.b.x, y0+0.5, magentaColor); +} + + +static void panel_lights_draw(craft * c, viewer * u) +{ + draw_Type *dd; + Alib_Window *w; + int rows, cols, row, col; + double width, height, x, y, cellH, cellW, cellX, cellY, fh, m; + Alib_Pixel black; + Alib_Rect rect; + static _BOOL blink = FALSE; + static double blink_toggle_time = 0.0; + + if( curTime > blink_toggle_time ){ + blink = ! blink; + if( blink ) + blink_toggle_time = curTime + 0.1; /* off time */ + else + blink_toggle_time = curTime + 0.2; /* on time */ + } + + w = u->w; + Alib_setClipRect(w, &u->lights); + + dd = draw_new(); + + width = RectWidth(u->lights); + height = RectHeight(u->lights); + x = u->lights.a.x; + y = u->lights.a.y; + + cols = 2; + rows = (LIGHTS_N + 1) / 2; + cellW = width / cols; + cellH = height / rows; + fh = 0.30*cellH; + m = 0.07*cellH; /* cell margin */ + + row = 0; + col = 0; + black = blackColor; +; + if( gear_brakesEngaged(c) ) + c->damageBits |= FLAG_WHEELBRAKE; + else + c->damageBits &= ~FLAG_WHEELBRAKE; + + for( pptr = &panelVec[0]; pptr->mask != 0; ++pptr ){ + + if( col >= cols ) + error_internal("col=%d >= cols=%d", col, cols); + + cellX = x + col * cellW; + cellY = y + row * cellH; + + /* + Draw cell background: + */ + + if( (c->damageBits & pptr->mask) != 0 + && (! pptr->blink || ! blink ) + ){ + Alib_setRect(&rect, cellX + m, cellY + m, cellX + cellW - 2*m, + cellY + cellH - 2*m); + Alib_fillRect(w, &rect, magentaColor); + } + + /* + Draw cell label: + */ + draw_string_centered(u->v, + cellX + 0.5*cellW, cellY + 0.5*cellH, fh, + pptr->name, black); + + /* + Draw cell border: + */ + /**** + draw_rect(dd, cellX + m, cellY + m, cellX + cellW - 2*m, cellY + cellH - 2*m); + ****/ + + row++; + if( row >= rows ){ + row = 0; + col++; + } + } + + draw_stroke(dd, u->v, HUDColor); + draw_free(dd); + + panel_radar_altimeter(u); +} + + +static double map_rpm_to_angle(int rpm) +{ + if( rpm < 20 ) + rpm = 20; + else if( rpm > 120 ) + rpm = 120; + + return units_DEGtoRAD( (rpm - 20)*270.0 / 80.0 - 90 ); +} + + +static void thrust_reverse_light(craft * c, viewer * u) +{ + static double blink_toggle_time = 0.0; + static _BOOL blink = FALSE; + + int xsize, ysize, x, y, width, height, fh, fw, moving, fully_deployed; + double xscale, yscale; + Alib_Rect r; + + if( ! c->cinfo->hasThrustReverser ) + return; + + if( curTime > blink_toggle_time ){ + blink = ! blink; + if( blink ) + blink_toggle_time = curTime + 0.2; + else + blink_toggle_time = curTime + 0.4; + } + + xsize = RectWidth(u->engine); + ysize = RectHeight(u->engine); + + xscale = xsize; + yscale = ysize; + + x = u->engine.a.x + 0.82 * xscale; + y = u->engine.a.y + 0.50 * yscale; + + width = 0.18*xscale; + height = 0.18*yscale; + + fully_deployed = (c->thrust_reverse_pos < -0.4); + moving = (c->thrust_reverse_pos < 0.9) && (c->thrust_reverse_pos > -0.4); + + Alib_setRect(&r, x, y, x + width, y + height); + if( fully_deployed || (moving && !blink) ) + Alib_fillRect(u->w, &r, radarColor); + + Alib_drawRect(u->w, &r, blackColor); + Alib_expandRect(&r, 1, 1); + Alib_drawRect(u->w, &r, blackColor); + + fh = 0.25 * height; + fw = fh; + VDrawStrokeString(u->v, + x + width/2 - 3*fw/2, + y + height/2 - 0.02*yscale, + "THR", 3, fh, blackColor); + VDrawStrokeString(u->v, + x + width/2 - 3*fw/2, + y + height/2 + fh + 0.02 * yscale, + "REV", 3, fh, blackColor); +} + + +static void panel_engine_draw(craft * c, viewer * u) +{ + draw_Type *dd; + Alib_Window *w; + int xsize, ysize, percent, percento, ab, x, y, rpm, fu; + double r, r1, r2, xc, yc, fh, co, si, a; + char s[32]; + Alib_Pixel white; + Alib_Rect rect; + + xsize = RectWidth(u->engine); + ysize = RectHeight(u->engine); + x = u->engine.a.x; + y = u->engine.a.y; + white = whiteColor; + + dd = draw_new(); + w = u->v->w; + Alib_setRect(&rect, x, y, x + xsize, y + ysize); + Alib_setClipRect(w, &rect); + + percento = (int) ( (double)c->throttleComm / 32768.0 * 100.0 + 0.5); + if (damage_isFunctioning(c, SYS_ENGINE1)) { + percent = (int) (c->rpm * 100.0 + 0.5); + } + else { + percent = 0; + } + ab = ((c->flags & FL_AFTERBURNER) == 0)? 0:1; + + r = 0.30*xsize; /* body */ + r1 = 0.85*r; /* ticks */ + r2 = 0.65*r; /* numbers */ + xc = x + xsize/2; + yc = y + r + 0.04*ysize; + fh = 0.15*r; + draw_circle(dd, xc, yc, r); + for( rpm = 20; rpm <= 100; rpm += 10 ){ + a = map_rpm_to_angle(rpm); + co = cos(a); + si = sin(a); + draw_segment(dd, xc + r*co, yc + r*si, xc + r1*co, yc + r1*si); + if( rpm > 20 && rpm % 20 == 0 ){ + sprintf(s, "%d", rpm); + draw_string_centered(u->v, xc + r2*co, yc + r2*si, fh, s, white); + } + } + draw_arc(dd, xc, yc, 0.95*r, map_rpm_to_angle(85), map_rpm_to_angle(100)); + draw_string_centered(u->v, xc, yc + 0.20*r, 0.12*r, "RPM%", white); + draw_pointer(dd, xc, yc, map_rpm_to_angle(percent), r2); + + /* + Draw ordered power + */ + + sprintf(s, "%3d%s", percento, ab? "AB" : " "); + draw_string_centered(u->v, xc, yc - 0.55*r, 0.18*r, s, white); + draw_rect(dd, xc - 0.56*r, yc - 0.75*r, xc + 0.56*r, yc - 0.37*r); + + /* + Print fuel total and fuel consumption rate + */ + + fu = (int) (planes_fuelUsed(c) * 3600.0 / deltaT); + if ( fu < 50 ) + fu = (fu + 3) / 5 * 5; + else if ( fu < 500 ) + fu = (fu + 5) / 10 * 10; + else + fu = (fu + 50) / 100 * 100; + + draw_string_centered(u->v, x + xsize/2, y + 0.76*ysize, 0.05*xsize, + "lb total lb/hour", white); + + sprintf(s, " %6d %6d", ((int) c->fuel + 5)/10*10, (fu + 5)/10*10); + draw_string_centered(u->v, x + xsize/2, y + 0.90*ysize, 0.05*xsize, s, white); + + draw_stroke(dd, u->v, whiteColor); + draw_free(dd); + + thrust_reverse_light(c, u); +} + + +void panel_updateAndDraw(craft *c, viewer *u) +{ + Alib_Rect rect; + Alib_setRect(&rect, 0, u->lights.a.y, gui_getWidth(u->gui), gui_getHeight(u->gui)); + Alib_setClipRect(u->w, &rect); + Alib_fillRect(u->w, &rect, panelBackgroundColor); + + panel_lights_draw(c, u); + radar_update(c, u); /* Radar */ + radar_updateTEWS(c, u); /* TEWS -- radar_update must be called first */ + adf_panel_draw(u); + adf_draw(u); + hsi_panel_draw(u); + hsi_draw(u); + panel_gear_and_flaps_draw(c, u); + panel_engine_draw(c, u); +} \ No newline at end of file diff -Nru acm-5.0/src/acm/panel.h acm-6.0+20200416/src/acm/panel.h --- acm-5.0/src/acm/panel.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/panel.h 2017-08-16 08:39:59.000000000 +0000 @@ -0,0 +1,52 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 2008 Umberto Salsi + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +/** + * This module takes care to update and draw the bottom strip of the instruments + * panel, which includes: + * + * - lights panel + * - radar altimeter + * - HSI tuner, or ADF tuner or TEWS (depending on the settings) + * - HSI, or ADF or radar (depending on the settings) + * - flaps status, max bank, gear status + * - engine setting + * + * @file + */ + +#ifndef _panel_h +#define _panel_h + +#include "pm.h" + +#ifdef panel_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +/** + * Updates and draws the bottom strip of the instruments panel. + * @param c + * @param u + */ +EXTERN void panel_updateAndDraw(craft *c, viewer *u); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/patchlevel.c acm-6.0+20200416/src/acm/patchlevel.c --- acm-5.0/src/acm/patchlevel.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/patchlevel.c 2017-03-22 00:51:23.000000000 +0000 @@ -0,0 +1,6 @@ +/* + * Dummy empty implementation: this module only exports declarations. + */ + +#define patchlevel_IMPORT +#include "patchlevel.h" diff -Nru acm-5.0/src/acm/patchlevel.h acm-6.0+20200416/src/acm/patchlevel.h --- acm-5.0/src/acm/patchlevel.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/patchlevel.h 2020-04-16 12:41:28.000000000 +0000 @@ -0,0 +1,13 @@ +#ifndef patchlevel_H +#define patchlevel_H + +#ifdef patchlevel_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +#define patchlevel_REVISION_STRING "6.0_20200416" + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/place.c acm-6.0+20200416/src/acm/place.c --- acm-5.0/src/acm/place.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/place.c 2017-04-20 13:53:31.000000000 +0000 @@ -0,0 +1,178 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1997 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#include "pm.h" + +#define place_IMPORT +#include "place.h" + +static VPoint origin = {0.0, 0.0, 0.0}; + +void +place_craft(Viewport * v, craft * c, viewer *u, craft * obj, VPolySet *ps) +{ + int i, k, n; + VPoint *q, tmp, tmp1, center, nc; + VMatrix mtx, mtx1, m, m1; + VPolygon *poly, **p, *p1; + double dist; + int aspect, offset; + VObject *op; + +/* + * Build a transformation matrix to convert from object to world coordinates. + */ + + if ((obj->flags & FL_FIXED_OBJECT) == 0) { + + VIdentMatrix(&m); + + VRotate(&m, YRotation, -units_DEGtoRAD(90.0)); + VRotate(&m, YRotation, -obj->w.latitude); + VRotate(&m, ZRotation, obj->w.longitude); + + VEulerToMatrix(obj->curRoll, + obj->curPitch, + obj->curHeading, + &m1); + + VMatrixMultByRank(&m1, &m, &mtx, 3); + + VTranslatePoint(&mtx, obj->Sg); + } + else { + VIdentMatrix(&mtx); + } + +/* + * If the object uses a special method to render itself, call that procedure. + */ + if( obj->cinfo == NULL ){ + printf("%s:%d: obj->cinfo == NULL, obj->type == %d\n", + __FILE__, __LINE__, obj->type); + return; + } + + if (obj->cinfo->placeProc != NULL) { + (*obj->cinfo->placeProc) (v, obj, &mtx, ps); + return; + } + +/* + * Build a matrix to transform from world to eye coordinate systems. + */ + + VMatrixMult(&mtx, &v->eyeSpace, &mtx1); + +/* + * Reject the object if is completely outside any of the clipping planes + */ + + if (obj->flags & FL_FIXED_OBJECT) + tmp = obj->cinfo->object->center; + else + VTransform(&obj->cinfo->object->center, &mtx, &tmp); + + VTransform(&tmp, &u->v->eyeSpace, ¢er); + for (i = 0; i < 4; ++i) { + dist = VPointToClipPlaneDistance(¢er, + &(u->v->clipNormals[i])); + if (dist > obj->cinfo->object->extent) + return; + } + + op = obj->cinfo->object; + n = op->numPolys; + p = op->polygon; + offset = 0; + if (op->order) { + VTransform(&origin, &mtx1, &nc); + VTransform_(&VUnitVectorI, &mtx1, &op->xaxis); + VTransform_(&VUnitVectorJ, &mtx1, &op->yaxis); + VTransform_(&VUnitVectorK, &mtx1, &op->zaxis); + aspect = VComputeObjectAspect(op, &nc); +#ifdef notdef + printf("%s: %s\n", op->name, VGetAspectName(aspect)); +#endif + offset = aspect * n; + } + + for (i = 0; i < n; ++i) { + +/* + * Here is an opportunity to cull back-facing polygons without + * copying or transforming them. tmp1 becomes the transformed coordinates + * of the first vertex in the polygon. + */ + + p1 = (op->order) ? p[op->order[offset + i]] : p[i]; + + VTransform(&p1->vertex[0], &mtx1, &tmp1); + if (p1->flags & PolyNormalValid) { + VTransform_(&p1->normal, &mtx1, &tmp); + } + if (p1->flags & PolyClipBackface) { + if (VDotProd(&tmp1, &tmp) >= 0.0) { + continue; + } + } + +/* + * Beyond the culling distance? Don't plot this polygon + */ + + if (p1->flags & PolyUseCullDistance) { + if (sqrt(tmp1.x * tmp1.x + tmp1.y * tmp1.y + tmp1.z * tmp1.z) > + p1->cullDistance) { + continue; + } + } + + poly = VCopyPolygon(p1); + +/* + * First copy the normal vector and the transformed first point, then loop + * over all remaining points. + */ + + if (poly->flags & PolyNormalValid) { + poly->normal = tmp; + } + + q = poly->vertex; + +/* + * First, copy the previously transformed first vertex. + */ + + *q = tmp1; + q++; + +/* + * Now transform and copy the remaining vertices. + */ + + for (k = 1; k < poly->numVtces; (++k, ++q)) { + VTransform(q, &mtx1, &tmp); + *q = tmp; + } + + VPolySet_Add(ps, poly); + } + +} diff -Nru acm-5.0/src/acm/place.h acm-6.0+20200416/src/acm/place.h --- acm-5.0/src/acm/place.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/place.h 2017-03-22 00:52:01.000000000 +0000 @@ -0,0 +1,37 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1998 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#ifndef _place_h +#define _place_h + +#include "pm.h" + +#ifdef place_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +/** + * Add the object view of the object to the polygons set of the view from + * the given craft. Polygons are added to ps. + */ +EXTERN void place_craft(Viewport * v, craft * c, viewer *u, craft * obj, VPolySet *ps); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/planes.c acm-6.0+20200416/src/acm/planes.c --- acm-5.0/src/acm/planes.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/planes.c 2017-10-22 14:47:02.000000000 +0000 @@ -0,0 +1,271 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1998 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#include +#include +#include +#include "alarm.h" +#include "damage.h" +#include "gear.h" +#include "inventory.h" +#include "pm.h" +#include "terrain.h" +#include "weapon.h" +#include "../util/error.h" +#include "../util/units.h" + +#define planes_IMPORT +#include "planes.h" + + +static double planes_noEngineThrust(craft *c) +{ + c->rpm = 0.0; + return 0.0; +} + + +/** + * Generic piston engine performances with altitude. + * The formula has been estimated from the reference below, in particular from + * table 1 page 19 from which I deduced the following relation: + * + * P[h]/P[0] = pow(rho[h]/rho[0], 1.6) + * + * where P[h] is the maximum power at the given altitude and rho[h] is the + * air density at the given altitude. As stated in the conclusions of the + * reference, the effects of the air temperature are minimal, at least on + * the altitude range of a small piston engine like our C-172RG, so the air + * temperature is here ignored. + * + * Performances were measured on a small 2-strokes engine on a simulated + * environment. I don't know how much these data are representative of a real + * piston engine on a real airplane. + * + * Reference: + * Travis Don Husaboe, Effects of temperature on the performance of a small + * internal combustion engine at altitude", thesis at Department of the Air + * Force, Air University, Ohio, March 2013. + * @param c + * @return Thrust (lbf). + */ +static double planes_genericPistonEngineThrust(craft *c) +{ + if ( c->fuel > 0.0 ) + c->throttle = c->throttleComm; + else + c->throttle = 0; + double ts = c->throttle / 32768.0; + c->rpm = (c->rpm - ts) * exp(deltaT / c->cinfo->engineLag) + ts; + return c->rpm + * interpolate_value(c->cinfo->Thrust, c->mach) * c->cinfo->maxThrust + * pow(c->air.rho / units_RHO_0, 1.6); +} + + +static double planes_genericJetEngineThrust(craft *c) +{ + double t, ts; + + if (c->flags & FL_AFTERBURNER) { + t = interpolate_value(c->cinfo->ABThrust, c->mach) * c->cinfo->maxABThrust; + } + else { + t = interpolate_value(c->cinfo->Thrust, c->mach) * c->cinfo->maxThrust; + } + + if ( c->fuel > 0.0 ) + c->throttle = c->throttleComm; + else + c->throttle = 0; + ts = c->throttle / 32768.0; + c->rpm = (c->rpm - ts) * exp(deltaT / c->cinfo->engineLag) + ts; + + return t * c->rpm * c->rpm * c->air.rho / units_RHO_0; +} + + +static double planes_genericRocketEngineThrust(craft *c) +{ + if ( c->fuel > 0.0 ) + c->throttle = c->throttleComm; + else + c->throttle = 0; + double ts = c->throttle / 32768.0; + c->rpm = (c->rpm - ts) * exp(deltaT / c->cinfo->engineLag) + ts; + if( c->rpm < 0 ) + c->rpm = 0; + else if( c->rpm > 1 ) + c->rpm = 1; + return c->rpm * c->cinfo->maxThrust; +} + + +inventory_ThrustCalculator * planes_getThrustCalculator(craftType * cinfo) +{ + switch(cinfo->engineType){ + case inventory_NoEngine: return planes_noEngineThrust; + case inventory_GenericPistonEngine: return planes_genericPistonEngineThrust; + case inventory_GenericJetEngine: return planes_genericJetEngineThrust; + case inventory_GenericRocketEngine: return planes_genericRocketEngineThrust; + default: error_internal("unknown engine type: %d", cinfo->engineType); + } +} + +double +planes_fuelUsed( craft * c ) +{ + double spFuelConsump; + + if (c->flags & FL_AFTERBURNER) { + spFuelConsump = c->cinfo->spABFuelConsump; + } + else { + spFuelConsump = c->cinfo->spFuelConsump; + } + return spFuelConsump * c->curThrust * deltaT / 3600.0; +} + +void +planes_genericResupply(craft * c) +{ + int i; + + if( c->type == CT_DRONE ){ + /* half refueling for drones: */ + c->fuel = 0.5 * c->cinfo->maxFuel; +#ifdef FIXME_NOT_DEFINED + } else { + /* +10% every 30 s while on ground: */ + c->fuel += c->cinfo->maxFuel / 10.0; + if ( c->fuel > c->cinfo->maxFuel ) + c->fuel = c->cinfo->maxFuel; +#endif + } + + for (i = 0; i < c->cinfo->sCount; i++) { + c->station[i] = c->cinfo->station[i]; + } + damage_reset(c); +} + + +void planes_doResupply(void *arg1, void *arg2) +{ + craft *c; + int i; + double d; + + for ((i = 0, c = &ptbl[0]); i < manifest_MAXPLAYERS; (++i, ++c)) { + + if (c->type != CT_PLANE) + continue; + + if (VMagnitude(&c->Cg) < 5.0) { + d = 0.0; + if (d <= manifest_MAX_GROUND_DISTANCE) + (*c->cinfo->resupply) (c); + /* ignore = */ weapon_selectByName(c, c->curWeapon); + } + } + + /* id = */ alarm_add(manifest_RESUPPLY_INTERVAL, planes_doResupply, NULL, NULL); +} + + +int planes_newPlane(char *planeType) +{ + int i; + craft *c; + + for (i = 0; i < manifest_MAXPLAYERS; ++i) { + if (ptbl[i].type == CT_FREE || ptbl[i].type == CT_RESERVED) { + break; + } + } + + if (i == manifest_MAXPLAYERS) + return -1; + + c = &ptbl[i]; + if ((c->cinfo = inventory_craftTypeSearchByZoneAndName(NULL, planeType)) == NULL) { + return -2; + } + + c->type = CT_PLANE; + c->Cg.x = 0.0; + c->Cg.y = 0.0; + c->Cg.z = 0.0; + + /* + Ensure terrain_local_altitude() will update the local altitude at the + first call + */ + + c->terrain_altitude_timeout = curTime - 10.0; + /* c->terrain_altitude = UNKNOW; */ + + c->p = c->q = c->r = 0.0; + c->pitchComm = c->rollComm = c->steerComm = c->rudderComm = 0.0; + c->Se = c->Sr = c->Sa = 0.0; + c->SeTrim = c->SaTrim = 0.0; + + c->throttleComm = 0.20 * 32768.0; /* 20% */ + c->throttle = 0; + c->curThrust = (c->cinfo->thrust) (c); + c->rpm = (double) c->throttle / 32768.0; + c->thrust_reverse_on = FALSE; + c->thrust_reverse_pos = 1.0; + + c->curFlap = 0.0; + c->flapSetting = 0.0; + c->curSpeedBrake = 0.0; + c->speedBrakeSetting = 0.0; + c->curHeading = c->curPitch = c->curRoll = 0.0; + VIdentMatrix(&(c->trihedral)); + c->flags = 0; + c->curRadarTarget = -1; + pm_hud_strings_alloc(c); + + /* AutoPilot System (automatically allocated by aps.c): */ + c->aps = NULL; + + /* Magnetic VAR handling: */ + c->showMag = 0; + c->actualLocalVAR = 0.0; + c->updActualMagneticField = 0.0; + c->indicatedLocalVAR = 0.0; + c->updIndicatedMagneticField = 0.0; + c->radarMode = RM_OFF; + + gear_allocate(c); + gear_down(c); + +/* + * rearm and fuel the aircraft. + */ + + (*c->cinfo->resupply) (c); + + c->w.z = 0.0; /* sea level -- caller must set properly */ + + /* Set c->curWeapon: */ + weapon_selectByName(c, weapon_NULL); + + return i; +} diff -Nru acm-5.0/src/acm/planes.h acm-6.0+20200416/src/acm/planes.h --- acm-5.0/src/acm/planes.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/planes.h 2017-10-30 02:45:08.000000000 +0000 @@ -0,0 +1,79 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1998 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +/** + * Retrieves crafts types models from the data base and implements their basic + * behavior by setting call-back functions (engine, resupply, ...). + * + * @file + */ + +#ifndef _planes_h +#define _planes_h + +#include "pm.h" + +#ifdef planes_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +/** + * Returns the thrust engine function specific for the specified aircraft. + * This module contains specific functions that simulates the performances + * of several types of engines; its one of these functions that gets returned. + * @param cinfo Specific craft informations. + * @return Engine RPM update and thrust calculator function. + */ +EXTERN inventory_ThrustCalculator * planes_getThrustCalculator(craftType * cinfo); + +/** + * Fuel resupply +10% max fuel load, weapon resupply and damage repair. + * This function should be called once for any new aircraft, then every 30 s + * while on ground. + * If drone, set fuel quantity to half the capacity. + * FIXME: fuel resupply of aircraft commented out as it can be set by user. + * @param c + */ +EXTERN void planes_genericResupply(craft * c); + +/** + * Call-back function for the alarm module. + * Scans for all the players aircraft; if a player is on the airport + * grounds and motionless, then invoke the plane's resupply procedure. + */ +EXTERN void planes_doResupply(void *dummy1, void *dummy2); + +/** + * Returns the fuel consumed in the last deltaT interval. + * @param c + * @return Fuel consumed in the last deltaT interval (lb). + */ +EXTERN double planes_fuelUsed( craft * c ); + +/** + * Allocates a new plane in the ptbl[] table. + * @param planeType Name of the plane, for ex. "C-172". + * @return Index of the new plane in the ptbl[] table. If negative: -1 == table + * full; -2 == unknown plane name. + */ +EXTERN int planes_newPlane(char *planeType); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/players.c acm-6.0+20200416/src/acm/players.c --- acm-5.0/src/acm/players.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/players.c 2017-10-28 08:32:19.000000000 +0000 @@ -0,0 +1,689 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1998 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#include +#include +#include + +#include "../util/error.h" +#include "../util/memory.h" +#include "../util/units.h" +#include "../V/Vlib.h" +#include "sounds.h" +#include "box.h" +#include "browse.h" +#include "dis_if.h" +#include "drone.h" +#include "effects.h" +#include "flaps.h" +#include "gear.h" +#include "hsi.h" +#include "hud.h" +#include "instruments.h" +#include "inventory.h" +#include "list.h" +#include "magnetic_compass.h" +#include "patchlevel.h" +#include "planes.h" +#include "pm.h" +#include "prompt.h" +#include "render.h" +#include "terrain.h" +#include "update.h" +#include "viewer.h" +#include "weapon.h" +#include "windows.h" + +#define players_IMPORT +#include "players.h" + +#define ARG_BORDER_COLOR "bordercolor" +#define ARG_BORDER "borderwidth" +#define ARG_GEOMETRY "geometry" +#define DEFAULT_BACKGROUND "#7c99b6" +#define DEFAULT_BORDER "black" + + +#define SW_BACKGROUND 2 +#define SW_GEOM 4 +#define SW_FORCE 6 + +#define SW_PLANE 9 +#define SW_LIST_PLAYER 10 + +#define SW_HUD_MODE 12 +#define SW_PASSIVE 13 +#define SW_LATITUDE 14 +#define SW_LONGITUDE 15 +#define SW_ALTITUDE 16 +#define SW_AIRSPEED_KT 17 +#define SW_HEADING 18 +#define SW_END_GAME 19 +#define SW_NO_SOUND 20 +#define SW_FUEL 21 +#define SW_PAYLOAD 22 +#define SW_LAST 22 /* last entry in list */ + + +static struct { + char *sw; + int value; +} swt[] = { + {"-skycolor", SW_BACKGROUND}, + {"-geometry", SW_GEOM}, + {"-force", SW_FORCE}, + {"-stealth", SW_PASSIVE}, + {"-plane", SW_PLANE}, + {"-list", SW_LIST_PLAYER}, + {"-latitude", SW_LATITUDE}, + {"-longitude", SW_LONGITUDE}, + {"-altitude", SW_ALTITUDE}, + {"-airspeed-kt", SW_AIRSPEED_KT}, + {"-heading", SW_HEADING}, + {"-end-game", SW_END_GAME}, + {"-no-sound", SW_NO_SOUND}, + {"-fuel", SW_FUEL}, + {"-payload", SW_PAYLOAD}, + {"-hud-mode", SW_HUD_MODE}, + {NULL, 0} +}, *swp; + + +/** + * Internal state update call-back, normally set in the craft->update field. + * @param c Subject craft. + * @return Reason why this craft should be killed. Normally NULL. + */ +static char *players_update(craft *c) +{ + char *killReason = pm_flightCalculations(c); + if (killReason != NULL) + return killReason; + magnetic_compass_update(c->vl); + hsi_update(c->vl); + weapon_update(c); + flaps_update(c); + dis_if_updateLocal(c); + return NULL; +} + + +void +players_kill(craft *c, char *reason) +{ + + viewer *v; + int i; + VPoint vel = { 0, 0, 0 }; + +/* + * Notify to all the viewers the reason why this craft is dead + */ + + if( (reason != NULL) + && (c->type == CT_PLANE || c->type == CT_DRONE || c->type == CT_DIS_PLANE ) + ){ + char s[1000]; + snprintf(s, sizeof(s), "%s %s force %s: %s", + c->name, c->cinfo->name, dis_forceToString(c->force), reason); + prompt_broadcast_print(s); + + /* The owner of the window can see the message, use its terminal: */ + if( c->type == CT_PLANE ) + printf("%s\n", s); + } + +/* + * Decrement the player count, iff this is a real person that just got + * killed. + */ + + if (c->type == CT_PLANE && (c->flags & FL_BLACK_BOX) == 0) { + --ptblCount; + } + +/* + * Erase our radar emissions + */ + + for (i = 0; i < manifest_MAXPLAYERS; ++i){ + ptbl[i].rval[c->pIndex] = 0.0; + } + +/* + * No need to inform the others crafts and missiles we died: the + * dis_if module will take care to update c->curRadarTarget field. + */ + +/* + * Replace the plane with an explosion. + */ + + effects_new_explosion(&(c->Sg), &vel, 30.0, 15.0, 4.0); + +/* + * Release services tied to the craft + */ + + memory_dispose(c->aps); + gear_free(c); + + drone_release_commands(c); + + pm_hud_strings_free(c); /* FIXME: HUD data should go in hud.c */ + +/* + * Close all the viewers tied to this craft + */ + + while( c->vl != NULL ){ + + v = c->vl; + + /* + * If this was a situation where we had grabbed control in steath + * mode and then died, return to the browsing state. + */ + + if ( v->viewer_state == ViewerStateNormal + && v->watchedCraft != NULL + && v->watchedCraft->type == CT_DIS_STEALTH + ) { + printf ("player killed: returning to stealth browsing mode\n"); + v->viewer_state = ViewerStateBrowsing; + + /* + FIXME: the current status of the viewer does not match + that of the watched craft, we should release the services + (audio, terminal, etc. as in viewer_free()) and then + initialize them properly. + */ + v->c = v->watchedCraft; + + v->watchedCraft = NULL; + v = NULL; + } + else { + /* vn = c->vl; */ + } + + viewer_free(v); + } + + if (c->flags & FL_RECORD) { + --recordCount; + } + + if (c->flags & FL_BLACK_BOX) + box_killPlayer(c->pIndex); + + dis_if_entityExit(c->disId); + + c->type = CT_FREE; +} + + +static void parseGeometry(char *geometry, int *width, int *height) +{ + int w, h; + *width = 400; + *height = 300; + if( geometry == NULL ) + return; + if( sscanf(geometry, "%dx%d", &w, &h) < 2 || w < 1 || h < 1 ){ + fprintf(stderr, "invalid geometry string: %s\n", geometry); + return; + }; + *width = w; + *height = h; +} + + +int players_new(char *logname, list_Type *switches) +{ + int argc; + char **argv; + char *geomSpec; /* Window geometry string */ + char *c; + static char *background = NULL; + int player; + viewer *u; + craft *cf; + int i; + DISForce force = DISForceOther; + char *plane = "C-172"; /* name of plane type */ + int width, height; /* size of the main window */ + int passive = 0; + _BOOL hud_mode; + int overrides[SW_LAST+1]; + char *overrideLatitude = NULL; + char *overrideLongitude = NULL; + double overrideAltitude = 0.0, + overrideHeading_rad = 0.0, overrideAirspeed_fps = 0.0, + overrideFuel = 0.0, + overridePayload = 0.0; + int end_game = 0; + int no_sound = 0; + double disLocation[3]; + double disZeroVec[3]; + double disOrientation[3]; + +/* + * Parse command line + */ + + memset(overrides, 0, sizeof(overrides)); + geomSpec = NULL; + hud_mode = FALSE; + + if( switches == NULL ){ + argc = 0; + argv = NULL; /* make happy gcc -Wall */ + } else { + argc = switches->n; + argv = switches->arr; + } + + for( i=0; ivalue != 0; ++swp) { + if (strcmp(swp->sw, c) == 0) { + + switch (swp->value) { + + case SW_GEOM: + i++; + if( i < argc ) + geomSpec = argv[i]; + break; + + case SW_END_GAME: + end_game = 1; + break; + +/* + case SW_BORDER: + i++; + if( i < argc ) + borderWidth = atoi( argv[i] ); + break; +*/ + + case SW_BACKGROUND: + i++; + if( i < argc ) + background = argv[i]; + break; + + case SW_FORCE: + i++; + if( i >= argc ) + error_external("missing argument for -force"); + force = dis_parseForce(argv[i]); + if( force < 0 ) + error_external("unknown DIS force: %s", argv[i]); + break; + + case SW_PASSIVE: + passive = 1; + break; + + case SW_PLANE: + i++; + if( i < argc ) + plane = argv[i]; + break; + + case SW_LATITUDE: + i++; + if( i < argc ){ + overrideLatitude = argv[i]; + overrides[SW_LATITUDE] = 1; + } + break; + + case SW_LONGITUDE: + i++; + if( i < argc ){ + overrideLongitude = argv[i]; + overrides[SW_LONGITUDE] = 1; + } + break; + + case SW_ALTITUDE: + i++; + if( i < argc ){ + overrideAltitude = units_FEETtoMETERS(atof( argv[i] )); + overrides[SW_ALTITUDE] = 1; + } + break; + + case SW_AIRSPEED_KT: + i++; + if( i < argc ){ + overrideAirspeed_fps = units_KTtoFPS(atof( argv[i] )); + if (overrideAirspeed_fps > units_KTtoFPS(2500.0)) { + printf ("You really should slow down.\n"); + printf ("At least to less than 2500 knots.\n"); + } + overrides[SW_AIRSPEED_KT] = 1; + } + break; + + case SW_HEADING: + i++; + if( i < argc ){ + overrideHeading_rad = units_DEGtoRAD(atof( argv[i] )); + overrides[SW_HEADING] = 1; + } + break; + + case SW_LIST_PLAYER: { + printf("\nname\t\tnumber\n"); + printf("-------------------------\n"); + int i; + for (i = 0; i < manifest_MAXPLAYERS; i++) { + if (ptbl[i].type == CT_PLANE) { + printf("%-16s %d\n", ptbl[i].name, i); + } + } + return -1; + } + +/* + case SW_DEFAULT_VISUAL: + useDefaultVisual = 0; + break; +*/ + + case SW_NO_SOUND: + no_sound = 1; + break; + + case SW_FUEL: + i++; + if( i < argc ){ + overrideFuel = atof( argv[i] ); + overrides[SW_FUEL] = 1; + } + break; + + case SW_PAYLOAD: + i++; + if( i < argc ){ + overridePayload = atof( argv[i] ); + overrides[SW_PAYLOAD] = 1; + } + break; + + case SW_HUD_MODE: + hud_mode = TRUE; + break; + + default: + error_internal("swp->value=%d", swp->value); + } + break; + } + } + + if (swp->value == 0) { + error_external("invalid switch %s", argv[i]); + return -1; + } + } + } + + player = planes_newPlane(plane); + + if (player < 0) { + if (player == -1) { + printf("Sorry, no room for any more players at this moment.\n"); + } + else { + printf("You have selected an unknown plane type. Choose one among these types:\n"); + inventory_printValidAircraft(); + } + return -1; + } + + cf = &ptbl[player]; + + /* + * Set fuel and payload + */ + + if (overrides[SW_FUEL]) { + if (overrideFuel > cf->cinfo->maxFuel) { + printf("Too much fuel for this plane. Maximum is %.0f lb.\n", + cf->cinfo->maxFuel); + cf->fuel = cf->cinfo->maxFuel; + } else { + cf->fuel = overrideFuel; + } + } else { + cf->fuel = cf->cinfo->maxFuel; + } + + if (overrides[SW_PAYLOAD]) { + cf->payload = overridePayload; + } else { + cf->payload = 150.0; /* weight of the pilot (lb) */ + } + + // Default initial position: 0N 0E, sea level! + cf->w = (earth_LatLonAlt){0,0,0}; + + // Set position according to command line parameters: + if ( overrides[SW_LATITUDE] + && ! earth_parseLatitude(overrideLatitude, &cf->w.latitude) ) + error_external("invalid starting latitude: ", overrideLatitude); + + if ( overrides[SW_LONGITUDE] + && ! earth_parseLongitude(overrideLongitude, &cf->w.longitude) ) + error_external("invalid starting latitude: ", overrideLatitude); + + /* Forces terrain altitude recalculation: */ + cf->terrain_altitude_timeout = 0.0; + + earth_LatLonAltToXYZ(&cf->w, &cf->Sg); + + /* + * Forces loading of the scenery below the aircraft. If the starting zone + * defines our force base location, retrieve that location for the resupply + * procedure. + */ + cf->zone = zones_load(zones, &cf->w, NULL, 1); + if( cf->zone != NULL && zone_isLoaded(cf->zone) ) + forceBaseLocation[cf->force] = *zone_getForceBaseLocation(cf->zone, cf->force); + + if (overrides[SW_ALTITUDE]) { + cf->w.z = overrideAltitude; + cf->curPitch = units_DEGtoRAD(2.0); /* ensure some initial lift */ + gear_up(cf); + } else { + double h; + gear_ground_altitude_pitch(cf, &h, &cf->curPitch); + /* WARNING. terrain_local_altitude() requires cf->Sg and zone be already set. */ + cf->w.z = terrain_localAltitude(cf) + units_FEETtoMETERS(h); + earth_LatLonAltToXYZ(&cf->w, &cf->Sg); + gear_down(cf); + } + + // Set magnetic variation based on the actual position. + cf->updActualMagneticField = curTime - 1.0; /* force VAR recalculation */ + /* ignore = */ pm_mag_heading(cf); /* set cf->actualLocalVAR */ + cf->indicatedLocalVAR = cf->actualLocalVAR; + cf->updIndicatedMagneticField = curTime + 2.0; + + cf->curHeading = 0; + if( overrides[SW_HEADING] ) + cf->curHeading = pm_normalize_yaw( overrideHeading_rad - cf->actualLocalVAR ); + + cf->prevSg = cf->Sg; + cf->curRoll = 0.0; + cf->r = cf->q = cf->p = 0.0; + + // Generate trihedral and world-to-aircraft matrices + VEulerToMatrix(cf->curRoll, cf->curPitch, cf->curHeading, &(cf->trihedral)); + earth_generateWorldToLocalMatrix(&cf->w, &cf->XYZtoNED); + + // Set airspeed. + if (overrides[SW_AIRSPEED_KT]) { + VMatrix turn; + VPoint v = { overrideAirspeed_fps, 0.0, 0.0 }; + VIdentMatrix(&turn); + VRotate(&turn, ZRotation, cf->curHeading); + VTransform_(&v, &turn, &cf->Cg ); + } else { + VSetPoint(&cf->Cg, 0, 0, 0); + } + + cf->update = players_update; + cf->kill = players_kill; + + // Open a new viewer. + + cf->vl = NULL; + + u = viewer_new(cf); + + u->hud_mode = hud_mode; + + /* + * If we're passive (stealth mode), wipe out aircraft information; + * this entry will become a placeholder for our browsing view. + */ + + if ( passive ) { + + u->viewer_state = ViewerStateBrowsing; + cf->type = CT_DIS_STEALTH; + cf->cinfo = NULL; + cf->radarMode = RM_DIS_BROWSE; + + if ( end_game ) { + end_game_mode = 1; + } + + /* + * Stealth a specific entity? Go ahead and set it as the subject. + * + * This requires snooping for entities in the PDU stream prior + * to looking for the entity in the table. + */ + + if ( subjectEntitySpecified ) { + dis_if_Entity *e; + craft *c; + + printf ("Building entity database ... "); + fflush ( stdout ); + + update_simulationTime (); + dis_if_snoop ( 5500 ); + + printf ("done.\n"); + + e = dis_if_findEntityByDISID( & subjectEntityID ); + if( e == NULL ) + c = e->c; + else + c = NULL; + if ( c ) { + + browse_stealthCraft ( c, u, -1, 1); + + } + } + + } + else { + + if ( end_game ) { + printf("The -end-game switch is only valid when used " ); + printf("with stealth mode.\n" ); + printf("The switch will be ignored.\n\n" ); + } + + if ( subjectEntitySpecified ) { + printf("The -subject-entity-id switch is only valid when used " ); + printf("with stealth mode.\n" ); + printf("The switch will be ignored.\n\n" ); + } + + } + + parseGeometry(geomSpec, &width, &height); + u->gui = gui_new("ACM-" patchlevel_REVISION_STRING, width, height); + + render_setOutsideView(u->c, u, render_VIEW_FORWARD); + + if (background == NULL) + background = DEFAULT_BACKGROUND; + + cf->force = force; + + memory_strcpy(cf->name, sizeof(cf->name), logname); + + sounds_enable(cf, ! no_sound); + + u->w = Alib_new(u->gui); + + Alib_setDepthCueing(u->w, 1); + + windows_set_layout(cf, u, width, height, hud_mode); + + if( hud_mode ){ + hud_enable(u); + } else { + instruments_enable(u); + } + + ++ptblCount; + + /* + * Transmit initial DIS entity state PDU + */ + + if ( cf->type != CT_DIS_STEALTH ) { + earth_LatLonAltToXYZ(&cf->w, (VPoint *) disLocation); + disZeroVec[0] = 0.0; + disZeroVec[1] = 0.0; + disZeroVec[2] = 0.0; + disOrientation[0] = cf->curHeading; + disOrientation[1] = 0.0; + disOrientation[2] = 0.0; + + dis_if_entityEnter(force, cf, + &cf->cinfo->entityType, + &cf->cinfo->altEntityType, + disLocation, disZeroVec, disZeroVec, + disOrientation, disZeroVec, &cf->disId); + } + + cf->showMag = TRUE; + + magnetic_compass_enable(u); + + cf->radarMode = RM_HSI; + hsi_enable(u); + + return 0; +} diff -Nru acm-5.0/src/acm/players.h acm-6.0+20200416/src/acm/players.h --- acm-5.0/src/acm/players.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/players.h 2017-07-06 16:17:28.000000000 +0000 @@ -0,0 +1,40 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1998 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#ifndef _players_h +#define _players_h + +#include "pm.h" +#include "list.h" + +#ifdef players_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +EXTERN int players_new(char *logname, list_Type *switches); + +/** + * Release aircraft with the specified reason. The reason is broadcasted + * to all the active viewers only if it is != NULL. + */ +EXTERN void players_kill(craft *c, char *reason); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/pm.c acm-6.0+20200416/src/acm/pm.c --- acm-5.0/src/acm/pm.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/pm.c 2017-10-20 00:51:14.000000000 +0000 @@ -0,0 +1,792 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1998 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + * + */ + +#include +#include + +#include "../util/memory.h" + +#define pm_IMPORT +#include "pm.h" + +#include "aps.h" +#include "damage.h" +#include "dis_if.h" +#include "gear.h" +#include "planes.h" +#include "prompt.h" +#include "terrain.h" +#include "../util/units.h" +#include "../wmm/wmm.h" + +#ifdef WINNT +#include +#endif + +static double CM, CN, C_Y; + + +/* + * twoorder: solve linear second-order differential equation with initial + * conditions known. + * + * y_dot_dot - d * y_dot - k * y - q = 0 + * + * given the initial conditions: + * + * y(0) == y. + * y_dot(0) == v. + * + * Results are *newy=y(deltaT) and *newv=y_dot(deltaT) for deltaT seconds + * into the future. + * + */ + +static void +twoOrder(double k, double d, double q, double y, double v, + double *newy, double *newv) +{ + + double qk, s, s1, s2, t, ac, c1, c2, exp_s1_x, exp_s2_x; + +/* + Prevent numerical instabilities: since y,v are pitch/yaw angle and its + derivative, it would be perfectly useless to consider factors too + small. +*/ + + if( fabs(d) < 1e-9 ) + d = 0.0; + + if( fabs(k) < 1e-9 ) + k = 0.0; + + if( k == 0.0 ){ + if( d == 0.0 ){ + /* The equation reduces to: y_dot_dot = q. */ + *newy = 0.5 * q * deltaT * deltaT + v * deltaT + y; + *newv = q * deltaT + v; + } else { + /* The equation reduces to: y_dot_dot - d*y_dot - q = 0. */ + *newy = (v + q/d)/d*exp(d*deltaT) - q/d*deltaT + y - (v + q/d)/d; + *newv = (v + q/d)*exp(d*deltaT) - q/d; + } + *newy = y; + *newv = v; + return; + } + qk = q/k; + + ac = d * d + 4.0 * k; + + if ( ac > 0.0 ) { + /* + The general solution for ac > 0 is: + y = c1 * exp(s1*x) + c2 * exp(s2*x) - q/k + where: + s1 = ...see code... + s2 = ...see code... + c1 = ...see code... + c2 = ...see code... + */ + t = sqrt(ac); + s1 = (d + t) * 0.5; + s2 = (d - t) * 0.5; + c1 = (-s2*y - s2*qk + v) / t; + c2 = ( s1*y + s1*qk - v) / t; + exp_s1_x = exp(s1 * deltaT); + exp_s2_x = exp(s2 * deltaT); + *newy = c1 * exp_s1_x + c2 * exp_s2_x - qk; + *newv = c1 * s1 * exp_s1_x + c2 * s2 * exp_s2_x; + } + else if (ac < 0.0) { + /* + The general solution for ac < 0 is: + y = exp(s*x) * (c1 * cos(t*x) + c2 * sin(t*x)) - qk + where: + s = d/2 + t = sqrt(-ac)/2 + c1 = y0 + qk + c2 = (v-c1*s)/t + */ + double cos_t_x, sin_t_x; + s = d * 0.5; + t = sqrt(-ac) * 0.5; + exp_s1_x = exp(s*deltaT); + cos_t_x = cos(t*deltaT); + sin_t_x = sin(t*deltaT); + c1 = y + qk; + c2 = (v - c1*s ) / t; + *newy = exp_s1_x * ( c1*cos_t_x + c2*sin_t_x ) - qk; + *newv = exp_s1_x * ( (c1*s+c2*t) * cos_t_x + (c2*s-c1*t) * sin_t_x ); + } + else { + /* + The general solution for ac = 0 is: + y = (c1 + c2*x) * exp(s*x) - qk + where: + s = d/2 + c1 = y0 + qk + c2 = v - c1*s + */ + s = 0.5*d; + c1 = y + qk; + c2 = v - c1*s; + exp_s1_x = exp(s*deltaT); + *newy = (c1 + c2*deltaT) * exp_s1_x - qk; + *newv = (c2 + (c1 + c2*deltaT)*s) * exp_s1_x; + } +} + + +/* + * calcCoefficients : Calculate CLift and friends + */ + +static void +calcCoefficients(craft * c, double *CLift, double *CDrag) +{ + + double CDAlpha, CDBeta; + craftType *p = c->cinfo; + double h, base, k; + +/* + * We used to interpolate these values, but now use several characteristic + * equations to compute these values for a given alpha value. The basic + * formulas are: + * + * + * C = C + (alpha * (C + sin(curFlap) * cFlap )) + * L LOrigin LSlope + * + * + * C = zero-lift-wave-and-body-drag + induced-drag + + * D speed-brake-drag + flap drag + landing-gear-drag + + * drag-based-on-sideslip + * + * There are independent equations defining drag resulting from alpha + * and beta values. The hypoteneuse of those two values becomes the + * resultant CDrag value. + */ + + *CLift = interpolate_value(p->CLift, c->alpha); + + if( damage_isFunctioning(c, SYS_FLAPS) ) + *CLift += sin(c->curFlap) * p->cFlap; + + /* + Rough estimation of the ground effect correction to the CLift: + FIXME: also the drag coeff. should be corrected + */ + + /* Height of the wing aerodynamic center above the ground (ft): */ + h = units_METERStoFEET(c->w.z - terrain_localAltitude(c)) + p->wingh; + /* Limit ground effect, or we would "float" over the terrain... */ + if( h < 1.0 ) + h = 1.0; + base = h / p->wings; + /* Compute the expensive pow() only if k will be > 1.001: */ + if ( base < 8.5 ) { + /* Ground effect correction coefficient to the CLift: */ + k = 1.0 + 0.025 * pow(base, -1.5); + *CLift *= k; + } + + CM = p->cmSlope + c->damageCM; + + CDAlpha = interpolate_value(p->CDb, c->mach) + + *CLift * *CLift / (M_PI * p->aspectRatio); + if( damage_isFunctioning(c, SYS_SPEEDBRAKE ) ) + CDAlpha += sin(c->curSpeedBrake) * p->cSpeedBrake; + if( damage_isFunctioning(c, SYS_FLAPS) ) + CDAlpha += sin(c->curFlap) * p->cFlapDrag; + + CDAlpha += gear_get_drag(c); + + if (fabs(c->beta) > p->betaStall) + CN = interpolate_value(p->CnBeta, fabs(c->alpha)) * fabs(sin(c->beta)); + else + CN = interpolate_value(p->CnBeta, fabs(c->alpha)); + + CDBeta = p->CDBOrigin + p->CDBFactor * + sin(c->beta + p->CDBPhase); + + *CDrag = sqrt(CDAlpha * CDAlpha + CDBeta * CDBeta); + + C_Y = p->CYbeta * c->beta /* * fabs(cos(c->beta))*/; + +} + + +double +pm_heading(VPoint * x) +{ + + return atan2(x->y, x->x); +} + +void +pm_euler(craft * c) +{ + VMatrixToEuler(&c->AXYZtoNED, &c->curRoll, &c->curPitch, &c->curHeading); +} + + +void +pm_calcGForces(craft * c, VPoint * f, double w) +{ + + VPoint t, t1; + double m_slugs; + + m_slugs = w / units_earth_g; + + t = *f; + t.x = t.x / m_slugs; + t.y = t.y / m_slugs; + t.z = t.z / m_slugs; + + VReverseTransform_(&t, &c->AXYZtoNED, &c->linAcc); + + t.z -= units_earth_g; + + VReverseTransform_ (&t, &c->AXYZtoNED, &t1); + + c->G.x = t1.x / units_earth_g; + c->G.y = t1.y / units_earth_g; + c->G.z = t1.z / units_earth_g; + +} + + +static void +calcAlphaBetaVT(craft * c) +{ + VPoint C, air, *wind; + double delta; + + wind = air_get_wind(c->w.z); + + air.x = c->Cg.x + wind->x; + air.y = c->Cg.y + wind->y; + air.z = c->Cg.z + wind->z; + + VReverseTransform_(&air, &c->AXYZtoNED, &C); + + c->alpha = atan2(C.z, sqrt(C.y * C.y + C.x * C.x)); + c->beta = atan2(C.y, C.x); + c->VT = VMagnitude(&C); + delta = c->air.p / units_P0; + c->IAS = C.x * sqrt(c->air.rho / units_RHO_0) + /* compressibility correction */ + /* FIXME: mach no. is in the direction of VT, not x ! */ + * (1.0 + 1.0/8*(1.0 - delta)*c->mach*c->mach); + if (c->IAS < 0.0) + c->IAS = 0.0; +} + + +static double +elevatorSetting(craft * c) +{ + double s; + + s = c->pitchComm + aps_get_delta_elevator(c) + c->SeTrim; + if (s < -1.0) s = -1.0; + if (s > +1.0) s = +1.0; + c->Se = s; + + return s; +} + +static double +aileronSetting(craft * c) +{ + double s; + + if( ! damage_isFunctioning(c, SYS_WINGS) ) + return 0.0; + + s = c->rollComm + aps_get_delta_ailerons(c) + c->SaTrim; + if (s < -1.0) s = -1.0; + if (s > +1.0) s = +1.0; + c->Sa = s; + + return s; +} + +static double +rudderSetting(craft * c) +{ + double s; + + s = c->rudderComm + aps_ac_get_delta_rudder(c); + if (s < -1.0) s = -1.0; + if (s > +1.0) s = +1.0; + c->Sr = s; + + return s; +} + +char * +pm_flightCalculations(craft * c) +{ + + craftType *p = c->cinfo; + double qS, s, CLift, CDrag, Sr; + double ClBeta; + double FLift, FDrag, FWeight, FSideForce; + double deltaRoll, deltaPitch, deltaYaw; + double y, newy; + double xa, inertia, torque, xd, r0; + double dNorth, dEast, dmag, dHeading_rad; + double mass_slugs; + VPoint F, M, Fg, aeroF, aeroM, gearF, gearM, thrF, thrM; + VMatrix mtx, new_AXYZtoNED; + dis_entity_appearance appearance; + char *killReason; + + air_update(&c->air, units_METERStoFEET(c->w.z)); + c->prevSg = c->Sg; + calcAlphaBetaVT(c); + Sr = rudderSetting(c); + +/* + * A note about thrust: Normal thrust diminishes in proportion to the + * decrease in air density. + */ + + c->mach = c->VT / c->air.mach1; + + appearance = dis_if_getEntityAppearance(c->disId); + appearance &= ~(DISAppearanceAirAfterburnerOn | DISAppearancePlatformPowerplantOn); + +/* + Update thrust reverse position +*/ + + if( c->thrust_reverse_on ){ + /* deploy thrust reverser within 2 s */ + c->thrust_reverse_pos -= deltaT / 2.0; + if( c->thrust_reverse_pos < -0.5 ) + c->thrust_reverse_pos = -0.5; + } else { + /* retract thrust reverser within 2 s */ + c->thrust_reverse_pos += deltaT / 2.0; + if( c->thrust_reverse_pos > 1.0 ) + c->thrust_reverse_pos = 1.0; + } + +/* + Total engine force and moment. +*/ + + c->curThrust = (*p->thrust) (c); + if (c->flags & FL_AFTERBURNER) { + appearance |= DISAppearanceAirAfterburnerOn; + } + appearance |= DISAppearancePlatformPowerplantOn; + dis_if_setEntityAppearance(c->disId, appearance); + + VSetPoint(&thrF, c->thrust_reverse_pos * c->curThrust, 0.0, 0.0); + VSetPoint(&thrM, 0.0, 0.0, 0.0); + +/* + Compute the resultant aerodynamic force vector on the aircraft. By the + way, the variable "qS" should more properly be named "qS" -- it is the + dynamic pressure times S, the reference wing area. +*/ + + calcCoefficients(c, &CLift, &CDrag); + ClBeta = interpolate_value(p->ClBeta, fabs(c->alpha)); + + qS = c->air.rho * p->wingS * c->VT * c->VT * 0.5; + if( damage_isFunctioning(c, SYS_WINGS) ) + FLift = CLift * qS; + else + FLift = 0.5 * CLift * qS; + FDrag = CDrag * qS; + FSideForce = C_Y * qS; + FWeight = p->emptyWeight + c->fuel + c->payload; + +/* + Detect wings structural maximum limit. Note that FLift sign is reversed + respect to the aircraft z axis so that FLift is positive when the + craft is pulled up. +*/ + + if( FLift > p->maxLoadZPositive ){ + c->damageBits |= SYS_WINGS | SYS_FLAPS + | SYS_SPEEDBRAKE | SYS_HYD1 | SYS_HYD2; + prompt_craft_print(c, "WINGS FAILURE due to excessive positive load"); + } else if( FLift < - p->maxLoadZNegative ){ + c->damageBits |= SYS_WINGS | SYS_FLAPS + | SYS_SPEEDBRAKE | SYS_HYD1 | SYS_HYD2; + prompt_craft_print(c, "WINGS FAILURE due to excessive negative load"); + } + +/* + Warn the pilot when the wings load exceeds 75% of maximum load. +*/ + + if( FLift > 0.75*p->maxLoadZPositive + || FLift < -0.75 * p->maxLoadZNegative ) + c->damageBits |= FLAG_MAX_G_LOAD; + else + c->damageBits &= ~FLAG_MAX_G_LOAD; + +/* + * Set stall warning flag. + */ + + if( ! gear_allWheelsGroundContact(c) + && c->alpha > c->cinfo->alpha_stall ) + c->damageBits |= FLAG_STALL_WARN; + else + c->damageBits &= ~FLAG_STALL_WARN; + +/* + Total aerodynamic force and moment. + These expressions convert lift and drag forces from wind axes to the + aircraft fixed axes. The conversion is based on the wind to + aircraft transformation matrix supplied in "Airplane Design" by + Donald Crawford (page 90). +*/ + + VSetPoint(&aeroF, + FLift * sin(c->alpha) - FDrag * cos(c->alpha) * cos(c->beta), + - FDrag * sin(c->beta) + FSideForce, + -FLift * cos(c->alpha) - FDrag * cos(c->beta) * sin(c->alpha)); + +/* + * Aerodynamic torque (for future improvements, for example engine torque, + * landing gear torque, etc.): + */ + + VSetPoint(&aeroM, 0.0, 0.0, 0.0); + +/* + Detect if speed is greater than the maximum allowed speed Vne: +*/ + + if( p->Vne > 0.0 + && c->IAS > units_KTtoFPS(p->Vne) + && (c->damageBits & SYS_WINGS) == 0 ){ + c->damageBits |= SYS_WINGS | SYS_FLAPS | SYS_SPEEDBRAKE; + prompt_craft_print(c, "WINGS FAILURE due to excessive airspeed"); + } + +/* + With flaps deployed, detect if speed is greater then the maximum allowed + speed Vfe: +*/ + + if( p->Vfe > 0.0 + && c->curFlap > 0.0 + && c->IAS > units_KTtoFPS(p->Vfe) + && (c->damageBits & SYS_WINGS) == 0 ){ + c->damageBits |= SYS_FLAPS; + c->curFlap = 0.0; + c->flapSetting = 0.0; + prompt_craft_print(c, "FLAPS FAILURE due to excessive airspeed"); + } + + +/* + * Compute forces and moments due to the wheels friction on the terrain + */ + + killReason = gear_ground_dynamics(c, &gearF, &gearM); + if( killReason != NULL ) + return killReason; + +/* + Total force and moment. + FIXME: weight still missing. + */ + + F.x = aeroF.x + gearF.x + thrF.x; + F.y = aeroF.y + gearF.y + thrF.y; + F.z = aeroF.z + gearF.z + thrF.z; + + M.x = aeroM.x + gearM.x + thrM.x; + M.y = aeroM.y + gearM.y + thrM.y; + M.z = aeroM.z + gearM.z + thrM.z; + +/* + * Compute fuel consumption + */ + + c->fuel -= planes_fuelUsed(c) + c->leakRate * deltaT; + if (c->fuel < 0.0) + c->fuel = 0.0; + +/* + * Resolve roll-axis (X-axis) changes + */ + +/* + FIXME: to avoid divisions by zero, c->VT cannot be == 0, that's why + of this 0.001 term. +*/ + xa = p->wings * p->wings * p->wingS * c->air.rho * (c->VT + 0.001) * p->Clp; + inertia = p->I.m[0][0]; +/* + FIXME: the momentum M is inserted in a quite arbitrary + point, check if this is the correct one. +*/ + torque = qS * p->wings * 2.0 * + (p->Clda * - aileronSetting(c) * p->maxAileron + + ClBeta * c->beta + + p->Cldr * Sr * p->maxRudder) + //+ M.x /* FIXME: check */ + + c->damageCL * qS; + xd = c->p + torque / xa; + r0 = xd * inertia / xa; + deltaRoll = xd * inertia / xa * exp(xa / inertia * deltaT) + - deltaT * torque / xa - r0; + //c->p = xd * exp(xa / inertia * deltaT) - torque / xa; + c->p = xd * exp(xa / inertia * deltaT) - torque / xa + gearM.x / inertia * deltaT; + +/* + * Resolve pitch-axis (Y-axis) changes + */ + + y = c->alpha + elevatorSetting(c) * p->effElevator; + twoOrder(CM * qS * p->c / p->I.m[1][1], + (0.25 * p->wingS * c->air.rho * p->c * p->c * + c->VT * p->Cmq) / p->I.m[1][1], + M.y / p->I.m[1][1], + y, c->q, &newy, &(c->q)); + deltaPitch = newy - y; + +/* + * Resolve yaw-axis (Z-axis) changes. + * + * We do some trickery here. + * If the absolute value of the sideslip angle is greater than 90 degrees, + * we trick the code into believing that the sideslip angle is the negative + * of its reciprocal value (e.g. -176 becomes -4 degrees). We do this with + * the (somewhat inaccurate) assumption that the CN value for that angle is + * roughly equal to the other. + */ + + y = Sr * p->effRudder - c->beta; + + if (y > M_PI / 2.0) { + y = M_PI - y; + } + else if (y < -M_PI / 2.0) { + y = -M_PI - y; + } + + s = p->wings; + twoOrder(CN * qS * s / p->I.m[2][2], + (p->wingS * c->air.rho * s * s * + c->VT * p->Cnr) / p->I.m[2][2], + M.z / p->I.m[2][2], + y, c->r, &newy, &(c->r)); + deltaYaw = newy - y; + +/* + * Compute new aircraft trihedral, but don't set it yet. + */ + + VEulerToMatrix(deltaRoll, deltaPitch, deltaYaw, &mtx); + VMatrixMultByRank(&mtx, &c->AXYZtoNED, &new_AXYZtoNED, 3); + + +/* + * Transform the total force F in AXYZ into Fg in NED and add weight + */ + + VTransform_(&F, &c->AXYZtoNED, &Fg); + Fg.z += FWeight; + + pm_calcGForces(c, &Fg, FWeight); + +/* + * Update our position (in flight mode). + */ + mass_slugs = FWeight / units_earth_g; + + dNorth = units_FEETtoMETERS(c->Cg.x * deltaT + Fg.x / mass_slugs * halfDeltaTSquared); + dEast = units_FEETtoMETERS(c->Cg.y * deltaT + Fg.y / mass_slugs * halfDeltaTSquared); + c->w.z -= units_FEETtoMETERS(c->Cg.z * deltaT + Fg.z / mass_slugs * halfDeltaTSquared); + + dmag = sqrt(dNorth * dNorth + dEast * dEast); + + dHeading_rad = 0.0; + + earth_updateLatLonEx (&c->w, + dNorth / dmag, dEast / dmag, dmag, &dHeading_rad); + +/* + * Update velocity vector based on acceleration + */ + + c->Cg.x += Fg.x / mass_slugs * deltaT; + c->Cg.y += Fg.y / mass_slugs * deltaT; + c->Cg.z += Fg.z / mass_slugs * deltaT; + +/* + * Now rotate the trihedral and velocity vector to reflect the change + * in heading at the new spheroid location. + */ + + VIdentMatrix( &mtx ); + VRotate( &mtx, ZRotation, dHeading_rad ); + VMatrixMultByRank( &mtx, &new_AXYZtoNED, &c->AXYZtoNED, 3 ); + c->AXYZtoNED = new_AXYZtoNED; + VTransform_(&c->Cg, &mtx, &c->Cg); + + pm_euler(c); + + if( c->w.z - terrain_localAltitude(c) <= 0.0 ){ + if( ! damage_isFunctioning(c, SYS_WINGS) ) + return "crash due to structural failure"; + else if( c->Cg.z > 30.0 /* ft/s */ ) + return "crash on ground"; + else + return "main landing gear wasn't down and locked or it was damaged"; + } + + earth_LatLonAltToXYZ(&c->w, &c->Sg); + + earth_generateWorldToLocalMatrix(&c->w, &c->XYZtoNED); + + aps_update( c ); + + return NULL; +} + + +double pm_normalize_roll(double roll) +{ + while( roll < M_PI ) roll += 2*M_PI; + while( roll > M_PI ) roll -= 2*M_PI; + return roll; +} + + +double pm_normalize_pitch(double pitch) +{ + while( pitch < -M_PI/2 ) pitch += 2*M_PI; + while( pitch > M_PI/2 ) pitch -= 2*M_PI; + return pitch; +} + + +double pm_normalize_yaw(double yaw) +{ + while( yaw < 0 ) yaw += 2*M_PI; + while( yaw >= 2*M_PI ) yaw -= 2*M_PI; + return yaw; +} + + +void pm_hud_strings_alloc(craft *c) +{ + int i; + + for( i=0; i<6; i++ ){ + if( c->leftHUD[i] == NULL ) + c->leftHUD[i] = memory_allocate(32, NULL); + c->leftHUD[i][0] = '\0'; + + if( c->rightHUD[i] == NULL ) + c->rightHUD[i] = memory_allocate(32, NULL); + c->rightHUD[i][0] = '\0'; + } +} + + +void pm_hud_strings_free(craft *c) +{ + int i; + + for( i=0; i<6; i++ ){ + memory_dispose(c->leftHUD[i]); c->leftHUD[i] = NULL; + memory_dispose(c->rightHUD[i]); c->rightHUD[i] = NULL; + } +} + + +void pm_thrust_reverse_toggle(craft *c) +{ + if( c->thrust_reverse_on ){ + c->thrust_reverse_on = FALSE; + + /* thrust setting must be idle to activate reverser: */ + } else if( c->cinfo->hasThrustReverser + && c->throttleComm <= 32768 * 25 / 100 ){ + c->thrust_reverse_on = TRUE; + } +} + + +void pm_after_burner_toggle(craft *c) +{ + if ( c->cinfo->maxThrust != c->cinfo->maxABThrust ) + c->flags ^= FL_AFTERBURNER; +} + + +void pm_after_burner_on(craft *c) +{ + if ( c->cinfo->maxThrust != c->cinfo->maxABThrust ) + c->flags |= FL_AFTERBURNER; +} + + +void pm_after_burner_off(craft *c) +{ + c->flags &= ~FL_AFTERBURNER; +} + + +double +pm_mag_heading(craft * c) +{ + // Update local magnetic declination. + if (curTime >= c->updActualMagneticField) { + wmm_MagneticField mf; + wmm_getMagneticField(0.0, c->w.latitude, c->w.longitude, c->w.z, &mf); + VSetPoint(&c->actualMagneticField, mf.X, mf.Y, mf.Z); + c->actualLocalVAR = - mf.Decl; + // Update mag. var. every 1 NM or every 10 s, whichever comes first: + double dt = units_NmToFeetFactor / (1.0 + c->VT); + if( dt > 10.0 ) + dt = 10.0; + c->updActualMagneticField = curTime + dt; + } + + // Indicated magnetic field smoothly follows the calculated one: + if (curTime >= c->updIndicatedMagneticField) { + double k = 0.01; + c->indicatedMagneticField.x += k * (c->actualMagneticField.x - c->indicatedMagneticField.x); + c->indicatedMagneticField.y += k * (c->actualMagneticField.y - c->indicatedMagneticField.y); + c->indicatedMagneticField.z += k * (c->actualMagneticField.z - c->indicatedMagneticField.z); + c->indicatedLocalVAR += k * (c->actualLocalVAR - c->indicatedLocalVAR); + c->updIndicatedMagneticField = curTime + 0.1; + } + + return pm_normalize_yaw( c->curHeading + c->indicatedLocalVAR ); +} diff -Nru acm-5.0/src/acm/pm.h acm-6.0+20200416/src/acm/pm.h --- acm-5.0/src/acm/pm.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/pm.h 2020-04-16 12:05:40.000000000 +0000 @@ -0,0 +1,756 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1998 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +/** + * Plane management data structures and routines. Basically, the core of all + * tools needed for the ACM simulation are defined here. + * + * @author Riley Rainey + * @license GNU GPL + * @version $Date: 2020/01/08 06:10:19 $ + * @file + */ + +#ifndef _pm_h +#define _pm_h + +#include "../V/Vlibmath.h" +#include "../V/VObjects.h" +#include "../util/gui.h" +#include "inventory.h" +#include "manifest.h" +#include "scale.h" +#include "air.h" +#include "zones.h" + +#ifdef pm_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +#ifdef WINNT + typedef BOOL _BOOL; +#else + typedef int _BOOL; +#endif + +#ifndef TRUE + #define TRUE 1 + #define FALSE 0 +#endif + +/* + * Each rendering window has a _viewer structure which may be in one + * of several states. + */ + +#define ViewerStateNormal 0 /* just a plane that we control */ +#define ViewerStateBrowsing 1 /* not yet associated with an entity */ +#define ViewerStatePiggyback 2 /* a stealth glued to an entity */ +#define ViewerStateControlPending 3 /* requested control of an entity */ +//#define ViewerStateControlling 4 /* have control of another entity (FIXME: not used) */ + +/** + * Cockpit view from a specific aircraft is rendered through this object. + */ +typedef struct viewer { + + /** Linked list of all active rendering viewers. */ + struct viewer *vl_next; + + /** + Next viewer attached to this craft. Since usually there is + just only one viewer per craft, this field is usually NULL. + */ + struct viewer *next; + + /** One of the ViewerState* constants. */ + int viewer_state; + + /** Associated aircraft. */ + struct craft *c; + + /** Associated craft when in stealth mode. */ + struct craft *watchedCraft; + + /** + * The window. Users' input and window events are read from here, but + * drawing is always performed into the z-buffer first. + */ + gui_Type *gui; + + /** If the window has focus, then may receive keyboard and mouse input. */ + _BOOL hasFocus; + + /** If users' input is currently accepted or "don't touch anything" mode. */ + _BOOL hasComm; + + /** 2-D off-screen drawing device with z-buffer. */ + Alib_Window *w; + + /** 3-D off-screen drawing device bound to the z-buffer. */ + Viewport *v; + + /** Cockpit view direction as a vector in AXYZ. */ + VPoint viewDirection; + + /** "Up" direction in AXYZ. */ + VPoint viewUp; + + /** Organize HUD drawing around (xCenter,hud_yCenter). */ + int hud_yCenter; + + /** Zoom factor (percent). */ + int zoom; + + /** + * If HUD mode, otherwise it is "classic panel mode". This is a + * read-only flag, as it set by (indows_resizePlayerWindow(). + */ + _BOOL hud_mode; + + /** Classic mode: timer and APS lights stripe area. */ + Alib_Rect stripe; + /** Classic mode: turn and slip indicator area. */ + Alib_Rect turn; + /** Classic mode: air speed indicator area. */ + Alib_Rect anemometer; + /** Classic mode: attitude indicator area. */ + Alib_Rect attitude; + /** Classic mode: altimeter indicator area. */ + Alib_Rect altimeter; + /** Classic mode: vertical speed indicator area. */ + Alib_Rect vsi; + + /** Alarm and status lights area. */ + Alib_Rect lights; + /** Radard altimeter area. */ + Alib_Rect radar_altimeter; + /** Tuner area. */ + Alib_Rect tuner; + /** Area shared by HSI, ADF and radar. */ + Alib_Rect indicator; + /** Gear, flaps and max bank area. */ + Alib_Rect gear; + /** Engine RPM and throttle area. */ + Alib_Rect engine; + + /** HUD, altitude stripe. */ + scale_Type altScale; + /** HUD, air speed stripe. */ + scale_Type velScale; + /** HUD, heading stripe. */ + scale_Type hdgScale; + + /** HUD, overall x scale factor. */ + double xscaleFactor; + /** HUD, overall y scale factor. */ + double yscaleFactor; + + /** Previous radar frame. */ + Alib_Segment radarImage[1024]; + + int radarImageCount; + + /** First drawn DIS entity in RM_DIS_BROWSE. */ + int browseBase; + + int browseSelectedItem; + + unsigned long browseClickTime; + + /* + Private data structures handled by the corresponding modules: + */ + void *hud; /* see hud module */ + void *magnetic_compass; /* see magnetic_compass module */ + void *hsi; /* see hsi module */ + void *adf; /* see adf module */ + void *sounds; /* see sounds module */ + void *inst; /* see instruments module */ + void *terminal; /* see terminal module */ + void *prompt; /* see prompt module */ +} viewer; + + +/** + * Radar tracking information. + */ +typedef struct { + int beamID; /* index number of beam */ + VPoint rel; /* location relative to radar set */ + double d; /* distance to target (ft) */ + int targetID; /* craft id of target */ + int locked; /* 1=we have a "lock" */ + int altDisplay_kft; /* altitude readout (ft x 1000) */ + int headingDisplay_deg; /* ground track of target */ + int x, y; +} radarInfo; + + +/** Alias for the (quite obscure for me) "trihedral" craft struct field. */ +#define AXYZtoNED trihedral + +/** + * State of the aircraft. Also missiles, drop bombs, cannon bursts, runways, + * land features and explosion effects all share this same struct, although some + * fields may have a slightly different meaning or aren't used at all. + * + * The involved reference frames are all right-handled: + * + * - XYZ: world reference frame. + * + * - AXYZ: aircraft reference frame, center in CM, x longitudinal + * pointing forward, y pointing rightward and z pointing + * downward. + * + * - NED: center=aircraft CM, x toward geographic north, y east, + * z downward. + * + * The involved matrices are: + * + * - c->trihedral or c->AXYZtoNED is a pure rotational matrix from AXYZ to NED. + * + * - c->XYZtoNED is a roto-translational matrix from XYZ to NED. + * + * The Euler angles, giving the angular rotations to pass from NED to AXYZ, + * are so normalized (sorted in order of application to obtain the actual + * aircraft orientation): + * + * - c->curHeading rotation around z, [0,2*PI[ + * - c->curPitch rotation around y, [-PI/2,PI/2] + * - c->curRoll rotation around x, [-PI,PI] + * + * + * In some cases, this data structure belongs to an array; in other cases + * (surface objects) a double-linked list of dynamically allocated items is + * used instead. That's why there are both index-related fields (pIndex) and + * list-related fields as well (next, prev). + * + * An update() and kill() fields points to the specific dynamic update and delete + * routines mostly like this struct was a class in a object-oriented language, + * but this program does not go any further on this paradigm. + */ +typedef struct craft { + + /** Index of this structure in the container vector. */ + int pIndex; + + /** Previous craft in a doubly-linked list. */ + struct craft *prev; + + /** Next craft in in a doubly-linked list. */ + struct craft *next; + + /** Status flags, see FL_* constants. */ + unsigned long flags; + + /** Craft type, see CT_* constants. */ + int type; + + /** Name of the player. */ + char name[32]; + + /** DIS force this plane belongs to. */ + DISForce force; + + /** Creation time (simulation time, s). */ + double createTime; + + /** + * For real local players, the zone the craft is currently flying over. + * For runways and features implemented through this same data struct, + * it is the zone from which that item was loaded from. + * For munitions and remote crafts it is set to NULL. + */ + zone_Type *zone; + + /** + * List of viewers windows looking through the windshield of this craft. + */ + viewer *vl; + + /** + * Transforms from aircraft XYZ to NED. The self-explaining macro "AXYZtoNED" + * could also be used instead. + */ + VMatrix trihedral; + + /** Velocity vector in NED (ft/s). */ + VPoint Cg; + + /** Airspeed (ft/s). */ + double VT; + + /** Indicated air speed (ft/s). */ + double IAS; + + /** Position in geocentric frame XYZ (m). */ + VPoint Sg; + + /** Position as geodetic coordinates. */ + earth_LatLonAlt w; + + /** Properties of the surrounding air. */ + air_Properties air; + + /** Current Mach number. */ + double mach; /* current Mach number */ + + /** + * Altitude over the terrain (m). + * BEWARE: this field is for internal use only of the terrain module; + * client code should invoke terrain_altitude() instead. + */ + double terrain_altitude; + + /** + * Scheduled update of the local terrain altitude. For internal use only of + * the terrain module. + */ + double terrain_altitude_timeout; + + /** Geocentric to NED transformation. */ + VMatrix XYZtoNED; + + /** Euler angle of heading vs. NED (RAD). */ + double curHeading; + + /** Euler angle of pitch vs. NED (RAD). */ + double curPitch; + + /** Euler angle of bank vs. NED (RAD). */ + double curRoll; + + /** Roll rate (RAD/s). */ + double p; + + /** Pitch rate (RAD/s). */ + double q; + + /** Yaw rate (RAD/s). */ + double r; + + /** Angle of attack (RAD). */ + double alpha; + + /** Angle of sideslip (RAD). */ + double beta; + + /** G-force in aircraft frame (units of "g"). */ + VPoint G; + + /** Acceleration in aircraft frame (ft/s^2). */ + VPoint linAcc; + + /** Last interval's Sg value (m). Unsure if still needed. */ + VPoint prevSg; + + /** Pilot's pitch command [-1.0,1.0]. */ + double pitchComm; + + /** Pilot's roll command [-1.0,1.0]. */ + double rollComm; + + /** Pilot's steer command [-1.0,1.0]. */ + double steerComm; + + /** Pilot's rudder command [-1.0,1.0]. */ + double rudderComm; + + /** Pilot's throttle command [0,32768]. */ + int throttleComm; + + /** Elevator position [-1.0,1.0]. */ + double Se; + + /** Ailerons position [-1.0,1.0]. */ + double Sa; + + /** Rudder position [-1.0,1.0]. */ + double Sr; + + /** Pitch trim setting. */ + double SeTrim; + + /** Roll trim setting. */ + double SaTrim; + + /** Current thrust value (lbf). */ + double curThrust; + + /** Pilot's thrust reverser command. */ + _BOOL thrust_reverse_on; + + /** + * Thrust reverser factor [-0.5 .. +1.0]. The actual thrust that pushes the + * aircraft is a vector directed as the x axis and with module + * curThrust*thrust_reverse_pos, possibly yielding a negative value. + */ + double thrust_reverse_pos; + + /** Actual flaps position (RAD). */ + double curFlap; + + /** Flaps command position (RAD). */ + double flapSetting; + + /** Current speed brake position (RAD). */ + double curSpeedBrake; + + /** Current target speed brake setting (RAD). */ + double speedBrakeSetting; + + /** Landing gear module state - see gear.h. */ + void * gear; + + /** Thrust setting [0,32768]. */ + int throttle; + + /** Engine RPM [0.0,1.0]. */ + double rpm; + + /** Current fuel on board (lb). */ + double fuel; + + /** Payload (lb). */ + double payload; + + /** Bit flags of damaged subsystems. */ + long damageBits; + + /** Damage pts that can be absorbed. */ + long structurePts; + + /** Fuel leakage rate (lb/s). */ + double leakRate; + + /** Damage induced roll. */ + double damageCL; + + /** Damage induced pitch. */ + double damageCM; + + /** Shared panel current mode: radar, HSI or ADF. */ + int radarMode; + + /** General craft information. */ + craftType *cinfo; + + /** Time of next Radar frame. */ + double nextRadarTime; + + /** Our primary "threat". */ + short curRadarTarget; + + /** Distance to primary target [ft]. */ + double targetDistance; + + /** Closure rate on primary target [ft/s]. */ + double targetClosure; + + /** Used by radar and missile. */ + VPoint relPos[manifest_MAXPLAYERS]; + + /** Radar strength seen by us from other craft. */ + double rval[manifest_MAXPLAYERS]; + + /** Radar target information: relative positions of possible targets. */ + radarInfo rinfo[32]; + + /** Number of entries used in rinfo. */ + int rtop; + + /** Strings in upper left corner of HUD reserved for weapons' status. */ + char *leftHUD[6]; + + /** Strings in upper right corner of HUD reserved for radar target info. */ + char *rightHUD[6]; + + /** Index of currently selected weapon in wtbl[]. */ + int curWeapon; + + /** What's at each weapon station. */ + weaponStation station[manifest_STATIONS]; + + /** + * Handle assigned by dis_if module to this craft to retrieve associated + * DIS state. + */ + int disId; + + /* + * Magnetic field data at the location of the aircraft. Since the + * calculation is a bit expensive, we store here the last current value + * calculated and the time we expect it to be updated; the indicated value + * smoothly follows the current one. + */ + + /** + * If HUD and HSI have to display magnetic header rather than geographic + * heading. Always true in "classic instruments" mode. Always false for + * drones (no need to calculate Earth's magnetic field for them). + */ + int showMag; + + /** + * Latest calculated magnetic field components in NED (nT). + * This field periodically updated only if showMag is true. + */ + VPoint actualMagneticField; + + /** + * Latest calculated magnetic variation, positive west (RAD). + * This field periodically updated only if showMag is true. + */ + double actualLocalVAR; + + /** + * Scheduled update of the local magnetic field data (s). Normally this is + * done every 10 s, but at higher speed an update is forced early. + */ + double updActualMagneticField; + + /** + * Indicated magnetic field components in NED (nT). Smoothly follows the + * latest calculated value. + */ + VPoint indicatedMagneticField; + + /** + * Indicated local magnetic variation, positive west (RAD). Smoothly follows + * the latest calculated value. + */ + double indicatedLocalVAR; + + /** + * When to update the indicated magnetic field so that it smoothly follows + * the actual calculated value (s). + */ + double updIndicatedMagneticField; + + /** + * Drone module private data, set when this aircraft is created as a drone + * or a player enables the drone mode -- see drone module. + */ + void *drone; + + /** Autopilot System private data -- see aps module. */ + void *aps; + + /** Effects private data -- see effects module. */ + void *effects; + + /* Munition handling (see dis_if.c, ccip.c, missile.c): */ + double offset; + long tracerMod; + int tracerVal; + double interval; + short rounds; + int owner; + double armTimer; + + /** + * Internal state update procedure bound to this specific craft. + * Local entities must also send their new state to the DIS module, while + * for remote entities the state can be retrieved from the DIS module. + * May return the kill reason, or NULL if still alive. + */ + char *(*update)(struct craft *c); + + /** + * Kill procedure to call before removal bound to this specific craft. + * The kill reason can be set by the update procedure itself, or by client. + */ + void (*kill)(struct craft *c, char *reason); + +} craft; + + +/* + * Craft type definitions + */ + +#define CT_FREE 0 /* an unused craft entry */ +#define CT_PLANE 1 /* a player */ +#define CT_MISSILE 2 /* an air to air missile */ +#define CT_CANNON 3 /* a stream of cannon fire */ +#define CT_SURFACE 4 /* surface object (e.g. a runway) */ +//#define CT_CHASER 5 /* a non-player "watcher" chasing a plane (FIXME: not used) */ +#define CT_DRONE 6 /* a target drone */ +#define CT_EXPLOSION 7 /* an explosion */ +#define CT_DIS_PLANE 8 /* external player (on different server) */ +#define CT_DIS_MUNITION 9 /* external tracked munition */ +#define CT_DIS_CANNON 10 /* external untracked munition (cannon) */ +#define CT_RESERVED 11 /* a reserved, uninitialized entry */ +#define CT_DIS_STEALTH 12 /* a place-holder for stealths */ +#define CT_BOMB 13 /* gravity bomb */ + +/* Flag word definitions */ + +#define FL_RECORD (1<<0) /* activate recording function */ +#define FL_AFTERBURNER (1<<1) /* afterburner state */ +#define FL_HAS_GYRO (1<<2) /* missile is gyroscope equiped */ +#define FL_FIXED_OBJECT (1<<3) /* fixed (surface) object */ +#define FL_CHASE_VIEW (1<<4) /* chase plane view */ +#define FL_BLACK_BOX (1<<5) /* object is from a black box recording */ +#define FL_BALLISTIC (1<<6) /* munition has no target */ +#define FL_RADAR_MODE_CHANGE (1<<7) /* set when user changes radar mode */ +#define FL_END_GAME_DRONE (1<<8) /* drone in CALSPAN end-game mode */ + +/* Radar mode definitions. Since radar+TEWS, ADF and HSI+HSI panel all share + * the same slots in the panel of the radar, these constants are global rather + * than being defined inside their respective modules radar.h, adf.h and hsi.h. */ + +#define RM_OFF 0 /* radar is off */ +#define RM_STANDBY 1 /* standby */ +#define RM_NORMAL 2 /* track while scan */ +#define RM_ACM 4 /* 20x30 acm */ +#define RM_STT 8 /* single target track */ +#define RM_HSI 16 /* HSI mode */ +#define RM_ADF 32 /* ADF mode */ +#define RM_DIS_BROWSE 64 /* browse entities */ + +/** Linked list of all rendering windows (normally only one). */ +EXTERN viewer *vl_head; + +/** Number of players recording info. */ +EXTERN int recordCount; + +/** Number of active entries in ptbl. */ +EXTERN int ptblCount; + +/** Number of chasers. */ +EXTERN int ctblCount; + +/** Departure timestamp (seconds since 1970-01-01T00:00:00). */ +EXTERN int departure_timestamp; + +/** + * Simulation time (s). Or, time elapsed since simulation started. + * Added to the departure timestamp gives the current (simulated) timestamp. + */ +EXTERN double curTime; + +/** List of surface objects: runways, features -- see zones module. */ +EXTERN craft *stbl; + +/** Players table, including drones, locale and remote. */ +EXTERN craft ptbl[manifest_MAXPLAYERS]; + +/** Missiles and cannon bursts table, locale and remote. */ +EXTERN craft mtbl[manifest_MAXPROJECTILES]; + +/** + * Location of the force base for resupply. The index is one of the DISForce + * constants. Currently only the 1 (DISForceFriendly) and 2 (DISForceOpposing) + * are set with the team locations read from the starting zone, if available. + * The default force base is located at 0N 0E! + */ +EXTERN earth_LatLonAlt forceBaseLocation[4]; + +/** + * Dynamics update period (s). That is, aerodynamic forces, gear dynamics and + * in general the craft state update are performed with frequency 1/deltaT Hz + * which is (or should be) much higher than the frame rate of the renderer to + * prevent numerical instability issues. + */ +EXTERN double deltaT; + +/** 0.5 * deltaT * deltaT */ +EXTERN double halfDeltaTSquared; + +/* Colors look-up table index for some colors of general usage. */ +EXTERN int HUDColor; +EXTERN int whiteColor; +EXTERN int blackColor; +EXTERN int yellowColor; +EXTERN int redColor; +EXTERN int magentaColor; +EXTERN int radarColor; +EXTERN int panelBackgroundColor; + +/** Cloud base altitude (ft). */ +EXTERN double clouds_base; + +/** Cloud top altitude (ft). No clouds if clouds_top is less or equal to clouds_base. */ +EXTERN double clouds_top; + +/** Set by arcade -a switch: never run out of ammunitions. */ +EXTERN int arcadeMode; + +EXTERN double end_game_threshold_meters; +EXTERN int end_game_mode; +EXTERN int transferEntityIdBits; +EXTERN dis_entity_id subjectEntityID; +EXTERN int subjectEntitySpecified; /* =1 if subject entity was + specified on the command line */ +/** Pilot eye dist. from screen (cm). */ +EXTERN double eye_to_screen_cm; + +/** Downward view angle over the nose (RAD). */ +EXTERN double downward_view_angle_rad; + +/** State of the zones module. */ +EXTERN zones_Type *zones; + +EXTERN void pm_calcGForces(craft * c, VPoint * f, double w); + +/** + * Performs flight dynamics calculations. Return NULL on success, + * otherwise return a string reporting the reason why the aircraft + * was destroyed. + */ +EXTERN char * pm_flightCalculations(craft * c); + +/** + * Calculate Euler angles c->curRoll, c->curPitch and c->curHeading + * from the matrix c->trihedral. It is a shorter version of + * + * VMatrixToEuler(&c->AXYZtoNED, &c->curRoll, &c->curPitch, &c->curHeading); + */ +EXTERN void pm_euler(craft * c); + +/* + These functions return the program idea of normalized Euler's + angles, as explained above describing the "craft" data type. +*/ +EXTERN double pm_normalize_roll(double roll); +EXTERN double pm_normalize_pitch(double pitch); +EXTERN double pm_normalize_yaw(double yaw); + +EXTERN double pm_heading(VPoint * x); + +EXTERN void pm_hud_strings_alloc(craft *c); +EXTERN void pm_hud_strings_free(craft *c); + +EXTERN void pm_thrust_reverse_toggle(craft *c); + +EXTERN void pm_after_burner_toggle(craft *c); +EXTERN void pm_after_burner_on(craft *c); +EXTERN void pm_after_burner_off(craft *c); + +/** + * Return current magnetic heading of the aircraft. Also updates the fields + * related to the magnetic field. +*/ +EXTERN double pm_mag_heading(craft * c); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/prompt.c acm-6.0+20200416/src/acm/prompt.c --- acm-5.0/src/acm/prompt.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/prompt.c 2017-10-22 14:48:28.000000000 +0000 @@ -0,0 +1,264 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 2007 Umberto Salsi + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#include +#include "../util/memory.h" +#include "../util/prng.h" +#include "dis_if.h" +#include "init.h" +#include "list.h" +#include "pm.h" +#include "patchlevel.h" + +#define prompt_IMPORT +#include "prompt.h" + +/** Clear current msg after ... (s). */ +#define EXPIRE_PERIOD 7.0 + +/** DIS status feedback period (s) */ +#define DIS_FEEDBACK_PERIOD 25.0 + +/** if no msgs to show, show an hint after ... (s). */ +#define HINT_PERIOD 30.0 + +static list_Type *hints; + +#define BUF_SIZE 100 + +typedef struct prompt_Line { + struct prompt_Line *next; + + _BOOL have_msg; + double expire; + char buf[BUF_SIZE]; + + double last_msg_shown_at; +} prompt_Line; + +static prompt_Line *free_list = NULL; + + +void prompt_free(viewer *u) +{ + prompt_Line *pd; + + if( u->prompt == NULL ) + return; + + pd = u->prompt; + + pd->next = free_list; + free_list = pd; + u->prompt = NULL; +} + + +static void prompt_cleanup() +{ + prompt_Line *pd; + + while( free_list != NULL ){ + pd = free_list; + free_list = pd->next; + memory_dispose(pd); + } + + memory_dispose(hints); + hints = NULL; +} + + +static int isSpace(int c) +{ + return c == ' ' || c == '\t' || c == '\r' || c == '\n'; +} + +/** + * Reads list of hints messages from the objects/hints.txt file. + * Empty lines an lines starting with '#' are ignored. + */ +static void prompt_read_hints() +{ + char line[999]; + int s_len; + char *s; + if( hints != NULL ) + return; + memory_registerCleanup(prompt_cleanup); + FILE *f = init_fopen("hints.txt", "r"); + hints = list_new(); + while( fgets(line, sizeof(line), f) != NULL ){ + s = line; + // Skip leading spaces: + while( isSpace(*s) ) + s++; + // Ignore empty and comment line: + if( *s == '#' || *s == '\0' ) + continue; + // Remove trailing spaces: + s_len = strlen(s); + while(s_len > 0 && isSpace(s[s_len-1])) + s_len--; + s[s_len] = '\0'; + // Ok, add line: + list_add_elem(hints, s); + } + fclose(f); +} + + +void prompt_viewer_print(viewer *u, char *s) +{ + prompt_Line *pd; + + if( u->prompt == NULL ){ + if( free_list == NULL ){ + pd = memory_allocate( sizeof(prompt_Line), NULL ); + memory_registerCleanup(prompt_cleanup); + } else { + pd = free_list; + free_list = pd->next; + } + pd->next = NULL; + pd->have_msg = FALSE; + pd->expire = 0.0; + pd->buf[0] = '\0'; + pd->last_msg_shown_at = -HINT_PERIOD; /* next msg shown immediately */ + u->prompt = pd; + } else { + pd = u->prompt; + } + + pd->expire = curTime + EXPIRE_PERIOD; + memory_strcpy(pd->buf, sizeof(pd->buf), s); + pd->have_msg = TRUE; +} + + +void prompt_craft_print(craft *c, char *s) +{ + viewer *v; + + v = vl_head; + + while( v != NULL ){ + if( v->c == c ) + prompt_viewer_print(v, s); + v = v->next; + } +} + + +void prompt_broadcast_print(char *s) +{ + viewer *v; + + v = vl_head; + + while( v != NULL ){ + prompt_viewer_print(v, s); + v = v->next; + } +} + + +static void draw_string(Viewport *v, prompt_Line *pd) +{ + double fh, fw, w, k; + int width, height, l, x, y; + + width = RectWidth(v->rect); + height = RectHeight(v->rect); + fh = ceil(height / 30.0); + fw = VFontWidthPixels(v, (int) (fh+0.5)); + l = strlen(pd->buf); + k = l * fw / (0.95*width); + if( k >= 1.0 ){ + fh = floor(fh/k); + fw = VFontWidthPixels(v, (int) (fh+0.5)); + } + w = fw * l; + + Alib_setClipRect(v->w, &v->rect); + x = v->rect.a.x + width/2 - w/2.0; + y = v->rect.b.y - fh; + VDrawStrokeString(v, x + 1, y, pd->buf, l, fh, blackColor); + VDrawStrokeString(v, x, y, pd->buf, l, fh, whiteColor); +} + + +void prompt_draw(viewer *u) +{ + prompt_Line *pd; + int n, i; + + if( u->prompt == NULL ){ + prompt_viewer_print(u, "**** Welcome to ACM-" + patchlevel_REVISION_STRING " ****"); + return; + } + + pd = u->prompt; + + /* + * Avoid to distract the maneuvering pilot with silly messages: + */ + if( fabs(u->c->G.x) + fabs(u->c->G.y) + fabs(u->c->G.z + 1) > 0.2 ) + pd->last_msg_shown_at = curTime + HINT_PERIOD; + + + if( pd->have_msg ){ + /* + * Draw current msg: + */ + if( curTime > pd->expire ){ + pd->have_msg = FALSE; + pd->last_msg_shown_at = curTime; + return; + } + + draw_string(u->v, pd); + + } else if( dis_if_readyToReceive() + && pd->last_msg_shown_at + DIS_FEEDBACK_PERIOD < curTime ) { + /* + * Show DIS protocol health state: + */ + char s[100]; + snprintf(s, sizeof(s), "DIS: %d remote entities, %.1f incoming packets/s", + dis_if_getNumberOfRemoteEntities(), + dis_if_getProcessedPacketsPerSecond()); + prompt_viewer_print(u, s); + + } else if( pd->last_msg_shown_at + HINT_PERIOD < curTime ){ + /* + * Chose another hint: + */ + if( hints == NULL ) + prompt_read_hints(); + + n = hints->n; + if( n > 0 ){ + i = prng_getIntInRange(0, n - 1); + prompt_viewer_print(u, hints->arr[i]); + } + } +} + +/* End of the prompt module. */ diff -Nru acm-5.0/src/acm/prompt.h acm-6.0+20200416/src/acm/prompt.h --- acm-5.0/src/acm/prompt.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/prompt.h 2017-09-11 15:42:49.000000000 +0000 @@ -0,0 +1,60 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 2007 Umberto Salsi + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +/** + * Simple one-line text feedback on the virtual terminal. + * @file + */ + +#ifndef _prompt_h +#define _prompt_h + +#include "pm.h" + +#ifdef prompt_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +/** Release u->prompt data. */ +EXTERN void prompt_free(viewer *u); + +EXTERN void prompt_viewer_print(viewer *u, char *s); + +/** + * Displays the given string in the cockpit area of the given + * viewer. Intended to provide to the user some feedback about events + * internal to the program that otherwise would not be noticed. The + * message get cleared after some seconds. A new message clears the + * old one. + */ +EXTERN void prompt_craft_print(craft *c, char *s); + +/** + * Broadcast the message to all the viewers. + */ +EXTERN void prompt_broadcast_print(char *s); + +/** + * The renderer module must call this to draw the current message. + */ +EXTERN void prompt_draw(viewer *u); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/radar.c acm-6.0+20200416/src/acm/radar.c --- acm-5.0/src/acm/radar.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/radar.c 2017-10-30 02:45:08.000000000 +0000 @@ -0,0 +1,1040 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1998 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#include +#include +#include +#include +#include "../V/Vlib.h" +#include "sounds.h" +#include "damage.h" +#include "dis_if.h" +#include "draw.h" +#include "pm.h" +#include "../util/error.h" +#include "../util/units.h" + +#define radar_IMPORT +#include "radar.h" + +#define RADAR_WINDOW_WIDTH 200 + +#define scanSlope 2.1445 + +#define SetSegment(s, xa, ya, xb, yb) {s.x1=u->indicator.a.x+(xa); \ + s.x2=u->indicator.a.x+(xb); s.y1=u->indicator.a.y+(ya); s.y2=u->indicator.a.y+(yb); } + + +#ifdef FIXME_NOT_USED + +typedef enum ( + RM_OFF, /* radar is off */ + RM_STANDBY, /* standby */ + RM_NORMAL, /* track while scan */ + RM_ACM, /* 20x30 acm */ + RM_STT /* single target track */ +) radar_mode; + +typedef struct _radar_data { + struct _radar_data *next; + + _BOOL enabled; + + radar_mode mode; + + Alib_Segment radarImage[1024]; /* the last radar frame */ + int radarImageCount; + +} radar_data; + +static radar_data *free_list = NULL; + +#endif + + +static char *thirty = "30"; +static Alib_Point tgt[4]; +static _BOOL tgt_valid = FALSE; +static int rftw, rfth, slot_size; + + +/** + * Calculates the matrix to rotate from geocentric to radar coordinates, so + * that the center of the radar beam is the x axis. Azimuth and elevation of the + * radar beam are referred to the aircraft system; for the record, in ACM they + * are always zero, so the the radar beam of our aircraft is always directed + * as the x axis. + * @param c Emitter. + * @param XYZtoRadar Here returns the calculated rotation from geocentric to + * radar. + * @param el_center Elevation, up positive (RAD). + * @param az_center Azimuth, left positive (RAD). + */ +static void +GenerateWorldToRadarMatrix(craft * c, VMatrix * XYZtoRadar, + double el_center, double az_center) +{ + earth_LatLonAlt *w = &c->w; + VMatrix m, ABCtoNED; + + VIdentMatrix(&m); + + VRotate(&m, ZRotation, -w->longitude); + VRotate(&m, YRotation, w->latitude); + VRotate(&m, YRotation, units_DEGtoRAD(90.0)); + + VRotate(&m, YRotation, el_center); + VRotate(&m, ZRotation, -az_center); + VMatrixTranspose(&c->trihedral, &ABCtoNED); + VMatrixMultByRank(&m, &ABCtoNED, XYZtoRadar, 3); +} + + +static void +plotNormalTarget(viewer * u, int x, int y) +{ + + SetSegment(u->radarImage[u->radarImageCount], x - 2, y - 2, x - 2, y + 2); + u->radarImageCount++; + SetSegment(u->radarImage[u->radarImageCount], x - 2, y + 2, x + 2, y + 2); + u->radarImageCount++; + SetSegment(u->radarImage[u->radarImageCount], x + 2, y + 2, x + 2, y - 2); + u->radarImageCount++; + SetSegment(u->radarImage[u->radarImageCount], x + 2, y - 2, x - 2, y - 2); + u->radarImageCount++; +} + + +static void +plotPrimaryTarget(craft * c, viewer * u, int i, int x, int y) +{ + + int xp, yp, interline; + char s[16], lr; + VPoint tmp, rel, deltaV; + + double d, cl, targetAspectAngle; + + xp = u->indicator.a.x + slot_size * 6 / 8; + yp = u->indicator.a.y + slot_size * 5 / 8; + interline = (int) (1.5 * rfth + 0.5); + + tgt_valid = TRUE; + tgt[0].x = u->indicator.a.x + x; + tgt[0].y = u->indicator.a.y + y - 4; + tgt[1].x = u->indicator.a.x + x + 4; + tgt[1].y = u->indicator.a.y + y; + tgt[2].x = u->indicator.a.x + x; + tgt[2].y = u->indicator.a.y + y + 4; + tgt[3].x = u->indicator.a.x + x - 4; + tgt[3].y = u->indicator.a.y + y; + //Alib_fill3DPolygon(u->v->w, tgt, 4, &u->rz); + Alib_fillPolygon(u->w, tgt, 4, radarColor); + +/* + * Heading of target + */ + + sprintf(s, " %3.3d", (int) (units_RADtoDEG(ptbl[i].curHeading))); + VGetStrokeString(u->v, xp, yp, + u->radarImage, &u->radarImageCount, + s, strlen(s), rfth); + +/* + * Groundspeed of target + */ + + rel.x = ptbl[i].Cg.x; + rel.y = ptbl[i].Cg.y; + rel.z = 0.0; + sprintf(s, "%3.3d K", (int) (VMagnitude(&rel) / units_NmToFeetFactor * 3600.0)); + yp += interline; + VGetStrokeString(u->v, xp, yp, + u->radarImage, &u->radarImageCount, + s, strlen(s), rfth); + +/* + * Relative heading to target. + */ + + tmp.x = units_METERStoFEET(ptbl[i].Sg.x - c->Sg.x); + tmp.y = units_METERStoFEET(ptbl[i].Sg.y - c->Sg.y); + tmp.z = units_METERStoFEET(ptbl[i].Sg.z - c->Sg.z); + VTransform_(&tmp, &c->XYZtoNED, &rel); + targetAspectAngle = ptbl[i].curHeading - pm_heading(&rel); + if (targetAspectAngle > 0.0) { + lr = 'R'; + } + else { + lr = 'L'; + targetAspectAngle = -targetAspectAngle; + } + + sprintf(s, "%3.3d %c", (int) (units_RADtoDEG(targetAspectAngle) + 0.5), lr); + yp += interline; + VGetStrokeString(u->v, xp, yp, + u->radarImage, &u->radarImageCount, + s, strlen(s), rfth); + +/* + * Closure rate + */ + + deltaV.x = ptbl[i].Cg.x - c->Cg.x; + deltaV.y = ptbl[i].Cg.y - c->Cg.y; + deltaV.z = ptbl[i].Cg.z - c->Cg.z; + d = VMagnitude(&rel); + cl = -(deltaV.x * rel.x + deltaV.y * rel.y + deltaV.z * rel.z) / d; + c->targetDistance = d; + c->targetClosure = cl; + yp += interline; + sprintf(s, "%3.3d", (int) (cl / units_NmToFeetFactor * 3600.0)); + VGetStrokeString(u->v, xp, yp, + u->radarImage, &u->radarImageCount, + s, strlen(s), rfth); + +/* + * Range to target + */ + +#define XA 40 +#define XB 150 + + xp = XA * slot_size / RADAR_WINDOW_WIDTH; + yp = rfth + 4; + sprintf(s, "%d", (int) (d / units_NmToFeetFactor)); + VGetStrokeString(u->v, xp + u->indicator.a.x, yp + u->indicator.a.y, + u->radarImage, &u->radarImageCount, + s, strlen(s), rfth); + +/* + * Altitude of target + */ + + xp = XB * slot_size / RADAR_WINDOW_WIDTH; + yp = rfth + 4; + sprintf(s, "%d", (int) (units_METERStoFEET(ptbl[i].w.z) / 1000.0)); + VGetStrokeString(u->v, xp + u->indicator.a.x, yp + u->indicator.a.y, + u->radarImage, &u->radarImageCount, + s, strlen(s), rfth); + + sprintf(c->rightHUD[0], "R_+__"); + sprintf(c->rightHUD[1], "%05.1f", d / units_NmToFeetFactor); + sprintf(c->rightHUD[2], " %4.4d", (int) (cl / units_NmToFeetFactor * 3600.0)); +} + + +static double +radarFrameInterval(craft * c) +{ + double dt = 1.0; + + switch (c->radarMode) { + case RM_OFF: + case RM_STANDBY: + dt = 1.0; + break; + case RM_NORMAL: + dt = 1.0; + break; + case RM_STT: + dt = 1.0; + break; + } + return dt; +} + + +/** + * Add information about a target that this aircraft's radar can "see". + */ +static void +addRadarInfo(craft * emitter, craft * target, double d) +{ + if (emitter->rtop < 16) { + emitter->rinfo[emitter->rtop].rel = emitter->relPos[target->pIndex]; + emitter->rinfo[emitter->rtop].d = d; + emitter->rinfo[emitter->rtop].targetID = target->pIndex; + emitter->rinfo[emitter->rtop].beamID = 0; + emitter->rinfo[emitter->rtop].locked = 0; + ++emitter->rtop; + } +} + + +/** + * Compute the radar energy arriving at the target and if the target is visible. + * @param emitter Emitter aircraft. + * @param target Possible target. + * @param XYZtoRadar Rotation from geocentric to radar system. + * @param el_ratio Emitter beam, tangent of the half sweep angle height. + * @param az_ratio Emitter beam, tangent of the half sweep angle width. + * @param energy Emitter energy irradiated in the sweep cone (W). + */ +static void +computeRadarEnergy(craft * emitter, craft * target, VMatrix * XYZtoRadar, + double el_ratio, double az_ratio, double energy) +{ + VPoint r1; + double xs, ys, d; + +/* + * Calculate the coordinates of the target relative to the craft's frame + * and the position of the radar search volume. + */ + + r1.x = units_METERStoFEET(target->Sg.x - emitter->Sg.x); + r1.y = units_METERStoFEET(target->Sg.y - emitter->Sg.y); + r1.z = units_METERStoFEET(target->Sg.z - emitter->Sg.z); + + VTransform(&r1, XYZtoRadar, &emitter->relPos[target->pIndex]); + + target->rval[emitter->pIndex] = 0.0; + + if (emitter->relPos[target->pIndex].x <= 0.0) + return; + + xs = emitter->relPos[target->pIndex].y / emitter->relPos[target->pIndex].x; + ys = emitter->relPos[target->pIndex].z / emitter->relPos[target->pIndex].x; + +/* + * If the target is inside the radiation cone, then we are painting this target + * with radar energy. Estimate the value of the energy that the target sees. + */ + + if ((fabs(xs) <= az_ratio) && (fabs(ys) <= el_ratio)) { + + d = VMagnitude(&emitter->relPos[target->pIndex]); + + target->rval[emitter->pIndex] = energy / (4.0 * M_PI * d * d); + +/* + * Can we detect that ? + */ + +/* return_energy = target->rval[emitter->pIndex] / (4.0 * M_PI * d * d); */ + +/* + * Lookdown? + */ + + if (ys > 0.0) { + d *= 4.0 / 3.0; + } + + /* + * Reject targets that would not appear on our radar set + */ + + /* + * Not a DIS platform? + */ + + if (target->cinfo->entityType.kind != DISKindPlatform) { + return; + } + + /* + * Ground-based entity? Ignore it. + */ + + if (target->cinfo->entityType.kind == DISKindPlatform && + target->cinfo->entityType.domain == DISDomainLand) { + return; + } + +/* + * For now, compute radar visibility based on fixed ranges. A better + * solution would include factoring estimated target radar cross sections, + * antenna size and radar set sensitivity. Wow. Where would you get that + * sort of information? + */ + + if (d >= emitter->cinfo->radarDRange) { + return; + } + else if (d >= emitter->cinfo->radarTRange) { + addRadarInfo(emitter, target, d); + return; + } + else { + addRadarInfo(emitter, target, d); + return; + } + } + else { + return; + } +} + + +void +radar_calculateEmissions(craft * emitter) +{ + VMatrix m1; + register int i, j, target_idx; + double el_center, az_center, el_width, az_width, el_ratio, az_ratio, e; + craft *target; + + /* Reset no. of possible targets the emitter can see: */ + emitter->rtop = 0; + + /* Reset energy the emitter puts on each other player: */ + for (i = 0; i < manifest_MAXPLAYERS; ++i) { + ptbl[i].rval[emitter->pIndex] = 0.0; + } + + /* + * Check if this emitter actually... emits anything! (save time otherwise). + * - CT_DIS_PLANE may emit, but must ask to dis_if for emission PDU. + * - CT_DIS_STEALTH I don't know what is it, but it was here in the original + * code. FIXME: check if CT_DIS_STEALTH does really emits radar beam. + * - CT_DRONE are always attacking! + * - CT_PLANE only if radar on. + */ + if ( !( + emitter->type == CT_DIS_PLANE + || emitter->type == CT_DIS_STEALTH + || emitter->type == CT_DRONE + || ( + /* local plane with radar turned on: */ + emitter->type == CT_PLANE + && (emitter->radarMode & (RM_NORMAL | RM_ACM | RM_STT)) + ) + )) { + return; + } + + /* Ask dis_if how many radar beams emits (always max 1 for ACM entities): */ + i = dis_if_getBeamCount(emitter); + + /* + * For each beam, compute: + * 1. How much energy the emitter puts on each other player. + * 2. Which other player the emitter can see. + */ + for (j = 0; j < i; ++j) { + dis_if_getRadarParameters(emitter, j, &az_center, &az_width, + &el_center, &el_width, &e); + +/* + * In the original ACM program, the dis_if.c module sets the full sweep angles + * and uses degrees for them; in this version we fixed that and we set the + * half angle in radiants. For compatibility with the original program any + * angle greater than 89*M_PI/180 RAD is assumed using the original values: + */ + + if( az_width <= 89*M_PI/180 && el_width <= 89*M_PI/180 ){ + az_ratio = tan(az_width); + el_ratio = tan(el_width); + } else { + az_ratio = tan(units_DEGtoRAD(az_width/2)); + el_ratio = tan(units_DEGtoRAD(el_width/2)); + } + +/* + * Note: the energy value returned by DIS for EM emissions is in units of + * dBm. e_dBm = 10.0 * log10 (e_watts / 0.001). + * + * Sooo, to convert to watts, we'd do this: + * + * e_watts = 1000.0 * exp10(e_dBm / 10.0); + */ + +/* + * "Transmission Test Procedures for DIS Compliance: Distributed Emission + * Regeneration Protocol Family" says that the elevation value is + * up-positive, and azimuth is left-positive; units in radians (!) + */ + + GenerateWorldToRadarMatrix(emitter, &m1, el_center, az_center); + + for (target = ptbl, target_idx = 0; target_idx < manifest_MAXPLAYERS; ++target_idx, ++target) { + + if (target->type == CT_FREE + || target->type == CT_DIS_STEALTH + || emitter == target) + continue; + + computeRadarEnergy(emitter, target, &m1, el_ratio, az_ratio, e); + } + } +} + + +void +radar_update(craft * c, viewer * u) +{ + register radarInfo *p; + Alib_Window *w; + int i, x, y, j = -1, state; + int xc, yc; + double xs, ys, dmax; + char *buf; + Alib_Segment *seg; + int primary = 0; + _BOOL time_up = FALSE; + Alib_Rect rect; + + if ( (c->radarMode & (RM_NORMAL | RM_ACM | RM_STT )) == 0 ) + return; + + rftw = (int) (0.025 * RectWidth(u->indicator) + 0.5); + rfth = (int) (1.3 * rftw + 0.5); + slot_size = RectWidth(u->indicator); + + w = u->w; + Alib_setClipRect(w, &u->indicator); + +/* + * Compute radar emissions + */ + + seg = u->radarImage; + +/* + * Are we ready to give the pilot the next frame ? If not, mark the + * radar display as an "Unchanged" area, and return. + */ + + if (curTime >= c->nextRadarTime) { + time_up = TRUE; + } + +/* + * If we fall through to here, then a redraw is required. + * There are four possible scenarios: + * + * 1) The frame redraw timer has expired. + * An entire radar frame, including target information, + * must be generated and displayed. A logical copy + * of the image is saved for possible future use. + * + * 2) The frame redraw timer has not expired, but some + * external event has triggered a frame redraw (e.g. + * the window was uncovered after being hidden). + * In this case, the frame is redrawn from the + * information used to generate the last frame. + * + * 3) The frame redraw timer has not expired, but + * the user changed radar modes. In this case, we should + * redraw just the legend information (i.e. no targets), + * save a copy of what was drawn, and reset the frame + * timer. + * + * 4) If none of the first three cases are true, then simply + * mark the screen region associated with the radar display + * as unchanged, and return. + */ + + state = 4; + + if (time_up) { + state = 1; + } + else { + if (c->flags & FL_RADAR_MODE_CHANGE) { + state = 3; + } + } + + /* + * Case 4; nothing interesting happens. Mark the display as unchanged + */ + + if (state == 4) { + /**** + FIXME This code should prevent the updating of the screen + area, but it does not work because it erases the slot to its + right (gear+flap) for some obscure reason, probably a bug in + V/SLDiff.c. Skip and continue with the regular redraw. + + ZInfo z; + z.depth = --w->depth; + z.color = UnchangedColor; + AlibFillRectangle(u->w, &rect, UnchangedColor); + return; + ****/ + + state = 1; /* full redraw */ + } + + c->flags &= ~FL_RADAR_MODE_CHANGE; + + if (state == 2) { + + Alib_fillRect(w, &rect, panelBackgroundColor); + + VDrawSegments(u->v, + u->radarImage, u->radarImageCount, radarColor); + + if (tgt_valid) { + Alib_fillPolygon(u->w, tgt, 4, radarColor); + } + return; + } + + tgt_valid = FALSE; + +/* + * Verify that the current target is still visible. + */ + + if (c->curRadarTarget != -1) { + for (i = 0, p = c->rinfo; i < c->rtop; ++i, ++p) { + if (c->curRadarTarget == p->targetID) { + p->locked = 1; + j = i; + break; + } + } + if (j == -1) { + c->curRadarTarget = -1; + dis_if_radarTargetChanged(c); + } + } + +/* + * Go find the closest radar return ... that becomes our victim. + */ + + if (state == 1) { + dmax = 1000.0 * units_NmToFeetFactor; + + if (c->curRadarTarget == -1) { + for (i = 0, p = c->rinfo, j = -1; i < c->rtop; ++i, ++p) { + if (p->d < dmax) { + dmax = p->d; + j = i; + } + } + if (j != -1) { + c->curRadarTarget = c->rinfo[j].targetID; + c->rinfo[j].locked = 1; + dis_if_radarTargetChanged(c); + sounds_playSound(c, sounds_APGLockAcquired, FALSE); + } + } + } + + xc = (slot_size + 1) / 2; + yc = (slot_size + 1) / 2; + +/* + * Fill background + */ + + Alib_fillRect(w, &u->indicator, panelBackgroundColor); + +/* + * Draw reference "thing" and the border + */ + + u->radarImageCount = 0; + SetSegment(seg[u->radarImageCount], xc, yc, xc - 5, yc + 5); + u->radarImageCount++; + SetSegment(seg[u->radarImageCount], xc - 10, yc, xc - 5, yc + 5); + u->radarImageCount++; + SetSegment(seg[u->radarImageCount], xc - 10, yc, xc - 18, yc); + u->radarImageCount++; + SetSegment(seg[u->radarImageCount], xc, yc, xc + 5, yc + 5); + u->radarImageCount++; + SetSegment(seg[u->radarImageCount], xc + 10, yc, xc + 5, yc + 5); + u->radarImageCount++; + SetSegment(seg[u->radarImageCount], xc + 10, yc, xc + 18, yc); + u->radarImageCount++; + +/* + * Radar dead? + */ + + if (damage_isFunctioning(c, SYS_RADAR) == 0) { + Alib_drawSegments(w, seg, u->radarImageCount, radarColor); + return; + } + + /* + * Radar off? + */ + + if (c->radarMode <= RM_STANDBY) { + if (c->radarMode == RM_OFF) + buf = "RADAR OFF"; + else + buf = "RADAR STBY"; + c->curRadarTarget = -1; + VGetStrokeString(u->v, u->indicator.a.x + rftw * 4, + u->indicator.a.y + rfth * 3, + seg, &u->radarImageCount, buf, strlen(buf), rfth); + return; + } + + c->nextRadarTime = curTime + radarFrameInterval(c); + +/* + * Show acm and stt HACK + */ + + if (c->radarMode == RM_ACM) { + buf = "ACM 20x30"; + VGetStrokeString(u->v, u->indicator.a.x + rftw * 4, + u->indicator.a.y + rfth * 3, + seg, &u->radarImageCount, buf, strlen(buf), rfth); + } + else if (c->radarMode == RM_STT) { + buf = "STT"; + VGetStrokeString(u->v, u->indicator.a.x + rftw * 4, + u->indicator.a.y + rfth * 3, + seg, &u->radarImageCount, buf, strlen(buf), rfth); + } + +/* + * Plot reference lines + */ + + i = (slot_size + 3) / 4; + y = rfth + 3; + SetSegment(seg[u->radarImageCount], xc, y, xc, y + 4); + u->radarImageCount++; + y = slot_size - 10 - rfth; + SetSegment(seg[u->radarImageCount], xc, y, xc, y + 4); + u->radarImageCount++; + + x = xc - i; + y = rfth + 6; + SetSegment(seg[u->radarImageCount], x, y, x, y + 4); + u->radarImageCount++; + y = slot_size - 10 - rfth; + SetSegment(seg[u->radarImageCount], x, y, x, y + 4); + u->radarImageCount++; + VGetStrokeString(u->v, x - rftw + u->indicator.a.x, y + 6 + rfth + u->indicator.a.y, + seg, &u->radarImageCount, thirty, 2, rfth); + + x = xc + i; + y = rfth + 6; + SetSegment(seg[u->radarImageCount], x, y, x, y + 4); + u->radarImageCount++; + y = slot_size - 10 - rfth; + SetSegment(seg[u->radarImageCount], x, y, x, y + 4); + u->radarImageCount++; + VGetStrokeString(u->v, x - rftw + u->indicator.a.x, y + 6 + rfth + u->indicator.a.y, + seg, &u->radarImageCount, thirty, 2, rfth); + + i = (slot_size + 3) / 4; + x = 2; + SetSegment(seg[u->radarImageCount], x, yc, x + 4, yc); + u->radarImageCount++; + x = slot_size - 6; + SetSegment(seg[u->radarImageCount], x, yc, x + 4, yc); + u->radarImageCount++; + + x = 5 + 2 * rftw; + y = yc - i; + SetSegment(seg[u->radarImageCount], x, y, x + 4, y); + u->radarImageCount++; + x = 3; + VGetStrokeString(u->v, x + u->indicator.a.x, y + (rfth + 1) / 2 + u->indicator.a.y, + seg, &u->radarImageCount, thirty, 2, rfth); + x = slot_size - 6; + SetSegment(seg[u->radarImageCount], x, y, x + 4, y); + u->radarImageCount++; + + x = 5 + 2 * rftw; + y = yc + i; + SetSegment(seg[u->radarImageCount], x, y, x + 4, y); + u->radarImageCount++; + x = 3; + VGetStrokeString(u->v, x + u->indicator.a.x, y + (rfth + 1) / 2 + u->indicator.a.y, + seg, &u->radarImageCount, thirty, 2, rfth); + x = slot_size - 6; + SetSegment(seg[u->radarImageCount], x, y, x + 4, y); + u->radarImageCount++; + +/* + * If the user was simply changing radar modes skip looking + * for new targets .. + */ + + if (state != 3) { + +/* + * Now plot all targets visible to the radar system. + */ + + +/* + * Scan the radar information table and plot targets + */ + + for (i = 0, p = c->rinfo; i < c->rtop; ++i, ++p) { + if (p->rel.x >= 0.0) { + xs = p->rel.y / (p->rel.x * scanSlope); + ys = p->rel.z / (p->rel.x * scanSlope); + if (fabs(xs) <= 1.0 && fabs(ys) <= 1.0) { + x = (int) (xs * (double) xc + xc); + y = (int) (ys * (double) yc + yc); + if (p->locked) { + plotPrimaryTarget(c, u, p->targetID, x, y); + primary = 1; + } + else { + plotNormalTarget(u, x, y); + } + } + } + } + } + + if (primary == 0) { + strcpy(c->rightHUD[0], "R_+__"); + strcpy(c->rightHUD[1], ""); + strcpy(c->rightHUD[2], ""); + } + + Alib_drawSegments(w, u->radarImage, u->radarImageCount, radarColor); + + return; +} + +/* + * Get a new radar target. + */ + +int +radar_getNewTarget(craft * c) +{ + int i, j = -1; + radarInfo *p; + + if (c->curRadarTarget == -1) { + return -1; + } + +/* + * Locate the locked target in the list of visible targets. + */ + + for (i = 0, p = c->rinfo; i < c->rtop; ++i, ++p) { + if (c->curRadarTarget == p->targetID) { + j = i; + p->locked = 0; + break; + } + } + if (j == -1) { + return -1; + } + ++j; + i = (j == c->rtop) ? 0 : j; + c->rinfo[i].locked = 1; + return c->rinfo[i].targetID; +} + +void +radar_updateTEWS(craft * c, viewer * u) +{ + Alib_Window *w; + int i, x, y, hostile_found = 0; + VPoint rel, tmp; + double r, r1, m, unit, xo, yo; + draw_Type *dd; + + if ( (c->radarMode & (RM_STANDBY | RM_NORMAL | RM_ACM | RM_STT)) == 0 + && c->radarMode != RM_OFF ) + return; + + slot_size = RectWidth(u->indicator); + + w = u->v->w; + Alib_setClipRect(w, &u->tuner); + Alib_fillRect(w, &u->tuner, panelBackgroundColor); + + if ( c->radarMode == RM_OFF ) + return; + + r = 0.45 * slot_size; + r1 = 0.06 * r; + xo = u->tuner.a.x + 0.5*slot_size; + yo = u->tuner.a.y + 0.5*slot_size; + + dd = draw_new(); + + draw_circle(dd, xo, yo, r); + + if( damage_isFunctioning(c, SYS_TEWS) ){ + for (i = 0; i < manifest_MAXPLAYERS; ++i) { + + if (ptbl[i].type == CT_FREE || c->pIndex == i) + continue; + + if (c->rval[i] > c->cinfo->TEWSThreshold) { + VTransform(&ptbl[i].Sg, &c->XYZtoNED, &tmp); + VReverseTransform_(&tmp, &c->trihedral, &rel); + m = 1.0/VMagnitude(&rel); + rel.x *= m; + rel.y *= m; + rel.z *= m; + unit = sqrt(rel.x * rel.x + rel.y * rel.y); + if (unit == 0.0) { + rel.x = 1.0; + rel.y = 0.0; + } + x = (int) (xo + (int) (rel.y / unit * r * 0.7)); + y = (int) (yo - (int) (rel.x / unit * r * 0.7)); + if (c->force == ptbl[i].force) { + + draw_circle(dd, x, y, r1); + + } + else { + + // Draw filled circle: + //draw_Type *ee; + //ee = draw_new(); + //draw_circle(ee, x, y, r1); + //draw_fill(ee, u->v, HUDPixel); + //draw_free(ee); + + /* FIXME: draw_fill() does not actually fill! */ + /* Workaround: draw 3 concentric circles (close enough!): */ + draw_circle(dd, x, y, r1); + draw_circle(dd, x, y, 0.66*r1); + draw_circle(dd, x, y, 0.33*r1); + + hostile_found = 1; + } + } + } + + if (c->vl == u && hostile_found == 1) { + sounds_playSound(c, sounds_LockWarning, FALSE); + } + } + + draw_stroke(dd, u->v, HUDColor); + + draw_free(dd); + +} + + +void +radar_droneUpdate(craft * c) +{ + int i, j = -1; + radarInfo *p; + double dmax = 500.0 * units_NmToFeetFactor; + VPoint tmp, rel, deltaV; + +/* + * Go find the closest radar return ... that becomes our victim. + */ + + if (c->curRadarTarget == -1) { + for (i = 0, p = c->rinfo; i < c->rtop; ++i, ++p) { + if (ptbl[p->targetID].force != c->force && p->d < dmax) { + dmax = p->d; + j = i; + } + } + c->curRadarTarget = j; + dis_if_radarTargetChanged(c); + } + +/* + * Is the current radar target still visible to the radar set? + */ + + else { + for (i = 0, p = c->rinfo; i < c->rtop; ++i, ++p) { + if (c->curRadarTarget == p->targetID) { + j = i; + } + } + if (j == -1) { + c->curRadarTarget = -1; + dis_if_radarTargetChanged(c); + } + } + +/* + * Compute tracking parameters + */ + + if ((i = c->curRadarTarget) != -1) { + tmp.x = units_METERStoFEET(ptbl[i].Sg.x - c->Sg.x); + tmp.y = units_METERStoFEET(ptbl[i].Sg.y - c->Sg.y); + tmp.z = units_METERStoFEET(ptbl[i].Sg.z - c->Sg.z); + VTransform_(&tmp, &c->XYZtoNED, &rel); + deltaV.x = ptbl[i].Cg.x - c->Cg.x; + deltaV.y = ptbl[i].Cg.y - c->Cg.y; + deltaV.z = ptbl[i].Cg.z - c->Cg.z; + c->targetDistance = VMagnitude(&rel); + c->targetClosure = -(deltaV.x * rel.x + + deltaV.y * rel.y + deltaV.z + rel.z) / c->targetDistance; + } +} + + +void +radar_setMode(craft * c, int mode) +{ + int dis_mode; + + switch (mode) { + case RM_OFF: + dis_mode = 0; + break; + case RM_STANDBY: + dis_mode = 0; + break; + case RM_NORMAL: + dis_mode = 1; + break; + case RM_ACM: + dis_mode = 2; + break; + case RM_STT: + dis_mode = 3; + break; + case RM_HSI: + case RM_ADF: + case RM_DIS_BROWSE: + dis_mode = 0; + break; + default: + error_internal("invalid mode %d", mode); + } + + if( dis_mode == 0 ){ + c->rightHUD[0][0] = '\0'; + c->rightHUD[1][0] = '\0'; + c->rightHUD[2][0] = '\0'; + } else { + strcpy(c->rightHUD[0], "R_+__"); + c->rightHUD[1][0] = '\0'; + c->rightHUD[2][0] = '\0'; + } + + c->radarMode = mode; + c->nextRadarTime = curTime + radarFrameInterval(c); + c->flags |= FL_RADAR_MODE_CHANGE; + c->curRadarTarget = -1; + dis_if_setRadarMode(c, dis_mode, 1); +} + diff -Nru acm-5.0/src/acm/radar.h acm-6.0+20200416/src/acm/radar.h --- acm-5.0/src/acm/radar.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/radar.h 2017-04-29 15:08:37.000000000 +0000 @@ -0,0 +1,64 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1998 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#ifndef _radar_h +#define _radar_h + +#include "pm.h" + +#ifdef radar_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +/** + * Set the display of the "radar" panel slot. + * @param c + * @param mode One of the RM_* constants. + */ +EXTERN void radar_setMode(craft * c, int mode); + +/** + * Compute how much radar energy the emitter craft puts on each other player + * and which other players are visible in the radar of the emitter. + * Calculates: [craft].rinfo (visible targets) and [craft].rval (received energy + * from each other player). + * @param emitter + */ +void radar_calculateEmissions(craft * emitter); + +EXTERN void radar_droneUpdate(craft * c); + +/** + * Draw the radar display or do nothing if radar disabled + */ +EXTERN void radar_update(craft * c, viewer * u); + +/* + * Draw the TEWS display or do nothing if radar disabled + */ +EXTERN void radar_updateTEWS(craft * c, viewer * u); + +/* + * Get a new radar target + */ +EXTERN int radar_getNewTarget(craft * c); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/render.c acm-6.0+20200416/src/acm/render.c --- acm-5.0/src/acm/render.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/render.c 2017-10-30 02:45:09.000000000 +0000 @@ -0,0 +1,963 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1998 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#include +#include +#include +#include + +#include "../util/memory.h" +#include "../util/units.h" +#include "astro.h" +#include "browse.h" +#include "damage.h" +#include "dis_if.h" +#include "hud.h" +#include "instruments.h" +#include "magnetic_compass.h" +#include "panel.h" +#include "place.h" +#include "pm.h" +#include "prompt.h" +#include "sounds.h" +#include "terminal.h" +#include "terrain.h" + +#define render_IMPORT +#include "render.h" +#include "gear.h" + +#define render_DEFAULT_GROUND_COLOR "#406030" + +/** + * Entry in the array of items to draw using the painter algorithm. + */ +typedef struct { + /** Distance of the item. */ + double distance; + /** Item to be drawn. */ + craft *item; +} ItemToDraw; + +static VPoint hex[6] = +{ + {1.00000, 0.00000, 0.0}, + {0.50000, 0.86603, 0.0}, + {-0.50000, 0.86603, 0.0}, + {-1.00000, 0.00000, 0.0}, + {-0.50000, -0.86603, 0.0}, + {0.50000, -0.86603, 0.0} +}; + +static double visibility = units_NMtoMETERS(10); + +/** If ground flat or tiled. */ +static render_Ground ground_mode = render_GROUND_FLAT; +VColor_Type *sunColor; + +/** + * Ground color name as retrieved from the zone the craft if currently flying + * over. + */ +static char *groundColorName; + +static VColor_Type *groundColor; // may depend on the scenery +static ItemToDraw *toDraw; +static int toDrawCapacity; +static int toDrawLen; + +static int inited; + + +static void render_cleanup() +{ + memory_dispose(toDraw); + toDraw = NULL; + toDrawCapacity = 0; + toDrawLen = 0; + + inited = 0; +} + + +static void render_init() +{ + if( inited ) + return; + inited = 1; + + groundColorName = render_DEFAULT_GROUND_COLOR; + groundColor = VColor_getByName(groundColorName, 0); + sunColor = VColor_getByRGB(255, 255, 255, 0); + + toDraw = NULL; + toDrawCapacity = 0; + toDrawLen = 0; + + memory_registerCleanup(render_cleanup); +} + + +void render_setVisibility(double range) +{ + if (range < units_NMtoMETERS(0.01) ) { + range = 0.01; + } + else if (range > units_NMtoMETERS(50.0) ) { + range = units_NMtoMETERS(50.0); + } + visibility = range; +} + + +void render_setGroundDepth(render_Ground mode) +{ + ground_mode = mode; +} + + +void render_setClouds(double base, double top) +{ + clouds_base = base; + clouds_top = top; +} + + +/** + * Draw the Sun. + * @param c Point of view. + * @param ps Add Sun polygon here. + * @return Sun elevation over the NED horizon: positive values means above (RAD). + */ +static double render_addSun(craft *c, VPolySet *ps) +{ + VPoint sun; + astro_getSun(curTime, &sun); + VTransform(&sun, &c->XYZtoNED, &sun); + double elevation = atan2(-sun.z, sqrt(sun.x*sun.x + sun.y*sun.y)); + + /* + * Draw the Sun disc as a circle perpendicular to the sun vector. + * We need a point p of the polygon: first we take any perpendicular + * point to sun, then normalize to Sun disc radius, then add the + * sun vector, finally rotate that vector around sun to generate the + * vertices: + */ + VPoint p = (VPoint){sun.y, -sun.x, 0}; + double sun_radius = 6.5e8; // radius of the Sun (m) + double p_mag = sun_radius / VMagnitude(&p); + p.x *= p_mag; + p.y *= p_mag; + p.z *= p_mag; + VAdd(&sun, &p, &p); + + /* + * Rotate p around craft-to-sun vector step by step to get vertices: + */ + VMatrix r; + VIdentMatrix(&r); +#define SUN_STEPS 8 + VRotateAroundAxis(&r, &sun, 2*M_PI/SUN_STEPS); + VPoint disc[SUN_STEPS]; + int i; + for(i = 0; i < SUN_STEPS; i++){ + VTransform_(&p, &r, &p); + disc[i] = p; + VReverseTransform(&disc[i], &c->XYZtoNED, &disc[i]); + } + VPolygon *sun_poly = VCreatePolygon(SUN_STEPS, disc, sunColor); + VPolySet_Add(ps, sun_poly); + return elevation; +} + + +/** + * Add a horizontal hexagonal layer to the polygons set. + * @param c Craft, for NED to XYZ transformation. + * @param color Color of the hexagon. + * @param z "Zeta" position of the hexagon in aircraft's NED frame (m), then + * positive if below. + * @param r Radius of the hexagon (m). + * @param ps Polygons set to add to. + */ +static void +render_addHorizontalLayer(craft * c, VColor_Type * color, double z, double r, VPolySet *ps) +{ + VPoint hex1[6]; + int i; + for (i = 0; i < 6; ++i) { + hex1[i].x = hex[i].x * r; + hex1[i].y = hex[i].y * r; + hex1[i].z = z; + VReverseTransform(&hex1[i], &c->XYZtoNED, &hex1[i]); + } + VPolySet_Add(ps, VCreatePolygon(6, hex1, color)); +} + + +/** + * Add hexagonal polygon for the terrain. + * @param c Craft, for NED to XYZ transformation. + * @param local_z Local altitude of the terrain below the aircraft. + * @param groundColor + * @param ps Polygons set to add to. + */ +static void render_drawFlatTerrain(craft * c, double local_z, VColor_Type *groundColor, VPolySet *ps) +{ + render_addHorizontalLayer(c, groundColor, c->w.z - local_z, visibility, ps); + +/* + double r = 0.95 * visibility; + int i; + for(i = 4; i >= 0; i--){ + double h = 0.5 * r*r / 6e6; + addHorizontalLayer(c, ground_color, c->w.z - local_z + h, r, ps); + r *= 0.5; + } +*/ +} + + +static double myfmod(double x, double m) +{ + if( x >= 0 ){ + return x - m * floor(x / m); + } else { + return m + x + m * floor(-x / m); + } +} + + +// Terrain with n*n grid for a total of (n-1)^2 tiles. +#define n 21 + + +/** + * Draws grid of tiles on a square 2*visibility meters wide below the aircraft. + * Each tile will be blended to the fog color according to the distance. + * Due to the limited number of colors, each tile remains perfectly visible. + * We take advantage of this artifact to generate an interesting texture effect + * that helps feeling the speed and orientation in VFR. To this aim the square + * grid must be still with the terrain rather than being centered below the + * aircraft. We use the current latitude and longitude and some modulo + * arithmetic trickery to generate the anchor point A in NED where that + * square grid has to be centered. + * Here the Earth is a perfect sphere of radius earth_MAJOR and the local + * terrain altitude is ignored in order to calculate A, but the result is + * good enough. + * @param c Craft, for NED to XYZ transformation. + * @param local_z Local altitude of the terrain below the aircraft. + * @param groundColor + * @param ps Polygons set to add to. + */ +static void render_drawTiledTerrain(craft * c, double local_z, VColor_Type *groundColor, VPolySet *ps) +{ + // Evaluate each tile size as angles: + double cos_lat = cos(c->w.latitude); + double sin_lat = sin(c->w.latitude); + double cos_lon = cos(c->w.longitude); + double sin_lon = sin(c->w.longitude); + // Each tile north-to-south size (RAD): + double lat_step = 2 * visibility / (n - 1) / earth_MAJOR; + if( lat_step < units_DEGtoRAD(1/3600.0) ) // not less than 1 arc second + lat_step = units_DEGtoRAD(1/3600.0); + else if( lat_step > units_DEGtoRAD(1) ) // no more than 1 degree + lat_step = units_DEGtoRAD(1); + // Each tile west-to-east size (RAD): + double lon_step = lat_step; + while( cos_lat * lon_step < lat_step / 2 ) // tile height at least half width + lon_step *= 2; + + // Compute anchor point of the grid in NED: + VPoint A; + A.x = - earth_MAJOR * myfmod(c->w.latitude, lat_step); + A.y = - earth_MAJOR * cos_lat * myfmod(c->w.longitude, lon_step); + A.z = c->w.z - local_z; + // ...then transform in world coordinates: + VReverseTransform(&A, &c->XYZtoNED, &A); + + int h, v; + VPoint grid[n][n]; + for(h = 0; h < n; h++){ + for(v = 0; v < n; v++){ + double delta_lat = (h - n/2) * lat_step; + double delta_lon = (v - n/2) * lon_step; + /* + * Exact formulas for the points of the grid are: + * + * grid[h][v].x = earth_MAJOR * cos(lat+delta_lat) * sin(lon+delta_lon) + * grid[h][v].y = earth_MAJOR * cos(lat+delta_lat) * sin(lon+delta_lon) + * grid[h][v].z = earth_MAJOR * sin(lat+delta_lat) + * + * where lat,lon are the coords of A. Here the first order approximation + * on delta_lat,delta_lon is used to save some sin() and cos() calculations: + */ + VSetPoint(&grid[h][v], + A.x - earth_MAJOR * ( cos_lat * sin_lon * delta_lon + + cos_lon * sin_lat * delta_lat), + A.y + earth_MAJOR * ( cos_lat * cos_lon * delta_lon + - sin_lon * sin_lat * delta_lat), + A.z + earth_MAJOR * cos_lat * delta_lat); + } + } + for(h = 0; h < n-1; h++){ + for(v = 0; v < n-1; v++){ + VPoint tile[4]; + tile[0] = grid[h+1][v]; + tile[1] = grid[h+1][v+1]; + tile[2] = grid[h][v+1]; + tile[3] = grid[h][v]; + VPolySet_Add(ps, VCreatePolygon(4, tile, groundColor)); + } + } +} + + +/** + * Add terrain to the polygons set. + * @param c Craft, for NED to XYZ transformation. + * @param local_z Local altitude of the terrain below the aircraft. + * @param ps Polygons set to add to. + */ +static void +render_addTerrain(craft * c, double local_z, VColor_Type *groundColor, VPolySet *ps) +{ + if( ground_mode == render_GROUND_FLAT ) + render_drawFlatTerrain(c, local_z, groundColor, ps); + else + render_drawTiledTerrain(c, local_z, groundColor, ps); +} + + +/** + * Add item 'p' to the list of items to draw for the view from craft 'c'. + * @param c + * @param p + * @param zmin Draw only if above this altitude (m). + * @param zmax Draw only if below this altitude. + */ +static void +insertToDraw(craft * c, craft * p, double zmin, double zmax) +{ + double distance; + + if( !(zmin <= p->w.z && p->w.z < zmax) ) + return; + + /* + * FIXME: original comment below might need update. + * + * Here's a kludge for you: to avoid polygon clipping, I'm going to + * cheat and hack a way to get ground objects to display properly. + * if the Z coordinate of an object is zero (i.e. on ground objects), + * I'll add a huge offset to their distance values to force them to be + * plotted first -- and in roughly their correct drawing order. + * + * To support automated world outline maps, stbl[0] is considered to be + * the world map, and will always be plotted in the background. + */ + + if( p->cinfo->object == NULL ){ + printf("%s:%d: p->cinfo->object is NULL for %s\n", __FILE__, __LINE__, p->cinfo->name); + return; + } + if( p->cinfo->object->name[0] == '#' ){ + + /* + * Object name beginning with '#' is handled in special way, as its + * distance is set beyond the center of the Earth. This ensures it will + * be painted first on the background. Typically it is the FEATURE + * representing the terrain surface. + */ + + distance = (7000.0 * units_NmToFeetFactor) * (7000.0 * units_NmToFeetFactor); + + } else { + + /* + * "Normal" item: compute its distance from us -- well, actually the + * square of that distance, but it does not matter here. + */ + + VPoint ds; + ds.x = p->Sg.x - c->Sg.x; + ds.y = p->Sg.y - c->Sg.y; + ds.z = p->Sg.z - c->Sg.z; + distance = VMagnitude2(&ds); + } + + /* Add item to draw to the array, allocating more space if necessary: */ + if( toDrawLen >= toDrawCapacity ){ + // Increase capacity about +50%: + toDrawCapacity = toDrawCapacity + toDrawCapacity/2 + 10; + toDraw = memory_realloc(toDraw, toDrawCapacity * sizeof(ItemToDraw)); + } + toDraw[toDrawLen++] = (ItemToDraw) {distance, p}; +} + + +/** + * Compares order of items to draw for qsort(); nearest comes first. + * @param a + * @param b + * @return + */ +static int toDrawCmp(const void *a, const void *b) +{ + double d = ((ItemToDraw *)a)->distance - ((ItemToDraw *)b)->distance; + if( d < 0 ) + return -1; + else if( d > 0 ) + return +1; + else + return 0; +} + + +static void +renderCockpitView ( craft *c, viewer *u ) +{ + instruments_update(u); + + if( ! gui_isVisible(u->gui) ) + return; + + /* + * Build a vector of polygons for all objects in the scene. + * + * This vector should be ordered from "most distant" to "closest" so that + * the final display will end up correct. Rather than generalizing this + * to death, we'll use a few heuristics to get very close to what we need: + * + * (0) Build a single polygon to represent the ground. + * (1) Objects on the surface (stbl) are collected first. + * (2) Planes and projectiles (ptbl and mtbl) are first sorted in + * descending order by their distance from the observer and then + * polygons are collected. + */ + + VPolySet *ps, *ps_clipped; + VPolygon *poly, *poly_clipped; + craft *p; + int j; + VPoint tmp, vp, fwd, up; + double v, view_dist, local_z, zmin, zmax; + static _BOOL blink = FALSE; + static double blink_toggle_time = 0.0; + craft *vc; + + VSetClipRect(u->v, &u->v->rect); + + /* + * pay attention: vc will be the viewer craft information, c will be + * the watched entity craft information + */ + + vc = c; + if ( c->type == CT_DIS_STEALTH ) { + + if ( c->vl->viewer_state == ViewerStatePiggyback ) { + + c = c->vl->watchedCraft; + } + + } + + /* + * Set up the eye space transformation for this viewpoint + */ + + if (vc->flags & FL_CHASE_VIEW) { + + /* + * Set a convenient distance of view behind the aircraft based + * on the estimated length of the actual aircraft (m). + */ + + view_dist = -10 * units_FEETtoMETERS(fabs(c->cinfo->rn.x - c->cinfo->rm.x)); + + /* + * Set viewpoint vp in world frame XYZ (m). + * If the ground speed (projection of c->Cg over the horizontal plane) + * is greater than 2 m/s, use this as direction of view, otherwise + * use the current heading. + */ + + tmp = c->Cg; + tmp.z = 0.0; + VReverseTransform_(&tmp, &c->XYZtoNED, &vp); + v = VMagnitude(&vp); + if (v > 2.0) { + vp.x *= view_dist / v; + vp.y *= view_dist / v; + vp.z *= view_dist / v; + } + else { + tmp.x = view_dist * cos(c->curHeading); + tmp.y = view_dist * sin(c->curHeading); + tmp.z = 0.0; + VReverseTransform_(&tmp, &c->XYZtoNED, &vp); + } + vp.x += c->Sg.x; + vp.y += c->Sg.y; + vp.z += c->Sg.z; + + /* + * Look at the CM, world frame (m). + */ + + fwd = c->Sg; + + /* + * Set "up" point position in world XYZ (m). + */ + + tmp.x = tmp.y = 0.0; + tmp.z = -1.0; + VReverseTransform_(&tmp, &c->XYZtoNED, &up); + up.x += vp.x; + up.y += vp.y; + up.z += vp.z; + } + else { + if (c->cinfo) { + VTransform_(&c->cinfo->viewPoint, &(c->trihedral), &tmp); + } + else { + tmp.x = tmp.y = tmp.z = 0.0; + } + tmp.x = units_FEETtoMETERS(tmp.x); + tmp.y = units_FEETtoMETERS(tmp.y); + tmp.z = units_FEETtoMETERS(tmp.z); + VReverseTransform(&tmp, &c->XYZtoNED, &vp); + + VTransform_(&u->viewDirection, &(c->trihedral), &tmp); + VReverseTransform_(&tmp, &c->XYZtoNED, &fwd); + fwd.x += vp.x; + fwd.y += vp.y; + fwd.z += vp.z; + + VTransform_(&u->viewUp, &(c->trihedral), &tmp); + VReverseTransform_(&tmp, &c->XYZtoNED, &up); + up.x += vp.x; + up.y += vp.y; + up.z += vp.z; + } + + local_z = terrain_localAltitude(c); + + VGetEyeSpace(u->v, vp, fwd, up); + + ps = VPolySet_New(); + + toDrawLen = 0; + + /* + * Add the Sun to the polygons we will draw later along with aircraft etc. + * As a side beneficial effect, we get the Sun elevation over the + * horizon which allows to compute a general brightness factor, which in + * turn allows to calculate the sky color and general scene brightness. + */ + double sun_elevation_over_terrain = render_addSun(c, ps); + + double terrain_brightness = (sun_elevation_over_terrain + units_DEGtoRAD(6)) / units_DEGtoRAD(10); + if( terrain_brightness < 0 ) + terrain_brightness = 0.0; + else if( terrain_brightness > 1.0 ) + terrain_brightness = 1.0; + + /* + * Compute Sun elevation over the far horizon of the Earth. + * Start assuming we are still very close to the ground: + */ + double sun_elevation_over_horizon = sun_elevation_over_terrain; + double far_horizon_brightness = terrain_brightness; + double half_globe_tan = INFINITY; + // If pilot can see far horizon, do a precise calculation: + if( c->w.z > 0 && c->w.z - local_z > 1.0 ){ + double r = c->w.z / earth_MAJOR; + // Apparent half-angular size of the Earth as seen from the craft: + half_globe_tan = 1.0 / sqrt(r*(r+2)); + sun_elevation_over_horizon += M_PI/2 - atan(half_globe_tan); + far_horizon_brightness = (sun_elevation_over_horizon + units_DEGtoRAD(2)) / units_DEGtoRAD(4); + if( far_horizon_brightness < 0 ) + far_horizon_brightness = 0; + else if( far_horizon_brightness > 1 ) + far_horizon_brightness = 1; + } + + /* + * Compute sky color. Note that each color component of the sky follows a + * different law for even nicer dusk effects. Sky becomes darker at high + * altitude. + */ + double altitudeFactor = 10000.0 / (fabs(c->w.z) + 10000.0); + int skyColor = gui_getColorIndex(NULL, + 150*sqrt(far_horizon_brightness)*altitudeFactor, // red prevails at dusk + 150*far_horizon_brightness*altitudeFactor, + 220*far_horizon_brightness*far_horizon_brightness*altitudeFactor // blue prevails in plain light + ); + + VColor_Type *cloudsColor = VColor_getByRGB( + 200*terrain_brightness, 200*terrain_brightness, 200*terrain_brightness, 0); + + int hazeComponent = 176*terrain_brightness; + VColor_Type *hazeColor = VColor_getByRGB( + hazeComponent, hazeComponent, hazeComponent, 0); + + /* + * Draw far horizon, that is the round shape of the Earth. The "round shape" + * here is an... hexagon drawn at some safe distance between the center of + * the Earth and the terrain below to avoid overlapping with the terrain + * polygons. + */ + if( far_horizon_brightness > 0 ){ + double d = earth_MAJOR/2 + c->w.z; // safe distance below aircraft + double r = d * half_globe_tan; // radius of the hexagon + int farHorizonComponent = 176*far_horizon_brightness; + VColor_Type *farHorizonColor = VColor_getByRGB( + farHorizonComponent, farHorizonComponent, farHorizonComponent, 0); + render_addHorizontalLayer(c, farHorizonColor, d, r, ps); + } + + /* + * Configure Alib depth cueing color and culling distance: + */ + Alib_setVisibility(u->w, visibility, hazeColor); + + /* + * Ground color name. If the zone the craft is flying over defines a + * ground color, set that color, otherwise use the default. + */ + char *newGroundColorName = render_DEFAULT_GROUND_COLOR; + if( c->zone != NULL && zone_isLoaded(c->zone) + && zone_getGroundColor(c->zone) != groundColorName ){ + newGroundColorName = zone_getGroundColor(c->zone); + groundColor = VColor_getByName(newGroundColorName, ground_mode == render_GROUND_TILED); + } + + /* Compute dimmed ground color. */ + VColor_Type *dimGroundColor = VColor_getByRGB( + terrain_brightness * VColor_getRed(groundColor), + terrain_brightness * VColor_getGreen(groundColor), + terrain_brightness * VColor_getBlue(groundColor), + ground_mode == render_GROUND_TILED); + + if( clouds_top <= clouds_base ){ + // No clouds. + // Sky. + VFillRectangle(u->v, &u->v->rect, skyColor); + // Terrain below: + render_addTerrain(c, local_z, dimGroundColor, ps); + // Draw items from sea level up to the deep outer space: + zmin = 0.0; + zmax = INFINITY; + + } else if( c->w.z < clouds_base ){ + // Craft between terrain and clouds base. + // Sky. + VFillRectangle(u->v, &u->v->rect, skyColor); + // Terrain below: + render_addTerrain(c, local_z, dimGroundColor, ps); + // Clouds above: + render_addHorizontalLayer(c, cloudsColor, c->w.z - clouds_base, 1e5, ps); + // Draw items from sea level up to the clouds base: + zmin = 0.0; + zmax = clouds_base; + + } else if( c->w.z < clouds_top ){ + // Craft inside clouds. + // Pilot can't see nothing but a bright gray: + VFillRectangle(u->v, &u->v->rect, VColor_getIndex(cloudsColor)); + // Nothing to draw - set impossible range: + zmin = 0.0; + zmax = -1.0; + + } else { + // Craft above clouds. + // Sky. + VFillRectangle(u->v, &u->v->rect, skyColor); + // Clouds below: + render_addHorizontalLayer(c, cloudsColor, c->w.z - clouds_top, 1e5, ps); + // Draw items from clouds top up to the deep outer space: + zmin = clouds_top; + zmax = INFINITY; + } + + // Perspective on terrain and clouds polygons drawn so far: + poly = VPolySet_First(ps); + while( poly != NULL ){ + VTransformPolygon(poly, &u->v->eyeSpace); + poly = VPolySet_Next(ps); + } + + // Add surface elements: + for (p = stbl; p != NULL; p = p->next) { + insertToDraw(c, p, zmin, zmax); + } + + for ((j = 0, p = ptbl); j < manifest_MAXPLAYERS; (++j, ++p)) { + if (p->type != CT_FREE && + p->type != CT_DIS_STEALTH && + (p != c || c->flags & FL_CHASE_VIEW)) { + insertToDraw(c, p, zmin, zmax); + } + } + + for ((j = 0, p = mtbl); j < manifest_MAXPROJECTILES; (++j, ++p)) { + if (p->type != CT_FREE) { + insertToDraw(c, p, zmin, zmax); + } + } + + /* Sort items to draw in increasing order of distance from 'c': */ + qsort(toDraw, toDrawLen, sizeof(ItemToDraw), toDrawCmp); + + /* Painter algorithm: draw far items first, near last: */ + for(j = toDrawLen-1; j >= 0; j--) + place_craft(u->v, c, u, toDraw[j].item, ps); + + /* + * Display this image for each viewer associated with this craft + */ + + /* FIXME: to do */ + + /* + * Clip all polygons against the view frustum. + * + * Attention: we can't release the ps set of polygons right + * after the clipping because polygons completely visible + * are shared with ps_clipped set. + */ + + ps_clipped = VPolySet_New(); + poly = VPolySet_First(ps); + while( poly != NULL ){ + + VPolySet_Set(ps, NULL); + + poly = VClipSidedPolygon(poly, u->v->clipPoly); + + if( poly != NULL ) + VPolySet_Add(ps_clipped, poly); + + poly = VPolySet_Next(ps); + } + + poly_clipped = VPolySet_First(ps_clipped); + while( poly_clipped != NULL ){ + + VFillPolygon(u->v, poly_clipped); + + poly_clipped = VPolySet_Next(ps_clipped); + } + + /* + * Release polygons + */ + + VPolySet_Free(ps, TRUE); + ps = NULL; + + VPolySet_Free(ps_clipped, TRUE); + ps_clipped = NULL; + + hud_draw(u); + + terminal_draw(u); + + //browse_page( vc, u ); + + if ( u->viewer_state == ViewerStateNormal ) { + prompt_draw(u); + magnetic_compass_draw(u); + instruments_draw(u); // instruments panel upper row + panel_updateAndDraw(c, u); // instruments panel bottom row + doFlightStatusPage(c, u); + } + + if( curTime > blink_toggle_time ){ + blink = ! blink; + if( blink ) + blink_toggle_time = curTime + 0.05; + else + blink_toggle_time = curTime + 1.2; + } + + if( ! blink ){ + + char *s = NULL; + + if ( u->hasFocus && ! u->hasComm ) { + s = "[PRESS `d' TO TAKE COMMANDS]"; + + } else if( dis_if_isValidatingSiteId() ){ + s = "Validating site ID"; + + } else if( u->hasFocus && c->type == CT_DRONE ){ + s = "[DRONE]"; + } + + if( s != NULL ){ + int len = strlen(s); + int fw = (int) (0.6 * RectWidth(u->v->rect) / (double) len); + int fh = fw; /* FIXME */ + int x = RectMiddleX(u->v->rect) - (fw * len / 2); + int y = RectMiddleY(u->v->rect) + (fh / 2); + Alib_setClipRect(u->w, &u->v->rect); + VDrawStrokeString(u->v, x+1, y, s, len, fh, blackColor); + VDrawStrokeString(u->v, x, y, s, len, fh, whiteColor); + } + + } + + /* Expose the completed drawing */ + VExposeBuffer(u->v); + +} + + +static void +setAudio(craft * c) +{ + /* Set engine sound: */ + if( damage_isFunctioning(c, SYS_ENGINE1 ) ) + sounds_setBackgroundSound(c, + c->rpm, + (c->flags & FL_AFTERBURNER) ? 1 : 0, + 0.0 /* dummy, ignored */); + + /* Stall warning: */ + if( c->damageBits & FLAG_STALL_WARN ) + sounds_playSound(c, sounds_StallWarning, TRUE); + else + sounds_stopSound(c, sounds_StallWarning); + + /* Low altitude and gear warnings: */ + double radar_altitude = units_METERStoFEET(c->w.z - terrain_localAltitude(c)); + double vertical_speed = c->Cg.z; /* ft/s */ + if( + radar_altitude < 2500 /* radar altitude available */ + && vertical_speed > 0 /* diving */ + ){ + int gear_down = gear_nosePosition(c) == 2 + && gear_leftPosition(c) == 2 + && gear_rightPosition(c) == 2; + double time_to_impact = radar_altitude / vertical_speed; + if( vertical_speed / time_to_impact > 0.2 * units_earth_g ){ + /* diving too fast to recover within 0.2 g limit before impact */ + prompt_craft_print(c, "WARNING: pull-up!"); + sounds_playSound(c, sounds_GenericWarning, 0); + } else if( ! gear_down && time_to_impact < 2 * M_PI_2 / c->cinfo->gearRate ){ + /* no time left to extend gear (2 factor for extra safety) */ + prompt_craft_print(c, "WARNING: pull-up!"); + sounds_playSound(c, sounds_GenericWarning, 0); + } else if( ! gear_down && time_to_impact < 120 ){ + /* no gear, less than 2 min to impact */ + prompt_craft_print(c, "WARNING: gear down!"); + sounds_playSound(c, sounds_GenericWarning, 0); + } + } + + sounds_update(c); +} + + +void +render_drawCockpitViews(void) +{ + viewer *u; + + render_init(); + + for (u = vl_head; u != NULL; u=u->vl_next ) { + + renderCockpitView( u->c, u ); + + setAudio(u->c); + + u->c->zone = zones_load(zones, &u->c->w, u->c->zone, 0); + + } + +} + + +void +render_setOutsideView(craft * c, viewer *u, render_ViewDirection v) +{ + if (v == render_VIEW_CHASE) { + c->flags |= FL_CHASE_VIEW; + } + else { + c->flags &= ~FL_CHASE_VIEW; + } + + switch (v) { + case render_VIEW_CHASE: + case render_VIEW_FORWARD: + u->viewDirection.x = 1.0; + u->viewDirection.y = 0.0; + u->viewDirection.z = 0.0; + u->viewUp.x = 0.0; + u->viewUp.y = 0.0; + u->viewUp.z = -1.0; + break; + case render_VIEW_UP: + u->viewDirection.x = 0.0; + u->viewDirection.y = 0.0; + u->viewDirection.z = -1.0; + u->viewUp.x = -1.0; + u->viewUp.y = 0.0; + u->viewUp.z = 0.0; + break; + case render_VIEW_DOWN: + u->viewDirection.x = 0.0; + u->viewDirection.y = 0.0; + u->viewDirection.z = 1.0; + u->viewUp.x = 1.0; + u->viewUp.y = 0.0; + u->viewUp.z = 0.0; + break; + case render_VIEW_LEFT: + u->viewDirection.x = 0.0; + u->viewDirection.y = -1.0; + u->viewDirection.z = 0.0; + u->viewUp.x = 0.0; + u->viewUp.y = 0.0; + u->viewUp.z = -1.0; + break; + case render_VIEW_RIGHT: + u->viewDirection.x = 0.0; + u->viewDirection.y = 1.0; + u->viewDirection.z = 0.0; + u->viewUp.x = 0.0; + u->viewUp.y = 0.0; + u->viewUp.z = -1.0; + break; + case render_VIEW_AFT: + u->viewDirection.x = -1.0; + u->viewDirection.y = 0.0; + u->viewDirection.z = 0.0; + u->viewUp.x = 0.0; + u->viewUp.y = 0.0; + u->viewUp.z = -1.0; + break; + } +} diff -Nru acm-5.0/src/acm/render.h acm-6.0+20200416/src/acm/render.h --- acm-5.0/src/acm/render.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/render.h 2017-10-28 08:36:46.000000000 +0000 @@ -0,0 +1,68 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1998 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#ifndef _render_h +#define _render_h + +#include "pm.h" + +#ifdef render_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +/** Outside view modes. */ +typedef enum { + render_VIEW_FORWARD, + render_VIEW_UP, + render_VIEW_DOWN, + render_VIEW_LEFT, + render_VIEW_RIGHT, + render_VIEW_AFT, + render_VIEW_CHASE +} render_ViewDirection; + +typedef enum {render_GROUND_FLAT, render_GROUND_TILED} render_Ground; + +/** + * Set visibility range. Above that distance objects are not drawn and haze + * effect is displayed instead. The default visibility range is 10 NM. + * @param range Visibility range (m). The value is forced to the range + * from 0.01 NM up to 50 NM (185 and 92650 m respectively). + */ +EXTERN void render_setVisibility(double range); + +/** + * Set ground depth mode. + * @param mode The default depth mode is flat rendering. + */ +EXTERN void render_setGroundDepth(render_Ground mode); + +/** + * Set tick clouds layer range. No clouds if the top is less or equal to bottom. + * @param base Clouds base altitude (m). Default: zero. + * @param top Clouds top altitude (m). Default: zero. + */ +EXTERN void render_setClouds(double base, double top); + +EXTERN void render_drawCockpitViews(void); +EXTERN void render_setOutsideView(craft * c, viewer *u, render_ViewDirection v); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/runway.c acm-6.0+20200416/src/acm/runway.c --- acm-5.0/src/acm/runway.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/runway.c 2017-10-09 00:06:44.000000000 +0000 @@ -0,0 +1,842 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1997 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +/* + * Runway markings are designed to conform to FAA AC 150/5340-1G + * dated 9/27/93. + * + * 2006-04-24 Added runway numbers. Not sure if it complies to something, + * but it looks good :-) [U.S.] + */ + +#include +#include +#include +#include "../util/memory.h" +#include "../V/Vlibmath.h" +#include "../util/units.h" + +#define runway_IMPORT +#include "runway.h" + +#define CENTERLINE_WIDTH units_FEETtoMETERS(3.0) +#define CENTERLINE_LENGTH units_FEETtoMETERS(120.0) +#define CENTERLINE_GAP units_FEETtoMETERS(80.0) +#define THRESHOLD_STRIPE_WIDTH units_FEETtoMETERS(5.75) +#define THRESHOLD_STRIPE_LENGTH units_FEETtoMETERS(150.0) +#define THRESHOLD_STRIPE_X_OFFSET units_FEETtoMETERS(20.0) +#define THRESHOLD_STRIPE_Y_OFFSET units_FEETtoMETERS(3.0) +#define THRESHOLD_STRIPE_MARGIN units_FEETtoMETERS(5.75) +#define FIXED_MARKER_LENGTH units_FEETtoMETERS(150.0) +#define FIXED_MARKER_WIDTH units_FEETtoMETERS(30.0) +#define FIXED_MARKER_Y_OFFSET units_FEETtoMETERS(3.0) +#define FIXED_MARKER_X_OFFSET units_FEETtoMETERS(1000.0) +#define RUNWAY_COLOR "#222" +#define WHITE_PAINT "#ccc" +#define RUNWAY_CULL_DISTANCE 20000.0 /* m */ +#define MARKING_CULL_DISTANCE 5000.0 /* m */ + + +/* + Utilities to draw the runway name + --------------------------------- + + Every char is defined inside a grid of 15x20 points, then scaled + according to CHAR_SCALE_X and CHAR_SCALE_Y to buil a polygon. +*/ + +#define MAX_POINTS_PER_CHAR 20 /* max vertex per char polygon */ +#define CHAR_SCALE_X 0.3 /* grid-to-meters width scale factor */ +#define CHAR_SCALE_Y 1.0 /* grid-to-meters height scale factor */ +#define CHAR_WIDTH (15*CHAR_SCALE_X) /* total char width (meters) */ +#define CHAR_HEIGHT (20*CHAR_SCALE_Y) /* total char height (meters) */ +#define CHAR_MARGIN_X 2.0 /* inter-char spacing (meters) */ +#define CHAR_MARGIN_Y 6.0 /* inter-line spacing (meters) */ +#define CHAR_X_OFFSET (THRESHOLD_STRIPE_X_OFFSET + THRESHOLD_STRIPE_LENGTH + 12.0) /* X offset of the chars from the threshold stripes (meters) */ +#define CHAR_DEFAULT '/' + +typedef struct { + int np; + int xy[2*MAX_POINTS_PER_CHAR]; +} Character; + +/** + * The entry no. i is the ASCII char code i+32. + */ +static Character ** characters = NULL; + +static VColor_Type *runwayColor, *whitePaintColor; + + +static void runway_cleanup() +{ + int i; + + if( characters == NULL ) + return; + + for( i=0; i<128-32; i++ ) + if( characters[i] != NULL ) + memory_dispose(characters[i]); + + memory_dispose(characters); + characters = NULL; +} + +/** + * Fill-in the array of the chars 'characters'. It is called automatically + * by BuildChar(). + * Actually only the digits and the letters L,C,R are defined, and all the + * other chars are displayed as '/'. + */ +static void InitBuildChar() +{ + Character *s; + int i; + + characters = memory_allocate((128-32)*sizeof(Character *), NULL); + + for ( i=0; i<128-32; i++ ) { + characters[i] = NULL; + } + + /* "/" */ + s = memory_allocate(sizeof(Character), NULL); + s->np = 4; + s->xy[0] = 0; s->xy[1] = 3; + s->xy[2] = 3; s->xy[3] = 0; + s->xy[4] = 15; s->xy[5] = 17; + s->xy[6] = 12; s->xy[7] = 20; + characters['/'-32] = s; + + /* "0" and "O" */ + s = memory_allocate(sizeof(Character), NULL); + s->np = 13; + s->xy[0] = 0; s->xy[1] = 4; + s->xy[2] = 3; s->xy[3] = 0; + s->xy[4] = 12; s->xy[5] = 0; + s->xy[6] = 15; s->xy[7] = 4; + s->xy[8] = 15; s->xy[9] = 16; + s->xy[10] = 12; s->xy[11] = 20; + s->xy[12] = 3; s->xy[13] = 20; + s->xy[14] = 0; s->xy[15] = 16; + s->xy[16] = 0; s->xy[17] = 4; + s->xy[18] = 4; s->xy[19] = 4; + s->xy[20] = 4; s->xy[21] = 16; + s->xy[22] = 11; s->xy[23] = 16; + s->xy[24] = 11; s->xy[25] = 4; + characters['0'-32] = s; + characters['O'-32] = memcpy(memory_allocate(sizeof(Character), NULL), s, sizeof(Character)); + + /* "1" */ + s = memory_allocate(sizeof(Character), NULL); + s->np = 6; + s->xy[0] = 6; s->xy[1] = 0; + s->xy[2] = 9; s->xy[3] = 0; + s->xy[4] = 9; s->xy[5] = 20; + s->xy[6] = 6; s->xy[7] = 20; + s->xy[8] = 4; s->xy[9] = 15; + s->xy[10] = 6; s->xy[11] = 15; + characters['1'-32] = s; + + /* "2" */ + s = memory_allocate(sizeof(Character), NULL); + s->np = 16; + s->xy[0] = 15; s->xy[1] = 0; + s->xy[2] = 15; s->xy[3] = 3; + s->xy[4] = 5; s->xy[5] = 3; + s->xy[6] = 15; s->xy[7] = 11; + s->xy[8] = 15; s->xy[9] = 15; + s->xy[10] = 10; s->xy[11] = 20; + s->xy[12] = 4; s->xy[13] = 20; + s->xy[14] = 0; s->xy[15] = 15; + s->xy[16] = 0; s->xy[17] = 13; + s->xy[18] = 3; s->xy[19] = 13; + s->xy[20] = 5; s->xy[21] = 16; + s->xy[22] = 9; s->xy[23] = 16; + s->xy[24] = 11; s->xy[25] = 14; + s->xy[26] = 11; s->xy[27] = 11; + s->xy[28] = 0; s->xy[29] = 3; + s->xy[30] = 0; s->xy[31] = 0; + characters['2'-32] = s; + + /* "3" */ + s = memory_allocate(sizeof(Character), NULL); + s->np = 18; + s->xy[0] = 0; s->xy[1] = 5; + s->xy[2] = 0; s->xy[3] = 2; + s->xy[4] = 3; s->xy[5] = 0; + s->xy[6] = 12; s->xy[7] = 0; + s->xy[8] = 15; s->xy[9] = 2; + s->xy[10] = 15; s->xy[11] = 8; + s->xy[12] = 12; s->xy[13] = 11; + s->xy[14] = 15; s->xy[15] = 14; + s->xy[16] = 15; s->xy[17] = 20; + s->xy[18] = 0; s->xy[19] = 20; + s->xy[20] = 0; s->xy[21] = 16; + s->xy[22] = 11; s->xy[23] = 16; + s->xy[24] = 8; s->xy[25] = 12; + s->xy[26] = 8; s->xy[27] = 9; + s->xy[28] = 11; s->xy[29] = 7; + s->xy[30] = 11; s->xy[31] = 3; + s->xy[32] = 4; s->xy[33] = 3; + s->xy[34] = 4; s->xy[35] = 5; + characters['3'-32] = s; + + /* "4" */ + s = memory_allocate(sizeof(Character), NULL); + s->np = 14; + s->xy[0] = 8; s->xy[1] = 0; + s->xy[2] = 12; s->xy[3] = 0; + s->xy[4] = 12; s->xy[5] = 4; + s->xy[6] = 15; s->xy[7] = 4; + s->xy[8] = 15; s->xy[9] = 8; + s->xy[10] = 12; s->xy[11] = 8; + s->xy[12] = 12; s->xy[13] = 20; + s->xy[14] = 8; s->xy[15] = 20; + s->xy[16] = 0; s->xy[17] = 8; + s->xy[18] = 0; s->xy[19] = 4; + s->xy[20] = 8; s->xy[21] = 4; + s->xy[22] = 8; s->xy[23] = 8; + s->xy[24] = 5; s->xy[25] = 8; + s->xy[26] = 8; s->xy[27] = 12; + characters['4'-32] = s; + + /* "5" */ + s = memory_allocate(sizeof(Character), NULL); + s->np = 14; + s->xy[0] = 1; s->xy[1] = 0; + s->xy[2] = 12; s->xy[3] = 0; + s->xy[4] = 14; s->xy[5] = 2; + s->xy[6] = 14; s->xy[7] = 10; + s->xy[8] = 12; s->xy[9] = 12; + s->xy[10] = 5; s->xy[11] = 12; + s->xy[12] = 5; s->xy[13] = 16; + s->xy[14] = 14; s->xy[15] = 16; + s->xy[16] = 14; s->xy[17] = 20; + s->xy[18] = 1; s->xy[19] = 20; + s->xy[20] = 1; s->xy[21] = 8; + s->xy[22] = 10; s->xy[23] = 8; + s->xy[24] = 10; s->xy[25] = 4; + s->xy[26] = 1; s->xy[27] = 4; + characters['5'-32] = s; + + /* "6" */ + s = memory_allocate(sizeof(Character), NULL); + s->np = 15; + s->xy[0] = 0; s->xy[1] = 2; + s->xy[2] = 3; s->xy[3] = 0; + s->xy[4] = 12; s->xy[5] = 0; + s->xy[6] = 15; s->xy[7] = 2; + s->xy[8] = 15; s->xy[9] = 11; + s->xy[10] = 12; s->xy[11] = 13; + s->xy[12] = 5; s->xy[13] = 13; + s->xy[14] = 4; s->xy[15] = 9; + s->xy[16] = 11; s->xy[17] = 9; + s->xy[18] = 11; s->xy[19] = 4; + s->xy[20] = 4; s->xy[21] = 4; + s->xy[22] = 4; s->xy[23] = 9; + s->xy[24] = 8; s->xy[25] = 20; + s->xy[26] = 4; s->xy[27] = 20; + s->xy[28] = 0; s->xy[29] = 10; + characters['6'-32] = s; + + /* "7" */ + s = memory_allocate(sizeof(Character), NULL); + s->np = 10; + s->xy[0] = 4; s->xy[1] = 0; + s->xy[2] = 8; s->xy[3] = 0; + s->xy[4] = 8; s->xy[5] = 4; + s->xy[6] = 15; s->xy[7] = 12; + s->xy[8] = 15; s->xy[9] = 20; + s->xy[10] = 0; s->xy[11] = 20; + s->xy[12] = 0; s->xy[13] = 16; + s->xy[14] = 11; s->xy[15] = 16; + s->xy[16] = 11; s->xy[17] = 13; + s->xy[18] = 4; s->xy[19] = 6; + characters['7'-32] = s; + + /* "8" */ + s = memory_allocate(sizeof(Character), NULL); + s->np = 18; + s->xy[0] = 2; s->xy[1] = 0; + s->xy[2] = 4; s->xy[3] = 0; + s->xy[4] = 4; s->xy[5] = 16; + s->xy[6] = 11; s->xy[7] = 16; + s->xy[8] = 11; s->xy[9] = 12; + s->xy[10] = 4; s->xy[11] = 12; + s->xy[12] = 4; s->xy[13] = 8; + s->xy[14] = 11; s->xy[15] = 8; + s->xy[16] = 11; s->xy[17] = 4; + s->xy[18] = 4; s->xy[19] = 4; + s->xy[20] = 4; s->xy[21] = 0; + s->xy[22] = 13; s->xy[23] = 0; + s->xy[24] = 15; s->xy[25] = 2; + s->xy[26] = 15; s->xy[27] = 18; + s->xy[28] = 13; s->xy[29] = 20; + s->xy[30] = 2; s->xy[31] = 20; + s->xy[32] = 0; s->xy[33] = 18; + s->xy[34] = 0; s->xy[35] = 2; + characters['8'-32] = s; + + /* "9" */ + s = memory_allocate(sizeof(Character), NULL); + s->np = 15; + s->xy[0] = 15; s->xy[1] = 18; + s->xy[2] = 12; s->xy[3] = 20; + s->xy[4] = 3; s->xy[5] = 20; + s->xy[6] = 0; s->xy[7] = 18; + s->xy[8] = 0; s->xy[9] = 9; + s->xy[10] = 3; s->xy[11] = 7; + s->xy[12] = 10; s->xy[13] = 7; + s->xy[14] = 11; s->xy[15] = 11; + s->xy[16] = 4; s->xy[17] = 11; + s->xy[18] = 4; s->xy[19] = 16; + s->xy[20] = 11; s->xy[21] = 16; + s->xy[22] = 11; s->xy[23] = 11; + s->xy[24] = 7; s->xy[25] = 0; + s->xy[26] = 11; s->xy[27] = 0; + s->xy[28] = 15; s->xy[29] = 10; + characters['9'-32] = s; + + /* "C" */ + s = memory_allocate(sizeof(Character), NULL); + s->np = 10; + s->xy[0] = 0; s->xy[1] = 3; + s->xy[2] = 3; s->xy[3] = 0; + s->xy[4] = 12; s->xy[5] = 0; + s->xy[6] = 15; s->xy[7] = 4; + s->xy[8] = 4; s->xy[9] = 4; + s->xy[10] = 4; s->xy[11] = 16; + s->xy[12] = 15; s->xy[13] = 16; + s->xy[14] = 11; s->xy[15] = 20; + s->xy[16] = 3; s->xy[17] = 20; + s->xy[18] = 0; s->xy[19] = 17; + characters['C'-32] = s; + + /* "L" */ + s = memory_allocate(sizeof(Character), NULL); + s->np = 6; + s->xy[0] = 0; s->xy[1] = 0; + s->xy[2] = 15; s->xy[3] = 0; + s->xy[4] = 15; s->xy[5] = 4; + s->xy[6] = 4; s->xy[7] = 4; + s->xy[8] = 4; s->xy[9] = 20; + s->xy[10] = 0; s->xy[11] = 20; + characters['L'-32] = s; + + /* "R" */ + s = memory_allocate(sizeof(Character), NULL); + s->np = 15; + s->xy[0] = 0; s->xy[1] = 0; + s->xy[2] = 4; s->xy[3] = 0; + s->xy[4] = 4; s->xy[5] = 16; + s->xy[6] = 11; s->xy[7] = 16; + s->xy[8] = 11; s->xy[9] = 11; + s->xy[10] = 4; s->xy[11] = 11; + s->xy[12] = 4; s->xy[13] = 7; + s->xy[14] = 8; s->xy[15] = 7; + s->xy[16] = 11; s->xy[17] = 0; + s->xy[18] = 15; s->xy[19] = 0; + s->xy[20] = 12; s->xy[21] = 8; + s->xy[22] = 15; s->xy[23] = 10; + s->xy[24] = 15; s->xy[25] = 18; + s->xy[26] = 12; s->xy[27] = 20; + s->xy[28] = 0; s->xy[29] = 20; + characters['R'-32] = s; + + /**** + s = memory_allocate(sizeof(Character), NULL); + s->np = ; + s->xy[0] = ; s->xy[1] = ; + s->xy[2] = ; s->xy[3] = ; + s->xy[4] = ; s->xy[5] = ; + s->xy[6] = ; s->xy[7] = ; + s->xy[8] = ; s->xy[9] = ; + s->xy[10] = ; s->xy[11] = ; + s->xy[12] = ; s->xy[13] = ; + s->xy[14] = ; s->xy[15] = ; + s->xy[16] = ; s->xy[17] = ; + s->xy[18] = ; s->xy[19] = ; + s->xy[20] = ; s->xy[21] = ; + s->xy[22] = ; s->xy[23] = ; + s->xy[24] = ; s->xy[25] = ; + s->xy[26] = ; s->xy[27] = ; + s->xy[28] = ; s->xy[29] = ; + characters['R'-32] = s; + + ****/ + +} + +/** + * Returns the polygon of the char c, with 32<=c<=127. + * The char is translated to (x,y) before m be applied. + * Since the main axis of the runway is along the x-axis, by default + * the char is rotated accordingly. If upside_down is TRUE (i.e. != 0) + * the char is rotated 180 DEG. + */ +static VPolygon * +BuildChar(int c, VMatrix * m, double x, double y, int upside_down) +{ + VPoint p, pts[MAX_POINTS_PER_CHAR]; + Character *s; + int i, np, *xy; + VPolygon *poly; + + if ( c < 32 || c > 127 ) { + fprintf(stderr, "BuildChar(): invalid char code %d\n", c); + return NULL; + } + + s = characters[c-32]; + if ( s == NULL ) + s = characters[CHAR_DEFAULT-32]; + + np = s->np; + xy = &(s->xy[0]); + + for ( i=0; iflags |= PolyUseCullDistance; + poly->cullDistance = RUNWAY_CULL_DISTANCE; + return poly; +} + + +/** + * Returns the string length in meters. + */ +static double +StringWidth(char *s) +{ + int l; + + l = strlen(s); + return l*CHAR_WIDTH + (l-1) * CHAR_MARGIN_X; +} + + +/** + * Add the string s to the set of polygons. + * ox is the distance of the line base from the runway end. + * oy is the center of the string, typically 0.0. + */ +static void +AddBigString(char *s, VMatrix * m, double ox, double oy, int upside_down, + VPolySet *ps) +{ + VPolygon *p; + int len, j; + double x, y; + + if ( s == NULL ) return; + len = strlen(s); + if ( len == 0 ) return; + x = ox; + if ( upside_down ) + y = oy - StringWidth(s) / 2.0; + else + y = oy + StringWidth(s) / 2.0; + + for ( j=0; j 7 ) { + fprintf(stderr, "Runway name `%s' too long. Max 7 char allowed.\n", id); + return; + } + + c = id; + + /* Parse hdg1: */ + i = 0; + while( isdigit(*c) ){ + hdg1[i] = *c; + i++; + c++; + } + hdg1[i] = 0; + + /* Parse side1: */ + if( *c != 0 && *c != '/' ){ + i = 0; + do { + side1[i] = *c; + i++; + c++; + } while( *c != 0 && *c != '/' ); + side1[i] = 0; + } + + /* Parse hdg2: */ + if( *c == 0 ){ + fprintf(stderr, "Invalid runway name `%s', missing `/'.\n", id); + return; + } + if( *c != '/' ){ + fprintf(stderr, "Invalid character `%c' in runway name `%s'.\n", *c, id); + return; + } + c++; + i = 0; + while( *c != 0 && isdigit(*c) ){ + hdg2[i] = *c; + i++; + c++; + } + hdg2[i] = 0; + + /* Parse side2: */ + i = 0; + while( *c != 0 ){ + side2[i] = *c; + i++; + c++; + } + side2[i] = 0; + + /* Sort labels: */ + int n1 = atoi(hdg1); + int n2 = atoi(hdg2); + if( n1 > n2 ){ + char s[10]; + strcpy(s, hdg1); strcpy(hdg1, hdg2); strcpy(hdg2, s); + strcpy(s, side1); strcpy(side1, side2); strcpy(side2, s); + int t = n1; n1 = n2; n2 = t; + } + + /* Consistency check: */ + if( !(0 <= n1 && n1 <= 36 && 0 <= n2 && n2 <= 36) ) + fprintf(stderr, "Invalid runway numbers `%s', out of the range [0,36]\n", id); + if( n2 - n1 != 18 ) + fprintf(stderr, "Incompatible numbers in runway name `%s', they must differ by 18, corresponding to 180 DEG.\n", id); + + /* + The first label will be displayed at the "start" of the runway, + that is at -0.5*length*(cos(heading),sin(heading), 0.0) in NED, + whereas the second label would be displayed at the "end" of the + runway, that is at 0.5*length*(cos(heading),sin(heading), 0.0) + in NED. + + However there is an issue for runways whose heading is near the + north-south direction when the magnetic variation is involved, + because the heading refers to the geographical coords. whereas + the labels refer to magnetic coords. So, for example, the + heading of the runway 18/36 may be either 10 DEG or 170 DEG. In + the first case the labels must be exchanged. A similar issue + happens for runways whose heading is near suoth. This fix works + for magnetic variations up to 45 DEG: + */ + int h = (int)(units_RADtoDEG(heading)); + if( ( (h <= 45) && (n1 > 13) ) + || ( (h >= 135) && (n1 < 9) ) ){ + char s[10]; + strcpy(s, hdg1); strcpy(hdg1, hdg2); strcpy(hdg2, s); + strcpy(s, side1); strcpy(side1, side2); strcpy(side2, s); + int t = n1; n1 = n2; n2 = t; + } + +} + + +static VPolygon * build_rectangle(double x1, double y1, double x2, double y2, + VColor_Type * color, int cull_distance, VMatrix *m) +{ + VPolygon *p; + int i; + VPoint v[4]; + + VSetPoint(&v[0], x1, y1, 0.0); + VSetPoint(&v[1], x2, y1, 0.0); + VSetPoint(&v[2], x2, y2, 0.0); + VSetPoint(&v[3], x1, y2, 0.0); + + for( i=0; i < 4; i++ ) + VTransform(&v[i], m, &v[i]); + + p = VCreatePolygon(4, v, color); + p->flags |= PolyUseCullDistance; + p->cullDistance = cull_distance; + + return p; +} + + +static void +AddSymmetricPolygons(VMatrix * RWYtoXYZ, double x, double y, int count, + double length, double width, double margin, VPolySet *ps) +{ + for (; count > 0; --count, y -= width + margin) { + + VPolySet_Add(ps, build_rectangle( + x, y, + x - length, y - width, + whitePaintColor, MARKING_CULL_DISTANCE, RWYtoXYZ ) ); + + /* + * Opposite stripe on same runway end + */ + + VPolySet_Add(ps, build_rectangle( + x, -y, + x - length, -y + width, + whitePaintColor, MARKING_CULL_DISTANCE, RWYtoXYZ ) ); + + /* + * Stripe on opposite runway end + */ + + VPolySet_Add(ps, build_rectangle( + -x, y, + -x + length, y - width, + whitePaintColor, MARKING_CULL_DISTANCE, RWYtoXYZ ) ); + + /* + * Opposite stripe on opposite runway end + */ + + VPolySet_Add(ps, build_rectangle( + -x, -y, + -x + length, -y + width, + whitePaintColor, MARKING_CULL_DISTANCE, RWYtoXYZ ) ); + + } +} + + +VPolySet * +runway_build(char *id, VMatrix * RWYtoXYZ, double length, double width, + double heading) +{ + double start, stop, x, delta_x, y; + int n, i, stripes; + VPolySet *ps; + + + /* + * Init module. + */ + if ( characters == NULL ) { + InitBuildChar(); + runwayColor = VColor_getByName(RUNWAY_COLOR, 1); + whitePaintColor = VColor_getByName(WHITE_PAINT, 1); + memory_registerCleanup(runway_cleanup); + } + + ps = VPolySet_New(); + +/* + * First, add the runway surface polygon, a rectangle spanning + * on x=[-length/2,lenght/2] and y=[-height/2,height/2]. + * Longer runways are splitted in several shorter pieces for + * better haze rendering. + */ + + if( length <= 500.0 ){ + n = 1; + delta_x = length; + } else { + n = (int) ceil(length / 500.0); + delta_x = length / n; + } + + x = -length/2; + + for( i = 0; i < n; i++ ){ + + VPolySet_Add(ps, build_rectangle( + x, width/2, x + delta_x, -width/2, + runwayColor, RUNWAY_CULL_DISTANCE, RWYtoXYZ ) ); + + x += delta_x; + + } + + /* + * Runway numbers, both ends + */ + + start = -0.5 * length + CHAR_X_OFFSET; + stop = 0.5 * length - CHAR_X_OFFSET; + + if ( width >= 2.0 * CHAR_WIDTH + CHAR_MARGIN_Y ) { + + char hdg1[8], side1[8], hdg2[8], side2[8]; + + SplitRunwayName(id, heading, hdg1, side1, hdg2, side2); + + if ( strlen(side1) > 0 ) { + AddBigString(side1, RWYtoXYZ, start, 0.0, 1, ps); + start += CHAR_HEIGHT + CHAR_MARGIN_Y; + } + AddBigString(hdg1, RWYtoXYZ, start, 0.0, 1, ps); + start += CHAR_HEIGHT; + + if ( strlen(side2) > 0 ) { + AddBigString(side2, RWYtoXYZ, stop, 0.0, 0, ps); + stop -= CHAR_HEIGHT + CHAR_MARGIN_Y; + } + AddBigString(hdg2, RWYtoXYZ, stop, 0.0, 0, ps); + stop -= CHAR_HEIGHT; + + } + + /* + * Now the runway centerline markings. + */ + + start += 12.0 + CENTERLINE_LENGTH / 2.0; + stop -= 12.0 + CENTERLINE_LENGTH / 2.0; + + for (x = start; x < stop; x += CENTERLINE_LENGTH + CENTERLINE_GAP) { + + VPolySet_Add(ps, build_rectangle( + x - CENTERLINE_LENGTH / 2.0, CENTERLINE_WIDTH / 2.0, + x + CENTERLINE_LENGTH / 2.0, -CENTERLINE_WIDTH / 2.0, + whitePaintColor, MARKING_CULL_DISTANCE, RWYtoXYZ ) ); + + } + + /* + * Runway threshold stripes + */ + + /* From the Aeronautical Information Manual */ + + if (width >= 18.0) { + + stripes = 0; + + if (width >= 60.0) { + stripes = 16; + } + else if (width >= 45.0) { + stripes = 12; + } + else if (width >= 30.0) { + stripes = 8; + } + else if (width >= 23.0) { + stripes = 6; + } + else if (width >= 18.0) { + stripes = 4; + } + + stripes >>= 1; + + x = 0.5 * length - THRESHOLD_STRIPE_X_OFFSET; + y = width / 2.0 - THRESHOLD_STRIPE_Y_OFFSET; + + for (; stripes > 0; --stripes, + y -= THRESHOLD_STRIPE_WIDTH + THRESHOLD_STRIPE_MARGIN) { + + VPolySet_Add(ps, build_rectangle( + x, y, + x - THRESHOLD_STRIPE_LENGTH, y - THRESHOLD_STRIPE_WIDTH, + whitePaintColor, MARKING_CULL_DISTANCE, RWYtoXYZ ) ); + + /* + * Opposite stripe on same runway end + */ + + VPolySet_Add(ps, build_rectangle( + x, -y, + x - THRESHOLD_STRIPE_LENGTH, -y + THRESHOLD_STRIPE_WIDTH, + whitePaintColor, MARKING_CULL_DISTANCE, RWYtoXYZ ) ); + + /* + * Stripe on opposite runway end + */ + + VPolySet_Add(ps, build_rectangle( + -x, y, + -x + THRESHOLD_STRIPE_LENGTH, y - THRESHOLD_STRIPE_WIDTH, + whitePaintColor, MARKING_CULL_DISTANCE, RWYtoXYZ ) ); + + /* + * Opposite stripe on opposite runway end + */ + + VPolySet_Add(ps, build_rectangle( + -x, -y, + -x + THRESHOLD_STRIPE_LENGTH, -y + THRESHOLD_STRIPE_WIDTH, + whitePaintColor, MARKING_CULL_DISTANCE, RWYtoXYZ ) ); + + } + + } + + /* + * Fixed distance marker + */ + + if (length > units_FEETtoMETERS(3000.0)) { + + AddSymmetricPolygons(RWYtoXYZ, + 0.5 * length - FIXED_MARKER_X_OFFSET, + 0.5 * width - FIXED_MARKER_Y_OFFSET, + 1, + FIXED_MARKER_LENGTH, FIXED_MARKER_WIDTH, 0.0, + ps); + } + + return ps; +} diff -Nru acm-5.0/src/acm/runway.h acm-6.0+20200416/src/acm/runway.h --- acm-5.0/src/acm/runway.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/runway.h 2017-03-22 00:38:20.000000000 +0000 @@ -0,0 +1,28 @@ +#ifndef _runway_h +#define _runway_h + +#include "../V/VPoly.h" + +#ifdef runway_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +/** + * Build runway polygons. + * @param id Runway ends names separated by '/', ex. "10L/36R", in any order, + * 7 chars max. + * @param RWYtoXYZ Runway-to-world coord. transformation with origin in the + * middle of the runway, with x pointing in the range [0,180[ DEG of the + * geographical coors. and z pointing down. + * @param length Runway length (meters). + * @param width Runway width (meters). + * @param heading Runway heading; it MUST be normalized to the range [0,pi[. + * @return Set of polygons that draw the runway. + */ +EXTERN VPolySet * runway_build(char *id, VMatrix * RWYtoXYZ, double length, + double width, double heading); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/scale.c acm-6.0+20200416/src/acm/scale.c --- acm-5.0/src/acm/scale.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/scale.c 2017-07-11 07:43:22.000000000 +0000 @@ -0,0 +1,255 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1996 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#include +#include + +#include "../util/error.h" +#include "../V/Vlib.h" + +#define scale_IMPORT +#include "scale.h" + +static char * +skipBlanks(char *s) +{ + + for (; *s == ' '; s++); + return s; +} + +void +scale_draw(Viewport * vp, scale_Type * s, double value) +{ + + int ftw; + Alib_Point p; + Alib_Segment seg[32]; + int is = 0; + double tickDelta; + int top = s->yorg - s->length; + int yRef, tickDeltaPixels; + int y, w, v, hticks; + int ytick = (int) ((double) s->minorInterval / s->scale + 0.5); + int doMajor; + char str[16], *q; + + /* Very low zoom factors may reduce ytick to 0. Prevent division by 0: */ + if( ytick == 0 ) + return; + + ftw = VFontWidthPixels(vp, s->fontSize); + + yRef = s->yorg - (int) ((double) s->length / 2.0 + 0.5); + + tickDelta = value - + (double) ((int) value / s->minorInterval * s->minorInterval); + + tickDeltaPixels = (int) (tickDelta / s->scale + 0.5); + hticks = s->length / (2 * ytick); + y = yRef + hticks * ytick + tickDeltaPixels; + + if (value >= 0.0) + v = (int) (value - tickDelta - hticks * s->minorInterval); + else { + printf("scale.c, scale_draw(): can't do negative value scales, yet (1)\n"); + v = 0; + } + + if (tickDeltaPixels != 0) { + y -= ytick; + v += s->minorInterval; + } + + v = v / s->minorInterval * s->minorInterval; + +/* + * Draw the index mark + */ + + seg[is].y1 = seg[is].y2 = yRef; + if (s->orientation & scale_ORIENT_RIGHT) { + seg[is].x1 = s->xorg - 2; + seg[is].x2 = seg[is].x1 - s->indexSize; + } + else { + seg[is].x1 = s->xorg + 2; + seg[is].x2 = seg[is].x1 + s->indexSize; + } + ++is; + +/* + * step through the doMajor and minor ticks + */ + + for (; y > top; (y -= ytick, v += s->minorInterval)) { + +/* we don't mark negative ticks */ + + if (v < 0) + continue; + + seg[is].x1 = s->xorg; + seg[is].y1 = seg[is].y2 = p.y = y; + + if ((v % s->majorInterval) == 0) { + doMajor = 1; + w = s->majorSize; + if (s->orientation & scale_ORIENT_RIGHT) + seg[is].x2 = s->xorg + w; + else + seg[is].x2 = s->xorg - w; + sprintf(str, s->format, (double) v / s->divisor); + q = skipBlanks(str); + p.y += (int) (0.30 * s->fontSize + 0.5); + if (s->orientation & scale_ORIENT_RIGHT) { + p.x = seg[is].x2 + 3; + } + else { + p.x = seg[is].x2 - 3 - ftw * strlen(q); + } + } + else { + doMajor = 0; + w = s->minorSize; + if (s->orientation & scale_ORIENT_RIGHT) + seg[is].x2 = s->xorg + w; + else + seg[is].x2 = s->xorg - w; + } + if (doMajor) + VDrawStrokeString(vp, p.x, p.y, q, strlen(q), + s->fontSize, s->pixel); + ++is; + } + + VDrawSegments(vp, seg, is, s->pixel); + +} + +void +scale_drawCompass(Viewport * vp, scale_Type * s, double value) +{ + + int ftw; + Alib_Point p; + Alib_Segment seg[32]; + int is = 0; + int top = s->xorg + s->length; + int x, w, v; + int xtick = (int) ((double) s->minorInterval / s->scale + 0.5); + int doMajor; + char str[16], *q; + double tickDelta; + int tickDeltaPixels, xRef, hticks; + + /* Very low zoom factors may reduce xtick to 0. Prevent division by 0: */ + if( xtick == 0 ) + return; + + ftw = VFontWidthPixels(vp, s->fontSize); + + xRef = s->xorg + (int) ((double) s->length / 2.0 + 0.5); + + tickDelta = value - + (double) ((int) value / s->minorInterval * s->minorInterval); + + tickDeltaPixels = (int) (tickDelta / s->scale + 0.5); + hticks = s->length / (2 * xtick); + x = xRef - hticks * xtick - tickDeltaPixels; + + v = (int)(value - tickDelta - hticks * s->minorInterval); + + while(v < 0) + v += 36000; + + while(v >= 36000) + v -= 36000; + + if (tickDeltaPixels != 0) { + x += xtick; + v += s->minorInterval; + } + + v = v / s->minorInterval * s->minorInterval; + +/* + * Draw the index mark + */ + + seg[is].x1 = seg[is].x2 = xRef; + if (s->orientation & scale_ORIENT_RIGHT) { + seg[is].y1 = s->yorg - 2; + seg[is].y2 = seg[is].y1 - s->indexSize; + } + else { + seg[is].y1 = s->yorg + 2; + seg[is].y2 = seg[is].y1 + s->indexSize; + } + ++is; + +/* + * step through the doMajor and minor ticks + */ + + for (; x < top; (x += xtick, v += s->minorInterval)) { + + if (v > 36000) + v -= 36000; + + if (is >= 32) + error_internal("too many segments: %d", is); + + seg[is].y1 = s->yorg; + seg[is].x1 = seg[is].x2 = p.x = x; + + if ((v % s->majorInterval) == 0) { + doMajor = 1; + w = s->majorSize; + if (s->orientation & scale_ORIENT_RIGHT) + seg[is].y2 = s->yorg + w; + else + seg[is].y2 = s->yorg - w; + sprintf(str, s->format, (double) v / s->divisor); + q = skipBlanks(str); + p.x -= (strlen(q) * ftw) / 2; + if (s->orientation & scale_ORIENT_RIGHT) { + p.y = seg[is].y2 + 3 + s->fontSize; + } + else { + p.y = seg[is].y2 - 3; + } + } + else { + doMajor = 0; + w = s->minorSize; + if (s->orientation & scale_ORIENT_RIGHT) + seg[is].y2 = s->yorg + w; + else + seg[is].y2 = s->yorg - w; + } + + if (doMajor) + VDrawStrokeString(vp, p.x, p.y, q, strlen(q), + s->fontSize, s->pixel); + ++is; + } + + VDrawSegments(vp, seg, is, (Alib_Pixel) s->pixel); + +} diff -Nru acm-5.0/src/acm/scale.h acm-6.0+20200416/src/acm/scale.h --- acm-5.0/src/acm/scale.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/scale.h 2017-03-22 00:34:39.000000000 +0000 @@ -0,0 +1,57 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991,1992 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#ifndef _scale_h +#define _scale_h + +#include "../V/Vlib.h" + +#ifdef scale_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +typedef enum { + scale_ORIENT_LEFT, + scale_ORIENT_RIGHT, + scale_ORIENT_HORIZONTAL +} scale_Orient; + +typedef struct { + int xorg; /* x loc of bottom of scale */ + int yorg; /* y loc of bottom of scale */ + int length; /* length of scale (pixels) */ + scale_Orient orientation; /* orientation flags */ + double scale; /* units per pixel */ + int minorInterval; /* units per minor tick */ + int minorSize; /* width of minor ticks (pixels) */ + int majorInterval; /* units per major tick */ + int majorSize; /* width of major ticks (pixels) */ + int indexSize; /* width of index (pixels) */ + double divisor; /* divisor on digit scale */ + char *format; /* output format */ + int pixel; /* pixel value to use when drawing */ + int fontSize; /* font size (pixels) */ +} scale_Type; + +EXTERN void scale_draw(Viewport * vp, scale_Type * s, double value); +EXTERN void scale_drawCompass(Viewport * vp, scale_Type * s, double value); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/sounds.c acm-6.0+20200416/src/acm/sounds.c --- acm-5.0/src/acm/sounds.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/sounds.c 2017-10-22 14:52:04.000000000 +0000 @@ -0,0 +1,237 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1994 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#include + +#include "pm.h" +#include "init.h" +#include "../util/error.h" +#include "../util/memory.h" +#include "../util/audio.h" + +#define sounds_IMPORT +#include "sounds.h" + +// BEWARE: the index of this array must match the sounds_SoundID enum values. +static char *files[] = +{ + "sounds/DUMMY-ARRAY-ENTRY.wav", // never really loaded + "sounds/generic-piston-engine.wav", + "sounds/generic-jet-engine.wav", + "sounds/generic-rocket-engine.wav", + "sounds/crash.wav", + "sounds/gear_up.wav", + "sounds/gear_dn.wav", + "sounds/missile.wav", + "sounds/cannon.wav", + "sounds/crash.wav", + "sounds/screetch.wav", + "sounds/warning.wav", + "sounds/stall.wav", + "sounds/rwr.wav", + "sounds/apglock.wav" +}; + + +typedef struct { + + /** If sound playing is enabled (that is, not muted). */ + int isEnabled; + + /** Engine sound ID. */ + sounds_SoundID engine_sound; + + /** Cached loaded sounds. */ + audio_Type *samples[sounds_NumberOfSounds]; + +} sounds_Type; + + +/** + * Returns the current instance of this module bound to the aircraft. + * @param c + * @return Current instance bound to the craft, or NULL if no current instance + * exists or the aircraft has no viewer. + */ +static sounds_Type * sounds_getCurrentInstance(craft *c) +{ + if( c->vl == NULL ) + return NULL; + return c->vl->sounds; +} + + +static audio_Type *sounds_loadAndCacheSample(sounds_Type *this, sounds_SoundID id) +{ + if( !(0 <= id && id < sounds_NumberOfSounds) ) + error_internal("sound ID out of the range: %d", id); + + if( this->samples[id] == NULL ){ + this->samples[id] = audio_new( init_findFile(files[id]) ); + } + return this->samples[id]; +} + + +static void sounds_destruct(void *p) +{ + sounds_Type *this = p; + int i; + for(i = 0; i < sounds_NumberOfSounds; i++) + memory_dispose(this->samples[i]); +} + + +static sounds_Type * sounds_new(craft *c) +{ + viewer *v = c->vl; + if( v == NULL ) + error_internal("no viewer associated to craft", 0); + + sounds_Type *this = memory_allocate(sizeof(sounds_Type), sounds_destruct); + + this->isEnabled = 0; + + switch(v->c->cinfo->engineType){ + + case inventory_NoEngine: + this->engine_sound = sounds_None; break; + + case inventory_GenericPistonEngine: + this->engine_sound = sounds_GenericPistonEngine; break; + + case inventory_GenericJetEngine: + this->engine_sound = sounds_GenericJetEngine; break; + + case inventory_GenericRocketEngine: + this->engine_sound = sounds_GenericRocketEngine; break; + + default: + this->engine_sound = sounds_None; break; + } + + int i; + for (i = 0; i < sounds_NumberOfSounds; ++i) { + + // Sound samples are loaded only if needed: + this->samples[i] = NULL; + + // ... but check all the sounds are there to avoid surprises later :-) + if( i > 0 ) + /* ignore = */ init_findFile( files[i] ); + } + + // Avoid delay playing the "screech" sound at touchdown, cache right now: + /* ignore = */ sounds_loadAndCacheSample(this, sounds_Touchdown); + + v->sounds = this; + return this; +} + + +void sounds_enable(craft *c, int enable) +{ + sounds_Type *this = sounds_getCurrentInstance(c); + + if( enable ){ + if( this == NULL ) + this = sounds_new(c); + this->isEnabled = 1; + + } else { + if( this == NULL || ! this->isEnabled ) + return; + this->isEnabled = 0; + // Stop any sound we are currently playing: + int i; + for(i = sounds_NumberOfSounds-1; i >= 0; i--){ + if( this->samples[i] != NULL ) + sounds_stopSound(c, i); + } + } +} + + +int sounds_isEnabled(craft * c) +{ + sounds_Type *this = sounds_getCurrentInstance(c); + if( this == NULL ) + return 0; + else + return this->isEnabled; +} + + +void +sounds_playSound(craft * c, sounds_SoundID id, int loop) +{ + sounds_Type *this = sounds_getCurrentInstance(c); + if( this == NULL || ! this->isEnabled ) + return; + + audio_Type *sample = sounds_loadAndCacheSample(this, id); + if( ! loop && ! audio_isPlaying(sample) ) + audio_setCurrentPositionMilliseconds(sample, 0); + audio_loop(sample, loop); + audio_play(sample); +} + + +void +sounds_stopSound(craft * c, sounds_SoundID id) +{ + if( !(0 <= id && id < sounds_NumberOfSounds) ) + error_internal("sound ID out of the range: %d", id); + sounds_Type *this = sounds_getCurrentInstance(c); + if( this == NULL ) + return; + audio_Type *sample = this->samples[id]; + if( sample == NULL ) + return; + audio_pause(sample); + audio_setCurrentPositionMilliseconds(sample, 0); +} + + +void +sounds_setBackgroundSound(craft * c, double rpm_rate, + int afterburner, double dynamicPressure) +{ + sounds_Type *this = sounds_getCurrentInstance(c); + if( this == NULL ) + return; + + if( this->engine_sound == sounds_None + || ( ! this->isEnabled && this->samples[this->engine_sound] == NULL ) ) + return; + + audio_Type *sample = sounds_loadAndCacheSample(this, this->engine_sound); + if( ! this->isEnabled || rpm_rate < 0.1 ){ + audio_pause(sample); + } else { + audio_setCurrentSamplesPerSecond(sample, rpm_rate * audio_getOriginalSamplesPerSecond(sample)); + audio_loop(sample, 1); + audio_play(sample); + } +} + + +void +sounds_update(craft * c) +{ +} diff -Nru acm-5.0/src/acm/sounds.h acm-6.0+20200416/src/acm/sounds.h --- acm-5.0/src/acm/sounds.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/sounds.h 2017-09-11 15:40:50.000000000 +0000 @@ -0,0 +1,99 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1998 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#ifndef sounds_h +#define sounds_h + +#include "pm.h" + +#ifdef sounds_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +/** + * Pre-defined sound IDs. + */ +typedef enum { + sounds_None = -1, + sounds_NoEngine, + sounds_GenericPistonEngine, + sounds_GenericJetEngine, + sounds_GenericRocketEngine, + sounds_Crash, + sounds_GearUp, + sounds_GearDown, + sounds_MissileLaunch, + sounds_CannonFiring, + sounds_Explosion, + sounds_Touchdown, + sounds_GenericWarning, + sounds_StallWarning, + sounds_LockWarning, + sounds_APGLockAcquired, + sounds_NumberOfSounds // Gives the total number of defined sounds. +} sounds_SoundID; + +/** + * Enables or disables sounds playing. When enabled the first time, a sounds + * data structure is attached to the "sounds" field of the viewer of the aircraft; + * this field must be released along with the viewer using memory_dispose(). + * @param status True to enable sounds, false to mute. + */ +EXTERN void sounds_enable(craft * c, int enable); + +/** + * Returns true if allowed to play sounds, false if muted. + */ +EXTERN int sounds_isEnabled(craft * c); + +/** + * + * Sets the engine background sound on all the viewers of this plane. + * @param c + * @param rpm_rate RPM rate in [0,1]. + * @param afterburner Afterburner enabled. + * @param dDynamicPressure IGNORED. + */ +EXTERN void sounds_setBackgroundSound(craft * c, double rpm_rate, + int afterburner, double dynamicPressure); + +/** + * Play a sound one time or continously on all the viewers of this plane. + * @param c + * @param id + * @param loop + */ +EXTERN void sounds_playSound(craft * c, sounds_SoundID id, int loop); + +/** + * Stop the execution of the sound started by playSound on all the viewers of + * that plane. + * @param c + * @param id + */ +EXTERN void sounds_stopSound(craft * c, sounds_SoundID id); + +/** + * To be called continously to update the audio. + */ +EXTERN void sounds_update(craft * c); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/terminal.c acm-6.0+20200416/src/acm/terminal.c --- acm-5.0/src/acm/terminal.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/terminal.c 2017-10-28 08:36:01.000000000 +0000 @@ -0,0 +1,351 @@ +/* + * acm - Virtual terminal + * Copyright (C) 2007 Umberto Salsi + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#include +#include "../util/memory.h" +#include "../V/Vlib.h" +#include "pm.h" + +#define terminal_IMPORT +#include "terminal.h" + +#define TAB_LEN 8 + +#define ROWS 20 +#define COLS 40 +#define KBD_BUF_SIZE 50 + +typedef struct _terminal_data { + struct _terminal_data *next; + + _BOOL show; /* show the terminal on the viewport */ + + int cursor_row, cursor_col; + char screen[ROWS][COLS]; + + char kbd_buf[KBD_BUF_SIZE]; /* chars got from keyboard */ + int kbd_n; /* no. of chars in keyboard buffer */ +} terminal_data; + + +static terminal_data *free_list = NULL; + +static _BOOL blink = FALSE; +static double blink_toggle_time = 0.0; + + +static void terminal_cleanup() +{ + terminal_data *trm; + + while( free_list != NULL ){ + trm = free_list; + free_list = trm->next; + memory_dispose(trm); + } + + free_list = NULL; +} + + +static void terminal_clear(terminal_data *trm) +{ + memset(&trm->screen, ' ', ROWS*COLS); + trm->cursor_row = 0; + trm->cursor_col = 0; +} + + +static void terminal_scroll(terminal_data *trm) +{ + memmove(&trm->screen, &trm->screen[1], (ROWS-1)*COLS); + memset(&trm->screen[ROWS-1], ' ', COLS); +} + + +static void terminal_putc(terminal_data *trm, int ch) +{ + int c; + + if( ch == '\r' ){ + trm->cursor_col = 0; + + } else if( ch == '\n' ){ + trm->cursor_row++; + if( trm->cursor_row >= ROWS ){ + trm->cursor_row = ROWS-1; + terminal_scroll(trm); + } + + } else if( ch == '\t' ){ + c = trm->cursor_col; + c += TAB_LEN; + c -= c % TAB_LEN; + trm->cursor_col = c; + while( trm->cursor_col >= COLS ){ + trm->cursor_col -= COLS; + trm->cursor_row += 1; + if( trm->cursor_row >= ROWS ){ + trm->cursor_row = ROWS-1; + terminal_scroll(trm); + } + } + + } else if( ch == '\010' /* BS */ ){ + if( trm->cursor_row == 0 && trm->cursor_col == 0 ) + return; + trm->cursor_col--; + if( trm->cursor_col < 0 ){ + trm->cursor_row--; + trm->cursor_col = COLS-1; + } + + } else if( ch >= 32 ){ + + if( ch >= 127 ) + ch = '?'; + + trm->screen[ trm->cursor_row ] [ trm->cursor_col ] = ch; + + trm->cursor_col++; + if( trm->cursor_col >= COLS ){ + trm->cursor_col = 0; + trm->cursor_row++; + if( trm->cursor_row >= ROWS ){ + trm->cursor_row = ROWS-1; + terminal_scroll(trm); + } + } + + } else { + /* ignore */ + + } +} + + +void terminal_write(viewer *u, char *s) +{ + terminal_data *trm; + + trm = (terminal_data *) u->terminal; + while( *s != '\0' ){ + terminal_putc(trm, *s); + s++; + } +} + + +void terminal_enable(viewer *u) +{ + terminal_data *trm; + + if( u->terminal != NULL ){ + trm = (terminal_data *) u->terminal; + trm->show = TRUE; + return; + } + + if( free_list == NULL ){ + memory_registerCleanup(terminal_cleanup); + trm = memory_allocate( sizeof(terminal_data), NULL ); + } else { + trm = free_list; + free_list = free_list->next; + } + + trm->show = TRUE; + terminal_clear(trm); + trm->kbd_n = 0; + u->terminal = trm; + + terminal_write(u, "Terminal ready. Press F1 again to exit from the terminal. Type \"help\" to get help.\n\r"); +} + + +void terminal_disable(viewer *u) +{ + terminal_data *trm; + + if( u->terminal == NULL ) + return; + + trm = (terminal_data *) u->terminal; + trm->show = FALSE; +} + + +_BOOL terminal_enabled(viewer *u) +{ + return (u->terminal != NULL) && ((terminal_data *)u->terminal)->show; +} + + +void terminal_toggle(viewer *u) +{ + if( terminal_enabled(u) ) + terminal_disable(u); + else + terminal_enable(u); +} + + +void terminal_input_char(viewer *u, int ch) +{ + terminal_data * trm; + + if( ! terminal_enabled(u) ) + return; + + trm = (terminal_data *) u->terminal; + + if( (ch >= ' ' && ch <= 126) || (ch == '\r') || (ch == '\n') ){ + if( trm->kbd_n < KBD_BUF_SIZE ){ + if( ch == '\r' || ch == '\n' ){ + /* FIXME: set a flag telling we already have a complete line */ + trm->kbd_buf[ trm->kbd_n++ ] = '\0'; + terminal_write(u, "\r\n"); + } else if( trm->kbd_n <= KBD_BUF_SIZE-2 ){ + trm->kbd_buf[ trm->kbd_n++ ] = ch; + terminal_putc(trm, ch); + } else { + /* keyboard buffer full */ + } + } else { + /* FIXME: keyboard buffer full */ + } + } else if( ch == '\010' /* BS */ || ch == '\177' /* DEL */ ){ + if( trm->kbd_n > 0 && trm->kbd_buf[ trm->kbd_n - 1 ] != '\0' ){ + trm->kbd_n--; + terminal_write(u, "\010 \010"); + } + } +} + + +_BOOL terminal_read_string(viewer *u, char *s, int s_len) +{ + terminal_data *trm; + char *eol; + int n; + + if( s_len <= 0 ) + return FALSE; + + if( u->terminal == NULL ) + return FALSE; + + trm = (terminal_data *) u->terminal; + + if( trm->kbd_n == 0 ) + return FALSE; + + eol = (char *) memchr(&trm->kbd_buf, 0, trm->kbd_n); + + if( eol == NULL ){ + /* incomplete line */ + if( trm->kbd_n >= KBD_BUF_SIZE ){ + /* FIXME: always returns a full buffer as if it were a + complete line */ + n = trm->kbd_n; + if( n >= s_len ) + n = s_len-1; + memcpy(s, &trm->kbd_buf, n); + s[n] = '\0'; + memmove(&trm->kbd_buf, &trm->kbd_buf[n], trm->kbd_n - n); + trm->kbd_n -= n; + return TRUE; + } + return FALSE; /* incomplete line */ + + } else { + /* complete line available */ + n = eol - &trm->kbd_buf[0]; + if( n < s_len ){ + memcpy(s, &trm->kbd_buf, n); + s[n] = '\0'; + memmove(&trm->kbd_buf, eol+1, trm->kbd_n - n-1); + trm->kbd_n -= n+1; + } else { + n = s_len-1; + memcpy(s, &trm->kbd_buf, n); + s[n] = '\0'; + memmove(&trm->kbd_buf, &trm->kbd_buf[n], trm->kbd_n - n); + trm->kbd_n -= n; + } + return TRUE; + } +} + + +void terminal_draw(viewer *u) +{ + double fh, fw, lh; + terminal_data *trm; + int row; + Alib_Rect rect; + + if( ! terminal_enabled(u) ) + return; + + trm = (terminal_data *) u->terminal; + + if( ! trm->show ) + return; + + /* FIXME: dynamically determinate terminal size and font height + based on the current dimension of u->width, u->height */ + fh = 10.0; /* font height */ + fw = fh; /* font width */ + lh = fh + fh/2.0; /* line height */ + + Alib_setRect(&rect, 0, 0, (int)(COLS*fw+0.5), (int)(ROWS*lh+0.5)); + VSetClipRect(u->v, &rect); + for( row=0; rowv, 0, (int)(row*lh+fh+0.5), + &(trm->screen[row][0]), COLS, (int)(fh+0.5), whiteColor); + + /* Set blink flag: */ + if( curTime >= blink_toggle_time ){ + blink = ! blink; + if( blink ) + blink_toggle_time = curTime + 0.3; + else + blink_toggle_time = curTime + 0.7; + } + + if( ! blink ){ + VDrawStrokeString(u->v, + (int)(trm->cursor_col*fw+0.5), (int)(trm->cursor_row*lh+fh+0.5), + "_", 1, (int)(fh+0.5), whiteColor); + } +} + + +void terminal_free(viewer *u) +{ + terminal_data *trm; + + if( u->terminal == NULL ) + return; + + trm = (terminal_data *) u->terminal; + trm->next = free_list; + free_list = trm; + u->terminal = NULL; +} diff -Nru acm-5.0/src/acm/terminal.h acm-6.0+20200416/src/acm/terminal.h --- acm-5.0/src/acm/terminal.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/terminal.h 2017-10-28 08:35:53.000000000 +0000 @@ -0,0 +1,81 @@ +/* + * acm - Virtual terminal + * Copyright (C) 2007 Umberto Salsi + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +/* + This module implements a textual terminal where commands from the + users can be accepted and outputs can be displayed. Every terminal + is attached to a viewer data structure. Mostly useful for debugging + at run-time. +*/ + +#ifndef _terminal_h +#define _terminal_h + +#include "pm.h" + +#ifdef terminal_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +/* + Enable/ disable/ toggle the terminal. +*/ +EXTERN void terminal_toggle(viewer *u); +EXTERN void terminal_enable(viewer *u); +EXTERN void terminal_disable(viewer *u); + +/* + Return TRUE if the terminal is currently enabled +*/ +EXTERN _BOOL terminal_enabled(viewer *u); + +/* + Send this char to the terminal +*/ +EXTERN void terminal_input_char(viewer *u, int ch); + +/* + Return TRUE if a complete line of input from the terminal is + available. The string is returned in the buffer s, s_len bytes long. +*/ +EXTERN _BOOL terminal_read_string(viewer *u, char *s, int s_len); + +/* + Send the string to the terminal. Recognized control codes are: + NL \n, CR \r, HT \t, BS \010. Any other control char is ignored. + Coded above 127 are displayed as "?". +*/ +EXTERN void terminal_write(viewer *u, char *s); + +/* + If the terminal is currently active, display its contents +*/ +EXTERN void terminal_draw(viewer *u); + +/* + Disable and release the internal memory for this terminal. Internal + buffers are not actually released, as thay may be re-used next for + a new terminal. To actually release the occupied memory the next + function can be called. +*/ +EXTERN void terminal_free(viewer *u); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/terrain.c acm-6.0+20200416/src/acm/terrain.c --- acm-5.0/src/acm/terrain.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/terrain.c 2017-10-20 00:53:51.000000000 +0000 @@ -0,0 +1,72 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1997 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#include +#include "pm.h" + +#define terrain_IMPORT +#include "terrain.h" + + +static inline double sqr(double x) +{ + return x * x; +} + + +static double dist2(VPoint * a, VPoint *b) +{ + return sqr(a->x - b->x) + sqr(a->y - b->y) + sqr(a->z - b->z); +} + + +double terrain_localAltitude(craft *c) +{ + double d2_min, d2, z; + + if( c->terrain_altitude_timeout > curTime ) + // Return the cached value. + return c->terrain_altitude; + + // Schedule an update timeout as the aircraft moves at least 0.1 NM: + double dt = 0.1*units_NmToFeetFactor / (fabs(c->Cg.x) + fabs(c->Cg.y) + 1); + // ...but not too late because it might accelerate in the meanwhile: + if( dt > 5 ) dt = 5; + c->terrain_altitude_timeout = curTime + dt; + + // Search nearest runway within 100 NM. If none found, assume sea level. + d2_min = sqr( units_NMtoMETERS(100) ); + z = 0.0; // Sea level. + craft *rwy = stbl; + while( rwy != NULL ){ + if( rwy->type == CT_SURFACE && (rwy->flags && FL_FIXED_OBJECT) ){ + // It is a runway. + d2 = dist2(&c->Sg, &rwy->Sg); + if( d2 < d2_min ){ + d2_min = d2; + z = rwy->w.z; + } + } + rwy = rwy->next; + } + + // Save cached value: + c->terrain_altitude = z; + + return z; +} diff -Nru acm-5.0/src/acm/terrain.h acm-6.0+20200416/src/acm/terrain.h --- acm-5.0/src/acm/terrain.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/terrain.h 2017-10-20 00:53:51.000000000 +0000 @@ -0,0 +1,48 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1998 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#ifndef _terrain_h +#define _terrain_h + +#include "pm.h" + +#ifdef terrain_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +/** + * Returns the altitude over the sea level of the terrain under the aircraft. + * The "sea level" is the surface of the WGS84 ellipsoid. + * + * Implementation: takes the altitude of the closer runway within 100 NM "down + * range"; if none found, the sea level zero is returned. + * + * Since the terrain changes its altitude very slowly, values are cached + * in c->local_altitude and updated only if c->local_altitude_timeout > + * curTime, then the timeout is moved forward a few to avoid to repeat + * the same calculation to often. + * @param c The aircraft. + * @return Terrain altitude over the WGS84 ellipsoid of the point below the + * given aircraft position (m). +*/ +EXTERN double terrain_localAltitude(craft *c); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/update.c acm-6.0+20200416/src/acm/update.c --- acm-5.0/src/acm/update.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/update.c 2017-10-28 12:54:56.000000000 +0000 @@ -0,0 +1,338 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1998 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +/* + * IMPLEMENTATION NOTES. + * + * This implementation basically exports the update_redraw() function which is + * responsible for all the dynamics and graphics updates. Each time that function + * gets called, a new updated frame is drawn. This function is also responsible + * to keep the internal notion of time and "delta t". + * + * This "delta t" is periodically adjusted so that the simulation time follows + * the wall clock. Since the wall clock is given by the gettimeofday() function, + * and since this function has very high precision but typically very coarse grain, + * that comparison can be made only at wide intervals of time so that the grain + * becomes negligible and the interval of time is meaningful. + * + * Dynamics calculations are generally much lighter in terms of CPU usage than + * graphic 3D calculations and screen updates, so it does not hurt to perform + * several cycles of dynamic updates per each drawn frame in order to improve + * the numerical stability of the simulated models (mainly, of the landing gear + * with its very demanding timings). 50 Hz may be a good compromise, so if the + * requested frame rate is, say, 20 Hz, then the dynamics should be re-calculated + * 2 or 3 times per frame so attaining an update rate of 40 or 60 Hz respectively. + */ + +#include +#include + +#include "alarm.h" +#include "box.h" +#include "dis_if.h" +#include "events.h" +#include "pm.h" +#include "prompt.h" +#include "render.h" +#include "../util/memory.h" +#include "../util/timer.h" + +#define update_IMPORT +#include "update.h" +#include "radar.h" + +/** + * Optimal update rate (Hz). This is a compromise between numerical stability + * (requiring higher values) and CPU saving (requiring 1 as a minimum). + * See also the comments about the updates_per_frame variable. + */ +#define UPDATE_RATE_OPTIMAL 60 + +#define FRAME_RATE_FEEDBACK_INTERVAL 60.0 + +/** + * How many times to cycle through the dynamic calculations per displayed frame. + * This value must be at least 1 (obviously), but the resulting update rate + * + * update_rate = updates_per_frame * frame_rate + * + * should be around optimal value. The actual attained update rate is + * periodically evaluated, and this value is tuned accordingly in order to keep + * the resulting update rate close to the optimal one. + */ +static int updates_per_frame = 10; + +/** + * When we started counting processed screen frames and dynamic updates + * (monotonic system time, s). + */ +static double start_count; + +/** Number of processed screen frames since we start counting. */ +static int frame_count; + +/** Current system monotonic time (s). */ +static double sysmon; + + +/** + * Returns the "system monotonic time" sysmon. Sysmon starts at 0 and + * basically follows "gettimeofday()", but it is monotonic. It suffers of the + * same coarse granularity of gettimeofday(), typically 10 ms under Linux and + * 15 ms under Windows, so it is not suitable by itself for our simulator; it + * is pretty useless to call this function at every update cycle of the + * simulation because it would return the same value most of the times! + */ +static double update_updateSysmon() +{ + static int sysmon_initialized = 0; + static struct timeval sysmon_prev; + struct timeval curr; + struct timezone tz; + + gettimeofday(&curr, &tz); + + if( ! sysmon_initialized ){ + /* Initialize monotonic clock. */ + sysmon_initialized = 1; + sysmon_prev = curr; + sysmon = 0.0; + } else { + /* Evaluates delta_usec since last invocation: */ + long delta_usec = 1000000 * (curr.tv_sec - sysmon_prev.tv_sec) + + (curr.tv_usec - sysmon_prev.tv_usec); + if( delta_usec > 0 ){ + sysmon += 1e-6 * delta_usec; + sysmon_prev = curr; + } else if( delta_usec < 0 ){ + /* Clock step backward (user adjust, NTP, ...). Reset: */ + sysmon_prev = curr; + } + } + return sysmon; +} + + +/** + * Updates the simulation time curTime and the time interval deltaT overcoming + * the limitation of the coarse granularity of the monotonic system time. + * It does that by evaluating an average time interval deltaT between the calls + * of this function, and then adjusting this interval so that the resulting + * simulation time curTime smoothly follows the system monotonic time. + * It is then guaranteed the sum of all the time intervals always matches the + * total simulation time. + */ +void update_simulationTime () +{ + static double dt = 0.01; // current estimated dt + static double t0; // time of the last dt evaluation + static int n; // no. of iterations + + /* Evaluate dt if enough data available. */ + n++; + if( (n & 7) == 0 /* ...not too often */ + && n > updates_per_frame /* ...include at least 1 frame */ ){ + double t1 = update_updateSysmon(); + if( t1 - t0 > 0.5 ){ + + /* At least 0.5 s elapsed: several system ticks have been accounted, + * so time difference on sysmon is meaningful. Moreover, a good + * number of iterations have been accounted. Then the ratio + * (t1 - t0)/n is a good estimation of the real dt over the + * past n iterations. + * + * But this is not enough. We also require the simulation time + * curTime to be as close as possible to the sysmon. + * So, evaluate dt so to realign curTime to the sysmon within a given + * recovery time. The recovery time is chosen so the realignment + * process be smooth and to prevent div by zero (1 term + * added). + * + * Note that if the error is zero it means curTime is perfectly + * aligned with sysmon and the new evaluated dt is just the average + * time interval of the last n iterations. + */ + + double error = curTime - t1; + double recovery_time = 1.0 + fabs(error); + dt = (recovery_time - error) * (t1 - t0) / (recovery_time * n); + // Safety: bounds dt to +/-25% of the "optimal" update rate + if( dt < 0.75 / UPDATE_RATE_OPTIMAL ) + dt = 0.75 / UPDATE_RATE_OPTIMAL; + else if( dt > 1.25 / UPDATE_RATE_OPTIMAL ) + dt = 1.25 / UPDATE_RATE_OPTIMAL; + t0 = t1; + n = 0; + } + } + + curTime += dt; + deltaT = dt; + halfDeltaTSquared = 0.5 * dt * dt; +} + + +/** + * Basically updates the dynamics and displays a new frame on each viewer. + * Performs the dynamics calculations updates over all the simulated entities, + * updates the dead reckoning position of the remote entities, receives incoming + * packets, draws the updates window frame on each active viewer, etc. + * Periodically evaluates and returns the actual frame rate. + * The caller is responsible to call this function periodically with a rate that + * matches the user's requested frame rate, and avoiding to waste too much CPU + * time by performing some delay from a frame to the next. + * @return Actual frame rate (Hz) if non-negative, otherwise not available because + * still evaluating. Note that a frame rate of zero is possible due to the int + * limited precision! + */ +static int update_redraw(void) +{ + + int i, j; + craft *c; + char *killReason; + + /* + * Update the dynamics of the simulated entities and updates the dead + * reckoning of the remote entities. + */ + j = updates_per_frame; + do { + + update_simulationTime(); + + /* + * Jobs at high priority to be executed at UPDATE_RATE_OPTIMAL rate here. + */ + + /* Update time in DIS interface module for correct DR calculations. */ + if (dis_if_haveAbsoluteTime) + dis_if_setTimeAbsolute(); + else + dis_if_setTime(curTime); + + /* Get latest remote events. */ + dis_if_receive(); + + for ((i = 0, c = ptbl); i < manifest_MAXPLAYERS; (++i, ++c)) { + if( c->type == CT_FREE || (c->flags & FL_BLACK_BOX) ) + continue; + killReason = c->update(c); + if( killReason != NULL ) + c->kill(c, killReason); + } + + for ((i = 0, c = mtbl); i < manifest_MAXPROJECTILES; (++i, ++c)) { + if(c->type == CT_FREE) + continue; + killReason = c->update(c); + if( killReason != NULL ) + c->kill(c, killReason); + } + + j--; + } while(j > 0); + + /* + * Jobs with lesser priority to be executed at frame rate and + * at the "user's experience time scale": + */ + + /* + * GUI events: + */ + events_window_keyb_buttons(); + + box_input(); + + /* + * Update radar emissions: visible targets and received beams. + */ + for (i = 0; i < manifest_MAXPLAYERS; i++){ + c = &ptbl[i]; + if( c->type != CT_FREE ) + radar_calculateEmissions(c); + } + + /* + * Render cockpit view(s): + */ + + frame_count++; + render_drawCockpitViews(); + + box_output(); + + alarm_update(); + + /* + * Evaluate actual frame rate and adjust update rate accordingly. + */ + int frame_rate = -1; + double elapsed = sysmon - start_count; + if (frame_count >= 2 && elapsed >= 0.2) { + + // Evaluate actual frame rate: + frame_rate = frame_count / elapsed + 0.5; + if( frame_rate < 1 ) + frame_rate = 1; + + // Adjust the update rate according to the actual frame rate: + updates_per_frame = (double) UPDATE_RATE_OPTIMAL / frame_rate + 0.5; + if( updates_per_frame < 1 ) + updates_per_frame = 1; + + // Reset frame rate counters: + start_count = sysmon; + frame_count = 0; + } + + return frame_rate; +} + + +void update_loop(int frame_rate) +{ + if( frame_rate < 1 ) + frame_rate = 1; + int frame_interval_ms = 1000 / frame_rate; + + double frame_rate_feedback_next = FRAME_RATE_FEEDBACK_INTERVAL; + + deltaT = 1.0 / UPDATE_RATE_OPTIMAL; + halfDeltaTSquared = 0.5 * deltaT * deltaT; + curTime = 0.0; + + timer_Type *t = timer_new(); + + // Loop until there is at least a viewer. + while ( vl_head != NULL ) { + timer_reset(t); + timer_start(t); + int frame_rate_actual = update_redraw(); + if( frame_rate_actual >= 0 && curTime > frame_rate_feedback_next ){ + char s[99]; + snprintf(s, sizeof(s), "Frame rate: %d Hz", frame_rate_actual); + prompt_broadcast_print(s); + frame_rate_feedback_next = curTime + FRAME_RATE_FEEDBACK_INTERVAL; + } + timer_sleepMilliseconds(frame_interval_ms - timer_getElapsedMilliseconds(t)); + } + + memory_dispose(t); +} \ No newline at end of file diff -Nru acm-5.0/src/acm/update.h acm-6.0+20200416/src/acm/update.h --- acm-5.0/src/acm/update.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/update.h 2017-07-20 16:03:17.000000000 +0000 @@ -0,0 +1,43 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1998 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#ifndef _update_h +#define _update_h + +#ifdef update_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +/** + * Main loop of the program. Returns when there are no more viewers. + * @param frame_rate Requested frame rate on each viewer (Hz). + */ +EXTERN void update_loop(int frame_rate); + +/** + * Update the variable curTime with the current time in seconds with the 0 set + * as the time the program was started (this to prevent the number to become too + * large, so loosing in precision). This clock is monotonic, that is curTime + * never decreases. + */ +EXTERN void update_simulationTime(void); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/viewer.c acm-6.0+20200416/src/acm/viewer.c --- acm-5.0/src/acm/viewer.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/viewer.c 2017-10-25 11:24:19.000000000 +0000 @@ -0,0 +1,142 @@ +#include + +#include "hsi.h" +#include "hud.h" +#include "instruments.h" +#include "magnetic_compass.h" +#include "../util/memory.h" +#include "pm.h" +#include "prompt.h" +#include "render.h" +#include "terminal.h" + +#define viewer_IMPORT +#include "viewer.h" + + +viewer * viewer_new(craft * c) +{ + viewer *v; + + v = (viewer *) memory_allocate(sizeof(viewer), NULL); + memset(v, 0, sizeof(viewer)); + + v->vl_next = vl_head; + vl_head = v; + + v->next = c->vl; + c->vl = v; + + v->viewer_state = ViewerStateNormal; + v->c = c; + v->watchedCraft = NULL; + v->hasFocus = FALSE; + v->hasComm = TRUE; + + /* FIXME: to-do fields + v->w = ...; + v->v = ...; + v->dpy = ...; + v->win = ...; + v->gc = ...; + v->cn = ...; + v->protocolsAtom = ...; + v->deleteWindowAtom = ...; + v->closedownAtom = ...; + + v->hud_yCenter = ... + */ + + /* + All the Rect, drawnItem and scale_Type fields are in charge + of the layout manager (see "windows" module). + */ + + v->zoom = 100; // 100% + v->hud_mode = FALSE; + + /* FIXME: to-do + v->xscaleFactor = ... + v->yscaleFactor = ... + v->z = + v->rz = ... + v->radarImage = ... + v->radarImageCount = ... + */ + v->browseBase = 0; + v->browseSelectedItem = -1; + v->browseClickTime = 0; + + /* Set v->viewDirection and v->viewUp: */ + render_setOutsideView(c, v, render_VIEW_FORWARD); + + v->hud = NULL; + v->magnetic_compass = NULL; + v->hsi = NULL; + v->adf = NULL; + v->sounds = NULL; + v->inst = NULL; + v->terminal = NULL; + v->prompt = NULL; + + return v; +} + + +void viewer_free(viewer *v) +{ + viewer *update_cur; + craft *c; + + /* + Release attached services: + */ + + memory_dispose(v->sounds); + hud_free(v); + magnetic_compass_free(v); + memory_dispose(v->adf); + hsi_free(v); + instruments_free(v); + terminal_free(v); + prompt_free(v); + + /* + Close the window + */ + + memory_dispose(v->v); + memory_dispose(v->w); + memory_dispose(v->gui); + + /* + Remove this viewer from the craft's list of viewers: + */ + + c = v->c; + + if( c->vl == v ){ + c->vl = v->next; + } else { + update_cur = c->vl; + while( update_cur->next != v ) + update_cur = update_cur->next; + update_cur->next = v->next; + } + + /* + Remove viewer from the list of viewers: + */ + + if( vl_head == v ){ + vl_head = v->vl_next; + } else { + update_cur = vl_head; + while( update_cur->vl_next != v ) + update_cur = update_cur->vl_next; + update_cur->vl_next = v->vl_next; + } + + memory_dispose(v); + +} diff -Nru acm-5.0/src/acm/viewer.h acm-6.0+20200416/src/acm/viewer.h --- acm-5.0/src/acm/viewer.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/viewer.h 2017-03-22 00:33:01.000000000 +0000 @@ -0,0 +1,44 @@ +/* + * acm : an aerial combat simulator for X -- Viewers handling module + * Copyright (C) 1991-1998 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#ifndef _vlist_h +#define _vlist_h + +#include "pm.h" + +#ifdef viewer_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +/** + * Attach a new viewer to the given aircraft and return its pointer. + * The field c->vl must be already initialized or set to NULL. + */ +EXTERN viewer * viewer_new(craft *c); + + +/** + * Release the viewer, close the window, and detach the viewer from the + * craft's list of viewers. + */ +EXTERN void viewer_free(viewer *v); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/vpath.c acm-6.0+20200416/src/acm/vpath.c --- acm-5.0/src/acm/vpath.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/vpath.c 2017-10-28 08:35:41.000000000 +0000 @@ -0,0 +1,270 @@ +/* + * ACM - 3-D draw utilities + * Copyright (C) 2008 Umberto Salsi + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#include "../V/VRoman.h" +#include "../util/memory.h" + +#define vpath_IMPORT +#include "vpath.h" + +typedef struct { + int s; /* no. of points allocated in p[] */ + int n; /* no. of points inserted in p[], n<=s */ + VPoint *p; /* array of one or more points */ +} VPathTrack; + +typedef struct vpath_Type { + int s; /* no. of tracks pointers allocated in p[] */ + int n; /* no. of tracks pointers inserted in p[], n<=s */ + VPathTrack **p; /* array of pointers to tracks */ +} vpath_Type; + + +static void vpath_destruct(void *vp) +{ + vpath_Type *p = vp; + VPathTrack *t; + int i; + + if( p == NULL ) + return; + + for( i = 0; i < p->n; i++ ){ + t = p->p[i]; + memory_dispose(t->p); + memory_dispose(t); + } + + memory_dispose(p->p); +} + + +vpath_Type * vpath_new() +{ + vpath_Type *p; + + p = memory_allocate(sizeof( vpath_Type ), vpath_destruct); + p->s = 0; + p->n = 0; + p->p = NULL; + return p; +} + + +void vpath_moveTo(vpath_Type *p, VPoint *to) +{ + VPathTrack *t; + + if( p->n > 0 && p->p[ p->n - 1 ]->n == 1 ){ + /* Previous track contains only one, unuseful point. */ + p->p[ p->n - 1 ]->p[0] = *to; + } + + if( p->n >= p->s ){ + p->s = 2*p->s + 10; + p->p = memory_realloc( p->p, p->s * sizeof(VPathTrack) ); + } + + t = memory_allocate(sizeof(VPathTrack), NULL); + t->s = 5; + t->n = 1; + t->p = memory_allocate(t->s * sizeof(VPoint), NULL); + t->p[0] = *to; + + p->p[ p->n++ ] = t; +} + + +void vpath_lineTo(vpath_Type *p, VPoint *to) +{ + VPathTrack *t; + + if( p->n == 0 ){ + /* No previous starting point available, add default: */ + vpath_moveTo(p, &(VPoint){0.0, 0.0, 0.0}); + } + + t = p->p[ p->n - 1 ]; + + if( t->n >= t->s ){ + t->s = 2*t->s + 5; + t->p = memory_realloc( t->p, t->s * sizeof(VPoint) ); + } + + t->p[ t->n++ ] = *to; +} + + +void vpath_arc(vpath_Type *p, VPoint *center, VPoint *final, int n) +/* FIXME: not used */ +{ + VPoint s, a, b, dif, q, r; + VPathTrack *track; + int i; + double t, a_len, b_len, l; + + /* + The starting point `s' is the current pen position + */ + + if( p->n == 0 ){ + /* No previous starting point available, add default: */ + VSetPoint(&s, 0.0, 0.0, 0.0); + vpath_moveTo(p, &s); + } else { + track = p->p[ p->n - 1 ]; + s = track->p[ track->n - 1 ]; + } + + VSub(&s, center, &a); /* a = s - center */ + VSub(final, center, &b); /* b = final - center */ + VSub(final, &s, &dif); /* dif = b - a */ + + a_len = VMagnitude(&a); + b_len = VMagnitude(&b); + + /* + The points r(t) of the arc can be described in parametric form + using t=[0,1.0] as follows: + + q(t) = a + t*(b-a) + l(t) = |q| / ((1-t)*|a| + t*|b|) + r(t) = center + q(t)/l(t) + + Note that r(0) is the current pen position, so we may start + from t=1/n. + */ + for( i=1; i<=n; i++ ){ + t = i / (double) n; + VAdd(&a, &(VPoint){t*dif.x, t*dif.y, t*dif.z}, &q); + l = ((1.0-t)*a_len + t*b_len) / VMagnitude(&q); + VSetPoint(&r, center->x + l*q.x, center->y + l*q.y, center->z + l*q.z); + vpath_lineTo(p, &r); + } +} + + +void vpath_draw_string(vpath_Type *path, char *str, int len, VMatrix *m) +{ + + int c, i, k, j; + VGlyph_Vertex *g; + double x, x1, y1; + VPoint p; + + x = 0.0; + + for ( ; len > 0; --len, ++str) { + + c = *str; + if( c >= 128 ){ + continue; + } + + k = VRomanGlyph[c].path_start; + for (i = 0; i < VRomanGlyph[c].path_count; ++ i, ++ k) { + g = &VRomanVertex[VRomanPath[k].vertex_start]; + for (j=0; j < VRomanPath[k].vertex_count; ++j, ++g) { + x1 = x + g->x / 25600.0; + y1 = -g->y / 25600.0; + VSetPoint(&p, x1, y1, 0.0); + VTransform (&p, m, &p); + if( j == 0 ) + vpath_moveTo(path, &p); + else + vpath_lineTo(path, &p); + } + } + + x += VRomanGlyph[c].glyph_width / 25600.0; + } +} + + +void vpath_stroke(vpath_Type *p, VMatrix *m, Alib_Window *w, Alib_Pixel color) +/* + FIXME: segments where at least a point is behind the screen + aren't drawn, rather than being clipped as stated in the .h. +*/ +{ + int i, j; + VPathTrack *t; + VPoint a, b; + + for( i = 0; i < p->n; i++ ){ + t = p->p[i]; + VTransform(&t->p[0], m, &a); + for( j = 1; j < t->n; j++ ){ + VTransform(&t->p[j], m, &b); + if( a.z < 0.0 && b.z < 0.0 ) + Alib_drawLine(w, a.x + 0.5, a.y + 0.5, b.x + 0.5, b.y + 0.5, + color); + a = b; + } + } +} + + +void vpath_perspective_stroke(vpath_Type *p, VMatrix *m, Viewport *v, Alib_Pixel color) +/* + FIXME: segments where at least a point is behind the screen + aren't drawn, rather than being clipped as stated in the .h. +*/ +{ + int i, j; + VPathTrack *t; + VPoint a, b; + double ka, kb; + int a_in, b_in; + double ax, ay, bx, by; + + /* + Draw the segment only if within about +/85 DEG angle of view + just to avoid overflow converting double into int when the + arguments of AlibDrawLine() are passed. + */ + ax = ay = bx = by = 0.0; + for( i = 0; i < p->n; i++ ){ + t = p->p[i]; + VTransform(&t->p[0], m, &a); + a_in = a.z > 0.0 && a.z > 0.1 * (fabs(a.x) + fabs(a.y)); + if( a_in ){ + ka = v->dist / a.z; + ax = v->xres * ka * a.x + v->focus.x; + ay = v->yres * ka * a.y + v->focus.y; + } + for( j = 1; j < t->n; j++ ){ + VTransform(&t->p[j], m, &b); + b_in = b.z > 0.0 && b.z > 0.1 * (fabs(b.x) + fabs(b.y)); + if( b_in ){ + kb = v->dist / b.z; + bx = v->xres * kb * b.x + v->focus.x; + by = v->yres * kb * b.y + v->focus.y; + } + if( a_in && b_in ){ + Alib_drawLine(v->w, ax, ay, bx, by, color); + } + ax = bx; + ay = by; + a_in = b_in; + } + } +} + + +/* The vpath.c module ends here. */ diff -Nru acm-5.0/src/acm/vpath_gallery.c acm-6.0+20200416/src/acm/vpath_gallery.c --- acm-5.0/src/acm/vpath_gallery.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/vpath_gallery.c 2017-03-29 04:42:35.000000000 +0000 @@ -0,0 +1,207 @@ +/* + * acm : an aerial combat simulator for X - Gallery of common drawings + * Copyright (C) 2008 Umberto Salsi + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#include +#include "../V/Vlibmath.h" +#include "../util/memory.h" + +#define vpath_gallery_IMPORT +#include "vpath_gallery.h" + +static vpath_Type + *compass_scale = NULL, + *compass_fixed_scale = NULL, + *stylized_aircraft = NULL, + *pointer_arrow = NULL, + *pointer_triangle = NULL; + + +vpath_Type * vpath_gallery_get_compass_scale(void) +{ + VMatrix m; + VPoint a, b; + int hdg, s_len; + double fh, fw, margin, r, r_long, r_short, r1; + char *s; + static char *labels[] = {"N", "3", "6", "E", "12", "15", "S", + "21", "24", "W", "30", "33"}; + + if( compass_scale != NULL ) + return compass_scale; + + compass_scale = vpath_new(); + + fh = 0.11; + fw = fh * 3.0/4.0; + margin = 0.04; + r = 1.0; + r_long = 0.92; + r_short = 0.96; + + for( hdg = 0; hdg < 360; hdg += 5 ){ + + VIdentMatrix(&m); + VRotate(&m, ZRotation, units_DEGtoRAD(hdg)); + + if( hdg % 10 == 0 ) + r1 = r_long; + else + r1 = r_short; + + VSetPoint(&a, 0.0, -r, 0.0); + VSetPoint(&b, 0.0, -r1, 0.0); + VTransform(&a, &m, &a); + VTransform(&b, &m, &b); + vpath_moveTo(compass_scale, &a); + vpath_lineTo(compass_scale, &b); + + if( hdg % 30 == 0 ){ + + s = labels[hdg / 30]; + s_len = strlen(s); + + VIdentMatrix(&m); + VScaleMatrix(&m, fw, fh, 1.0); + VTranslate(&m, -0.5*fw*s_len, -r1 + margin + fh, 0.0); + VRotate(&m, ZRotation, units_DEGtoRAD(hdg)); + vpath_draw_string(compass_scale, s, s_len, &m); + + } + + } + + return compass_scale; +} + + +vpath_Type * vpath_gallery_get_compass_fixed_scale(void) +{ + VMatrix m; + VPoint a, b; + int hdg; + double r, r1; + + if( compass_fixed_scale != NULL ) + return compass_fixed_scale; + + compass_fixed_scale = vpath_new(); + + r = 1.0; + r1 = 0.90; + + for( hdg = 0; hdg < 360; hdg += 45 ){ + + VIdentMatrix(&m); + VRotate(&m, ZRotation, units_DEGtoRAD(hdg)); + + VSetPoint(&a, 0.0, -r, 0.0); + VSetPoint(&b, 0.0, -r1, 0.0); + VTransform(&a, &m, &a); + VTransform(&b, &m, &b); + vpath_moveTo(compass_fixed_scale, &a); + vpath_lineTo(compass_fixed_scale, &b); + + } + + return compass_fixed_scale; +} + + +vpath_Type * vpath_gallery_get_stylized_aircraft(void) +{ + double l1, l2, l3; + + if( stylized_aircraft != NULL ) + return stylized_aircraft; + + stylized_aircraft = vpath_new(); + + l1 = 0.14; /* fuselage half-width */ + l2 = 0.50; /* elevator half-width */ + l3 = 0.30; /* wing y offset */ + + /* right side: */ + vpath_moveTo(stylized_aircraft, &(VPoint){l1, -1.0, 0.0}); + vpath_lineTo(stylized_aircraft, &(VPoint){l1, 1.0, 0.0}); + vpath_lineTo(stylized_aircraft, &(VPoint){l2, 1.0, 0.0}); + + vpath_moveTo(stylized_aircraft, &(VPoint){l1, -l3, 0.0}); + vpath_lineTo(stylized_aircraft, &(VPoint){1.0, -l3, 0.0}); + + /* left side (same as above with x reversed): */ + vpath_moveTo(stylized_aircraft, &(VPoint){-l1, -1.0, 0.0}); + vpath_lineTo(stylized_aircraft, &(VPoint){-l1, 1.0, 0.0}); + vpath_lineTo(stylized_aircraft, &(VPoint){-l2, 1.0, 0.0}); + + vpath_moveTo(stylized_aircraft, &(VPoint){-l1, -l3, 0.0}); + vpath_lineTo(stylized_aircraft, &(VPoint){-1.0, -l3, 0.0}); + + return compass_fixed_scale; +} + + +vpath_Type * vpath_gallery_get_pointer_arrow(void) +{ + if( pointer_arrow != NULL ) + return pointer_arrow; + + pointer_arrow = vpath_new(); + + vpath_moveTo(pointer_arrow, &(VPoint){0.0, -1.0, 0.0}); + vpath_lineTo(pointer_arrow, &(VPoint){0.0, 1.0, 0.0}); + + vpath_moveTo(pointer_arrow, &(VPoint){0.0, -1.0, 0.0}); + vpath_lineTo(pointer_arrow, &(VPoint){0.05, -0.80, 0.0}); + vpath_lineTo(pointer_arrow, &(VPoint){0.12, -0.70, 0.0}); + + vpath_moveTo(pointer_arrow, &(VPoint){-0.0, -1.0, 0.0}); + vpath_lineTo(pointer_arrow, &(VPoint){-0.05, -0.80, 0.0}); + vpath_lineTo(pointer_arrow, &(VPoint){-0.12, -0.70, 0.0}); + + return pointer_arrow; +} + + +vpath_Type * vpath_gallery_get_pointer_triangle(void) +{ + double l = 0.1; + + if( pointer_triangle != NULL ) + return pointer_triangle; + + pointer_triangle = vpath_new(); + + vpath_moveTo(pointer_triangle, &(VPoint){0.0, -1.0, 0.0}); + vpath_lineTo(pointer_triangle, &(VPoint){0.0-l, -1.0-l, 0.0}); + vpath_lineTo(pointer_triangle, &(VPoint){0.0+l, -1.0-l, 0.0}); + vpath_lineTo(pointer_triangle, &(VPoint){0.0, -1.0, 0.0}); + + return pointer_triangle; +} + + +void vpath_gallery_free_all(void) +{ + memory_dispose(compass_scale); + memory_dispose(compass_fixed_scale); + memory_dispose(stylized_aircraft); + memory_dispose(pointer_arrow); + memory_dispose(pointer_triangle); +} + +/* The vpath_gallery.c module end here. */ diff -Nru acm-5.0/src/acm/vpath_gallery.h acm-6.0+20200416/src/acm/vpath_gallery.h --- acm-5.0/src/acm/vpath_gallery.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/vpath_gallery.h 2017-03-22 00:27:50.000000000 +0000 @@ -0,0 +1,73 @@ +/* + * acm : an aerial combat simulator for X - Gallery of common drawings + * Copyright (C) 2008 Umberto Salsi + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +/** + * This module collects some common drawings. + * + * @file + */ + +#ifndef vpath_gallery_H +#define vpath_gallery_H + +#include "vpath.h" + +#ifdef vpath_gallery_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +/** + * Return a compass scale drawn over the xy plane in screen coordinates, + * north is up, radius 1.0. + */ +EXTERN vpath_Type * vpath_gallery_get_compass_scale(void); + +/** + * Release all the internal data structures. + */ +EXTERN void vpath_gallery_free_all(void); + +/** + * Return a compass fixed scale composed of tick marks drawn every 45 + * DEG. The scale is drawn inside a circle of radius 1.0 with internal + * radius of 0.90. The scale is drawn over the xy plane in screen frame + * and centered on the origin. + */ +EXTERN vpath_Type * vpath_gallery_get_compass_fixed_scale(void); + +/** + * Return a stylized aircraft draw inside a square box of side length + * 2.0, nose "up", the center is the origin of the xy plane. + */ +EXTERN vpath_Type * vpath_gallery_get_stylized_aircraft(void); + +/** + * Arrow that points "up" centered on a circle of radius 1.0. + */ +EXTERN vpath_Type * vpath_gallery_get_pointer_arrow(void); + +/** + * Pointer shaped as a triangle and located on the outside border of a + * circle of radius 1.0. Its initial indication is "up". + */ +EXTERN vpath_Type * vpath_gallery_get_pointer_triangle(void); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/vpath.h acm-6.0+20200416/src/acm/vpath.h --- acm-5.0/src/acm/vpath.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/vpath.h 2017-10-28 08:35:30.000000000 +0000 @@ -0,0 +1,106 @@ +/* + * ACM - 3-D draw utilities + * Copyright (C) 2008 Umberto Salsi + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +/** + * This module implements collections of "tracks", every track being + * a collection of two or more VPoint. 3-D paths can then be transformed + * with a matrix and projected on the x-y plane of the screen. + * @file + */ + +#ifndef _VPATH_H +#define _VPATH_H + +#include "../V/Alib.h" +#include "../V/Vlib.h" + +#ifdef vpath_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +typedef struct vpath_Type vpath_Type; + +/** + * Create new empty VPath. The drawing pen is located by default to the + * origin point (0,0,0). Can be released with memory_dispose(). + */ +EXTERN vpath_Type * vpath_new(void); + +/** + * Move the drawing pen to the given absolute point, beginning a new + * track. + */ +EXTERN void vpath_moveTo(vpath_Type *p, VPoint *to); + +/** + * Move the pen from the current pen position to the given destination + * point, drawing a segment. + */ +EXTERN void vpath_lineTo(vpath_Type *p, VPoint *to); + +/** + * Starting from the current pen position as set by vpath_moveTo() or + * vpath_lineTo(), draw an arc of ellipse having the given center and the + * final point. n>=1 is the number of intermediate segments, higher values + * give a smoother line. + */ +EXTERN void vpath_arc(vpath_Type *p, VPoint *center, VPoint *final, int n); + +/** + * Draw the string on the xy plane starting from the origin and + * proceeding along the x axis as baseline. Characters have the + * dimension 1.0x1.0. m is the transformation matrix. For example, + * this code will add to the VPath the string "Hello" centered around + * the point (h,v) of the screen: + * + * VMatrix m; + * double fw, fh; + * char *s = "Hello"; + * + * fw = fh = 10.0; + * VIdentMatrix(&m); + * VScaleMatrix(&m, fw, fh, 1.0); + * VTranslate(&m, h - fw*strlen(s)/2, v + fh/2, 0.0); + * vpath_draw_string(path, s, strlen(s), m); + */ +EXTERN void vpath_draw_string(vpath_Type *path, char *str, int len, VMatrix *m); + +/** + * Translate the 3-D VPath into 2-D segments with a parallel projection + * from (x,y,z) 3-D coords to (x,y) 2-D coords in the screen frame + * (x=right, y=down, z=toward the screen). Every point get transformed as + * per the provided matrix. Segments are clipped to the z < 0 space (= + * front of the screen) so to ensure that only the wanted part of the + * drawing be visible either translate along the z axis or extrude setting + * z scale negative. + */ +EXTERN void vpath_stroke(vpath_Type *p, VMatrix *m, Alib_Window *w, Alib_Pixel color); + +/** + * Perspective projection of the vpath on the screen. The matrix m is + * applied to every point of the vpath to obtain the point q=m*p to + * project on the given viewport, current clipping region. The unit of q + * is the meter, so q=(0,0,1) is the point exactly one meter in front to + * the eye of the observer, and q=(1,0,0) is one meter to the right. + */ +EXTERN void vpath_perspective_stroke(vpath_Type *p, VMatrix *m, Viewport *v, Alib_Pixel color); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/weapon.c acm-6.0+20200416/src/acm/weapon.c --- acm-5.0/src/acm/weapon.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/weapon.c 2017-03-22 00:24:08.000000000 +0000 @@ -0,0 +1,169 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1996 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#include +#include "pm.h" +#include "weapon_null.h" +#include "ccip.h" +#include "m61a1.h" +#include "aim9m.h" +#include "aim120.h" + +#define weapon_IMPORT +#include "weapon.h" + +#define WEAPONTYPES 5 +/* + Total no. defined weapons, i.e. size of wtbl[]. +*/ + +static weapon_Type * wtbl[WEAPONTYPES]; +/* + Descriptions of different available weapons. +*/ + + +static char * names[WEAPONTYPES] = { + "----", + "M61A1", + "AIM-9M", + "AIM-120", + "MK82" +}; + + +int weapon_nameToId(char * name) +{ + int i; + + for( i = 0; i < WEAPONTYPES; i++ ) + if( strcmp(name, names[i]) == 0 ) + return i; + + return -1; +} + + +char * weapon_idToName(int id) +{ + if( id < 0 || id >= WEAPONTYPES ) + return NULL; + + return names[id]; +} + + +int +weapon_countOrdinance(craft * c, int id) +{ + + register int i, count = 0; + + for (i = 0; i < c->cinfo->sCount; ++i) { + if (c->station[i].id == id) + ++count; + } + + return count; +} + +int +weapon_getReadyStation(craft * c, int id) +{ + + register int i; + + for (i = 0; i < c->cinfo->sCount; ++i) { + if (c->station[i].id == id) + return i; + } + + return -1; +} + +int +weapon_selectNextAvailable(craft * c) +{ + + int n, m; + + m = c->curWeapon; + n = (c->curWeapon + 1) % WEAPONTYPES; + for (; n != m; n = (n + 1) % WEAPONTYPES) { + if( n == weapon_NULL ){ + c->curWeapon = weapon_NULL; + return 1; + + } else if (weapon_getReadyStation(c, n) >=0 && wtbl[n]->select != NULL){ + if ((*wtbl[n]->select) (c) == 1) { + c->curWeapon = n; + return 1; + } + } + } + + return 0; /* should never reach this point */ +} + +int +weapon_selectByName(craft * c, int id) +{ + if ((*wtbl[id]->select) (c) == 1) { + c->curWeapon = id; + return 1; + } + return 0; +} + +int +weapon_fire(craft * c) +{ + return (*wtbl[c->curWeapon]->firePress) (c); +} + +int +weapon_ceaseFire(craft * c) +{ + if (wtbl[c->curWeapon]->fireRelease != NULL) + return (*wtbl[c->curWeapon]->fireRelease) (c); + + return 0; +} + +int +weapon_displaySelected(craft * c, viewer * u, int fpm_x, int fpm_y) +{ + return (*wtbl[c->curWeapon]->display) (c, wtbl[c->curWeapon]->w, u, + fpm_x, fpm_y); +} + +int +weapon_update(craft * c) +{ + return (*wtbl[c->curWeapon]->update) (c); +} + + +void weapon_init() +{ + wtbl[weapon_NULL] = weapon_null_new(); + wtbl[weapon_M61A1] = m61a1_new(); + wtbl[weapon_MK82] = ccip_new(); + wtbl[weapon_AIM9M] = aim9m_new(); + wtbl[weapon_AIM120] = aim120_new(); +} diff -Nru acm-5.0/src/acm/weapon.h acm-6.0+20200416/src/acm/weapon.h --- acm-5.0/src/acm/weapon.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/weapon.h 2017-03-22 00:24:52.000000000 +0000 @@ -0,0 +1,148 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1998 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#ifndef _weapon_h +#define _weapon_h + +#include "pm.h" + +#ifdef weapon_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +/* Index of the weapon into the wtbl[] table: */ +#define weapon_NULL 0 /* null weapon, or no weapon selected */ +#define weapon_M61A1 1 /* M-61A1 Vulcan 20mm cannon */ +#define weapon_AIM9M 2 /* Sidewinder missile */ +#define weapon_AIM120 3 /* AIM-120 missile */ +#define weapon_MK82 4 /* Mark 82 (510 lb) gravity bomb */ +//#define weapon_AGM65 5 /* FIXME: not used */ + +/** + * Defines call-back procedures for all the standard actions of a weapon. + * In other words, this type defines the "abstract class" from which any other + * specific weapon is derived. + */ +typedef struct +{ + /** + * Weapon select procedure invoked by pilot. + * A selection function normally determines whether there are any weapons + * of this type on-board. If so, and the weapon system is functional + * (in other words, undamaged) then return true, otherwise return 0. + * Return: true if there is actually a weapon of this type available and + * functional. + */ + int (*select) (struct craft *); + + /** + * Per tick update procedure that implements weapon dynamics. + * Return: FIXME. + */ + int (*update) (struct craft *); + + /** + * Display (that is HUD) update procedure. + * Return: TRUE if there is a reasonable chance of scoring a kill. + */ + int (*display) (struct craft *, craftType *, viewer *, int, int); + + /** + * Fire button pressed procedure. + * Return: FIXME. + */ + int (*firePress) (struct craft *); + + /** + * Fire button released. + * Return: FIXME. + */ + int (*fireRelease) (struct craft *); + + /** + * Description of this weapon. + */ + craftType *w; + +} weapon_Type; + + +/** + * Initialize the module. + */ +EXTERN void weapon_init(void); + +/** + * Return the weapon number WK_* given its name. + * Return a negative value if name unknown. + */ +EXTERN int weapon_nameToId(char * name); + +/** + * Return the weapon name given its id WK_*. + * Return NULL if the id is invalid. + */ +EXTERN char * weapon_idToName(int id); + +/** + * Count a particular type of ordinance on an aircraft, where id is + * one of the constants WK_* (see pm.h). + */ +EXTERN int weapon_countOrdinance(craft * c, int id); + +/** + * Draw HUD data specific of the currently selected weapon. + * fpm_x,fpm_y is the current position of the HUD FPM (used by the + * ccip module). + * Return a nonzero value if have a reasonable chance of scoring a kill. + */ +EXTERN int weapon_displaySelected(craft * c, viewer * u, int fpm_x, int fpm_y); + +EXTERN int weapon_update(craft * c); + +/** + * Fire the weapon currently selected. + * Returns 0 if no weapon is currently available. + */ +EXTERN int weapon_fire(craft * c); + +EXTERN int weapon_ceaseFire(craft * c); + +/** + * Return the index of the first station with a particular type of ordinance + * ready for fire. + * id is one of the constants WK_* (see pm.h). + */ +EXTERN int weapon_getReadyStation(craft * c, int id); + +/** + * Select the given weapon number id (see constants WK_* in pm.h). + * Returns 0 if the selection cannot be operated. + */ +EXTERN int weapon_selectByName(craft * c, int id); + +/** + * Select next available type of weapon. + * Returns 0 if the selection cannot be operated. + */ +EXTERN int weapon_selectNextAvailable(craft * c); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/weapon_null.c acm-6.0+20200416/src/acm/weapon_null.c --- acm-5.0/src/acm/weapon_null.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/weapon_null.c 2017-03-22 00:25:30.000000000 +0000 @@ -0,0 +1,90 @@ +/* + * acm : an aerial combat simulator for X + * Null weapon module. + * Copyright (C) 2009 Umberto Salsi + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#include +#include "pm.h" + +#define weapon_null_IMPORT +#include "weapon_null.h" + +static int +select_null(craft * c) +{ + return 1; +} + +static int +update_null(craft * c) +{ + return 1; +} + +static int +fire_null(craft * c) +{ + return 1; +} + +/* + * Display function + * + * Update the HUD display strings associated with this weapon system. + * c = the aircraft. + * w = the weapon's description record. + * fpm_x, fpm_y = position of the FPM in HUD + * + * This code may be called by drones. Return a nonzero value if + * have a reasonable chance of scoring a kill. + */ + +static int +display_null(craft * c, craftType * w, viewer * u, int fpm_x, int fpm_y) +{ + /* + HUD strings c->leftHUD[2, ..., 5] are reserved to the currently + selected weapon. + (leftHUD[1] is the Mach number, + */ + + strcpy(c->leftHUD[2], ""); /* shot hint */ + strcpy(c->leftHUD[3], ""); /* weapon name */ + strcpy(c->leftHUD[4], ""); /* "FIRING", ecc. */ + strcpy(c->leftHUD[5], ""); /* ??? */ + + /* Return TRUE if we are recommending a weapon shot. */ + return 0; +} + + +static weapon_Type nullDesc = +{ + select_null, /* select */ + update_null, /* update */ + display_null, /* display procedure */ + fire_null, /* fire */ + (int (*)(craft *)) NULL, /* fire button release */ +}; + + +weapon_Type * +weapon_null_new(void) +{ + nullDesc.w = NULL; + return &nullDesc; +} diff -Nru acm-5.0/src/acm/weapon_null.h acm-6.0+20200416/src/acm/weapon_null.h --- acm-5.0/src/acm/weapon_null.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/weapon_null.h 2017-03-20 06:04:00.000000000 +0000 @@ -0,0 +1,45 @@ +/* + * acm : an aerial combat simulator for X + * Null weapon module. + * Copyright (C) 2009 Umberto Salsi + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +/** + * Implements the "null" weapon, that is a weapon that does nothing. + * + * @file + */ + +#ifndef _weapon_null_h +#define _weapon_null_h + +#include "weapon.h" + +#ifdef weapon_null_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +/** + * Returns the weapon description record for the "null weapon", that is the + * weapon that does nothing. + * @return Null weapon descriptor, statically allocated. + */ +EXTERN weapon_Type * weapon_null_new(void); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/windows.c acm-6.0+20200416/src/acm/windows.c --- acm-5.0/src/acm/windows.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/windows.c 2017-10-25 11:24:37.000000000 +0000 @@ -0,0 +1,318 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991,1992,1997 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#include "../V/Vlib.h" +#include "pm.h" +#include "hud.h" +#include "instruments.h" +#include "prompt.h" + +#define windows_IMPORT +#include "windows.h" + +#define WIN_MIN_WIDTH 150 +#define WIN_MIN_HEIGHT 150 + +#define HDG_LENGTH (6*33+1) +#define HDG_MIN_INTERVAL 500 +#define HDG_MIN_SIZE 5 +#define HDG_MAJ_INTERVAL 1000 +#define HDG_MAJ_SIZE 10 +#define HDG_DIVISOR 1000.0 +#define HDG_FORMAT "%2.2g" + +#define VEL_LENGTH ALT_LENGTH +#define VEL_ORIENT 0 +#define VEL_SCALE (153.0 / (double) VEL_LENGTH) +#define VEL_INDEX_SIZE 32 +#define VEL_MIN_INTERVAL 10 +#define VEL_MIN_SIZE 9 +#define VEL_MAJ_INTERVAL 50 +#define VEL_MAJ_SIZE 17 +#define VEL_DIVISOR 10.0 +#define VEL_FORMAT "%3.3g" + +#define ALT_LENGTH 219 +#define ALT_ORIENT scale_ORIENT_RIGHT +#define ALT_SCALE (1530.0 / (double) ALT_LENGTH) +#define ALT_INDEX_SIZE 32 +#define ALT_MIN_INTERVAL 100 +#define ALT_MIN_SIZE 9 +#define ALT_MAJ_INTERVAL 500 +#define ALT_MAJ_SIZE 17 +#define ALT_DIVISOR 1000.0 +#define ALT_FORMAT "%4.3g" + +#define HUD_OFFSET units_DEGtoRAD(3.0) +/* + HUD drawing angular offset vs. nose pointer. Real HUD devices offer + a quite small angle of view, limited to about +/-6 DEG. This offset + angle allows to organize the drawing around a point that is so many + DEG below the nose. Because the AoA is commonly between 3 and 4 + DEG, looking at the center of the HUD drawing the pilot will see + the point toward he is actually flying or it is aiming to. +*/ + +static int mymin(int a, int b){ if(a<=b) return a; else return b; } + + +void +windows_set_layout(craft * c, viewer * u, int width, int height, + _BOOL hud_mode) +{ + double xres, yres, eye, xscale, yscale; + int w, xo, yo, stripe_height; + Alib_Rect view; + + + void set_slot(Alib_Rect *r, int row, int col) + { + Alib_setRect(r, xo + col * w, yo - row * w - w, + xo + col * w + w, yo - row * w); + } + + + if( width < WIN_MIN_WIDTH ) width = WIN_MIN_WIDTH; + if( height < WIN_MIN_HEIGHT ) height = WIN_MIN_HEIGHT; + + + if( hud_mode ){ + /* HUD mode: at least 2/3 of the vertical space to the cockpit view */ + w = mymin(width / 5, height / 3); + stripe_height = 0; + Alib_setRect(&view, 0, 0, width, height - w); + Alib_setRect(&u->stripe, 0, 0, 0, 0); + } else { + /* Classic instruments: at least 1/3 of the vertical space to the + cockpit view. The stripe is 1/8 of the slot. */ + w = mymin(width / 5, (int) (height * 2.0/3.0 / (1.0 + 1.0 + 1.0/8.0))); + stripe_height = w/8; + Alib_setRect(&view, 0, 0, width, height - stripe_height - w - w); + Alib_setRect(&u->stripe, 0, view.b.y, width, height - 2*w); + } + + /* + Open the Viewport if required, but set dummy parameters. + + FIXME: the Viewport should be opened or resized only after all + the layout has been calculated; I open it here just because I + need the screen resolution. The screen resolution is a property + of the window, so it should stay in Alib since it may be useful + for 2D graphics too. + */ + + if( u->v == NULL ){ + Alib_Rect r; + Alib_setRect(&r, 0, 0, width, height); + u->v = Vlib_new(u->gui, u->w, &r, &(Alib_Point){0,0}, 1.0); + } + + xres = u->v->xres / 100; /* horiz. screen resolution (pixels/cm) */ + yres = u->v->yres / 100; /* vert. screen resolution (pixels/cm) */ + + /* Apply zoom factor to actual eye distance from screen */ + + eye = eye_to_screen_cm * u->zoom/100.0; + + /* + Resize AWindow. This must be done before resizing Viewport because + this latter compute its rect field as intersection with AWindow. + */ + + Alib_resize(u->w, width, height); + + /* + Resize Viewport + */ + + { + double h; + Alib_Point focus; + + /* Distance of the focus projection from bottom border (pixels): */ + h = yres * eye * tan(downward_view_angle_rad); + + /* + For higher zoom factors the pilot may end up looking the + terrain rather than the target craft. Correct: + */ + + if( u->zoom > 200 && view.b.y - h < 0.0 ) + h = view.b.y; + + /* Nose pointer position (pixel): */ + Alib_setPoint(&focus, RectMiddleX(view), view.b.y - h); + + /* + Organize HUD drawing center HUD_OFFSET DEG below the horizon: + */ + u->hud_yCenter = focus.y + yres * eye * tan(HUD_OFFSET); + + VResizeViewport(u->v, &view, &focus, 0.01*eye); + } + + /* + (xo,yo) is the left-bottom corner of the panel: + */ + xo = (width - 5 * w) / 2; + yo = height; + + set_slot(&u->lights, 0, 0); + set_slot(&u->tuner, 0, 1); + set_slot(&u->indicator, 0, 2); + set_slot(&u->gear, 0, 3); + set_slot(&u->engine, 0, 4); + set_slot(&u->turn, 1, 0); + set_slot(&u->anemometer, 1, 1); + set_slot(&u->attitude, 1, 2); + set_slot(&u->altimeter, 1, 3); + set_slot(&u->vsi, 1, 4); + + /* + To save space, the radar altimeter occupies the right part of the + lights slot. So, reduce lights slot width: + */ + { + int h; + + h = (int) (0.2 * w); + u->radar_altimeter = u->lights; + u->radar_altimeter.a.x = u->lights.b.x - h; + u->lights.b.x -= h; + } + + /* + Scale factor for HUD graphics. + + FIXME. The magic numeric factor below follows from an + "experimental" measurement and it accounts for the fixed layout + under which the screen was originally designed. A more elegant, + deterministic formula would require to eliminate all the fixed + constants that appear in the renderer and HUD modules. + */ + xscale = 0.5 * 1.53e-3 * eye * xres; + yscale = 0.5 * 1.53e-3 * eye * yres; + + u->xscaleFactor = xscale; + u->yscaleFactor = yscale; + + /* + Fill in the scale structures for the airspeed/altitude HUD scales. + */ + + u->altScale.xorg = u->v->focus.x + (int) (xscale * 160); + u->altScale.length = (int) (ALT_LENGTH * yscale); + u->altScale.yorg = u->hud_yCenter + (u->altScale.length / 2); + u->altScale.orientation = ALT_ORIENT; + u->altScale.scale = ALT_SCALE / yscale; + u->altScale.minorInterval = ALT_MIN_INTERVAL; + u->altScale.minorSize = (int) (ALT_MIN_SIZE * yscale); + u->altScale.majorInterval = ALT_MAJ_INTERVAL; + u->altScale.majorSize = (int) (ALT_MAJ_SIZE * yscale); + u->altScale.indexSize = (int) (ALT_INDEX_SIZE * xscale); + u->altScale.divisor = ALT_DIVISOR; + u->altScale.format = ALT_FORMAT; + u->altScale.pixel = HUDColor; + u->altScale.fontSize = (int) (14.0 * xscale + 0.5); + + u->velScale.xorg = u->v->focus.x - (int) (xscale * 160); + u->velScale.length = (int) (VEL_LENGTH * yscale); + u->velScale.yorg = u->hud_yCenter + (u->velScale.length / 2); + u->velScale.orientation = VEL_ORIENT; + u->velScale.scale = VEL_SCALE / yscale; + u->velScale.minorInterval = VEL_MIN_INTERVAL; + u->velScale.minorSize = (int) (VEL_MIN_SIZE * yscale); + u->velScale.majorInterval = VEL_MAJ_INTERVAL; + u->velScale.majorSize = (int) (VEL_MAJ_SIZE * yscale); + u->velScale.indexSize = (int) (VEL_INDEX_SIZE * xscale); + u->velScale.divisor = VEL_DIVISOR; + u->velScale.format = VEL_FORMAT; + u->velScale.pixel = HUDColor; + u->velScale.fontSize = (int) (14.0 * xscale + 0.5); + + /* Compass scale in HUD: */ + u->hdgScale.xorg = u->v->focus.x - (int) (xscale * HDG_LENGTH / 2.0 + 0.5); + u->hdgScale.yorg = u->hud_yCenter - u->velScale.length / 2 - 130.0 * yscale; + u->hdgScale.length = (int) (HDG_LENGTH * xscale); + u->hdgScale.orientation = scale_ORIENT_LEFT; /* really orient TOP */ + u->hdgScale.scale = (2727.0 / (double) HDG_LENGTH) / xscale; + u->hdgScale.minorInterval = HDG_MIN_INTERVAL; + u->hdgScale.minorSize = (int) (HDG_MIN_SIZE * xscale); + u->hdgScale.majorInterval = HDG_MAJ_INTERVAL; + u->hdgScale.majorSize = (int) (HDG_MAJ_SIZE * xscale); + u->hdgScale.indexSize = (int) (10 * yscale); + u->hdgScale.divisor = HDG_DIVISOR; + u->hdgScale.format = HDG_FORMAT; + u->hdgScale.pixel = HUDColor; + u->hdgScale.fontSize = (int) (14.0 * xscale + 0.5); + + /* + Clean instruments panel area + */ + + { + Alib_Rect r; + + Alib_setRect(&r, 0, view.b.y, width, height); + Alib_setClipRect(u->w, &r); + Alib_fillRect(u->w, &r, panelBackgroundColor); + } + + /* + Disable/Enable instruments: + */ + if( hud_mode ){ + instruments_disable(u); + hud_enable(u); + } else { + hud_disable(u); + instruments_enable(u); + } + + u->hud_mode = hud_mode; +} + + +static void windows_setZoom(viewer *u, int zoom) +{ + if( 91 <= zoom && zoom <= 109 ) + zoom = 100; + else if( zoom < 10 ) + zoom = 10; + else if( zoom > 400 ) + zoom = 400; + if( zoom != u->zoom ){ + u->zoom = zoom; + windows_set_layout(u->c, u, gui_getWidth(u->gui), gui_getHeight(u->gui), u->hud_mode); + } + char s[20]; + sprintf(s, "%d%%", u->zoom); + prompt_viewer_print(u, s); +} + + +void windows_zoom_in(viewer *u) +{ + windows_setZoom(u, 12*u->zoom / 10); +} + + +void windows_zoom_out(viewer *u) +{ + windows_setZoom(u, 10*u->zoom / 12); +} diff -Nru acm-5.0/src/acm/windows.h acm-6.0+20200416/src/acm/windows.h --- acm-5.0/src/acm/windows.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/windows.h 2017-03-20 06:04:01.000000000 +0000 @@ -0,0 +1,39 @@ +/* + * acm : an aerial combat simulator for X + * Copyright (C) 1991-1998 Riley Rainey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 dated June, 1991. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. + */ + +#ifndef _windows_h +#define _windows_h + +#ifdef windows_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +/** + * Resize the window, change HUD mode/classic panel mode, set cockpit view + * and instrument panel layout. + */ +EXTERN void windows_set_layout(craft * c, viewer * u, int width, int height, + _BOOL hud_mode); + +EXTERN void windows_zoom_in(viewer * u); +EXTERN void windows_zoom_out(viewer * u); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/zone.c acm-6.0+20200416/src/acm/zone.c --- acm-5.0/src/acm/zone.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/zone.c 2018-04-02 06:09:56.000000000 +0000 @@ -0,0 +1,851 @@ +#include +#include +#include +#include +#include +#include + +#include "../util/error.h" +#include "../util/memory.h" +#include "../util/reader.h" +#include "../util/units.h" +#include "navaid.h" +#include "runway.h" + +#define zone_IMPORT +#include "zone.h" + +/** + * Schedule zone purge if nobody flies over or near to a zone for so much + * time (s). + */ +#define zone_EXPIRE_PERIOD_SEC 60 + +/** + * A location is close to a zone if inside or whithin this angle range. + * Note that 4 DEG corresponds to about 240 NM while the max range of a NAVAID + * under ACM is NM: this guarantees any close scenery be loaded and then any + * tunable station can be received. + */ +#define zone_CLOSE_ANGLE units_DEGtoRAD(4) + + +struct zone_Type { + + /** + * Range of geographic coordinates covered by this zone (RAD). + */ + double lat1, lat2, lon1, lon2; + + /** + * The zone range enlarged by our DELTA margin. Locations inside this + * range of latitude and longitude are close to this zone. + * Basically, + * close_lat1 = lat1 - DELTA, + * close_lat2 = lat2 + DELTA, + * close_lon1 = lon1 - DELTA, + * close_deltaLon = lon2 - lon1 + 2*DELTA, + * but special case must be taken near the poles. The longitude range might + * be de-normalized outside the canonical [-180,+180] DEG range. + */ + double close_lat1, close_lat2, close_lon1, close_deltaLon; + + /** Path to the ACM scenery file. */ + char *path; + + /** If this scenery is currently loaded in memory. */ + int isLoaded; + + /* + * The following fields assigned only if loaded. + */ + + /** Scheduled purge time (s). */ + time_t expire; + + /** Team locations read from the scenery. */ + earth_LatLonAlt forceBaseLocations[4]; + + /** Ground color read from the scenery. */ + char *groundColor; +}; + + +/** + * Recycled surface objects. Objects removed from global surface objects table + * stbl goes here. + */ +static craft *stbl_pool; + + +/** + * If cleanup function registered in the memory module. + */ +static int cleanup_set; + + +static void zone_cleanup() +{ + //printf("DEBUG: %s\n", __FUNCTION__); + while( stbl_pool != NULL ){ + craft *next = stbl_pool->next; + memory_dispose(stbl_pool); + stbl_pool = next; + } + cleanup_set = 0; +} + + +/** + * Returns a brand new craft data structure linked to the surface objects table. + * @return + */ +static craft * zone_craftNew() +{ + craft *c; + if( stbl_pool == NULL ){ + c = memory_allocate(sizeof(craft), NULL); + memset(c, 0, sizeof(craft)); + } else { + c = stbl_pool; + stbl_pool = c->next; + } + c->prev = NULL; + c->next = stbl; + if( stbl != NULL ) + stbl->prev = c; + stbl = c; + return c; +} + + +/** + * Removes a craft from the surface objects linked list. + * @param c + */ +static void zone_craftRelease(craft *c) +{ + if( c->prev == NULL ){ + if( c->next != NULL ) + c->next->prev = NULL; + stbl = c->next; + } else { + c->prev->next = c->next; + if( c->next != NULL ) + c->next->prev = c->prev; + } + memset(c, 0, sizeof(craft)); + c->next = stbl_pool; + stbl_pool = c; +} + + +static void zone_destruct(void *p) +{ + zone_Type *this = p; + //printf("DEBUG: %s %s\n", __FUNCTION__, this->path); + zone_purge(this, 1); + memory_dispose(this->path); +} + + +zone_Type * zone_new(char *path, double lat1, double lat2, double lon1, double lon2) +{ + if( ! cleanup_set ){ + memory_registerCleanup(zone_cleanup); + cleanup_set = 1; + } + + zone_Type * this = memory_allocate(sizeof(zone_Type), zone_destruct); + memset(this, 0, sizeof(*this)); + this->path = memory_strdup(path); + this->lat1 = lat1; + this->lat2 = lat2; + this->lon1 = lon1; + this->lon2 = lon2; + this->groundColor = NULL; + this->isLoaded = 0; + this->expire = 0; + + // Compute the range for locations close to this zone. + if( lat2 > units_DEGtoRAD(85) ){ + // Close to north pole. Take all dome above lat1. + this->close_lat1 = lat1 - zone_CLOSE_ANGLE; + this->close_lat2 = units_DEGtoRAD(90); + this->close_lon1 = -M_PI; + this->close_deltaLon = 2*M_PI; + + } else if( lat1 < units_DEGtoRAD(-85) ){ + // Close to south pole. Take all dome below lat2. + this->close_lat1 = units_DEGtoRAD(-90); + this->close_lat2 = lat2 + zone_CLOSE_ANGLE; + this->close_lon1 = -M_PI; + this->close_deltaLon = 2*M_PI; + + } else { + this->close_lat1 = lat1 - zone_CLOSE_ANGLE; + this->close_lat2 = lat2 + zone_CLOSE_ANGLE; + // Meridians are very close together near poles, so zone_CLOSE_ANGLE + // must be adjusted by a 1/cos(lat) factor; take the max: + double dlon_south = zone_CLOSE_ANGLE / cos(lat1); + double dlon_north = zone_CLOSE_ANGLE / cos(lat2); + double dlon; + if( dlon_north < dlon_south ) + dlon = dlon_south; + else + dlon = dlon_north; + this->close_lon1 = lon1 - dlon; + this->close_deltaLon = lon2 - lon1 + 2*dlon; + } + + return this; +} + +int zone_isLoaded(zone_Type *this) +{ + return this->isLoaded; +} + + +char * zone_getPath(zone_Type *this) +{ + return this->path; +} + + +char * zone_getGroundColor(zone_Type *this) +{ + return this->groundColor; +} + + +earth_LatLonAlt * zone_getForceBaseLocation(zone_Type *this, int force) +{ + assert(0 <= force && force < 4); + if( ! this->isLoaded ) + return NULL; + return &this->forceBaseLocations[force]; +} + + +/** Returns true if the zone includes the location. */ +int zone_includesLocation(zone_Type *this, earth_LatLonAlt *w) +{ + return this->lat1 <= w->latitude && w->latitude < this->lat2 + && this->lon1 <= w->longitude && w->longitude < this->lon2; +} + + +/** + * Normalize angle difference B-A for a point moving from a longitude A to + * longitude B walking east. For example, going from longitude 30 to 40 is a + * walk of 10 DEG; vice-versa, going from 40 to 30 still walking east is a + * 350 DEG walk. + */ +static double zone_goEast(double x) +{ + while(x < 0) + x += M_PI; + return x; +} + + +int zone_isClose(zone_Type *this, earth_LatLonAlt *p) +{ + return this->close_lat1 <= p->latitude && p->latitude < this->close_lat2 + && zone_goEast(p->longitude - this->close_lon1) < this->close_deltaLon; +} + + +int zone_overlaps(zone_Type *this, zone_Type *other) +{ + return !( (this->lat2 <= other->lat1 || other->lat2 <= this->lat1) + || (this->lon2 <= other->lon1 || other->lon2 <= this->lon1) ); +} + + +#define parse_error(in, ...) \ + { \ + fprintf(stderr, "%s:%d: ", reader_getPath(in), reader_getLineNumber(in)); \ + fprintf(stderr, __VA_ARGS__); \ + fprintf(stderr, "\n"); \ + } + + +/** + * Remove some of the detail in an object to reduce the CPU overhead + * of transforming and clipping it. + * + * FIXME: quite arbitrary algorithm -- to be revised. + * We might, for example, "linearize" near straight lines. + * For now, applies only to polygons with more than 9 vertices. + */ +static void zone_undersampleObject (VObject * obj, int rate) +{ + int i, j, k; + + k = 0; + + for (i = 0; i < obj->numPolys; ++i) { + if( obj->polygon[i]->numVtces < 9 ) + continue; + for (j = 0; j < obj->polygon[i]->numVtces; j += rate) { + obj->polygon[i]->vertex[k++] = obj->polygon[i]->vertex[j]; + } + obj->polygon[i]->numVtces = k; + } +} + + +static int zone_parseDouble(reader_Type *in, char *s, double *freq) +{ + char *tail; + *freq = strtod(s, &tail); + if( tail == s || *tail != 0 || ! isfinite(*freq) ){ + fprintf(stderr, "%s:%d: invalid decimal number syntax: %s\n", + reader_getPath(in), reader_getLineNumber(in), s); + return 0; + } + return 1; +} + + +/** + * Parses the latitude, longitude and altitude fields. + * @param in Input file to generate punctual error messages. + * @param lat Latitude string. + * @param lon Longitude string. + * @param alt Altitude (ft). + * @param w Put result here. + * @return True if parsing succeeded; false if parsing failed and an error has + * been sent to standard error. + */ +static int zone_parseLatLonAlt(reader_Type *in, char *lat, char *lon, char *alt, earth_LatLonAlt *w) +{ + if( ! earth_parseLatitude(lat, &w->latitude) ){ + fprintf(stderr, "%s:%d: invalid latitude syntax: %s\n", + reader_getPath(in), reader_getLineNumber(in), lat); + return 0; + } + if( ! earth_parseLongitude(lon, &w->longitude) ){ + fprintf(stderr, "%s:%d: invalid longitude syntax: %s\n", + reader_getPath(in), reader_getLineNumber(in), lon); + return 0; + } + if( ! zone_parseDouble(in, alt, &w->z) ) + return 0; + w->z = units_FEETtoMETERS(w->z); + return 1; +} + + +static void zone_parseTeamLocationRecord(zone_Type *this, reader_Type *in, char **argv, int argc, int team_no) +{ + if( argc != 5 ){ + fprintf(stderr, "%s:%d: invalid number of fields in %s record\n", + reader_getPath(in), reader_getLineNumber(in), argv[0]); + return; + } + if( ! zone_parseLatLonAlt(in, argv[1], argv[2], argv[3], &this->forceBaseLocations[team_no]) ) + return; + if( ! zone_includesLocation(this, &this->forceBaseLocations[team_no]) ) + fprintf(stderr, "%s:%d: team location outside range of zone %s\n", + reader_getPath(in), reader_getLineNumber(in), this->path); + double heading; + if( ! zone_parseDouble(in, argv[4], &heading) ) + return; +} + + +/** + * Parses RWY and RWY2 records and add to the surface list array. + * @param in + * @param argv Fields of the scene record. + * @param argc Number of fields in the record. + */ +static void zone_parseRunwayRecord(zone_Type *this, reader_Type *in, char **argv, int argc) +{ + double heading, mag, length, width; + int j; + VPoint fwd, down, local_fwd, local_right, local_down; + earth_LatLonAlt w, w1, w2; + VPoint xyz; + VPolygon *p; + + if (strcmp(argv[0], "RWY") == 0) { + + if( argc != 10 ){ + parse_error(in, "invalid number of fields in runway record -- ignoring."); + return; + } + + if( ! zone_parseDouble(in, argv[4], &length) ) + return; + length = units_FEETtoMETERS(length); + + if( ! zone_parseDouble(in, argv[5], &width) ) + return; + width = units_FEETtoMETERS(width); + + if( ! zone_parseLatLonAlt(in, argv[6], argv[7], argv[3], &w) ) + return; + if( ! zone_parseLatLonAlt(in, argv[8], argv[9], argv[3], &w1) ) + return; + + earth_LatLonAltToXYZ(&w, &xyz); + VPoint xyz1; + earth_LatLonAltToXYZ(&w1, &xyz1); + + /* + * Calculate runway forward direction: + */ + + local_fwd.x = xyz1.x - xyz.x; + local_fwd.y = xyz1.y - xyz.y; + local_fwd.z = xyz1.z - xyz.z; + + mag = sqrt ( + local_fwd.x * local_fwd.x + + local_fwd.y * local_fwd.y + + local_fwd.z * local_fwd.z + ); + local_fwd.x /= mag; + local_fwd.y /= mag; + local_fwd.z /= mag; + + /* + * Average those two points to generate a midpoint that will be the + * origin of a runway coordinate system. + */ + + xyz.x = (xyz.x + xyz1.x) / 2.0; + xyz.y = (xyz.y + xyz1.y) / 2.0; + xyz.z = (xyz.z + xyz1.z) / 2.0; + earth_XYZToLatLonAlt(&xyz, &w2); + if( ! zone_includesLocation(this, &w2) && ! zone_includesLocation(this, &w1) ) + fprintf(stderr, "%s:%d: RWY %s %s middle point outside of the zone\n", + reader_getPath(in), reader_getLineNumber(in), argv[1], argv[2]); + VMatrix XYZtoNED; + earth_generateWorldToLocalMatrix(&w2, &XYZtoNED); + down.z = 1.0; + down.x = down.y = 0.0; + VReverseTransform_(&down, &XYZtoNED, &local_down); + + /* + * Calculate runway heading, normalized to [0,pi[ and fix the + * local_fwd direction accordingly: + */ + + VPoint q; + VTransform_(&local_fwd, &XYZtoNED, &q); + heading = atan2(q.y, q.x); + if( heading < 0.0 ){ + heading += M_PI; + local_fwd.x = -local_fwd.x; + local_fwd.y = -local_fwd.y; + local_fwd.z = -local_fwd.z; + } + + } else { // RWY2 + + if( argc != 9 ){ + parse_error(in, "invalid number of fields in runway record -- ignoring."); + return; + } + + + if( ! zone_parseDouble(in, argv[4], &length) ) + return; + length = units_FEETtoMETERS(length); + + if( ! zone_parseDouble(in, argv[5], &width) ) + return; + width = units_FEETtoMETERS(width); + + if( ! zone_parseDouble(in, argv[8], &heading) ) + return; + heading = units_DEGtoRAD(heading); + + /* + In order to correctly place the runway numbers, the + local_fwd vector must be oriented in the range [0,pi[: + */ + + if( heading >= M_PI ) + heading -= M_PI; + + if( ! zone_parseLatLonAlt(in, argv[6], argv[7], argv[3], &w) ) + return; + if( ! zone_includesLocation(this, &w) ) + fprintf(stderr, "%s:%d: the middle point of the runway lies outside of the zone\n", + reader_getPath(in), reader_getLineNumber(in)); + + earth_LatLonAltToXYZ(&w, &xyz); + + VMatrix XYZtoNED; + earth_generateWorldToLocalMatrix(&w, &XYZtoNED); + + fwd.x = cos(heading); + fwd.y = sin(heading); + fwd.z = 0.0; + VReverseTransform_(&fwd, &XYZtoNED, &local_fwd); + + down.z = 1.0; + down.x = down.y = 0.0; + VReverseTransform_ (&down, &XYZtoNED, &local_down); + } + + + /* + * Calculate the local right vector in geocentric XYX. + * A basic property of Cross Products: k x i = j + */ + VCrossProd(&local_down, &local_fwd, &local_right); + + /* + * Generate a transformation matrix to get from "runway" coordinates to + * Geocentric. The x axis of the runway coord. (local_fwd) points in the + * range [0,180[ DEG of the geographical coords. + */ + VMatrix RWYtoXYZ; + VIdentMatrix(&RWYtoXYZ); + + RWYtoXYZ.m[0][0] = local_fwd.x; + RWYtoXYZ.m[1][0] = local_fwd.y; + RWYtoXYZ.m[2][0] = local_fwd.z; + + RWYtoXYZ.m[0][1] = local_right.x; + RWYtoXYZ.m[1][1] = local_right.y; + RWYtoXYZ.m[2][1] = local_right.z; + + RWYtoXYZ.m[0][2] = local_down.x; + RWYtoXYZ.m[1][2] = local_down.y; + RWYtoXYZ.m[2][2] = local_down.z; + + RWYtoXYZ.m[0][3] = xyz.x; + RWYtoXYZ.m[1][3] = xyz.y; + RWYtoXYZ.m[2][3] = xyz.z; + + char *airport = argv[1]; + char *runways_no = argv[2]; + + VPolySet *ps = runway_build(runways_no, &RWYtoXYZ, length, width, heading); + + /* + * We create a "craft type" for each airport. + * + * Optimize a bit here and put all the runways for a given airport + * in the same object, assuming runways are listed per airport. + + * NOTE. With this optimization, a runway that crosses another one + * will hide part of this latter. Otherwise without this + * optimization the two overlapping parts are rendered + * alternatively one and the other producing a bad flickering + * effect, I don't know why. + */ + + VObject *object; + if( stbl == NULL ) + object = NULL; + else + object = stbl->cinfo->object; + + if ((object != NULL) && (strcmp(object->name, airport) == 0)) { + + /* + * New runway at same airport as the last one. Optimize by adding a + * polygon to the last runway. + */ + + object->polygon = memory_realloc( object->polygon, + sizeof (VPolygon *) * (object->numPolys + VPolySet_Count(ps))); + j = 0; + p = VPolySet_First(ps); + while( p != NULL ){ + object->polygon[object->numPolys + j] = p; + p = VPolySet_Next(ps); + j++; + } + object->numPolys += VPolySet_Count(ps); + VPolySet_Free(ps, 0); + VComputeObjectExtent (object); + + } else { + + /* + * New airport. New object and craftInfo. + */ + + object = memory_allocate(sizeof(VObject), NULL); + memset(object, 0, sizeof(VObject)); + object->name = memory_strdup(airport); + object->numPolys = VPolySet_Count(ps); + object->polygon = memory_allocate( sizeof(VPolygon *) * object->numPolys, NULL ); + p = VPolySet_First(ps); + j = 0; + while( p != NULL ){ + object->polygon[j++] = p; + p = VPolySet_Next(ps); + } + VPolySet_Free(ps, 0); + object->order = NULL; + + VComputeObjectExtent (object); + + craft *c = zone_craftNew(); + c->zone = this; + c->type = CT_SURFACE; + c->flags = FL_FIXED_OBJECT; + c->w = w; + /* + * The terrain module needs the center position of the airport (or of + * any nearby runway) to calculate altitude of the terrain. + */ + c->Sg.x = xyz.x; + c->Sg.y = xyz.y; + c->Sg.z = xyz.z; + + /* Create new craft info only if really necessary. */ + c->cinfo = inventory_craftTypeSearchByZoneAndName(this, airport); + if( c->cinfo == NULL ){ + // FIXME: BUG: these airports are not released along with the zone. + c->cinfo = inventory_craftTypeNew(this); + c->cinfo->name = memory_strdup(airport); + c->cinfo->object = object; + c->cinfo->placeProc = NULL; + } + } + +} + + +static void zone_parseNavRecord(zone_Type *this, reader_Type *in, char **argv, int argc) +{ + if( argc != 8 ){ + fprintf(stderr, "%s:%d: invalid number of fields in NAV record\n", + reader_getPath(in), reader_getLineNumber(in)); + return; + } + earth_LatLonAlt w; + if( ! zone_parseLatLonAlt(in, argv[3], argv[4], argv[5], &w) ) + return; + if( ! zone_includesLocation(this, &w) ) + fprintf(stderr, "%s:%d: NAV outside range of zone %s\n", + reader_getPath(in), reader_getLineNumber(in), this->path); + double freq; + if( ! zone_parseDouble(in, argv[6], &freq) ) + return; + navaid_add_vor_dme_ndb(this, argv[1], argv[2], &w, freq); +} + + +static void zone_parseILSRecord(zone_Type *this, reader_Type *in, char **argv, int argc) +{ + if( argc != 13 ){ + fprintf(stderr, "%s:%d: invalid number of fields in ILS record\n", + reader_getPath(in), reader_getLineNumber(in)); + return; + } + + earth_LatLonAlt localizer; + if( ! zone_parseLatLonAlt(in, argv[5], argv[6], argv[9], &localizer) ) + return; + if( ! zone_includesLocation(this, &localizer) ) + fprintf(stderr, "%s:%d: LOCALIZER outside range of zone %s\n", + reader_getPath(in), reader_getLineNumber(in), this->path); + + // FIXME: check presence of the GS based on the type of ILS. + earth_LatLonAlt gs = (earth_LatLonAlt){0, 0, 0}; + double gs_angle = 0; + if( strcmp(argv[7], "-") != 0 ){ + if( ! zone_parseLatLonAlt(in, argv[7], argv[8], "0", &gs) ) + return; + if( ! zone_includesLocation(this, &gs) ) + fprintf(stderr, "%s:%d: GS outside range of zone %s\n", + reader_getPath(in), reader_getLineNumber(in), this->path); + gs.z = localizer.z; + if( ! zone_parseDouble(in, argv[12], &gs_angle) ) + return; + } + + double freq; + if( ! zone_parseDouble(in, argv[4], &freq) ) + return; + + double loc_width; + if( ! zone_parseDouble(in, argv[10], &loc_width) ) + return; + + double loc_bearing; + if( ! zone_parseDouble(in, argv[11], &loc_bearing) ) + return; + + navaid_add_ils(this, argv[3], argv[2], &localizer, &gs, freq, + loc_width, loc_bearing, gs_angle); +} + + +static void zone_parseFeature(zone_Type *this, reader_Type *in, char **argv, int argc) +{ + if( argc != 6 ){ + fprintf(stderr, "%s:%d: invalid number of fields in FEATURE record\n", + reader_getPath(in), reader_getLineNumber(in)); + return; + } + + earth_LatLonAlt w; + if( ! zone_parseLatLonAlt(in, argv[2], argv[3], argv[4], &w) ) + return; + if( ! zone_includesLocation(this, &w) ) + fprintf(stderr, "%s:%d: FEATURE outside range of zone %s\n", + reader_getPath(in), reader_getLineNumber(in), this->path); + + double heading; + if( ! zone_parseDouble(in, argv[5], &heading) ) + return; + heading = units_DEGtoRAD(heading); + + int depthcue = 1; + int undersample = 0; + + char *fn = argv[1]; + if (*fn == '@') { + fn++; + undersample = 1; + } + + if (*fn == '+') { + fn++; + depthcue = 0; + } + + craft *c = zone_craftNew(); + c->zone = this; + c->type = CT_SURFACE; + c->w = w; + earth_LatLonAltToXYZ(&c->w, &c->Sg); + c->curHeading = pm_normalize_yaw(heading); + + c->cinfo = inventory_craftTypeSearchByZoneAndName(this, fn); + if ( c->cinfo == NULL ) { + /* Create new inventory object from this feature. */ + char *fn_resolved = reader_resolveRelativePath(reader_getPath(in), fn); + char *p = strrchr(fn_resolved, '.'); + FILE *f = fopen(fn_resolved, "r"); + if (f == NULL){ + parse_error(in, "failed opening %s: %s", fn_resolved, strerror(errno)); + memory_dispose(fn_resolved); + zone_craftRelease(c); + return; + } + c->cinfo = inventory_craftTypeNew(this); + c->cinfo->name = fn_resolved; + c->cinfo->object = NULL; + if (p != NULL && (strcmp(p, ".dxf") == 0 || + strcmp(p, ".DXF") == 0)) { + c->cinfo->object = VReadDepthCueuedDXFObject(f, depthcue); + } else { + c->cinfo->object = VReadDepthCueuedObject(f, depthcue); + } + if ( c->cinfo->object == NULL ) { + parse_error(in, "failed reading %s: %s", fn_resolved, strerror(errno)); + fclose(f); + inventory_craftTypeRelease(c->cinfo); + zone_craftRelease(c); + return; + } + fclose(f); + if (undersample) + zone_undersampleObject(c->cinfo->object, 3); + } +} + + +void zone_load(zone_Type *this) +{ + this->expire = time(NULL) + zone_EXPIRE_PERIOD_SEC; + if( this->isLoaded ) + return; + //printf("DEBUG: loading zone %s\n", this->path); + this->isLoaded = 1; + this->groundColor = memory_strdup("#305030"); + + /* + * The units used in the objects we've created are expressed in FEET. + * Internally, graphics objects should be METERS. + */ + VPoint scale; + scale.x = scale.y = scale.z = units_FEETtoMETERS (1.0); + VSetReadObjectScale (&scale); + + reader_Type *in = reader_new(this->path); + char *argv[16], line[1000]; + int argc; + while( reader_getLine(in, line, sizeof(line)) ){ + + // Ignore empty and comment lines. + if( line[0] == '\0' || line[0] == '#' ) + continue; + + if( ! reader_split(line, &argc, argv, 32) ){ + parse_error(in, "too many fields -- ignoring line"); + + } else if ( strcmp(argv[0], "TEAM1_LOC") == 0 ) { + zone_parseTeamLocationRecord(this, in, argv, argc, 1); + + } else if( strcmp(argv[0], "TEAM2_LOC") == 0 ){ + zone_parseTeamLocationRecord(this, in, argv, argc, 2); + + } else if( strcmp(argv[0], "GROUND_COLOR") == 0 ){ + if( argc == 2 ){ + memory_dispose(this->groundColor); + this->groundColor = memory_strdup(argv[1]); + } else { + parse_error(in, "invalid number of fields in GROUND_COLOR record"); + } + + } else if (strcmp(argv[0], "RWY") == 0) { + zone_parseRunwayRecord(this, in, argv, argc); + + } else if (strcmp(argv[0], "RWY2") == 0) { + zone_parseRunwayRecord(this, in, argv, argc); + + } else if (strcmp(argv[0], "NAV") == 0) { + zone_parseNavRecord(this, in, argv, argc); + + } else if (strcmp(argv[0], "ILS") == 0) { + zone_parseILSRecord(this, in, argv, argc); + + } else if (strcmp(argv[0], "FEATURE") == 0) { + zone_parseFeature(this, in, argv, argc); + + } else { + parse_error(in, "unexpected record `%s' -- ignoring.", argv[0]); + } + + } + if( reader_getError(in) != NULL ) + error_external("%s: %s", reader_getPath(in), reader_getError(in)); + memory_dispose(in); +} + + +void zone_purge(zone_Type *this, int forced) +{ + if( ! this->isLoaded ) + return; + if( ! forced && time(NULL) < this->expire ) + this->isLoaded = 0; + //printf("DEBUG: releasing zone %s\n", this->path); + navaid_purgeZone(this); + memory_dispose(this->groundColor); + this->groundColor = NULL; + craft *c = stbl; + while( c != NULL ){ + craft *next = c->next; + if( c->zone == this ) + zone_craftRelease(c); + c = next; + } + inventory_purgeZone(this); +} diff -Nru acm-5.0/src/acm/zone.h acm-6.0+20200416/src/acm/zone.h --- acm-5.0/src/acm/zone.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/zone.h 2020-04-16 12:05:40.000000000 +0000 @@ -0,0 +1,152 @@ +/** + * The zone objects represents the contents of a cached scenery file. + * + * ZONE LOADING AND CACHING. + * A zone can be loaded or not loaded. When loaded, all the items of the scenery + * (runways, navigation aids, ILS, features, ...) are available to the program. + * When not loaded, all these elements are removed from memory. + * + * The zones module uses zone objects to implement a scenery caching mechanism + * where only the strictly needed sceneries are loaded in memory at any given + * time based on the region each player (normally only one) is flying over; + * nearby zone closer than 200 NM are loaded as well, so any tunable radio + * station be available. + * + * INSIDE/OUTSIDE ZONE DEFINITION. + * As items are loaded from the scenery file, a consistency check is performed + * and the location (lat,lon) of each item is compared against the state range + * of latitude and longitude; the item is indeed inside the zone only if: + * + * LAT_MIN ≤ lat < LAT_MAX and + * LON_MIN ≤ lon < LON_MAX + * + * A non-fatal warning is sent on standard output if the location of the item + * falls outside the range. Note that there is no way to include an item if it + * is located exactly at the north pole; this does not seem to be a severe + * limitation, though. For items located exactly on the 180E meridian, the + * 180W can be indicated instead. + * + * - VOR, DME and NDB are inside if their location is in the range. + * + * - ILS are included based on the location of the LOCATOR antenna only; + * the location of the associate GS and DME antennas do not matter. + * + * - Runways are included if their middle point lies in the range. + * + * Note that a runway may belong to the zone but its corresponding ILS be outside + * or vice-versa; this is not a problem as soon as the nearby zone including the + * missing item be available, as in this case ACM loads both the zones anyway as + * the aircraft gets close to the edge or within 200 NM from it. + * + * SIDE EFFECTS OF THIS MODULE. + * Several global data structures and modules are involved: + * + * - The list of surface objects, including runways and features is constantly + * updated based on the sceneries currently loaded. This is the main task of + * this module. + * + * - The list of NAVAIDs, including NDB, VOR and ILS, see the navaid module. + * + * - The list of "craft types" used to store airports informations, see the + * inventory module. + * + * @file + * @author Umberto Salsi + * @version $Date: 2020/01/08 06:11:07 $ + */ + +#ifndef ZONE_H +#define ZONE_H + +#include "../dis/dis/earth.h" + +#ifdef zone_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +/** + * State of a zone. + */ +typedef struct zone_Type zone_Type; + +/** + * Allocates a new zone. The initial status of the zone is "not loaded". + * @param path Scenery file. + * @param lat1 Minimum latitude covered by this scenery (included, RAD). + * @param lat2 Maximum latitude covered by this scenery (excluded, RAD). + * @param lon1 Minimum longitude covered by this scenery (included, RAD). + * @param lon2 Maximum longitude covered by this scenery (excluded, RAD). + * @return Allocated new zone. Must be released with memory_dispose(). + */ +EXTERN zone_Type * zone_new(char *path, double lat1, double lat2, double lon1, double lon2); + +/** + * Tells if this zone is currently loaded, that is the scenery file has been + * parsed and the items therein defined are available to the player. + */ +EXTERN int zone_isLoaded(zone_Type *this); + +/** + * Returns the name of the file this zone has been (or might be) loaded from. + */ +EXTERN char * zone_getPath(zone_Type *this); + +/** + * Returns the ground color name defined in the zone. Returns NULL if the zone + * is not currently loaded. + */ +EXTERN char * zone_getGroundColor(zone_Type *this); + +/** + * Returns the location of the force base. + * @param this + * @param force Force number, one of the DISForce enum constants. + * @return Location of the force base if the zone is currently loaded and the + * zone defines the requested team location; NULL otherwise. + */ +EXTERN earth_LatLonAlt * zone_getForceBaseLocation(zone_Type *this, int force); + +/** + * Returns true if the zone includes the point. Points over and beyond the + * maximum latitude and longitude are outside. + */ +EXTERN int zone_includesLocation(zone_Type *this, earth_LatLonAlt *w); + +/** + * Returns true if the point p is flying over or it is close to the zone. + * A point is close to this zone if it is inside or not farther than 4 DEG + * from any of its borders; the test is implemented to be fast, not precise. + * Altitude does not matter here. + * @param this + * @param p + * @return True if close or inside the zone. + */ +EXTERN int zone_isClose(zone_Type *this, earth_LatLonAlt *p); + +/** + * Returns true is the zones overlaps, that is they share at least one point. + */ +EXTERN int zone_overlaps(zone_Type *this, zone_Type *other); + +/** + * Reads the scenery file and all the items therein defined. Recoverable errors + * are sent to standard error; unrecoverable errors are fatal. The lists of + * surface items, navaids and ILS are updated accordingly. If the zone is + * already in its loaded status, simply postpones its expiry time. + */ +EXTERN void zone_load(zone_Type *this); + +/** + * Purge items related to the zone.The lists of surface items, navaids and ILS + * are purged accordingly. Does nothing if the zone is already in its "not + * loaded" status or the expiry time is not elapsed. + * @param this + * @param forced If true, overrides the internal expiry time caching mechanism + * and really purges all items. + */ +EXTERN void zone_purge(zone_Type *this, int forced); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm/zones.c acm-6.0+20200416/src/acm/zones.c --- acm-5.0/src/acm/zones.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/zones.c 2017-10-28 10:39:18.000000000 +0000 @@ -0,0 +1,140 @@ +#include +#include +#include +#include +#include +#include + +#include "../util/memory.h" +#include "../util/error.h" +#include "../util/reader.h" +#include "zone.h" + +#define zones_IMPORT +#include "zones.h" + + +struct zones_Type { + + /** Path to the zones file. */ + char *path; + + /* List of zones. */ + int zones_capacity; + int zones_length; + zone_Type **zones; + + /** + * Scheduled next update time (s). Ignore load requests since then to reduce + * overload. + */ + time_t next_zone_update; +}; + + +static void zones_destruct(void *p) +{ + //printf("DEBUG: %s\n", __FUNCTION__); + zones_Type *this = (zones_Type *) p; + while( this->zones_length > 0 ){ + this->zones_length--; + memory_dispose(this->zones[ this->zones_length ]); + } + memory_dispose(this->zones); + memory_dispose(this->path); +} + + +static void zones_parseZone(zones_Type *this, reader_Type *in, char **argv, int argc) +{ + if( argc != 5 ) + error_external("%s:%d: expected 5 fields, found %d", reader_getPath(in), reader_getLineNumber(in), argv); + double lat1, lat2, lon1, lon2; + if( ! earth_parseLatitude(argv[0], &lat1) ) + error_external("%s:%d: invalid latitude: %s", reader_getPath(in), reader_getLineNumber(in), argv[0]); + if( ! earth_parseLatitude(argv[1], &lat2) ) + error_external("%s:%d: invalid latitude: %s", reader_getPath(in), reader_getLineNumber(in), argv[1]); + if( ! earth_parseLongitude(argv[2], &lon1) ) + error_external("%s:%d: invalid longitude: %s", reader_getPath(in), reader_getLineNumber(in), argv[2]); + if( ! earth_parseLongitude(argv[3], &lon2) ) + error_external("%s:%d: invalid longitude: %s", reader_getPath(in), reader_getLineNumber(in), argv[3]); + if( !(lat1 < lat2 && lon1 < lon2) ) + error_external("%s:%d: check latitude and longitude ordering", reader_getPath(in), reader_getLineNumber(in)); + + // Check the scenery file is indeed there: + char *path = reader_resolveRelativePath(reader_getPath(in), argv[4]); + if( ! reader_isReadable(path) ) + error_external("%s:%d: file %s does not exist or it is not readable", reader_getPath(in), reader_getLineNumber(in), path); + + // Create zone object: + zone_Type *zone = zone_new(path, lat1, lat2, lon1, lon2); + memory_dispose(path); + + // Check if this zone overlaps with any other zone: + int i; + for(i = this->zones_length-1; i >= 0; i--){ + if( zone_overlaps(zone, this->zones[i]) ) + error_external("%s:%d: zone %s overlaps with zone %s", + reader_getPath(in), reader_getLineNumber(in), + zone_getPath(zone), zone_getPath(this->zones[i])); + } + + // Ok, add this zone: + if( this->zones_length >= this->zones_capacity ){ + this->zones_capacity += 100; + this->zones = memory_realloc(this->zones, this->zones_capacity * sizeof(zone_Type *)); + } + this->zones[this->zones_length++] = zone; +} + + +zones_Type * zones_new(char *path) +{ + zones_Type * this = memory_allocate(sizeof(zones_Type), zones_destruct); + this->path = memory_strdup(path); + this->zones_capacity = 0; + this->zones_length = 0; + this->zones = NULL; + this->next_zone_update = 0; + + reader_Type *in = reader_new(path); + char line[999]; + while( reader_getLine(in, line, sizeof(line)) ){ + char *s = line; + while( isspace(*s) ) + s++; + if( *s == 0 || *s == '#' ) + continue; + char *argv[5]; + int argc; + if( ! reader_split(line, &argc, argv, 5) ) + error_external("%s:%d: too many fields", reader_getPath(in), reader_getLineNumber(in)); + zones_parseZone(this, in, argv, argc); + } + if( reader_getError(in) != NULL ) + error_external("%s: %s", reader_getPath(in), reader_getError(in)); + memory_dispose(in); + return this; +} + + +zone_Type * zones_load(zones_Type *this, earth_LatLonAlt *p, zone_Type *last_known, int forced) +{ + time_t now = time(NULL); + if( ! forced && now < this->next_zone_update ) + return last_known; + zone_Type *current_zone = NULL; + this->next_zone_update = now + 10; + int i; + for( i = this->zones_length - 1; i >= 0; i--){ + zone_Type *zone = this->zones[i]; + if( zone_isClose(zone, p) ){ + zone_load(zone); + if( zone_includesLocation(zone, p) ) + current_zone = zone; + } else { + zone_purge(zone, 0); + } + } + return current_zone; +} diff -Nru acm-5.0/src/acm/zones.h acm-6.0+20200416/src/acm/zones.h --- acm-5.0/src/acm/zones.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/acm/zones.h 2020-04-16 12:05:40.000000000 +0000 @@ -0,0 +1,88 @@ +/** + * A "zones" object manages a list of "zone" objects (see) and their state. + * + * Basically, the zones objects reads the list of the available zones from a + * file (normally objects/zones.txt) and initializes a corresponding list of + * "zone" objects. Each zone is actually read and loaded or unloaded as needed + * based on the location of each player (normally only one). + * + * The zones file is a text file containing one line for each available zone; + * each line must contains 5 fields separated by at least one white space: + * + * 1. Minimum covered latitude. + * 2. Maximum covered latitude. + * 3. Minimum covered longitude. + * 4. Maximum covered longitude. + * 5. File name of the ACM scenery; may contain a path relative to the + * zones file itself. + * + * Latitudes and longitudes may have the usual syntax, examples: + * + * 10N 10-20-30.400S 30.5S + * 10E 10-20-30.400W 30.5W + * + * The ordering is important, so 90S < 90N, 180W < 180E. + * + * For each zone (that is, each ACM scenery file) a specific zone object is + * created; runways, craft types, features and NAVAIDS belonging to a specific + * zone, have that zone as one of their "struct" field. That field allows to + * recognize to which zone each object belongs. + * + * Each player's aircraft (normally only one per program) should then feed its + * current position by calling the zones_load() function, which in turn triggers + * the loading of the appropriate scenery; sceneries that are not needed anymore + * are removed from memory along with all their own objects. + * + * @file + * @author Umberto Salsi + * @version $Date: 2020/01/08 06:11:32 $ + */ + +#ifndef ZONES_H +#define ZONES_H + +#include "../dis/dis/earth.h" +#include "zone.h" + +#ifdef zones_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +/** + * Available zones and their state. + */ +typedef struct zones_Type zones_Type; + +/** + * Creates a new zones object. The zones file is read, ranges of latitude and + * longitude for each zone is parsed, sceneries files are checked for + * readability but not read yet. Non-fatal errors while parsing the zones file + * are sent to standard error; fatal errors causes abort. + * @param path Path of the zones file, normally objects/zones.txt. + * @return New zones object. Must be released with memory_dispose(), which in + * turn triggers the release of any loaded zone and all the items therein + * defined. + */ +EXTERN zones_Type * zones_new(char *path); + +/** + * Feed the zones object with the current position of a player. In turn, this + * may update the zones cache by triggering the loading or the un-loading of some + * zone. For performances reason, this request is only evaluated from time to + * time and ignored most of the times. + * @param this Zones object. + * @param p Position of the player; the altitude does not matter. + * @param last_known Last known zone the point (that is, the craft) was flying + * over. Set to NULL if still unknown. + * @param forced If true, forces the evaluation of the position and guarantees + * the appropriate zone be loaded immediately if available. + * @return Current zone below the specified point. If forced update has been + * requested, this is the real zone below the point, possibly NULL if no zone + * available. If not forced, the last know zone is returned most of the times. + */ +EXTERN zone_Type * zones_load(zones_Type *this, earth_LatLonAlt *p, zone_Type *last_known, int forced); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/acm.c acm-6.0+20200416/src/acm.c --- acm-5.0/src/acm.c 1994-01-28 15:24:37.000000000 +0000 +++ acm-6.0+20200416/src/acm.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,199 +0,0 @@ -/* - * acm : an aerial combat simulator for X - * Copyright (C) 1991-1994 Riley Rainey - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 dated June, 1991. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. - */ - -#include "manifest.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#if defined(HAVE_STDLIB_H) -#include -#ifndef bcopy -#define bcopy(s, d, n) memcpy ((d), (s), (n)) -#endif -#endif - -extern char *getenv (); -extern struct servent *getservent(); - -jmp_buf dead; - -#ifdef SIGVOID -void -#endif -done () { - longjmp (dead, 0); -} - -main (argc, argv) -int argc; -char *argv[]; { - - char *display; - char *host; - char *user; - char *plane; - char myhost[64]; - char args[256]; - int s, n = 1; -#ifdef _POSIX_VERSION - pid_t pid; -#else - int pid; -#endif - struct passwd *pwent, *getpwuid(); - struct sockaddr_in sin; - struct hostent *h = (struct hostent *) NULL; - - (void) gethostname (myhost, sizeof(myhost)); - - if ((host = getenv("ACMSERVER")) == NULL) - if (argc >= 2 && *argv[1] != '-') { - host = argv[1]; - n = 2; - } - else { - host = malloc (strlen(myhost) + 1); - (void) strcpy (host, myhost); - n = 1; - } - - if ((pwent = getpwuid(getuid())) == NULL) { - (void) fprintf (stderr, "Yow!\n"); - exit (1); - } - - if ((user = getenv("ACM_HANDLE")) != NULL) { - if (strncmp (user, "drone", 5) != 0) - pwent->pw_name = user; - } - - plane = getenv ("ACM_PLANE"); - - if ((display = getenv("DISPLAY")) == NULL) { - (void) fprintf (stderr, "Excuse me, but you have no DISPLAY.\n\ -How do you use X, anyway?\n"); - exit (1); - } - -/* - * Sometimes we end up with a DISPLAY value that won't jive on the - * network (e.g. ":0.0") -- fix these cases. Also, from Michael Pall, - * if the acm server is running on the local system, allow "unix:*" and - * "local:*" connections. - */ - - if (*display == ':') { - (void) strcat (myhost, display); - display = myhost; - } - else if (strcmp (myhost, host)) { - if (strncmp ("unix:", display, 5) == 0) { - (void) strcat (myhost, display+4); - display = myhost; - } - else if (strncmp ("local:", display, 6) == 0) { - (void) strcat (myhost, display+5); - display = myhost; - } - } - - if ((sin.sin_addr.s_addr = inet_addr (host)) != -1) { - sin.sin_family = AF_INET; - } - else if ((h = gethostbyname (host)) != 0) { - sin.sin_family = h->h_addrtype; - bcopy (h->h_addr, (char *) &sin.sin_addr, h->h_length); - } - else { - (void) fprintf (stderr, "Unknown host \"%s\"\n", host); - exit (1); - } - - sin.sin_port = htons(ACM_PORT); - - signal (SIGPIPE, done); - -reconnect: - if ((s = socket (AF_INET, SOCK_STREAM, 0)) < 0) { - perror ("can't get a socket"); - exit (1); - } - - if (connect (s, (struct sockaddr *) &sin, sizeof (sin)) < 0) { - (void) close (s); - pid = fork(); - if (pid == 0) { - (void) fprintf (stderr, "Automatically starting server ...\n"); - (void) execl ("/bin/sh", "sh", "-c", "exec acms", (char *) 0); - perror ("exec of acms failed"); - exit (1); - } - else if (pid > 0) { - sleep (3); - goto reconnect; - } - perror ("can't connect to server"); - (void) close (s); - exit (1); - } - - if (argv[n] != (char *) NULL) - (void) strcpy (args, argv[n++]); - else - (void) strcpy (args, ""); - - for (; argv[n] != (char *) NULL; ++n) { - (void) strcat (args, "|"); - (void) strcat (args, argv[n]); - } - - if (plane) { - (void) strcat (args, "|-plane|"); - (void) strcat (args, plane); - } - - if (setjmp (dead) == 0) - (void) handshake (s, display, pwent->pw_name, args); - - exit (0); -} - -handshake (s, dpy, name, args) -int s; -char *dpy, *name, *args; { - - char info[256]; - int n; - - (void) sprintf (info, "%s %s %s\n", dpy, name, args); - (void) write (s, info, strlen (info)); - while ((n = read (s, info, sizeof (info))) > 0) - (void) write (fileno (stdout), info, n); - - (void) shutdown (s, 2); - - return 0; -} diff -Nru acm-5.0/src/acm.man acm-6.0+20200416/src/acm.man --- acm-5.0/src/acm.man 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/src/acm.man 1970-01-01 00:00:00.000000000 +0000 @@ -1,317 +0,0 @@ -.TH ACM 6 "August 1, 1998" -.SH NAME -acm \- an aerial combat simulator for X -.SH SYNOPSIS -.B acm -[ -.I options -] -.LP - -.SH DESCRIPTION - -acm is a distributed air combat simulator that runs on the X window system. -Players can engage in simultaneous air combat from different Unix -workstations. Players fly jet aircraft -equipped with radar, heat seeking missiles and cannon. - -Each player flies something close to either an F-16C Falcon or MiG-29 Fulcrum. - - -.SH USAGE REFERENCE -.LP -The following command line options are recognized by acm: -.LP -.TP --plane F-16 or MiG-29 or C-172 -Select the aircraft type that you'd like to fly. -.TP --frame-rate n -Limits the displayed frame rate to n frames per second. If neither --frame-rate nor -update-rate are specified, ACM updates the display -as fast as possible, effectively eating all available CPU time. -.TP --update-rate n -Sets the simulation update rate to n interations per second. If neither --frame-rate nor -update-rate are specified, ACM updates the display -as fast as possible, effectively eating all available CPU time. If --frame-rate is supplied alone the update rate defaults to 50 hertz. -.TP --watch-frame-rate -Print statistics about the actual display frame rate on standard -output. -.TP --nosplash -Don't display the initial splash screen. (Try this if you have -problems on start-up.) -.TP --dis-silent -Stops DIS packets being sent. -.TP --dis-site integer -Sets the DIS simulation address to the specified value. The DIS -standard defines this address as an enumerated value corresponding to -a geographical site. For more information, consult the IEEE 1278 -protocol definition. -.TP --dis-appl integer -Sets the DIS application id to the specified value. This value is used -in DIS packets to distinguish your acm application from other DIS -applications running at the same site. -.TP --linuxjs joystick-device -Specifies the joystick device file to the Linux Joystick v2.0.0 driver. -The Joystick driver supports a wide variety of joysticks, although -the simulator will only use the X-Y axis, the next axis as the throttle, -and the first two buttons. -.TP --js serial-device -Specifies the local serial port where a Colorado Spectrum Workstation -Gameport is attached. The Gameport allows you to connect PC-compatible -joysticks and use them with ACM. -.TP --audio auserver -The name of a NAS audio server. -.TP --geometry geometry_spec -An X compatible window geometry specification. -.TP --team <1 or 2> -Specifies the starting airfield. Airfields are about 50 nm apart. -Team 1 flies F-16's, team 2 flies MIG-23's. -.TP --simx -Consult the SIM/x server to obtain appropriate DIS simulation and -application identifiers. (This will cause a crash if there is no -SIM/x server.) - - -.SH HOW TO TAKE-OFF - - -Your mouse is the control stick. The neutral position is the center of your -view display -- denoted by the dot in the center of your heads-up-display (HUD). -Moving the mouse away from you pitches the plane down, moving it back -pitches the plane up. Left and right inputs roll the aircraft in the -corresponding direction. On the ground at speeds up to 100 kts, nose -wheel steering guides the aircraft. - -To take off for the first time, select 20 degrees of flaps (press H twice), -then press the full throttle key (the 4 key on the main keyboard). Keep the -mouse in the neutral position until you are moving at about 140 kts, then pull -the mouse about two-thirds of the way down the view window. You should pitch -up and lift off the ground fairly easily. Gradually move the stick closer -to the neutral position and let your airspeed build -- don't move it back to -neutral too quickly or you will end up back on the ground again! As your -airspeed passes about 250 kts, raise the flaps (press Y twice) and landing -gear (press G). Congratulations, you're flying a multi-million dollar jet. - - -.SH ENGINE CONTROLS - - -The following keys control your engine thrust: - -.LP - 4 Full Power -.LP - 3 Increase Power (about 2 percent) -.LP - 2 Decrease Power (about the same amount) -.LP - 1 Idle Power -.LP - A Toggle Afterburner - -Your engine gauge displays the power that you are generating. Below that, -you have displays showing your total fuel remaining as well as your current -fuel consumption rate. The afterburner uses fuel at an amazing rate; use it -wisely. - - -.SH LOOKING AROUND - - -The keys of the numeric keypad control which direction you're looking outside -of the cockpit: - -.LP - 8 Forward -.LP - 4 Left 5 Up 6 Right -.LP - 2 Aft - -It pays to look around when you're in a combat environment. Your chances -of staying alive increase remarkably. - - -.SH THE HEADS UP DISPLAY (HUD) - - -On the left side of the HUD is a ladder showing your current airspeed in -nautical miles per hour (it displays true airspeed). Above that, in the -upper left corner, is a G-meter. - -The right ladder shows altitude; above that -is a readout of your current angle-of-attack in degrees ("a=X.X"). -Your -jet will stall at a 30 degrees positive angle of attack and negative 16 -degrees. - -The airplane symbol (something like "-O-") shows the direction -that the relative wind is coming from. The relative wind combines your -current angles of attack and sideslip. A ladder in the center of the -HUD show your aircraft's current attitude. - -The lower, horizontal ladder shows your current heading. Discretes in the -lower left-hand corner show the state of your weapons systems. Slightly -above them is a readout of your current thrust percentage as well as the -state of your engine's afterburner -- the "AB" symbol means the -afterburner is on. - - -.SH USING YOUR RADAR DISPLAY - - -The radar system has a field of view of 130 degrees vertically and side-to-side. -Radar automatically locks onto the closest threat in its field of view. A -locked target is displayed as a solid block. Other hostile targets are -displayed as hollow squares. - -Targeting information is displayed in the lower right corner of the display. -The top number is the heading of the locked target, the next number is the -relative heading you should steer to intercept the target (displayed as -"ddd R", and the third number is the rate that you are closing with this -target, expressed in knots. - -You can lock onto other targets by pressing the target designator key (Q). - - -.SH WHO'S GUNNING FOR ME? - - -Radar sets that are tracking your aircraft can be detected. Your Threat -Early Warning System (TEWS) display warns you of potential threats. This -circular display shows the relative direction of radars (other aircraft) -that are looking at you. - -.SH ARMAMENTS - - -Your aircraft is equipped with heat-seeking missiles and a 20 millimeter -cannon. Weapon information is displayed in the lower left-hand corner of -your HUD. Different weapons may be selected by pressing mouse button 3. - -The missiles are patterned after U.S. AIM-9M Sidewinders. They can -detect infrared (IR) targets at any aspect (not just from the rear). Their -range varies dramatically with the altitude and closure rate. The -missile subsystem couples with your radar set to provide time-to-impact -information when AIM-9's are selected. - - -.SH EXAMPLES - - acm -js /dev/tty0 -simx - - acm -geometry 1000x500 - -.SH KEYBOARD COMMAND LIST - -Stick and Rudder Controls - -.LP -The Mouse is your stick. It controls pitch and roll. -.LP -Z -- Rudder Left -.LP -C -- Rudder Right -.LP -X -- Center the Rudder - - - -Engine Controls - -.LP -4 -- Full Power -.LP -3 -- Increase Power -.LP -2 -- Decrease Power -.LP -1 -- Idle -.LP -A -- Toggle Afterburner State - - - -Radar Controls - -.LP -R -- Toggle Radar State (On/Standby) -.LP -Q -- Target Designator - - - -Flaps - -.LP -H -- Extend 10 degrees -.LP -Y -- Retract 10 degrees - - - -Speed Brakes - -.LP -S -- Extend -.LP -W -- Retract - - -Weapon Controls - -.LP -Mouse Button 2 -- Fire the selected weapon -.LP -Mouse Button 3 -- Select another weapon - - -Pitch Trim Controls - -.LP -U -- Set Take-off pitch trim -.LP -J -- Set pitch trim to the control stick's current pitch setting - - -Other Controls - -.LP -G -- Retract/Extend landing gear -.LP -P -- Self-Destruct (Quit the game) -.LP -L -- Launch a target drone - - - -View Controls (Numeric Keypad) - -.LP -8 -- Forward -.LP -2 -- Aft -.LP -4 -- Left -.LP -6 -- Right -.LP -5 -- Up - - -.SH AUTHOR -Riley Rainey, rainey@netcom.com diff -Nru acm-5.0/src/acmmotif.c acm-6.0+20200416/src/acmmotif.c --- acm-5.0/src/acmmotif.c 1994-06-24 16:19:14.000000000 +0000 +++ acm-6.0+20200416/src/acmmotif.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,1048 +0,0 @@ -/* - * acm : an aerial combat simulator for X - * Copyright (C) 1991-1994 Riley Rainey - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 dated June, 1991. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. - */ -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define ALLOCATE_SPACE -#include - -XtInputId input_id; -int ts; -SVCXPRT *xprt; - -void fatal_error(); -void set_window_title(); - -void save_widget_id(); -void manage_by_id(); -void unmanage_by_id(); -void exit_game(); -void PostMessage(); -void new_game(), game_selected(), aircraft_selected(); -void record_game_selection(); -void CvtStringToStringList(); - -#define MAX_TITLE_LEN 128 -char wintitle[MAX_TITLE_LEN]; -Widget toplevel; - -static XmString gameName[MAXGAMES]; -int selectedGame = -1; - -static XmString ateam[MAXPLAYERS+1], bteam[MAXPLAYERS+1]; -static int acount, bcount; -static XmString aircraftStrings[MAXAIRCRAFT]; -static int aircraftCount; - - -static XmString cerrorMessage = NULL; -static XmString lastMessage = NULL; - -extern CLIENT *clnt; - -extern int InitACMClient(), SendGameQuery(); -extern void ProcGSInput(), InvalidateGameEntries(); -extern int EnterGame(); -extern void ResizeRenderArea(); -extern void ExposeRenderArea(); -extern void UpdateClientDatabase(); -extern void ImportPlayerUpdate PARAMS((acm_player_update *, craft *c)); - -static char * game_over = -"Well, the server didn't say how it happened,\n\ -but you are dead. You can re-enter the game from \n\ -the \"File\" menu."; - -/* - * fallback resources - */ - -static String fallback[] = { - "*radarForeground: #59fe00", - "*radarBackground: #094200", - "*skyColor: #93bde4", - "*Background: GhostWhite", - "*fontList: *helvetica-medium-r-normal--14*", - "*menu_bar*Foreground: GhostWhite", - "*menu_bar*Background: #454fc6", - "*play.labelString: Play a Game...", - "*quit.labelString: Quit", - "*quit.acceleratorText: Alt+Q", - "*quit.accelerator: Metaq:", - "*error_dialog.dialogTitle: Error Message", - "*error_dialog.okLabelString: Continue", - "*message_dialog.dialogTitle: Message", - "*message_dialog.okLabelString: Continue", - "*XmPushButton.shadowThickness: 3", - "*XmForm.verticalSpacing: 10", - "*XmForm.horizontalSpacing: 10", - "*render_form.verticalSpacing: 0", - "*render_form.horizontalSpacing:0", - "*render_form.width: 1200", - "*render_form.height: 750", - "*render_area.background: black", - "*blue_team_list.visibleItemCount: 5", - "*red_team_list.visibleItemCount: 5", - "*aircraft_list.visibleItemCount: 4", - "*team_display.allowOverlap: false", - "*game_selection.dialogTitle: Select a Game", - "*game_selection.labelString: Select a Game:", - "*game_selection.applyLabelString: Start a New Game", - "*aircraft_dialog.dialogTitle: Choose Your Aircraft", - "*red_label.labelString: Red Team:", - "*blue_label.labelString: Blue Team:", - "*prompt.labelString: Select the aircraft you wish to fly:", - NULL - }; - -static XrmOptionDescRec options[] = { - {"-skycolor", "*skyColor", XrmoptionSepArg, NULL }, - {"-callsign", "*callsign", XrmoptionSepArg, NULL }, - {"-servers", "*servers", XrmoptionSepArg, NULL }, - {"-s", "*servers", XrmoptionSepArg, NULL }, - }; - -#define XtNskyColor "skyColor" -#define XtCSkyColor "SkyColor" -#define XtNcallsign "callsign" -#define XtCCallsign "Callsign" -#define XtNservers "servers" -#define XtCServers "Servers" - -static XtResource resources[] = { - { - XtNskyColor, - XtCSkyColor, - XmRString, - sizeof(String), - XtOffset(AppDataPtr, skycolor), - XmRString, - (caddr_t) "" - }, - { - XtNcallsign, - XtCCallsign, - XmRString, - sizeof(String), - XtOffset(AppDataPtr, callsign), - XmRImmediate, - (caddr_t) NULL - }, - { - XtNservers, - XtCServers, - "StringList", - sizeof(String *), - XtOffset(AppDataPtr, servers), - XmRString, - (caddr_t) "" - }, - { - "radarForeground", - "RadarForeground", - XmRString, - sizeof(String), - XtOffset(AppDataPtr, radar_foreground), - XmRString, - (caddr_t) "" - }, - { - "radarBackground", - "RadarBackground", - XmRString, - sizeof(String), - XtOffset(AppDataPtr, radar_background), - XmRString, - (caddr_t) "" - }, - { - "appFont", - "AppFont", - XmRFontStruct, - sizeof(XFontStruct *), - XtOffset(AppDataPtr, font), - XmRString, - (caddr_t) "*-clean-medium-r-*-*-12-*" - } - }; - -#define MAX_ARGS 16 -#define APP_CLASS "Acm" - -Widget CreateHelp(); -XtWorkProcId work_id; -Boolean PerformUpdate(); - -/* - * Action declarations - */ - -extern void SetThrottle(), Afterburner(); -extern void ToggleGear(), ToggleBrakes(), SetRudder(), SetView(); -extern void Trigger(), SelectWeapon(), LaunchDrone(); - -static XtActionsRec actions[] = { - {"set-throttle", SetThrottle}, - {"afterburner", Afterburner}, - {"toggle-gear", ToggleGear}, - {"toggle-brakes", ToggleBrakes}, - {"set-rudder", SetRudder}, - {"look", SetView}, - {"trigger", Trigger}, - {"select-weapon", SelectWeapon}, - {"launch-drone", LaunchDrone}, - }; - -static char trans[] = - "1: set-throttle(0) afterburner(0) \n\ - 2: set-throttle(-512) \n\ - 3: set-throttle(+512) \n\ - 4: set-throttle(32768) \n\ - 6: set-throttle(32768) afterburner(1) \n\ - a: afterburner() \n\ - b: toggle-brakes() \n\ - : trigger(press) \n\ - : trigger(release) \n\ - : select-weapon() \n\ - g: toggle-gear() \n\ - z: set-rudder(+1024) \n\ - x: set-rudder(0) \n\ - c: set-rudder(-1024) \n\ - l: launch-drone() \n\ - osfPageUp: look(up) \n\ - osfUp: look(forward) \n\ - osfDown: look(aft) \n\ - osfLeft: look(left) \n\ - osfRight: look(right) \n\ - KP_8: look(forward) \n\ - KP_5: look(up) \n\ - KP_2: look(aft) \n\ - KP_6: look(right) \n\ - KP_4: look(left)"; - -XtAppContext context; - -extern struct passwd *getpwent(); - -void -main (argc, argv) -int argc; -char **argv; -{ - - Widget main_window; - Widget menu_bar; - Widget menu_pane; - Widget button; - Widget cascade; - Widget frame; - Widget form; - Widget aform; - Widget help_dialog; - Widget w; - Arg args[MAX_ARGS]; - int n; - char *charptr; - XtTranslations translations; - struct passwd *pw; - - player_id = -1; - - if ((pw = getpwuid(geteuid())) == (struct passwd *) NULL) { - fprintf (stderr, "Yow. I can't get your username\n"); - strcpy (handle, "* unknown *"); - } - else { - strncpy (handle, pw->pw_name, sizeof(handle)); - } - - toplevel = XtAppInitialize (&context, APP_CLASS, options, - XtNumber(options), &argc, argv, fallback, NULL, 0); - - XtAppAddConverter (context, - XmRString, - "StringList", - CvtStringToStringList, - (XtConvertArgList) NULL, (Cardinal) 0); - - XtGetApplicationResources (toplevel, &app_data, resources, - XtNumber(resources), NULL, 0); - - work_id = XtAppAddWorkProc (context, PerformUpdate, (XtPointer) NULL); - - skycolor = app_data.skycolor; - - XtAppAddActions (context, actions, XtNumber(actions)); - - n = 0; - main_window = XmCreateMainWindow (toplevel, "main", args, n); - XtManageChild (main_window); - - n = 0; - menu_bar = XmCreateMenuBar (main_window, "menu_bar", args, n); - XtManageChild (menu_bar); - -/* - * The File menu - */ - - n = 0; - menu_pane = XmCreatePulldownMenu (menu_bar, "file_pulldown", args, n); - - n = 0; - button = XmCreatePushButton (menu_pane, "play", args, n); - XtManageChild (button); - XtAddCallback (button, XmNactivateCallback, manage_by_id, - game_selection_id); - - n = 0; - button = XmCreatePushButton (menu_pane, "quit", args, n); - XtManageChild (button); - XtAddCallback (button, XmNactivateCallback, exit_game, NULL); - - n = 0; - XtSetArg (args[n], XmNsubMenuId, menu_pane); n++; - cascade = XmCreateCascadeButton (menu_bar, "File", args, n); - XtManageChild (cascade); - -/* - * The help button - */ - - widgets[help_id] = CreateHelp(toplevel); - - n = 0; - cascade = XmCreateCascadeButton (menu_bar, "Help", args, n); - XtManageChild (cascade); - XtAddCallback (cascade, XmNactivateCallback, manage_by_id, - (XtPointer) help_id); - - n = 0; - XtSetArg (args[n], XmNmenuHelpWidget, cascade); n++; - XtSetValues (menu_bar, args, n); - -/* - * The frame and rendering area - */ - - n = 0; - XtSetArg (args[n], XmNmarginWidth, 2); n++; - XtSetArg (args[n], XmNmarginHeight, 2); n++; - XtSetArg (args[n], XmNshadowThickness, 1); n++; - XtSetArg (args[n], XmNshadowType, XmSHADOW_OUT); n++; - frame = XmCreateFrame (main_window, "render_frame", args, n); - XtManageChild (frame); - - n = 0; - form = XmCreateForm (frame, "render_form", args, n); - XtManageChild (form); - - n = 0; - XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++; - XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++; - XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++; - XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++; - widgets[render_id] = XmCreateDrawingArea (form, "render_area", args, n); - XtManageChild (widgets[render_id]); - - XtAddCallback (widgets[render_id], XmNresizeCallback, - ResizeRenderArea, (XtPointer) NULL); - XtAddCallback (widgets[render_id], XmNexposeCallback, - ExposeRenderArea, (XtPointer) NULL); - - translations = XtParseTranslationTable (trans); - XtOverrideTranslations (widgets[render_id], translations); - -/* - * Create a selection box dialog for choosing a game - */ - - n = 0; - widgets[game_selection_id] = XmCreateSelectionDialog (toplevel, - "game_selection", args, n); - XtAddCallback (widgets[game_selection_id], XmNokCallback, - game_selected, (XtPointer) NULL); - XtAddCallback (widgets[game_selection_id], XmNcancelCallback, - unmanage_by_id, (XtPointer) game_selection_id); - XtAddCallback (widgets[game_selection_id], XmNapplyCallback, - new_game, (XtPointer) NULL); - - w = XmSelectionBoxGetChild (widgets[game_selection_id], XmDIALOG_TEXT); - XtUnmanageChild (w); - w = XmSelectionBoxGetChild (widgets[game_selection_id], - XmDIALOG_SELECTION_LABEL); - XtUnmanageChild (w); - - widgets[game_list_id] = - XmSelectionBoxGetChild(widgets[game_selection_id], XmDIALOG_LIST); - - n = 0; - XtSetArg (args[n], XmNselectionPolicy, XmSINGLE_SELECT); n ++; - XtSetValues (widgets[game_list_id], args, n); - - XtAddCallback (widgets[game_list_id], XmNsingleSelectionCallback, - record_game_selection, NULL); - -/* - * Create a general error message dialog - */ - - n = 0; - widgets[error_id] = XmCreateErrorDialog (toplevel, "error_dialog", - args, n); - XtAddCallback (widgets[error_id], XmNokCallback, - unmanage_by_id, (XtPointer) error_id); - - w = XmMessageBoxGetChild(widgets[error_id], XmDIALOG_CANCEL_BUTTON); - XtUnmanageChild (w); - - w = XmMessageBoxGetChild(widgets[error_id], XmDIALOG_HELP_BUTTON); - XtUnmanageChild (w); - -/* - * Create a general message dialog - */ - - n = 0; - widgets[message_id] = XmCreateMessageDialog (toplevel, "message_dialog", - args, n); - XtAddCallback (widgets[message_id], XmNokCallback, - unmanage_by_id, (XtPointer) message_id); - - w = XmMessageBoxGetChild(widgets[message_id], XmDIALOG_CANCEL_BUTTON); - XtUnmanageChild (w); - - w = XmMessageBoxGetChild(widgets[message_id], XmDIALOG_HELP_BUTTON); - XtUnmanageChild (w); - -/* - * Create the aircraft selection dialog - */ - - n = 0; - widgets[aircraft_dialog_id] = - XmCreateFormDialog (toplevel, "aircraft_dialog", args, n); - - n = 0; - XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n ++; - XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n ++; - XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n ++; - aform = XmCreateForm (widgets[aircraft_dialog_id], "team_display", - args, n); - XtManageChild (aform); - - n = 0; - XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n ++; - XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n ++; - w = XmCreateLabel (aform, "blue_label", args, n); - XtManageChild (w); - - n = 0; - XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n ++; - XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n ++; - XtSetArg (args[n], XmNtopWidget, w); n ++; - widgets[blue_team_id] = - XmCreateScrolledList(aform, "blue_team_list", args, n); - XtManageChild (widgets[blue_team_id]); - - n = 0; - XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n ++; - XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n ++; - w = XmCreateLabel (aform, "red_label", args, n); - XtManageChild (w); - - n = 0; - XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n ++; - XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n ++; - XtSetArg (args[n], XmNtopWidget, w); n ++; - widgets[red_team_id] = - XmCreateScrolledList(aform, "red_team_list", args, n); - XtManageChild (widgets[red_team_id]); - - n = 0; - XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n ++; - XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n ++; - XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n ++; - XtSetArg (args[n], XmNtopWidget, aform); n ++; - XtSetArg (args[n], XmNtopOffset, 25); n ++; - w = XmCreateSeparator (widgets[aircraft_dialog_id], "separator", - args, n); - XtManageChild (w); - - n = 0; - XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n ++; - XtSetArg (args[n], XmNtopWidget, w); n ++; - XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n ++; - w = XmCreateLabel (widgets[aircraft_dialog_id], "prompt", args, n); - XtManageChild (w); - - n = 0; - XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n ++; - XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n ++; - XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n ++; - XtSetArg (args[n], XmNtopWidget, w); n ++; - widgets[aircraft_list_id] = - XmCreateScrolledList(widgets[aircraft_dialog_id], - "aircraft_list", args, n); - XtManageChild (widgets[aircraft_list_id]); - - n = 0; - XtSetArg (args[n], XmNlabelString, - XmStringCreateSimple (" OK ")); n ++; - XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n ++; - XtSetArg (args[n], XmNtopWidget, widgets[aircraft_list_id]); n ++; - XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n ++; - XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n ++; - w = XmCreatePushButton(widgets[aircraft_dialog_id], - "okay_button", args, n); - XtAddCallback (w, XmNactivateCallback, aircraft_selected, - (XtPointer) NULL); - XtManageChild (w); - - XtRealizeWidget (toplevel); - -/* - * Add the game socket to the list of fd's that Xt will manage. - */ - - InitACMClient (); - InitRendering(); - - InvalidateGameEntries(); - -/* - * Now shout out a request for game information ... - */ - - SendGameQuery (); - - XtAppMainLoop (context); - -} - -/* ARGSUSED */ -void -manage_by_id (w, client_data, call_data) -Widget w; -caddr_t client_data; -caddr_t call_data; -{ - int i; - - i = (int) client_data; - - XtManageChild (widgets[i]); -} - -/* ARGSUSED */ -void -unmanage_by_id (w, client_data, call_data) -Widget w; -caddr_t client_data; -caddr_t call_data; -{ - int i; - - i = (int) client_data; - - XtUnmanageChild (widgets[i]); -} - -/* ARGSUSED */ -void -exit_game (w, client_data, call_data) -Widget w; -caddr_t client_data; -caddr_t call_data; -{ - printf ("%d of %d updates were processed into frames.\n", - updates_processed, update_count); - exit (0); -} - -/* ARGSUSED */ -void -game_selected (w, client_data, call_data) -Widget w; -caddr_t client_data; -caddr_t call_data; -{ - XtManageChild (widgets[aircraft_dialog_id]); -} - -/* ARGSUSED */ -void -aircraft_selected (w, client_data, call_data) -Widget w; -caddr_t client_data; -caddr_t call_data; -{ - int i, *list, count, aircraft_id = 0; - - XmListGetSelectedPos (widgets[aircraft_list_id], &list, &count); - if (count == 1) { - aircraft_id = list[0] - 1; - } - XtFree ((char *) list); - if (selectedGame != -1) { - if (EnterGame (selectedGame, aircraft_id) == -1) { - PostMessage ("I was unable to enter the game."); - } - } - -} - -/* ARGSUSED */ -void -new_game (w, client_data, call_data) -Widget w; -caddr_t client_data; -caddr_t call_data; -{ - -} - -/* ARGSUSED */ -void -record_game_selection (w, client_data, call_data) -Widget w; -caddr_t client_data; -caddr_t call_data; -{ - - XmListCallbackStruct *p; - GameInfo *g; - register int i, n; - Arg args[4]; - acm_player_info *q; - char s[256]; - Dimension red_width, blue_width; - -/* - * This procedure can be called one of two ways: first, as a selection - * callback for the games list, or, second, when it's been detected that - * information about the currently selected game has changed. In the first - * case, call_data will be non-NULL and the index of the selected item - * becomes the index of our selected game. - */ - - if (call_data != (caddr_t) NULL) { - p = (XmListCallbackStruct *) call_data; - selectedGame = p->item_position - 1; - } - - g = &games[selectedGame]; - -/* - * Free old strings - */ - - for (i=0; iinfo.pinfo.pinfo_val; - for (i=0; i < g->info.pinfo.pinfo_len; ++i, ++q) { - sprintf (s, "%s (%s) on %s ", q->name, - q->aircraft, q->display); - if (q->flags & AFLAG_TEAM1) { - ateam[acount++] = XmStringCreateSimple (s); - } - else { - bteam[bcount++] = XmStringCreateSimple (s); - } - } - -/* - * The following forces an empty player list to be at least this wide - */ - -#ifdef notdef - ateam[acount++] = - XmStringCreateSimple(" "); - bteam[bcount++] = - XmStringCreateSimple(" "); -#endif - -/* - * Update the player lists - */ - - n = 0; - XtSetArg (args[n], XmNitems, ateam); n ++; - XtSetArg (args[n], XmNitemCount, acount); n ++; - XtSetValues (widgets[blue_team_id], args, n); - - n = 0; - XtSetArg (args[n], XmNitems, bteam); n ++; - XtSetArg (args[n], XmNitemCount, bcount); n ++; - XtSetValues (widgets[red_team_id], args, n); - -/* - * Insure that the red and blue team lists have equal widths. - */ - - XtVaGetValues (widgets[red_team_id], - XmNwidth, &red_width, - NULL); - XtVaGetValues (widgets[blue_team_id], - XmNwidth, &blue_width, - NULL); - -/* - * A special case, if both player lists are empty make them at least 150 - * pixel wide - */ - - if (acount == 0 && bcount == 0) { - blue_width = 150; - XtVaSetValues (widgets[blue_team_id], - XmNwidth, blue_width, - NULL); - } - - if (blue_width != red_width) { - if (blue_width > red_width) { - XtVaSetValues (widgets[red_team_id], - XmNwidth, blue_width, - NULL); - } - else { - XtVaSetValues (widgets[blue_team_id], - XmNwidth, red_width, - NULL); - } - } - -/* - * Build the aircraft list - */ - - for (i=0; iinfo.ainfo.ainfo_len) > MAXAIRCRAFT) { - aircraftCount = MAXAIRCRAFT; - } - - for (i=0; iinfo.ainfo.ainfo_val[i].desc); - aircraftStrings[i] = XmStringCreateSimple (s); - } - - n = 0; - XtSetArg (args[n], XmNitems, aircraftStrings); n ++; - XtSetArg (args[n], XmNitemCount, aircraftCount); n ++; - XtSetValues (widgets[aircraft_list_id], args, n); - -} - -void set_window_title (s) -char *s; -{ - char newtitle[MAX_TITLE_LEN]; - - strcpy (newtitle, wintitle); - strcat (newtitle, " - "); - strcat (newtitle, s); - XStoreName (XtDisplay(toplevel), XtWindow(toplevel), newtitle); -} - -void fatal_error (s) -char *s; -{ - fprintf (stderr, "%s\n", s); - exit (1); -} - -Widget -CreateHelp (parent) -Widget parent; -{ - Widget button; - Widget message_box; - Arg args[MAX_ARGS]; - register int n; - - static char message[BUFSIZ]; - XmString title_string = NULL; - XmString message_string = NULL; - XmString button_string = NULL; - - sprintf (message, "\ -Welcome to ACM\n\ -The Aerial Combat Simulation for X11\n\ -\n\ -This program starts by searching the network for acm games\n\ -that are already running. A selection box will display\n\ -information about the games that it finds. You can enter\n\ -one of those games by clicking on the game of your choice\n\ -and pressing \"OK\".\n\ -\0"); - - message_string = XmStringCreateLtoR (message, XmSTRING_DEFAULT_CHARSET); - button_string = XmStringCreateSimple ("Continue"); - title_string = XmStringCreateSimple ("acm help"); - - n = 0; - XtSetArg (args[n], XmNdialogTitle, title_string); n++; - XtSetArg (args[n], XmNokLabelString, button_string); n++; - XtSetArg (args[n], XmNmessageString, message_string); n++; - message_box = XmCreateMessageDialog (parent, "help_dialog", args, n); - - button = XmMessageBoxGetChild (message_box, XmDIALOG_CANCEL_BUTTON); - XtUnmanageChild (button); - button = XmMessageBoxGetChild (message_box, XmDIALOG_HELP_BUTTON); - XtUnmanageChild (button); - - if (title_string) - XtFree (title_string); - if (message_string) - XtFree (message_string); - if (button_string) - XtFree (button_string); - - return (message_box); -} - -void -InstallNewGameInformation (gp) -GameInfo *gp; -{ - Arg args[MAX_ARGS]; - GameInfo *p; - register int i, cnt = 0, n; - char s[256]; - -/* - * Build a table of Motif strings to be used as the game selection list - */ - - for (i = 0, p = &games[0]; iopen != -1) { - if (gameName[cnt] != NULL) - XmStringFree(gameName[i]); - - switch (p->info.pinfo.pinfo_len) { - - case 0: - sprintf (s, "%s (no players)", - p->info.game_name); - break; - case 1: - sprintf (s, "%s (1 player)", - p->info.game_name); - break; - default: - sprintf (s, "%s (%d players)", - p->info.game_name, - p->info.pinfo.pinfo_len); - } - - gameName[cnt] = XmStringCreateSimple (s); - ++ cnt; - -/* - * If we're updating information about the currently selected game, - * install updated player and aircraft lists. - */ - - if (i == selectedGame) { - record_game_selection (widgets[game_list_id], - (caddr_t) NULL, (caddr_t) NULL); - } - } - } - -/* - * Install the new game list - */ - - n = 0; - XtSetArg (args[n], XmNlistItems, (XmStringTable) gameName); n ++; - XtSetArg (args[n], XmNlistItemCount, cnt); n ++; - XtSetValues (widgets[game_selection_id], args, n); - -} - -void -cerror (s) -char *s; -{ - Arg args[4]; - int n; - - if (cerrorMessage != NULL) - XmStringFree (cerrorMessage); - - cerrorMessage = XmStringCreateLtoR (s, XmSTRING_DEFAULT_CHARSET); - - n = 0; - XtSetArg (args[n], XmNmessageString, cerrorMessage); n ++; - XtSetValues (widgets[error_id], args, n); - - XtManageChild (widgets[error_id]); - -} - -void -PostMessage (s) -char *s; -{ - Arg args[4]; - int n; - - if (lastMessage != NULL) - XmStringFree (lastMessage); - - lastMessage = XmStringCreateLtoR (s, XmSTRING_DEFAULT_CHARSET); - - n = 0; - XtSetArg (args[n], XmNmessageString, lastMessage); n ++; - XtSetValues (widgets[message_id], args, n); - - XtManageChild (widgets[message_id]); - -} - -Boolean -PerformUpdate (client_data) -XtPointer client_data; -{ - acm_player_input info; - acm_player_update *update; - craft *c; - int i; - - if (player_id == -1) { - return False; - } - - GetStick(); - - info.session = session; - c = &ptbl[player_id]; - info.Se = c->Se + c->SeTrim; - info.Sr = c->Sr; - info.Sa = c->Sa; - info.throttle = c->throttle; - info.flags = c->flags & FL_INPUT_MASK; - -/* - * Pack up any commands received from the user ... - */ - - info.command.command_len = c->num_commands; - if (info.command.command_len > 0) { - info.command.command_val = (acm_command *) - malloc (info.command.command_len * sizeof(acm_command)); - for (i=0; inum_commands; ++i) { - info.command.command_val[i] = *(c->commands[i]); - } - } - - for (i=0; inum_commands; ++i) { - free ((char *) c->commands[i]); - } - if (c->num_commands > 0) { - free ((char *) c->commands); - } - c->num_commands = 0; - - if ((update = acmsetplayerinput_1 (&info, clnt)) != NULL) { - - for (i=0, c=ptbl; iprevSg = c->Sg; - c->type = CT_FREE; - } - - for (i=0, c=mtbl; iprevSg = c->Sg; - c->type = CT_FREE; - } - - c = &ptbl[player_id]; - - ImportPlayerUpdate (update, c); -#ifdef notdef - printf ("objects %d\n", update->object.object_len); - printf ("object 1 type %d id %d\n", - update->object.object_val[0].type, - update->object.object_val[0].id); -#endif - xdr_free (xdr_acm_player_update, update); - - if (c->type == CT_FREE && player_id != -1) { - ExitGame (game_over); - } - - if (player_id == -1) { - return False; - } - - UpdateClientDatabase(); - - Render (); - - ++ update_count; - - } - else { - ExitGame ("The game server seems to have died."); - } - ++ updates_processed; - return False; -} - diff -Nru acm-5.0/src/actions.c acm-6.0+20200416/src/actions.c --- acm-5.0/src/actions.c 1994-06-24 16:29:42.000000000 +0000 +++ acm-6.0+20200416/src/actions.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,305 +0,0 @@ -/* - * acm : an aerial combat simulator for X - * Copyright (C) 1991-1994 Riley Rainey - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 dated June, 1991. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. - */ -#include -#include - -#include -#define MIN_THROTTLE 8192 -#define MAX_THROTTLE 32768 -#define FL_TRIGGER 0 - -extern void PostTriggerDown PARAMS((void)); -extern void PostTriggerUp PARAMS((void)); -extern void PostLaunchDrone PARAMS((void)); - -/* ARGSUSED */ -void -SetThrottle (w, event, params, num_params) -Widget w; -XEvent *event; -String *params; -Cardinal *num_params; { - - register char *p; - register long value; - - - if (*num_params == 1) { - - p = *params; - value = atol(p); - - if (player_id >= 0) { - if (*p == '+' || *p == '-') - ptbl[player_id].throttle += value; - else - ptbl[player_id].throttle = value; - - if (ptbl[player_id].throttle < MIN_THROTTLE) - ptbl[player_id].throttle = MIN_THROTTLE; - - if (ptbl[player_id].throttle > MAX_THROTTLE) - ptbl[player_id].throttle = MAX_THROTTLE; - } - } - else - fprintf (stderr,"bad number of parameters on set-throttle()\n"); - -} - -/* ARGSUSED */ -void -SetRudder (w, event, params, num_params) -Widget w; -XEvent *event; -String *params; -Cardinal *num_params; { - - register char *p; - register long value, current; - - - if (*num_params == 1) { - - p = *params; - value = atol(p); - - if (player_id >= 0) { - - current = ptbl[player_id].Sr * 32768.0; - - if (*p == '+' || *p == '-') - current += value; - else - current = value; - - if (ptbl[player_id].throttle < -32768) - ptbl[player_id].throttle = -32768; - - if (ptbl[player_id].throttle > 32768) - ptbl[player_id].throttle = 32768; - - ptbl[player_id].Sr = (double) current / 32768.0; - - } - } - else - fprintf (stderr,"bad number of parameters on set-rudder()\n"); - -} - -/* ARGSUSED */ -void -Afterburner (w, event, params, num_params) -Widget w; -XEvent *event; -String *params; -Cardinal *num_params; { - - char *p; - - if (*num_params == 0) { - - if (player_id >= 0) { - - ptbl[player_id].flags ^= FL_AFTERBURNER; - - } - } - else if (*num_params == 1) { - p = *params; - if (player_id >= 0) { - - if (strcmp (p, "1") == 0) - ptbl[player_id].flags |= FL_AFTERBURNER; - else if (strcmp (p, "0") == 0) - ptbl[player_id].flags &= ~FL_AFTERBURNER; - else - fprintf (stderr, - "bad afterburner parameter: %s\n", p); - } - } - else { - fprintf (stderr,"bad number of parameters on afterburner()\n"); - } - -} - -/* ARGSUSED */ -void -ToggleGear (w, event, params, num_params) -Widget w; -XEvent *event; -String *params; -Cardinal *num_params; { - - if (*num_params == 0) { - - if (player_id >= 0) { - - ptbl[player_id].flags ^= FL_GHANDLE_DN; - - } - } - else - fprintf (stderr,"bad number of parameters on toggle-gear()\n"); - -} - -/* ARGSUSED */ -void -ToggleBrakes (w, event, params, num_params) -Widget w; -XEvent *event; -String *params; -Cardinal *num_params; { - - if (*num_params == 0) { - - if (player_id >= 0) { - - ptbl[player_id].flags ^= FL_BRAKES; - - } - } - else - fprintf(stderr,"bad number of parameters on toggle-brakes()\n"); - -} - -static VPoint up = {0.0, 0.0, -1.0}; -static VPoint back = {-1.0, 0.0, 0.0}; -static VPoint zero = { 0.0, 0.0, 0.0}; - -/* ARGSUSED */ -void -SetView (w, event, params, num_params) -Widget w; -XEvent *event; -String *params; -Cardinal *num_params; { - - - craft *c; - char *s; - - s = *params; - - if (*num_params == 1) { - - if (player_id >= 0) { - - c = &ptbl[player_id]; - c->viewDirection = zero; - c->viewUp = up; - - if (strcmp (s, "forward") == 0) - c->viewDirection.x = 1.0; - if (strcmp (s, "aft") == 0) - c->viewDirection.x = -1.0; - else if (strcmp (s, "right") == 0) - c->viewDirection.y = 1.0; - else if (strcmp (s, "left") == 0) - c->viewDirection.y = -1.0; - else if (strcmp (s, "up") == 0) { - c->viewDirection = up; - c->viewUp = back; - } - - } - } - else - fprintf (stderr,"bad number of parameters on look()\n"); - -} - -/* ARGSUSED */ -void -Trigger (w, event, params, num_params) -Widget w; -XEvent *event; -String *params; -Cardinal *num_params; { - - register unsigned char *p; - - p = *params; - - if (*num_params == 1) { - - if (player_id >= 0) { - - if (strcmp (p, "press") == 0) - PostTriggerDown(); - else if (strcmp (p, "release") == 0) - PostTriggerUp(); - else - fprintf (stderr, - "bad trigger parameter: %s\n", p); - - } - } - else - fprintf (stderr,"bad number of parameters on trigger()\n"); - -} - -/* ARGSUSED */ -void -SelectWeapon (w, event, params, num_params) -Widget w; -XEvent *event; -String *params; -Cardinal *num_params; { - - if (*num_params == 0) { - if (player_id >= 0) { - selectWeapon (&ptbl[player_id]); - } - } - else - fprintf (stderr,"bad number of parameters on select-weapon()\n"); - -} - - -/* ARGSUSED */ -void -LaunchDrone (w, event, params, num_params) -Widget w; -XEvent *event; -String *params; -Cardinal *num_params; -{ - register unsigned char *p; - - p = *params; - - if (*num_params == 0) { - - if (player_id >= 0) { - - PostLaunchDrone(); - - } - } - else - fprintf (stderr,"bad number of parameters on launch-drone()\n"); - -} - diff -Nru acm-5.0/src/aim120.c acm-6.0+20200416/src/aim120.c --- acm-5.0/src/aim120.c 1998-12-09 21:55:10.000000000 +0000 +++ acm-6.0+20200416/src/aim120.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,429 +0,0 @@ - -/* - * acm : an aerial combat simulator for X - * Copyright (C) 1991-1998 Riley Rainey - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 dated June, 1991. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. - */ - -#include -#include -#include - -#include "pm.h" - -int select_aim120(craft *); -int display_aim120(craft *, craftType *, viewer *, int *, int *); -int update_aim120(craft *); -int fire_aim120(craft *); -int getIRTarget(craft * c, VPoint * t, double scanSlope); -extern int fireMissile(craft * c, int ind); -extern FILE *acm_fopen(char *, char *); - -weaponDesc aim120Desc = -{ - WK_AIM120, - select_aim120, /* select */ - update_aim120, /* update */ - display_aim120, /* display procedure */ - fire_aim120, /* fire */ - (int (*)(craft *)) NULL, /* fire button release */ -}; - -int hasFired[MAXPLAYERS]; -static int count[MAXPLAYERS]; - -/* - * aim120 selection function - * - * A selection function normally determines whether there are any weapons - * of this type on-board. If so, and the weapon system is functional - * (in other words, undamaged) then return 1; otherwise return 0. - */ - -/*ARGSUSED */ -int -select_aim120(craft * c) -{ - - hasFired[c->pIndex] = 0; - count[c->pIndex] = countOrdinance(c, "aim120"); - return 1; - -} - -static double -Rmax(craft *c) -{ - return 40.0 * NM; -} - -void -computeASECircleParameters(craft *c, - double * ASE_diameter_millirad, - double * ASE_dot_az_millirad, - double * ASE_dot_el_millirad) -{ - double range_feet, rmax_feet = Rmax(c), hs, omegay, omegap, h; - VPoint v, t, vrel; - craft *target; - radarInfo *pr = NULL, *p; - int i; - - /* - * find target information entry in the radar info table - */ - - for (i = 0, p = c->rinfo; i < c->rtop; ++i, ++p) { - if (c->curRadarTarget == p->targetID ) { - pr = p; - break; - } - } - - /* - * Without a radar lock, display only the ASE circle. - * - * We represent this case by passing the ASE diameter as a negative value. - */ - - if ( c->curRadarTarget == -1 || pr == NULL) { - *ASE_diameter_millirad = -130.0; - *ASE_dot_az_millirad = 0.0; - *ASE_dot_az_millirad = 0.0; - return; - } - - target = &ptbl[c->curRadarTarget]; - - /* - * Range greater than Rmax? Place aircraft and target on - * a lead collision course. - */ - - v.x = target->Cg.x - c->Cg.x; - v.y = target->Cg.y - c->Cg.y; - v.z = target->Cg.z - c->Cg.z; - - /* - * t becomes relative position of target wrt to aircraft body axes (feet) - */ - - t = pr->rel; - - VReverseTransform_( &v, &c->trihedral, &vrel ); - - /* - * If range is less than Rmax, compute lead collision based on aircraft - * plus missile velocity, not just our aircraft's velocity. - */ - - if (range_feet < rmax_feet) { - - vrel.x -= 1000.0; /* 1,000 fps is just a SWAG */ - - } - - hs = t.x * t.x + t.y * t.y; - - /* - * Omega values are rates of azimuth and elevation changes (rad/sec) - */ - - omegay = (vrel.y * t.x - vrel.x * t.y) / hs; - - omegap = (vrel.z * hs - t.z * (vrel.x * t.x + vrel.y * t.y)) / - (sqrt(hs) * (hs + t.z * t.z)); - - /* - * Just SWAGs here ... - */ - - *ASE_diameter_millirad = 130.0; - *ASE_dot_az_millirad = RADtoDEG(omegay) * 150.0; - *ASE_dot_el_millirad = RADtoDEG(omegap) * 150.0; - - h = sqrt ( - *ASE_dot_az_millirad * *ASE_dot_az_millirad + - *ASE_dot_el_millirad * *ASE_dot_el_millirad - ); - - /* - * Limit ASE "dot" to position just outside the circle - */ - - if (h > 70.0) { - *ASE_dot_az_millirad = *ASE_dot_az_millirad * 70.0 / h; - *ASE_dot_el_millirad = *ASE_dot_el_millirad * 70.0 / h; - } - -} - -/*ARGSUSED */ -int -update_aim120(craft * c) -{ - - register int i; - - /* - * Missile won't fire if we have "Weight on wheels" - */ - - if ((c->flags & FL_GND_CONTACT) == 0) { - if (hasFired[c->pIndex] && count[c->pIndex] > 0) { - i = readyStation(c, "aim120"); - if (i < 0) - fprintf(stderr, "Oops. Can't find an AIM-120\n"); - else { - - /* - * In arcade mode, we never run out of ammunition - */ - - if (arcadeMode == 0) { - c->station[i].type = ""; - count[c->pIndex]--; - } - fireMissile(c, i); - playSound(c, SoundMissileLaunch); - } - hasFired[c->pIndex] = 0; - } - } - return 1; -} - -/*ARGSUSED */ -int -fire_aim120(craft * c) -{ - - hasFired[c->pIndex] = 1; - return 1; -} - -double -missileTimeToImpact (craft * c, craftType * w) -{ - double v, t, root1, root2, r, a1, d, n; - - v = c->VT; - a1 = (w->maxThrust - 0.5 * c->rho * w->CDOrigin * v * v) - / (w->emptyWeight + w->maxFuel) * earth_g; - - if (c->curRadarTarget >= 0 && a1 >= 0.0) { - - d = c->targetDistance; - r = c->targetClosure; - - n = r * r + 2.0 * a1 * d; - if (n > 0) { - n = sqrt(n); - root1 = (-r + n) / a1; - root2 = (-r - n) / a1; - if (root1 >= 0.0) - if (root2 >= 0.0) - if (root1 < root2) - t = root1; - else - t = root2; - else - t = root1; - else if (root2 >= 0.0) - t = root2; - else - t = -1.0; - } - else - t = -1.0; - } - - else { - t = -1.0; - } - - return t; - -} - -/* - * aim120 display function - * - * Update the HUD display strings associated with this weapon system. - * - * This code may be called by drones. Return a nonzero value if - * have a reasonable chance of scoring a kill. - */ - -/*ARGSUSED */ -int -display_aim120(craft * c, craftType * w, viewer * u, int *i1, int *i2) -{ - - char s[16]; - double d, a1, v, r, root1, root2, n, t; - VPoint tmp; - int target, result = 0; - - sprintf(s, "%d AIM-120", count[c->pIndex]); - strcpy(c->leftHUD[3], s); - - v = mag(c->Cg); - a1 = (w->maxThrust - 0.5 * c->rho * w->CDOrigin * v * v) - / (w->emptyWeight + w->maxFuel) * earth_g; - - if (c->curRadarTarget >= 0 && a1 >= 0.0) { - - d = c->targetDistance; - r = c->targetClosure; - - n = r * r + 2.0 * a1 * d; - if (n > 0) { - n = sqrt(n); - root1 = (-r + n) / a1; - root2 = (-r - n) / a1; - if (root1 >= 0.0) - if (root2 >= 0.0) - if (root1 < root2) - t = root1; - else - t = root2; - else - t = root1; - else if (root2 >= 0.0) - t = root2; - else - t = -1.0; - } - else - t = -1.0; - } - - else - t = -1.0; - -/* - * See if the missiles can lock onto any target. We'll constrain getIRTarget() - * so that it will only select target's in a twenty degree boresight cone. - */ - - if (count[c->pIndex] > 0) { - target = getIRTarget(c, &tmp, 0.17633); - } - else { - target = -1; - } - - if (target >= 0 && t <= 15.0) - sprintf(s, "LOCKED %d", (int) (t + 0.5)); - else if (t < 0.0) - sprintf(s, "ARM --"); - else if (t <= 15.0) - sprintf(s, "IN RANGE %d", (int) (t + 0.5)); - else - sprintf(s, "ARM %d", (int) (t + 0.5)); - -/* - * Set result equal to one if we are recommending a missile shot - */ - - if (target >= 0 && t <= 10.0 && t > (w->armDelay + 0.5)) { - result = 1; - } - - strcpy(c->leftHUD[2], s); - - strcpy(c->leftHUD[4], ""); - - return result; -} - -extern craftType *newCraft(void); - -void -initaim120(void) -{ - - craftType *c; - FILE *f; - dis_entity_type em1 = - {2, 1, 225, 1, 2, 1, 0}; - dis_entity_type em2 = - {0, 0, 0, 0, 0, 0, 0}; - - c = newCraft(); - c->name = strdup("aim120"); - - c->entityType = em1; - c->altEntityType = em2; - - wtbl[3] = aim120Desc; - wtbl[3].w = c; - - c->CDOrigin = 0.2; /* 5" radius of body */ - c->CDFactor = -2.56694; - - c->CDBOrigin = 0.0; - c->CDBFactor = 0.0; - - VIdentMatrix(&(c->I)); - c->I.m[0][0] = 0.0; - c->I.m[1][1] = 0.0; - c->I.m[2][2] = 0.0; - c->cmSlope = -1.88; - c->cmFactor = -1.00; - - c->wingS = 1.0; - -/* - * Assume 150.0 lbs of weight is fuel and that it burns for about 4 seconds. - * That yields a fuel burn rate of 40 lbs/second. - */ - - c->emptyWeight = 100.0; - c->maxFuel = 234.0; - c->maxThrust = 2500.0; - c->spFuelConsump = 16.0; /* Isp = 220, SFC = 3600.0 / Isp */ - -/* - * half-second arming delay - */ - - c->armDelay = 0.5; - - c->groundingPoint.x = 0.0; - c->groundingPoint.y = 0.0; - c->groundingPoint.z = 0.0; - - c->viewPoint.x = 0.0; - c->viewPoint.y = 0.0; - c->viewPoint.z = 0.0; - - c->muStatic = 0.0; - c->muKinetic = 0.0; - c->muBStatic = 0.0; - c->muBKinetic = 0.0; - - c->maxNWDef = 0.0; - c->NWIncr = 0.0; - c->maxNWS = 0.0; - c->gearD1 = 0.0; - c->gearD2 = 0.0; - - f = acm_fopen("aim9.obv", "r"); - c->object = VReadObject(f); - fclose(f); - -} diff -Nru acm-5.0/src/aim9m.c acm-6.0+20200416/src/aim9m.c --- acm-5.0/src/aim9m.c 1998-08-14 14:58:31.000000000 +0000 +++ acm-6.0+20200416/src/aim9m.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,277 +0,0 @@ - -/* - * acm : an aerial combat simulator for X - * Copyright (C) 1991-1994,1997 Riley Rainey - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 dated June, 1991. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. - */ - -#include -#include "pm.h" -#include -#include - -int select_aim9m(craft *); -int display_aim9m(craft *, craftType *, viewer *, int *, int *); -int update_aim9m(craft *); -int fire_aim9m(craft *); -int getIRTarget(craft * c, VPoint * t, double scanSlope); -extern int fireMissile(craft * c, int ind); -extern FILE *acm_fopen(char *, char *); - -weaponDesc aim9mDesc = -{ - WK_AIM9M, - select_aim9m, /* select */ - update_aim9m, /* update */ - display_aim9m, /* display procedure */ - fire_aim9m, /* fire */ - (int (*)(craft *)) NULL, /* fire button release */ -}; - -int hasFired[MAXPLAYERS]; -static int count[MAXPLAYERS]; - -/* - * aim9m selection function - * - * A selection function normally determines whether there are any weapons - * of this type on-board. If so, and the weapon system is functional - * (in other words, undamaged) then return 1; otherwise return 0. - */ - -/*ARGSUSED */ -int -select_aim9m(craft * c) -{ - - hasFired[c->pIndex] = 0; - count[c->pIndex] = countOrdinance(c, "aim9m"); - return 1; - -} - -/*ARGSUSED */ -int -update_aim9m(craft * c) -{ - - register int i; - - /* - * Missile won't fire if we have "Weight on wheels" - */ - - if ((c->flags & FL_GND_CONTACT) == 0) { - if (hasFired[c->pIndex] && count[c->pIndex] > 0) { - i = readyStation(c, "aim9m"); - if (i < 0) - fprintf(stderr, "Oops. Can't find an AIM-9\n"); - else { - - /* - * In arcadde mode, we never run out of ammunition - */ - - if (arcadeMode == 0) { - c->station[i].type = ""; - count[c->pIndex]--; - } - fireMissile(c, i); - playSound(c, SoundMissileLaunch); - } - hasFired[c->pIndex] = 0; - } - } - return 1; -} - -/*ARGSUSED */ -int -fire_aim9m(craft * c) -{ - - hasFired[c->pIndex] = 1; - return 1; -} - -/* - * aim9m display function - * - * Update the HUD display strings associated with this weapon system. - * - * This code may be called by drones. Return a nonzero value if - * have a reasonable chance of scoring a kill. - */ - -/*ARGSUSED */ -int -display_aim9m(craft * c, craftType * w, viewer * u, int *i1, int *i2) -{ - - char s[16]; - double d, a1, v, r, root1, root2, n, t; - VPoint tmp; - int target, result = 0; - - sprintf(s, "%d AIM-9M", count[c->pIndex]); - strcpy(c->leftHUD[3], s); - - v = mag(c->Cg); - a1 = (w->maxThrust - 0.5 * c->rho * w->CDOrigin * v * v) - / (w->emptyWeight + w->maxFuel) * earth_g; - - if (c->curRadarTarget >= 0 && a1 >= 0.0) { - - d = c->targetDistance; - r = c->targetClosure; - - n = r * r + 2.0 * a1 * d; - if (n > 0) { - n = sqrt(n); - root1 = (-r + n) / a1; - root2 = (-r - n) / a1; - if (root1 >= 0.0) - if (root2 >= 0.0) - if (root1 < root2) - t = root1; - else - t = root2; - else - t = root1; - else if (root2 >= 0.0) - t = root2; - else - t = -1.0; - } - else - t = -1.0; - } - - else - t = -1.0; - -/* - * See if the missiles can lock onto any target. We'll constrain getIRTarget() - * so that it will only select target's in a twenty degree boresight cone. - */ - - if (count[c->pIndex] > 0) { - target = getIRTarget(c, &tmp, 0.17633); - } - else { - target = -1; - } - - if (target >= 0 && t <= 15.0) - sprintf(s, "LOCKED %d", (int) (t + 0.5)); - else if (t < 0.0) - sprintf(s, "ARM --"); - else if (t <= 15.0) - sprintf(s, "IN RANGE %d", (int) (t + 0.5)); - else - sprintf(s, "ARM %d", (int) (t + 0.5)); - -/* - * Set result equal to one if we are recommending a missile shot - */ - - if (target >= 0 && t <= 10.0 && t > (w->armDelay + 0.5)) { - result = 1; - } - - strcpy(c->leftHUD[2], s); - - strcpy(c->leftHUD[4], ""); - - return result; -} - -extern craftType *newCraft(void); - -void -initaim9(void) -{ - - craftType *c; - FILE *f; - dis_entity_type em1 = - {2, 1, 225, 1, 1, 3, 0}; - dis_entity_type em2 = - {2, 1, 222, 1, 2, 1, 0}; - - c = newCraft(); - c->name = strdup("aim-9m"); - - c->entityType = em1; - c->altEntityType = em2; - - wtbl[0] = aim9mDesc; - wtbl[0].w = c; - - c->CDOrigin = 0.04; /* 5" radius of body */ - c->CDFactor = -2.56694; - - c->CDBOrigin = 0.0; - c->CDBFactor = 0.0; - - VIdentMatrix(&(c->I)); - c->I.m[0][0] = 0.0; - c->I.m[1][1] = 0.0; - c->I.m[2][2] = 0.0; - c->cmSlope = -1.88; - c->cmFactor = -1.00; - - c->wingS = 1.0; - -/* - * Assume 150.0 lbs of weight is fuel and that it burns for about 4 seconds. - * That yields a fuel burn rate of 40 lbs/second. - */ - - c->emptyWeight = 90.0; - c->maxFuel = 100.0; - c->maxThrust = 4000.0; - c->spFuelConsump = 40; - -/* - * Three second arming delay - */ - - c->armDelay = 1.0; - - c->groundingPoint.x = 0.0; - c->groundingPoint.y = 0.0; - c->groundingPoint.z = 0.0; - - c->viewPoint.x = 0.0; - c->viewPoint.y = 0.0; - c->viewPoint.z = 0.0; - - c->muStatic = 0.0; - c->muKinetic = 0.0; - c->muBStatic = 0.0; - c->muBKinetic = 0.0; - - c->maxNWDef = 0.0; - c->NWIncr = 0.0; - c->maxNWS = 0.0; - c->gearD1 = 0.0; - c->gearD2 = 0.0; - - f = acm_fopen("aim9.obv", "r"); - c->object = VReadObject(f); - fclose(f); - -} diff -Nru acm-5.0/src/air.c acm-6.0+20200416/src/air.c --- acm-5.0/src/air.c 1998-05-12 03:43:03.000000000 +0000 +++ acm-6.0+20200416/src/air.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,35 +0,0 @@ - -#include - -#define GM 1.4 /* ratio of specific heats for air */ -#define P0 2116.22 /* sea-level pressure */ -#define TA 459.67 /* CONVERSION TEMPERATURE FROM F TO R */ -#define T0 (TA + 59.0) /* sea-level temperature */ -#define G 32.1741 /* gravitational acceleration [ft/sec^2] */ -#define RU (1545.31 * G) /* universal gas constant */ -#define MA 28.9644 /* molecular weight for air [lbm/lbm-mole] */ -#define RA (RU / MA) /* gas constant for air [ft^2/sec^2/R] */ - -/* - * airProperties : Compute rho and the speed of sound for the standard - * atmosphere up to 60,000 feet. - */ - -void -airProperties(double h, double *rho, double *mach1) -{ - - double t, p; - - if (h < 36089.2) { - t = T0 - 3.56616e-3 * h; - p = P0 * pow(t / T0, 5.255912); - } - else { - t = 389.97; - p = 472.6773 * exp(-G * (h - 36089.2) / (RA * t)); - } - - *rho = p / (RA * t); - *mach1 = sqrt(GM * RA * t); -} diff -Nru acm-5.0/src/alarm.c acm-6.0+20200416/src/alarm.c --- acm-5.0/src/alarm.c 1998-05-12 03:43:03.000000000 +0000 +++ acm-6.0+20200416/src/alarm.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,163 +0,0 @@ -/* - * acm : an aerial combat simulator for X - * Copyright (C) 1991-1997 Riley Rainey - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 dated June, 1991. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. - */ -#include "alarm.h" -#include -#if defined(__STDC__) || defined(HAVE_STDLIB_H) -#include -#else -#include -#endif - -static alarm_descriptor_t *alarm_list = NULL; -static alarm_id_t next_alarm_id = 0; - -void -alarmCheck(double delta) -{ - double d = delta; - alarm_descriptor_t *p, *list = NULL, *list1; - - while (alarm_list != (alarm_descriptor_t *) NULL && d > 0.0) { - if ((d = alarm_list->delta - d) <= 0.0) { - p = alarm_list; - alarm_list = alarm_list->next; - if (list) { - p->next = list; - list = p; - } - else { - p->next = NULL; - list = p; - } - d = (d < 0.0) ? -d : 0.0; - } - else { - alarm_list->delta = d; - break; - } - } - - while (list) { - (*list->proc) (list->arg1, list->arg2); - list1 = list->next; - free((char *) list); - list = list1; - } - -} - -alarm_id_t -addAlarm(double delta, void (*proc) (char *, char *), char *arg1, char *arg2) -{ - alarm_descriptor_t *n, *prev, *p; - - n = (alarm_descriptor_t *) malloc(sizeof(alarm_descriptor_t)); - /* per PREfix */ - if (n == NULL) { - printf("unable to allocate alarm descriptor\n"); - exit(1); - } - n->alarm_id = next_alarm_id++; - n->delta = delta; - n->proc = proc; - n->arg1 = arg1; - n->arg2 = arg2; - n->next = NULL; - - if ((p = alarm_list) == NULL) { - alarm_list = n; - } - else { - prev = NULL; - - while (n->delta > p->delta) { - n->delta -= p->delta; - prev = p; - if ((p = p->next) == NULL) { - prev->next = n; - return n->alarm_id; - } - } - - if (prev == NULL) { - n->next = alarm_list; - n->next->delta -= n->delta; - alarm_list = n; - } - else { - n->next = prev->next; - n->next->delta -= n->delta; - prev->next = n; - } - } - - return n->alarm_id; -} - -/* - * cancelAlarm returns the amount of time remaining until the cancelled - * alarm would have "gone-off" (or -1.0, if the alarm was not found). - */ - -double -cancelAlarm(alarm_id_t id) -{ - alarm_descriptor_t *p, *last = NULL; - double result = 0.0; - -/* - * Attempt to locate the specified alarm by its alarm_id. - */ - - for (p = alarm_list; p;) { - if (p->alarm_id == id) { - -/* - * Unlink this alarm descriptor - */ - - if (last) { - last->next = p->next; - } - else { - alarm_list = p->next; - } - -/* - * Correct the next decriptor's delta value, free this descriptor and return. - */ - - if (p->next) { - p->next->delta += p->delta; - } - result += p->delta; - free((char *) p); - return result; - } - - result += p->delta; - last = p; - p = p->next; - } - -/* - * Alarm not found, return -1.0. - */ - - return -1.0; -} diff -Nru acm-5.0/src/alarm.h acm-6.0+20200416/src/alarm.h --- acm-5.0/src/alarm.h 1998-05-12 03:43:03.000000000 +0000 +++ acm-6.0+20200416/src/alarm.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,37 +0,0 @@ - -/* - * acm : an aerial combat simulator for X - * Copyright (C) 1991,1992 Riley Rainey - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 dated June, 1991. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. - */ - -#ifndef _alarm_h -#define _alarm_h - -typedef long alarm_id_t; - -typedef struct _alarm_descriptor_t { - struct _alarm_descriptor_t *next; - double delta; - alarm_id_t alarm_id; - void (*proc) (); - char *arg1; - char *arg2; -} alarm_descriptor_t; - -extern alarm_id_t addAlarm(double delta, void (*proc) (char *, char *), char *arg1, char *arg2); -extern double cancelAlarm(alarm_id_t id); - -#endif diff -Nru acm-5.0/src/audio.c acm-6.0+20200416/src/audio.c --- acm-5.0/src/audio.c 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/src/audio.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,618 +0,0 @@ -/* - * acm : an aerial combat simulator for X - * Copyright (C) 1991-1994 Riley Rainey - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 dated June, 1991. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. - */ - -#include -#ifndef WIN32 -#include -#endif - -static char *files[] = -{ - "engine.au", - "crash.au", - "gear_up.au", - "gear_dn.au", - "missile.au", - "cannon.au", - "crash.au", - "screetch.au", - "stall.au", - "rwr.au", - "apglock.au" -}; - -static char *paths[NUM_SOUNDS]; - -#if defined(NETAUDIO) - -static int readPipe=-1; -static int writePipe=-1; - -static AuServer * aserver; -static AuBucketID sound[NUM_SOUNDS]; -static AuFlowID flow[NUM_SOUNDS] = {0}; -static AuDeviceID audioOutput; - -//#define TIMING 1 -#ifdef TIMING -#include -#include -#endif //TIMING - -#include -#include - -struct packet_t -{ - enum { PLAY, STOP } command; - int sound; - int repeat; -}; - -static int -local_initializeAudio( const char *display, const char *auserver); - -static void -local_shutdownAudio(); - -static void -local_playSound(int id, int repeat); - -static void -local_stopSound(int id); - -static void handle_pipe(int i) -{ - /* hopefully this was because we wrote to the audio pipe - * and the audio daemon has died. - */ - writePipe=-1; -} - -static void handle_child(int i) -{ - int status; - /* Audio daemon must have gone away. - */ - writePipe=-1; - waitpid(-1, &status, WNOHANG); -} - -int -initializeAudio(c, v, display, auserver) -craft *c; -viewer *v; -char *display; -char *auserver; -{ - int filedesc[2]; - int pid, i; - struct packet_t p; - int result; - - fprintf(stderr, "About to start sound daemon.\n"); - if(pipe(filedesc)==-1) { - perror("Error creating pipe"); - return -1; - } - signal(SIGPIPE, handle_pipe); - signal(SIGCHLD, handle_child); - pid = fork(); - if(pid == -1) { - perror("Fork error"); - v->aserver = NULL; - signal(SIGPIPE, SIG_DFL); - signal(SIGCHLD, SIG_DFL); - return -1; - } - if( pid ) { - close(filedesc[0]); - writePipe = filedesc[1]; - v->aserver = (AuServer*)pid; - for( i =0; iflow[i] = 0; - } - return 0; - } - signal(SIGPIPE, SIG_DFL); - signal(SIGCHLD, SIG_DFL); - - close(filedesc[1]); - readPipe = filedesc[0]; - - if( local_initializeAudio( display, auserver) ){ - close(readPipe); - fprintf(stderr, "Error setting up audio\n"); - exit(1); - } - - result = read( readPipe, &p, sizeof(struct packet_t)); - while( result == sizeof(struct packet_t)) { - if(p.command == PLAY) - local_playSound( p.sound, p.repeat); - else if(p.command == STOP) - local_stopSound( p.sound); - else - fprintf(stderr, "Audio Daemon received a bad command\n"); - - result = read( readPipe, &p, sizeof(struct packet_t)); - } - if(result == -1) - perror("Error reading pipe"); - local_shutdownAudio(); - - close(readPipe); - fprintf(stderr, "Audio daemon exiting.\n"); - exit(1); -} - -static void -writeCommand( struct packet_t *p) -{ - int result; - int loc=0; - do - { - result = write(writePipe, p+loc, sizeof(struct packet_t)-loc); - if(result == -1 || !result){ - if(result == -1) - perror("Error writing to daemon"); - writePipe = -1; - return; - } - loc += result; - }while(loc < sizeof(struct packet_t)); -} - -void -shutdownAudio(c, v) -craft *c; -viewer *v; -{ - // this should close the daemon down - close(writePipe); - v->aserver = (AuServer *) NULL; - wait(NULL); -} - -void -playSound(c, id) -craft *c; -int id; -{ - struct packet_t p; -#ifdef TIMING - struct timeval start,stop; - double total; - gettimeofday(&start, NULL); -#endif //TIMING - if (c->type == CT_PLANE) { - if(writePipe != -1) { - p.command = PLAY; - p.sound = id; - p.repeat = 0; - writeCommand(&p); - if(c->vl) - c->vl->flow[id]=1; - } - } - -#ifdef TIMING - gettimeofday(&stop, NULL); - total = stop.tv_sec - start.tv_sec + (stop.tv_usec - start.tv_usec)/1000000.0; - fprintf(stderr, "%s\t%d\t %f\n", __FUNCTION__, id, total); -#endif //TIMING -} - -void -playContinuousSound(c, id) -craft *c; -int id; -{ - struct packet_t p; -#ifdef TIMING - struct timeval start,stop; - double total; - gettimeofday(&start, NULL); -#endif //TIMING - - if ((c->type = CT_PLANE)) { - if(writePipe != -1) { - p.command = PLAY; - p.sound = id; - p.repeat = 10; - writeCommand(&p); - if(c->vl) - c->vl->flow[id]=1; - } - } - - -#ifdef TIMING - gettimeofday(&stop, NULL); - total = stop.tv_sec - start.tv_sec + (stop.tv_usec - start.tv_usec)/1000000.0; - fprintf(stderr, "%s\t%d\t %f\n", __FUNCTION__, id, total); -#endif //TIMING -} - -void -stopSound(c, id) -craft *c; -int id; -{ - struct packet_t p; -#ifdef TIMING - struct timeval start,stop; - double total; - gettimeofday(&start, NULL); -#endif //TIMING - - - if ((c->type = CT_PLANE)) { - if(writePipe != -1) { - p.command = STOP; - p.sound = id; - p.repeat = 0; - writeCommand(&p); - if(c->vl) - c->vl->flow[id]=0; - } - } - -#ifdef TIMING - gettimeofday(&stop, NULL); - total = stop.tv_sec - start.tv_sec + (stop.tv_usec - start.tv_usec)/1000000.0; - fprintf(stderr, "%s\t%d\t %f\n", __FUNCTION__, id, total); -#endif //TIMING -} - -static void done_callback(); - -static int -local_initializeAudio( const char * display, const char * auserver) -{ - int i, n; - AuBucketAttributes *ret_attr; - AuDeviceAttributes *dev; - AuStatus status; - char * the_server; - char * dot_position; - -/* - * If the X display specification has a screen field, remove it so that we - * can use it as an audio server name. - */ - - the_server = strdup(auserver); - dot_position = strchr(the_server, '.'); - if (dot_position) { - *dot_position = '\0'; - } - -/* - * Lazy initialization of sound paths array - */ - - if (!paths[0]) { - for (i = 0; i < NUM_SOUNDS; ++i) { - paths[i] = strdup(acm_find_file(files[i])); - } - } - -/* - * Open the audio server and send it our sounds - */ - - if ((aserver = AuOpenServer(the_server, 0, (char *) NULL, - 0, (char *) NULL, (char **) NULL)) == NULL) { - aserver = (AuServer *) NULL; - return -1; - } - - for (i = 0; i < NUM_SOUNDS; ++i) { - if ((sound[i] = AuSoundCreateBucketFromFile(aserver, - paths[i], AuAccessListMask | AuAccessImportMask, - &ret_attr, &status)) == AuNone) { - printf("Unable to create sound bucket: %s\n", - paths[i]); - AuCloseServer(aserver); - aserver = (AuServer *) NULL; - return -1; - } - flow[i] = 0; - } - -/* - * Select an output device - */ - - audioOutput = AuNone; - for (i = 0; i < AuServerNumDevices(aserver); ++i) { - dev = AuServerDevice(aserver, i); - if (AuDeviceKind(dev) == AuComponentKindPhysicalOutput && - AuDeviceNumTracks(dev) == 1) { - audioOutput = AuDeviceIdentifier(dev); - break; - } - } - - return 0; -} - -static void -local_shutdownAudio() -{ - int i; - AuStatus status; - - if (aserver) { - for (i = 0; i < NUM_SOUNDS; ++i) { - AuDestroyBucket(aserver, sound[i], &status); - } - AuCloseServer(aserver); - aserver = (AuServer *) NULL; - for (i = 0; i < NUM_SOUNDS; ++i) { - free (paths[i]); - } - } -} - -static void -local_playSound(id, repeat) -int id, repeat; -{ - AuStatus status; - if (aserver) { - AuSoundPlayFromBucket(aserver, sound[id], - audioOutput, AuFixedPointFromSum(1, 0), - done_callback, (AuPointer) NULL, - repeat, &flow[id], (int *) NULL, (int *) NULL, - &status); - } -} - -static void -local_stopSound(id) -int id; -{ - AuStatus status; - - if (aserver != (AuServer *) NULL && flow[id] != 0) { - AuStopFlow(aserver, flow[id], &status); - AuDestroyFlow(aserver, flow[id], &status); - flow[id] = 0; - } -} - -static void -done_callback(audio, which, event, data) -AuServer *audio; -AuEventHandlerRec *which; -AuEvent *event; -AuPointer data; -{ - printf("event type = %d\n", event->type); -} - -#else /* defined(NETAUDIO) */ -#if defined (HPAUDIO) - -#undef duration /* defined by pm.h as "radarMode" */ - -int -initializeAudio(c, v, display) -craft *c; -viewer *v; -char *display; -{ - int i, n; - Audio *conn; - AudioAttributes sb_attr; - long status; - -/* - * Lazy initialization of sound paths array - */ - - if (!paths[0]) { - for (i = 0; i < NUM_SOUNDS; ++i) { - paths[i] = strdup(acm_find_file(files[i])); - } - } - -/* - * Open the audio server and send it our sounds - */ - - if ((v->aserver = AOpenAudio(display, &status)) == NULL) { - printf("AOpenAudio: failed, status = %d\n", status); - v->aserver = (Audio *) NULL; - return -1; - } - - for (i = 0; i < NUM_SOUNDS; ++i) { - if ((v->sound[i] = ALoadAFile(v->aserver, - paths[i], AFFUnknown, 0, &sb_attr, - &status)) == NULL) { - printf("Unable to create sound bucket: %s (status %d)\n", - paths[i], status); - ACloseAudio(v->aserver, &status); - v->aserver = (Audio *) NULL; - return -1; - } - v->flow[i] = 0; - } - - return 0; -} - -void -shutdownAudio(c, v) -craft *c; -viewer *v; -{ - int i; - long status; - - if (v->aserver) { - for (i = 0; i < NUM_SOUNDS; ++i) { - ADestroySBucket(v->aserver, v->sound[i], &status); - } - ACloseAudio(v->aserver, &status); - v->aserver = (Audio *) NULL; - for (i = 0; i < NUM_SOUNDS; ++i) { - free(paths[i]); - } - } -} - -void -playSound(c, id) -craft *c; -int id; -{ - viewer *v; - SBPlayParams pparams; - AGainEntry gainEntry; - long status; - - gainEntry.u.o.out_ch = AOCTMono; - gainEntry.gain = AUnityGain; - gainEntry.u.o.out_dst = AODTMonoIntSpeaker; - - bzero(&pparams, sizeof(pparams)); - pparams.priority = APriorityNormal; - pparams.gain_matrix.type = AGMTOutput; - pparams.gain_matrix.num_entries = 1; - pparams.gain_matrix.gain_entries = &gainEntry; - pparams.play_volume = AUnityGain; - pparams.pause_first = False; - pparams.start_offset.type = ATTSamples; - pparams.start_offset.u.samples = 0; - pparams.duration.type = ATTFullLength; - pparams.loop_count = 0; - pparams.previous_transaction = 0; - pparams.event_mask = 0; - - for (v = c->vl; v; v = v->next) { - if (v->aserver) { - v->flow[id] = APlaySBucket(v->aserver, v->sound[id], - &pparams, &status); - if (v->flow[id] == NULL) - printf("APlaySBucket: failed, status %d\n", status); - } - } -} - -void -playContinuousSound(c, id) -craft *c; -int id; -{ - viewer *v; - AGainEntry gainEntry; - SBPlayParams pparams; - long status; - - gainEntry.u.o.out_dst = AODTMonoIntSpeaker /* AODTMonoJack */ ; - gainEntry.u.o.out_ch = AOCTMono; - gainEntry.gain = AUnityGain; - - bzero(&pparams, sizeof(pparams)); - pparams.gain_matrix.type = AGMTOutput; - pparams.gain_matrix.num_entries = 1; - pparams.gain_matrix.gain_entries = &gainEntry; - pparams.play_volume = AUnityGain; - pparams.pause_first = False; - pparams.start_offset.type = ATTSamples; - pparams.start_offset.u.samples = 0; - pparams.duration.type = ATTFullLength; - pparams.loop_count = -1; /* repeating... */ - pparams.priority = APriorityNormal; - pparams.previous_transaction = 0; - pparams.event_mask = 0; - - for (v = c->vl; v; v = v->next) { - if (v->aserver) { - v->flow[id] = APlaySBucket(v->aserver, v->sound[id], - &pparams, &status); - if (v->flow[id] == NULL) - printf("APlaySBucket: failed, status %d\n", status); - } - } -} - -void -stopSound(c, id) -craft *c; -int id; -{ - viewer *v; - long status; - - for (v = c->vl; v; v = v->next) { - if (v->aserver != (Audio *) NULL && v->flow[id] != 0) { - AStopAudio(v->aserver, v->flow[id], ASMEndLoop, NULL, &status); - if (status) - printf("AStopAudio: status %d\n", status); - v->flow[id] = 0; - } - } -} - -#else /* defined(HPAUDIO) */ - -int -initializeAudio(craft * c, viewer * v, char *p) -{ - int i; - - for (i = 0; i < NUM_SOUNDS; ++i) { - v->flow[i] = 0; - } - return -2; -} - -void -shutdownAudio(craft * c, viewer * v) -{ -} - -void -playSound(craft * c, int id) -{ -} - -void -playContinuousSound(craft * c, int id) -{ -} - -void -stopSound(craft * c, int id) -{ -} - -#endif /* defined(HPAUDIO) */ -#endif /* defined(NETAUDIO) */ - -void -setBackgroundSound(craft * c, double dThtlPercent, - _BOOL bABFlag, double dDynamicPressure) -{ -} diff -Nru acm-5.0/src/box.c acm-6.0+20200416/src/box.c --- acm-5.0/src/box.c 1999-01-06 19:59:48.000000000 +0000 +++ acm-6.0+20200416/src/box.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,247 +0,0 @@ - -/* - * acm : an aerial combat simulator for X - * Copyright (C) 1991-1998 Riley Rainey - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 dated June, 1991. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. - */ -#include "pm.h" -#include "box.h" -#include -#include - -static FILE *bbin = 0, *bbout = 0; - -short rp_map[MAXPLAYERS], rm_map[MAXPROJECTILES]; -short pp_map[MAXPLAYERS], pm_map[MAXPROJECTILES]; - -static char *no_room = -"No room in player table to add another black box object.\n"; - -void -newBlackBoxCraft(int id, int type, char *name) -{ - register craft *c; - register int i, max; - register short *p; - - /* per PREfix */ - if (type != CT_PLANE && type != CT_DRONE && - type != CT_MISSILE && type != CT_CANNON) { - printf("Invalid craft type passed to newBlackBoxCraft()\n"); - } - - switch (type) { - - case CT_PLANE: - case CT_DRONE: - if ((i = newPlane(name, -1)) >= 0) { - c = &ptbl[i]; - c->type = type; - c->flags = FL_BLACK_BOX; - strcpy(c->name, "black-box"); - strcpy(c->display, "*none*"); - pp_map[id] = i; - } - else { - fprintf(stderr, no_room); - } - return; -/*NOTREACHED */ break; - - case CT_MISSILE: - case CT_CANNON: - c = mtbl; - max = MAXPROJECTILES; - p = rm_map; - break; - } - - for (i = 0; i < max; ++i, ++c) { - if (c->type == CT_FREE) { - c->type = type; - c->flags = FL_BLACK_BOX; - c->cinfo = lookupCraft(name); - p[id] = i; - } - } -} - -void -startBlackBoxRecording(void) -{ - int i; - - if ((bbout = fopen("./black_box_output", "w")) == (FILE *) NULL) { - fprintf(stderr, "unable to open black box recording file\n"); - } - for (i = 0; i < MAXPLAYERS; ++i) { - rp_map[i] = -1; - } - for (i = 0; i < MAXPROJECTILES; ++i) { - rm_map[i] = -1; - } -} - -void -endBlackBoxRecording(void) -{ - fclose(bbout); - bbout = (FILE *) NULL; -} - -void -startBlackBoxPlayback(void) -{ - int i; - - if ((bbin = fopen("./black_box_input", "r")) == (FILE *) NULL) { - fprintf(stderr, "unable to open black box playback file\n"); - } - for (i = 0; i < MAXPLAYERS; ++i) { - pp_map[i] = -1; - } - for (i = 0; i < MAXPROJECTILES; ++i) { - pm_map[i] = -1; - } -} - -/* - * Update items under the control of black box playback - */ - -void -blackBoxInput(void) -{ - register int i; - BBRecord rec; - craft *c; - - if (bbin) { - while (fread((char *) &rec, BB_HDR_SIZE, 1, bbin) == 1) { - - c = (rec.table == 0) ? &ptbl[pp_map[rec.id]] : - &mtbl[pm_map[-(int) rec.id]]; - - switch (rec.rectype) { - - case BB_TYPE_SHORT_STATE: - fread((char *) &rec.u.short_state, - sizeof(rec.u.short_state), 1, bbin); - if (pp_map[rec.id] == -1) - break; - c->prevSg = c->Sg; - c->w = rec.u.short_state.w; - c->Sg = rec.u.short_state.Sg; - c->Cg = rec.u.short_state.Cg; - c->curRoll = rec.u.short_state.roll; - c->curPitch = rec.u.short_state.pitch; - c->curHeading = rec.u.short_state.heading; - break; - - case BB_TYPE_ADD_OBJECT: - fread((char *) &rec.u.object, - sizeof(rec.u.object), 1, bbin); - newBlackBoxCraft(rec.id, rec.u.object.type, - rec.u.object.name); - break; - - case BB_TYPE_DELETE_OBJECT: - pp_map[rec.id] = -1; - killPlayer(c); - break; - - case BB_TYPE_END_OF_FRAME: - return; - - default: - fprintf(stderr, "unknown rectype in\ - black box recording: %d\n", rec.rectype); - fclose(bbin); - bbin = (FILE *) NULL; - break; - } - } - fclose(bbin); - bbin = (FILE *) NULL; - for (i = 0; i < MAXPLAYERS; ++i) { - if (pp_map[i] != -1) - killPlayer(&ptbl[pp_map[i]]); - } - } -} - -/* - * Write out black box records - */ - -void -blackBoxOutput(void) -{ - register int i; - register craft *c; - BBRecord rec; - - if (bbout) { - for (i = 0, c = ptbl; i < MAXPLAYERS; ++i, ++c) { - - if (c->type != CT_FREE) { - - if (rp_map[i] == -1) { - rp_map[i] = i; - rec.rectype = BB_TYPE_ADD_OBJECT; - rec.table = 0; - rec.id = i; - rec.u.object.type = c->type; - strcpy(rec.u.object.name, - c->cinfo->name); - fwrite((char *) &rec, BB_HDR_SIZE, 1, bbout); - fwrite((char *) &rec.u.object, - sizeof(rec.u.object), 1, bbout); - } - rec.rectype = BB_TYPE_SHORT_STATE; - rec.table = 0; - rec.id = i; - rec.u.short_state.w = c->w; - rec.u.short_state.Sg = c->Sg; - rec.u.short_state.Cg = c->Cg; - rec.u.short_state.roll = c->curRoll; - rec.u.short_state.pitch = c->curPitch; - rec.u.short_state.heading = c->curHeading; - fwrite((char *) &rec, BB_HDR_SIZE, 1, bbout); - fwrite((char *) &rec.u.object, - sizeof(rec.u.short_state), 1, bbout); - } - } - for (i = 0; i < MAXPROJECTILES; ++i) { - rm_map[i] = -1; - } - - rec.rectype = BB_TYPE_END_OF_FRAME; - rec.id = 0; - fwrite((char *) &rec, BB_HDR_SIZE, 1, bbout); - } -} - -void -blackBoxKillPlayer(int id) -{ - BBRecord rec; - - if (bbout) { - rec.rectype = BB_TYPE_DELETE_OBJECT; - rec.id = id; - fwrite((char *) &rec, BB_HDR_SIZE, 1, bbout); - } -} diff -Nru acm-5.0/src/box.h acm-6.0+20200416/src/box.h --- acm-5.0/src/box.h 1999-01-06 19:59:48.000000000 +0000 +++ acm-6.0+20200416/src/box.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,44 +0,0 @@ -/* - * acm : an aerial combat simulator for X - * Copyright (C) 1991,1992 Riley Rainey - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 dated June, 1991. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. - */ -typedef struct { - WorldCoordinates w; - VPoint Sg; - VPoint Cg; - double heading, pitch, roll; -} _BBShortState; - -typedef struct { - short type; /* craft type */ - char name[64]; /* craft name */ -} _BBNewObject; - -typedef struct { - unsigned char rectype; /* black box record type */ - unsigned char table; /* is it ptbl(0) or mtbl(1)? */ - unsigned short id; /* player or missile index */ - union { - _BBShortState short_state; - _BBNewObject object; - } u; -} BBRecord; -#define BB_HDR_SIZE (sizeof(char) + sizeof(char) + sizeof(short)) - -#define BB_TYPE_SHORT_STATE 0x00 -#define BB_TYPE_ADD_OBJECT 0x01 -#define BB_TYPE_DELETE_OBJECT 0x02 -#define BB_TYPE_END_OF_FRAME 0x03 diff -Nru acm-5.0/src/browse.c acm-6.0+20200416/src/browse.c --- acm-5.0/src/browse.c 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/src/browse.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,665 +0,0 @@ -/* - * acm : an aerial combat simulator for X - * Copyright (C) 1991-1998 Riley Rainey - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 dated June, 1991. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. - */ - -#include -#include "pm.h" -#include -#include -#include - -#define MAX_MAPPED_STRING_LEN 20 -#define MAX_POPUP_STRING_LEN 40 -#include -#include "dis.h" -#include "linux_joystick.h" - -#define REF_X -1.3 -#define REF_Y -1.1 - -extern int debug; - -/* There's a bug lurking here, but for now ... */ - -#ifdef WIN32 -#define SCALE_1 5.0 -#else -#define SCALE_1 7.0 -#endif - -struct _dis_browse { - char info[32]; - Entity_t *p; - craftType *cinfo; /* craftType iff this an aircraft we can grab */ -}; - -#define BROWSE_MAX 256 -#define ITEM_LIMIT 5 -#define LINE_SPACING 0.2 - -static struct _dis_browse browse_info[BROWSE_MAX]; -static int bcount; - -int controlRequestCallback( dis_pdu *p, void *pu ); - -/* from drone.c */ -extern endGameDistanceCheck ( char *, char * ); - -/* - * Generate the stealth browsing table from the current DIS - * entity database - */ - -void -buildBrowseInfoTable () -{ - Entity_t * e = dis_getEntityTable(), *ep; - long etop = dis_getEntityTop(); - int i=0; - craftType * cinfo; - char *marker; - - ep = e; - bcount = 0; - - /* - * Update the list of entities we might be interested in following - */ - - for (i = 0; i <= etop && bcount < BROWSE_MAX; ++i, ++ep) { - if (ep->local != -1 && - ep->entityType.kind == DISKindPlatform && - ep->entityType.domain == DISDomainAir) { - browse_info[bcount].p = ep; - - /* - * Was this an aircraft type defined in the inventory file? - * If so, mark it as "flyable". - */ - - cinfo = lookupCraftByEntityType( &ep->entityType ); - if (cinfo && cinfo->CLift) { - browse_info[bcount].cinfo = cinfo; - marker = "* "; - } - else { - browse_info[bcount].cinfo = NULL; - marker = " "; - } - - sprintf (browse_info[bcount].info, "%s%d,%d,%d", - marker, - ep->entityId.sim_id.site_id, - ep->entityId.sim_id.application_id, - ep->entityId.entity_id - ); - ++ bcount; - } - } -} - -/* - * Display the stealth browser page in the MFD - */ - -void -doBrowsePage(craft * c, viewer * u) -{ - XSegment seg[2048], m_seg[256]; - char buf[256], buf1[256]; - XRectangle rect[1]; - int m_i = 0, i = 0, xc, yc, h, x, y; - int xscale, yscale, xoffset; - int item_count; - static ZInfo z, zm; - double yy; - - - if (c->radarMode != RM_DIS_BROWSE) - return; - - rect[0].x = u->rx; - rect[0].y = u->ry; - rect[0].width = u->radarWidth; - rect[0].height = u->radarWidth; - - z.depth = --u->v->depth; - z.color = (Color) (u->v->pixel[radarBackgroundColor->cIndex]); - zm.depth = z.depth; - zm.color = (Color) (u->v->pixel[HSIMagentaColor->cIndex]); - FillRectangle(u->v->w, u->rx, u->ry, - u->radarWidth, u->radarWidth, &z); - - xoffset = (int) ((-15.0 * u->scaleFactor) + 0.5); - xc = u->rx + (u->radarWidth + 1) / 2; - yc = u->ry + (u->radarWidth + 1) / 2; - - xscale = (int) (u->v->Scale.x / (SCALE_1 * 4)); - yscale = (int) (u->v->Scale.y / (SCALE_1 * 4)); - - h = (int) (11.0 * u->scaleFactor + 0.5); - y = (int) ((REF_Y + yy) * u->v->Scale.y / (SCALE_1 * 4)); - - yy = 0.0; - - /* - * Update the list of entities we might be interested in following - */ - - buildBrowseInfoTable (); - - /* - * display current DIS entity browsing page - */ - - item_count = 0; - for (i=u->browseBase; - iv->Scale.x / (SCALE_1 * 4)); - y = (int) ((REF_Y + yy) * u->v->Scale.y / (SCALE_1 * 4)); - if (u->browseSelectedItem == i) { - VDrawStrokeString(u->v, x + xc, y + yc, - buf, - strlen(buf), h, &zm); - } - else { - VDrawStrokeString(u->v, x + xc, y + yc, - buf, - strlen(buf), h, &u->z); - } - yy += LINE_SPACING; - } - - u->v->w->clip.x1 = rect[0].x; - u->v->w->clip.y1 = rect[0].y; - u->v->w->clip.x2 = rect[0].x + rect[0].width - 1; - u->v->w->clip.y2 = rect[0].y + rect[0].height - 1; - - VDrawSegments(u->v, m_seg, m_i, - (Color) (u->v->pixel[HSIMagentaColor->cIndex])); - - VDrawSegments(u->v, seg, i, - (Color) (u->v->pixel[HUDPixel])); - - u->v->w->clip.x1 = 0; - u->v->w->clip.y1 = 0; - u->v->w->clip.x2 = u->v->w->width - 1; - u->v->w->clip.y2 = u->v->w->height - 1; - - return; -} - -void -selectCockpitItem( craft *c, - viewer *u, - int x, - int y, - unsigned long time - ) -{ - double dx, dy, yscale; - int item; - int xc, yc; - - xc = u->rx + (u->radarWidth + 1) / 2; - yc = u->ry + (u->radarWidth + 1) / 2; - - yscale = (int) (u->v->Scale.y / (SCALE_1 * 4)); - - if (c->radarMode != RM_DIS_BROWSE) { - return; - } - - /* - * Click on radar set? - */ - - if (x > u->rx && x < u->rx+u->radarWidth && - y > u->ry && y < u->ry + u->radarWidth) { - - /* get index of selected item */ - - dx = (x - yc) / yscale; - dy = (y - yc) / yscale; - dy -= REF_Y; - item = (int) ( dy / LINE_SPACING ) + u->browseBase; - - if (item < bcount && item >= 0) { - - /* - * Double-Click? Activate control request - */ - - if (u->browseSelectedItem == item && - time - u->browseClickTime < 500) { - -#ifdef USE_REQUEST_CONTROL - - /* - * We can only take control of aircraft that we have a - * definition for. When that's the case for a given - * entity, cinfo will be non-NULL. - */ - - if (browse_info[item].cinfo) { - - /* - * If we're in end-game mode, check for hostile - * aircraft in our proximity. Calling - * endGameDistanceCheck once will cause it to be called - * once per second. - */ - - u->viewer_state = ViewerStateControlPending; - - if ( end_game_mode ) { - browse_info[item].p->c->flags |= FL_END_GAME_DRONE; - endGameDistanceCheck ((char *) browse_info[item].p->c, - (char *) u ); - } - else { - dis_requestControl ( browse_info[item].p, - controlRequestCallback, - u ); - } - } - else { - XBell( u->dpy, 50 ); - } -#else - XBell( u->dpy, 50 ); -#endif - - } - else { - - stealthCraft ( browse_info[item].p->c, u, item, 0 ); - - } - } - - } - - u->browseClickTime = time; -} - -/* - * Switch attention to the designated aircraft - */ - -int -stealthCraft ( craft *c, viewer *u, int item, int take_control) -{ - int i; - - /* - * Locate the browse info entry that corresponds to the - * designated craft. - */ - - if ( item == -1 ) { - - buildBrowseInfoTable (); - - for(i=0; ic == c) { - item = i; - break; - } - } - } - - /* follow that aircraft */ - if ( item != -1 ) { - u->browseSelectedItem = item; - } - else { - u->browseSelectedItem = -1; - } - - if ( end_game_mode && take_control && item != -1 ) { - browse_info[item].p->c->flags |= FL_END_GAME_DRONE; - u->viewer_state = ViewerStateControlPending; - endGameDistanceCheck ((char *) browse_info[item].p->c, - (char *) u ); - } - else { - u->viewer_state = ViewerStatePiggyback; - } - u->watchedCraft = c; - - return 0; -} - -craft * -locateCraftByDISEntityID ( dis_entity_id *id ) -{ - Entity_t *e = dis_getEntityTable(); - long top = dis_getEntityTop(); - long i; - craft *result = NULL; - - for (i=0; i<=top; ++i) { - if ( e->entityId.sim_id.site_id == id->sim_id.site_id && - e->entityId.sim_id.application_id == id->sim_id.application_id && - e->entityId.entity_id == id->entity_id ) { - result = e->c; - break; - } - ++ e; - } - - return result; - -} - -#ifdef USE_REQUEST_CONTROL - -/* - * This callback is invoked by the DIS code when we receive a grant - * control PDU that we've been waiting for. - */ - -int -controlRequestCallback( dis_pdu *pdu, void *pu ) -{ - viewer *u = (viewer *) pu; - Entity_t * e = dis_getEntityTable(), *ep; - dis_simulation_addr my_addr; - dis_entity_id new_entity_id; - DISxApplicationInfo *app; - craft *c; - - if ( pdu->hdr.pdu_type == PDUTypeAcknowledge && - pdu->acknowledge.resp_flag == 1) { - - /* - * "take over the craft" - * - * alter the viewer entry to reflect that we've hijacked an aircraft - * - * alter the ptbl (craft) entry to reflect that this is now an aircraft - * that we are responsible for modeling - */ - - u->viewer_state = ViewerStateNormal; - c = u->watchedCraft; - u->watchedCraft = u->c; - u->c = c; - - c->type = CT_PLANE; - c->vl = u; - - c->radarMode = RM_STANDBY; - - /* - * Until we can think of a better way to set fuel state, - * damage bits, etc. this will have to suffice. - */ - - (*c->cinfo->resupply) (c); - - /* - * Set up the radios - */ - - initRadio(c, &c->navReceiver[0]); - initRadio(c, &c->navReceiver[1]); - c->hsiSelect = &c->navReceiver[0]; - - ep = &e[c->disId]; - - ep->local = 1; - - app = dis_getApplicationInfo(); - DISxGetSimulationAddress ( app, &my_addr ); - - /* SITE ID */ - - if ((transferEntityIdBits & 0x4)) { - new_entity_id.sim_id.site_id = my_addr.site_id; - } - else { - new_entity_id.sim_id.site_id = - ep->entityId.sim_id.site_id; - } - - /* APPLICATION ID */ - - if ((transferEntityIdBits & 0x2)) { - new_entity_id.sim_id.application_id = my_addr.application_id; - } - else { - new_entity_id.sim_id.application_id = - ep->entityId.sim_id.application_id; - } - - /* ENTITY ID */ - - if ((transferEntityIdBits & 0x1)) { - - /* Issue a new entity id (good within this application) */ - - dis_entity_id temp_id; - - DISxIssueEntityID( app, &temp_id ); - new_entity_id.entity_id = temp_id.entity_id; - } - else { - - /* use existing entity ID */ - new_entity_id.entity_id = ep->entityId.entity_id; - } - - /* TODO: check for collisions in entity table if mode wasn't 0, or 7 */ - ep->entityId = new_entity_id; - - } - - /* - * Transfer Control Request was rejected. Return to stealth state. - */ - - else { - u->viewer_state = ViewerStatePiggyback; - XBell( u->dpy, 50 ); - } - - return 0; -} - -#endif - -int -doBrowseKeyEvent(craft * c, viewer * u, XEvent * ev, int player) -{ - - KeySym keysym; - XComposeStatus compose; - char buffer[MAX_MAPPED_STRING_LEN]; - int buflen = MAX_MAPPED_STRING_LEN; - -#ifdef SPECIAL_KEYS - FILE *fp; - craft pentry; - -#endif - - (void) XLookupString((XKeyEvent *) ev, buffer, buflen, - &keysym, &compose); - - if (player) { - - switch (keysym) { - -#ifdef sun - case XK_R7: -#else - case XK_Home: -#endif - - break; - - case XK_Prior: - u->browseBase -= ITEM_LIMIT; - if (u->browseBase < 0) { - u->browseBase = 0; - XBell ( u->dpy, 50 ); - } - break; - - case XK_Next: - u->browseBase += ITEM_LIMIT; - if (u->browseBase >= bcount) { - u->browseBase = bcount - ITEM_LIMIT + 1; - } - if (u->browseBase < 0) { - u->browseBase = 0; - XBell ( u->dpy, 50 ); - } - break; - -#ifdef sun - case XK_Up: -#else - case XK_KP_8: -#endif - u->viewDirection.x = 1.0; - u->viewDirection.y = 0.0; - u->viewDirection.z = 0.0; - u->viewUp.x = 0.0; - u->viewUp.y = 0.0; - u->viewUp.z = -1.0; - break; - -/* look right */ - -#ifdef sun - case XK_Right: -#else - case XK_KP_6: -#endif - u->viewDirection.x = 0.0; - u->viewDirection.y = 1.0; - u->viewDirection.z = 0.0; - u->viewUp.x = 0.0; - u->viewUp.y = 0.0; - u->viewUp.z = -1.0; - break; - -/* look left */ - -#ifdef sun - case XK_Left: -#else - case XK_KP_4: -#endif - u->viewDirection.x = 0.0; - u->viewDirection.y = -1.0; - u->viewDirection.z = 0.0; - u->viewUp.x = 0.0; - u->viewUp.y = 0.0; - u->viewUp.z = -1.0; - break; - -/* look back */ - -#ifdef sun - case XK_Down: -#else - case XK_KP_2: -#endif - u->viewDirection.x = -1.0; - u->viewDirection.y = 0.0; - u->viewDirection.z = 0.0; - u->viewUp.x = 0.0; - u->viewUp.y = 0.0; - u->viewUp.z = -1.0; - break; - -/* look up */ - -#ifdef sun - case XK_R11: -#else - case XK_KP_5: -#endif - u->viewDirection.x = 0.0; - u->viewDirection.y = 0.0; - u->viewDirection.z = -1.0; - u->viewUp.x = -1.0; - u->viewUp.y = 0.0; - u->viewUp.z = 0.0; - break; - - case XK_N: - case XK_n: - c->flags ^= FL_CHASE_VIEW; - break; - -#ifdef SPECIAL_KEYS - - case XK_o: - if (absorbDamage(c, 3) == 0) { - killPlayerEx(c, - "You asked to absorb some damage. The aircraft was destroyed.", - "No further details are available."); - return -1; - } - break; - - - case XK_semicolon: - debug ^= 1; - break; - -#endif - - case XK_P: - case XK_p: - killPlayer(c); - return -1; - return -1; -/*NOTREACHED */ break; - - case XK_braceleft: - startBlackBoxRecording(); - break; - - case XK_braceright: - endBlackBoxRecording(); - break; - - case XK_bracketleft: - startBlackBoxPlayback(); - break; - - case XK_k: - case XK_K: - CalibrateJoystick(); - if(LinuxJoystickPresent) - LinuxCalibrateJoystick(); - break; - - } - - } - return 0; -} - diff -Nru acm-5.0/src/ccip.c acm-6.0+20200416/src/ccip.c --- acm-5.0/src/ccip.c 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/src/ccip.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,321 +0,0 @@ -#include -#include "dis.h" -#include - -int select_mk82(craft *); -int display_mk82(craft *, craftType *, viewer *, int *, int *); -int update_mk82(craft *); -int press_mk82(craft *); -int release_mk82(craft *); - -extern int cdebug; - -weaponDesc mk82Desc = -{ - WK_MK82, - select_mk82, /* select */ - update_mk82, /* update */ - display_mk82, /* display procedure */ - press_mk82, /* fire */ - release_mk82, /* fire button release */ -}; - - -void -computeImpactPoint ( craft *c, craftType *bomb, WorldCoordinates *ip ) -{ - double t_sec, ground_speed_fps, loft_distance_feet; - double T1_sec, T2_sec; - double A, B, C, S4AC; - double sin_course, cos_course; - - /* - * Local terrain skin location - */ - - *ip = c->w; - ip->z = localAltitude( &c->Sg, &c->w ); - - A = - 0.5 * earth_g; - B = - c->Cg.z; - C = METERStoFEET ( c->w.z - ip->z ); - - S4AC = sqrt ( B * B - 4.0 * A * C ); - - /* - * Compute time to impact using the solution to the quadratic formula: - * - * x = 0.5 * ( - earth_g ) * t^2 + v0 * t + x0 - * - * v0 = vertical velocity (up positive, feet-per-second) - * x0 = height above surface (feet) - */ - - if (S4AC >= 0.0) { - - T1_sec = ( - B + S4AC ) / ( 2.0 * A ); - T2_sec = ( - B - S4AC ) / ( 2.0 * A ); - - } - else { - /* complex root(s) */ - } - - t_sec = (T1_sec > T2_sec) ? T1_sec : T2_sec; - - ground_speed_fps = sqrt ( c->Cg.x * c->Cg.x + c->Cg.y * c->Cg.y ); - - loft_distance_feet = ground_speed_fps * t_sec; - - /* - * Based on instantaneous velocity, not aircraft orientation - */ - - cos_course = c->Cg.x / ground_speed_fps; - sin_course = c->Cg.y / ground_speed_fps; - - DISUpdateWorldCoordinates(ip, cos_course, sin_course, FEETtoMETERS ( loft_distance_feet ) ); - -} - -static int count[MAXPLAYERS]; -static int hasFired[MAXPLAYERS]; - -int -select_mk82( craft * c ) -{ - hasFired[c->pIndex] = 0; - count[c->pIndex] = countOrdinance(c, "mk82"); - return 1; -} - -void -initmk82(void) -{ - - craftType *c; - FILE *f; - dis_entity_type em1 = - {2, 9, 225, 2, 73, 0, 0}; - dis_entity_type em2 = - {0, 0, 0, 0, 0, 0, 0}; - - c = newCraft(); - c->name = strdup("Mk 82"); - - wtbl[2] = mk82Desc; - wtbl[2].w = c; - - c->entityType = em1; - c->altEntityType = em2; - - /* - * Unverified parameters calculated using DATCOM recommendations - */ - - c->CDOrigin = 0.081; - - c->CDFactor = 0.0; - - c->CDBOrigin = 0.0; - c->CDBFactor = 0.0; - - /* - * dCL/da = 4.09 - * dCm,cg/da = -21.4 - */ - - f = acm_fopen("tracer.obv", "r"); - c->object = VReadObject(f); - fclose(f); - -} - -/*ARGSUSED */ -int -update_mk82(craft * c) -{ - int i; - - /* - * Bombs won't drop if we have "Weight on wheels" - */ - - if ((c->flags & FL_GND_CONTACT) == 0) { - - if (hasFired[c->pIndex] && count[c->pIndex] > 0) { - - i = readyStation(c, "mk82"); - if (i < 0) { - fprintf(stderr, "Oops. Can't find Mk-82\n"); - } - else { - - /* - * In arcade mode, we never run out of ammunition - */ - - if (arcadeMode == 0) { - c->station[i].type = ""; - count[c->pIndex]--; - } - - dropOrdinance (c, i); - /* playSound(c, SoundBombDrop); */ - } - hasFired[c->pIndex] = 0; - } - } - return 1; -} - -int -display_mk82(craft *c, craftType *ct, viewer *u, int *x, int *y) -{ - return 0; -} - -int -press_mk82(craft *c) -{ - return 0; -} - -int -release_mk82(craft *c) -{ - return 0; -} - - -int -dropOrdinance ( craft *c, int ind ) -{ - craft *m; - int i; - VPoint s, s1; - VPoint cY, mX, mY, mZ; - double v; - -#ifdef HAVE_DIS - double disLocation[3]; - double disVelocity[3]; - double disZeroVec[3]; - double disOrientation[3]; - -#endif - - /* - * Find an empty projectile entry - */ - - for ((i = 0, m = &mtbl[0]); i < MAXPROJECTILES; (++i, ++m)) { - if (m->type == CT_FREE) { - m->type = CT_BOMB; - break; - } - } - - if (i == MAXPROJECTILES) - return -1; - - m->cinfo = lookupCraft("aim-9m"); - m->fuel = 0.0; - m->curThrust = 0.0; - m->owner = c->pIndex; - - m->gvs_instance = (GVS_OBI) NULL; - -/* - * Build trihedral based on the launching aircraft's current velocity vector - * rather than simply it's current direction vector. - * - * (1) build a unit velocity vector. - * (2) calculate missiles local Z axis from - * plane's-y-axis CROSS missile's-unit-velocity-vector - * (3) calculate missile's Y axis. - */ - - if ((v = mag(c->Cg)) < 1.0) { - m->trihedral = c->trihedral; - m->curRoll = c->curRoll; - m->curPitch = c->curPitch; - m->curHeading = c->curHeading; - } - else { - mX = c->Cg; - mX.x /= v; - mX.y /= v; - mX.z /= v; - cY.x = c->trihedral.m[0][1]; - cY.y = c->trihedral.m[1][1]; - cY.z = c->trihedral.m[2][1]; - - VCrossProd(&mX, &cY, &mZ); - VCrossProd(&mZ, &mX, &mY); - - m->trihedral.m[0][0] = mX.x; - m->trihedral.m[1][0] = mX.y; - m->trihedral.m[2][0] = mX.z; - m->trihedral.m[0][1] = mY.x; - m->trihedral.m[1][1] = mY.y; - m->trihedral.m[2][1] = mY.z; - m->trihedral.m[0][2] = mZ.x; - m->trihedral.m[1][2] = mZ.y; - m->trihedral.m[2][2] = mZ.z; - - euler(m); - } - - m->Cg = c->Cg; - VTransform(&(c->cinfo->wStation[ind]), &(c->trihedral), &s1); - VReverseTransform_(&s1, &c->XYZtoNED, &s); - m->Sg.x = c->prevSg.x + FEETtoMETERS(s.x); - m->Sg.y = c->prevSg.y + FEETtoMETERS(s.y); - m->Sg.z = c->prevSg.z + FEETtoMETERS(s.z); - DISGeocentricToWorldCoordinates - ((dis_world_coordinates *) & m->Sg, &m->w); - m->prevw = m->w; - GenerateWorldToLocalMatrix(&m->w, &m->XYZtoNED); - m->armTimer = m->cinfo->armDelay; - m->flags = 0; - m->createTime = curTime; - - m->curRadarTarget = -1; - -#ifdef HAVE_DIS - -/* - * ACM bombs are DIS "tracked munitions", so we are - * responsible for sending entity state PDU's for them - */ - - if (disInUse) { - VPoint tmp; - - disLocation[0] = m->Sg.x; - disLocation[1] = m->Sg.y; - disLocation[2] = m->Sg.z; - tmp.x = FEETtoMETERS(m->Cg.x); - tmp.y = FEETtoMETERS(m->Cg.y); - tmp.z = FEETtoMETERS(m->Cg.z); - VReverseTransform_(&tmp, &m->XYZtoNED, (VPoint *) & disVelocity[0]); - disZeroVec[0] = 0.0; - disZeroVec[1] = 0.0; - disZeroVec[2] = 0.0; - disOrientation[0] = m->curHeading; - disOrientation[1] = m->curPitch; - disOrientation[2] = m->curRoll; - dis_entityEnter(c->team, m, - &m->cinfo->entityType, - &m->cinfo->altEntityType, - disLocation, disVelocity, - disZeroVec, disOrientation, - disZeroVec, &m->disId); -#ifdef DIS_DEBUG - printf("Bomb Entering m%d %d\n", i, m->disId); -#endif - } -#endif - return 0; -} diff -Nru acm-5.0/src/chaser.c acm-6.0+20200416/src/chaser.c --- acm-5.0/src/chaser.c 1998-05-12 03:43:03.000000000 +0000 +++ acm-6.0+20200416/src/chaser.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,258 +0,0 @@ - -/* - * acm : an aerial combat simulator for X - * Copyright (C) 1993 Riley Rainey, Tetsuji Rai - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 dated June, 1991. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. - */ - -#include "pm.h" -#include -#include -#include - -#define MAX_MAPPED_STRING_LEN 20 -#define MAX_POPUP_STRING_LEN 40 - -extern int debug; -extern void startBlackBoxRecording(void); -extern void endBlackBoxRecording(void); -extern void startBlackBoxPlayback(void); - -int -newChaser(int who, char *me) -{ - register craft *c; - int i; - - if (ptbl[who].type == CT_PLANE || ptbl[who].type == CT_DRONE) { - if (!chaseOthers && ptbl[who].type != CT_DRONE && - strcmp(ptbl[who].name, me)) - return NC_CANNOT_CHASE; - for (i = 0; i < MAXCHASERS; i++) { - if (ctbl[i].type == CT_CHASER) - continue; - ctbl[i].cinfo = (craftType *) malloc(sizeof(craftType)); - ctbl[i].viewDirection.x = 1.; - ctbl[i].viewDirection.y = 0.; - ctbl[i].viewDirection.z = 0.; - ctbl[i].viewUp.x = 0.; - ctbl[i].viewUp.y = 0.; - ctbl[i].viewUp.z = -1.0; - ctbl[i].Sg.x = ptbl[who].Sg.x; - ctbl[i].Sg.y = ptbl[who].Sg.y; - ctbl[i].Sg.z = ptbl[who].Sg.z; - ctbl[i].p = 100.; /* distance from the chased plane */ - return i; - } - } - - return NC_NOT_PLANE; -} - -/*ARGSUSED */ -int -doKeyEventChaser(craft * c, viewer * u, XKeyEvent * ev, int player) -{ - - KeySym keysym; - XComposeStatus compose; - char buffer[MAX_MAPPED_STRING_LEN]; - int buflen = MAX_MAPPED_STRING_LEN; - - (void) XLookupString(ev, buffer, buflen, &keysym, &compose); - - if (player) { - - switch (keysym) { - - case XK_j: - case XK_J: - c->p -= 20; - if (c->p < 20) - c->p = 20; - break; - - case XK_k: - case XK_K: - c->p += 20; - break; - -#ifdef sun - case XK_Up: -#else - case XK_KP_8: -#endif - c->viewDirection.x = 1.0; - c->viewDirection.y = 0.0; - c->viewDirection.z = 0.0; - c->viewUp.x = 0.0; - c->viewUp.y = 0.0; - c->viewUp.z = -1.0; - break; - -/* look right */ - -#ifdef sun - case XK_Right: -#else - case XK_KP_6: -#endif - c->viewDirection.x = 0.0; - c->viewDirection.y = 1.0; - c->viewDirection.z = 0.0; - c->viewUp.x = 0.0; - c->viewUp.y = 0.0; - c->viewUp.z = -1.0; - break; - -/* look left */ - -#ifdef sun - case XK_Left: -#else - case XK_KP_4: -#endif - c->viewDirection.x = 0.0; - c->viewDirection.y = -1.0; - c->viewDirection.z = 0.0; - c->viewUp.x = 0.0; - c->viewUp.y = 0.0; - c->viewUp.z = -1.0; - break; - -/* look back */ - -#ifdef sun - case XK_Down: -#else - case XK_KP_2: -#endif - c->viewDirection.x = -1.0; - c->viewDirection.y = 0.0; - c->viewDirection.z = 0.0; - c->viewUp.x = 0.0; - c->viewUp.y = 0.0; - c->viewUp.z = -1.0; - break; - -/* look up */ -/* - #ifdef sun - case XK_R11: - #else - case XK_KP_5: - #endif - c->viewDirection.x = 0.0; - c->viewDirection.y = 0.0; - c->viewDirection.z = -1.0; - c->viewUp.x = -1.0; - c->viewUp.y = 0.0; - c->viewUp.z = 0.0; - break; - - */ -#ifdef SPECIAL_KEYS - - case XK_o: - if (absorbDamage(c, 3) == 0) { - killChaser(c); - return -1; - } - break; - - case XK_semicolon: - debug ^= 1; - break; - -#endif - - case XK_P: - case XK_p: - killChaser(c); - return -1; -/*NOTREACHED */ break; - - case XK_braceleft: - startBlackBoxRecording(); - break; - - case XK_braceright: - endBlackBoxRecording(); - break; - - case XK_bracketleft: - startBlackBoxPlayback(); - break; - - } - - } - - return 0; -} - -int -killChaser(craft * c) -{ - - viewer *v, *vn; - int i; - - /* - * Decrement the player count, iff this is a real person that just got - * killed. - */ - - if (c->type == CT_CHASER) { - --ctblCount; - } - - /* - * Free HUD string storage - */ - - if (c->leftHUD[0] != (char *) NULL) - for (i = 0; i < 3; ++i) { - free(c->leftHUD[i]); - free(c->rightHUD[i]); - } - - /* - * Close viewers' display - */ - - for (v = c->vl; v != (viewer *) NULL;) { - VCloseViewport(v->v); - XCloseDisplay(v->dpy); - vn = (viewer *) v->next; - free((char *) v); - v = vn; - } - - c->type = CT_FREE; - return 0; -} - -void /*ARGSUSED */ -resizeChaserWindow(craft * c, viewer * u, int width, int height, int initial_flag) -{ - - u->width = width; - u->height = height; - u->xCenter = (u->width + 1) / 2; - u->yCenter = (u->height + 1) / 2; - u->scaleFactor = (double) width / (double) VIEW_WINDOW_WIDTH;; - -} diff -Nru acm-5.0/src/damage.c acm-6.0+20200416/src/damage.c --- acm-5.0/src/damage.c 1998-08-17 19:11:34.000000000 +0000 +++ acm-6.0+20200416/src/damage.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,340 +0,0 @@ - -/* - * acm : an aerial combat simulator for X - * Copyright (C) 1991-1998 Riley Rainey - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 dated June, 1991. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. - */ - -#include "pm.h" -#include "damage.h" - -#if defined (HAVE_RAND) -int -acm_rand(void) -{ - return rand() & 0xffff; -} - -void -acm_srand(int seed) -{ - srand(seed); -} - -#else -#if defined (HAVE_RANDOM) -int -acm_rand() -{ - return random() & 0xffff; -} - -void -acm_srand(int seed) -{ - srandom(seed); -} - -#else - -int -acm_rand() -{ - return 1; -} - -void -acm_srand(int seed) -{ - fprintf(stderr, "Hmm. Your system seems to lack both rand() and random()\n"); - fprintf(stderr, "What kind of system is this, anyway?\n\n"); - exit(1); -} - -#endif -#endif - -double -frandom(void) -{ - - return (double) (acm_rand() & 0x7fff) / 32767.0; -} - -/* - * Select a subsystem to receive damage. - */ - -long -selectSystem(void) -{ - - double r; - long i; - - if ((r = frandom()) < 0.25) - i = SYS_ENGINE1; - else if (r < 0.35) - i = SYS_RADAR; - else if (r < 0.40) - i = SYS_TEWS; - else if (r < 0.45) - i = SYS_HYD1; - else if (r < 0.50) - i = SYS_HYD2; - else if (r < 0.53) - i = SYS_GEN1; - else if (r < 0.56) - i = SYS_GEN2; - else if (r < 0.61) - i = SYS_FLAPS; - else if (r < 0.69) - i = SYS_SPEEDBRAKE; - else if (r < 0.78) - i = SYS_FUEL; - else if (r < 0.85) - i = SYS_HUD; - else if (r < 0.90) - i = SYS_LEFTMAIN; - else if (r < 0.95) - i = SYS_RIGHTMAIN; - else - /* per PREfix */ - i = SYS_NOSEGEAR; - return i; -} - -void -damageSystem(craft * c, long sys) -{ - - if ((c->damageBits & sys) || (sys == SYS_FUEL)) { - - c->damageBits &= ~sys; - - switch (sys) { - - case SYS_ENGINE1: - c->throttle = 0; - break; - - case SYS_RADAR: - c->curRadarTarget = -1; - break; - - /* - * Fuel leaks can be up to 40 pounds per second here. - */ - - case SYS_FUEL: - c->leakRate += (frandom() + frandom()) * 20.0; - break; - - case SYS_HYD1: - case SYS_HYD2: - if ((c->damageBits & (SYS_HYD1 | SYS_HYD2)) == 0) { - c->damageBits &= ~SYS_SPEEDBRAKE; - c->damageBits &= ~SYS_FLAPS; - } - break; - - case SYS_GEN1: - case SYS_GEN2: - if ((c->damageBits & (SYS_GEN1 | SYS_GEN2)) == 0) { - c->damageBits &= ~ - (SYS_HUD | SYS_RADAR | SYS_TEWS); - break; - } - } - - } -} - -/* - * absorbDamage : craft c is hit with d points of damage. - */ - -int -absorbDamage(craft * c, int d) -{ - - double n, x; - register long sys; - - /* - * Actual damage sustained is adjusted by a damage factor that forms a - * bell curve centered around 0.75 * d. - */ - - x = (frandom() + frandom()) / 2.0 + 0.25; - - d = (int) (d * x + 0.5); - - if (d > 0) { - playSound(c, SoundExplosion); - } - - for (; d > 0; --d) { - - /* - * For each damage point absorbed, there is a 15 percent chance that - * it will be absorbed by some subsystem other than the actual - * airframe. - */ - - if (frandom() <= 0.15) { - sys = selectSystem(); - damageSystem(c, sys); - } - - /* - * For each point absorbed by the airframe, there is a 20% chance that - * it'll be absorbed by the wing and induce a rolling moment or a 10 - * percent chance that it will hit a horizontal stabilizer and induce - * a pitching and rolling moment. - */ - - else { - - if ((n = frandom()) <= 0.20) { - c->damageCL += (frandom() - 0.5) * 0.20; - } - else if (n <= 0.30) { - c->damageCL += (frandom() - 0.5) * 0.10; - c->damageCM += (frandom() - 0.5) * 0.20; - } - - if (--(c->structurePts) <= 0) - return 0; - } - - } - - return 1; - -} - -int -absorbDISDamage(craft * c, - dis_entity_type *etype, - u_short warhead_type, - u_short fuze_type, - double distance_meters, - double velocity_meters_per_sec, - double *explosion_diameter_meters) -{ - int i; - int damage_points; - munition_map *pmm = mun_map; - - *explosion_diameter_meters = 0.0; - - for (i=0; ientity_type, &pmm->entity_mask)) { - if (pmm->warhead_mask == 0 || pmm->warhead_type == warhead_type) { - - /* found a match; assess damage */ - - /* - * kinetic warhead - */ - - if (pmm->kinetic_flag) { - damage_points = (int) ( 0.5 * pmm->damage_factor * - velocity_meters_per_sec * velocity_meters_per_sec + - 0.5 ); - } - - /* - * blast warhead - */ - - else { - if (distance_meters < 1.0) { - distance_meters = 1.0; - } - damage_points = (int) ( pmm->damage_factor / - distance_meters * distance_meters + 0.5 ); - } - - *explosion_diameter_meters = pmm->explosion_diameter_meters; - - return absorbDamage ( c, damage_points ); - } - } - ++ pmm; - } - - printf ("Warning: missed munition entity lookup failed\n"); - return 1; -} - -void -initDamage(craft * c) -{ - c->damageBits = c->cinfo->damageBits; - c->structurePts = c->cinfo->structurePts; - c->leakRate = 0.0; - c->damageCL = 0.0; - c->damageCM = 0.0; -} - -/* - * compare an incoming DIS entity type against a wildcarded entity type; - * returns non-zero value if they match. - */ - -int -entityWildcardMatch (const dis_entity_type *in, - const dis_entity_type *pattern, - const dis_entity_type *pattern_mask) -{ - if (pattern_mask->kind == 0 || - pattern->kind == in->kind) { - - if (pattern_mask->domain == 0 || - pattern->domain == in->domain) { - - if (pattern_mask->country == 0 || - pattern->country == in->country) { - - if (pattern_mask->category == 0 || - pattern->category == in->category) { - - if (pattern_mask->subcategory == 0 || - pattern->subcategory == in->subcategory) { - - if (pattern_mask->specific == 0 || - pattern->specific == in->specific) { - - if (pattern_mask->extra == 0 || - pattern->extra == in->extra) { - return 1; - } - - } - - } - - } - - } - - } - - } - - return 0; -} diff -Nru acm-5.0/src/damage.h acm-6.0+20200416/src/damage.h --- acm-5.0/src/damage.h 1998-05-12 03:43:03.000000000 +0000 +++ acm-6.0+20200416/src/damage.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,44 +0,0 @@ -/* - * acm : an aerial combat simulator for X - * Copyright (C) 1991,1992 Riley Rainey - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 dated June, 1991. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. - */ -#define isFunctioning(c, sys) ((c->damageBits & sys) ? 1 : 0) - -/* - * Each of these bits are true if the corresponding system is - * functioning. - */ - -#define SYS_RADAR 0x0001 /* set if radar works */ -#define SYS_TEWS 0x0002 /* set if TEWS works */ -#define SYS_FLAPS 0x0004 /* set if flaps work */ -#define SYS_SPEEDBRAKE 0x0008 -#define SYS_HYD1 0x0010 -#define SYS_HYD2 0x0020 -#define SYS_GEN1 0x0040 -#define SYS_GEN2 0x0080 -#define SYS_ENGINE1 0x0100 /* set if engine #1 works */ -#define SYS_ENGINE2 0x0200 /* set if engine #2 works */ -#define SYS_HUD 0x0400 /* set if HUD works */ -#define SYS_FUEL 0x0800 /* set if there isn't a fuel leak */ -#define SYS_NOSEGEAR 0x1000 -#define SYS_LEFTMAIN 0x2000 -#define SYS_RIGHTMAIN 0x4000 -#define SYS_NODAMAGE 0x7fff - -#define FLAG_LOWFUEL 0x8000 /* set when fuel < 1000 lbs */ -#define FLAG_SPEEDBRAKE 0x10000 /* set when speedbrake is deployed */ -#define FLAG_WHEELBRAKE 0x20000 /* set when wheel brakes are applied */ diff -Nru acm-5.0/src/deadreckon.c acm-6.0+20200416/src/deadreckon.c --- acm-5.0/src/deadreckon.c 1997-03-02 00:43:25.000000000 +0000 +++ acm-6.0+20200416/src/deadreckon.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,291 +0,0 @@ -/* - * $Id: deadreckon.c,v 0.3 1995/01/13 14:16:09 mats Exp $ - * - * Copyright (C) 1995 Mats Lofkvist CelsiusTech Electronics AB - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 dated June, 1991. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. - */ - -static char rcsid[] = "$Id: deadreckon.c,v 0.3 1995/01/13 14:16:09 mats Exp $"; - - -#include -#include "deadreckon.h" - - -#ifndef M_PI -#define M_PI 3.14159265358979323846 -#endif - - -#define EPSILON (1.5e-06) - -#define X_AXIS 0 -#define Y_AXIS 1 -#define Z_AXIS 2 - -#define PSI 0 -#define THETA 1 -#define PHI 2 - -#define UP (M_PI/2) -#define DOWN (-M_PI/2) - - -/* - * e u l e r T o Q u a t e r n i o n - * - * Convert euler[psi, theta, phi] to quaternion q. - * Angles are defined in radians. - */ - -void eulerToQuaternion(double euler[3], Quaternion *q) -{ - double coshpsi, coshtheta, coshphi, sinhpsi, sinhtheta, sinhphi; - double halfpsi, halftheta, halfphi; - - halfpsi = 0.5 * euler[PSI]; - halftheta = 0.5 * euler[THETA]; - halfphi = 0.5 * euler[PHI]; - - coshpsi = cos(halfpsi); - coshtheta = cos(halftheta); - coshphi = cos(halfphi); - sinhpsi = sin(halfpsi); - sinhtheta = sin(halftheta); - sinhphi = sin(halfphi); - - q->scalar = coshpsi*coshtheta*coshphi + sinhpsi*sinhtheta*sinhphi; - - q->vector[X_AXIS] = coshpsi*coshtheta*sinhphi - sinhpsi*sinhtheta*coshphi; - q->vector[Y_AXIS] = coshpsi*sinhtheta*coshphi + sinhpsi*coshtheta*sinhphi; - q->vector[Z_AXIS] = sinhpsi*coshtheta*coshphi - coshpsi*sinhtheta*sinhphi; -} - - -/* - * a n g u l a r V e l o c i t y T o Q u a t e r n i o n - * - * Convert avel[x-axis rotation, y ditto, z ditto] to quaternion q. - * Angular velocity is defined in radians per second. - */ - -void angularVelocityToQuaternion(double avel[3], Quaternion *q) -{ - double scale; - - q->scalar = sqrt(avel[0]*avel[0] + avel[1]*avel[1] + avel[2]*avel[2]); - - if (q->scalar > EPSILON) - { - scale = 1.0 / q->scalar; - q->vector[0] = avel[0] * scale; - q->vector[1] = avel[1] * scale; - q->vector[2] = avel[2] * scale; - } - else - { - q->scalar = 0.0; - q->vector[0] = 1.0; - q->vector[1] = 0.0; - q->vector[2] = 0.0; - } -} - - -/* - * q u a t e r n i o n T o E u l e r - * - * Convert the quaternion q to euler[psi, theta, phi]. - * Angles are defined in radians. - */ - -void quaternionToEuler(Quaternion *q, double euler[3]) -{ - double sin_theta; /* sin of pitch */ - - double R00, R01, R02; /* rotation matrix elements */ - double R11, R12; - double R21, R22; - - R02 = 2.0 * ((q->vector[X_AXIS] * q->vector[Z_AXIS]) - - (q->scalar * q->vector[Y_AXIS])); - - sin_theta = -R02; - - if (fabs(sin_theta) > (1.0 - EPSILON)) - { - euler[PSI] = 0.0; /* arbitrarily set yaw to 0.0 */ - - if (sin_theta > 0) - euler[THETA] = UP; - else - euler[THETA] = DOWN; - - R11 = (2.0 * ((q->scalar * q->scalar) - + (q->vector[Y_AXIS] * q->vector[Y_AXIS]))) - 1.0; - R21 = 2.0 * ((q->vector[Y_AXIS] * q->vector[Z_AXIS]) - - (q->scalar * q->vector[X_AXIS])); - - euler[PHI] = atan2(-R21, R11); - } - else - { - R00 = (2.0 * ((q->scalar * q->scalar) - + (q->vector[X_AXIS] * q->vector[X_AXIS]))) - 1.0; - R01 = 2.0 * ((q->vector[X_AXIS] * q->vector[Y_AXIS]) + - (q->scalar * q->vector[Z_AXIS])); - R12 = 2.0 * ((q->vector[Y_AXIS] * q->vector[Z_AXIS]) + - (q->scalar * q->vector[X_AXIS])); - R22 = (2.0 * ((q->scalar * q->scalar) - + (q->vector[Z_AXIS] * q->vector[Z_AXIS]))) - 1.0; - - /* Determine angle psi */ - - euler[PSI] = atan2(R01, R00); - - /* Determine angle theta */ - - euler[THETA] = asin(sin_theta); - - /* Determine angle phi */ - - euler[PHI] = atan2(R12, R22); - } -} - - -/* - * q u a t e r n i o n M u l t i p l y - * - * Multiply the quaternions q1 and q2 and return the result in qr. - */ - -static void quaternionMultiply(Quaternion *q1, Quaternion *q2, Quaternion *qr) -{ - qr->scalar = q1->scalar*q2->scalar - q1->vector[0]*q2->vector[0] - - q1->vector[1]*q2->vector[1] - q1->vector[2]*q2->vector[2]; - - qr->vector[0] = q1->vector[0]*q2->scalar + q1->scalar*q2->vector[0] - - q1->vector[2]*q2->vector[1] + q1->vector[1]*q2->vector[2]; - - qr->vector[1] = q1->vector[1]*q2->scalar + q1->vector[2]*q2->vector[0] - + q1->scalar*q2->vector[1] - q1->vector[0]*q2->vector[2]; - - qr->vector[2] = q1->vector[2]*q2->scalar - q1->vector[1]*q2->vector[0] - + q1->vector[0]*q2->vector[1] + q1->scalar*q2->vector[2]; -} - - -/* - * d e a d R e c k o n R V W - * - * Dead reckon from loc (location), vel (velocity), acc (acceleration), - * oriQ (orientation), angvelQ (angular velocity) deltatime seconds - * forward in time. The result is returned in newloc (new location), - * newvel (new velocity) and neworiQ (new orientation). - * - * The dead reckoning is second order in location and first order - * in orientation with velocity and acceleration in world coordinates, - * hence the name RVW (dead reckoned rotation, velocity, world). - */ - -void deadReckonRVW(double deltatime, - double loc[3], double vel[3], double acc[3], - Quaternion *oriQ, Quaternion *angvelQ, - double newloc[3], double newvel[3], Quaternion *neworiQ) -{ - int i; - double halfDtSq = deltatime*deltatime/2.0; - double halfAngle, sinHalfAngle; - Quaternion moveQ; - - /* location */ - for (i = 0; i < 3; i++) - { - newloc[i] = loc[i] + deltatime*vel[i] + halfDtSq*acc[i]; - newvel[i] = vel[i] + deltatime*acc[i]; - } - - /* orientation */ - halfAngle = 0.5 * deltatime * angvelQ->scalar; - moveQ.scalar = cos(halfAngle); - sinHalfAngle = sin(halfAngle); - moveQ.vector[0] = sinHalfAngle * angvelQ->vector[0]; - moveQ.vector[1] = sinHalfAngle * angvelQ->vector[1]; - moveQ.vector[2] = sinHalfAngle * angvelQ->vector[2]; - - quaternionMultiply(oriQ, &moveQ, neworiQ); - -#ifdef DEBUGIT -{ -double xx[3], yy[3], zz[3]; -quaternionToEuler(oriQ, xx); -quaternionToEuler(&moveQ, yy); -quaternionToEuler(neworiQ, zz); -#define R2D(x) ((x)*180.0/3.141593) -printf("orientation: %7.2f %7.2f %7.2f\n", R2D(xx[0]), R2D(xx[1]), R2D(xx[2])); -printf("move: %7.2f %7.2f %7.2f\n", R2D(yy[0]), R2D(yy[1]), R2D(yy[2])); -printf("new orient.: %7.2f %7.2f %7.2f\n", R2D(zz[0]), R2D(zz[1]), R2D(zz[2])); -} -#endif -} - - -/* - * c h e c k L o c a t i o n T h r e s h o l d - * - * Return 1 if the distance between the coordinates a and b differ - * more than specified by threshold, return 0 otherwise. - */ - -int checkLocationThreshold(double threshold, double a[3], double b[3]) -{ - double mag_sqr = ((a[0]-b[0])*(a[0]-b[0]) - + (a[1]-b[1])*(a[1]-b[1]) - + (a[2]-b[2])*(a[2]-b[2])); - if (mag_sqr > threshold*threshold) { -/* printf ("location out %.tf thresh = %.2f\n", sqrt(mag_sqr), threshold); */ - return 1; - } - else - return 0; -} - - -/* - * c h e c k O r i e n t a t i o n T h r e s h o l d - * - * Return 1 if the angular distance between the orientations a and b differ - * more than specified by threshold, return 0 otherwise. - * The orientations should be defined as [psi, theta, phi] in radians. - * - * BUG: the current implementation is wrong but will work well enough - * when used only to check if it is necessary to send an entity state PDU. - */ - -int checkOrientationThreshold(double threshold, double a[3], double b[3]) -{ - /* BUG: this is only an approximation */ - if (((a[0]-b[0])*(a[0]-b[0]) - + (a[1]-b[1])*(a[1]-b[1]) - + (a[2]-b[2])*(a[2]-b[2])) - > threshold*threshold) { - return 1; - } - else - return 0; -} - - diff -Nru acm-5.0/src/deadreckon.h acm-6.0+20200416/src/deadreckon.h --- acm-5.0/src/deadreckon.h 1995-09-26 17:55:18.000000000 +0000 +++ acm-6.0+20200416/src/deadreckon.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,97 +0,0 @@ -/* - * $Id: deadreckon.h,v 0.2 1995/01/13 14:16:09 mats Exp $ - * - * Copyright (C) 1995 Mats Lofkvist CelsiusTech Electronics AB - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 dated June, 1991. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. - */ - -#ifndef DEADRECKON_H -#define DEADRECKON_H - - -typedef struct { - double scalar; - double vector[3]; -} Quaternion; - - -/* - * e u l e r T o Q u a t e r n i o n - * - * Convert euler[psi, theta, phi] to quaternion q. - * Angles are defined in radians. - */ - -void eulerToQuaternion(double euler[3], Quaternion *q); - -/* - * a n g u l a r V e l o c i t y T o Q u a t e r n i o n - * - * Convert avel[x-axis rotation, y ditto, z ditto] to quaternion q. - * Angular velocity is defined in radians per second. - */ - -void angularVelocityToQuaternion(double avel[3], Quaternion *q); - -/* - * q u a t e r n i o n T o E u l e r - * - * Convert the quaternion q to euler[psi, theta, phi]. - * Angles are defined in radians. - */ - -void quaternionToEuler(Quaternion *q, double euler[3]); - -/* - * d e a d R e c k o n R V W - * - * Dead reckon from loc (location), vel (velocity), acc (acceleration), - * oriQ (orientation), angvelQ (angular velocity) deltatime seconds - * forward in time. The result is returned in newloc (new location), - * newvel (new velocity) and neworiQ (new orientation). - * - * The dead reckoning is second order in location and first order - * in orientation with velocity and acceleration in world coordinates, - * hence the name RVW (dead reckoned rotation, velocity, world). - */ - -void deadReckonRVW(double deltatime, - double loc[3], double vel[3], double acc[3], - Quaternion *ori, Quaternion *angvel, - double newloc[3], double newvel[3], Quaternion *newori); - -/* - * c h e c k L o c a t i o n T h r e s h o l d - * - * Return 1 if the distance between the coordinates a and b differ - * more than specified by threshold, return 0 otherwise. - */ - -int checkLocationThreshold(double threshold, double a[3], double b[3]); - -/* - * c h e c k O r i e n t a t i o n T h r e s h o l d - * - * Return 1 if the angular distance between the orientations a and b differ - * more than specified by threshold, return 0 otherwise. - * The orientations should be defined as [psi, theta, phi] in radians. - * - * BUG: the current implementation is wrong but will work well enough - * when used only to check if it is necessary to send an entity state PDU. - */ - -int checkOrientationThreshold(double threshold, double a[3], double b[3]); - -#endif diff -Nru acm-5.0/src/dis/Artistic acm-6.0+20200416/src/dis/Artistic --- acm-5.0/src/dis/Artistic 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/dis/Artistic 2006-01-05 13:58:55.000000000 +0000 @@ -0,0 +1,111 @@ + + + + + The "Artistic License" + + Preamble + +The intent of this document is to state the conditions under which a +Package may be copied, such that the Copyright Holder maintains some +semblance of artistic control over the development of the package, +while giving the users of the package the right to use and distribute +the Package in a more-or-less customary fashion, plus the right to make +reasonable modifications. + +Definitions: + + "Package" refers to the collection of files distributed by the + Copyright Holder, and derivatives of that collection of files + created through textual modification. + + "Standard Version" refers to such a Package if it has not been + modified, or has been modified in accordance with the wishes + of the Copyright Holder as specified below. + + "Copyright Holder" is whoever is named in the copyright or + copyrights for the package. + + "You" is you, if you're thinking about copying or distributing + this Package. + + "Reasonable copying fee" is whatever you can justify on the + basis of media cost, duplication charges, time of people involved, + and so on. (You will not be required to justify it to the + Copyright Holder, but only to the computing community at large + as a market that must bear the fee.) + + "Freely Available" means that no fee is charged for the item + itself, though there may be fees involved in handling the item. + It also means that recipients of the item may redistribute it + under the same conditions they received it. + +1. You may make and give away verbatim copies of the source form of the +Standard Version of this Package without restriction, provided that you +duplicate all of the original copyright notices and associated disclaimers. + +2. You may apply bug fixes, portability fixes and other modifications +derived from the Public Domain or from the Copyright Holder. A Package +modified in such a way shall still be considered the Standard Version. + +3. You may otherwise modify your copy of this Package in any way, provided +that you insert a prominent notice in each changed file stating how and +when you changed that file, and provided that you do at least ONE of the +following: + + a) place your modifications in the Public Domain or otherwise make them + Freely Available, such as by posting said modifications to Usenet or + an equivalent medium, or placing the modifications on a major archive + site such as uunet.uu.net, or by allowing the Copyright Holder to include + your modifications in the Standard Version of the Package. + + b) use the modified Package only within your corporation or organization. + + c) rename any non-standard executables so the names do not conflict + with standard executables, which must also be provided, and provide + a separate manual page for each non-standard executable that clearly + documents how it differs from the Standard Version. + + d) make other distribution arrangements with the Copyright Holder. + +4. You may distribute the programs of this Package in object code or +executable form, provided that you do at least ONE of the following: + + a) distribute a Standard Version of the executables and library files, + together with instructions (in the manual page or equivalent) on where + to get the Standard Version. + + b) accompany the distribution with the machine-readable source of + the Package with your modifications. + + c) give non-standard executables non-standard names, and clearly + document the differences in manual pages (or equivalent), together + with instructions on where to get the Standard Version. + + d) make other distribution arrangements with the Copyright Holder. + +5. You may charge a reasonable copying fee for any distribution of this +Package. You may charge any fee you choose for support of this +Package. You may not charge a fee for this Package itself. However, +you may distribute this Package in aggregate with other (possibly +commercial) programs as part of a larger (possibly commercial) software +distribution provided that you do not advertise this Package as a +product of your own. + +6. Aggregation of this Package with a commercial distribution is always +permitted provided that the use of this Package is embedded; that is, +when no overt attempt is made to make this Package's interfaces visible +to the end user of the commercial distribution. Such use shall not be +construed as a distribution of this Package. + +7. The name of the Copyright Holder may not be used to endorse or promote +products derived from this software without specific prior written permission. + +8. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED +WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + + The End + +Note: this "Artistic" license is based on the Artistic license +distributed with Perl by Larry Wall. diff -Nru acm-5.0/src/dis/COPYING acm-6.0+20200416/src/dis/COPYING --- acm-5.0/src/dis/COPYING 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/dis/COPYING 2006-01-05 13:58:55.000000000 +0000 @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 675 Mass Ave, Cambridge, MA 02139, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + Appendix: How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff -Nru acm-5.0/src/dis/COPYING.LIB acm-6.0+20200416/src/dis/COPYING.LIB --- acm-5.0/src/dis/COPYING.LIB 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/dis/COPYING.LIB 2006-01-05 13:58:55.000000000 +0000 @@ -0,0 +1,481 @@ + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 675 Mass Ave, Cambridge, MA 02139, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if +you distribute copies of the library, or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, so that any problems introduced by others will not reflect on +the original authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +General Public License (also called "this License"). Each licensee is +addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also compile or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + d) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the source code distributed need not include anything that is normally +distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Library General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + Appendix: How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff -Nru acm-5.0/src/dis/dis/datum.c acm-6.0+20200416/src/dis/dis/datum.c --- acm-5.0/src/dis/dis/datum.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/dis/dis/datum.c 2017-03-28 01:38:34.000000000 +0000 @@ -0,0 +1,362 @@ +/* + * DIS/x : An implementation of the IEEE 1278.1 protocol + * + * Copyright (C) 1996, Riley Rainey (rainey@netcom.com) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of either: + * + * a) the GNU Library General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your + * option) any later version. A description of the terms and conditions + * of the GLPL may be found in the "COPYING.LIB" file. + * + * b) the "Artistic License" which comes with this Kit. Information + * about this license may be found in the "Artistic" file. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License or the Artistic License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Information describing how to contact the author can be found in the + * README file. + */ + +#define datum_IMPORT +#include "datum.h" +#undef datum_IMPORT + +typedef struct { + datum_Type id; + char *name; +} datum_info; + +/* + * This list was originally generated with + * + * $ perl datumtbl.pl < datum.h > datumtbl.h + * + * FIXME: restore automatic generation from datumtbl.h [2017-03-26 Umberto Salsi] + */ +static datum_info lookup[] = { + { 10000, "Identification" }, + { 11000, "Entity Type" }, + { 11100, "Concatenated" }, + { 11110, "Kind" }, + { 11120, "Domain" }, + { 11130, "Country" }, + { 11140, "Category" }, + { 11150, "Subcategory" }, + { 11160, "Specific" }, + { 11170, "Extra" }, + { 11200, "Force ID" }, + { 11300, "Description" }, + { 12000, "Alternative Entity Type" }, + { 12110, "Alternate Kind" }, + { 12120, "Alternate Domain" }, + { 12130, "Alternate Country" }, + { 12140, "Alternate Category" }, + { 12150, "Alternate Subcategory" }, + { 12160, "Alternate Specific" }, + { 12170, "Alternate Extra" }, + { 12300, "Alternate Description" }, + { 13000, "Entity Marking" }, + { 13100, "Entity Marking Characters" }, + { 13200, "Crew ID" }, + { 14000, "Task Organization" }, + { 14200, "Regiment Name" }, + { 14300, "Battalion Name" }, + { 14400, "Company Name" }, + { 14500, "Platoon Name" }, + { 14520, "Squad Name" }, + { 14540, "Team Name" }, + { 14600, "Bumper Number" }, + { 14700, "Vehicle Number" }, + { 14800, "Unit Number" }, + { 15000, "DIS Identity" }, + { 15100, "DIS Site ID" }, + { 15200, "DIS Host ID" }, + { 15300, "DIS Entity ID" }, + { 20000, "Loads" }, + { 21000, "Crew Members" }, + { 21100, "Crew Member ID" }, + { 21200, "Health" }, + { 21300, "Job Assignment" }, + { 23000, "Fuel" }, + { 23100, "Quantity" }, + { 23105, "Quantity Gallons" }, + { 24000, "Ammunition" }, + { 24001, "120mm HEAT Quantity" }, + { 24002, "120mm Sabot Quantity" }, + { 24003, "127mm M8Quantity" }, + { 24004, "127mm M20Quantity" }, + { 24005, "762mm M62Quantity" }, + { 24006, "M250 U K L8 A1Quantity" }, + { 24007, "M250 U K L8 A3Quantity" }, + { 24008, "762mm M80Quantity" }, + { 24009, "12mm Quantity" }, + { 24010, "76mm Quantity" }, + { 24060, "MinesQuantity" }, + { 24100, "Ammunition Type" }, + { 24110, "Ammunition Kind" }, + { 24120, "Ammunition Domain" }, + { 24130, "Ammunition Country" }, + { 24140, "Ammunition Category" }, + { 24150, "Ammunition Subcategory" }, + { 24160, "Ammunition Extra" }, + { 24300, "Ammunition Description" }, + { 25000, "Cargo" }, + { 26000, "Vehicle Mass" }, + { 27000, "Supply Quantity" }, + { 28000, "Armament" }, + { 30000, "Status" }, + { 31000, "Position" }, + { 31100, "Mil Grid10" }, + { 31200, "Geocentric Coordinates" }, + { 31210, "Geocentric Coordinates X" }, + { 31220, "Geocentric Coordinates Y" }, + { 31230, "Geocentric Coordinates Z" }, + { 31300, "Latitude" }, + { 31400, "Longitude" }, + { 32000, "Orientation" }, + { 32100, "Hull Heading Angle" }, + { 32200, "Hull Pitch Angle" }, + { 32300, "Roll Angle" }, + { 32500, "Orientation X" }, + { 32600, "Orientation Y" }, + { 32700, "Orientation Z" }, + { 33000, "Appearance" }, + { 33100, "Ambient Lighting" }, + { 33101, "Lights" }, + { 33200, "Paint Scheme" }, + { 33300, "Smoke" }, + { 33400, "Trailing Effects" }, + { 33500, "Flaming" }, + { 33600, "Marking" }, + { 33710, "Mine Plows Attached" }, + { 33720, "Mine Rollers Attached" }, + { 33730, "Tank Turret Azimuth" }, + { 34000, "Failuresand Malfunctions" }, + { 34100, "Age" }, + { 34110, "Kilometers" }, + { 35000, "Damage" }, + { 35050, "Cause" }, + { 35100, "Mobility Kill" }, + { 35200, "Fire_ Power Kill" }, + { 35300, "Personnel Casualties" }, + { 36000, "Velocity" }, + { 36100, "X Velocity" }, + { 36200, "Y Velocity" }, + { 36300, "Z Velocity" }, + { 37000, "Acceleration" }, + { 37100, "X Acceleration" }, + { 37200, "Y Acceleration" }, + { 37300, "Z Acceleration" }, + { 38100, "Engine Status" }, + { 40000, "Exercise" }, + { 41000, "Terrain Database" }, + { 42000, "Missions" }, + { 42100, "Mission ID" }, + { 42200, "Mission Type" }, + { 42300, "Mission Request Time Stamp" }, + { 43000, "Exercise Description" }, + { 43100, "Name" }, + { 43200, "Entities" }, + { 43300, "Version" }, + { 50000, "Environment" }, + { 51000, "Weather" }, + { 51100, "Thermal Condition" }, + { 52000, "Time" }, + { 52100, "Timeof Day Discrete" }, + { 52200, "Timeof Day Continuous" }, + { 52300, "Time Mode" }, + { 52305, "Time Scene" }, + { 52310, "Current Hour" }, + { 52320, "Current Minute" }, + { 52330, "Current Second" }, + { 52340, "Azimuth" }, + { 52350, "Maximum Elevation" }, + { 52360, "Time Zone" }, + { 52400, "Time Sunrise Enabled" }, + { 52410, "Sunrise Hour" }, + { 52420, "Sunrise Minute" }, + { 52430, "Sunrise Second" }, + { 52440, "Sunrise Azimuth" }, + { 52500, "Time Sunset Enabled" }, + { 52510, "Sunset Hour" }, + { 52520, "Sunset Minute" }, + { 52530, "Sunset Second" }, + { 52600, "Date" }, + { 52610, "Month" }, + { 52620, "Day" }, + { 52630, "Year" }, + { 53000, "Clouds" }, + { 53050, "Cloud Layer Enable" }, + { 53060, "Cloud Layer Selection" }, + { 53100, "Cloud Visibility" }, + { 53200, "Cloud Base Altitude" }, + { 53250, "Cloud Base Altitude Feet" }, + { 53300, "Cloud Ceiling" }, + { 53350, "cloud Ceiling Feet" }, + { 53400, "Characteristics" }, + { 54000, "Precipitation" }, + { 54100, "Rain" }, + { 55000, "Fog" }, + { 55100, "Visibility" }, + { 55105, "Visibility Miles" }, + { 55200, "Density" }, + { 55300, "Base" }, + { 55401, "View Layer From Above" }, + { 55410, "Transition Range" }, + { 55420, "Bottom" }, + { 55425, "Bottom Feet" }, + { 55430, "Ceiling" }, + { 55435, "Ceiling Feet" }, + { 56000, "Heavenly Bodies" }, + { 56100, "Sun" }, + { 56110, "Sun Position" }, + { 56120, "Sun Position Azimuth" }, + { 56130, "Sun Position Elevation" }, + { 56140, "Sun Position Intensity" }, + { 56200, "Moon" }, + { 56210, "Moon Position" }, + { 56220, "Moon Position Azimuth" }, + { 56230, "Moon Position Elevation" }, + { 56240, "Moon Position Intensity" }, + { 56310, "Horizon" }, + { 56320, "Horizon Azimuth" }, + { 56330, "Horizon Elevation" }, + { 56340, "Horizon Heading" }, + { 56350, "Horizon Intensity" }, + { 57000, "Meteorological" }, + { 57100, "Meteorological Temperature" }, + { 57200, "Meteorological Humidity" }, + { 57300, "Meteorological Visibility" }, + { 57400, "Meteorological Winds" }, + { 57410, "Meteorological Speed" }, + { 57500, "Meteorological Rainsoak" }, + { 58000, "Haze" }, + { 58100, "Haze Visibility" }, + { 58105, "Haze Visibility Miles" }, + { 58200, "Haze Density" }, + { 58430, "Haze Ceiling" }, + { 58435, "Haze Ceiling Feet" }, + { 60000, "Communications" }, + { 61100, "Channel Type" }, + { 61101, "Channel Type1" }, + { 61200, "Channel Identification" }, + { 61300, "Alpha Identification" }, + { 61400, "Radio Identification" }, + { 61500, "Land Line Identification" }, + { 61600, "Intercom Identification" }, + { 61700, "Group Network Channel Number" }, + { 62100, "Radio Communications Status" }, + { 62200, "Stationary Radio Transmitters Default Time" }, + { 62300, "Moving Radio Transmitters Default Time" }, + { 62400, "Stationary Radio Signals Default Time" }, + { 62500, "Moving Radio Signal Default Time" }, + { 63101, "Radio Init Transec Security Key" }, + { 63102, "Radio Init Internal Noise Level" }, + { 63103, "Radio Init Squelch Threshold" }, + { 63104, "Radio Init Antenna Location" }, + { 63105, "Radio Init Antenna Pattern Type" }, + { 63106, "Radio Init Antenna Pattern Length" }, + { 63107, "Radio Init Beam Definition" }, + { 63108, "Radio Init Transmit Heartbeat Time" }, + { 63109, "Radio Init Transmit Distance Threshold" }, + { 63110, "Radio Channel Init Lockout ID" }, + { 63111, "Radio Channel Init Hopset ID" }, + { 63112, "Radio Channel Init Preset Frequency" }, + { 63113, "Radio Channel Init Frequency Sync Time" }, + { 63114, "Radio Channel Init Comsec Key" }, + { 63115, "Radio Channel Init Alpha" }, + { 70000, "Algorithm Parameters" }, + { 71000, "Dead Reckoning Algorithm" }, + { 71100, "D R A Location Threshold" }, + { 71200, "D R A Orientation Threshold" }, + { 71300, "D R A Time Threshold" }, + { 72000, "Simulation Management Parameters" }, + { 72100, "Checkpoint Interval" }, + { 72600, "Transmitter Time Threshold" }, + { 72700, "Receiver Time Threshold" }, + { 73000, "Interoperability Mode" }, + { 74000, "S I M N E T Data Collection" }, + { 75000, "Event ID" }, + { 75100, "Source Site ID" }, + { 75200, "Source Host ID" }, + { 90000, "Articulated Part" }, + { 90050, "Articulated Part ID" }, + { 90070, "Articulated Part Index" }, + { 90100, "Articulated Part Position" }, + { 90200, "Articulated Part Position Rate" }, + { 90300, "Articulated Part Extension" }, + { 90400, "Articulated Part Extension Rate" }, + { 90500, "Articulated Part X" }, + { 90600, "Articulated Part X Rate" }, + { 90700, "Articulated Part Y" }, + { 90800, "Articulated Part Y Rate" }, + { 90900, "Articulated Part Z" }, + { 91000, "Articulated Part Z Rate" }, + { 91100, "Articulated Part Azimuth" }, + { 91200, "Articulated Part Azimuth Rate" }, + { 91300, "Articulated Part Elevation" }, + { 91400, "Articulated Part Elevation Rate" }, + { 91500, "Articulated Part Rotation" }, + { 91600, "Articulated Part Rotation Rate" }, + { 100001, "D R A Angular X Velocity" }, + { 100002, "D R A Angular Y Velocity" }, + { 100003, "D R A Angular Z Velocity" }, + { 100004, "Appearance Trailing Effects" }, + { 100005, "Appearance Hatch" }, + { 100008, "Appearance Character Set" }, + { 100010, "Capability Ammunition Supplier" }, + { 100011, "Capability Miscellaneous Supplier" }, + { 100012, "Capability Repair Provider" }, + { 100014, "Articulation Parameter" }, + { 100047, "Articulation Parameter Type" }, + { 100048, "Articulation Parameter Value" }, + { 100058, "Timeof Day Scene" }, +}; + + +char * datum_lookupDatumIDName(datum_Type id) +{ + int i; + + for (i = 0; lookup[i].id != 0; ++i) { + if (lookup[i].id == id) { + return lookup[i].name; + } + } + return (char *) 0; +} + + +/* +dis_variable_datum * +DISCreateVariableDatumString(datum_Type id, char *s, int str_len) +{ + dis_variable_datum *p; + int len = ((str_len + 7) / 8) * 8; + + p = (dis_variable_datum *) + memory_allocate(sizeof(dis_variable_datum) + len, NULL); + + if (!p) { + return p; + } + + p->datum_id = id; + p->value_length = str_len * 8; + p->value.ptr_value = (unsigned char *) (p + 1); + + memset(p->value.ptr_value, 0, len); + memcpy(p->value.ptr_value, s, str_len); + return p; +} +*/ \ No newline at end of file diff -Nru acm-5.0/src/dis/dis/datum.h acm-6.0+20200416/src/dis/dis/datum.h --- acm-5.0/src/dis/dis/datum.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/dis/dis/datum.h 2017-03-28 01:38:34.000000000 +0000 @@ -0,0 +1,338 @@ +/* + * DIS/x : An implementation of the IEEE 1278.1 protocol + * + * Copyright (C) 1996, Riley Rainey (rainey@netcom.com) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of either: + * + * a) the GNU Library General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your + * option) any later version. A description of the terms and conditions + * of the GLPL may be found in the "COPYING.LIB" file. + * + * b) the "Artistic License" which comes with this Kit. Information + * about this license may be found in the "Artistic" file. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License or the Artistic License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Information describing how to contact the author can be found in the + * README file. + */ + +#ifndef DATUM_H +#define DATUM_H + +#ifdef datum_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +/** + * This enumerative type was prepared from values listed in: + * + * "Enumeration and Bit-Encoded Values for use with + * IEEE 1278.1 - 1994, Distributed Interactive Simulation -- + * Application Protocols" + * + * Document Number: IST-CR-93-46 + * Date: March 1994 + * + * Copyright (C) 1995, Riley Rainey, riley@netcom.com + * + * DATUM IDENTIFIERS + * + * Problem: Which are fixed and which are variable ??? + */ +typedef enum { + datum_Identification = 10000, /* */ + datum_EntityType = 11000, /* */ + datum_Concatenated = 11100, /* */ + datum_Kind = 11110, /* u_long */ + datum_Domain = 11120, /* u_long */ + datum_Country = 11130, /* u_long */ + datum_Category = 11140, /* u_long */ + datum_Subcategory = 11150, /* u_long */ + datum_Specific = 11160, /* u_long */ + datum_Extra = 11170, /* u_long */ + datum_ForceID = 11200, /* u_long */ + datum_Description = 11300, /* */ + datum_AlternativeEntityType = 12000, /* */ + datum_AltKind = 12110, /* u_long */ + datum_AltDomain = 12120, /* u_long */ + datum_AltCountry = 12130, /* u_long */ + datum_AltCategory = 12140, /* u_long */ + datum_AltSubcategory = 12150, /* u_long */ + datum_AltSpecific = 12160, /* u_long */ + datum_AltExtra = 12170, /* u_long */ + datum_AltDescription = 12300, /* */ + datum_EntityMarking = 13000, /* */ + datum_EntityMarkingCharacters = 13100, /* char[10] */ + datum_CrewID = 13200, /* char[10] */ + datum_TaskOrganization = 14000, /* */ + datum_RegimentName = 14200, /* String */ + datum_BattalionName = 14300, /* String */ + datum_CompanyName = 14400, /* String */ + datum_PlatoonName = 14500, /* */ + datum_SquadName = 14520, /* */ + datum_TeamName = 14540, /* */ + datum_BumperNumber = 14600, /* */ + datum_VehicleNumber = 14700, /* */ + datum_UnitNumber = 14800, /* */ + datum_DISIdentity = 15000, /* */ + datum_DISSiteID = 15100, /* */ + datum_DISHostID = 15200, /* */ + datum_DISEntityID = 15300, /* */ + datum_Loads = 20000, /* */ + datum_CrewMembers = 21000, /* */ + datum_CrewMemberID = 21100, /* */ + datum_Health = 21200, /* */ + datum_JobAssignment = 21300, /* String */ + datum_Fuel = 23000, /* */ + datum_Quantity = 23100, /* Liters */ + datum_QuantityGallons = 23105, /* Gallons */ + datum_Ammunition = 24000, /* */ + datum_120mmHEATquantity = 24001, /* Rounds */ + datum_120mmSABOTquantity = 24002, /* Rounds */ + datum_127mmM8quantity = 24003, /* Rounds */ + datum_127mmM20quantity = 24004, /* Rounds */ + datum_762mmM62quantity = 24005, /* Rounds */ + datum_M250UKL8A1quantity = 24006, /* Grenades */ + datum_M250UKL8A3quantity = 24007, /* Grenades */ + datum_762mmM80quantity = 24008, /* Rounds */ + datum_127mmquantity = 24009, /* Rounds */ + datum_762mmquantity = 24010, /* Rounds */ + datum_Minesquantity = 24060, /* Mines */ + datum_AmmunitionType = 24100, /* */ + datum_AmmunitionKind = 24110, /* */ + datum_AmmunitionDomain = 24120, /* */ + datum_AmmunitionCountry = 24130, /* */ + datum_AmmunitionCategory = 24140, /* */ + datum_AmmunitionSubcategory = 24150, /* */ + datum_AmmunitionExtra = 24160, /* */ + datum_AmmunitionDescription = 24300, /* */ + datum_Cargo = 25000, /* */ + datum_VehicleMass = 26000, /* u_long */ + datum_SupplyQuantity = 27000, /* */ + datum_Armament = 28000, /* Boolean */ + datum_Status = 30000, /* */ + datum_Position = 31000, /* */ + datum_MilGrid10 = 31100, /* */ + datum_GeocentricCoordinates = 31200, /* */ + datum_GeocentricCoordinatesX = 31210, /* u_long */ + datum_GeocentricCoordinatesY = 31220, /* u_long */ + datum_GeocentricCoordinatesZ = 31230, /* u_long */ + datum_Latitude = 31300, /* */ + datum_Longitude = 31400, /* */ + datum_Orientation = 32000, /* */ + datum_HullHeadingAngle = 32100, /* Degrees */ + datum_HullPitchAngle = 32200, /* */ + datum_RollAngle = 32300, /* */ + datum_OrientationX = 32500, /* u_long */ + datum_OrientationY = 32600, /* u_long */ + datum_OrientationZ = 32700, /* u_long */ + datum_Appearance = 33000, /* */ + datum_AmbientLighting = 33100, /* */ + datum_Lights = 33101, /* */ + datum_PaintScheme = 33200, /* */ + datum_Smoke = 33300, /* */ + datum_TrailingEffects = 33400, /* */ + datum_Flaming = 33500, /* */ + datum_Marking = 33600, /* */ + datum_MinePlowsAttached = 33710, /* */ + datum_MineRollersAttached = 33720, /* */ + datum_TankTurretAzimuth = 33730, /* Degrees */ + datum_FailuresandMalfunctions = 34000, /* */ + datum_Age = 34100, /* Miles */ + datum_Kilometers = 34110, /* */ + datum_Damage = 35000, /* */ + datum_Cause = 35050, /* */ + datum_MobilityKill = 35100, /* */ + datum_Fire_PowerKill = 35200, /* */ + datum_PersonnelCasualties = 35300, /* */ + datum_Velocity = 36000, /* */ + datum_XVelocity = 36100, /* Meters/sec */ + datum_YVelocity = 36200, /* Meters/sec */ + datum_ZVelocity = 36300, /* Meters/sec */ + datum_Acceleration = 37000, /* */ + datum_XAcceleration = 37100, /* */ + datum_YAcceleration = 37200, /* */ + datum_ZAcceleration = 37300, /* */ + datum_EngineStatus = 38100, /* */ + datum_Exercise = 40000, /* */ + datum_TerrainDatabase = 41000, /* */ + datum_Missions = 42000, /* */ + datum_MissionID = 42100, /* */ + datum_MissionType = 42200, /* */ + datum_MissionRequestTimeStamp = 42300, /* */ + datum_ExerciseDescription = 43000, /* String */ + datum_Name = 43100, /* String */ + datum_Entities = 43200, /* Integer */ + datum_Version = 43300, /* */ + datum_Environment = 50000, /* */ + datum_Weather = 51000, /* */ + datum_ThermalCondition = 51100, /* */ + datum_Time = 52000, /* */ + datum_TimeofDayDiscrete = 52100, /* */ + datum_TimeofDayContinuous = 52200, /* */ + datum_TimeMode = 52300, /* */ + datum_TimeScene = 52305, /* */ + datum_CurrentHour = 52310, /* */ + datum_CurrentMinute = 52320, /* */ + datum_CurrentSecond = 52330, /* */ + datum_Azimuth = 52340, /* */ + datum_MaximumElevation = 52350, /* */ + datum_TimeZone = 52360, /* */ + datum_TimeSunriseEnabled = 52400, /* */ + datum_SunriseHour = 52410, /* */ + datum_SunriseMinute = 52420, /* */ + datum_SunriseSecond = 52430, /* */ + datum_SunriseAzimuth = 52440, /* */ + datum_TimeSunsetEnabled = 52500, /* */ + datum_SunsetHour = 52510, /* */ + datum_SunsetMinute = 52520, /* */ + datum_SunsetSecond = 52530, /* */ + datum_Date = 52600, /* */ + datum_Month = 52610, /* */ + datum_Day = 52620, /* */ + datum_Year = 52630, /* */ + datum_Clouds = 53000, /* */ + datum_CloudLayerEnable = 53050, /* */ + datum_CloudLayerSelection = 53060, /* */ + datum_CloudVisibility = 53100, /* */ + datum_CloudBaseAltitude = 53200, /* Meters */ + datum_CloudBaseAltitudeFeet = 53250, /* Feet */ + datum_CloudCeiling = 53300, /* Meters */ + datum_cloudCeilingFeet = 53350, /* Feet */ + datum_Characteristics = 53400, /* */ + datum_Precipitation = 54000, /* */ + datum_Rain = 54100, /* Boolean */ + datum_Fog = 55000, /* Boolean */ + datum_Visibility = 55100, /* Meters */ + datum_VisibilityMiles = 55105, /* Miles */ + datum_Density = 55200, /* */ + datum_Base = 55300, /* */ + datum_ViewLayerFromAbove = 55401, /* */ + datum_TransitionRange = 55410, /* */ + datum_Bottom = 55420, /* Meters */ + datum_BottomFeet = 55425, /* Feet */ + datum_Ceiling = 55430, /* Meters */ + datum_CeilingFeet = 55435, /* Feet */ + datum_HeavenlyBodies = 56000, /* */ + datum_Sun = 56100, /* */ + datum_SunPosition = 56110, /* */ + datum_SunPositionAzimuth = 56120, /* */ + datum_SunPositionElevation = 56130, /* */ + datum_SunPositionIntensity = 56140, /* */ + datum_Moon = 56200, /* */ + datum_MoonPosition = 56210, /* */ + datum_MoonPositionAzimuth = 56220, /* */ + datum_MoonPositionElevation = 56230, /* */ + datum_MoonPositionIntensity = 56240, /* */ + datum_Horizon = 56310, /* */ + datum_HorizonAzimuth = 56320, /* */ + datum_HorizonElevation = 56330, /* */ + datum_HorizonHeading = 56340, /* */ + datum_HorizonIntensity = 56350, /* */ + datum_Meteorological = 57000, /* */ + datum_MeteorologicalTemperature = 57100, /* */ + datum_MeteorologicalHumidity = 57200, /* */ + datum_MeteorologicalVisibility = 57300, /* */ + datum_MeteorologicalWinds = 57400, /* */ + datum_MeteorologicalSpeed = 57410, /* */ + datum_MeteorologicalRainsoak = 57500, /* */ + datum_Haze = 58000, /* Boolean */ + datum_HazeVisibility = 58100, /* Meters */ + datum_HazeVisibilityMiles = 58105, /* Miles */ + datum_HazeDensity = 58200, /* */ + datum_HazeCeiling = 58430, /* Meters */ + datum_HazeCeilingFeet = 58435, /* Feet */ + datum_Communications = 60000, /* */ + datum_ChannelType = 61100, /* */ + datum_ChannelType1 = 61101, /* */ + datum_ChannelIdentification = 61200, /* */ + datum_AlphaIdentification = 61300, /* */ + datum_RadioIdentification = 61400, /* */ + datum_LandLineIdentification = 61500, /* */ + datum_IntercomIdentification = 61600, /* */ + datum_GroupNetworkChannelNumber = 61700, /* */ + datum_RadioCommunicationsStatus = 62100, /* */ + datum_StationaryRadioTransmittersDefaultTime = 62200, /* u_long */ + datum_MovingRadioTransmittersDefaultTime = 62300, /* u_long */ + datum_StationaryRadioSignalsDefaultTime = 62400, /* */ + datum_MovingRadioSignalDefaultTime = 62500, /* */ + datum_RadioInitTransecSecurityKey = 63101, /* variable */ + datum_RadioInitInternalNoiseLevel = 63102, /* variable */ + datum_RadioInitSquelchThreshold = 63103, /* variable */ + datum_RadioInitAntennaLocation = 63104, /* variable */ + datum_RadioInitAntennaPatternType = 63105, /* variable */ + datum_RadioInitAntennaPatternLength = 63106, /* variable */ + datum_RadioInitBeamDefinition = 63107, /* variable */ + datum_RadioInitTransmitHeartbeatTime = 63108, /* variable */ + datum_RadioInitTransmitDistanceThreshold = 63109, /* variable */ + datum_RadioChannelInitLockoutID = 63110, /* variable */ + datum_RadioChannelInitHopsetID = 63111, /* variable */ + datum_RadioChannelInitPresetFrequency = 63112, /* variable */ + datum_RadioChannelInitFrequencySyncTime = 63113, /* variable */ + datum_RadioChannelInitComsecKey = 63114, /* variable */ + datum_RadioChannelInitAlpha = 63115, /* variable */ + datum_AlgorithmParameters = 70000, /* */ + datum_DeadReckoningAlgorithm = 71000, /* */ + datum_DRALocationThreshold = 71100, /* u_long */ + datum_DRAOrientationThreshold = 71200, /* */ + datum_DRATimeThreshold = 71300, /* */ + datum_SimulationManagementParameters = 72000, /* */ + datum_CheckpointInterval = 72100, /* */ + datum_TransmitterTimeThreshold = 72600, /* */ + datum_ReceiverTimeThreshold = 72700, /* */ + datum_InteroperabilityMode = 73000, /* */ + datum_SIMNETDataCollection = 74000, /* variable* */ + datum_EventID = 75000, /* */ + datum_SourceSiteID = 75100, /* */ + datum_SourceHostID = 75200, /* */ + datum_ArticulatedPart = 90000, /* */ + datum_ArticulatedPartID = 90050, /* */ + datum_ArticulatedPartIndex = 90070, /* */ + datum_ArticulatedPartPosition = 90100, /* */ + datum_ArticulatedPartPositionRate = 90200, /* */ + datum_ArticulatedPartExtension = 90300, /* */ + datum_ArticulatedPartExtensionRate = 90400, /* */ + datum_ArticulatedPartX = 90500, /* */ + datum_ArticulatedPartXRate = 90600, /* */ + datum_ArticulatedPartY = 90700, /* */ + datum_ArticulatedPartYRate = 90800, /* */ + datum_ArticulatedPartZ = 90900, /* */ + datum_ArticulatedPartZRate = 91000, /* */ + datum_ArticulatedPartAzimuth = 91100, /* */ + datum_ArticulatedPartAzimuthRate = 91200, /* */ + datum_ArticulatedPartElevation = 91300, /* */ + datum_ArticulatedPartElevationRate = 91400, /* */ + datum_ArticulatedPartRotation = 91500, /* */ + datum_ArticulatedPartRotationRate = 91600, /* */ + datum_DRAAngularXVelocity = 100001, /* */ + datum_DRAAngularYVelocity = 100002, /* */ + datum_DRAAngularZVelocity = 100003, /* */ + datum_AppearanceTrailingEffects = 100004, /* */ + datum_AppearanceHatch = 100005, /* */ + datum_AppearanceCharacterSet = 100008, /* */ + datum_CapabilityAmmunitionSupplier = 100010, /* */ + datum_CapabilityMiscellaneousSupplier = 100011, /* */ + datum_CapabilityRepairProvider = 100012, /* */ + datum_ArticulationParameter = 100014, /* */ + datum_ArticulationParameterType = 100047, /* */ + datum_ArticulationParameterValue = 100048, /* */ + datum_TimeofDayScene = 100058 /* */ +} datum_Type; + +EXTERN char * datum_lookupDatumIDName(datum_Type id); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/dis/dis/dis.c acm-6.0+20200416/src/dis/dis/dis.c --- acm-5.0/src/dis/dis/dis.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/dis/dis/dis.c 2018-04-02 06:09:56.000000000 +0000 @@ -0,0 +1,1380 @@ +/* + * DIS/x : An implementation of the IEEE 1278.1 protocol + * + * Copyright (C) 1997, Riley Rainey (rrainey@ix.netcom.com) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of either: + * + * a) the GNU Library General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your + * option) any later version. A description of the terms and conditions + * of the GLPL may be found in the "COPYING.LIB" file. + * + * b) the "Artistic License" which comes with this Kit. Information + * about this license may be found in the "Artistic" file. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License or the Artistic License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Information describing how to contact the author can be found in the + * README file. + */ +#ifdef WINNT +#define WINVER WindowsXP +#endif +#include +#include +#include +#include +#include +#ifdef WINNT +#include +#include +#else +#include +#include +#include +#include +#endif +#include +#include +#include +#include + +#include "../../util/error.h" +#include "../../util/memory.h" +#include "xdr.h" +#include "xdr_dis.h" +#include "datum.h" + +#define dis_IMPORT +#include "dis.h" + +#ifdef WINNT + // recvmsg() not available under WINNT. + #undef HAVE_RECVMSG +#else + #define HAVE_RECVMSG + // Cope with slightly different field names of msghdr: Solaris and BSD call + // them "msg_accessright...", any other system calls them "msg_control...". + #undef HAVE_MSG_ACCRIGHTS + #define HAVE_MSG_CONTROL +#endif + +#define MILLION 1000000 +#define dis_timestamp_const 2147483646L /* 2 ^ 31 - 1 */ + +#ifdef WINNT +typedef __int64 my_quad_t; +#else +typedef long long my_quad_t; +#endif + +#ifdef WINNT +#else +#define INVALID_SOCKET -1 +#define SOCKET_ERROR -1 +#endif + + +#ifdef WINNT + +static char *errorCodeToString(int code) +{ + static char s[999]; + char win_err_descr[900]; + DWORD err = FormatMessageA( + FORMAT_MESSAGE_FROM_SYSTEM, + NULL, + code, + LANG_SYSTEM_DEFAULT, + win_err_descr, + sizeof(win_err_descr), + NULL + ); + if( err > 0 ){ + snprintf(s, sizeof(s), "%s (Windows error code %d)", win_err_descr, code); + } else { + snprintf(s, sizeof(s), "error code %d (description not available: FormatMessageA() failed with code %lu)", code, err); + } + return s; +} + +#endif + + +DISForce dis_parseForce(char *s) +{ + if( s == NULL ) + return -1; + else if( strcmp(s, "Other") == 0 ) + return DISForceOther; + else if( strcmp(s, "Friendly") == 0 ) + return DISForceFriendly; + else if( strcmp(s, "Opposing") == 0 ) + return DISForceOpposing; + else if( strcmp(s, "Neutral") == 0 ) + return DISForceNeutral; + else + return -1; +} + + +char * dis_forceToString(DISForce force) +{ + switch(force){ + case DISForceOther: return "Other"; + case DISForceFriendly: return "Friendly"; + case DISForceOpposing: return "Opposing"; + case DISForceNeutral: return "Neutral"; + default: error_internal("invalid force: %d", force); + } +} + + +int dis_entityWildcardMatch (const dis_entity_type *in, + const dis_entity_type *pattern, + const dis_entity_type *pattern_mask) +{ + if (pattern_mask->kind == 0 || + pattern->kind == in->kind) { + + if (pattern_mask->domain == 0 || + pattern->domain == in->domain) { + + if (pattern_mask->country == 0 || + pattern->country == in->country) { + + if (pattern_mask->category == 0 || + pattern->category == in->category) { + + if (pattern_mask->subcategory == 0 || + pattern->subcategory == in->subcategory) { + + if (pattern_mask->specific == 0 || + pattern->specific == in->specific) { + + if (pattern_mask->extra == 0 || + pattern->extra == in->extra) { + return 1; + } + + } + + } + + } + + } + + } + + } + + return 0; +} + +dis_Result +dis_addArticulationParm(dis_entity_state_pdu * esp, dis_articulation_parm * parm, int *parmID) +{ + int n = esp->art_parm_count + 1; + + if (esp->art_parm_count == 0) { + esp->art_parm = (dis_articulation_parm *) + memory_allocate(sizeof(dis_articulation_parm), NULL); + } + else { + esp->art_parm = (dis_articulation_parm *) + memory_realloc(esp->art_parm, sizeof(dis_articulation_parm) * n); + } + +/* + * Return an error if the memory could not be allocated + */ + + if (esp->art_parm == NULL) { + esp->art_parm_count = 0; + return dis_RESULT_NO_MEMORY; + } + + esp->art_parm[esp->art_parm_count] = *parm; + esp->art_parm_count = n; + *parmID = n; + return dis_RESULT_OK; +} + +int +dis_setNBIOState(dis_Transceiver * xcvr, int state) +{ +#ifdef WINNT + unsigned long int i; +#else + int i; +#endif + + i = (state) ? 1 : 0; + +#ifdef WINNT + if (ioctlsocket(xcvr->s, FIONBIO, &i) != 0) { +#else + if (ioctl(xcvr->s, FIONBIO, &i) != 0) { +#endif + return -1; + } + return 0; +} + +dis_Transceiver * +dis_openTransceiver(int isServer, char *host_name, int host_port) +{ +#ifdef WINNT + //char Hostname[100]; + //HOSTENT *pHostEnt; + //char *ad; + +#else + char buf[BUFSIZ]; + int n; + struct ifconf ifc; + struct ifreq *ifr; + +#endif + int s, i = 0; + int on = 1; + dis_Transceiver *xcvr; + int isClient, useBroadcast; + + /* Empty host name is the same as NULL: */ + if( host_name != NULL && host_name[0] == 0 ) + host_name = NULL; + + /* Check port range: */ + if( !(0 <= host_port && host_port <= 65535) ) + error_internal("expected host port in [0,65535], %d given", host_port); + + isClient = ! isServer; + useBroadcast = isClient && host_name == NULL; + +#ifdef WINNT + /* + * Initialize Windows sockets DLL. + */ + WORD wVersionRequested; + WSADATA wsaData; + int err; + + wVersionRequested = MAKEWORD(2, 2); + + err = WSAStartup(wVersionRequested, &wsaData); + if (err != 0) { + fprintf(stderr, "failed initializing Winsock.dll -- error code from WSAStartup() is %d\n", err); + return NULL; + } + + if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) { + fprintf(stderr, "could not find a usable version of Winsock.dll\n"); + WSACleanup(); + return NULL; + } +#endif + + /* Create socket: */ + if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET) { + perror("failed creating Internet socket"); + return NULL; + } + + /* + * If client without relay server, enable broadcasting on any interface + * on the specified port: + */ + if( isClient && host_name == NULL ){ + + struct sockaddr_in sin; + + if( useBroadcast ){ + if (setsockopt(s, SOL_SOCKET, SO_BROADCAST, (char *) &on, + sizeof(on)) == SOCKET_ERROR) { +#ifdef WINNT + errno = WSAGetLastError(); +#endif + perror("can't set broadcast flag"); + return NULL; + } + + if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *) &on, + sizeof(on)) == SOCKET_ERROR) { + perror("can't reuse broadcast port"); + return NULL; + } + } + + sin.sin_family = AF_INET; + sin.sin_addr.s_addr = htonl(INADDR_ANY); + sin.sin_port = htons(host_port); + if( bind(s, (struct sockaddr *) &sin, sizeof(sin)) != 0 ){ + perror("bind()"); + return NULL; + } + } + + if( isServer ){ + + struct sockaddr_in sin; + + if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *) &on, + sizeof(on)) == SOCKET_ERROR) { + perror("can't reuse port"); + return NULL; + } + + sin.sin_family = AF_INET; + sin.sin_addr.s_addr = htonl(INADDR_ANY); + sin.sin_port = htons(host_port); + if( bind(s, (struct sockaddr *) &sin, sizeof(sin)) != 0 ){ + perror("bind()"); + return NULL; + } + } + + /* + * Allocate and initialize the transceiver structure. + */ + + xcvr = (dis_Transceiver *) memory_allocate(sizeof(dis_Transceiver), NULL); + xcvr->s = 0; + xcvr->num_dest = 0; + xcvr->s = s; + + /* + * If client with relay server, configure a single destination: + */ + if ( isClient && host_name != NULL ) { + char service[6]; + struct addrinfo hints; + struct addrinfo *results; + + /* Retrieves list of available matching relay host services: */ + memory_zero(&hints); + hints.ai_family = AF_INET; + hints.ai_socktype = SOCK_DGRAM; + hints.ai_protocol = 0; + hints.ai_flags = 0; + sprintf(service, "%d", host_port); + int err = getaddrinfo(host_name, service, &hints, &results); + if( err != 0 ){ + fprintf(stderr, "Failed retrieving info for %s:%d: %s\n", + host_name, host_port, gai_strerror(err)); + close(s); + memory_dispose(xcvr); + return NULL; + } + if( results == NULL ){ + fprintf(stderr, "The host %s:%d does not support IPv4 datagrams\n", + host_name, host_port); + freeaddrinfo(results); + close(s); + memory_dispose(xcvr); + return NULL; + } + /* ...and use the first matching result: */ + xcvr->dest[0].addr = *((struct sockaddr_in *)(results->ai_addr)); + xcvr->dest[0].type = 1; + xcvr->num_dest = 1; + freeaddrinfo(results); + return xcvr; + } + + /* + * Currently the relay server uses its own sending function, so no need to + * configure the destinations for it. + */ + if( isServer ){ + xcvr->num_dest = 0; + return xcvr; + } + +/* + * Client using broadcast: configure all the available interfaces. + * + * Determine how many interfaces are configured on the local system. + */ + +#ifdef WINNT +#ifdef notdef + gethostname(Hostname, sizeof(Hostname)); + pHostEnt = gethostbyname(Hostname); + + i = 0; + while (pHostEnt->h_addr_list[i]) { + // pHostEnt->h_addr_list[i] - the current address in host order + ad = pHostEnt->h_addr_list[i]; + bcopy((char *) ad, + (char *) &xcvr->dest[i].addr.sin_addr, + sizeof(xcvr->dest[i].addr)); + bcopy((char *) ad, + (char *) x, + 4); + xcvr->dest[i].addr.sin_family = AF_INET; + xcvr->dest[i].addr.sin_port = htons(host_port); + xcvr->dest[i].type = 0; + i++; + } +#endif + xcvr->dest[0].addr.sin_family = AF_INET; + xcvr->dest[0].addr.sin_addr.S_un.S_addr = INADDR_BROADCAST; + xcvr->dest[0].addr.sin_port = htons(host_port); + xcvr->dest[0].type = 0; + i = 1; + +#else + + ifc.ifc_len = BUFSIZ; + ifc.ifc_ifcu.ifcu_buf = buf; + if (ioctl(s, SIOCGIFCONF, (char *) &ifc) < 0) { + perror("error getting interface configuration"); + close(s); + memory_dispose(xcvr); + return NULL; + } + + n = ifc.ifc_len / sizeof(struct ifreq); + +/* + * Insure that there are enough elements in blist to accomodate all interfaces. + */ + + if (n > 32) { + fprintf(stderr, "Too many host interfaces: %d\n", n); + memory_dispose(xcvr); + return NULL; + } + + for (ifr = ifc.ifc_req; --n >= 0; ifr++) { + +/* + * We're only interested in Internet domain interfaces + */ + + if (ifr->ifr_addr.sa_family != AF_INET) + continue; + + if (ioctl(s, SIOCGIFFLAGS, (char *) ifr) < 0) { + perror("error getting interface flags"); + close(s); + memory_dispose(xcvr); + return NULL; + } + +/* + * Skip boring cases ... + */ + + if( (ifr->ifr_flags & IFF_UP) == 0) + /* Ignore interface down. */ + continue; + + if( (ifr->ifr_flags & IFF_LOOPBACK) != 0 ) + /* Ignore loopback interface. */ + continue; + +/* + * Get the appropriate broadcast address based on the interface type. + */ + + if (! useBroadcast && ifr->ifr_flags & IFF_POINTOPOINT) { + if (ioctl(s, SIOCGIFDSTADDR, (char *) ifr) < 0) { + close(s); + perror("error getting address"); + memory_dispose(xcvr); + return NULL; + } + + bcopy((char *) &ifr->ifr_dstaddr, + (char *) &xcvr->dest[i].addr, + sizeof(ifr->ifr_dstaddr)); + + } + else if (useBroadcast && ifr->ifr_flags & IFF_BROADCAST) { + if (ioctl(s, SIOCGIFBRDADDR, (char *) ifr) < 0) { + close(s); + perror("error getting broadcast address"); + memory_dispose(xcvr); + return NULL; + } + + bcopy((char *) &ifr->ifr_broadaddr, + (char *) &xcvr->dest[i].addr, + sizeof(ifr->ifr_broadaddr)); + + } + else { + continue; + } + + xcvr->dest[i].addr.sin_port = htons(host_port); + xcvr->dest[i].type = 0; + i++; + + } + +#endif /* not WINNT */ + + xcvr->num_dest = i; + + return xcvr; +} + +void +dis_closeTransceiver(dis_Transceiver * xcvr) +{ + if( xcvr == NULL ) + return; +#ifdef WINNT + shutdown(xcvr->s, SD_BOTH); + closesocket(xcvr->s); + WSACleanup(); +#else + close(xcvr->s); +#endif + memory_dispose(xcvr); +} + +int +dis_readPDU(dis_Transceiver * xcvr, dis_pdu * pdu) +{ + char buffer[2048]; + int size; + xdr_Type *xdr; + +#ifdef HAVE_RECVMSG + struct sockaddr from; + struct msghdr msg; + struct iovec vec; +#endif + +read_next_pdu: +#ifdef HAVE_RECVMSG + msg.msg_name = (caddr_t) & from; + msg.msg_namelen = sizeof(from); + msg.msg_iov = &vec; + msg.msg_iovlen = 1; +#ifdef HAVE_MSG_ACCRIGHTS + msg.msg_accrights = (caddr_t) NULL; + msg.msg_accrightslen = 0; +#endif +#ifdef HAVE_MSG_CONTROL + msg.msg_control = (caddr_t) NULL; + msg.msg_controllen = 0; +#endif + vec.iov_base = (caddr_t) & buffer; + vec.iov_len = sizeof(buffer); + + size = recvmsg(xcvr->s, &msg, 0); +#else + size = recv(xcvr->s, buffer, sizeof(buffer), 0); +#endif + + if (size == -1) { + return 0; + } + + xdr = xdr_new(buffer, size, xdr_DECODE); + + if( ! xdr_dis_pdu(xdr, pdu) ){ + fprintf(stderr, "ERROR: failed decoding received PDU: %s\n", + xdr_getErrorDescription(xdr)); + xdr_free(xdr); + goto read_next_pdu; + } + + if( xdr_getpos(xdr) != pdu->hdr.length ){ + fprintf(stderr, "ERROR: failed decoding received PDU: stated length %d does not match actual packet length %d\n", + pdu->hdr.length, xdr_getpos(xdr)); + xdr_free(xdr); + goto read_next_pdu; + } + + xdr_free(xdr); + + return 1; +} + +int +dis_writePDU(dis_Transceiver * xcvr, dis_pdu * pdu) +{ + char buffer[2048], *p; + +#ifdef HAVE_RECVMSG + struct msghdr msg; + struct iovec vec; +#endif + xdr_Type *xdr; + int i, len; + int err = 0; + +/* + * Fill-out any length fields internal to the PDU (other than the length + * field in the header. + */ + + dis_addPDUSizes(pdu); + + xdr = xdr_new(buffer, sizeof(buffer), xdr_ENCODE); + + if( ! xdr_dis_pdu(xdr, pdu) ) + error_internal("dis_writePDU(): failed encoding packet: %s", + xdr_getErrorDescription(xdr)); + + len = xdr_getpos(xdr); + + xdr_free(xdr); + +/* + * Now for a hack. We need to insert the correct packet length into + * the PDU header. The header is somewhat stable from one protocol release + * to the next, so I've just hard-coded it here. + */ + + p = buffer + 8; + *((u_short *) p) = htons(len); + +#ifdef HAVE_RECVMSG + + msg.msg_namelen = sizeof(struct sockaddr); + + msg.msg_iov = &vec; + msg.msg_iovlen = 1; +#ifdef HAVE_MSG_ACCRIGHTS + msg.msg_accrights = (caddr_t) NULL; + msg.msg_accrightslen = 0; +#endif +#ifdef HAVE_MSG_CONTROL + msg.msg_control = (caddr_t) NULL; + msg.msg_controllen = 0; +#endif + vec.iov_base = (caddr_t) & buffer; + vec.iov_len = len; + + for (i = 0; i < xcvr->num_dest; ++i) { + msg.msg_name = (caddr_t) & xcvr->dest[i].addr; + if (sendmsg(xcvr->s, &msg, 0) == -1) { + perror("on sendmsg"); + err = 1; + } + }; + +#else + + for (i = 0; i < xcvr->num_dest; ++i) { + if (sendto(xcvr->s, buffer, len, 0, + (struct sockaddr *) &xcvr->dest[i].addr, + sizeof(struct sockaddr)) == -1) { +#ifdef WINNT + fprintf(stderr, "failed sending packet: %s\n", errorCodeToString(WSAGetLastError())); +#else + perror("sendto()"); +#endif + } + }; + +#endif + + if( err ) + fprintf(stderr, "ERROR: failed sending DIS PDU to at least one destination address.\n"); + + return ! err; +} + + +static void dis_disposeVariableDatum(dis_variable_datum *v) +{ + /* + * BEWARE. + * ====== + * Here anything other than the types listed below is assumed + * to be a dynamically allocated string. The same assumption + * holds for xdr_dis_variable_datum() so both functions MUST be + * kept in sync. + */ + if( !( v->datum_id == datum_GeocentricCoordinatesX + || v->datum_id == datum_GeocentricCoordinatesY + || v->datum_id == datum_GeocentricCoordinatesZ + ) + ){ + memory_dispose(v->value.ptr_value); + } +} + + +void +dis_freePDUComponents(dis_pdu * p) +{ + int i, j; + + if( p == NULL ) + return; + + switch (p->hdr.pdu_type) { + + case PDUTypeDetonation: + { + dis_detonation_pdu *det = (dis_detonation_pdu *) p; + if (det->num_art_parms > 0) { + memory_dispose(det->art_parm); + } + } + break; + + case PDUTypeEmission: + { + dis_em_emission_pdu *pdu = (dis_em_emission_pdu *) p; + dis_em_system_info *s = pdu->system; + dis_beam_info *b; + + for (i = 0; i < pdu->num_systems; ++i, ++s) { + b = s->beam; + for (j = 0; j < s->num_beams; ++j, ++b) { + if (b->num_targets > 0) { + memory_dispose((char *) b->tracked_target); + } + } + if (s->num_beams > 0) { + memory_dispose(s->beam); + } + } + if (pdu->num_systems > 0) { + memory_dispose(pdu->system); + } + } + break; + + case PDUTypeEntityState: + { + dis_entity_state_pdu *pdu = (dis_entity_state_pdu *) p; + + if (pdu->art_parm_count > 0) { + memory_dispose(pdu->art_parm); + } + } + break; + + case PDUTypeComment: + { + dis_comment_pdu *m = (dis_comment_pdu *) p; + if( m->num_fixed_data > 0 ) + memory_dispose(m->fixed_datum); + for(i = 0; i < m->num_variable_data; i++){ + dis_disposeVariableDatum( &m->variable_datum[i] ); + } + memory_dispose(m->variable_datum); + } + break; + + case PDUTypeSetData: + { + dis_set_data_pdu *sd = (dis_set_data_pdu *) p; + dis_datum_spec_record *dsr = &sd->datum_info; + if( dsr->num_fixed_data > 0 ) + memory_dispose(dsr->fixed_datum); + for(i = 0; i < dsr->num_variable_data; i++){ + dis_disposeVariableDatum( &dsr->variable_datum[i] ); + } + memory_dispose(dsr->variable_datum); + } + break; + + default: + break; + } +} + + +void +dis_addPDUSizes(dis_pdu * p) +{ + int i, j; + + switch (p->hdr.pdu_type) { + case PDUTypeEmission: + { + dis_em_emission_pdu *pdu = (dis_em_emission_pdu *) p; + dis_em_system_info *s = pdu->system; + dis_beam_info *b; + unsigned long len; + + for (i = 0; i < pdu->num_systems; ++i, ++s) { + b = s->beam; + len = 0; + for (j = 0; j < pdu->system[i].num_beams; ++j, ++b) { + b->beam_data_length = 13 + b->num_targets * 2; + len += b->beam_data_length; + } + s->sys_data_length = (unsigned char) (5 + len); + } + } + break; + + default: + break; + } +} + + + +int +dis_getRealTime(dis_time * result) +{ + struct timeval t; + struct timezone tz; + my_quad_t i; + + if (gettimeofday(&t, &tz) != 0) { + return -1; + } + result->hour = t.tv_sec / 3600; + i = (t.tv_sec % 3600) * MILLION + t.tv_usec; + i = (i * dis_timestamp_const / 3600) / MILLION; + // set relative time (bit 32 reset) + result->rel.timexxx = i & 0x7fffffff; + return 0; +} + +int +dis_getTimestamp(dis_timestamp * result) +{ + +#if defined(NPSNET_COMPAT) + time_t i = time(0); + + result->time = i >> 1; + result->type = i & 1; +#else + struct timeval t; + struct timezone tz; + my_quad_t i; + + if (gettimeofday(&t, &tz) != 0) { + return -1; + } + i = (t.tv_sec % 3600) * MILLION + t.tv_usec; + i = (i * dis_timestamp_const / 3600) / MILLION; + // set relative time (bit 32 reset)) + result->timexxx = i & 0x7ffffff; + //result->type = 0; +#endif + return 0; +} + +void +dis_timestampToTimeval(dis_timestamp * in, struct timeval *out) +{ +#if defined(NPSNET_COMPAT) + out->tv_sec = (in->time << 1) + in->type; + out->tv_usec = 0; +#else + error_internal("not implemented", 0); +/* + my_quad_t i; + + i = (my_quad_t) in->time * MILLION * 3600 / dis_timestamp_const; + out->tv_sec = (long) ( i / MILLION); + out->tv_usec = (long) ( i % MILLION ); +*/ +#endif +} + +void +dis_timeToTimeval(dis_time * in, struct timeval *out) +{ + error_internal("not implemented", 0); +/* + my_quad_t i; + + i = (my_quad_t) in->rel.time * MILLION / dis_timestamp_const; + out->tv_sec = (long) ( in->hour * 3600 + i / MILLION ); + out->tv_usec = (long) ( i % MILLION ); +*/ +} + + +void +dis_processNewDRParameters(dis_entity_state_pdu * pdu, dis_dr_parameters * dr) +{ + switch (pdu->dr_parm.algorithm) { + case DISDRMethodRPB: + case DISDRMethodRVB: + case DISDRMethodRPW: + case DISDRMethodRVW: + dis_generateDRParameters(pdu, dr); + break; + + case DISDRMethodStatic: + case DISDRMethodFPW: + case DISDRMethodFVW: + case DISDRMethodFPB: + case DISDRMethodFVB: + break; + + case DISDRMethodOther: + default: + break; + } + + dr->pdu = *pdu; + VEulerToMatrix( + pdu->orientation.phi, + pdu->orientation.theta, + pdu->orientation.psi, + &dr->R0); +} + +void +dis_generateDRParameters(dis_entity_state_pdu * pdu, dis_dr_parameters * dr) +{ + double ox, oy, oz; + double ax = 0.0, ay = 0.0, az = 0.0; + double omega; + + ox = pdu->dr_parm.angular_vel.x; + oy = pdu->dr_parm.angular_vel.y; + oz = pdu->dr_parm.angular_vel.z; + omega = sqrt(ox * ox + oy * oy + oz * oz); + + if (omega > 0.0) { + ax = ox / omega; + ay = oy / omega; + az = oz / omega; + } + + dr->omega = omega; + + dr->skew.m[0][0] = dr->skew.m[1][1] = dr->skew.m[2][2] = 0.0; + dr->skew.m[1][0] = -az; + dr->skew.m[0][1] = az; + dr->skew.m[2][0] = ay; + dr->skew.m[0][2] = -ay; + dr->skew.m[2][1] = -ax; + dr->skew.m[1][2] = ax; + + dr->aat.m[0][0] = ax * ax; + dr->aat.m[1][0] = ax * ay; + dr->aat.m[2][0] = ax * az; + dr->aat.m[0][1] = ay * ax; + dr->aat.m[1][1] = ay * ay; + dr->aat.m[2][1] = ay * az; + dr->aat.m[0][2] = az * ax; + dr->aat.m[1][2] = az * ay; + dr->aat.m[2][2] = az * az; +} + +static void DISComputeDRMatrix(dis_dr_parameters * dr, double dT, VMatrix * m) +{ + double theta = dr->omega * dT; + double cosTheta = cos(theta); + double sinTheta = sin(theta); + double Icos, x = (1.0 - cosTheta); + int i, j; + + for (i = 0; i < 3; ++i) { + for (j = 0; j < 3; ++j) { + if (i == j) { + Icos = cosTheta; + } + else { + Icos = 0.0; + } + m->m[i][j] = Icos - + dr->skew.m[i][j] * sinTheta + + dr->aat.m[i][j] * x; + } + } + + m->m[0][3] = m->m[1][3] = m->m[2][3] = 0.0; + m->m[3][0] = m->m[3][1] = m->m[3][2] = 0.0; + m->m[3][3] = 1.0; +} + +void +dis_computeDRPosition(dis_dr_parameters * dr, + double dT, + VPoint * pos, + dis_linear_vel_vector * vel, + VMatrix * orientation) +{ + VMatrix DR; + double hDTSqr; + dis_entity_state_pdu * pdu = &dr->pdu; + + /* Position */ + + switch (dr->pdu.dr_parm.algorithm) { + + case DISDRMethodRPW: + pos->x = pdu->pos.x + pdu->vel.x * dT; + pos->y = pdu->pos.y + pdu->vel.y * dT; + pos->z = pdu->pos.z + pdu->vel.z * dT; + *vel = pdu->vel; + DISComputeDRMatrix(dr, dT, &DR); + VMatrixMultByRank(&DR, &dr->R0, orientation, 3); + break; + + case DISDRMethodRVW: + hDTSqr = 0.5 * dT * dT; + pos->x = pdu->pos.x + pdu->vel.x * dT + + pdu->dr_parm.linear_acc.x * hDTSqr; + pos->y = pdu->pos.y + pdu->vel.y * dT + + pdu->dr_parm.linear_acc.y * hDTSqr; + pos->z = pdu->pos.z + pdu->vel.z * dT + + pdu->dr_parm.linear_acc.z * hDTSqr; + vel->x = (float) (pdu->vel.x + pdu->dr_parm.linear_acc.x * dT); + vel->y = (float) (pdu->vel.y + pdu->dr_parm.linear_acc.y * dT); + vel->z = (float) (pdu->vel.z + pdu->dr_parm.linear_acc.z * dT); + + DISComputeDRMatrix(dr, dT, &DR); + VMatrixMultByRank(&DR, &dr->R0, orientation, 3); + + break; + + case DISDRMethodStatic: + *pos = pdu->pos; + *vel = pdu->vel; + *orientation = dr->R0; + break; + + case DISDRMethodFPW: + pos->x = pdu->pos.x + pdu->vel.x * dT; + pos->y = pdu->pos.y + pdu->vel.y * dT; + pos->z = pdu->pos.z + pdu->vel.z * dT; + *vel = pdu->vel; + *orientation = dr->R0; + break; + + case DISDRMethodFVW: + hDTSqr = 0.5 * dT * dT; + pos->x = pdu->pos.x + pdu->vel.x * dT + + pdu->dr_parm.linear_acc.x * hDTSqr; + pos->y = pdu->pos.y + pdu->vel.y * dT + + pdu->dr_parm.linear_acc.y * hDTSqr; + pos->z = pdu->pos.z + pdu->vel.z * dT + + pdu->dr_parm.linear_acc.z * hDTSqr; + vel->x = (float) (pdu->vel.x + pdu->dr_parm.linear_acc.x * dT); + vel->y = (float) (pdu->vel.y + pdu->dr_parm.linear_acc.y * dT); + vel->z = (float) (pdu->vel.z + pdu->dr_parm.linear_acc.z * dT); + *orientation = dr->R0; + break; + + /* + * For all the remaining unimplemented methods it seems safe to simply + * keep the current position, velocity and orientation: + */ + + case DISDRMethodRPB: + case DISDRMethodRVB: + /* todo: position */ + /* todo: orientation */ + + case DISDRMethodFPB: + case DISDRMethodFVB: + /* todo: position */ + + case DISDRMethodOther: + /* how on earth would we handle this? callbacks, perhaps? */ + + default: + /* Unknown method -- should we display a warning? */ + + *pos = pdu->pos; + *vel = pdu->vel; + *orientation = dr->R0; + + break; + } + +} + +void +dis_getDRThresholds(dis_dr_parameters * dr, double *time, double *location, double *orientation) +{ + *time = dr->timeThreshold; + *location = dr->locationThreshold; + *orientation = dr->orientationThreshold; +} + +void +dis_setDRThresholds(dis_dr_parameters * dr, double time, double location, double orientation) +{ + dr->timeThreshold = time; + dr->locationThreshold = location; + dr->orientationThreshold = orientation; +} + +dis_DR_FLAGS +dis_testDRThresholds(dis_dr_parameters *dr, double deltaT, + VPoint *current_location, + dis_euler_angles *current_orientation) +{ + int result = 0; + VPoint dr_loc, d_loc; + dis_linear_vel_vector dr_vel; + double d_squared, d1, d2, d3, orientation_error_squared; + VMatrix dr_orientation, cur_orientation; + + if (deltaT > dr->timeThreshold) { + result |= dis_DR_TIME; + } + else { + + dis_computeDRPosition(dr, + deltaT, + &dr_loc, + &dr_vel, + &dr_orientation); + + d_loc.x = current_location->x - dr_loc.x; + d_loc.y = current_location->y - dr_loc.y; + d_loc.z = current_location->z - dr_loc.z; + d_squared = d_loc.x * d_loc.x + d_loc.y * d_loc.y + d_loc.z * d_loc.z; + + if (d_squared > dr->locationThreshold * dr->locationThreshold) { + result |= dis_DR_LOCATION; + } + + VEulerToMatrix( + current_orientation->phi, + current_orientation->theta, + current_orientation->psi, + &cur_orientation); + + d1= dr_orientation.m[0][0] * cur_orientation.m[0][0] + + dr_orientation.m[0][1] * cur_orientation.m[0][1] + + dr_orientation.m[0][2] * cur_orientation.m[0][2] ; + d2= dr_orientation.m[1][0] * cur_orientation.m[1][0] + + dr_orientation.m[1][1] * cur_orientation.m[1][1] + + dr_orientation.m[1][2] * cur_orientation.m[1][2] ; + d3= dr_orientation.m[2][0] * cur_orientation.m[2][0] + + dr_orientation.m[2][1] * cur_orientation.m[2][1] + + dr_orientation.m[2][2] * cur_orientation.m[2][2] ; + + d1 = 1.0 - d1 * d1; + d2 = 1.0 - d2 * d2; + d3 = 1.0 - d3 * d3; + + orientation_error_squared = d1 * d1 + d2 * d2 + d3 * d3; + + if (orientation_error_squared > + dr-> orientationThreshold * dr-> orientationThreshold) { + result |= dis_DR_ORIENTATION; + } + + } + + return result; +} + +#define DMAX 16 /* maximum number of delimiter chars */ +#define BMAX 64 /* maximum incoming string length */ + +int +dis_parseEntityID (dis_entity_id *p, + char * buf, + int bufsize, + char *delim) +{ + char pdelim[DMAX+1]; + char tbuf[BMAX+1]; + char *cur, *next, *endptr; + long rval; + int result = 1; + + memset ( p, 0, sizeof(dis_entity_id)); + + /* + * Buffer too large? + */ + + if (bufsize > BMAX ) { + return 2; + } + + memory_strcpy(tbuf, sizeof(tbuf), buf); + + if (delim) + memory_strcpy(pdelim, sizeof(pdelim), delim); + else + memory_strcpy(pdelim, sizeof(pdelim), ":./"); + + cur = tbuf; + + next = strpbrk ( cur, pdelim ); + + if ( next != NULL ) { + + /* + * Once we get a delimiter, all other delimeters must match + */ + + pdelim[0] = *next; + pdelim[1] = '\0'; + + /* + * Get Site ID + */ + + endptr = next; + rval = strtol ( cur, &endptr, 0 ); + + if (rval < 0 || rval > 0xffff) { + return 3; + } + else { + p->sim_id.site_id = (unsigned short) rval; + } + + /* + * Ensure strtol stopped parsing at the correct spot + */ + + if ( endptr != next ) { + return 4; + } + + cur = next+1; + + next = strpbrk ( cur, pdelim ); + + if ( next != NULL ) { + + /* + * Get application ID + */ + + endptr = next; + rval = strtol ( cur, &endptr, 0 ); + + if (rval < 0 || rval > 0xffff) { + return 3; + } + else { + p->sim_id.application_id = (unsigned short) rval; + } + + /* + * Ensure strtol stopped parsing at the correct spot + */ + + if ( endptr != next ) { + return 4; + } + + /* + * Get Entity ID + */ + + cur = next+1; + + rval = strtol ( cur, NULL, 0 ); + + if (rval < 0 || rval > 0xffff) { + return 3; + } + else { + p->entity_id = (unsigned short) rval; + } + + result = 0; + + } + } + + return result; +} + + +int dis_parseEntityType(char *s, dis_entity_type *et) +{ + int f[7]; + char buf[6]; + + if( s == NULL ) + return 0; + // skip leading white spaces: + while(isspace(*s)) + s++; + int i = 0; + do { + // scan number: + if( ! isdigit(*s) ) + return 0; + char *start = s; + do { s++; } while(isdigit(*s)); + if( s - start > 5 ) + return 0; + memcpy(buf, start, s - start); + buf[s - start] = 0; + f[i] = atoi(buf); + if( !((i == 2 && f[i] <= 65535) || (i != 2 && f[i] <= 255)) ) + return 0; + // skip '.': + i++; + if( i == 7 ) + break; + if( *s != '.' ) + return 0; + s++; + } while(1); + // skip trailing white spaces: + while(isspace(*s)) + s++; + // check for trailing chars: + if( *s != 0 ) + return 0; + + et->kind = f[0]; + et->domain = f[1]; + et->country = f[2]; + et->category = f[3]; + et->subcategory = f[4]; + et->specific = f[5]; + et->extra = f[6]; + return 1; +} + + +char * dis_entityTypeToString(dis_entity_type *et) +{ + static char s[99]; + + sprintf(s, "%u.%u.%u.%u.%u.%u.%u", + et->kind, et->domain, et->country, et->category, + et->subcategory, et->specific, et->extra); + return s; +} + + + +#ifdef NOT_USED_________________________________ +int +DISSetMulticastMode(dis_Transceiver * xcvr, unsigned long maddress, unsigned long ointerface) +{ + int ttl = 8; + unsigned long addr = ointerface; + struct ip_mreq mreq; + + mreq.imr_multiaddr.s_addr = maddress; + mreq.imr_interface.s_addr = ointerface; + + setsockopt(xcvr->s, IPPROTO_IP, IP_MULTICAST_TTL, (char *) &ttl, sizeof(ttl)); + setsockopt(xcvr->s, IPPROTO_IP, IP_MULTICAST_IF, (char *) &addr, sizeof(addr)); + setsockopt(xcvr->s, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *) &mreq, sizeof(mreq)); + + return 0; +} +#endif diff -Nru acm-5.0/src/dis/dis/dis.h acm-6.0+20200416/src/dis/dis/dis.h --- acm-5.0/src/dis/dis/dis.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/dis/dis/dis.h 2017-10-29 01:12:06.000000000 +0000 @@ -0,0 +1,1382 @@ +/* + * DIS/x : An implementation of the IEEE 1278.1 protocol + * + * Copyright (C) 1997, Riley Rainey (rrainey@ix.netcom.com) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of either: + * + * a) the GNU Library General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your + * option) any later version. A description of the terms and conditions + * of the GLPL may be found in the "COPYING.LIB" file. + * + * b) the "Artistic License" which comes with this Kit. Information + * about this license may be found in the "Artistic" file. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License or the Artistic License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Information describing how to contact the author can be found in the + * README file. + */ + +/** + * DIS types and data structure and basic access routines. + * Basically compliant with IEEE 1278.1-1995, but some more declaration added + * for future upgrade of this compliance. + * + * @file + * @author Riley Rainey + * @version $Date: 2017/10/28 10:41:22 $ + */ + +#ifndef DIS_H +#define DIS_H + +#ifdef WINNT +#include +#include +#else +#include +#endif + +#include "earth.h" +#include "../../V/Vlibmath.h" // needs VMatrix type + +#ifdef dis_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +// FI = field information +#define PDUTypeOther 0 +#define PDUTypeEntityState 1 +#define PDUTypeFire 2 +#define PDUTypeDetonation 3 +#define PDUTypeCollision 4 +#define PDUTypeServiceRequest 5 +#define PDUTypeResupplyOffer 6 +#define PDUTypeResupplyReceived 7 +#define PDUTypeResupplyCancel 8 +#define PDUTypeRepairComplete 9 +#define PDUTypeRepairResponse 10 +#define PDUTypeCreateEntity 11 +#define PDUTypeRemoveEntity 12 +#define PDUTypeStartResume 13 +#define PDUTypeStopFreeze 14 +#define PDUTypeAcknowledge 15 +#define PDUTypeActionRequest 16 +#define PDUTypeActionResponse 17 +#define PDUTypeDataQuery 18 +#define PDUTypeSetData 19 +#define PDUTypeData 20 +#define PDUTypeEventReport 21 +#define PDUTypeComment 22 +#define PDUTypeEmission 23 +#define PDUTypeDesignator 24 +#define PDUTypeTransmitter 25 +#define PDUTypeSignal 26 +#define PDUTypeReceiver 27 +#define PDUTypeAnnounceObject 129 +#define PDUTypeDeleteObject 130 +#define PDUTypeDescribeApplication 131 +#define PDUTypeDescribeEvent 132 +#define PDUTypeDescribeObject 133 +#define PDUTypeRequestEvent 134 +#define PDUTypeRequestObject 135 +#define PDUTypeTimeSpacePositionIndicatorFI 140 +#define PDUTypeAppearanceFI 141 +#define PDUTypeArticulatedPartsFI 142 +#define PDUTypeFireFI 143 +#define PDUTypeDetonationFI 144 +#define PDUTypePointObjectState 150 +#define PDUTypeLinearObjectState 151 +#define PDUTypeArealObjectState 152 +#define PDUTypeEnvironment 153 +#define PDUTypeTransferControlRequest 155 +#define PDUTypeTransferControl 156 +#define PDUTypeTransferControlAcknowledge 157 +#define PDUTypeIntercomControl 160 +#define PDUTypeIntercomSignal 161 +#define PDUTypeAggregate 170 + +//#define PDUTypeExperimentalRequestControl 150 +//#define PDUTypeExperimentalGrantControl 151 +//#define PDUTypeTransferControl 36 + +#define PDUFamilyOther 0 +#define PDUFamilyEntityInformation 1 +#define PDUFamilyWarfare 2 +#define PDUFamilyLogistics 3 +#define PDUFamilyRadioCommunications 4 +#define PDUFamilySimulationManagement 5 +#define PDUFamilyDistributedEmissionRegeneration 6 +#define PDUFamilyExperimentalCGF 129 +#define PDUFamilyExperimentalEntityInteractionInformationFI 130 +#define PDUFamilyExperimentalWarfareFI 131 +#define PDUFamilyExperimentalEnvironmentObjectInformationInteraction 132 +#define PDUFamilyExperimentalEntityManagement 133 + + + + +typedef enum { + /** Version 1.0 Draft (1992). */ + DISProtocolVersionMay92 = 1, + /** IEEE 1278-1993. */ + DISProtocolVersionIEEE1278_93 = 2, + /** Version 2.0 Third Draft (May 1993). */ + DISProtocolVersionMay93 = 3, + /** Version 2.0 Fourth Draft (March 1994). */ + DISProtocolVersion2_04 = 4, + /** IEEE 1278.1-1995, the target compliance of this module. */ + DISProtocolVersionIEEE1278_95 = 5, + /** IEEE 1278.1a-1998 (amendment to IEEE 1278.1-1995). */ + DISProtocolVersionIEEE1278_98 = 6, + /** IEEE 1278.1-2012. */ + DISProtocolVersionIEEE1278_2012 +} DISProtocolVersion; + +/** + * Force the entity belongs to. See also handy conversion routines from + * force to string and vice-versa dis_parseForce() and dis_forceToString(). + */ +typedef enum { + DISForceOther = 0, + DISForceFriendly = 1, + DISForceOpposing = 2, + DISForceNeutral = 3 +} DISForce; + +typedef enum { + DISRequestStatusOther = 0, + DISRequestStatusPending = 1, + DISRequestStatusExecuting = 2, + DISRequestStatusPartiallyComplete = 3, + DISRequestStatusComplete = 4 +} DISRequestStatus; + +typedef enum { + DISAcknowledgeFlagCreateEntity = 1, + DISAcknowledgeFlagRemoveEntity = 2, + DISAcknowledgeFlagStart = 3, + DISAcknowledgeFlagStop = 4 +} DISAcknowledgeFlag; + +typedef enum { + DISStopReasonOther = 0, + DISStopReasonRecess = 1, + DISStopReasonTermination = 2, + DISStopReasonSystemFailure = 3, + DISStopReasonSecurityViolation = 4, + DISStopReasonEntityReconstitution = 5 +} DISStopReason; + +#define DISFrozenBehaviorRunClock (1<<0) +#define DISFrozenBehaviorTransmit (1<<1) +#define DISFrozenBehaviorReceive (1<<2) + +typedef enum { + DISTransferTypeOther = 0, + DISTransferTypeEntityControllerRequest = 1, + DISTransferTypeEntityRequest = 2, + DISTransferTypeEntityMutualExchange = 3, + DISTransferTypeEnvironmentalControllerRequest = 4, + DISTransferTypeEnvironmentalRequest = 5, + DISTransferTypeEnvironmentalMutualExchange = 6 +} DISTransferType; + + +/* + * From IEEE 1278.1-1995 + */ + +#define ALL_APPLIC 0xFFFF +#define ALL_ENTITIES 0xFFFF +#define ALL_SITES 0xFFFF +#define COLLISION_THRSH_DFLT 0.1 +#define DRA_ORIENT_THRSH_DFLT 3.0 +#define DRA_POS_THRSH_DFLT 1.0 +#define NO_APPLIC 0x0000 +#define NO_ENTITY 0x0000 +#define NO_SITE 0x0000 +#define NOR_FIRE_MISSION 0x0000 +#define RQST_ASSIGN_ID 0xFFFE + + + +#define DISAppearancePaintUniform 0 +#define DISAppearancePaintCamouflage 1 +#define DISAppearancePaintMask 1 + +#define DISAppearanceMobilityNormal (0 << 1) +#define DISAppearanceMobilityDisabled (1 << 1) + +#define DISAppearanceFirepowerNormal (0 << 2) +#define DISAppearanceFirepowerDisabled (1 << 2) + +#define DISAppearanceDamageNone (0 << 3) +#define DISAppearanceDamageSlight (1 << 3) +#define DISAppearanceDamageModerate (2 << 3) +#define DISAppearanceDamageDestroyed (3 << 3) +#define DISAppearanceDamageMask (3 << 3) + +#define DISAppearanceSmokeNone (0 << 5) +#define DISAppearanceSmokePlume (1 << 5) +#define DISAppearanceSmokeEngine (2 << 5) +#define DISAppearanceSmokePlumeAndEngine (3 << 5) +#define DISAppearanceSmokeMask (3 << 5) + +#define DISAppearanceSmokeTrailingNone (0 << 7) +#define DISAppearanceSmokeTrailingSmall (1 << 7) +#define DISAppearanceSmokeTrailingMedium (2 << 7) +#define DISAppearanceSmokeTrailingLarge (3 << 7) +#define DISAppearanceSmokeTrailingMask (3 << 7) + +#define DISAppearanceHatchNA (0 << 9) +#define DISAppearanceHatchClosed (1 << 9) +#define DISAppearanceHatchPopped (2 << 9) +#define DISAppearanceHatchPoppedPerson (3 << 9) +#define DISAppearanceHatchOpen (4 << 9) +#define DISAppearanceHatchOpenPerson (5 << 9) +#define DISAppearanceHatchMask (7 << 9) + +#define DISLightsNone (0 << 12) +#define DISLightsRunning (1 << 12) +#define DISLightsNavigation (2 << 12) +#define DISLightsFormation (3 << 12) +#define DISLightsMask (3 << 12) + +#define DISNoFlames (0 << 15) +#define DISFlamesPresent (1 << 15) + +#define DISAppearancePlatformNotFrozen (0 << 21) +#define DISAppearancePlatformFrozen (1 << 21) +#define DISAppearancePlatformPowerplantOff (0 << 22) +#define DISAppearancePlatformPowerplantOn (1 << 22) +#define DISAppearancePlatformActive (0 << 23) +#define DISAppearancePlatformDeactivated (1 << 23) + +#define DISAppearanceAirAfterburnerOn (1 << 16) + +#define DISAppearanceLandLauncherRaised (1 << 16) + +#define DISAppearanceLandCammouflageDesert (0 << 17) +#define DISAppearanceLandCammouflageWinter (1 << 17) +#define DISAppearanceLandCammouflageForest (2 << 17) +#define DISAppearanceLandCammouflageMask (3 << 17) + +#define DISAppearanceLandConcealed (1 << 19) + + + +#define DISKindOther 0 +#define DISKindPlatform 1 +#define DISKindMunition 2 +#define DISKindLifeForm 3 +#define DISKindEnvironmental 4 +#define DISKindCultural 5 +#define DISKindSupply 6 +#define DISKindRadio 7 + +#define DISDomainOther 0 +#define DISDomainLand 1 +#define DISDomainAir 2 +#define DISDomainSurface 3 +#define DISDomainSubsurface 4 +#define DISDomainSpace 5 + +#define DISCategoryLandOther 0 +#define DISCategoryLandTank 1 +#define DISCategoryLandAFV 2 +#define DISCategoryLandAUV 3 +#define DISCategorySPA 4 +#define DISCategoryTowedArty 5 +#define DISCategorySmallWUV 6 +#define DISCategoryLargeWUV 7 + +#define DISTargetDomainOther 0 +#define DISTargetDomainAntiAir 1 +#define DISTargetDomainAntiArmor 2 +#define DISTargetDomainAntiGuidedMunition 3 +#define DISTargetDomainAntiRadar 4 +#define DISTargetDomainAntiSatellite 5 +#define DISTargetDomainAntiShip 6 +#define DISTargetDomainAntiSubmarine 7 +#define DISTargetDomainBattlefieldSupport 8 +#define DISTargetDomainStrategic 8 +#define DISTargetDomainMisc 10 + +#define DISDRMethodOther 0 +#define DISDRMethodStatic 1 +#define DISDRMethodFPW 2 +#define DISDRMethodRPW 3 +#define DISDRMethodRVW 4 +#define DISDRMethodFVW 5 +#define DISDRMethodFPB 6 +#define DISDRMethodRPB 7 +#define DISDRMethodRVB 8 +#define DISDRMethodFVB 9 +#define DISDRMethodRPW_2 10 +#define DISDRMethodRVW_2 11 + +#define DISCharSetUnused 0 +#define DISCharSetASCII 1 + +#define DISCapabilityAmmunitionSupply 1 +#define DISCapabilityFuelSupply 2 +#define DISCapabilityMiscSupply 4 +#define DISCapabilityRepair 8 + +#define DISWarheadOther 0 +#define DISWarheadHE 1000 +#define DISWarheadHEPlastic 1100 +#define DISWarheadHEIncendiary 1200 +#define DISWarheadHEFragment 1300 +#define DISWarheadHEAntiTank 1400 +#define DISWarheadHEBomblets 1500 +#define DISWarheadHEShapedCharge 1600 +#define DISWarheadSmoke 2000 +#define DISWarheadIllumination 3000 +#define DISWarheadPractice 4000 +#define DISWarheadKinetic 5000 +#define DISWarheadUnused 6000 +#define DISWarheadNuclear 7000 +#define DISWarheadChemGeneral 8000 +#define DISWarheadChemBlister 8100 +#define DISWarheadChemBlood 8200 +#define DISWarheadChemNerve 8300 +#define DISWarheadBiologicalGeneral 9000 + +#define DISFuzeOther 0 +#define DISFuzeContact 1000 +#define DISFuzeContactInstant 1100 +#define DISFuzeContactDelayed 1200 +#define DISFuzeContactElectronic 1300 +#define DISFuzeContactGraze 1400 +#define DISFuzeContactCrush 1500 +#define DISFuzeContactHydrostatic 1600 +#define DISFuzeContactMechanical 1700 +#define DISFuzeContactChemical 1800 +#define DISFuzeTimed 2000 +#define DISFuzeProximity 3000 +#define DISFuzeProximityActiveLaser 3100 +#define DISFuzeProximityMagnetic 3200 +#define DISFuzeProximityRadar 3300 +#define DISFuzeProximityRF 3400 +#define DISFuzeProximityProgrammable 3500 +#define DISFuzeProximityInfrared 3700 +#define DISFuzeCommand 4000 +#define DISFuzeCommandElectronicRS 4100 +#define DISFuzeAltitude 5000 +#define DISFuzeAltitudeRadioAltimeter 5100 +#define DISFuzeAltitudeRadioAirBurst 5100 +#define DISFuzeDepth 6000 +#define DISFuzeAcoustic 7000 +#define DISFuzePressure 8000 +#define DISFuzePyrotechnic 9000 + +#define DISDetonationResultOther 0 +#define DISDetonationResultEntityImpact 1 +#define DISDetonationResultEntityProxDetonation 2 +#define DISDetonationResultGroundImpact 3 +#define DISDetonationResultGroundProxDetonation 4 +#define DISDetonationResultDetonation 5 +#define DISDetonationResultNone 6 +#define DISDetonationResultHESmall 7 +#define DISDetonationResultHEMedium 8 +#define DISDetonationResultHELarge 9 +#define DISDetonationResultAP 10 +#define DISDetonationResultDBSmall 11 +#define DISDetonationResultDBMedium 12 +#define DISDetonationResultDBLarge 13 +#define DISDetonationResultAirHit 17 +#define DISDetonationResultBuildingHitSmall 18 +#define DISDetonationResultBuildingHitMedium 19 +#define DISDetonationResultBuildingHitLarge 20 +#define DISDetonationResultMineClearingLineCharge 21 + +#define DISServiceTypeOther 0 +#define DISServiceTypeResupply 1 +#define DISServiceTypeRepair 2 + +#define DISRepairTypeNone 0 +#define DISRepairTypeAll 1 + +#define DISRepairResultOther 0 +#define DISRepairResultEnded 1 +#define DISRepairResultInvalid 2 +#define DISRepairResultInterrupted 3 +#define DISRepairResultCancelled 4 + +#define DISAckFlagOther 0 +#define DISAckFlagCreateEntity 1 +#define DISAckFlagRemoveEntity 2 +#define DISAckFlagStartResume 3 +#define DISAckFlagStopFreeze 4 + +#define DISActionOther 0 +#define DISActionLocalStorage 1 +#define DISActionOutOfAmmunition 2 +#define DISActionKIA 3 +#define DISActionDamage 4 +#define DISActionMobilityDisabled 5 +#define DISActionFireDisabled 6 + +#define DISResponseOther 0 +#define DISResponsePending 1 +#define DISResponseExecuting 2 +#define DISResponsePartiallyComplete 3 +#define DISResponseComplete 4 + +#define DISActivateReasonOther 0 +#define DISActivateReasonStart 1 +#define DISActivateReasonRestart 2 +#define DISActivateReasonEntry 3 +#define DISActivateReasonReconstite 4 + +#define DISActivateResultOther 0 +#define DISActivateResultRequestAccepted 1 +#define DISActivateResultInvalidParam 2 +#define DISActivateResultUnexpectedParam 3 + +#define DISDeactivateReasonOther 0 +#define DISDeactivateReasonEnd 1 +#define DISDeactivateReasonWithdrawn 2 +#define DISDeactivateReasonDestroyed 3 + +#define DISDeactivateResultOther 0 +#define DISDeactivateResultReqAccepted 1 +#define DISDeactivateResultInvalidParam 2 +#define DISDeactivateResultUnexpectedReason 3 +#define DISDeactivateResultNotActive 4 + +#define DISFrozenSimulationClock (1<<0) +#define DISFrozenTransmitPDUs (1<<1) +#define DISFrozenReceivePDUs (1<<2) + +#define DISInputSourceOther 0 +#define DISInputSourcePilot 1 +#define DISInputSourceCopilot 2 +#define DISInputSourceFirstOfficer 3 + +#define DISReceiverStateOff 0 +#define DISReceiverStateOnNotReceiving 1 +#define DISReceiverStateOnReceiving 2 + +#define DISEmitterFuncUnknown 0 +#define DISEmitterFuncLandBasedAirDefense 1 +#define DISEmitterFuncBattlefieldAndGroundSurveillance 2 +#define DISEmitterFuncNavalSurveillanceAndNavigation 3 +#define DISEmitterFuncNavalFireControl 4 +#define DISEmitterFuncAirborneSurveillance 5 +#define DISEmitterFuncAirborneFireControl 6 +#define DISEmitterFuncSpaceborne 7 +#define DISEmitterFuncATCInstrumentationAndRanging 8 +#define DISEmitterFuncWeather 9 +#define DISEmitterFuncMissileGuidance 10 +#define DISEmitterFuncJamming 11 + +#define DISBeamFuncUnknown 0 +#define DISBeamFuncSearch 1 +#define DISBeamFuncHeightFinder 2 +#define DISBeamFuncAcquisition 3 +#define DISBeamFuncTracking 4 +#define DISBeamFuncAcquisitionAndTracking 5 +#define DISBeamFuncCommandGuidance 6 +#define DISBeamFuncIlluminator 7 +#define DISBeamFuncRangeOnlyRadar 8 +#define DISBeamFuncMissileBeacon 9 +#define DISBeamFuncMissileFuze 10 +#define DISBeamFuncActiveRadarMissileSeeker 11 +#define DISBeamFuncJammer 12 + +#define DISPRITypeUnknown 0 +#define DISPRITypeSteady 1 +#define DISPRITypeStaggered 2 +#define DISPRITypeJitter 3 +#define DISPRITypePulseGroup 4 +#define DISPRITypeCW 5 +#define DISPRITypePulseDoppler 6 + +#define DISScanTypeUnknown 0 +#define DISScanTypeSteady 1 +#define DISScanTypeUnidirectional 2 +#define DISScanTypeBidirectional 3 +#define DISScanTypeConical 4 +#define DISScanTypeTwoBar 5 +#define DISScanTypeThreeBar 6 +#define DISScanTypeFourBar 7 +#define DISScanTypeOneBar 8 + +typedef struct { + float x; + float y; + float z; +} dis_float_vector; + +typedef struct { + float x; + float y; + float z; +} dis_angular_vel_vector; + + +typedef struct { + float x; + float y; + float z; +} dis_linear_acc_vector; + + +typedef struct { + float x; + float y; + float z; +} dis_linear_vel_vector; + + +typedef struct { + float x; + float y; + float z; +} dis_entity_coord_vector; + + +/** + * DIS entity type. + * See also: dis_entityTypeToString(), dis_parseEntityType(). + */ +typedef struct { + unsigned char kind; + unsigned char domain; + uint16_t country; + unsigned char category; + unsigned char subcategory; + unsigned char specific; + unsigned char extra; +} dis_entity_type; + + +typedef struct { + unsigned char charset; + unsigned char marking[11]; +} dis_entity_marking; + + +typedef struct { + uint32_t datum_id; + uint32_t value; +} dis_fixed_datum; + + +typedef struct { + uint32_t datum_id; + uint32_t value_length; + union { + double double_value; + dis_entity_type entity_type_value; + unsigned char *ptr_value; + } value; +} dis_variable_datum; + +/** + * Timestamp associated to the packet. If absolute, the host participating in + * the simulation is synchronized with all the other hosts, typically via NTP. + * If relative, the host is not synchronized and the other participating hosts + * must (should...) take care of this using this value only to perform time + * differences with other timestamps coming from that same host. + * Note that the time field only carries the lowest 31 bits of the timestamp + * measured in units of 3600/2^31 seconds; this value is not monotonic and + * returns to 0 after reaching (2^31-1). + * + * NOTE. Currently src/acm/dis_if.c simply ignores the timestamp from incoming + * DIS packets and always assumes our timestamp instead. + * + * 2017-04-26 XDR routines fail to encode/decode this data as originally defined + * with separated time and type fields on 64 bits platform. Fixed declaring a + * single field "timexxx"; the highest bit is the absolute time flag. This value + * is set by ACM but it is otherwise ignored, only internal clock matters. [U.S.] + */ +typedef struct { + ///** 3600/2^31 = 1.676... usec units. */ + //unsigned time:31; + ///** Type: 0=relative, 1=absolute. */ + //unsigned type:1; + uint32_t timexxx; +} dis_timestamp; + +typedef struct { + uint16_t site_id; + uint16_t application_id; +} dis_simulation_addr; + + +typedef struct { + uint16_t name; + unsigned char function; + unsigned char id; +} dis_emitter_system; + + +typedef struct { + dis_simulation_addr sim_id; + uint16_t entity_id; +} dis_entity_id; + + +typedef struct { + float psi; + float theta; + float phi; +} dis_euler_angles; + + +typedef struct { + dis_simulation_addr sim_id; + uint16_t event_id; +} dis_event_id; + + +typedef struct { + float freq; + float freq_range; + float erp; + float prf; + float pulse_width; + float beam_azimuth_center; + float beam_azimuth_sweep; + float beam_elev_center; + float beam_elev_sweep; + float beam_sweep_sync; +} dis_fundamental_parameters; + + +typedef struct { + uint16_t spread_spectrum; + uint16_t major_type; + uint16_t detail; + uint16_t system; +} dis_modulation_type; + + +typedef struct { + unsigned char protocol_version; + unsigned char exercise_id; + unsigned char pdu_type; + unsigned char protocol_family; + dis_timestamp time_stamp; + uint16_t length; + uint16_t padding; +} dis_pdu_header; + + +typedef struct { + double x; + double y; + double z; +} dis_double_vector; + + +typedef struct dis_relative_coordinates { + float x; + float y; + float z; +} dis_relative_coordinates; + + +typedef struct { + VPoint ant_location; + dis_relative_coordinates relative; +} dis_antenna_location; + + +typedef struct { + dis_euler_angles direction; + float azimuth_width; + float elev_width; + unsigned char reference_system; + unsigned char pad[3]; + float Ez; + float Ex; + float phase; +} dis_beam_antenna_pattern; + + +typedef struct { + unsigned char pattern; + float coefficients; + unsigned char ref_system; +} dis_spherical_harmonic_antenna_pattern; + + +typedef union { + double d; + float f[2]; + char c[8]; + uint32_t l[2]; + uint16_t s[4]; +} dis_parm_value; + + +typedef struct { + unsigned char type; + unsigned char change; + uint16_t attachment_id; + uint32_t attached_part; + uint32_t articulated_part; + dis_parm_value value; +} dis_articulation_parm; + + +typedef struct { + uint32_t hour; + dis_timestamp rel; +} dis_time; + + +typedef struct { + dis_entity_type munition; + uint16_t warhead; + uint16_t fuze; + uint16_t quantity; + uint16_t rate; +} dis_burst_descriptor; + + +typedef struct { + unsigned char algorithm; + unsigned char other[15]; + dis_linear_acc_vector linear_acc; + dis_angular_vel_vector angular_vel; +} dis_dead_reckoning; + + +typedef uint32_t dis_capabilities; + + +typedef struct { + dis_entity_type entity; + float quantity; +} dis_supply_quantity; + + +typedef uint32_t dis_entity_appearance; + + +typedef struct { + dis_pdu_header hdr; + dis_entity_id id; + unsigned char force_id; + unsigned char art_parm_count; + dis_entity_type type; + dis_entity_type alt_type; + dis_linear_vel_vector vel; + VPoint pos; + dis_euler_angles orientation; + dis_entity_appearance appearance; + dis_dead_reckoning dr_parm; + dis_entity_marking marking; + dis_capabilities capabilities; + dis_articulation_parm *art_parm; +} dis_entity_state_pdu; + + +typedef struct { + dis_pdu_header hdr; + dis_entity_id id; + dis_entity_id collision_id; + dis_event_id event; + dis_linear_vel_vector vel; + uint32_t mass; + dis_entity_coord_vector loc; +} dis_collision_pdu; + + +typedef struct { + dis_pdu_header hdr; + dis_entity_id firing_id; + dis_entity_id target_id; + dis_entity_id munition_id; + dis_event_id event; + uint32_t fire_mission_index; + VPoint pos; + dis_burst_descriptor burst; + dis_linear_vel_vector vel; + float range; +} dis_fire_pdu; + + +typedef struct { + dis_pdu_header hdr; + dis_entity_id firing_id; + dis_entity_id target_id; + dis_entity_id munition_id; + dis_event_id event; + dis_linear_vel_vector vel; + VPoint pos; + dis_burst_descriptor burst; + dis_entity_coord_vector loc; + unsigned char result; + unsigned char num_art_parms; + uint16_t pad; + dis_articulation_parm *art_parm; +} dis_detonation_pdu; + + +typedef unsigned char dis_service_type; + + +typedef uint16_t dis_repair_type; + + +typedef unsigned char dis_repair_result; + + +typedef struct { + dis_pdu_header hdr; + dis_entity_id requestor_id; + dis_entity_id server_id; + dis_service_type requested_service; + unsigned char num_supply_types; + uint16_t pad; + dis_supply_quantity *supplies; +} dis_service_request_pdu; + + +typedef struct { + dis_pdu_header hdr; + dis_entity_id receiver_id; + dis_entity_id supplier_id; + unsigned char num_supply_types; + unsigned char pad[3]; + dis_supply_quantity *supplies; +} dis_resupply_offer_pdu; + + +typedef struct { + dis_pdu_header hdr; + dis_entity_id receiver_id; + dis_entity_id supplier_id; + unsigned char num_supply_types; + unsigned char pad[3]; + dis_supply_quantity *supplies; +} dis_resupply_received_pdu; + + +typedef struct { + dis_pdu_header hdr; + dis_entity_id receiver_id; + dis_entity_id supplier_id; +} dis_resupply_cancel_pdu; + + +typedef struct { + dis_pdu_header hdr; + dis_entity_id receiver_id; + dis_entity_id supplier_id; + dis_repair_type repair; + uint16_t pad; +} dis_repair_complete_pdu; + + +typedef struct { + dis_pdu_header hdr; + dis_entity_id receiver_id; + dis_entity_id supplier_id; + dis_repair_result result; + unsigned char pad[3]; +} dis_repair_response_pdu; + + +typedef uint32_t dis_request_id; + + +typedef struct { + dis_pdu_header hdr; + dis_entity_id orig_id; + dis_entity_id recv_id; + dis_request_id request_id; +} dis_create_entity_pdu; + + +typedef struct { + dis_pdu_header hdr; + dis_entity_id orig_id; + dis_entity_id recv_id; + dis_request_id request_id; +} dis_remove_entity_pdu; + + +typedef struct { + dis_pdu_header hdr; + dis_entity_id orig_id; + dis_entity_id recv_id; + dis_time real_time; + dis_time sim_time; + dis_request_id request_id; +} dis_start_pdu; + + +typedef struct { + dis_pdu_header hdr; + dis_entity_id orig_id; + dis_entity_id recv_id; + dis_time real_time; + unsigned char reason; + unsigned char behavior; + unsigned char pad[2]; + dis_request_id request_id; +} dis_stop_pdu; + + +typedef struct { + dis_pdu_header hdr; + dis_entity_id orig_id; + dis_entity_id recv_id; + uint16_t acknowledge_flag; + uint16_t resp_flag; + dis_request_id request_id; +} dis_acknowledge_pdu; + + +typedef struct { + dis_pdu_header hdr; + dis_entity_id orig_id; + dis_entity_id recv_id; + dis_time interval; + dis_request_id request_id; + uint32_t num_fixed_data; + uint32_t num_variable_data; + uint32_t *fixed_datum_id; + uint32_t *variable_datum_id; +} dis_data_query_pdu; + + +typedef struct { + uint32_t num_fixed_data; + uint32_t num_variable_data; + dis_fixed_datum *fixed_datum; + dis_variable_datum *variable_datum; +} dis_datum_spec_record; + + +typedef struct { + dis_pdu_header hdr; + dis_entity_id orig_id; + dis_entity_id recv_id; + dis_request_id request_id; + dis_datum_spec_record datum_info; +} dis_set_data_pdu; + + +typedef struct { + dis_pdu_header hdr; + dis_entity_id orig_id; + dis_entity_id recv_id; + dis_request_id request_id; + dis_datum_spec_record datum_info; +} dis_data_pdu; + + +typedef struct { + dis_pdu_header hdr; + dis_entity_id orig_id; + dis_entity_id recv_id; + dis_event_id event_type; + dis_datum_spec_record datum_info; +} dis_event_report_pdu; + + +typedef struct { + dis_pdu_header hdr; + dis_entity_id orig_id; + dis_entity_id recv_id; + uint32_t num_fixed_data; + uint32_t num_variable_data; + dis_fixed_datum *fixed_datum; + dis_variable_datum *variable_datum; +} dis_comment_pdu; + + +typedef struct { + dis_entity_id target; + unsigned char emitter_id; + unsigned char beam_id; +} dis_track_info; + + +typedef struct { + unsigned char beam_data_length; + unsigned char beam_id; + uint16_t beam_parm_index; + dis_fundamental_parameters fundamental; + unsigned char beam_function; + unsigned char num_targets; + unsigned char high_density_track_jam; + unsigned char pad; + uint32_t jamming_mode; + dis_track_info *tracked_target; +} dis_beam_info; + + +typedef struct { + unsigned char sys_data_length; + unsigned char num_beams; + uint16_t pad; + dis_emitter_system emitter_system; + dis_entity_coord_vector location; + dis_beam_info *beam; +} dis_em_system_info; + + +typedef struct { + dis_pdu_header hdr; + dis_entity_id emitter_id; + dis_event_id event; + unsigned char state_update; + unsigned char num_systems; + uint16_t pad; + dis_em_system_info *system; +} dis_em_emission_pdu; + + +typedef struct { + dis_pdu_header hdr; + dis_entity_id designating_id; + uint16_t code_name; + dis_entity_id designated_id; + unsigned char pad; + unsigned char code; + float power; + float wavelength; + dis_entity_coord_vector spot_rel; + VPoint spot_pos; +} dis_designator_pdu; + + +typedef struct { + dis_pdu_header hdr; + dis_entity_id requesting_id; + dis_entity_id control_target_id; +} dis_experimental_request_control_pdu; + + + +typedef struct { + dis_pdu_header hdr; + dis_entity_id granting_id; + dis_entity_id control_target_id; +} dis_experimental_grant_control_pdu; + + +typedef struct { + dis_pdu_header hdr; + dis_entity_id orig_id; + dis_entity_id recv_id; + uint32_t request_id; + unsigned char reliability_service; + unsigned char transfer_type; + dis_entity_id target_id; + uint32_t num_record_sets; +} dis_transfer_control_pdu; + + +typedef union { + dis_pdu_header hdr; + dis_entity_state_pdu entity_state; + dis_collision_pdu collision; + + dis_fire_pdu fire; + dis_detonation_pdu detonation; + + dis_create_entity_pdu create_entity; + dis_remove_entity_pdu remove_entity; + dis_start_pdu start; + dis_stop_pdu stop; + dis_acknowledge_pdu acknowledge; + dis_data_query_pdu data_query; + dis_set_data_pdu set_data; + dis_data_pdu data; + dis_event_report_pdu event_report; + dis_comment_pdu message; + + dis_em_emission_pdu em_emission; + dis_designator_pdu designator; + dis_transfer_control_pdu transfer_control; + dis_experimental_request_control_pdu request_control; + dis_experimental_grant_control_pdu grant_control; +} dis_pdu; + + +typedef struct { + double timeThreshold; /* [ seconds ] */ + double locationThreshold; /* [ meters ] */ + double orientationThreshold; /* [ radians ] */ + double omega; /* angular velocity magnitude */ + VMatrix R0; /* orientation based on Euler angles in entity state */ + VMatrix skew; + VMatrix aat; + dis_entity_state_pdu pdu; /* saved entity state PDU */ +} dis_dr_parameters; + + +typedef enum { + dis_RESULT_OK = 0, + dis_RESULT_ERROR = 1, + dis_RESULT_NO_MEMORY = 2 +} dis_Result; + +/** + * In broadcasting mode, local interface to send packets; + * in unicast mode, the destination relay server. + */ +typedef struct { + /** Local interface or relay server. */ + struct sockaddr_in addr; + /** 0=broadcast; 1=other (unicast?). */ + int type; /* 0=broadcast; 1=other */ +} dis_DestinationAddress; + +/** + * All destinations of our packets. + */ +typedef struct { + /** Socket. */ + int s; + dis_DestinationAddress dest[32]; + int num_dest; +} dis_Transceiver; + + +/** + * Parses the force type. + * @param s Force type string, one of "Other", "Friendly", "Opposing", "Neutral". + * @return Parsed force, or -1 if the string is NULL or invalid. + */ +EXTERN DISForce dis_parseForce(char *s); + +/** + * Returns the name of the force. + * @param force Type of the force. Fatal error if the value is invalid. + * @return Pointer to statically allocated string describing the force. + */ +EXTERN char * dis_forceToString(DISForce force); + +/** + * Compare an incoming DIS entity type against a wildcarded entity type; + * returns non-zero value if they match. + */ +EXTERN int dis_entityWildcardMatch(const dis_entity_type *in, + const dis_entity_type *pattern, + const dis_entity_type *pattern_mask); + +/** + * Add articulation parameter to the Entity State PDU. + */ +EXTERN dis_Result dis_addArticulationParm(dis_entity_state_pdu * esp, + dis_articulation_parm * parm, int *parmID); + +EXTERN int dis_setNBIOState(dis_Transceiver *, int); + +/** + * Establishes a connection to the DIS network. It should be called only once by + * a user application. There are two modes: relay server and client. In server + * mode the port parameter sets the port of the server, the host name parameter + * is ignored. In client mode, if a relay server and port are set, sends packets + * to that relay server; if no host name is defined, uses broadcasting. + * When broadcasting is required on UNIX systems, this function automatically + * locates all active broadcast-compatible network interfaces and configures the + * DIS library to automatically transmit broadcast PDU’s on each of those + * interfaces. + * + * The socket is created in blocking mode; the disx module will set it to non- + * blocking mode. + * + * See Also: dis_closeTransceiver(). + * @param isServer Set to false for client connection, true for relay server. + * @param host_name If client, name or network address of the relay server if + * available, or NULL or empty to use broadcasting. If server, it is ignored. + * @param host_port If client, the UDP port to use in broadcast mode, or the port + * of the relay server if available. If server, the UDP port of the server. + * @return Pointer to DISTransceiver on success, NULL otherwise (and a message + * is sent to stderr). + */ +EXTERN dis_Transceiver *dis_openTransceiver(int isServer, + char *host_name, int host_port); + +/** + * Does nothing if xcvr is NULL. + * @param xcvr + */ +EXTERN void dis_closeTransceiver(dis_Transceiver *xcvr); + +/** + * Returns the next PDU received from the DIS network. Some PDU structures + * contain variable length fields (for example, the emitter systems field of an + * electromagnetic emission PDU). Space required to hold those variable length + * components will be dynamically allocated. Before discarding the PDU, call + * dis_freePDUComponents() to release this dynamically allocated storage. + * See Also: dis_openTransceiver(), dis_writePDU(), dis_freePDUComponents(). + * @param xcvr + * @param pdu + * @return True if a DIS PDU is available. False if no more packets are + * available. Invalid packets are skipped and an error message is logged. + */ +EXTERN int dis_readPDU(dis_Transceiver *xcvr, dis_pdu *pdu); + +/** + * Broadcasts the specified PDU onto the DIS network. + * See Also: dis_openTransceiver(), dis_readPDU(). + * @param xcvr + * @param pdu + * @return True on success. False if either failed encoding the PDU (should + * never happen) or failed sending the packet to at least one destination + * address. + */ +EXTERN int dis_writePDU(dis_Transceiver *xcvr, dis_pdu *pdu); + +/** + * Release storage occupied by the variable-length fields of a PDU. Some PDU + * structures contain variable length fields (e.g. the emitter systems field of + * an electromagnetic emission PDU). Space required to hold those variable length + * components is dynamically allocated through during a call to dis_readPDU (or + * DISxReadPDU). Before discarding a PDU, call this function to release this + * dynamically allocated storage. See Also: disx_readPDU(), dis_readPDU(). + * @param pdu DIS PDU whose variable length components have to be released. + * Does nothing if NULL. + */ +EXTERN void dis_freePDUComponents(dis_pdu *pdu); + +EXTERN void dis_addPDUSizes(dis_pdu *); + +/** + * Returns the current relative time based on the local system’s clock. + * See Also: dis_getTimestamp(). + * @param result + * @return Currently always returns zero. + */ +EXTERN int dis_getRealTime(dis_time * result); + +/** + * Returns a DIS absolute timestamp based on the local system’s clock. Absolute + * timestamps are interpreted by other DIS applications to be based on UTC time. + * This normally assumes that the clocks of all systems participating in this + * DIS exercise have been somehow synchronized with Coordinated Universal + * Time (UTC). + * See Also: dis_getRealTime(). + * @param result Relative DIS timestamp. + * @return Currently always returns zero. + */ +EXTERN int dis_getTimestamp(dis_timestamp * result); + +EXTERN void dis_timeToTimeval(dis_time * in, struct timeval *out); + +EXTERN void dis_timestampToTimeval(dis_timestamp * in, struct timeval *out); + +/** + * Bits for the DR test status mask telling for which reason the state of a + * entity needs to be updated and then a new state packet should be send. + * The words "too much" that follow should be read "beyond the configured DR + * threshold". + */ +typedef enum { + /** Stale entity state: too much time elapsed since last packet sent. */ + dis_DR_TIME = 0x01, + /** Entity moved too much. */ + dis_DR_LOCATION = 0x02, + /** Entity rotates too much. */ + dis_DR_ORIENTATION = 0x04, +} dis_DR_FLAGS; + + +EXTERN void dis_processNewDRParameters(dis_entity_state_pdu * pdu, + dis_dr_parameters * dr); + +EXTERN void dis_generateDRParameters(dis_entity_state_pdu * pdu, + dis_dr_parameters * dr); + +/** + * Updates the state of the remote entity using the specified dead reckoning + * algorithm. Updates the current state vectors accordingly. + * @param dr Dead reckoning parameters. + * @param dT Time elapsed since last update (s). + * @param pos Last known position. + * @param vel Last known velocity. + * @param orientation Last known orientation. + */ +EXTERN void dis_computeDRPosition(dis_dr_parameters * dr, double dT, + VPoint * pos, dis_linear_vel_vector * vel, + VMatrix * orientation); + +EXTERN void dis_getDRThresholds(dis_dr_parameters *, double *time, + double *location, double *orientation); + +EXTERN void dis_setDRThresholds(dis_dr_parameters *, double time, + double location, double orientation); + +/** + * Updates the DR state and returns a bit mask with the DR test result. + * @param dr + * @param deltaT + * @param current_location + * @param current_orientation + * @return Result of the test. + */ +EXTERN dis_DR_FLAGS dis_testDRThresholds(dis_dr_parameters *dr, double deltaT, + VPoint *current_location, dis_euler_angles *current_orientation); + +/** + * Generate a DIS entity ID from a string. + * C-style hexadecimal numbers may be used in the input stream: + * + * 1/1/0xfffe, and 0xff/0xff/0x1 are both valid + * + * Example invalid strings: + * + * 1/1/1,000 Entity ID field contains an invalid character + * 1/1/1000000 Entity ID field > 0xffff + * + * @param p Resulting parsed entity. + * @param buf Buffer to parse -- BEWARE: overwritten! + * @param bufsize Length of the buffer, including terminating zero if any. + * @param delim List of delimiter characters, typically ".:/". + * @return + * 0: success, + * 1: parse error, + * 2: incoming string buffer too large (max is 64 characters), + * 3: one or more of the fields contains an invalid value (<0 or >0xffff), + * 4: invalid character in string. + */ +EXTERN int dis_parseEntityID (dis_entity_id *p, char * buf, int bufsize, + char *delim); + +/** + * Parse entity type string of the form "9.9.9.9.9.9.9". Each value must be an + * integer number in the range [0,255], except country which is [0,65535]. + * Ignores leading and trailing white spaces. + * @param s String to parse. + * @param et Here returns the parsed entity type. + * @return True on success. False if the string is NULL or does not contain + * a valid entity type. + */ +EXTERN int dis_parseEntityType(char *s, dis_entity_type *et); + +/** + * Returns the entity type as a string of the form "9.9.9.9.9.9.9". + * @param et Subject entity type. + * @return Pointer to a statically allocated string buffer with the formatted + * entity type. + */ +EXTERN char * dis_entityTypeToString(dis_entity_type *et); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/dis/dis/disx.c acm-6.0+20200416/src/dis/dis/disx.c --- acm-5.0/src/dis/dis/disx.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/dis/dis/disx.c 2017-05-19 16:17:11.000000000 +0000 @@ -0,0 +1,179 @@ +/* + * DIS/x : An implementation of the IEEE 1278.1 protocol + * + * Copyright (C) 1996, Riley Rainey (rainey@netcom.com) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of either: + * + * a) the GNU Library General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your + * option) any later version. A description of the terms and conditions + * of the GLPL may be found in the "COPYING.LIB" file. + * + * b) the "Artistic License" which comes with this Kit. Information + * about this license may be found in the "Artistic" file. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License or the Artistic License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Information describing how to contact the author can be found in the + * README file. + */ + +#include +#include +#include + +#include "../../util/memory.h" + +#define disx_IMPORT +#include "disx.h" + +/* + * This table defines the correct protocol family based on the pdu type + */ + +static unsigned char pdu_family[256] = +{ + 0, 1, 2, 2, 1, 3, 3, 3, 3, 3, 3, 5, 5, 5, 5, 5, /* 0..15 */ + 5, 5, 5, 5, 5, 5, 5, 6, 6, 4, 4, 0, 0, 0, 0, 0, /* 16..31 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 32..47 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 48..63 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 64..79 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 80..95 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 96..111 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 112..127 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 128..143 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 0, 0, /* 144..159 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 160..175 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 176..191 */ +}; + +static int protocol_version = DISProtocolVersionIEEE1278_95; + +int +disx_setProtocolVersion(int version) +{ + int result = protocol_version; + + protocol_version = version; + return result; +} + + +disx_ApplicationInfo * +disx_initializeApplication(dis_Transceiver *xcvr, + int exercise_id, + int site_id, + int application_id) +{ + disx_ApplicationInfo *p = (disx_ApplicationInfo *) memory_allocate( + sizeof(disx_ApplicationInfo), NULL); + memset(p, 0, sizeof(*p)); + + p->hdr.protocol_version = protocol_version; + p->hdr.exercise_id = exercise_id; + p->hdr.padding = 0; + + p->last_event = 0; + p->last_entity = 0; + p->last_request = 0; + + p->xcvr = xcvr; + if (dis_setNBIOState(p->xcvr, 1) != 0) { + fprintf(stderr, "Socket rejected non-blocking mode.\n"); + dis_closeTransceiver(p->xcvr); + memory_dispose(p); + return NULL; + } + p->id.site_id = site_id; + p->id.application_id = application_id; + return p; +} + +void +disx_getSimulationAddress(disx_ApplicationInfo * info, + dis_simulation_addr * p) +{ + *p = info->id; +} + +int +disx_writePDU(disx_ApplicationInfo * info, dis_pdu * p) +{ + p->hdr.protocol_version = info->hdr.protocol_version; + p->hdr.exercise_id = info->hdr.exercise_id; + p->hdr.protocol_family = pdu_family[p->hdr.pdu_type]; + /* don't set time here until there is a function to set + the value (time) and type (relative/absolute) of the time + in the DISx library + dis_getTimestamp(&p->hdr.time_stamp); */ + return dis_writePDU(info->xcvr, p); +} + +int +disx_readPDU(disx_ApplicationInfo * info, dis_pdu * p) +{ + return dis_readPDU(info->xcvr, p); +} + +void +disx_closeApplication(disx_ApplicationInfo * info) +{ + if( info == NULL ) + return; + dis_closeTransceiver(info->xcvr); + memory_dispose(info); +} + +dis_entity_id * +disx_issueEntityID(disx_ApplicationInfo * info, dis_entity_id * e) +{ + e->sim_id = info->id; + // Valid range for entity ID is [1,0xfffd]; + // zero, 0xfffe and 0xffff are not allowed; + // cyclic. + info->last_entity++; + if (info->last_entity >= 0xfffe) { + info->last_entity = 1; + } + e->entity_id = info->last_entity; + return e; +} + +dis_request_id +disx_issueRequestID( disx_ApplicationInfo * info ) +{ + // Valid range for request ID: any 32-bits value; + // cyclic. + return ++info->last_request; +} + +dis_event_id * +disx_issueEventID(disx_ApplicationInfo * info, dis_event_id * event) +{ + event->sim_id = info->id; + // Valid range for event ID is [1,0xffff]; + // zero not allowed; + // cyclic. + info->last_event++; + if (info->last_event == 0 ) { + info->last_event = 1; + } + event->event_id = info->last_event; + return event; +} + + +void +disx_initializeDatumInfo ( dis_datum_spec_record *pd ) +{ + memset (pd, 0, sizeof(dis_datum_spec_record)); +} diff -Nru acm-5.0/src/dis/dis/disx.h acm-6.0+20200416/src/dis/dis/disx.h --- acm-5.0/src/dis/dis/disx.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/dis/dis/disx.h 2017-05-19 16:16:54.000000000 +0000 @@ -0,0 +1,150 @@ +/* + * DIS/x : An implementation of the IEEE 1278.1 protocol + * + * Copyright (C) 1996, Riley Rainey (rainey@netcom.com) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of either: + * + * a) the GNU Library General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your + * option) any later version. A description of the terms and conditions + * of the GLPL may be found in the "COPYING.LIB" file. + * + * b) the "Artistic License" which comes with this Kit. Information + * about this license may be found in the "Artistic" file. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License or the Artistic License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Information describing how to contact the author can be found in the + * README file. + */ + +/** + * Interface between the lower layer (see dis module) and upper layer (see disx + * module). + * + * @file + * @author Riley Rainey (rainey@netcom.com) + * @version $Date: 2017/05/19 16:16:54 $ + */ + +#ifndef DISX_H +#define DISX_H + +#include "dis.h" + +#ifdef disx_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +typedef struct { + dis_Transceiver *xcvr; + dis_pdu_header hdr; + dis_simulation_addr id; + u_short last_event; + u_long last_request; + u_short last_entity; +} disx_ApplicationInfo; + +/** + * Establishes the application’s connection to the DIS Network; also set the + * non-blocking mode on the transceiver socket. + * @param xcvr DIS transceiver. + * @param exercise_id DIS exercise number in [0,255]. + * @param site_id Site number in [0,65535]. + * @param application_id The DIS application id in [0,65535]. + * @return Initialized application information structure, or NULL if fails to + * set the non-blocking mode. + */ +EXTERN disx_ApplicationInfo * disx_initializeApplication( + dis_Transceiver *xcvr, + int exercise_id, + int site_id, + int application_id); + +/** + * Closes the application context and the underlying DIS transceiver. + * Does nothing if info is NULL. + * @param info + */ +EXTERN void disx_closeApplication(disx_ApplicationInfo *info); + +/** + * Returns the next PDU received from the DIS network. If no packet is available, + * it returns immediately. + * @param app The application information structure returned by + * disx_initializeApplication(). + * @param pdu + * @return True if a DIS PDU is available. False if no more packets are + * available. Invalid packets are skipped and an error message is logged. + */ +EXTERN int disx_readPDU(disx_ApplicationInfo *app, dis_pdu *pdu); + +/** + * Broadcasts the specified PDU onto the DIS network. It automatically fills in + * the following fields in the PDU: + * - protocol_version + * - exercise_id + * - protocol_family + * - length (always filled automatically) + * @param app The pointer to the application information structure returned by + * disx_initializeApplication(). + * @param pdu A pointer to the protocol data unit to be transmitted. Certain + * structure members are automatically inserted when disx_writePDU() is called. + * Those values are updated within the referenced structure. + * @return True on success. False if failed sending the packet to at least one + * destination address. Failing to encode the PDU is fatal. + */ +EXTERN int disx_writePDU(disx_ApplicationInfo *app, dis_pdu *pdu); + +/** + * Returns DIS simulation address in-use by this application. + * @param app The application information structure returned by + * disx_initializeApplication(). + * @param p Simulation address. + */ +EXTERN void disx_getSimulationAddress(disx_ApplicationInfo * app, + dis_simulation_addr * p); + +/** + * Allocate a unique DIS event ID for use by this application. + * @param app The application information structure returned by + * disx_initializeApplication(). + * @param event A pointer to an empty dis_event_id structure. It will be filled + * in by this function. + * @return Value of “event†that was passed to it. + */ +EXTERN dis_event_id * disx_issueEventID(disx_ApplicationInfo * app, + dis_event_id * event); + +/** + * Allocate a unique DIS entity ID for use by this application. The entity id + * returned by the first call will be 0x0000. The number returned on subsequent + * calls is always one greater than the previous call. + * @param app The application information structure returned by + * disx_initializeApplication(). + * @param p A pointer to an empty dis_entity_id structure. It will be filled in + * by this function. + * @return Value of “p†that was passed to it. + */ +EXTERN dis_entity_id *disx_issueEntityID(disx_ApplicationInfo * app, + dis_entity_id * p); + +EXTERN dis_request_id disx_issueRequestID(disx_ApplicationInfo * app); + +EXTERN int disx_setProtocolVersion(int version); + +EXTERN void disx_initializeDatumInfo(dis_datum_spec_record *pd); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/dis/dis/earth.c acm-6.0+20200416/src/dis/dis/earth.c --- acm-5.0/src/dis/dis/earth.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/dis/dis/earth.c 2020-04-16 12:05:40.000000000 +0000 @@ -0,0 +1,747 @@ +/* + * DIS/x : An implementation of the IEEE 1278.1 protocol + * + * Copyright (C) 1997, Riley Rainey (rrainey@ix.netcom.com) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of either: + * + * a) the GNU Library General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your + * option) any later version. A description of the terms and conditions + * of the GLPL may be found in the "COPYING.LIB" file. + * + * b) the "Artistic License" which comes with this Kit. Information + * about this license may be found in the "Artistic" file. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License or the Artistic License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Information describing how to contact the author can be found in the + * README file. + */ + +/* + * IMPLEMENTATION NOTES. + * + * "The Surveying Handbook", edited by Brinker and Minnick contains a decent + * discussion of the technical issues required to understand what's going on in + * this code. + */ + +#include +#include +#include +#include +/* + * Linker options collected by make-makefile script. + * LINKER_OPTIONS -lm + */ +#include + +#include "../../util/error.h" +#include "../../util/units.h" + +#define earth_IMPORT +#include "earth.h" +#undef earth_IMPORT + + +double earth_normalizeLatitude(double lat) +{ + if( ! isfinite(lat) ) + return lat; + /* Force range [-PI,+PI] by adding/removing multiples of 2*PI: */ + if(lat > M_PI) + lat = lat - 2*M_PI*(floor(lat / (2*M_PI)) + 1); + if(lat < -M_PI) + lat = lat + 2*M_PI*(floor(-lat / (2*M_PI)) + 1); + /* Normalize to the [-PI/2,+PI/2] range: */ + if (lat > M_PI_2) + lat = M_PI_2 - lat; + else if (lat < -M_PI_2) + lat = -M_PI - lat; + return lat; +} + + +double earth_normalizeLongitude(double lon) +{ + if( ! isfinite(lon) ) + return lon; + /* Force range [-PI,+PI] by adding/removing multiples of 2*PI: */ + if(lon > M_PI) + lon = lon - 2*M_PI*(floor(lon / (2*M_PI)) + 1); + if(lon < -M_PI) + lon = lon + 2*M_PI*(floor(-lon / (2*M_PI)) + 1); + /* Normalize to the ]-PI,+PI] range: */ + if( lon > M_PI ) + lon -= 2*M_PI; + else if( lon <= - M_PI ) + lon += 2*M_PI; + return lon; +} + + +void earth_updateLatLon(earth_LatLonAlt * p, + double cos_course, double sin_course, double d_meters) +{ + double n1, n2, m1; + double sin_lat, sin_lat_sqr, tan_lat, sin_course_sqr; + double delta_latitude, delta_longitude, d_sqr, cos_lat; + double B, C, /* D, */ E, h, sin_newlat; + +/* Increase our height to the height above the reference ellipsoid */ + + double wgs84_a = earth_MAJOR + p->z; + + sin_lat = sin(p->latitude); + sin_lat_sqr = sin_lat * sin_lat; + cos_lat = cos(p->latitude); + tan_lat = sin_lat / cos_lat; + sin_course_sqr = sin_course * sin_course; + d_sqr = d_meters * d_meters; + + n1 = wgs84_a / sqrt(1.0 - earth_ECCENTRICITY_SQR * sin_lat_sqr); + m1 = (wgs84_a * (1.0 - earth_ECCENTRICITY_SQR)) / + pow(1.0 - earth_ECCENTRICITY_SQR * sin_lat_sqr, 1.5); + + B = 1.0 / m1; + + h = d_meters * B * cos_course; + + C = tan_lat / (2.0 * m1 * n1); + +#ifdef notdef + D = (3.0 * earth_ECCENTRICITY_SQR * sin_lat * cos_lat) / + (2.0 * (1.0 - earth_ECCENTRICITY_SQR * sin_lat_sqr)); +#endif + + E = (1.0 + 3.0 * tan_lat * tan_lat) * + (1.0 - earth_ECCENTRICITY_SQR * sin_lat_sqr) / (6.0 * wgs84_a * wgs84_a); + + delta_latitude = d_meters * B * cos_course - + d_sqr * C * sin_course_sqr - + h * d_sqr * E * sin_course_sqr; + + p->latitude = earth_normalizeLatitude(p->latitude + delta_latitude); + + sin_newlat = sin(p->latitude); + + n2 = wgs84_a / sqrt(1.0 - earth_ECCENTRICITY_SQR * sin_newlat * sin_newlat); + + delta_longitude = (d_meters * sin_course) / (n2 * cos(p->latitude)); + + p->longitude = earth_normalizeLongitude(p->longitude + delta_longitude); +} + + +void earth_updateLatLonEx(earth_LatLonAlt * p, + double cos_course, double sin_course, double d_meters, + double * delta_course_rad ) +{ + double n1, n2, m1; + double sin_lat, sin_lat_sqr, tan_lat, sin_course_sqr; + double delta_latitude, delta_longitude, d_sqr, cos_lat; + double B, C, /* D, */ E, h, sin_newlat; + double old_latitude, phi_m, sin_phi_m, cos_phi_m; + +/* arc-seconds per rad */ + const double rho = 206264.8062470964; + +/* Increase our height to the height above the reference ellipsoid */ + + double wgs84_a = earth_MAJOR + p->z; + + sin_lat = sin(p->latitude); + sin_lat_sqr = sin_lat * sin_lat; + cos_lat = cos(p->latitude); + tan_lat = sin_lat / cos_lat; + sin_course_sqr = sin_course * sin_course; + d_sqr = d_meters * d_meters; + + n1 = wgs84_a / sqrt(1.0 - earth_ECCENTRICITY_SQR * sin_lat_sqr); + m1 = (wgs84_a * (1.0 - earth_ECCENTRICITY_SQR)) / + pow(1.0 - earth_ECCENTRICITY_SQR * sin_lat_sqr, 1.5); + + B = 1.0 / m1; + + h = d_meters * B * cos_course; + + C = tan_lat / (2.0 * m1 * n1); + +#ifdef notdef + D = (3.0 * earth_ECCENTRICITY_SQR * sin_lat * cos_lat) / + (2.0 * (1.0 - earth_ECCENTRICITY_SQR * sin_lat_sqr)); +#endif + + E = (1.0 + 3.0 * tan_lat * tan_lat) * + (1.0 - earth_ECCENTRICITY_SQR * sin_lat_sqr) / (6.0 * wgs84_a * wgs84_a); + + delta_latitude = d_meters * B * cos_course - + d_sqr * C * sin_course_sqr - + h * d_sqr * E * sin_course_sqr; + + old_latitude = p->latitude; + + p->latitude = earth_normalizeLatitude(p->latitude + delta_latitude); + + phi_m = old_latitude + delta_latitude / 2.0; + sin_phi_m = sin(phi_m); + cos_phi_m = cos(phi_m); + + sin_newlat = sin(p->latitude); + + n2 = wgs84_a / sqrt(1.0 - earth_ECCENTRICITY_SQR * sin_newlat * sin_newlat); + + delta_longitude = (d_meters * sin_course) / (n2 * cos(p->latitude)); + + *delta_course_rad = delta_longitude * sin_phi_m / cos(delta_latitude / 2.0) + + delta_longitude * (sin_phi_m * cos_phi_m * cos_phi_m) / rho; + + p->longitude = earth_normalizeLongitude(p->longitude + delta_longitude); +} + +char * earth_latitudeToString(char *s, int s_capacity, double la, earth_LatLonDisplayFormat mode) +{ + int s100, d, m; + double dla, dmin; + double round_dm = 1.0 / (600.0 * 2.0); + char ns; + + if( ! (isfinite(la) && -M_PI_2 <= la && la <= M_PI_2) ){ + // De-normalized or INF or NAN. + snprintf(s, s_capacity, "%g", la); + return s; + } + + // Beware: pay attention to printf() format descriptors ".1f" as a + // rounding might take place giving unexpected results, for example + // 59.95 would be rendered as "60.0" which is not a valid number of primes nor + // seconds! Better using int numbers representing the wanted precision and + // manage rounding ourself. + + round_dm = 0.0; + + switch (mode) { + + case earth_LLM_DMS: + ns = (la >= 0.0) ? 'N' : 'S'; + s100 = units_RADtoDEG(fabs(la)) * 360000 + 0.5; // hundreds of second + if( s100 > 360000 * 90 ){ + // Rounding fooled us... + s100 = 360000 * 90; + } + d = s100 / 360000; s100 -= 360000 * d; + m = s100 / 6000; s100 -= 6000 * m; + snprintf(s, s_capacity, "%02d-%02d-%02d.%02d%c", d, m, s100 / 100, s100 % 100, ns); + break; + + case earth_LLM_DM: + ns = (la >= 0.0) ? 'N' : 'S'; + dla = units_RADtoDEG(fabs(la)) + round_dm; + d = (int) dla; + dmin = (dla - (double) d) * 60.0; + snprintf(s, s_capacity, "%d %.1f %c", d, dmin, ns); + break; + + case earth_LLM_D: + ns = (la >= 0.0) ? 'N' : 'S'; + dla = units_RADtoDEG(fabs(la)); + snprintf(s, s_capacity, "%.1f %c", dla, ns); + break; + + case earth_LLM_SIGNED_D: + snprintf(s, s_capacity, "%.1f", units_RADtoDEG(la)); + break; + + default: + error_internal("invalid format descriptor: %d", mode); + } + + return s; +} + +char * earth_longitudeToString(char *s, int s_capacity, double lo, earth_LatLonDisplayFormat mode) +{ + int s100, d, m; + double dlo, dmin; + double round_dm = 1.0 / (600.0 * 2.0); + char ew; + + if( ! (isfinite(lo) && -M_PI <= lo && lo <= M_PI) ){ + // De-normalized or INF or NAN. + snprintf(s, s_capacity, "%g", lo); + return s; + } + + round_dm = 0.0; + + switch (mode) { + + case earth_LLM_DMS: + ew = (lo >= 0.0) ? 'E' : 'W'; + s100 = units_RADtoDEG(fabs(lo)) * 360000 + 0.5; // hundreds of second + if( s100 > 360000 * 180 ){ + // Rounding fooled us... + s100 = 360000 * 180; + } + d = s100 / 360000; s100 -= 360000 * d; + m = s100 / 6000; s100 -= 6000 * m; + sprintf(s, "%03d-%02d-%02d.%02d%c", d, m, s100 / 100, s100 % 100, ew); + break; + + case earth_LLM_DM: + ew = (lo >= 0.0) ? 'E' : 'W'; + dlo = units_RADtoDEG(fabs(lo)) + round_dm; + d = (int) dlo; + dmin = (dlo - (double) d) * 60.0; + snprintf(s, s_capacity, "%d %.1f %c", d, dmin, ew); + break; + + case earth_LLM_D: + ew = (lo >= 0.0) ? 'E' : 'W'; + dlo = units_RADtoDEG(fabs(lo)); + snprintf(s, s_capacity, "%.1f %c", dlo, ew); + break; + + case earth_LLM_SIGNED_D: + snprintf(s, s_capacity, "%.1f", units_RADtoDEG(lo)); + break; + + default: + error_internal("invalid format descriptor: %d", mode); + } + + return s; + +} + + +void earth_XYZToString(char *s, int s_capacity, VPoint *xyz) +{ + snprintf(s, s_capacity, "%.0f m, %.0f m, %.0f m", + xyz->x, xyz->y, xyz->z); +} + + +void earth_LatLonAltToString(char * s, int s_capacity, earth_LatLonAlt *w, + earth_LatLonDisplayFormat mode) +{ + char lat[99], lon[99]; + earth_latitudeToString(lat, sizeof(lat), w->latitude, mode); + earth_longitudeToString(lon, sizeof(lon), w->longitude, mode); + snprintf(s, s_capacity, "%s %s %.0f m", lat, lon, w->z); +} + + +void earth_XYZToLatLonAlt(VPoint * loc, earth_LatLonAlt * p) +{ + double a_sqr = earth_MAJOR * earth_MAJOR, b_sqr = earth_MINOR * earth_MINOR; + double w, x, x_sqr, z, delta_x, cos_x; + double f, f_prime, w0, z0; + + w = sqrt(loc->x * loc->x + loc->y * loc->y); + z = loc->z; + +/* + * x is the sine of the parametric latitude. Use the sine of the geocentric + * latitude as the initial guess. + */ + + if (w == 0.0 && z == 0.0) { + p->latitude = 0.0; + p->longitude = 0.0; + p->z = 0.0; + return; + } + + x = z / sqrt(w * w + z * z); + +/* + * Compute x with accuracy that will yield a lat/lon accuracy of + * about 0.0001 arc-seconds (~ 0.10 foot). + */ + + for (delta_x = 1.0; fabs(delta_x) > 4.8E-10;) { + + x_sqr = x * x; + + cos_x = sqrt(1.0 - x_sqr); + + f = 2.0 * (earth_MAJOR * x * w - a_sqr * x * cos_x - earth_MINOR * cos_x * z + + b_sqr * cos_x * x); + + f_prime = 2.0 * (a_sqr + 2.0 * (a_sqr * x_sqr) - earth_MAJOR * w * x_sqr + + b_sqr - 2.0 * b_sqr * x_sqr + earth_MINOR * x * z); + + delta_x = f / f_prime; + x -= delta_x; + } + + z0 = earth_MINOR * x; + w0 = earth_MAJOR * sqrt(1.0 - x * x); + + p->z = sqrt((z - z0) * (z - z0) + (w - w0) * (w - w0)); + p->latitude = atan(z0 / (w0 * (1.0 - earth_ECCENTRICITY_SQR))); + p->longitude = atan2(loc->y, loc->x); +} + + +void earth_LatLonAltToXYZ(earth_LatLonAlt * w, VPoint * p) +{ + double N, N1; + double cos_latitude, sin_latitude; + + sin_latitude = sin(w->latitude); + cos_latitude = cos(w->latitude); + +/* + * N is the length of the normal line segment from the surface to the + * spin axis. + */ + + N = earth_MAJOR / sqrt(1.0 - (earth_ECCENTRICITY_SQR * sin_latitude * sin_latitude)); + +/* + * N1 lengthens the normal line to account for height above the surface + */ + + N1 = N + w->z; + + p->x = N1 * cos_latitude * cos(w->longitude); + p->y = N1 * cos_latitude * sin(w->longitude); + p->z = (((earth_MINOR * earth_MINOR) / (earth_MAJOR * earth_MAJOR)) * N + w->z) * sin_latitude; +} + +/* + * Symbols scanner for geographical coordinates. + */ + +#define STATE_INITIAL 0 +#define STATE_WORD 1 +#define STATE_INTEGER 2 +#define STATE_FLOAT 3 + +typedef enum { + EndOfFile, + TOKEN_FLOAT, + TOKEN_LONG, + TOKEN_DASH, + TOKEN_NORTH, + TOKEN_SOUTH, + TOKEN_EAST, + TOKEN_WEST +} token_id; + +typedef union { + double double_value; + long long_value; +} lex_val; + +static lex_val lex_value; + +struct lex_record { + char *s; + FILE *f; + int lookahead_valid; + int lookahead; + int stack_top; + lex_val value_stack[16]; +}; + +static int +input(struct lex_record *p) +{ + int val; + + if (p->lookahead_valid) { + p->lookahead_valid = 0; + val = p->lookahead; + } + else if (p->s) { + val = *(p->s)++; + } + else { + val = fgetc(p->f); + } + return val; +} + +#define push_value(p, type, val) \ + p->value_stack[p->stack_top++].type = val + +#define pop_value(p, type) (p->value_stack[--p->stack_top].type) + +#define unput(p, c) { p->lookahead = c; p->lookahead_valid = 1; } + +#define InitializeLexRecord(p) { p->lookahead_valid = 0; } + +static char token[256]; +static int token_length = 0; + +static token_id +NextTokenx(struct lex_record *p) +{ + register int c, state = STATE_INITIAL; + + token_length = 0; + + while ((c = input(p)) != EOF) { + + switch (state) { + + case STATE_INITIAL: + + if (isspace(c)) { + continue; + } + else if (isdigit(c)) { + token[token_length++] = c; + state = STATE_INTEGER; + } + else if (c == '.') { + token[token_length++] = c; + state = STATE_FLOAT; + } + else { + token[0] = c; + token[1] = '\0'; +#ifdef DEBUG + printf("other %s\n", token); +#endif + switch (c) { + case '-': + return TOKEN_DASH; + case 'n': + case 'N': + return TOKEN_NORTH; + case 'e': + case 'E': + return TOKEN_EAST; + case 's': + case 'S': + return TOKEN_SOUTH; + case 'w': + case 'W': + return TOKEN_WEST; +/* + * invalid character + */ + default: + return EndOfFile; + } + } + break; + + case STATE_INTEGER: + case STATE_FLOAT: + if (isspace(c) || + c == '-' || + toupper(c) == 'N' || + toupper(c) == 'S' || + toupper(c) == 'W' || + toupper(c) == 'E') { + token[token_length] = '\0'; + unput(p, c); + if (state == STATE_INTEGER) { + lex_value.long_value = atoi(token); + return TOKEN_LONG; + } + else { + lex_value.double_value = atof(token); + return TOKEN_FLOAT; + } + } + else { + if (c == '.') { + state = STATE_FLOAT; + } + token[token_length++] = c; + } + break; + + default: + token[token_length++] = c; + break; + } + } + + return EndOfFile; +} + +static token_id +NextToken(struct lex_record *p) +{ + token_id t; + + t = NextTokenx(p); + +#ifdef DEBUG + printf("token %s\n", token); +#endif + return t; +} + +static int +ParseLatitude(struct lex_record *p) +{ + double x = 0.0; + double divider = 1.0; + int int_valid = 1; + token_id t; + + t = NextToken(p); + for (;;) { + switch (t) { + case TOKEN_NORTH: + lex_value.double_value = x; + return 0; + + case TOKEN_SOUTH: + lex_value.double_value = -x; + return 0; + + case TOKEN_LONG: + if (int_valid) { + x += lex_value.long_value / divider; + divider *= 60.0; + t = NextToken(p); + if (t == TOKEN_DASH) { + t = NextToken(p); + } + } + else { + return -1; + } + break; + + case TOKEN_FLOAT: + int_valid = 0; + x += lex_value.double_value / divider; + divider *= 60.0; + t = NextToken(p); + if (t == TOKEN_DASH) { + t = NextToken(p); + } + break; + default: + return -1; + } + } +} + +static int +ParseLongitude(struct lex_record *p) +{ + double x = 0.0; + double divider = 1.0; + int t, int_valid = 1; + + t = NextToken(p); + for (;;) { + switch (t) { + case TOKEN_EAST: + lex_value.double_value = x; + return 0; + + case TOKEN_WEST: + lex_value.double_value = -x; + return 0; + + case TOKEN_LONG: + if (int_valid) { + x += lex_value.long_value / divider; + divider *= 60.0; + t = NextToken(p); + if (t == TOKEN_DASH) { + t = NextToken(p); + } + } + else { + return -1; + } + break; + + case TOKEN_FLOAT: + int_valid = 0; + x += lex_value.double_value / divider; + divider *= 60.0; + t = NextToken(p); + if (t == TOKEN_DASH) { + t = NextToken(p); + } + break; + + default: + return -1; + } + } +} + + +int earth_parseLatitude(char *s, double *latitude_rad) +{ + struct lex_record p; + p.s = s; + p.lookahead_valid = 0; + if (ParseLatitude(&p) != 0) + return 0; + *latitude_rad = units_DEGtoRAD(lex_value.double_value); + return *p.s == 0; +} + + +int earth_parseLongitude(char *s, double *longitude_rad) +{ + struct lex_record p; + p.s = s; + p.lookahead_valid = 0; + if (ParseLongitude(&p) != 0) + return 0; + *longitude_rad = units_DEGtoRAD(lex_value.double_value); + return *p.s == 0; +} + + +char * +earth_parseLatLon(char *s, earth_LatLonAlt * w) +{ + struct lex_record p; + + p.s = s; + p.lookahead_valid = 0; + + if (ParseLatitude(&p) != 0) { + return 0; + } + w->latitude = units_DEGtoRAD(lex_value.double_value); + + if (ParseLongitude(&p) != 0) { + return 0; + } + w->longitude = units_DEGtoRAD(lex_value.double_value); + w->z = 0.0; + return p.s; +} + + +void earth_generateWorldToLocalMatrix(earth_LatLonAlt *w, VMatrix *XYZtoNED) +{ + VPoint gc, p; + VIdentMatrix(XYZtoNED); + VRotate(XYZtoNED, ZRotation, -w->longitude); + VRotate(XYZtoNED, YRotation, w->latitude); + VRotate(XYZtoNED, YRotation, units_DEGtoRAD(90.0)); + earth_LatLonAltToXYZ(w, &gc); + VTransform(&gc, XYZtoNED, &p); + XYZtoNED->m[0][3] = -p.x; + XYZtoNED->m[1][3] = -p.y; + XYZtoNED->m[2][3] = -p.z; +} diff -Nru acm-5.0/src/dis/dis/earth.h acm-6.0+20200416/src/dis/dis/earth.h --- acm-5.0/src/dis/dis/earth.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/dis/dis/earth.h 2020-04-16 12:05:40.000000000 +0000 @@ -0,0 +1,259 @@ +/* + * DIS/x : An implementation of the IEEE 1278.1 protocol + * + * Copyright (C) 1997, Riley Rainey (rrainey@ix.netcom.com) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of either: + * + * a) the GNU Library General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your + * option) any later version. A description of the terms and conditions + * of the GLPL may be found in the "COPYING.LIB" file. + * + * b) the "Artistic License" which comes with this Kit. Information + * about this license may be found in the "Artistic" file. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License or the Artistic License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Information describing how to contact the author can be found in the + * README file. + */ + +/** + * Earth Cartesian geocentric coordinates system, calculations and conversions. + * In the DIS 2.0 coordinate system: + * + * - positive X axis points to 0N, 0E + * - positive Y axis points to 0N 90E + * - positive Z axis is North + * + * THE WGS84 ELLIPSOID + * The world is considered a perfect ellipsoid based on the WGS84 standard -- + * no correction is made to take into account height differences between the + * ellipsoid and the actual shape of the Earth (the "geoid"). The surface of the + * WGS84 ellipsoid is described by the equation below: + * + * x^2/a^2 + y^2/a^2 + z^2/b^2 = 1 + * + * where "a" the equatorial (or major) semi-axis, and "b" is the polar (or minor) + * semi-axis of the ellipsoid. This surface is our "sea level" and all the + * altitudes are referred to this base level. Note that the z axis is the spin + * axis of our ellipsoidal Earth, and the x and y semi-axis are both equal to "a". + * The north pole is located at (0,0,b). + * The south pole is located at (0,0,-b). + * The equatorial line is the circle x^2 + y^2 = a^2 with z=0. + * The zero meridian of Greenwich is the semi-ellipse x^2/a^2 + z^2/b^2 = 1 + * with x >= 0, y = 0. + * + * DEFINITION OF THE GEODETIC LONGITUDE + * Because of this symmetry around the z spin axis, the geodetic longitude can + * be easily defined and calculated for any given point (x,y,z) as: + * + * longitude = atan(y/x) + * + * This formula is valid for any point, at any longitude, any latitude and + * altitude, and not only for the points on the ellipsoid. + * + * DEFINITION OF LOCAL VERTICAL + * For any point on the surface of the ellipsoid, the line perpendicular to the + * surface is the local vertical (our "plumb line") and the tangent plane is our + * local horizon. Note that the local vertical line DOES NOT cross the center of + * the ellipsoid as it would on a simple sphere. + * + * DEFINITION OF THE GEODETIC ALTITUDE + * The geodetic altitude of a point (x,y,z) above (or even below) the surface of + * the ellipsoid is defined as the distance of the point from the surface of the + * ellipsoid measured over a line perpendicular to the ellipsoid, that is over + * the local vertical. The altitude is taken positive above the surface, negative + * below. + * + * DEFINITION OF THE GEODETIC LATITUDE + * The geodetic latitude of a point is defined as the angle between the local + * vertical line and the xy plane, taken positive for z>0. + * + * @file + * @author Riley Rainey + * @version $Date: 2020/01/08 06:20:05 $ + */ + +#ifndef EARTH_H +#define EARTH_H + +#include "../../V/Vlibmath.h" + +#ifdef earth_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +/** WGS84 equatorial semi-axis "a" (m). */ +#define earth_MAJOR 6378137.0 + +/** WGS84 polar semi-axis "b" (m). */ +#define earth_MINOR 6356752.3142 + +/** Eccentricity = sqrt(1 - (b/a)^2). */ +#define earth_ECCENTRICITY 0.081819190928906199466 + +/** Eccentricity squared. */ +#define earth_ECCENTRICITY_SQR 0.006694380004260806515 + +/** + * Geodetic coordinates of a point. + */ +typedef struct { + + /** Geodetic latitude (RAD, [M_PI/2, -M_PI/2]). */ + double latitude; + + /** Geodetic longitude (RAD, [-M_PI, M_PI]). */ + double longitude; + + /** Geodetic altitude (m). */ + double z; + +} earth_LatLonAlt; + +typedef enum { + earth_LLM_DMS, /* dd-mm-ss.ss[EWNS] */ + earth_LLM_DM, /* dd mm [EWNS] */ + earth_LLM_D, /* dd [EWNS] */ + earth_LLM_SIGNED_D +} earth_LatLonDisplayFormat; + +/** + * Normalizes the latitude. + * @param lat Latitude to normalize (RAD). + * @return Latitude normalized to the range [-M_PI/2,+M_PI/2]. If not finite, + * returns the value itself. + */ +EXTERN double earth_normalizeLatitude(double lat); + +/** + * Normalizes the longitude. + * @param lon Longitude to normalize (RAD). + * @return Longitude normalized to the range ]-M_PI,+M_PI]. If not finite, + * returns the value itself. + */ +EXTERN double earth_normalizeLongitude(double lon); + +/** + * Shift location d meters on a given geodetic course (radians). As usual, + * course 0 degrees is north, course 90 degrees is east. + * FIXME: the result is undefined at and near the north and south pole, and + * quite random numbers come out. + * @param p + * @param sin_course Sine of the course. + * @param cos_course Cosine of the course. + * @param d_meters Step length, constant altitude (m). + */ +EXTERN void earth_updateLatLon(earth_LatLonAlt * p, + double sin_course, double cos_course, double d_meters); + +/** + * Shift location d_meters meters on a given geodetic course (radians). + * FIXME: the result is undefined at and near the north and south pole, and + * quite random numbers come out. + * @return new outbound heading correct for the new location in delta_course_rad + */ +EXTERN void earth_updateLatLonEx(earth_LatLonAlt * p, + double cos_course, double sin_course, double d_meters, + double * delta_course_rad ); + +/** + * Format a latitude. If the latitude is not finite or out of the range, then + * the literal number is returned using the standard "%g" format descriptor. + * @param s Destination buffer. + * @param s_capacity Destination buffer capacity. + * @param la Latitude (RAD). + * @param mode + * @return Pointer to the same "s" string. + */ +EXTERN char * earth_latitudeToString(char *s, int s_capacity, double la, earth_LatLonDisplayFormat mode); + +/** + * Format a longitude. If the latitude is not finite or out of the range, then + * the literal number is returned using the standard "%g" forma descriptor. + * @param s Destination buffer. + * @param s_capacity Destination buffer capacity. + * @param lo Longitude (RAD). + * @param mode + * @return Pointer to the same "s" string. + */ +EXTERN char * earth_longitudeToString(char *s, int s_capacity, double lo, earth_LatLonDisplayFormat mode); + +/** + * Formats Cartesian coordinates of a point on the Earth, rounded to 1 meter of + * precision. + * @param s Destination string. + * @param s_capacity Capacity of the destination string. + * @param xyz Cartesian coordinates of the point (m). + */ +EXTERN void earth_XYZToString(char *s, int s_capacity, VPoint *xyz); + +/** + * Formats geographic coordinates. + * @param s Destination string. + * @param s_capacity Capacity of the destination string. + * @param w Geographic coordinates to format. + * @param mode + */ +EXTERN void earth_LatLonAltToString(char * s, int s_capacity, + earth_LatLonAlt *w, earth_LatLonDisplayFormat mode); + +/** + * Convert Cartesian coordinates into WGS84 geodetic lat/lon/z. + * @param p Cartesian coordinates to convert (m). + * @param w Resulting world coordinates. + */ +EXTERN void earth_XYZToLatLonAlt(VPoint * p, earth_LatLonAlt * w); + +/** + * Convert WGS84 geodetic lat/lon/z into Cartesian coordinates. + * @param w World coordinates to convert. + * @param Resulting Cartesian coordinates (m). + */ +EXTERN void earth_LatLonAltToXYZ(earth_LatLonAlt * w, VPoint * p); + +/** + * Parse a latitude string. Example: "12-34-56.7N" or "12.5824N". + * @param s Latitude string. + * @param latitude_rad Resulting parsed latitude (RAD). + * @return True if parsing succeeded. + */ +EXTERN int earth_parseLatitude(char *s, double *latitude_rad); + +/** + * Parse a longitude string. Example: "123-45-06.7E" or "123.7519E". + * @param s Longitude string. + * @param longitude_rad Resulting parsed longitude (RAD). + * @return True if parsing succeeded. + */ +EXTERN int earth_parseLongitude(char *s, double *longitude_rad); + +/** + * Parse latitude and longitude string. + * @param s Latitude and longitude separated by at least one white space + * character; the syntax of each component is the same of a single latitude + * and longitude. + * @param w Here returns parsed latitude and longitude; altitude set to zero. + * @return True if parsing succeeded. + */ +EXTERN char * earth_parseLatLon(char *s, earth_LatLonAlt * w); + +/** + * Generate a transform matrix to get from Cartesian to local NED coordinates. + */ +EXTERN void earth_generateWorldToLocalMatrix(earth_LatLonAlt *w, VMatrix *XYZtoNED); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/dis/dis/Makefile acm-6.0+20200416/src/dis/dis/Makefile --- acm-5.0/src/dis/dis/Makefile 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/dis/dis/Makefile 2017-10-20 00:57:22.000000000 +0000 @@ -0,0 +1,35 @@ +# This file generated by make-makefile, do not edit! +# Create Makefile-include.txt instead for your customizations. +CC := gcc +CFLAGS := -Wall -Werror -g -fmax-errors=99 -Wuninitialized -Wmissing-prototypes -Wredundant-decls +LIBS := + +.PHONY: all +all: + make datum.o dis.o disx.o earth.o xdr.o xdr_dis.o + +include Makefile-include.txt + +.PHONY: clean +clean: + rm -f *.o *.exe *.stackdump + +datum.o: datum.c datum.h + $(CC) $(CFLAGS) -c datum.c -o datum.o + +dis.o: dis.c dis.h ../../V/Vlibmath.h ../../util/error.h ../../util/memory.h datum.h earth.h xdr.h xdr_dis.h + $(CC) $(CFLAGS) -c dis.c -o dis.o + +disx.o: disx.c disx.h ../../V/Vlibmath.h ../../util/memory.h dis.h earth.h + $(CC) $(CFLAGS) -c disx.c -o disx.o + +earth.o: earth.c earth.h ../../V/Vlibmath.h ../../util/units.h + $(CC) $(CFLAGS) -c earth.c -o earth.o + +xdr.o: xdr.c xdr.h ../../util/memory.h + $(CC) $(CFLAGS) -c xdr.c -o xdr.o + +xdr_dis.o: xdr_dis.c xdr_dis.h ../../V/Vlibmath.h ../../util/error.h datum.h dis.h earth.h xdr.h + $(CC) $(CFLAGS) -c xdr_dis.c -o xdr_dis.o + +# Checksum of the original file: 1870947444 diff -Nru acm-5.0/src/dis/dis/Makefile-include.txt acm-6.0+20200416/src/dis/dis/Makefile-include.txt --- acm-5.0/src/dis/dis/Makefile-include.txt 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/dis/dis/Makefile-include.txt 2017-05-16 04:10:41.000000000 +0000 @@ -0,0 +1,10 @@ +.PHONY: rebuild +rebuild: clean + find . -mindepth 1 -type d \ + | while read d; do \ + if [ -f $$d/Makefile ]; then \ + echo "$$d"; \ + (cd $$d; check-included && make-makefile); \ + fi \ + done + make diff -Nru acm-5.0/src/dis/dis/xdr.c acm-6.0+20200416/src/dis/dis/xdr.c --- acm-5.0/src/dis/dis/xdr.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/dis/dis/xdr.c 2018-04-02 06:09:56.000000000 +0000 @@ -0,0 +1,494 @@ +/* + * DIS/x : An implementation of the IEEE 1278.1 protocol + * + * Copyright (C) 1996, Riley Rainey (rainey@netcom.com) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of either: + * + * a) the GNU Library General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your + * option) any later version. A description of the terms and conditions + * of the GLPL may be found in the "COPYING.LIB" file. + * + * b) the "Artistic License" which comes with this Kit. Information + * about this license may be found in the "Artistic" file. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License or the Artistic License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Information describing how to contact the author can be found in the + * README file. + */ +/* + * Sun RPC is a product of Sun Microsystems, Inc. and is provided for + * unrestricted use provided that this legend is included on all tape + * media and as a part of the software program in whole or part. Users + * may copy or modify Sun RPC without charge, but are not authorized + * to license or distribute it to anyone else except as part of a product or + * program developed by the user. + * + * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE + * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR + * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. + * + * Sun RPC is provided with no support and without any obligation on the + * part of Sun Microsystems, Inc. to assist in its use, correction, + * modification or enhancement. + * + * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE + * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC + * OR ANY PART THEREOF. + * + * In no event will Sun Microsystems, Inc. be liable for any lost revenue + * or profits or other special, indirect and consequential damages, even if + * Sun has been advised of the possibility of such damages. + * + * Sun Microsystems, Inc. + * 2550 Garcia Avenue + * Mountain View, California 94043 + */ + +/* + * xdr_mem.h, XDR implementation using memory buffers. + * + * Copyright (C) 1984, Sun Microsystems, Inc. + * + * If you have some data to be interpreted as external data representation + * or to be converted to external data representation in a memory buffer, + * then this is the package for you. + */ + +#include +#ifdef WINNT +#include +#else +#include +#endif +#include +#include +#include + +#include "../../util/memory.h" + +#define xdr_IMPORT +#include "xdr.h" + + +/** + * Entry of the list of dynamically allocated blocks created while decoding. + * If the decoding process fails, the allocated blocks can then be released. + */ +typedef struct xdr_Allocated { + /** Next element in the list of allocated blocks, or next recycled element. */ + struct xdr_Allocated *next; + /** Allocated block. */ + void *allocated; +} xdr_Allocated; + + +/** + * Released elements that can be recycled. + */ +static xdr_Allocated *recycle_xdr_Allocated; + + +/** + * Encoder/decoder state. The currently performed operation is set in the + * constructor and never changes during the lifetime of this object. + * The working buffer must be provided by the user; while encoding, its size + * should be large enough to contain the resulting encoded packet or a failure + * is triggered. While decoding, manages a list of dynamically allocated blocks + * that can be released if the operation fails; this implies that any user's + * data decoded so far gets destroyed if the decoding fails. + */ +struct xdr_Type { + xdr_Type *next_recycled; /* recycle list */ + xdr_Operation op; /* operation */ + char * buffer; /* working buffer */ + char * next_byte; /* pointer to next byte in the buffer */ + unsigned int bytes_left; /* bytes left in the buffer */ + xdr_Allocated *allocated; /* list of allocated blocks while decoding */ + char *error_description; /* latest error description */ +}; + + +/** + * Objects that where released with xdr_free() and can be recycled. + */ +static xdr_Type *recycle_xdr_Type; + + +/** + * Callback for memory module that releases the content of a xdr_Type. + * @param p Pointer to the xdr_Type to release. + */ +static void +xdr_destruct(void *p) +{ + xdr_Type *xdr = p; + while( xdr->allocated != NULL ){ + xdr_Allocated *e = xdr->allocated; + xdr->allocated = e->next; + e->next = recycle_xdr_Allocated; + e->allocated = NULL; + recycle_xdr_Allocated = e; + } +} + + +/** + * Module cleanup callback to be registered in the memory module. + */ +static void +xdr_cleanup() +{ + while(recycle_xdr_Type != NULL){ + xdr_Type *next = recycle_xdr_Type->next_recycled; + memory_dispose(recycle_xdr_Type); + recycle_xdr_Type = next; + } + + while(recycle_xdr_Allocated != NULL){ + xdr_Allocated *next = recycle_xdr_Allocated->next; + memory_dispose(recycle_xdr_Allocated); + recycle_xdr_Allocated = next; + } +} + + +xdr_Type * +xdr_new(char * buffer, unsigned int size, xdr_Operation op) +{ + xdr_Type *xdr; + if( recycle_xdr_Type == NULL ){ + memory_registerCleanup(xdr_cleanup); + xdr = memory_allocate(sizeof(*xdr), xdr_destruct); + } else { + xdr = recycle_xdr_Type; + recycle_xdr_Type = recycle_xdr_Type->next_recycled; + } + memory_zero(xdr); + xdr->op = op; + xdr->buffer = buffer; + xdr->next_byte = buffer; + xdr->bytes_left = size; + xdr->allocated = NULL; + xdr->error_description = NULL; + return xdr; +} + + +void +xdr_free(xdr_Type *xdr) +{ + if( xdr == NULL ) + return; + xdr_destruct(xdr); + xdr->next_recycled = recycle_xdr_Type; + recycle_xdr_Type = xdr; +} + + +int xdr_setError(xdr_Type *xdr, char *description) +{ + xdr->error_description = description; + while(xdr->allocated != NULL){ + xdr_Allocated *a = xdr->allocated; + memory_dispose(a->allocated); + a->allocated = NULL; + xdr->allocated = a->next; + a->next = recycle_xdr_Allocated; + recycle_xdr_Allocated = a; + } + return 0; +} + + +char * xdr_getErrorDescription(xdr_Type *xdr) +{ + return xdr->error_description; +} + + +/** + * Registers a dynamically allocated block created while decoding, so that + * these blocks can be released if the decoding operation fails. + * @param xdr Decoding context. + * @param allocated Pointer to the allocated block. + */ +static void xdr_addAllocated(xdr_Type *xdr, void *allocated) +{ + xdr_Allocated *a; + + if( recycle_xdr_Allocated == NULL ){ + a = memory_allocate(sizeof(*a), NULL); + } else { + a = recycle_xdr_Allocated; + recycle_xdr_Allocated = a->next; + } + + a->next = xdr->allocated; + a->allocated = allocated; + xdr->allocated = a; +} + + +xdr_Operation xdr_getOperation(xdr_Type * xdr) +{ + return xdr->op; +} + + +unsigned int xdr_getpos(xdr_Type *xdr) +{ + return (unsigned int) (xdr->next_byte - xdr->buffer); +} + + +int xdr_setpos(xdr_Type *xdr, unsigned int pos) +{ + char *newaddr = xdr->buffer + pos; + char *lastaddr = xdr->next_byte + xdr->bytes_left; + + if ((long) newaddr > (long) lastaddr + || (UINT_MAX < LONG_MAX && (long) UINT_MAX < (long) lastaddr - (long) newaddr)) + return xdr_setError(xdr, "xdr_setpos(): position set beyond unsigned int 32 bits limits"); + xdr->next_byte = newaddr; + xdr->bytes_left = (int) (lastaddr - newaddr); + return 1; +} + + +static int +xdr_getint32(xdr_Type * xdr, int32_t *lp) +{ + int32_t tmp; + + if (xdr->bytes_left < sizeof(int32_t)) + return xdr_setError(xdr, "xdr_getint32(): premature end of the buffer"); + xdr->bytes_left -= sizeof(int32_t); + bcopy(xdr->next_byte, (char *) &tmp, sizeof(int32_t)); + + *lp = (int32_t) ntohl((int32_t) tmp); + xdr->next_byte += sizeof(int32_t); + + return 1; +} + + +static int +xdr_putint32(xdr_Type * xdr, int32_t *lp) +{ + int32_t tmp; + + if (xdr->bytes_left < sizeof(int32_t)) + return xdr_setError(xdr, "xdr_putint32(): premature end of the buffer"); + xdr->bytes_left -= sizeof(int32_t); + + tmp = (int32_t) htonl((uint32_t) (*lp)); + bcopy((char *) &tmp, xdr->next_byte, sizeof(int32_t)); + xdr->next_byte += sizeof(int32_t); + + return 1; +} + + +int +xdr_getBytes(xdr_Type * xdr, void *addr, unsigned int len) +{ + if (xdr->bytes_left < len) + return xdr_setError(xdr, "xdr_getBytes(): premature end of the buffer"); + xdr->bytes_left -= len; + bcopy(xdr->next_byte, addr, len); + xdr->next_byte += len; + return 1; +} + + +int xdr_getBytesAllocated(xdr_Type * xdr, void **addr, unsigned int len, int add_nul) +{ + if (xdr->bytes_left < len) + return xdr_setError(xdr, "xdr_getBytesAllocated(): premature end of the buffer"); + xdr->bytes_left -= len; + *addr = memory_allocate(len + (add_nul? 1 : 0), NULL); + xdr_addAllocated(xdr, *addr); + bcopy(xdr->next_byte, *addr, len); + if( add_nul ) + ((char *) *addr)[len] = 0; + xdr->next_byte += len; + return 1; +} + + +int +xdr_putBytes(xdr_Type * xdr, void *addr, unsigned int len) +{ + if (xdr->bytes_left < len) + return xdr_setError(xdr, "xdr_putBytes(): premature end of the buffer"); + xdr->bytes_left -= len; + bcopy(addr, xdr->next_byte, len); + xdr->next_byte += len; + return 1; +} + + +int +xdr_var_array(xdr_Type * xdr, void * * addrp, unsigned int size, + unsigned int elsize, xdr_Callback elproc) +{ + unsigned int i; + void *target; + int stat; + unsigned int nodesize; + + if ( UINT_MAX/elsize < size ) + return xdr_setError(xdr, "xdr_var_array(): array size exceeds unsigned int 32 bits capacity"); + nodesize = size * elsize; + + /* + * The memory module causes a fatal error if a huge memory space is requested, + * so ill formed packets coming from the network may cause a crash is we try + * to blindly allocate memory. Since we expect at least one byte per element, + * there can't be more elements to decode than the number of bytes left in + * the buffer. + */ + if( size > xdr->bytes_left ) + return xdr_setError(xdr, "xdr_var_array(): array size exceeds the space left in the buffer"); + + /* + * If we are deserializing, we may need to allocate an array. + * We also save time by checking for a null array if we are freeing. + * + * * Always allocate storage when decoding. * + */ + if (*addrp == NULL || xdr->op == xdr_DECODE){ + switch (xdr->op) { + + case xdr_DECODE: + if (size == 0){ + *addrp = NULL; + return 1; + } + *addrp = memory_allocate(nodesize, NULL); + xdr_addAllocated(xdr, *addrp); + memset(*addrp, 0, nodesize); + target = *addrp; + break; + + case xdr_FREE: + return 1; + + case xdr_ENCODE: + break; + } + } + + /* + * now we xdr each element of array + */ + target = *addrp; + stat = 1; + for (i = 0; (i < size) && stat; i++) { + stat = (*elproc) (xdr, target); + target += elsize; + } + + /* + * the array may need freeing + */ + if (xdr->op == xdr_FREE) { + memory_dispose(*addrp); + *addrp = NULL; + } + return stat; +} + + +#define IS_LITTLE_ENDIAN (((char *)&(int){1})[0] == 1) + + +int xdr_int32(xdr_Type *xdr, int32_t *i) +{ + switch(xdr->op){ + case xdr_ENCODE: return xdr_putint32(xdr, i); + case xdr_DECODE: return xdr_getint32(xdr, i); + case xdr_FREE: return 1; + default: abort(); + } +} + + +int xdr_uint32(xdr_Type *xdr, uint32_t *ui) +{ + return xdr_int32(xdr, (int32_t *) ui); +} + + +int xdr_char(xdr_Type *xdr, char *c) +{ + int32_t tmp; + + if( xdr->op == xdr_ENCODE ){ + tmp = *c & 255; + return xdr_int32(xdr, &tmp); + } else if( xdr->op == xdr_DECODE ){ + if( ! xdr_int32(xdr, &tmp) ) + return xdr_setError(xdr, "xdr_char(): premature end of the buffer while reading 32 bits word"); + *c = tmp & 255; + return 1; + } + return 1; +} + + +int xdr_float(xdr_Type *xdr, float *f) +{ + return xdr_int32(xdr, (int32_t *) f); +} + + +int xdr_double(xdr_Type *xdr, double *d) +{ + switch(xdr->op){ + + case xdr_ENCODE: + if( IS_LITTLE_ENDIAN ) + return xdr_putint32(xdr, (int32_t *)((char *) d + 4)) + && xdr_putint32(xdr, (int32_t *)((char *) d)); + else + return xdr_putint32(xdr, (int32_t *)((char *) d)) + && xdr_putint32(xdr, (int32_t *)((char *) d + 4)); + + case xdr_DECODE: + if( IS_LITTLE_ENDIAN ) + return xdr_getint32(xdr, (int32_t *)((char *) d + 4)) + && xdr_getint32(xdr, (int32_t *)((char *) d)); + else + return xdr_getint32(xdr, (int32_t *)((char *) d)) + && xdr_getint32(xdr, (int32_t *)((char *) d + 4)); + + case xdr_FREE: + return 1; + + default: abort(); + } +} + + +int xdr_vector(xdr_Type *xdr, char *arrp, unsigned int size, + unsigned int elsize, xdr_Callback elproc) +{ + unsigned int i; + for(i = 0; i < size; i++){ + if( ! elproc(xdr, arrp + i*elsize) ) + return 0; + } + return 1; +} diff -Nru acm-5.0/src/dis/dis/xdr_dis.c acm-6.0+20200416/src/dis/dis/xdr_dis.c --- acm-5.0/src/dis/dis/xdr_dis.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/dis/dis/xdr_dis.c 2017-10-22 15:10:25.000000000 +0000 @@ -0,0 +1,1802 @@ +/* + * DIS/x : An implementation of the IEEE 1278.1 protocol + * + * Copyright (C) 1997, Riley Rainey (rrainey@ix.netcom.com) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of either: + * + * a) the GNU Library General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your + * option) any later version. A description of the terms and conditions + * of the GLPL may be found in the "COPYING.LIB" file. + * + * b) the "Artistic License" which comes with this Kit. Information + * about this license may be found in the "Artistic" file. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License or the Artistic License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Information describing how to contact the author can be found in the + * README file. + */ + +#include +#include + +#include "../../util/error.h" +#include "datum.h" + +#define xdr_dis_IMPORT +#include "xdr_dis.h" + +/* + * This file was manually generated. It was NOT created by RPCGEN. + * It contains xdr definitions for structures that do not fit the + * conventional RPCGEN structure model for variable length vectors or + * union definitions. + */ + +/* + * These xdr_byte_*() routines act just as their xdr_ equivalents except that + * input data is not required to be aligned on a 4-byte boundary. This + * implies that data alignment is the responsibility of the protocol + * designer. + */ + +static int +xdr_byte_opaque(xdr_Type * xdrs, void * cp, u_int cnt) +{ + + /* + * if no data we are done + */ + if (cnt == 0) + return 1; + + if (xdr_getOperation(xdrs) == xdr_DECODE) { + if (!xdr_getBytes(xdrs, cp, cnt)) { + return 0; + } + return 1; + } + + if (xdr_getOperation(xdrs) == xdr_ENCODE) { + if (!xdr_putBytes(xdrs, cp, cnt)) { + return 0; + } + return 1; + } + + if (xdr_getOperation(xdrs) == xdr_FREE) { + return 1; + } + + return 0; +} + +static int +xdr_byte_uint32(xdr_Type * xdrs, uint32_t *cp) +{ + uint32_t u; + + u = htonl(*cp); + if (!xdr_byte_opaque(xdrs, &u, 4)) { + return 0; + } + if (xdr_getOperation(xdrs) == xdr_DECODE ) + *cp = ntohl(u); + return 1; +} + +static int +xdr_byte_uint16(xdr_Type * xdrs, uint16_t *cp) +{ + u_short u; + + u = htons(*cp); + if (!xdr_byte_opaque(xdrs, &u, 2)) { + return 0; + } + if (xdr_getOperation(xdrs) == xdr_DECODE ) + *cp = ntohs(u); + return 1; +} + +static int +xdr_byte_uchar(xdr_Type * xdrs, u_char * cp) +{ + return xdr_byte_opaque(xdrs, cp, 1); +} + + +static int +xdr_dis_variable_datum(xdr_Type * xdrs, dis_variable_datum * objp) +{ + static char pad[8]; /* force padding to be zeroes */ + int padbytes; + uint32_t len; + + if (!xdr_uint32(xdrs, &objp->datum_id)) { + return 0; + } + if (!xdr_uint32(xdrs, &objp->value_length)) { + return 0; + } + + switch (objp->datum_id) { + + /* + * Double variable data items + */ + + case datum_GeocentricCoordinatesX: + case datum_GeocentricCoordinatesY: + case datum_GeocentricCoordinatesZ: + if (!xdr_double(xdrs, &objp->value.double_value)) { + return 0; + } + break; + + /* + * BEWARE. + * ====== + * Datum type defaults to String, which are dynamically allocated and then + * must be released. Currently anything other than the types above is + * assumed to be string here and in the dis_disposeVariableDatum() function, + * then both MUST be kept synchronized. + */ + + default: + /* + * Assumes string of chars. Note that: + * - Length is given in bits (!), so the actual number of bytes is len/8. + * Here we ignore any fractional byte, that is we ignore the last + * 3 bits of the length. + * - Strings are padded to 8 bytes fields. + * - Decoding, strings are dynamically allocated and a trailing NUL byte + * is added for safety. + */ + len = objp->value_length / 8; + if( xdr_getOperation(xdrs) == xdr_ENCODE ){ + if( ! xdr_putBytes(xdrs, objp->value.ptr_value, len) ) + return 0; + padbytes = len % 8; + if (padbytes != 0) { + memset(pad, 0, 8 - padbytes); + if( ! xdr_putBytes(xdrs, pad, 8 - padbytes) ) + return 0; + } + + } else if( xdr_getOperation(xdrs) == xdr_DECODE ){ + if( ! xdr_getBytesAllocated(xdrs, (void **) &objp->value.ptr_value, len, 1) ) + return 0; + + padbytes = len % 8; + if (padbytes != 0) { + if( ! xdr_getBytes(xdrs, pad, 8 - padbytes) ) + return 0; + } + + } + break; + } + return 1; +} + +static int +xdr_dis_articulation_parm(xdr_Type * xdrs, dis_articulation_parm * objp) +{ + if (!xdr_byte_uchar(xdrs, &objp->type)) { + return 0; + } + if (!xdr_byte_uchar(xdrs, &objp->change)) { + return 0; + } + if (!xdr_byte_uint16(xdrs, &objp->attachment_id)) { + return 0; + } + if (!xdr_byte_uint32(xdrs, &objp->attached_part)) { + return 0; + } + if (!xdr_byte_uint32(xdrs, &objp->articulated_part)) { + return 0; + } + // FIXME: missing support for articulation parameter value. + // Here we should add a specific encoding for each type of parameter. + // Assume double just to pass incoming packets, but ignored by ACM anyway. + if (!xdr_double(xdrs, &objp->value.d)) { + return 0; + } + return 1; +} + +static int +xdr_dis_timestamp(xdr_Type * xdrs, dis_timestamp * objp) +{ + if (!xdr_uint32(xdrs, (u_int *) objp)) { + return 0; + } + return 1; +} + + +/* +static int +xdr_dis_float_vector(XDR *xdrs, dis_float_vector *objp) +{ + if (!xdr_float(xdrs, &objp->x)) { + return 0; + } + if (!xdr_float(xdrs, &objp->y)) { + return 0; + } + if (!xdr_float(xdrs, &objp->z)) { + return 0; + } + return 1; +} +*/ + +static int +xdr_dis_angular_vel_vector(xdrs, objp) + xdr_Type *xdrs; + dis_angular_vel_vector *objp; +{ + if (!xdr_float(xdrs, &objp->x)) { + return 0; + } + if (!xdr_float(xdrs, &objp->y)) { + return 0; + } + if (!xdr_float(xdrs, &objp->z)) { + return 0; + } + return 1; +} + + +static int +xdr_dis_linear_acc_vector(xdrs, objp) + xdr_Type *xdrs; + dis_linear_acc_vector *objp; +{ + if (!xdr_float(xdrs, &objp->x)) { + return 0; + } + if (!xdr_float(xdrs, &objp->y)) { + return 0; + } + if (!xdr_float(xdrs, &objp->z)) { + return 0; + } + return 1; +} + + +static int +xdr_dis_linear_vel_vector(xdrs, objp) + xdr_Type *xdrs; + dis_linear_vel_vector *objp; +{ + if (!xdr_float(xdrs, &objp->x)) { + return 0; + } + if (!xdr_float(xdrs, &objp->y)) { + return 0; + } + if (!xdr_float(xdrs, &objp->z)) { + return 0; + } + return 1; +} + + +static int +xdr_dis_entity_coord_vector(xdrs, objp) + xdr_Type *xdrs; + dis_entity_coord_vector *objp; +{ + if (!xdr_float(xdrs, &objp->x)) { + return 0; + } + if (!xdr_float(xdrs, &objp->y)) { + return 0; + } + if (!xdr_float(xdrs, &objp->z)) { + return 0; + } + return 1; +} + + +static int +xdr_dis_entity_type(xdrs, objp) + xdr_Type *xdrs; + dis_entity_type *objp; +{ + if (!xdr_byte_uchar(xdrs, &objp->kind)) { + return 0; + } + if (!xdr_byte_uchar(xdrs, &objp->domain)) { + return 0; + } + if (!xdr_byte_uint16(xdrs, &objp->country)) { + return 0; + } + if (!xdr_byte_uchar(xdrs, &objp->category)) { + return 0; + } + if (!xdr_byte_uchar(xdrs, &objp->subcategory)) { + return 0; + } + if (!xdr_byte_uchar(xdrs, &objp->specific)) { + return 0; + } + if (!xdr_byte_uchar(xdrs, &objp->extra)) { + return 0; + } + return 1; +} + + +static int +xdr_dis_entity_marking(xdrs, objp) + xdr_Type *xdrs; + dis_entity_marking *objp; +{ + if (!xdr_byte_uchar(xdrs, &objp->charset)) { + return 0; + } + if (!xdr_vector(xdrs, (char *)objp->marking, sizeof(objp->marking), sizeof(u_char), (xdr_Callback) xdr_byte_uchar)) { + return 0; + } + return 1; +} + + +static int +xdr_dis_fixed_datum(xdrs, objp) + xdr_Type *xdrs; + dis_fixed_datum *objp; +{ + if (!xdr_uint32(xdrs, &objp->datum_id)) { + return 0; + } + if (!xdr_uint32(xdrs, &objp->value)) { + return 0; + } + return 1; +} + + +static int +xdr_dis_simulation_addr(xdrs, objp) + xdr_Type *xdrs; + dis_simulation_addr *objp; +{ + if (!xdr_byte_uint16(xdrs, &objp->site_id)) { + return 0; + } + if (!xdr_byte_uint16(xdrs, &objp->application_id)) { + return 0; + } + return 1; +} + + +static int +xdr_dis_emitter_system(xdrs, objp) + xdr_Type *xdrs; + dis_emitter_system *objp; +{ + if (!xdr_byte_uint16(xdrs, &objp->name)) { + return 0; + } + if (!xdr_byte_uchar(xdrs, &objp->function)) { + return 0; + } + if (!xdr_byte_uchar(xdrs, &objp->id)) { + return 0; + } + return 1; +} + + +static int +xdr_dis_entity_id(xdrs, objp) + xdr_Type *xdrs; + dis_entity_id *objp; +{ + if (!xdr_dis_simulation_addr(xdrs, &objp->sim_id)) { + return 0; + } + if (!xdr_byte_uint16(xdrs, &objp->entity_id)) { + return 0; + } + return 1; +} + + +static int +xdr_dis_euler_angles(xdrs, objp) + xdr_Type *xdrs; + dis_euler_angles *objp; +{ + if (!xdr_float(xdrs, &objp->psi)) { + return 0; + } + if (!xdr_float(xdrs, &objp->theta)) { + return 0; + } + if (!xdr_float(xdrs, &objp->phi)) { + return 0; + } + return 1; +} + + +static int +xdr_dis_event_id(xdrs, objp) + xdr_Type *xdrs; + dis_event_id *objp; +{ + if (!xdr_dis_simulation_addr(xdrs, &objp->sim_id)) { + return 0; + } + if (!xdr_byte_uint16(xdrs, &objp->event_id)) { + return 0; + } + return 1; +} + + +static int +xdr_dis_fundamental_parameters(xdrs, objp) + xdr_Type *xdrs; + dis_fundamental_parameters *objp; +{ + if (!xdr_float(xdrs, &objp->freq)) { + return 0; + } + if (!xdr_float(xdrs, &objp->freq_range)) { + return 0; + } + if (!xdr_float(xdrs, &objp->erp)) { + return 0; + } + if (!xdr_float(xdrs, &objp->prf)) { + return 0; + } + if (!xdr_float(xdrs, &objp->pulse_width)) { + return 0; + } + if (!xdr_float(xdrs, &objp->beam_azimuth_center)) { + return 0; + } + if (!xdr_float(xdrs, &objp->beam_azimuth_sweep)) { + return 0; + } + if (!xdr_float(xdrs, &objp->beam_elev_center)) { + return 0; + } + if (!xdr_float(xdrs, &objp->beam_elev_sweep)) { + return 0; + } + if (!xdr_float(xdrs, &objp->beam_sweep_sync)) { + return 0; + } + return 1; +} + + +/* +static int +xdr_dis_modulation_type(xdrs, objp) + XDR *xdrs; + dis_modulation_type *objp; +{ + if (!xdr_byte_u_short(xdrs, &objp->spread_spectrum)) { + return 0; + } + if (!xdr_byte_u_short(xdrs, &objp->major_type)) { + return 0; + } + if (!xdr_byte_u_short(xdrs, &objp->detail)) { + return 0; + } + if (!xdr_byte_u_short(xdrs, &objp->system)) { + return 0; + } + return 1; +} +*/ + + +static int +xdr_dis_pdu_header(xdrs, objp) + xdr_Type *xdrs; + dis_pdu_header *objp; +{ + if (!xdr_byte_uchar(xdrs, &objp->protocol_version)) { + return 0; + } + if (!xdr_byte_uchar(xdrs, &objp->exercise_id)) { + return 0; + } + if (!xdr_byte_uchar(xdrs, &objp->pdu_type)) { + return 0; + } + if (!xdr_byte_uchar(xdrs, &objp->protocol_family)) { + return 0; + } + if (!xdr_dis_timestamp(xdrs, &objp->time_stamp)) { + return 0; + } + if (!xdr_byte_uint16(xdrs, &objp->length)) { + return 0; + } + if (!xdr_byte_uint16(xdrs, &objp->padding)) { + return 0; + } + return 1; +} + + +/* +static int +xdr_dis_double_vector(xdrs, objp) + XDR *xdrs; + dis_double_vector *objp; +{ + if (!xdr_byte_double(xdrs, &objp->x)) { + return 0; + } + if (!xdr_byte_double(xdrs, &objp->y)) { + return 0; + } + if (!xdr_byte_double(xdrs, &objp->z)) { + return 0; + } + return 1; +} +*/ + + +static int +xdr_earth_XYZ(xdrs, objp) + xdr_Type *xdrs; + VPoint *objp; +{ + if (!xdr_double(xdrs, &objp->x)) { + return 0; + } + if (!xdr_double(xdrs, &objp->y)) { + return 0; + } + if (!xdr_double(xdrs, &objp->z)) { + return 0; + } + return 1; +} + + +/* +static int +xdr_dis_relative_coordinates(xdrs, objp) + XDR *xdrs; + dis_relative_coordinates *objp; +{ + if (!xdr_float(xdrs, &objp->x)) { + return 0; + } + if (!xdr_float(xdrs, &objp->y)) { + return 0; + } + if (!xdr_float(xdrs, &objp->z)) { + return 0; + } + return 1; +} +*/ + + +/* +static int +xdr_dis_antenna_location(xdrs, objp) + XDR *xdrs; + dis_antenna_location *objp; +{ + if (!xdr_earth_XYZ(xdrs, &objp->ant_location)) { + return 0; + } + if (!xdr_dis_relative_coordinates(xdrs, &objp->relative)) { + return 0; + } + return 1; +} +*/ + + +/* +static int +xdr_dis_beam_antenna_pattern(xdrs, objp) + XDR *xdrs; + dis_beam_antenna_pattern *objp; +{ + if (!xdr_dis_euler_angles(xdrs, &objp->direction)) { + return 0; + } + if (!xdr_float(xdrs, &objp->azimuth_width)) { + return 0; + } + if (!xdr_float(xdrs, &objp->elev_width)) { + return 0; + } + if (!xdr_byte_u_char(xdrs, &objp->reference_system)) { + return 0; + } + if (!xdr_vector(xdrs, (char *)objp->pad, 3, sizeof(byte_u_char), (xdrproc_t) xdr_byte_u_char)) { + return 0; + } + if (!xdr_float(xdrs, &objp->Ez)) { + return 0; + } + if (!xdr_float(xdrs, &objp->Ex)) { + return 0; + } + if (!xdr_float(xdrs, &objp->phase)) { + return 0; + } + return 1; +} +*/ + + +/* +static int +xdr_dis_spherical_harmonic_antenna_pattern(xdrs, objp) + XDR *xdrs; + dis_spherical_harmonic_antenna_pattern *objp; +{ + if (!xdr_byte_u_char(xdrs, &objp->pattern)) { + return 0; + } + if (!xdr_float(xdrs, &objp->coefficients)) { + return 0; + } + if (!xdr_byte_u_char(xdrs, &objp->ref_system)) { + return 0; + } + return 1; +} +*/ + + +static int +xdr_dis_time(xdrs, objp) + xdr_Type *xdrs; + dis_time *objp; +{ + if (!xdr_uint32(xdrs, &objp->hour)) { + return 0; + } + if (!xdr_dis_timestamp(xdrs, &objp->rel)) { + return 0; + } + return 1; +} + + +static int +xdr_dis_burst_descriptor(xdrs, objp) + xdr_Type *xdrs; + dis_burst_descriptor *objp; +{ + if (!xdr_dis_entity_type(xdrs, &objp->munition)) { + return 0; + } + if (!xdr_byte_uint16(xdrs, &objp->warhead)) { + return 0; + } + if (!xdr_byte_uint16(xdrs, &objp->fuze)) { + return 0; + } + if (!xdr_byte_uint16(xdrs, &objp->quantity)) { + return 0; + } + if (!xdr_byte_uint16(xdrs, &objp->rate)) { + return 0; + } + return 1; +} + + +static int +xdr_dis_dead_reckoning(xdrs, objp) + xdr_Type *xdrs; + dis_dead_reckoning *objp; +{ + if (!xdr_byte_uchar(xdrs, &objp->algorithm)) { + return 0; + } + if (!xdr_vector(xdrs, (char *)objp->other, sizeof(objp->other), sizeof(u_char), (xdr_Callback) xdr_byte_uchar)) { + return 0; + } + if (!xdr_dis_linear_acc_vector(xdrs, &objp->linear_acc)) { + return 0; + } + if (!xdr_dis_angular_vel_vector(xdrs, &objp->angular_vel)) { + return 0; + } + return 1; +} + + +static int +xdr_dis_capabilities(xdrs, objp) + xdr_Type *xdrs; + dis_capabilities *objp; +{ + if (!xdr_uint32(xdrs, objp)) { + return 0; + } + return 1; +} + + +/* +static int +xdr_dis_supply_quantity(xdrs, objp) + XDR *xdrs; + dis_supply_quantity *objp; +{ + if (!xdr_dis_entity_type(xdrs, &objp->entity)) { + return 0; + } + if (!xdr_float(xdrs, &objp->quantity)) { + return 0; + } + return 1; +} +*/ + + +static int +xdr_dis_entity_appearance(xdrs, objp) + xdr_Type *xdrs; + dis_entity_appearance *objp; +{ + if (!xdr_uint32(xdrs, objp)) { + return 0; + } + return 1; +} + + +static int +xdr_dis_entity_state_pdu(xdrs, objp) + xdr_Type *xdrs; + dis_entity_state_pdu *objp; +{ + if (!xdr_dis_pdu_header(xdrs, &objp->hdr)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->id)) { + return 0; + } + if (!xdr_byte_uchar(xdrs, &objp->force_id)) { + return 0; + } + if (!xdr_byte_uchar(xdrs, &objp->art_parm_count)) { + return 0; + } + if (!xdr_dis_entity_type(xdrs, &objp->type)) { + return 0; + } + if (!xdr_dis_entity_type(xdrs, &objp->alt_type)) { + return 0; + } + if (!xdr_dis_linear_vel_vector(xdrs, &objp->vel)) { + return 0; + } + if (!xdr_earth_XYZ(xdrs, &objp->pos)) { + return 0; + } + if (!xdr_dis_euler_angles(xdrs, &objp->orientation)) { + return 0; + } + if (!xdr_dis_entity_appearance(xdrs, &objp->appearance)) { + return 0; + } + if (!xdr_dis_dead_reckoning(xdrs, &objp->dr_parm)) { + return 0; + } + if (!xdr_dis_entity_marking(xdrs, &objp->marking)) { + return 0; + } + if (!xdr_dis_capabilities(xdrs, &objp->capabilities)) { + return 0; + } + if (!xdr_var_array(xdrs, (void **)&objp->art_parm, + objp->art_parm_count, sizeof(dis_articulation_parm), (xdr_Callback) xdr_dis_articulation_parm)) { + return 0; + } + return 1; +} + + +static int +xdr_dis_collision_pdu(xdrs, objp) + xdr_Type *xdrs; + dis_collision_pdu *objp; +{ + if (!xdr_dis_pdu_header(xdrs, &objp->hdr)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->id)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->collision_id)) { + return 0; + } + if (!xdr_dis_event_id(xdrs, &objp->event)) { + return 0; + } + if (!xdr_dis_linear_vel_vector(xdrs, &objp->vel)) { + return 0; + } + if (!xdr_uint32(xdrs, &objp->mass)) { + return 0; + } + if (!xdr_dis_entity_coord_vector(xdrs, &objp->loc)) { + return 0; + } + return 1; +} + + +static int +xdr_dis_fire_pdu(xdrs, objp) + xdr_Type *xdrs; + dis_fire_pdu *objp; +{ + if (!xdr_dis_pdu_header(xdrs, &objp->hdr)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->firing_id)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->target_id)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->munition_id)) { + return 0; + } + if (!xdr_dis_event_id(xdrs, &objp->event)) { + return 0; + } + if (!xdr_uint32(xdrs, &objp->fire_mission_index)) { + return 0; + } + if (!xdr_earth_XYZ(xdrs, &objp->pos)) { + return 0; + } + if (!xdr_dis_burst_descriptor(xdrs, &objp->burst)) { + return 0; + } + if (!xdr_dis_linear_vel_vector(xdrs, &objp->vel)) { + return 0; + } + if (!xdr_float(xdrs, &objp->range)) { + return 0; + } + return 1; +} + + +static int +xdr_dis_detonation_pdu(xdrs, objp) + xdr_Type *xdrs; + dis_detonation_pdu *objp; +{ + if (!xdr_dis_pdu_header(xdrs, &objp->hdr)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->firing_id)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->target_id)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->munition_id)) { + return 0; + } + if (!xdr_dis_event_id(xdrs, &objp->event)) { + return 0; + } + if (!xdr_dis_linear_vel_vector(xdrs, &objp->vel)) { + return 0; + } + if (!xdr_earth_XYZ(xdrs, &objp->pos)) { + return 0; + } + if (!xdr_dis_burst_descriptor(xdrs, &objp->burst)) { + return 0; + } + if (!xdr_dis_entity_coord_vector(xdrs, &objp->loc)) { + return 0; + } + if (!xdr_byte_uchar(xdrs, &objp->result)) { + return 0; + } + if (!xdr_byte_uchar(xdrs, &objp->num_art_parms)) { + return 0; + } + if (!xdr_byte_uint16(xdrs, &objp->pad)) { + return 0; + } + if (!xdr_var_array(xdrs, (void **)&objp->art_parm, + objp->num_art_parms, sizeof(dis_articulation_parm), (xdr_Callback) xdr_dis_articulation_parm)) { + return 0; + } + return 1; +} + + +/* +static int +xdr_dis_service_type(xdrs, objp) + XDR *xdrs; + dis_service_type *objp; +{ + if (!xdr_byte_u_char(xdrs, objp)) { + return 0; + } + return 1; +} +*/ + + +/* +static int +xdr_dis_repair_type(xdrs, objp) + XDR *xdrs; + dis_repair_type *objp; +{ + if (!xdr_byte_u_short(xdrs, objp)) { + return 0; + } + return 1; +} +*/ + + +/* +static int +xdr_dis_repair_result(xdrs, objp) + XDR *xdrs; + dis_repair_result *objp; +{ + if (!xdr_byte_u_char(xdrs, objp)) { + return 0; + } + return 1; +} +*/ + + +/* +static int +xdr_dis_service_request_pdu(xdrs, objp) + XDR *xdrs; + dis_service_request_pdu *objp; +{ + if (!xdr_dis_pdu_header(xdrs, &objp->hdr)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->requestor_id)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->server_id)) { + return 0; + } + if (!xdr_dis_service_type(xdrs, &objp->requested_service)) { + return 0; + } + if (!xdr_byte_u_char(xdrs, &objp->num_supply_types)) { + return 0; + } + if (!xdr_byte_u_short(xdrs, &objp->pad)) { + return 0; + } + if (!xdr_var_array(xdrs, (char **)&objp->supplies, + objp->num_supply_types, objp->num_supply_types, sizeof(dis_supply_quantity), (xdrproc_t) xdr_dis_supply_quantity)) { + return 0; + } + return 1; +} +*/ + + +/* +static int +xdr_dis_resupply_offer_pdu(xdrs, objp) + XDR *xdrs; + dis_resupply_offer_pdu *objp; +{ + if (!xdr_dis_pdu_header(xdrs, &objp->hdr)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->receiver_id)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->supplier_id)) { + return 0; + } + if (!xdr_byte_u_char(xdrs, &objp->num_supply_types)) { + return 0; + } + if (!xdr_vector(xdrs, (char *)objp->pad, 3, sizeof(byte_u_char), (xdrproc_t) xdr_byte_u_char)) { + return 0; + } + if (!xdr_var_array(xdrs, (char **)&objp->supplies, + objp->num_supply_types, objp->num_supply_types, sizeof(dis_supply_quantity), (xdrproc_t) xdr_dis_supply_quantity)) { + return 0; + } + return 1; +} +*/ + + +/* +static int +xdr_dis_resupply_received_pdu(xdrs, objp) + XDR *xdrs; + dis_resupply_received_pdu *objp; +{ + if (!xdr_dis_pdu_header(xdrs, &objp->hdr)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->receiver_id)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->supplier_id)) { + return 0; + } + if (!xdr_byte_u_char(xdrs, &objp->num_supply_types)) { + return 0; + } + if (!xdr_vector(xdrs, (char *)objp->pad, 3, sizeof(byte_u_char), (xdrproc_t) xdr_byte_u_char)) { + return 0; + } + if (!xdr_var_array(xdrs, (char **)&objp->supplies, + objp->num_supply_types, objp->num_supply_types, sizeof(dis_supply_quantity), (xdrproc_t) xdr_dis_supply_quantity)) { + return 0; + } + return 1; +} +*/ + + +/* +static int +xdr_dis_resupply_cancel_pdu(xdrs, objp) + XDR *xdrs; + dis_resupply_cancel_pdu *objp; +{ + if (!xdr_dis_pdu_header(xdrs, &objp->hdr)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->receiver_id)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->supplier_id)) { + return 0; + } + return 1; +} +*/ + + +/* +static int +xdr_dis_repair_complete_pdu(xdrs, objp) + XDR *xdrs; + dis_repair_complete_pdu *objp; +{ + if (!xdr_dis_pdu_header(xdrs, &objp->hdr)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->receiver_id)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->supplier_id)) { + return 0; + } + if (!xdr_dis_repair_type(xdrs, &objp->repair)) { + return 0; + } + if (!xdr_byte_u_short(xdrs, &objp->pad)) { + return 0; + } + return 1; +} +*/ + + +/* +static int +xdr_dis_repair_response_pdu(xdrs, objp) + XDR *xdrs; + dis_repair_response_pdu *objp; +{ + if (!xdr_dis_pdu_header(xdrs, &objp->hdr)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->receiver_id)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->supplier_id)) { + return 0; + } + if (!xdr_dis_repair_result(xdrs, &objp->result)) { + return 0; + } + if (!xdr_vector(xdrs, (char *)objp->pad, 3, sizeof(byte_u_char), (xdrproc_t) xdr_byte_u_char)) { + return 0; + } + return 1; +} +*/ + + +static int +xdr_dis_request_id(xdrs, objp) + xdr_Type *xdrs; + dis_request_id *objp; +{ + if (!xdr_uint32(xdrs, objp)) { + return 0; + } + return 1; +} + + +static int +xdr_dis_create_entity_pdu(xdrs, objp) + xdr_Type *xdrs; + dis_create_entity_pdu *objp; +{ + if (!xdr_dis_pdu_header(xdrs, &objp->hdr)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->orig_id)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->recv_id)) { + return 0; + } + if (!xdr_dis_request_id(xdrs, &objp->request_id)) { + return 0; + } + return 1; +} + + +static int +xdr_dis_remove_entity_pdu(xdrs, objp) + xdr_Type *xdrs; + dis_remove_entity_pdu *objp; +{ + if (!xdr_dis_pdu_header(xdrs, &objp->hdr)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->orig_id)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->recv_id)) { + return 0; + } + if (!xdr_dis_request_id(xdrs, &objp->request_id)) { + return 0; + } + return 1; +} + + +static int +xdr_dis_start_pdu(xdrs, objp) + xdr_Type *xdrs; + dis_start_pdu *objp; +{ + if (!xdr_dis_pdu_header(xdrs, &objp->hdr)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->orig_id)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->recv_id)) { + return 0; + } + if (!xdr_dis_time(xdrs, &objp->real_time)) { + return 0; + } + if (!xdr_dis_time(xdrs, &objp->sim_time)) { + return 0; + } + if (!xdr_dis_request_id(xdrs, &objp->request_id)) { + return 0; + } + return 1; +} + + +static int +xdr_dis_stop_pdu(xdrs, objp) + xdr_Type *xdrs; + dis_stop_pdu *objp; +{ + if (!xdr_dis_pdu_header(xdrs, &objp->hdr)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->orig_id)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->recv_id)) { + return 0; + } + if (!xdr_dis_time(xdrs, &objp->real_time)) { + return 0; + } + if (!xdr_byte_uchar(xdrs, &objp->reason)) { + return 0; + } + if (!xdr_byte_uchar(xdrs, &objp->behavior)) { + return 0; + } + if (!xdr_vector(xdrs, (char *)objp->pad, 2, sizeof(u_char), (xdr_Callback) xdr_byte_uchar)) { + return 0; + } + if (!xdr_dis_request_id(xdrs, &objp->request_id)) { + return 0; + } + return 1; +} + + +static int +xdr_dis_acknowledge_pdu(xdrs, objp) + xdr_Type *xdrs; + dis_acknowledge_pdu *objp; +{ + if (!xdr_dis_pdu_header(xdrs, &objp->hdr)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->orig_id)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->recv_id)) { + return 0; + } + if (!xdr_byte_uint16(xdrs, &objp->acknowledge_flag)) { + return 0; + } + if (!xdr_byte_uint16(xdrs, &objp->resp_flag)) { + return 0; + } + if (!xdr_dis_request_id(xdrs, &objp->request_id)) { + return 0; + } + return 1; +} + + +/* +static int +xdr_dis_data_query_pdu(xdrs, objp) + XDR *xdrs; + dis_data_query_pdu *objp; +{ + if (!xdr_dis_pdu_header(xdrs, &objp->hdr)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->orig_id)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->recv_id)) { + return 0; + } + if (!xdr_dis_time(xdrs, &objp->interval)) { + return 0; + } + if (!xdr_dis_request_id(xdrs, &objp->request_id)) { + return 0; + } + if (!xdr_byte_u_long(xdrs, &objp->num_fixed_data)) { + return 0; + } + if (!xdr_byte_u_long(xdrs, &objp->num_variable_data)) { + return 0; + } + if (!xdr_var_array(xdrs, (char **)&objp->fixed_datum_id, + objp->num_fixed_data, objp->num_fixed_data, sizeof(byte_u_long), (xdrproc_t) xdr_byte_u_long)) { + return 0; + } + if (!xdr_var_array(xdrs, (char **)&objp->variable_datum_id, + objp->num_variable_data, objp->num_variable_data, sizeof(byte_u_long), (xdrproc_t) xdr_byte_u_long)) { + return 0; + } + return 1; +} +*/ + + +static int +xdr_dis_datum_spec_record(xdrs, objp) + xdr_Type *xdrs; + dis_datum_spec_record *objp; +{ + if (!xdr_uint32(xdrs, &objp->num_fixed_data)) { + return 0; + } + if (!xdr_uint32(xdrs, &objp->num_variable_data)) { + return 0; + } + if (!xdr_var_array(xdrs, (void **)&objp->fixed_datum, + objp->num_fixed_data, sizeof(dis_fixed_datum), (xdr_Callback) xdr_dis_fixed_datum)) { + return 0; + } + if (!xdr_var_array(xdrs, (void **)&objp->variable_datum, + objp->num_variable_data, sizeof(dis_variable_datum), (xdr_Callback) xdr_dis_variable_datum)) { + return 0; + } + return 1; +} + + +static int +xdr_dis_set_data_pdu(xdrs, objp) + xdr_Type *xdrs; + dis_set_data_pdu *objp; +{ + if (!xdr_dis_pdu_header(xdrs, &objp->hdr)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->orig_id)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->recv_id)) { + return 0; + } + if (!xdr_dis_request_id(xdrs, &objp->request_id)) { + return 0; + } + if (!xdr_dis_datum_spec_record(xdrs, &objp->datum_info)) { + return 0; + } + return 1; +} + + +/* +static int +xdr_dis_data_pdu(xdrs, objp) + XDR *xdrs; + dis_data_pdu *objp; +{ + if (!xdr_dis_pdu_header(xdrs, &objp->hdr)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->orig_id)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->recv_id)) { + return 0; + } + if (!xdr_dis_request_id(xdrs, &objp->request_id)) { + return 0; + } + if (!xdr_dis_datum_spec_record(xdrs, &objp->datum_info)) { + return 0; + } + return 1; +} +*/ + + +/* +static int +xdr_dis_event_report_pdu(xdrs, objp) + XDR *xdrs; + dis_event_report_pdu *objp; +{ + if (!xdr_dis_pdu_header(xdrs, &objp->hdr)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->orig_id)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->recv_id)) { + return 0; + } + if (!xdr_dis_event_id(xdrs, &objp->event_type)) { + return 0; + } + if (!xdr_dis_datum_spec_record(xdrs, &objp->datum_info)) { + return 0; + } + return 1; +} +*/ + + +static int +xdr_dis_comment_pdu(xdr_Type *xdrs, dis_comment_pdu *objp) +{ + if (!xdr_dis_pdu_header(xdrs, &objp->hdr)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->orig_id)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->recv_id)) { + return 0; + } + if (!xdr_uint32(xdrs, &objp->num_fixed_data)) { + return 0; + } + if (!xdr_uint32(xdrs, &objp->num_variable_data)) { + return 0; + } + if (!xdr_var_array(xdrs, (void **)&objp->fixed_datum, + objp->num_fixed_data, sizeof(dis_fixed_datum), (xdr_Callback) xdr_dis_fixed_datum)) { + return 0; + } + if (!xdr_var_array(xdrs, (void **)&objp->variable_datum, + objp->num_variable_data, sizeof(dis_variable_datum), (xdr_Callback) xdr_dis_variable_datum)) { + return 0; + } + return 1; +} + + +static int +xdr_dis_track_info(xdrs, objp) + xdr_Type *xdrs; + dis_track_info *objp; +{ + if (!xdr_dis_entity_id(xdrs, &objp->target)) { + return 0; + } + if (!xdr_byte_uchar(xdrs, &objp->emitter_id)) { + return 0; + } + if (!xdr_byte_uchar(xdrs, &objp->beam_id)) { + return 0; + } + return 1; +} + + +static int +xdr_dis_beam_info(xdrs, objp) + xdr_Type *xdrs; + dis_beam_info *objp; +{ + if (!xdr_byte_uchar(xdrs, &objp->beam_data_length)) { + return 0; + } + if (!xdr_byte_uchar(xdrs, &objp->beam_id)) { + return 0; + } + if (!xdr_byte_uint16(xdrs, &objp->beam_parm_index)) { + return 0; + } + if (!xdr_dis_fundamental_parameters(xdrs, &objp->fundamental)) { + return 0; + } + if (!xdr_byte_uchar(xdrs, &objp->beam_function)) { + return 0; + } + if (!xdr_byte_uchar(xdrs, &objp->num_targets)) { + return 0; + } + if (!xdr_byte_uchar(xdrs, &objp->high_density_track_jam)) { + return 0; + } + if (!xdr_byte_uchar(xdrs, &objp->pad)) { + return 0; + } + if (!xdr_uint32(xdrs, &objp->jamming_mode)) { + return 0; + } + if (!xdr_var_array(xdrs, (void **)&objp->tracked_target, + objp->num_targets, sizeof(dis_track_info), (xdr_Callback) xdr_dis_track_info)) { + return 0; + } + return 1; +} + + +static int +xdr_dis_em_system_info(xdrs, objp) + xdr_Type *xdrs; + dis_em_system_info *objp; +{ + if (!xdr_byte_uchar(xdrs, &objp->sys_data_length)) { + return 0; + } + if (!xdr_byte_uchar(xdrs, &objp->num_beams)) { + return 0; + } + if (!xdr_byte_uint16(xdrs, &objp->pad)) { + return 0; + } + if (!xdr_dis_emitter_system(xdrs, &objp->emitter_system)) { + return 0; + } + if (!xdr_dis_entity_coord_vector(xdrs, &objp->location)) { + return 0; + } + if (!xdr_var_array(xdrs, (void **)&objp->beam, + objp->num_beams, sizeof(dis_beam_info), (xdr_Callback) xdr_dis_beam_info)) { + return 0; + } + return 1; +} + + +static int +xdr_dis_em_emission_pdu(xdrs, objp) + xdr_Type *xdrs; + dis_em_emission_pdu *objp; +{ + if (!xdr_dis_pdu_header(xdrs, &objp->hdr)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->emitter_id)) { + return 0; + } + if (!xdr_dis_event_id(xdrs, &objp->event)) { + return 0; + } + if (!xdr_byte_uchar(xdrs, &objp->state_update)) { + return 0; + } + if (!xdr_byte_uchar(xdrs, &objp->num_systems)) { + return 0; + } + if (!xdr_byte_uint16(xdrs, &objp->pad)) { + return 0; + } + if (!xdr_var_array(xdrs, (void **)&objp->system, + objp->num_systems, sizeof(dis_em_system_info), (xdr_Callback) xdr_dis_em_system_info)) { + return 0; + } + return 1; +} + + +/* +static int +xdr_dis_designator_pdu(xdrs, objp) + XDR *xdrs; + dis_designator_pdu *objp; +{ + if (!xdr_dis_pdu_header(xdrs, &objp->hdr)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->designating_id)) { + return 0; + } + if (!xdr_byte_u_short(xdrs, &objp->code_name)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->designated_id)) { + return 0; + } + if (!xdr_byte_u_char(xdrs, &objp->pad)) { + return 0; + } + if (!xdr_byte_u_char(xdrs, &objp->code)) { + return 0; + } + if (!xdr_float(xdrs, &objp->power)) { + return 0; + } + if (!xdr_float(xdrs, &objp->wavelength)) { + return 0; + } + if (!xdr_dis_entity_coord_vector(xdrs, &objp->spot_rel)) { + return 0; + } + if (!xdr_earth_XYZ(xdrs, &objp->spot_pos)) { + return 0; + } + return 1; +} +*/ + + +/* +static int +xdr_dis_experimental_request_control_pdu(xdrs, objp) + XDR *xdrs; + dis_experimental_request_control_pdu *objp; +{ + if (!xdr_dis_pdu_header(xdrs, &objp->hdr)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->requesting_id)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->control_target_id)) { + return 0; + } + return 1; +} +*/ + + +/* +static int +xdr_dis_experimental_grant_control_pdu(xdrs, objp) + XDR *xdrs; + dis_experimental_grant_control_pdu *objp; +{ + if (!xdr_dis_pdu_header(xdrs, &objp->hdr)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->granting_id)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->control_target_id)) { + return 0; + } + return 1; +} +*/ + + +static int +xdr_dis_transfer_control_pdu(xdrs, objp) + xdr_Type *xdrs; + dis_transfer_control_pdu *objp; +{ + if (!xdr_dis_pdu_header(xdrs, &objp->hdr)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->orig_id)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->recv_id)) { + return 0; + } + if (!xdr_uint32(xdrs, &objp->request_id)) { + return 0; + } + if (!xdr_byte_uchar(xdrs, &objp->reliability_service)) { + return 0; + } + if (!xdr_byte_uchar(xdrs, &objp->transfer_type)) { + return 0; + } + if (!xdr_dis_entity_id(xdrs, &objp->target_id)) { + return 0; + } + if (!xdr_uint32(xdrs, &objp->num_record_sets)) { + return 0; + } + return 1; +} + +int +xdr_dis_pdu(xdr_Type * xdrs, dis_pdu * objp) +{ + uint32_t pos; + + /* + * On decoding, retrieve the header first just to get the PDU type and + * then apply the specific decoding function next. Each specific function + * will then decode the header back again, which is a bit redundant, but + * necessary because each specific function must serve also for encoding. + */ + if (xdr_getOperation(xdrs) == xdr_DECODE) { + + pos = xdr_getpos(xdrs); + + if (!xdr_dis_pdu_header(xdrs, (dis_pdu_header *) objp)) { + return 0; + } + + if (!xdr_setpos(xdrs, pos)) { + return 0; + } + } + + switch (objp->hdr.pdu_type) { + case PDUTypeOther: + if (!xdr_dis_pdu_header(xdrs, &objp->hdr)) { + return 0; + } + break; + case PDUTypeEntityState: + if (!xdr_dis_entity_state_pdu(xdrs, (dis_entity_state_pdu *) objp)) { + return 0; + } + break; + case PDUTypeCollision: + if (!xdr_dis_collision_pdu(xdrs, (dis_collision_pdu *) objp)) { + return 0; + } + break; + case PDUTypeFire: + if (!xdr_dis_fire_pdu(xdrs, (dis_fire_pdu *) objp)) { + return 0; + } + break; + case PDUTypeDetonation: + if (!xdr_dis_detonation_pdu(xdrs, (dis_detonation_pdu *) objp)) { + return 0; + } + break; + case PDUTypeCreateEntity: + if (!xdr_dis_create_entity_pdu(xdrs, + (dis_create_entity_pdu *) objp)) { + return 0; + } + break; + case PDUTypeRemoveEntity: + if (!xdr_dis_remove_entity_pdu(xdrs, + (dis_remove_entity_pdu *) objp)) { + return 0; + } + break; + case PDUTypeStopFreeze: + if (!xdr_dis_stop_pdu(xdrs, (dis_stop_pdu *) objp)) { + return 0; + } + break; + case PDUTypeStartResume: + if (!xdr_dis_start_pdu(xdrs, (dis_start_pdu *) objp)) { + return 0; + } + break; + case PDUTypeSetData: + if (!xdr_dis_set_data_pdu(xdrs, (dis_start_pdu *) objp)) { + return 0; + } + break; + case PDUTypeComment: + if (!xdr_dis_comment_pdu(xdrs, (dis_comment_pdu *) objp)) { + return 0; + } + break; + case PDUTypeEmission: + if (!xdr_dis_em_emission_pdu(xdrs, + (dis_em_emission_pdu *) objp)) { + return 0; + } + break; + case PDUTypeTransferControl: + if (!xdr_dis_transfer_control_pdu(xdrs, (dis_transfer_control_pdu *) objp)) { + return 0; + } + break; + case PDUTypeAcknowledge: + if (!xdr_dis_acknowledge_pdu(xdrs, (dis_acknowledge_pdu *) objp)) { + return 0; + } + break; + default: + return xdr_setError(xdrs, "unknown/unsupported DIS PDU type"); + } + return 1; +} diff -Nru acm-5.0/src/dis/dis/xdr_dis.h acm-6.0+20200416/src/dis/dis/xdr_dis.h --- acm-5.0/src/dis/dis/xdr_dis.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/dis/dis/xdr_dis.h 2017-05-16 04:10:41.000000000 +0000 @@ -0,0 +1,58 @@ +/* + * DIS/x : An implementation of the IEEE 1278.1 protocol + * + * Copyright (C) 1997, Riley Rainey (rrainey@ix.netcom.com) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of either: + * + * a) the GNU Library General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your + * option) any later version. A description of the terms and conditions + * of the GLPL may be found in the "COPYING.LIB" file. + * + * b) the "Artistic License" which comes with this Kit. Information + * about this license may be found in the "Artistic" file. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License or the Artistic License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Information describing how to contact the author can be found in the + * README file. + */ + +/** + * Encoding/decoding functions for DIS packets. + * + * @file + */ + +#ifndef XDR_DIS_H +#define XDR_DIS_H + +#include "xdr.h" +#include "dis.h" + +#ifdef xdr_dis_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +/** + * Encodes/decodes a DIS PDU packet. + * @param xdrs + * @param objp + * @return True on success. + */ +EXTERN int xdr_dis_pdu(xdr_Type * xdrs, dis_pdu * objp); + +#undef EXTERN +#endif /* XDR_DIS_H */ + diff -Nru acm-5.0/src/dis/dis/xdr.h acm-6.0+20200416/src/dis/dis/xdr.h --- acm-5.0/src/dis/dis/xdr.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/dis/dis/xdr.h 2018-04-02 06:09:56.000000000 +0000 @@ -0,0 +1,294 @@ +/* + * DIS/x : An implementation of the IEEE 1278.1 protocol + * + * Copyright (C) 1996, Riley Rainey (rainey@netcom.com) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of either: + * + * a) the GNU Library General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your + * option) any later version. A description of the terms and conditions + * of the GLPL may be found in the "COPYING.LIB" file. + * + * b) the "Artistic License" which comes with this Kit. Information + * about this license may be found in the "Artistic" file. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License or the Artistic License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Information describing how to contact the author can be found in the + * README file. + */ +/* + * Sun RPC is a product of Sun Microsystems, Inc. and is provided for + * unrestricted use provided that this legend is included on all tape + * media and as a part of the software program in whole or part. Users + * may copy or modify Sun RPC without charge, but are not authorized + * to license or distribute it to anyone else except as part of a product or + * program developed by the user. + * + * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE + * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR + * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. + * + * Sun RPC is provided with no support and without any obligation on the + * part of Sun Microsystems, Inc. to assist in its use, correction, + * modification or enhancement. + * + * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE + * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC + * OR ANY PART THEREOF. + * + * In no event will Sun Microsystems, Inc. be liable for any lost revenue + * or profits or other special, indirect and consequential damages, even if + * Sun has been advised of the possibility of such damages. + * + * Sun Microsystems, Inc. + * 2550 Garcia Avenue + * Mountain View, California 94043 + */ + +/** + * XDR implementation using memory buffers. + * + * If you have some data to be interpreted as external data representation + * or to be converted to external data representation in a memory buffer, + * then this is the package for you. + * + * This implementation is tailored for the needs of the DIS protocol and the ACM + * program, so deviates from the requirements of the standard by adding some + * low-level byte-oriented routines. + * + * In this implementation, the normal usage cycle is as follows: + * + * 1. Create an encoding/decoding object by calling xdr_new(). + * + * 2. Encode/decode any number of fields by calling the appropriate functions. + * Each encoding/decoding function returns true if the operation succeeded, + * false if it fails. If a decoding operation fails, any dynamically + * allocated data created by xdr_var_array() and xdr_getBytesAllocate() is + * released before returning the failure status flag; any user's data decoded + * so far is then destroyed. + * + * 3. Release the decoding object by calling xdr_free() or memory_dispose(). + * Encoding/decoding objects cannot be re-used (but are recycled by + * xdr_free()). + * + * Dynamically allocated data are allocated with the "memory" module and can + * then be released with memory_dispose(). + * + * Specifications of the XDR encoding: RFC 1014. + * + * @copyright Copyright (C) 1984, Sun Microsystems, Inc. + * @version $Date: 2018/04/02 05:41:30 $ + */ + +#ifndef XDR_H +#define XDR_H + +#include + +#ifdef xdr_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +/** + * Xdr operations. xdr_ENCODE causes the type to be encoded into the + * stream. xdr_DECODE causes the type to be extracted from the stream. + * xdr_FREE can be used to release the space allocated by an xdr_DECODE + * request. + * + * FIXME: xdr_FREE not supported -- not used by ACM. + */ +typedef enum { + xdr_ENCODE=0, + xdr_DECODE=1, + xdr_FREE=2 +} xdr_Operation; + + +/** + * The XDR handle. + */ +typedef struct xdr_Type xdr_Type; + +/** + * Client's call-back prototype to encode/decode elements of arrays. + */ +typedef int (*xdr_Callback)(xdr_Type *xdr, ...); + +/** + * Creates and initializes an encoding/decoding stream descriptor for a memory + * buffer. Returns a recycled descriptor previously released with xdr_free() if + * available, otherwise allocates a new one with memory_allocate(). + * @param buffer Destination (for encoding) or source (for decoding) buffer. + * @param size Size of the buffer. + * @param op Requested operation: encoding, decoding, free. + * @return New stream descriptor, possibly recycled from a previously released + * stream descriptor. Can be released either with memory_dispose() or with + * xdr_free() for recycling. + */ +EXTERN xdr_Type * xdr_new(char * buffer, unsigned int size, xdr_Operation op); + +/** + * Releases a stream descriptor making it available for recycling. This function + * is usually more efficient than memory_dispose(). + * @param xdr + */ +EXTERN void xdr_free(xdr_Type *xdr); + +/** + * Set error state and removes any dynamically data allocated so far. + * @param xdr + * @param description + * @return Always returns 0. + */ +EXTERN int xdr_setError(xdr_Type *xdr, char *description); + +/** + * Returns the description of the latest failed encoding/decoding operation. + * @param xdr + * @return Description of the latest failed encoding/decoding operation. + */ +EXTERN char * xdr_getErrorDescription(xdr_Type *xdr); + +/** + * Returns the currently performed operation as set in the creator function. + * @param xdr + * @return Currently performed operation. + */ +EXTERN xdr_Operation xdr_getOperation(xdr_Type * xdr); + +/** + * Returns current byte offset in the working buffer. + * @param xdr + * @return Current byte offset in the working buffer. + */ +EXTERN unsigned int xdr_getpos(xdr_Type *xdr); + +/** + * Set byte offset in the working buffer. + * @param xdr + * @param pos Offset to set. + * @return True on success. False if the offset is beyond the end of the working + * buffer. + */ +EXTERN int xdr_setpos(xdr_Type *xdr, unsigned int pos); + +/** + * Encodes/decodes a 32 bits signed integer. + * @param xdr + * @param i + * @return + */ +EXTERN int xdr_int32(xdr_Type *xdr, int32_t *i); + +/** + * Encodes/decodes a 32 bits unsigned integer. + * @param xdr + * @param ui + * @return + */ +EXTERN int xdr_uint32(xdr_Type *xdr, uint32_t *ui); + +/** + * Low-level, byte-oriented decoding function. It is responsibility of the client + * to comply with the XDR encoding constraints to 4 bytes boundary, possibly by + * reading some more padding bytes. + * @param xdr + * @param addr Destination buffer. + * @param len Number of bytes to read. + * @return True on success. False on premature end of the buffer space. + */ +EXTERN int xdr_getBytes(xdr_Type * xdr, void *addr, unsigned int len); + +/** + * Low-level, byte-oriented decoding function that also allocates the required + * memory space. It is responsibility of the client to comply with the XDR + * encoding constraints to 4 bytes boundary, possibly by reading some more + * padding bytes. + * @param xdr + * @param addr On success, here returns the pointer to the dynamically allocated + * buffer of decoded bytes; it can be released with memory_dispose(). + * @param len Number of bytes to read. + * @param add_nul If true, a trailing NUL byte is added, which may be safer and + * handy with strings of characters. + * @return True on success. False on premature end of the buffer space. + */ +EXTERN int xdr_getBytesAllocated(xdr_Type * xdr, void **addr, unsigned int len, int add_nul); + +/** + * Low-level, byte-oriented encoding function. It is responsibility of the client + * to comply with the XDR decoding constraints to 4 bytes boundary, possibly by + * writing some more padding bytes. + * @param xdr + * @param addr Source buffer. + * @param len Number of bytes to write. + * @return True on success. False on premature end of the buffer space. + */ +EXTERN int xdr_putBytes(xdr_Type * xdr, void *addr, unsigned int len); + +/** + * Encodes/decodes a single byte. Note that it takes 4 bytes of the working + * buffer. + */ +EXTERN int xdr_char(xdr_Type *xdr, char *c); + +/** + * Encodes/decodes a single precision floating point number. + * @param xdr + * @param f + * @return + */ +EXTERN int xdr_float(xdr_Type *xdr, float *f); + +/** + * Encodes/decodes a double precision floating point number. + * @param xdr + * @param d + * @return + */ +EXTERN int xdr_double(xdr_Type *xdr, double *d); + +/** + * Encodes/decodes array of elements. Note that on decoding, the array must be + * already allocated. + * @param xdr + * @param arrp Pointer to the array. + * @param size Number of elements in the array. + * @param elsize Size in bytes of each element. + * @param elproc Element encoding/decoding procedure. + * @return + */ +EXTERN int xdr_vector(xdr_Type *xdr, char *arrp, unsigned int size, + unsigned int elsize, xdr_Callback elproc); + +/** + * Encodes/decodes an array of elements allocating the array while decoding. + * @param xdr + * @param addrp Pointer to array pointer. While decoding, (size * elsize) + * bytes are allocated overwriting *addrp with the new allocated array; + * if the size is zero, nothing is allocated and *addrp is set to NULL. + * @param size Number of elements in the array. + * @param elsize Size in bytes of each element. + * @param elproc Element encoding/decoding procedure. + * @return True if the array has been successfully encoded/decoded. False if + * the total size of the array overflows the unsigned int capacity. False if + * any element fails to be encoded/decoded. False if the number of elements + * exceeds the number of bytes left in the buffer. + */ +EXTERN int +xdr_var_array(xdr_Type * xdr, void * * addrp, unsigned int size, + unsigned int elsize, xdr_Callback elproc); + +#undef EXTERN +#endif /* XDR_H */ diff -Nru acm-5.0/src/dis/doc/dis_library.html acm-6.0+20200416/src/dis/doc/dis_library.html --- acm-5.0/src/dis/doc/dis_library.html 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/dis/doc/dis_library.html 2017-05-09 08:44:51.000000000 +0000 @@ -0,0 +1,107 @@ + + + +DIS/x Library Description + + + + + + + + +
+ + These notes from Riley Rainey have now only an historical value and + illustrate the motivation and the origin of the DIS library in ACM. + The current ACM-5.0-ico solved the problem of site ID and application ID + assignment in another way, then removing the need for a simx layer and + the corresponding libraries and simx server; also RCP is not needed anymore + making all a bit simpler. Also the data base of DIS is gone as it is not + used anymore. + [U.S.] + +
+ +

DIS/x: An Implementation of the IEEE 1278

+

Distributed Interactive Simulation Protocol

+

Version 1.0

+

Riley Rainey

+

Preface

+

Why another DIS implementation?

+

I have always been interested in distributed interactive simulations.  In 1991, I released via Usenet a free X11-based  multi-player air combat simulation which I had named “ACMâ€.

+

In the spring of 1994, Eyal Lebedinsky contacted me.  He is the author of another freely available flight simulator, “fly8â€.  He introduced me to the IEEE DIS protocol and expressed interest in using DIS to integrate our two programs.  He pointed me to the Naval Postgraduate School’s freely available DIS implementation, called NPSNET.

+

At the time I looked at it, the NPSNET DIS library is a reasonably complete, if somewhat literal implementation of the DIS protocol standard written for Sun and SGI UNIX systems.  However, it had the significant portability drawback that it was written exclusively for big-endian machines.  I set out to create a more functional and portable implementation but was quickly drawn back to work more directly related to my “real†job.

Early in 1995, I was contacted by Mats Loftkvist.  Mats had independently taken the time to integrate a version of NPSNET into the current release of ACM.  This prompted me to dust-off the work that I had dropped earlier and to begin considering in earnest how one might create an improved DIS interface.

+

My thinking is that a reasonably complete DIS library would automate these functions:

+ +
+

+1. Allow for easy construction, transmission, reception and disassembly of DIS PDU’s. This implies that the library must standardize data structures that will correspond to all DIS PDU data structures. +

+

+2. Present the programmer with easy access to the wide variety of pre-defined DIS enumerated values. +

+
+ +

+Here is where I start to wish to go further than the NPSNET code: +

+ +
+

+3. Provide standardized mechanisms that will automatically generate values for many fields whose contents are defined to be outside the scope of the DIS protocol. For example, it would be nice to be able to supply application id field values (part of the simulation address structure) with little or no user-level coordination required. +

+

+4. Provide a mechanism that would allow an application to temporarily define new entity types. Those new entity types would have dynamically assigned enumeration values. Those temporary entity types could then be used by other applications. +

+

+5. Provide a mechanism to allow disparate DIS applications to share other simulation-related information. An example of this would be a database of all defined DIS entity types that could be queried at runtime to determine information about entities owned by other applications. +

+

+6. Implement the source code so that it is not big-endian specific. +

+

+7. Provide a mechanism to automate Dead Reckoning computation that might include the automated transmission of position updates. +

+
+ + +

DIS library layout

+ +

+My DIS library implementation is divided into three layers. Each layer is assigned a three or four character naming prefix. All subroutine calls and data structures belonging to a given layer have names that begin with the associated character prefix. +

+ +
+ +

+The lowest level layer is called simply DIS. It defines routines used to broadcast and receive PDU’s on the network, translating those PDU’s to and from PDU data structures defined in this library. Translation is performed through calls to ONC XDR library routines. +

+

+There are a number of details to the DIS protocol that are undefined. For example, no guidance is provided on how various user-defined fields (e.g. a DIS application id) are actually allocated. The implication seems to be that these values are manually allocated and distributed before an exercise begins. That method seems unusable in an environment where you’d like to insulate users from the details of DIS. To remedy this problem, I have defined a central simulation management server, SIM/x. Individual DIS applications may elect to consult that server to be assured to be getting appropriate values for these fields. +

+

+The middle, SIM/x, layer implements an interface to this central SIM/x server. Server requests are communicated via ONC RPC. +

+ + +
+ +

+The top layer, called DIS/x, integrates the two lower layers in a manner that allows DIS applications to interoperate whether they are consulting a common SIM/x server or not. This layer is implemented in such a way that the runtime environment can be tailored (through various environment variables and special configuration files) to allow the use of automatic (SIM/x) or manual value allocation techniques. +

+ +

+Riley Rainey -- Dallas, Texas, August 15, 1995 +

+ + +

References

+ + + + diff -Nru acm-5.0/src/dis/doc/dis_library_network.svg acm-6.0+20200416/src/dis/doc/dis_library_network.svg --- acm-5.0/src/dis/doc/dis_library_network.svg 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/dis/doc/dis_library_network.svg 2017-03-24 01:16:55.000000000 +0000 @@ -0,0 +1,503 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + DIS applications obtainunique application id'sand other values bycommunicating with theSIM/x server + DIS applicationscommunicate to one-another via the DISbroadcast port (UDP) + + + + DIS Application + + + + + DIS Application + + + + + DIS Application + + + + + + SIM/x Server + + + + + + + + + + + + + diff -Nru acm-5.0/src/dis/doc/dis_library_stack.svg acm-6.0+20200416/src/dis/doc/dis_library_stack.svg --- acm-5.0/src/dis/doc/dis_library_stack.svg 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/dis/doc/dis_library_stack.svg 2017-03-24 01:16:54.000000000 +0000 @@ -0,0 +1,122 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + DIS/x + SIM/x + DIS + + diff -Nru acm-5.0/src/dis/doc/rfc1014_XDR_encoding.txt acm-6.0+20200416/src/dis/doc/rfc1014_XDR_encoding.txt --- acm-5.0/src/dis/doc/rfc1014_XDR_encoding.txt 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/dis/doc/rfc1014_XDR_encoding.txt 2017-05-16 04:10:41.000000000 +0000 @@ -0,0 +1,1118 @@ + +Network Working Group Sun Microsystems, Inc. +Request for Comments: 1014 June 1987 + + + XDR: External Data Representation Standard + +STATUS OF THIS MEMO + + This RFC describes a standard that Sun Microsystems, Inc., and others + are using, one we wish to propose for the Internet's consideration. + Distribution of this memo is unlimited. + +1. INTRODUCTION + + XDR is a standard for the description and encoding of data. It is + useful for transferring data between different computer + architectures, and has been used to communicate data between such + diverse machines as the SUN WORKSTATION*, VAX*, IBM-PC*, and Cray*. + XDR fits into the ISO presentation layer, and is roughly analogous in + purpose to X.409, ISO Abstract Syntax Notation. The major difference + between these two is that XDR uses implicit typing, while X.409 uses + explicit typing. + + XDR uses a language to describe data formats. The language can only + be used only to describe data; it is not a programming language. + This language allows one to describe intricate data formats in a + concise manner. The alternative of using graphical representations + (itself an informal language) quickly becomes incomprehensible when + faced with complexity. The XDR language itself is similar to the C + language [1], just as Courier [4] is similar to Mesa. Protocols such + as Sun RPC (Remote Procedure Call) and the NFS* (Network File System) + use XDR to describe the format of their data. + + The XDR standard makes the following assumption: that bytes (or + octets) are portable, where a byte is defined to be 8 bits of data. + A given hardware device should encode the bytes onto the various + media in such a way that other hardware devices may decode the bytes + without loss of meaning. For example, the Ethernet* standard + suggests that bytes be encoded in "little-endian" style [2], or least + significant bit first. + +2. BASIC BLOCK SIZE + + The representation of all items requires a multiple of four bytes (or + 32 bits) of data. The bytes are numbered 0 through n-1. The bytes + are read or written to some byte stream such that byte m always + precedes byte m+1. If the n bytes needed to contain the data are not + a multiple of four, then the n bytes are followed by enough (0 to 3) + + + +SUN Microsystems [Page 1] + +RFC 1014 External Data Representation June 1987 + + + residual zero bytes, r, to make the total byte count a multiple of 4. + + We include the familiar graphic box notation for illustration and + comparison. In most illustrations, each box (delimited by a plus + sign at the 4 corners and vertical bars and dashes) depicts a byte. + Ellipses (...) between boxes show zero or more additional bytes where + required. + + +--------+--------+...+--------+--------+...+--------+ + | byte 0 | byte 1 |...|byte n-1| 0 |...| 0 | BLOCK + +--------+--------+...+--------+--------+...+--------+ + |<-----------n bytes---------->|<------r bytes------>| + |<-----------n+r (where (n+r) mod 4 = 0)>----------->| + +3. XDR DATA TYPES + + Each of the sections that follow describes a data type defined in the + XDR standard, shows how it is declared in the language, and includes + a graphic illustration of its encoding. + + For each data type in the language we show a general paradigm + declaration. Note that angle brackets (< and >) denote + variablelength sequences of data and square brackets ([ and ]) denote + fixed-length sequences of data. "n", "m" and "r" denote integers. + For the full language specification and more formal definitions of + terms such as "identifier" and "declaration", refer to section 5: + "The XDR Language Specification". + + For some data types, more specific examples are included. A more + extensive example of a data description is in section 6: "An Example + of an XDR Data Description". + +3.1 Integer + + An XDR signed integer is a 32-bit datum that encodes an integer in + the range [-2147483648,2147483647]. The integer is represented in + two's complement notation. The most and least significant bytes are + 0 and 3, respectively. Integers are declared as follows: + + int identifier; + + (MSB) (LSB) + +-------+-------+-------+-------+ + |byte 0 |byte 1 |byte 2 |byte 3 | INTEGER + +-------+-------+-------+-------+ + <------------32 bits------------> + + + + + +SUN Microsystems [Page 2] + +RFC 1014 External Data Representation June 1987 + + +3.2.Unsigned Integer + + An XDR unsigned integer is a 32-bit datum that encodes a nonnegative + integer in the range [0,4294967295]. It is represented by an + unsigned binary number whose most and least significant bytes are 0 + and 3, respectively. An unsigned integer is declared as follows: + + unsigned int identifier; + + (MSB) (LSB) + +-------+-------+-------+-------+ + |byte 0 |byte 1 |byte 2 |byte 3 | UNSIGNED INTEGER + +-------+-------+-------+-------+ + <------------32 bits------------> + +3.3 Enumeration + + Enumerations have the same representation as signed integers. + Enumerations are handy for describing subsets of the integers. + Enumerated data is declared as follows: + + enum { name-identifier = constant, ... } identifier; + + For example, the three colors red, yellow, and blue could be + described by an enumerated type: + + enum { RED = 2, YELLOW = 3, BLUE = 5 } colors; + + It is an error to encode as an enum any other integer than those that + have been given assignments in the enum declaration. + +3.4 Boolean + + Booleans are important enough and occur frequently enough to warrant + their own explicit type in the standard. Booleans are declared as + follows: + + bool identifier; + + This is equivalent to: + + enum { FALSE = 0, TRUE = 1 } identifier; + + + + + + + + + +SUN Microsystems [Page 3] + +RFC 1014 External Data Representation June 1987 + + +3.5 Hyper Integer and Unsigned Hyper Integer + + The standard also defines 64-bit (8-byte) numbers called hyper + integer and unsigned hyper integer. Their representations are the + obvious extensions of integer and unsigned integer defined above. + They are represented in two's complement notation. The most and + least significant bytes are 0 and 7, respectively. Their + declarations: + + hyper identifier; unsigned hyper identifier; + + (MSB) (LSB) + +-------+-------+-------+-------+-------+-------+-------+-------+ + |byte 0 |byte 1 |byte 2 |byte 3 |byte 4 |byte 5 |byte 6 |byte 7 | + +-------+-------+-------+-------+-------+-------+-------+-------+ + <----------------------------64 bits----------------------------> + HYPER INTEGER + UNSIGNED HYPER INTEGER + +3.6 Floating-point + + The standard defines the floating-point data type "float" (32 bits or + 4 bytes). The encoding used is the IEEE standard for normalized + single-precision floating-point numbers [3]. The following three + fields describe the single-precision floating-point number: + + S: The sign of the number. Values 0 and 1 represent positive and + negative, respectively. One bit. + + E: The exponent of the number, base 2. 8 bits are devoted to this + field. The exponent is biased by 127. + + F: The fractional part of the number's mantissa, base 2. 23 bits + are devoted to this field. + + Therefore, the floating-point number is described by: + + (-1)**S * 2**(E-Bias) * 1.F + + + + + + + + + + + + + +SUN Microsystems [Page 4] + +RFC 1014 External Data Representation June 1987 + + + It is declared as follows: + float identifier; + + +-------+-------+-------+-------+ + |byte 0 |byte 1 |byte 2 |byte 3 | SINGLE-PRECISION + S| E | F | FLOATING-POINT NUMBER + +-------+-------+-------+-------+ + 1|<- 8 ->|<-------23 bits------>| + <------------32 bits------------> + + Just as the most and least significant bytes of a number are 0 and 3, + the most and least significant bits of a single-precision floating- + point number are 0 and 31. The beginning bit (and most significant + bit) offsets of S, E, and F are 0, 1, and 9, respectively. Note that + these numbers refer to the mathematical positions of the bits, and + NOT to their actual physical locations (which vary from medium to + medium). + + The EEE specifications should be consulted concerning the encoding + for signed zero, signed infinity (overflow), and denormalized numbers + (underflow) [3]. According to IEEE specifications, the "NaN" (not a + number) is system dependent and should not be used externally. + +3.7 Double-precision Floating-point + + The standard defines the encoding for the double-precision floating- + point data type "double" (64 bits or 8 bytes). The encoding used is + the IEEE standard for normalized double-precision floating-point + numbers [3]. The standard encodes the following three fields, which + describe the double-precision floating-point number: + + S: The sign of the number. Values 0 and 1 represent positive and + negative, respectively. One bit. + + E: The exponent of the number, base 2. 11 bits are devoted to + this field. The exponent is biased by 1023. + + F: The fractional part of the number's mantissa, base 2. 52 bits + are devoted to this field. + + Therefore, the floating-point number is described by: + + (-1)**S * 2**(E-Bias) * 1.F + + + + + + + + +SUN Microsystems [Page 5] + +RFC 1014 External Data Representation June 1987 + + + It is declared as follows: + + double identifier; + + +------+------+------+------+------+------+------+------+ + |byte 0|byte 1|byte 2|byte 3|byte 4|byte 5|byte 6|byte 7| + S| E | F | + +------+------+------+------+------+------+------+------+ + 1|<--11-->|<-----------------52 bits------------------->| + <-----------------------64 bits-------------------------> + DOUBLE-PRECISION FLOATING-POINT + + Just as the most and least significant bytes of a number are 0 and 3, + the most and least significant bits of a double-precision floating- + point number are 0 and 63. The beginning bit (and most significant + bit) offsets of S, E , and F are 0, 1, and 12, respectively. Note + that these numbers refer to the mathematical positions of the bits, + and NOT to their actual physical locations (which vary from medium to + medium). + + The IEEE specifications should be consulted concerning the encoding + for signed zero, signed infinity (overflow), and denormalized numbers + (underflow) [3]. According to IEEE specifications, the "NaN" (not a + number) is system dependent and should not be used externally. + +3.8 Fixed-length Opaque Data + + At times, fixed-length uninterpreted data needs to be passed among + machines. This data is called "opaque" and is declared as follows: + + opaque identifier[n]; + + where the constant n is the (static) number of bytes necessary to + contain the opaque data. If n is not a multiple of four, then the n + bytes are followed by enough (0 to 3) residual zero bytes, r, to make + the total byte count of the opaque object a multiple of four. + + 0 1 ... + +--------+--------+...+--------+--------+...+--------+ + | byte 0 | byte 1 |...|byte n-1| 0 |...| 0 | + +--------+--------+...+--------+--------+...+--------+ + |<-----------n bytes---------->|<------r bytes------>| + |<-----------n+r (where (n+r) mod 4 = 0)------------>| + FIXED-LENGTH OPAQUE + +3.9 Variable-length Opaque Data + + The standard also provides for variable-length (counted) opaque data, + + + +SUN Microsystems [Page 6] + +RFC 1014 External Data Representation June 1987 + + + defined as a sequence of n (numbered 0 through n-1) arbitrary bytes + to be the number n encoded as an unsigned integer (as described + below), and followed by the n bytes of the sequence. + + Byte m of the sequence always precedes byte m+1 of the sequence, and + byte 0 of the sequence always follows the sequence's length (count). + If n is not a multiple of four, then the n bytes are followed by + enough (0 to 3) residual zero bytes, r, to make the total byte count + a multiple of four. Variable-length opaque data is declared in the + following way: + + opaque identifier; + or + opaque identifier<>; + + The constant m denotes an upper bound of the number of bytes that the + sequence may contain. If m is not specified, as in the second + declaration, it is assumed to be (2**32) - 1, the maximum length. + The constant m would normally be found in a protocol specification. + For example, a filing protocol may state that the maximum data + transfer size is 8192 bytes, as follows: + + opaque filedata<8192>; + + 0 1 2 3 4 5 ... + +-----+-----+-----+-----+-----+-----+...+-----+-----+...+-----+ + | length n |byte0|byte1|...| n-1 | 0 |...| 0 | + +-----+-----+-----+-----+-----+-----+...+-----+-----+...+-----+ + |<-------4 bytes------->|<------n bytes------>|<---r bytes--->| + |<----n+r (where (n+r) mod 4 = 0)---->| + VARIABLE-LENGTH OPAQUE + + It is an error to encode a length greater than the maximum described + in the specification. + +3.10 String + + The standard defines a string of n (numbered 0 through n-1) ASCII + bytes to be the number n encoded as an unsigned integer (as described + above), and followed by the n bytes of the string. Byte m of the + string always precedes byte m+1 of the string, and byte 0 of the + string always follows the string's length. If n is not a multiple of + four, then the n bytes are followed by enough (0 to 3) residual zero + bytes, r, to make the total byte count a multiple of four. Counted + byte strings are declared as follows: + + + + + + +SUN Microsystems [Page 7] + +RFC 1014 External Data Representation June 1987 + + + string object; + or + string object<>; + + + The constant m denotes an upper bound of the number of bytes that a + string may contain. If m is not specified, as in the second + declaration, it is assumed to be (2**32) - 1, the maximum length. + The constant m would normally be found in a protocol specification. + For example, a filing protocol may state that a file name can be no + longer than 255 bytes, as follows: + + string filename<255>; + + 0 1 2 3 4 5 ... + +-----+-----+-----+-----+-----+-----+...+-----+-----+...+-----+ + | length n |byte0|byte1|...| n-1 | 0 |...| 0 | + +-----+-----+-----+-----+-----+-----+...+-----+-----+...+-----+ + |<-------4 bytes------->|<------n bytes------>|<---r bytes--->| + |<----n+r (where (n+r) mod 4 = 0)---->| + STRING + + It is an error to encode a length greater than the maximum described + in the specification. + +3.11 Fixed-length Array + + Declarations for fixed-length arrays of homogeneous elements are in + the following form: + + type-name identifier[n]; + + Fixed-length arrays of elements numbered 0 through n-1 are encoded by + individually encoding the elements of the array in their natural + order, 0 through n-1. Each element's size is a multiple of four + bytes. Though all elements are of the same type, the elements may + have different sizes. For example, in a fixed-length array of + strings, all elements are of type "string", yet each element will + vary in its length. + + +---+---+---+---+---+---+---+---+...+---+---+---+---+ + | element 0 | element 1 |...| element n-1 | + +---+---+---+---+---+---+---+---+...+---+---+---+---+ + |<--------------------n elements------------------->| + + FIXED-LENGTH ARRAY + + + + + +SUN Microsystems [Page 8] + +RFC 1014 External Data Representation June 1987 + + +3.12 Variable-length Array + + Counted arrays provide the ability to encode variable-length arrays + of homogeneous elements. The array is encoded as the element count n + (an unsigned integer) followed by the encoding of each of the array's + elements, starting with element 0 and progressing through element n- + 1. The declaration for variable-length arrays follows this form: + + type-name identifier; + or + type-name identifier<>; + + The constant m specifies the maximum acceptable element count of an + array; if m is not specified, as in the second declaration, it is + assumed to be (2**32) - 1. + + 0 1 2 3 + +--+--+--+--+--+--+--+--+--+--+--+--+...+--+--+--+--+ + | n | element 0 | element 1 |...|element n-1| + +--+--+--+--+--+--+--+--+--+--+--+--+...+--+--+--+--+ + |<-4 bytes->|<--------------n elements------------->| + COUNTED ARRAY + + It is an error to encode a value of n that is greater than the + maximum described in the specification. + +3.13 Structure + + Structures are declared as follows: + + struct { + component-declaration-A; + component-declaration-B; + ... + } identifier; + + The components of the structure are encoded in the order of their + declaration in the structure. Each component's size is a multiple of + four bytes, though the components may be different sizes. + + +-------------+-------------+... + | component A | component B |... STRUCTURE + +-------------+-------------+... + +3.14 Discriminated Union + + A discriminated union is a type composed of a discriminant followed + by a type selected from a set of prearranged types according to the + + + +SUN Microsystems [Page 9] + +RFC 1014 External Data Representation June 1987 + + + value of the discriminant. The type of discriminant is either "int", + "unsigned int", or an enumerated type, such as "bool". The component + types are called "arms" of the union, and are preceded by the value + of the discriminant which implies their encoding. Discriminated + unions are declared as follows: + + union switch (discriminant-declaration) { + case discriminant-value-A: + arm-declaration-A; + case discriminant-value-B: + arm-declaration-B; + ... + default: default-declaration; + } identifier; + + Each "case" keyword is followed by a legal value of the discriminant. + The default arm is optional. If it is not specified, then a valid + encoding of the union cannot take on unspecified discriminant values. + The size of the implied arm is always a multiple of four bytes. + + The discriminated union is encoded as its discriminant followed by + the encoding of the implied arm. + + 0 1 2 3 + +---+---+---+---+---+---+---+---+ + | discriminant | implied arm | DISCRIMINATED UNION + +---+---+---+---+---+---+---+---+ + |<---4 bytes--->| + +3.15 Void + + An XDR void is a 0-byte quantity. Voids are useful for describing + operations that take no data as input or no data as output. They are + also useful in unions, where some arms may contain data and others do + not. The declaration is simply as follows: + void; + + Voids are illustrated as follows: + + ++ + || VOID + ++ + --><-- 0 bytes + +3.16 Constant + + The data declaration for a constant follows this form: + + + + +SUN Microsystems [Page 10] + +RFC 1014 External Data Representation June 1987 + + + const name-identifier = n; + + "const" is used to define a symbolic name for a constant; it does not + declare any data. The symbolic constant may be used anywhere a + regular constant may be used. For example, the following defines a + symbolic constant DOZEN, equal to 12. + + const DOZEN = 12; + +3.17 Typedef + + "typedef" does not declare any data either, but serves to define new + identifiers for declaring data. The syntax is: + + typedef declaration; + + The new type name is actually the variable name in the declaration + part of the typedef. For example, the following defines a new type + called "eggbox" using an existing type called "egg": + + typedef egg eggbox[DOZEN]; + + Variables declared using the new type name have the same type as the + new type name would have in the typedef, if it was considered a + variable. For example, the following two declarations are equivalent + in declaring the variable "fresheggs": + + eggbox fresheggs; + egg fresheggs[DOZEN]; + + When a typedef involves a struct, enum, or union definition, there is + another (preferred) syntax that may be used to define the same type. + In general, a typedef of the following form: + + typedef <> identifier; + + may be converted to the alternative form by removing the "typedef" + part and placing the identifier after the "struct", "union", or + "enum" keyword, instead of at the end. For example, here are the two + ways to define the type "bool": + + + + + + + + + + + +SUN Microsystems [Page 11] + +RFC 1014 External Data Representation June 1987 + + + typedef enum { /* using typedef */ + FALSE = 0, + TRUE = 1 + } bool; + + enum bool { /* preferred alternative */ + FALSE = 0, + TRUE = 1 + }; + + The reason this syntax is preferred is one does not have to wait + until the end of a declaration to figure out the name of the new + type. + +3.18 Optional-data + + Optional-data is one kind of union that occurs so frequently that we + give it a special syntax of its own for declaring it. It is declared + as follows: + + type-name *identifier; + + This is equivalent to the following union: + + union switch (bool opted) { + case TRUE: + type-name element; + case FALSE: + void; + } identifier; + + It is also equivalent to the following variable-length array + declaration, since the boolean "opted" can be interpreted as the + length of the array: + + type-name identifier<1>; + + Optional-data is not so interesting in itself, but it is very useful + for describing recursive data-structures such as linked-lists and + trees. For example, the following defines a type "stringlist" that + encodes lists of arbitrary length strings: + + struct *stringlist { + string item<>; + stringlist next; + }; + + + + + +SUN Microsystems [Page 12] + +RFC 1014 External Data Representation June 1987 + + + It could have been equivalently declared as the following union: + + union stringlist switch (bool opted) { + case TRUE: + struct { + string item<>; + stringlist next; + } element; + case FALSE: + void; + }; + + or as a variable-length array: + + struct stringlist<1> { + string item<>; + stringlist next; + }; + + Both of these declarations obscure the intention of the stringlist + type, so the optional-data declaration is preferred over both of + them. The optional-data type also has a close correlation to how + recursive data structures are represented in high-level languages + such as Pascal or C by use of pointers. In fact, the syntax is the + same as that of the C language for pointers. + +3.19 Areas for Future Enhancement + + The XDR standard lacks representations for bit fields and bitmaps, + since the standard is based on bytes. Also missing are packed (or + binary-coded) decimals. + + The intent of the XDR standard was not to describe every kind of data + that people have ever sent or will ever want to send from machine to + machine. Rather, it only describes the most commonly used data-types + of high-level languages such as Pascal or C so that applications + written in these languages will be able to communicate easily over + some medium. + + One could imagine extensions to XDR that would let it describe almost + any existing protocol, such as TCP. The minimum necessary for this + are support for different block sizes and byte-orders. The XDR + discussed here could then be considered the 4-byte big-endian member + of a larger XDR family. + + + + + + + +SUN Microsystems [Page 13] + +RFC 1014 External Data Representation June 1987 + + +4. DISCUSSION + + (1) Why use a language for describing data? What's wrong with + diagrams? + + There are many advantages in using a data-description language such + as XDR versus using diagrams. Languages are more formal than + diagrams and lead to less ambiguous descriptions of data. + Languages are also easier to understand and allow one to think of + other issues instead of the low-level details of bit-encoding. + Also, there is a close analogy between the types of XDR and a + high-level language such as C or Pascal. This makes the + implementation of XDR encoding and decoding modules an easier task. + Finally, the language specification itself is an ASCII string that + can be passed from machine to machine to perform on-the-fly data + interpretation. + + (2) Why is there only one byte-order for an XDR unit? + + Supporting two byte-orderings requires a higher level protocol for + determining in which byte-order the data is encoded. Since XDR is + not a protocol, this can't be done. The advantage of this, though, + is that data in XDR format can be written to a magnetic tape, for + example, and any machine will be able to interpret it, since no + higher level protocol is necessary for determining the byte-order. + + (3) Why is the XDR byte-order big-endian instead of little-endian? + Isn't this unfair to little-endian machines such as the VAX(r), which + has to convert from one form to the other? + + Yes, it is unfair, but having only one byte-order means you have to + be unfair to somebody. Many architectures, such as the Motorola + 68000* and IBM 370*, support the big-endian byte-order. + + (4) Why is the XDR unit four bytes wide? + + There is a tradeoff in choosing the XDR unit size. Choosing a small + size such as two makes the encoded data small, but causes alignment + problems for machines that aren't aligned on these boundaries. A + large size such as eight means the data will be aligned on virtually + every machine, but causes the encoded data to grow too big. We chose + four as a compromise. Four is big enough to support most + architectures efficiently, except for rare machines such as the + eight-byte aligned Cray*. Four is also small enough to keep the + encoded data restricted to a reasonable size. + + + + + + +SUN Microsystems [Page 14] + +RFC 1014 External Data Representation June 1987 + + + (5) Why must variable-length data be padded with zeros? + + It is desirable that the same data encode into the same thing on all + machines, so that encoded data can be meaningfully compared or + checksummed. Forcing the padded bytes to be zero ensures this. + + (6) Why is there no explicit data-typing? + + Data-typing has a relatively high cost for what small advantages it + may have. One cost is the expansion of data due to the inserted type + fields. Another is the added cost of interpreting these type fields + and acting accordingly. And most protocols already know what type + they expect, so data-typing supplies only redundant information. + However, one can still get the benefits of data-typing using XDR. One + way is to encode two things: first a string which is the XDR data + description of the encoded data, and then the encoded data itself. + Another way is to assign a value to all the types in XDR, and then + define a universal type which takes this value as its discriminant + and for each value, describes the corresponding data type. + + +5. THE XDR LANGUAGE SPECIFICATION + + 5.1 Notational Conventions + + This specification uses an extended Back-Naur Form notation for + describing the XDR language. Here is a brief description of the + notation: + + + (1) The characters '|', '(', ')', '[', ']', '"', and '*' are special. + (2) Terminal symbols are strings of any characters surrounded by + double quotes. + (3) Non-terminal symbols are strings of non-special characters. + (4) Alternative items are separated by a vertical bar ("|"). + (5) Optional items are enclosed in brackets. + (6) Items are grouped together by enclosing them in parentheses. + (7) A '*' following an item means 0 or more occurrences of that item. + + For example, consider the following pattern: + + "a " "very" (", " "very")* [" cold " "and "] " rainy " + ("day" | "night") + + An infinite number of strings match this pattern. A few of them are: + + + + + + +SUN Microsystems [Page 15] + +RFC 1014 External Data Representation June 1987 + + + "a very rainy day" + "a very, very rainy day" + "a very cold and rainy day" + "a very, very, very cold and rainy night" + +5.2 Lexical Notes + + (1) Comments begin with '/*' and terminate with '*/'. + (2) White space serves to separate items and is otherwise ignored. + (3) An identifier is a letter followed by an optional sequence of + letters, digits or underbar ('_'). The case of identifiers is not + ignored. + (4) A constant is a sequence of one or more decimal digits, + optionally preceded by a minus-sign ('-'). + +5.3 Syntax Information + + declaration: + type-specifier identifier + | type-specifier identifier "[" value "]" + | type-specifier identifier "<" [ value ] ">" + | "opaque" identifier "[" value "]" + | "opaque" identifier "<" [ value ] ">" + | "string" identifier "<" [ value ] ">" + | type-specifier "*" identifier + | "void" + + value: + constant + | identifier + + type-specifier: + [ "unsigned" ] "int" + | [ "unsigned" ] "hyper" + | "float" + | "double" + | "bool" + | enum-type-spec + | struct-type-spec + | union-type-spec + | identifier + + enum-type-spec: + "enum" enum-body + + enum-body: + "{" + ( identifier "=" value ) + + + +SUN Microsystems [Page 16] + +RFC 1014 External Data Representation June 1987 + + + ( "," identifier "=" value )* + "}" + + struct-type-spec: + "struct" struct-body + + struct-body: + "{" + ( declaration ";" ) + ( declaration ";" )* + "}" + + union-type-spec: + "union" union-body + + union-body: + "switch" "(" declaration ")" "{" + ( "case" value ":" declaration ";" ) + ( "case" value ":" declaration ";" )* + [ "default" ":" declaration ";" ] + "}" + + constant-def: + "const" identifier "=" constant ";" + + type-def: + "typedef" declaration ";" + | "enum" identifier enum-body ";" + | "struct" identifier struct-body ";" + | "union" identifier union-body ";" + + definition: + type-def + | constant-def + + specification: + definition * + +5.4 Syntax Notes + + (1) The following are keywords and cannot be used as identifiers: + "bool", "case", "const", "default", "double", "enum", "float", + "hyper", "opaque", "string", "struct", "switch", "typedef", "union", + "unsigned" and "void". + + (2) Only unsigned constants may be used as size specifications for + arrays. If an identifier is used, it must have been declared + previously as an unsigned constant in a "const" definition. + + + +SUN Microsystems [Page 17] + +RFC 1014 External Data Representation June 1987 + + + (3) Constant and type identifiers within the scope of a specification + are in the same name space and must be declared uniquely within this + scope. + + (4) Similarly, variable names must be unique within the scope of + struct and union declarations. Nested struct and union declarations + create new scopes. + + (5) The discriminant of a union must be of a type that evaluates to + an integer. That is, "int", "unsigned int", "bool", an enumerated + type or any typedefed type that evaluates to one of these is legal. + Also, the case values must be one of the legal values of the + discriminant. Finally, a case value may not be specified more than + once within the scope of a union declaration. + +6. AN EXAMPLE OF AN XDR DATA DESCRIPTION + + Here is a short XDR data description of a thing called a "file", + which might be used to transfer files from one machine to another. + + const MAXUSERNAME = 32; /* max length of a user name */ + const MAXFILELEN = 65535; /* max length of a file */ + const MAXNAMELEN = 255; /* max length of a file name */ + + /* + * Types of files: + */ + enum filekind { + TEXT = 0, /* ascii data */ + DATA = 1, /* raw data */ + EXEC = 2 /* executable */ + }; + + /* + * File information, per kind of file: + */ + union filetype switch (filekind kind) { + case TEXT: + void; /* no extra information */ + case DATA: + string creator; /* data creator */ + case EXEC: + string interpretor; /* program interpretor */ + }; + + + + + + + +SUN Microsystems [Page 18] + +RFC 1014 External Data Representation June 1987 + + + /* + * A complete file: + */ + struct file { + string filename; /* name of file */ + filetype type; /* info about file */ + string owner; /* owner of file */ + opaque data; /* file data */ + }; + + Suppose now that there is a user named "john" who wants to store his + lisp program "sillyprog" that contains just the data "(quit)". His + file would be encoded as follows: + + OFFSET HEX BYTES ASCII COMMENTS + ------ --------- ----- -------- + 0 00 00 00 09 .... -- length of filename = 9 + 4 73 69 6c 6c sill -- filename characters + 8 79 70 72 6f ypro -- ... and more characters ... + 12 67 00 00 00 g... -- ... and 3 zero-bytes of fill + 16 00 00 00 02 .... -- filekind is EXEC = 2 + 20 00 00 00 04 .... -- length of interpretor = 4 + 24 6c 69 73 70 lisp -- interpretor characters + 28 00 00 00 04 .... -- length of owner = 4 + 32 6a 6f 68 6e john -- owner characters + 36 00 00 00 06 .... -- length of file data = 6 + 40 28 71 75 69 (qui -- file data bytes ... + 44 74 29 00 00 t).. -- ... and 2 zero-bytes of fill + +7. REFERENCES + + [1] Brian W. Kernighan & Dennis M. Ritchie, "The C Programming + Language", Bell Laboratories, Murray Hill, New Jersey, 1978. + + [2] Danny Cohen, "On Holy Wars and a Plea for Peace", IEEE Computer, + October 1981. + + [3] "IEEE Standard for Binary Floating-Point Arithmetic", ANSI/IEEE + Standard 754-1985, Institute of Electrical and Electronics + Engineers, August 1985. + + [4] "Courier: The Remote Procedure Call Protocol", XEROX + Corporation, XSIS 038112, December 1981. + + + + + + + + +SUN Microsystems [Page 19] + +RFC 1014 External Data Representation June 1987 + + +8. TRADEMARKS AND OWNERS + + SUN WORKSTATION Sun Microsystems, Inc. + VAX Digital Equipment Corporation + IBM-PC International Business Machines Corporation + Cray Cray Research + NFS Sun Microsystems, Inc. + Ethernet Xerox Corporation. + Motorola 68000 Motorola, Inc. + IBM 370 International Business Machines Corporation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +SUN Microsystems [Page 20] + diff -Nru acm-5.0/src/dis/doc/xdr_manual_page.txt acm-6.0+20200416/src/dis/doc/xdr_manual_page.txt --- acm-5.0/src/dis/doc/xdr_manual_page.txt 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/dis/doc/xdr_manual_page.txt 2017-05-16 04:10:41.000000000 +0000 @@ -0,0 +1,387 @@ + + +man7.org > Linux > man-pages + + +Linux/UNIX system programming training + +NAME | SYNOPSIS AND DESCRIPTION | ATTRIBUTES | SEE ALSO | COLOPHON + + +XDR(3) Linux Programmer's Manual XDR(3) + +NAME top + + xdr - library routines for external data representation + +SYNOPSIS AND DESCRIPTION top + + These routines allow C programmers to describe arbitrary data + structures in a machine-independent fashion. Data for remote + procedure calls are transmitted using these routines. + + The prototypes below are declared in and make use of the + following types: + + typedef int bool_t; + + typedef bool_t (*xdrproc_t) (XDR *, void *,...); + + For the declaration of the XDR type, see . + + bool_t xdr_array(XDR *xdrs, char **arrp, unsigned int *sizep, + unsigned int maxsize, unsigned int elsize, + xdrproc_t elproc); + + A filter primitive that translates between variable-length + arrays and their corresponding external representations. The + argument arrp is the address of the pointer to the array, + while sizep is the address of the element count of the array; + this element count cannot exceed maxsize. The argument elsize + is the sizeof each of the array's elements, and elproc is an + XDR filter that translates between the array elements' C form, + and their external representation. This routine returns one + if it succeeds, zero otherwise. + + bool_t xdr_bool(XDR *xdrs, bool_t *bp); + + A filter primitive that translates between booleans (C + integers) and their external representations. When encoding + data, this filter produces values of either one or zero. This + routine returns one if it succeeds, zero otherwise. + + bool_t xdr_bytes(XDR *xdrs, char **sp, unsigned int *sizep, + unsigned int maxsize); + + A filter primitive that translates between counted byte + strings and their external representations. The argument sp + is the address of the string pointer. The length of the + string is located at address sizep; strings cannot be longer + than maxsize. This routine returns one if it succeeds, zero + otherwise. + + bool_t xdr_char(XDR *xdrs, char *cp); + + A filter primitive that translates between C characters and + their external representations. This routine returns one if + it succeeds, zero otherwise. Note: encoded characters are not + packed, and occupy 4 bytes each. For arrays of characters, it + is worthwhile to consider xdr_bytes(), xdr_opaque() or + xdr_string(). + + void xdr_destroy(XDR *xdrs); + + A macro that invokes the destroy routine associated with the + XDR stream, xdrs. Destruction usually involves freeing + private data structures associated with the stream. Using + xdrs after invoking xdr_destroy() is undefined. + + bool_t xdr_double(XDR *xdrs, double *dp); + + A filter primitive that translates between C double precision + numbers and their external representations. This routine + returns one if it succeeds, zero otherwise. + + bool_t xdr_enum(XDR *xdrs, enum_t *ep); + + A filter primitive that translates between C enums (actually + integers) and their external representations. This routine + returns one if it succeeds, zero otherwise. + + bool_t xdr_float(XDR *xdrs, float *fp); + + A filter primitive that translates between C floats and their + external representations. This routine returns one if it + succeeds, zero otherwise. + + void xdr_free(xdrproc_t proc, char *objp); + + Generic freeing routine. The first argument is the XDR + routine for the object being freed. The second argument is a + pointer to the object itself. Note: the pointer passed to + this routine is not freed, but what it points to is freed + (recursively). + + unsigned int xdr_getpos(XDR *xdrs); + + A macro that invokes the get-position routine associated with + the XDR stream, xdrs. The routine returns an unsigned + integer, which indicates the position of the XDR byte stream. + A desirable feature of XDR streams is that simple arithmetic + works with this number, although the XDR stream instances need + not guarantee this. + + long *xdr_inline(XDR *xdrs, int len); + + A macro that invokes the inline routine associated with the + XDR stream, xdrs. The routine returns a pointer to a + contiguous piece of the stream's buffer; len is the byte + length of the desired buffer. Note: pointer is cast to + long *. + + Warning: xdr_inline() may return NULL (0) if it cannot + allocate a contiguous piece of a buffer. Therefore the + behavior may vary among stream instances; it exists for the + sake of efficiency. + + bool_t xdr_int(XDR *xdrs, int *ip); + + A filter primitive that translates between C integers and + their external representations. This routine returns one if + it succeeds, zero otherwise. + + bool_t xdr_long(XDR *xdrs, long *lp); + + A filter primitive that translates between C long integers and + their external representations. This routine returns one if + it succeeds, zero otherwise. + + void xdrmem_create(XDR *xdrs, char *addr, unsigned int size, + enum xdr_op op); + + This routine initializes the XDR stream object pointed to by + xdrs. The stream's data is written to, or read from, a chunk + of memory at location addr whose length is no more than size + bytes long. The op determines the direction of the XDR stream + (either XDR_ENCODE, XDR_DECODE, or XDR_FREE). + + bool_t xdr_opaque(XDR *xdrs, char *cp, unsigned int cnt); + + A filter primitive that translates between fixed size opaque + data and its external representation. The argument cp is the + address of the opaque object, and cnt is its size in bytes. + This routine returns one if it succeeds, zero otherwise. + + bool_t xdr_pointer(XDR *xdrs, char **objpp, + unsigned int objsize, xdrproc_t xdrobj); + + Like xdr_reference() except that it serializes null pointers, + whereas xdr_reference() does not. Thus, xdr_pointer() can + represent recursive data structures, such as binary trees or + linked lists. + + void xdrrec_create(XDR *xdrs, unsigned int sendsize, + unsigned int recvsize, char *handle, + int (*readit) (char *, char *, int), + int (*writeit) (char *, char *, int)); + + This routine initializes the XDR stream object pointed to by + xdrs. The stream's data is written to a buffer of size + sendsize; a value of zero indicates the system should use a + suitable default. The stream's data is read from a buffer of + size recvsize; it too can be set to a suitable default by + passing a zero value. When a stream's output buffer is full, + writeit is called. Similarly, when a stream's input buffer is + empty, readit is called. The behavior of these two routines + is similar to the system calls read(2) and write(2), except + that handle is passed to the former routines as the first + argument. Note: the XDR stream's op field must be set by the + caller. + + Warning: to read from an XDR stream created by this API, + you'll need to call xdrrec_skiprecord() first before calling + any other XDR APIs. This inserts additional bytes in the + stream to provide record boundary information. Also, XDR + streams created with different xdr*_create APIs are not + compatible for the same reason. + + bool_t xdrrec_endofrecord(XDR *xdrs, int sendnow); + + This routine can be invoked only on streams created by + xdrrec_create(). The data in the output buffer is marked as a + completed record, and the output buffer is optionally written + out if sendnow is nonzero. This routine returns one if it + succeeds, zero otherwise. + + bool_t xdrrec_eof(XDR *xdrs); + + This routine can be invoked only on streams created by + xdrrec_create(). After consuming the rest of the current + record in the stream, this routine returns one if the stream + has no more input, zero otherwise. + + bool_t xdrrec_skiprecord(XDR *xdrs); + + This routine can be invoked only on streams created by + xdrrec_create(). It tells the XDR implementation that the + rest of the current record in the stream's input buffer should + be discarded. This routine returns one if it succeeds, zero + otherwise. + + bool_t xdr_reference(XDR *xdrs, char **pp, unsigned int size, + xdrproc_t proc); + + A primitive that provides pointer chasing within structures. + The argument pp is the address of the pointer; size is the + sizeof the structure that *pp points to; and proc is an XDR + procedure that filters the structure between its C form and + its external representation. This routine returns one if it + succeeds, zero otherwise. + + Warning: this routine does not understand null pointers. Use + xdr_pointer() instead. + + xdr_setpos(XDR *xdrs, unsigned int pos); + + A macro that invokes the set position routine associated with + the XDR stream xdrs. The argument pos is a position value + obtained from xdr_getpos(). This routine returns one if the + XDR stream could be repositioned, and zero otherwise. + + Warning: it is difficult to reposition some types of XDR + streams, so this routine may fail with one type of stream and + succeed with another. + + bool_t xdr_short(XDR *xdrs, short *sp); + + A filter primitive that translates between C short integers + and their external representations. This routine returns one + if it succeeds, zero otherwise. + + void xdrstdio_create(XDR *xdrs, FILE *file, enum xdr_op op); + + This routine initializes the XDR stream object pointed to by + xdrs. The XDR stream data is written to, or read from, the + stdio stream file. The argument op determines the direction + of the XDR stream (either XDR_ENCODE, XDR_DECODE, or + XDR_FREE). + + Warning: the destroy routine associated with such XDR streams + calls fflush(3) on the file stream, but never fclose(3). + + bool_t xdr_string(XDR *xdrs, char **sp, unsigned int maxsize); + + A filter primitive that translates between C strings and their + corresponding external representations. Strings cannot be + longer than maxsize. Note: sp is the address of the string's + pointer. This routine returns one if it succeeds, zero + otherwise. + + bool_t xdr_u_char(XDR *xdrs, unsigned char *ucp); + + A filter primitive that translates between unsigned C + characters and their external representations. This routine + returns one if it succeeds, zero otherwise. + + bool_t xdr_u_int(XDR *xdrs, unsigned *up); + + A filter primitive that translates between C unsigned integers + and their external representations. This routine returns one + if it succeeds, zero otherwise. + + bool_t xdr_u_long(XDR *xdrs, unsigned long *ulp); + + A filter primitive that translates between C unsigned long + integers and their external representations. This routine + returns one if it succeeds, zero otherwise. + + bool_t xdr_u_short(XDR *xdrs, unsigned short *usp); + + A filter primitive that translates between C unsigned short + integers and their external representations. This routine + returns one if it succeeds, zero otherwise. + + bool_t xdr_union(XDR *xdrs, int *dscmp, char *unp, + struct xdr_discrim *choices, + xdrproc_t defaultarm); /* may equal NULL */ + + A filter primitive that translates between a discriminated C + union and its corresponding external representation. It first + translates the discriminant of the union located at dscmp. + This discriminant is always an enum_t. Next the union located + at unp is translated. The argument choices is a pointer to an + array of xdr_discrim() structures. Each structure contains an + ordered pair of [value,proc]. If the union's discriminant is + equal to the associated value, then the proc is called to + translate the union. The end of the xdr_discrim() structure + array is denoted by a routine of value NULL. If the + discriminant is not found in the choices array, then the + defaultarm procedure is called (if it is not NULL). Returns + one if it succeeds, zero otherwise. + + bool_t xdr_vector(XDR *xdrs, char *arrp, unsigned int size, + unsigned int elsize, xdrproc_t elproc); + + A filter primitive that translates between fixed-length arrays + and their corresponding external representations. The + argument arrp is the address of the pointer to the array, + while size is the element count of the array. The argument + elsize is the sizeof each of the array's elements, and elproc + is an XDR filter that translates between the array elements' C + form, and their external representation. This routine returns + one if it succeeds, zero otherwise. + + bool_t xdr_void(void); + + This routine always returns one. It may be passed to RPC + routines that require a function argument, where nothing is to + be done. + + bool_t xdr_wrapstring(XDR *xdrs, char **sp); + + A primitive that calls xdr_string(xdrs, sp,MAXUN.UNSIGNED ); + where MAXUN.UNSIGNED is the maximum value of an unsigned + integer. xdr_wrapstring() is handy because the RPC package + passes a maximum of two XDR routines as arguments, and + xdr_string(), one of the most frequently used primitives, + requires three. Returns one if it succeeds, zero otherwise. + +ATTRIBUTES top + + For an explanation of the terms used in this section, see + attributes(7). + + ┌────────────────────────────────┬───────────────┬─────────┠+ │Interface │ Attribute │ Value │ + ├────────────────────────────────┼───────────────┼─────────┤ + │xdr_array(), xdr_bool(), │ Thread safety │ MT-Safe │ + │xdr_bytes(), xdr_char(), │ │ │ + │xdr_destroy(), xdr_double(), │ │ │ + │xdr_enum(), xdr_float(), │ │ │ + │xdr_free(), xdr_getpos(), │ │ │ + │xdr_inline(), xdr_int(), │ │ │ + │xdr_long(), xdrmem_create(), │ │ │ + │xdr_opaque(), xdr_pointer(), │ │ │ + │xdrrec_create(), xdrrec_eof(), │ │ │ + │xdrrec_endofrecord(), │ │ │ + │xdrrec_skiprecord(), │ │ │ + │xdr_reference(), xdr_setpos(), │ │ │ + │xdr_short(), xdrstdio_create(), │ │ │ + │xdr_string(), xdr_u_char(), │ │ │ + │xdr_u_int(), xdr_u_long(), │ │ │ + │xdr_u_short(), xdr_union(), │ │ │ + │xdr_vector(), xdr_void(), │ │ │ + │xdr_wrapstring() │ │ │ + └────────────────────────────────┴───────────────┴─────────┘ + +SEE ALSO top + + rpc(3) + + The following manuals: + eXternal Data Representation Standard: Protocol Specification + eXternal Data Representation: Sun Technical Notes + XDR: External Data Representation Standard, RFC 1014, Sun + Microsystems, Inc., USC-ISI. + +COLOPHON top + + This page is part of release 4.11 of the Linux man-pages project. A + description of the project, information about reporting bugs, and the + latest version of this page, can be found at + https://www.kernel.org/doc/man-pages/. + + 2015-07-23 XDR(3) + +Pages that refer to this page: rpc(3) + +Copyright and license for this manual page + +HTML rendering created 2017-05-03 by Michael Kerrisk, author of The Linux Programming Interface, maintainer of the Linux man-pages project. + +For details of in-depth Linux/UNIX system programming training courses that I teach, look here. + +Hosting by jambit GmbH. + +Valid XHTML 1.1 + Cover of TLPI diff -Nru acm-5.0/src/dis/Makefile acm-6.0+20200416/src/dis/Makefile --- acm-5.0/src/dis/Makefile 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/dis/Makefile 2017-04-14 19:03:12.000000000 +0000 @@ -0,0 +1,14 @@ +all: + rm -rf doxygen-html + find . -mindepth 2 -name Makefile \ + | while read m; do make -C $$(dirname $$m) all || exit 1; done + +clean: + rm -rf doxygen-html + find . -mindepth 2 -name Makefile \ + | while read m; do make -C $$(dirname $$m) clean || exit 1; done + +rebuild: + rm -rf doxygen-html + find . -mindepth 2 -name Makefile \ + | while read m; do make -C $$(dirname $$m) rebuild || exit 1; done diff -Nru acm-5.0/src/dis/README acm-6.0+20200416/src/dis/README --- acm-5.0/src/dis/README 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/dis/README 2017-05-16 04:10:41.000000000 +0000 @@ -0,0 +1,13 @@ +DIS Library, version 1.0 + +Copyright (C) 1996, Riley Rainey (rainey@netcom.com) + + +COPYING and USE + +Use and distribution of this software is governed by your choice of one of +two licensing schemes: the GNU Library Public License or the "Artistic" +license. See the COPYING.LIB and Artistic files for more information. + +The XDR module contains software copyrighted by Sun Microsystems, Inc.; please +read the respective source for full copying conditions. diff -Nru acm-5.0/src/dis/server/dis_relay.c acm-6.0+20200416/src/dis/server/dis_relay.c --- acm-5.0/src/dis/server/dis_relay.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/dis/server/dis_relay.c 2020-04-16 12:05:40.000000000 +0000 @@ -0,0 +1,436 @@ +/* + * DIS/x : An implementation of the IEEE 1278.1 protocol + * + * Copyright (C) 1996, Riley Rainey (rainey@netcom.com) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of either: + * + * a) the GNU Library General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your + * option) any later version. A description of the terms and conditions + * of the GLPL may be found in the "COPYING.LIB" file. + * + * b) the "Artistic License" which comes with this Kit. Information + * about this license may be found in the "Artistic" file. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License or the Artistic License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Information describing how to contact the author can be found in the + * README file. + */ + +/** + * DIS relay daemon. + * + * Currently this program registers as client any host from which it + * receives an UDP packet on the given server port. Each packet received from a + * client is then re-sent to all the registered clients. Registered clients are + * automatically de-registered after they are silent for too much time + * (currently 60 s). + * The server listens on any available Internet interface. + * + * Command line options: + * + * --port PORT Set the UDP port of the relay server, default being 3000. + * + * --debug Displays several debugging messages, including: new registered + * clients; received packets; sent packets; de-registered clients. + * + * --help | -h Help! + * + * @file + */ + +#ifdef WINNT + // recvmsg() not available under WINNT. + #undef HAVE_RECVMSG + #include + // Under MinGW, add missing prototype of a function provided by libws2_32.a: + WINSOCK_API_LINKAGE const char * WSAAPI inet_ntop(int af, const void *src, + char *dst, socklen_t size); +#else + #include + #include + #include + #include + #include + #define HAVE_RECVMSG + // Cope with slightly different field names of msghdr: Solaris and BSD call + // them "msg_accessright...", any other system calls them "msg_control...". + #undef HAVE_MSG_ACCRIGHTS + #define HAVE_MSG_CONTROL +#endif + +#include +#include +#include +#include +#include +#include +#include + +#include "../../util/memory.h" +#include "../../util/error.h" +#include "../dis/dis.h" + +/** + * Remove client silent since so much time (s). + */ +#define STALE_PERIOD 60 + +typedef struct SwitchClient { + struct SwitchClient *prev, *next; + struct sockaddr addr; + /** Timestamp last received PDU. */ + time_t last_got_pdu; +} SwitchClient; + +static SwitchClient *client_list = 0; + + +static void accountErrorOnClient(SwitchClient *sc) +{ + // FIXME: to do: remove unreachable clients after a while +} + + + +/** + * Returns true if the two sockets are equal. + * @param a + * @param b + * @return True if the two sockets are equal. + */ +static int sockaddrEquals(struct sockaddr *a, struct sockaddr *b) +{ + return a->sa_family == b->sa_family + && ( + ( + (a->sa_family == AF_INET) && (memcmp(a, b, sizeof(struct sockaddr_in)) == 0) + ) || ( + (a->sa_family == AF_INET6) && (memcmp(a, b, sizeof(struct sockaddr_in6)) == 0) +/* + ) || ( + (a->sa_family == AF_UNIX) && (strcmp(((struct sockaddr_un *) a)->sun_path, ((struct sockaddr_un *) b)->sun_path) == 0) +*/ + ) + ); +} + + +/** + * Returns the socket address as a human readable string. + * @author W. Richard Stevens, UNIX Network Programming vol. 1, par. 3.8. + * @param sa + * @return + */ +static char * +sockaddrToString(const struct sockaddr *sa) +{ + char portstr[7]; + static char str[128]; /* Unix domain is largest */ + + switch (sa->sa_family) { + case AF_INET: { + struct sockaddr_in *sin = (struct sockaddr_in *) sa; + + if (inet_ntop(AF_INET, &sin->sin_addr, str, sizeof(str)) == NULL) + return(NULL); + if (ntohs(sin->sin_port) != 0) { + snprintf(portstr, sizeof(portstr), ":%d", ntohs(sin->sin_port)); + strcat(str, portstr); + } + return str; + } + + case AF_INET6: { + struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) sa; + + if (inet_ntop(AF_INET6, &sin6->sin6_addr, str, sizeof(str)) == NULL) + return(NULL); + if (ntohs(sin6->sin6_port) != 0) { + snprintf(portstr, sizeof(portstr), ":%d", ntohs(sin6->sin6_port)); + strcat(str, portstr); + } + return str; + } + +/* + case AF_UNIX: { + struct sockaddr_un *unp = (struct sockaddr_un *) sa; + + / * OK to have no pathname bound to the socket: happens on + every connect() unless client calls bind() first. * / + if (unp->sun_path[0] == 0) + strcpy(str, "(no pathname bound)"); + else + snprintf(str, sizeof(str), "%s", unp->sun_path); + return str; + } +*/ + +#ifdef HAVE_SOCKADDR_DL_STRUCT + case AF_LINK: { + struct sockaddr_dl *sdl = (struct sockaddr_dl *) sa; + + if (sdl->sdl_nlen > 0) + snprintf(str, sizeof(str), "%*s", + sdl->sdl_nlen, &sdl->sdl_data[0]); + else + snprintf(str, sizeof(str), "AF_LINK, index=%d", sdl->sdl_index); + return str; + } +#endif + default: + snprintf(str, sizeof(str), "sock_ntop: unknown AF_xxx: %d", + sa->sa_family); + return str; + } +} + + +#ifdef WINNT + +static char *errorCodeToString(int code) +{ + static char s[999]; + char win_err_descr[900]; + DWORD err = FormatMessageA( + FORMAT_MESSAGE_FROM_SYSTEM, + NULL, + code, + LANG_SYSTEM_DEFAULT, + win_err_descr, + sizeof(win_err_descr), + NULL + ); + if( err > 0 ){ + snprintf(s, sizeof(s), "%s (Windows error code %d)", win_err_descr, code); + } else { + snprintf(s, sizeof(s), "error code %d (description not available: FormatMessageA() failed with code %lu)", code, err); + } + return s; +} + +#endif + + +/** + * Reads next PDU. + * @param xcvr + * @param pdu_content + * @param pdu_max_len + * @param pdu_from + * @return Length of the read PDU, or zero on error. + */ +static int ReadPDUFrame(dis_Transceiver * xcvr, char *pdu_content, int pdu_max_len, struct sockaddr *pdu_from) +{ + int size; + +#ifdef HAVE_RECVMSG + struct msghdr msg; + struct iovec vec; +#endif + +#ifdef HAVE_RECVMSG + msg.msg_name = (caddr_t) pdu_from; + msg.msg_namelen = sizeof(struct sockaddr); + msg.msg_iov = &vec; + msg.msg_iovlen = 1; +#ifdef HAVE_MSG_CONTROL + msg.msg_control = (caddr_t) NULL; + msg.msg_controllen = 0; +#endif +#ifdef HAVE_MSG_ACCRIGHTS + msg.msg_accrights = (caddr_t) NULL; + msg.msg_accrightslen = 0; +#endif + vec.iov_base = (caddr_t) pdu_content; + vec.iov_len = pdu_max_len; + + size = recvmsg(xcvr->s, &msg, 0); + + if( size < 0 ){ + if( errno != EAGAIN ) + printf("failed reading socket: %s (%d)\n", strerror(errno), errno); + size = 0; + } + +#else /* WINNT assumed */ + + int pdu_from_len = sizeof(*pdu_from); + size = recvfrom(xcvr->s, pdu_content, pdu_max_len, 0, pdu_from, &pdu_from_len); + + if( size < 0 ){ + printf("recvfrom(): %s\n", errorCodeToString( WSAGetLastError() ) ); + size = 0; + } + +#endif + + return size; +} + + +static int WritePDU(dis_Transceiver * xcvr, char *buffer, int length, struct sockaddr *to) +{ +#ifdef HAVE_RECVMSG + struct msghdr msg; + struct iovec vec; + + msg.msg_namelen = sizeof(struct sockaddr); + msg.msg_iov = &vec; + msg.msg_iovlen = 1; +#ifdef HAVE_MSG_CONTROL + msg.msg_control = (caddr_t) NULL; + msg.msg_controllen = 0; +#endif +#ifdef HAVE_MSG_ACCRIGHTS + msg.msg_accrights = (caddr_t) NULL; + msg.msg_accrightslen = 0; +#endif + vec.iov_base = buffer; + vec.iov_len = length; + + msg.msg_name = (caddr_t) to; + if (sendmsg(xcvr->s, &msg, 0) == -1) { + fprintf(stderr, "%s: relaying PDU to %s: %s\n", + error_prog_name, sockaddrToString(to), strerror(errno)); + return 0; + } else { + return 1; + } +#else + if (sendto(xcvr->s, buffer, length, 0, to, sizeof(struct sockaddr)) == -1) { +#ifdef WINNT + fprintf(stderr, "sendto(): %s\n", errorCodeToString(WSAGetLastError())); +#else + perror("sendto()"); +#endif + return 0; + } else { + return 1; + } +#endif +} + +/** + * Sends the packet received from a client to all the other registered clients. + * If the sender is not already registered, it is added to the list. + * Also checks for stale silent clients and removes them from the list. + * @param xcvr + * @param pdu_content The packet. + * @param pdu_len Length of the packet. + * @param pdu_from Sender of the packet. + */ +static void RelayPDUFrame(dis_Transceiver * xcvr, + char *pdu_content, + int pdu_len, + struct sockaddr *pdu_from) +{ + SwitchClient *c, *new, *stale; + int found = 0; + time_t now; + + now = time(NULL); + c = client_list; + while(c != NULL){ + if( sockaddrEquals(pdu_from, &c->addr) ){ + /* Found sender in registered clients. Renew stale period. */ + found = 1; + c->last_got_pdu = now; + c = c->next; + } else if( now - c->last_got_pdu > STALE_PERIOD ){ + /* Remove stale client from registered clients. */ + stale = c; + if( debug ) + printf("%s: removing stale client %s\n", + error_prog_name, sockaddrToString(&stale->addr)); + if( stale->prev == NULL ) + client_list = stale->next; + else + stale->prev->next = stale->next; + if( stale->next != NULL ) + stale->next->prev = stale->prev; + c = stale->next; + memory_dispose(stale); + } else { + /* Relay frame to client. */ + if( debug ) + printf("%s: relaying frame to %s\n", + error_prog_name, sockaddrToString(&c->addr)); + if( ! WritePDU(xcvr, pdu_content, pdu_len, &c->addr) ) + accountErrorOnClient(c); + c = c->next; + } + } + if ( ! found ) { + if( debug ) + printf("%s: adding client %s\n", error_prog_name, sockaddrToString(pdu_from)); + new = memory_allocate(sizeof(SwitchClient), NULL); + new->prev = NULL; + new->next = client_list; + if( new->next != NULL ) + new->next->prev = new; + memcpy(&new->addr, pdu_from, sizeof(struct sockaddr)); + new->last_got_pdu = time(NULL); + client_list = new; + } +} + + +int +main(int argc, char **argv) +{ + int i, port; + dis_Transceiver *xcvr; + struct sockaddr pdu_from; + int pdu_len; + char pdu_content[2048]; + + error_prog_name = argv[0]; + + /* Set default values: */ + port = 3000; + + for(i = 1; i < argc; i++){ + if( strcmp(argv[i], "--help") == 0 || strcmp(argv[i], "-h") == 0){ + printf("Allowed options:\n"); + printf(" --port N Use port number N (default: 3000)\n"); + printf(" --debug Displays several debugging messages.\n"); + printf(" --help|-h This help.\n"); + exit(0); + } else if( strcmp(argv[i], "--debug") == 0 ){ + debug = 1; + } else if( strcmp(argv[i], "--port") == 0 && i+1 < argc ){ + port = atoi(argv[++i]); + } else { + error_external("unknown option: %s. Try --help for help.", argv[i]); + } + } + + xcvr = dis_openTransceiver(1, NULL, port); + if( xcvr == NULL ) + error_external("failed establishing a connection to the DIS network"); + if( debug ) + printf("%s: running on port %d ...\n", argv[0], port); + + while (1) { + pdu_len = ReadPDUFrame(xcvr, pdu_content, sizeof(pdu_content), &pdu_from); + if( debug && pdu_len > 0 ) + printf("%s: got PDU size %d from %s\n", + error_prog_name, pdu_len, sockaddrToString(&pdu_from)); + + if (pdu_len > 0) { + RelayPDUFrame(xcvr, pdu_content, pdu_len, &pdu_from); + } + } +} diff -Nru acm-5.0/src/dis/server/Makefile acm-6.0+20200416/src/dis/server/Makefile --- acm-5.0/src/dis/server/Makefile 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/dis/server/Makefile 2017-07-11 07:55:23.000000000 +0000 @@ -0,0 +1,28 @@ +# This file generated by make-makefile, do not edit! +# Create Makefile-include.txt instead for your customizations. +CC := gcc +CFLAGS := -Wall -Werror -g -fmax-errors=99 -Wuninitialized -Wmissing-prototypes -Wredundant-decls +LIBS := + +.PHONY: all +all: + make dis_relay.exe + +include Makefile-include.txt + +.PHONY: test +test: dis_relay.exe + ./dis_relay.exe + + +.PHONY: clean +clean: + rm -f *.o *.exe *.stackdump dis_relay + +dis_relay.o: dis_relay.c ../../V/Vlibmath.h ../../util/error.h ../../util/memory.h ../dis/dis.h ../dis/earth.h + $(CC) $(CFLAGS) -c dis_relay.c -o dis_relay.o + +dis_relay.exe: ../../V/Vlibmath.o ../../util/error.o ../../util/memory.o ../../util/units.o ../dis/datum.o ../dis/dis.o ../dis/earth.o ../dis/xdr.o ../dis/xdr_dis.o dis_relay.o + $(CC) $(CFLAGS) -o dis_relay.exe ../../V/Vlibmath.o ../../util/error.o ../../util/memory.o ../../util/units.o ../dis/datum.o ../dis/dis.o ../dis/earth.o ../dis/xdr.o ../dis/xdr_dis.o dis_relay.o $(LIBS) -lm + +# Checksum of the original file: 2783985363 diff -Nru acm-5.0/src/dis/server/Makefile-include.txt acm-6.0+20200416/src/dis/server/Makefile-include.txt --- acm-5.0/src/dis/server/Makefile-include.txt 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/dis/server/Makefile-include.txt 2017-07-11 07:55:33.000000000 +0000 @@ -0,0 +1,15 @@ +# OS specific compilation options: +ifeq ($(OS),Windows_NT) + CC = c:/mingw/bin/gcc + CFLAGS += -mconsole -mwindows + LIBS += -lws2_32 +else + UNAME_S := $(shell uname -s) + ifeq ($(UNAME_S),Linux) + CFLAGS += + LIBS += + else + CFLAGS += + LIBS += + endif +endif \ No newline at end of file diff -Nru acm-5.0/src/dis/test/decoy.c acm-6.0+20200416/src/dis/test/decoy.c --- acm-5.0/src/dis/test/decoy.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/dis/test/decoy.c 2020-04-16 12:05:40.000000000 +0000 @@ -0,0 +1,383 @@ +/* + * DIS/x : An implementation of the IEEE 1278.1 protocol + * + * Copyright (C) 1996, Riley Rainey (rainey@netcom.com) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of either: + * + * a) the GNU Library General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your + * option) any later version. A description of the terms and conditions + * of the GLPL may be found in the "COPYING.LIB" file. + * + * b) the "Artistic License" which comes with this Kit. Information + * about this license may be found in the "Artistic" file. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License or the Artistic License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Information describing how to contact the author can be found in the + * README file. + */ + +/** + * DIS client test program with command line interface only, that creates a DIS + * entity (currently a SA-13 SAM launcher) at the given position and periodically + * sends the corresponding DIS state packets until interrupted (CTRL-C). + * + * For more about the command line options available use the -h option. + * + * @file + */ + +#include +#include +#include +#include +#include +#include +#include + +#include "../../util/error.h" + +/* + * GNU C library includes getopt_long() + */ + +#ifdef __GNU_LIBRARY__ +#include +#endif + +#include "../../V/Vlibmath.h" +#include "../dis/dis.h" +#include "../dis/disx.h" +#include "../../util/units.h" +#include "../../util/timer.h" + +#define FEETtoMETERS(x) ((x) * 0.3048) + +#ifdef __GNU_LIBRARY__ + +/* + * long command line options + */ + +static struct option long_options[] = +{ + { "help", 0, 0, 'h' }, + { "relay", 1, 0, 'R' }, + { "port", 1, 0, 'P' }, + { "force-id", 1, 0, 'f' }, + { "appl-id", 1, 0, 'a' }, + { "site-id", 1, 0, 's' }, + { "entity-id", 1, 0, 'e' }, + { "exercise-id", 1, 0, 'E' }, + { "latitude", 1, 0, 'l' }, + { "longitude", 1, 0, 'L' }, + { "altitude", 1, 0, 'A' }, + { "type", 1, 0, 't' }, +}; + +#endif + + +static void help() +{ + printf( +"Test DIS client application that generates a SA-13 SAM launcher entity and\n" +"keeps sending DIS state packets until interrupted.\n" +"\n" +"Options:\n" +" -R host Name of the relay host. Empty for broadcasting (default).\n" +" -P port UDP port for broadcasting or UDP port of the relay (0-65535,\n" +" default 3000).\n" +" -f force Force: 0=other, 1=friendly (defaut), 2=opposing, 3=neutral.\n" +" -a appl Application ID (0-65535, default 1).\n" +" -s site Site ID (0-65535, default 1).\n" +" -e entity Entity ID (0-65535, default 1).\n" +" -E exercise Exercise ID (0-65535, default 1).\n" +" -l lat Latitude ([-90.0,+90.0] DEG, default 0.0 DEG).\n" +" -L lon Longitude ([-180.0,+180.0] DEG, default 0.0 DEG).\n" +" -A alt Altitude (feet, default 0.0).\n" +" -t type entity type of the form \"9.9.9.9.9.9.9\" (default\n" +" \"1.1.222.4.21.1\" the SA-13 SAM.\n" +" -h This help.\n" +"\n" +"Example:\n" +"\n" +" $ ./decoy -R 192.168.1.33 -a 123 -l 32.87 -L -96.85 -A 2000\n" +"\n" +"generates a SA-13 SAM launcher floating at 2000 ft over the Love Field airport,\n" +"using the specified host as a relay.\n" +); +} + +/** + * Generate a transform matrix to get from geocentric to local NED coordinates + */ +static void GenerateWorldToLocalMatrix(earth_LatLonAlt * w, VMatrix * m) +{ + VPoint gc; + VPoint p; + + VIdentMatrix(m); + VRotate(m, ZRotation, -w->longitude); + VRotate(m, YRotation, w->latitude); + VRotate(m, YRotation, units_DEGtoRAD(90.0)); + earth_LatLonAltToXYZ(w, &gc); + VTransform(&gc, m, &p); + m->m[0][3] = -p.x; + m->m[1][3] = -p.y; + m->m[2][3] = -p.z; +} + +/** + * Convert a double in UNIX format (seconds since 1970) to a DIS timestamp. + * If reference is 0, the time will be marked relative. + * If reference is 1, the time will be marked absolute, i.e. true UTC time. + */ +static dis_timestamp +TimeDoubleToDIS(double time, int reference) +{ + return (dis_timestamp) {0}; // NOT IMPLEMENTED - dis_if ignores DIS timestamps anyway +#ifdef NOT_IMPLEMENTED + unsigned long tmp; + dis_timestamp res; + + tmp = (unsigned long) (fmod(time, 3600.0)); + if (tmp > 2147483647L) /* 2^31 - 1 */ + res.time = 2147483647L; + else + res.time = tmp; + res.type = reference; + + return res; +#endif +} + +static void +transpose(VMatrix * m, VMatrix * r) +{ + + int i, j; + + for (i = 0; i < 4; ++i) + for (j = 0; j < 4; ++j) + r->m[i][j] = m->m[j][i]; +} + +int main(int argc, char **argv) +{ + char *relay = NULL; + int port = 3000; + dis_Transceiver *xcvr; + struct timeval curtime; + int c; + double unix_time_sec; +#ifdef __GNU_LIBRARY__ + int option_index = 0; +#endif + + VMatrix XYZtoNED, NEDtoXYZ, trihedral, ABCtoXYZ; + double orientation[3]; + VPoint velocity = { 0, 0, 0 }; + + dis_pdu estate, em; + dis_entity_state_pdu *esPDU; + disx_ApplicationInfo * app; + earth_LatLonAlt pos; + + error_prog_name = argv[0]; + + memset (&orientation, 0, sizeof(orientation)); + memset (&estate, 0, sizeof(dis_pdu)); + memset (&em, 0, sizeof(dis_pdu)); + memset (&pos, 0, sizeof(pos)); + + /* + * Fill out PDUs + */ + + esPDU = (dis_entity_state_pdu *) &estate; + esPDU->id.sim_id.site_id = 1; + esPDU->id.sim_id.application_id = 1; + esPDU->id.entity_id = 1; + esPDU->force_id = 1; + esPDU->hdr.protocol_version = DISProtocolVersionIEEE1278_95; + esPDU->hdr.exercise_id = 1; + + esPDU->hdr.pdu_type = PDUTypeEntityState; + esPDU->hdr.protocol_family = 1; // must match the PDU type above + + esPDU->hdr.time_stamp = (dis_timestamp) {0}; // will set later + esPDU->hdr.length = 0; + esPDU->hdr.padding = 0; + + /* + * SA-13 SAM launcher + */ + + esPDU->type.kind = 1; + esPDU->type.domain = 1; + esPDU->type.country = 222; + esPDU->type.category = 4; + esPDU->type.subcategory = 21; + esPDU->type.specific = 1; + + /* + * process command line arguments + */ + + while (1) { + +#ifdef __GNU_LIBRARY__ + c = getopt_long ( argc, argv, "hR:P:f:a:s:e:E:l:L:A:t:", + long_options, &option_index ); +#else + c = getopt ( argc, argv, "hR:P:f:a:s:e:E:l:L:A:t:" ); +#endif + + if (c == -1) { + break; + } + + switch (c) { + case 'h': + help(); + return 0; + case 'R': + relay = strdup(optarg); + break; + case 'P': + port = atoi(optarg); + break; + case 'f': + estate.entity_state.force_id = atoi(optarg); + break; + case 'a': + estate.entity_state.id.sim_id.application_id = atoi(optarg); + break; + case 's': + estate.entity_state.id.sim_id.site_id = atoi(optarg); + break; + case 'e': + estate.entity_state.id.entity_id = atoi(optarg); + break; + case 'E': + esPDU->hdr.exercise_id = atoi(optarg); + break; + case 'l': + pos.latitude = units_DEGtoRAD(atof(optarg)); + break; + case 'L': + pos.longitude = units_DEGtoRAD(atof(optarg)); + break; + case 'A': + pos.z = FEETtoMETERS(atof(optarg)); + break; + case 't': + if( ! dis_parseEntityType(optarg, &esPDU->type) ){ + fprintf(stderr, "invalid entity type specification: %s\n", optarg); + return 1; + } + break; + default: + fprintf(stderr, "unknown option %c -- try -h for help\n", c); + return 1; + } + } + + xcvr = dis_openTransceiver(0, relay, port); + if( xcvr == NULL ) + error_external("failed opening socket"); + + app = disx_initializeApplication(xcvr, + 1, + estate.entity_state.id.sim_id.site_id, + estate.entity_state.id.sim_id.application_id ); + if( app == NULL ) + error_internal("failed configuring disx", 0); + + /* + * loop until interrupted ... + */ + + double psi = 0.0; + while (1) { + + gettimeofday( &curtime, NULL ); + + unix_time_sec = (double) curtime.tv_sec + + (double) curtime.tv_usec / 1000000.0; + + esPDU->hdr.time_stamp = TimeDoubleToDIS( unix_time_sec, 1 ); + + /* esPDU->id already set */ + + //esPDU->force_id = DISForceOpposing; + + esPDU->art_parm_count = 0; + + earth_LatLonAltToXYZ( &pos, &esPDU->pos ); + psi += units_DEGtoRAD(5); + VEulerToMatrix(0.0, 0.0, psi, &trihedral); + GenerateWorldToLocalMatrix ( &pos, &XYZtoNED ); + + /* + * Derive ECI [Geocentric] heading, pitch, roll + */ + transpose(&XYZtoNED, &NEDtoXYZ); + /* the trihedral is an "ABCtoNED" transformation */ + VMatrixMultByRank(&trihedral, &NEDtoXYZ, &ABCtoXYZ, 3); + VMatrixToEuler(&ABCtoXYZ, + &orientation[0], + &orientation[1], + &orientation[2]); + + esPDU->orientation.phi = orientation[0]; + esPDU->orientation.theta = orientation[1]; + esPDU->orientation.psi = orientation[2]; + + esPDU->vel.x = velocity.x; + esPDU->vel.y = velocity.y; + esPDU->vel.z = velocity.z; + + esPDU->appearance = ( DISAppearancePaintUniform | + DISAppearanceFirepowerNormal | + DISAppearanceHatchClosed | + DISAppearanceLandLauncherRaised ); + + esPDU->dr_parm.algorithm = DISDRMethodRVW; + + esPDU->dr_parm.linear_acc.x = 0.0f; + esPDU->dr_parm.linear_acc.y = 0.0f; + esPDU->dr_parm.linear_acc.z = 0.0f; + + esPDU->dr_parm.angular_vel.x = 0.0f; + esPDU->dr_parm.angular_vel.y = 0.0f; + esPDU->dr_parm.angular_vel.z = 0.0f; + + esPDU->marking.charset = DISCharSetASCII; + memset(esPDU->marking.marking, 0, sizeof(esPDU->marking.marking)); + strncpy((char *) esPDU->marking.marking, "HI THERE", sizeof(esPDU->marking.marking)); + esPDU->capabilities = 0; + esPDU->art_parm = NULL; + + if ( ! disx_writePDU(app, (dis_pdu *) esPDU) ) { + printf ( "error writing PDU\n" ); + } + else { + printf ( "." ); + fflush ( stdout ); + } + + timer_sleepMilliseconds(2000); + } +} diff -Nru acm-5.0/src/dis/test/disscope.c acm-6.0+20200416/src/dis/test/disscope.c --- acm-5.0/src/dis/test/disscope.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/dis/test/disscope.c 2017-09-06 22:30:14.000000000 +0000 @@ -0,0 +1,318 @@ +/* + * DIS/x : An implementation of the IEEE 1278.1 protocol + * + * Copyright (C) 1996, Riley Rainey (rainey@netcom.com) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of either: + * + * a) the GNU Library General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your + * option) any later version. A description of the terms and conditions + * of the GLPL may be found in the "COPYING.LIB" file. + * + * b) the "Artistic License" which comes with this Kit. Information + * about this license may be found in the "Artistic" file. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License or the Artistic License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Information describing how to contact the author can be found in the + * README file. + */ + +/** + * Test program that continously displays all the incoming DIS packets. + * Currently operates only in broadcast mode on the UDP port 3000. + * + * @file + */ + +#include "../dis/dis.h" +#ifdef _DEBUG +#include +#endif +#ifndef WINNT +#include +#endif +#include + + +static void +PrintEntityID (dis_entity_id *p) +{ + printf ("%d.%d.%d", p->sim_id.site_id, + p->sim_id.application_id, + p->entity_id); +} + + +static void +PrintEmitterSystem (dis_em_system_info *p) +{ + dis_emitter_system *p1 = &p->emitter_system; + char *s; + int i; + + switch (p1->function) { + case DISEmitterFuncUnknown: + s = "Unknown"; + break; + case DISEmitterFuncLandBasedAirDefense: + s = "Land Based Air Defense"; + break; + case DISEmitterFuncBattlefieldAndGroundSurveillance: + s = "Battlefield And Ground Surveillance"; + break; + case DISEmitterFuncNavalSurveillanceAndNavigation: + s = "Naval Surveillance And Navigation"; + break; + case DISEmitterFuncNavalFireControl: + s = "Naval Fire Control"; + break; + case DISEmitterFuncAirborneSurveillance: + s = "Airborne Surveillance"; + break; + case DISEmitterFuncAirborneFireControl: + s = "Airborne Fire Control"; + break; + case DISEmitterFuncSpaceborne: + s = "Spaceborne"; + break; + case DISEmitterFuncATCInstrumentationAndRanging: + s = "ATC Instrumentation And Ranging"; + break; + case DISEmitterFuncWeather: + s = "Weather"; + break; + case DISEmitterFuncMissileGuidance: + s = "Missile Guidance"; + break; + case DISEmitterFuncJamming: + s = "Jamming"; + break; + default: + s = "Unknown*"; + break; + } + printf (" %s (%d, %d) (system data length = %d)\n", s, p1->name, p1->id, + p->sys_data_length); + for (i=0; inum_beams; ++i) { + printf (" beam %d: length %d; targets %d\n", p->beam[i].beam_id, + p->beam[i].beam_data_length, p->beam[i].num_targets); + } +} + +static char * +PDUName (dis_pdu *pdu) +{ + char *s = "*Unknown*"; + switch (pdu->hdr.pdu_type) { + case PDUTypeOther: + s = "Other"; + break; + case PDUTypeEntityState: + s = "Entity State"; + break; + case PDUTypeFire: + s = "Fire"; + break; + case PDUTypeDetonation: + s = "Detonation"; + break; + case PDUTypeCollision: + s = "Collision"; + break; + case PDUTypeServiceRequest: + s = "Service Request"; + break; + case PDUTypeResupplyOffer: + s = "Resupply Offer"; + break; + case PDUTypeResupplyReceived: + s = "Resupply Received"; + break; + case PDUTypeResupplyCancel: + s = "Resupply Cancel"; + break; + case PDUTypeRepairComplete: + s = "Repair Complete"; + break; + case PDUTypeRepairResponse: + s = "Repair Response"; + break; + case PDUTypeCreateEntity: + s = "Create Entity"; + break; + case PDUTypeRemoveEntity: + s = "Remove Entity"; + break; + case PDUTypeStartResume: + s = "Start/Resume"; + break; + case PDUTypeStopFreeze: + s = "Stop/Freeze"; + break; + case PDUTypeAcknowledge: + s = "Acknowledge"; + break; + case PDUTypeActionRequest: + s = "Action Request"; + break; + case PDUTypeActionResponse: + s = "Action Response"; + break; + case PDUTypeDataQuery: + s = "Data Query"; + break; + case PDUTypeSetData: + s = "Set Data"; + break; + case PDUTypeData: + s = "Data"; + break; + case PDUTypeEventReport: + s = "Event Report"; + break; + case PDUTypeComment: + s = "Message"; + break; + case PDUTypeEmission: + s = "EM Emission"; + break; + case PDUTypeDesignator: + s = "Designator"; + break; + case PDUTypeTransmitter: + s = "Transmitter"; + break; + case PDUTypeSignal: + s = "Signal"; + break; + case PDUTypeReceiver: + s = "Receiver"; + break; + case PDUTypeTransferControl: + s = "Transfer Control"; + break; + } + return s; +} + +int main(int argc, char **argv) +{ + dis_Transceiver *xcvr; + dis_pdu pdu; + struct timeval tm; + int i, count; +#ifdef WINNT + WORD wVersionRequested; + WSADATA wsaData; + int err; + wVersionRequested = MAKEWORD(1, 1); + + err = WSAStartup(wVersionRequested, &wsaData); + + if (err != 0) { + fprintf (stderr, "Windows Sockets initialization failed.\n"); + exit (2); + } +#endif + + xcvr = dis_openTransceiver(0, NULL, 3000); + + printf ("%d broadcast interface(s) detected\n", xcvr->num_dest); + + count = 0; + while (1) { + if( ! dis_readPDU (xcvr, &pdu) ) + continue; + printf ("\npacket; type %d -- \"%s\" (%d bytes)\n", + pdu.hdr.pdu_type, PDUName(&pdu), pdu.hdr.length); + printf (" Version %d\n", pdu.hdr.protocol_version); + printf (" Family %d\n", pdu.hdr.protocol_family); + printf (" Exercise id %d\n", pdu.hdr.exercise_id); + dis_timestampToTimeval (&pdu.hdr.time_stamp, &tm); + printf (" Time stamp %ld.%ld\n", tm.tv_sec, + tm.tv_usec / 1000); + switch (pdu.hdr.pdu_type) { + case PDUTypeEntityState: + printf (" Entity (sim.app.eid) : %d/%d/%d\n", + pdu.entity_state.id.sim_id.site_id, + pdu.entity_state.id.sim_id.application_id, + pdu.entity_state.id.entity_id); + printf (" Entity type: %s\n", dis_entityTypeToString(&pdu.entity_state.type)); + printf (" Geocentric Position (meters) : %.1f, %.1f, %.1f\n", + pdu.entity_state.pos.x, + pdu.entity_state.pos.y, + pdu.entity_state.pos.z); + printf (" Geocentric Velocity (meters/sec) : %.1f, %.1f, %.1f\n", + pdu.entity_state.vel.x, + pdu.entity_state.vel.y, + pdu.entity_state.vel.z); + printf (" Articulation parameters: %d\n", + pdu.entity_state.art_parm_count); + printf ("\n"); + break; + case PDUTypeDetonation: + printf (" Firing Entity (sim.app.eid) : "); + PrintEntityID (&pdu.detonation.firing_id); + printf ("\n Target Entity (sim.app.eid) : "); + PrintEntityID (&pdu.detonation.target_id); + printf ("\n Munition Entity (sim.app.eid) : "); + PrintEntityID (&pdu.detonation.munition_id); + printf ("\n\n"); + break; + case PDUTypeEmission: + printf (" Emitting Entity (sim.app.eid) : "); + PrintEntityID (&pdu.em_emission.emitter_id); + printf ("\n State Update Indicator : %d", + pdu.em_emission.state_update); + printf ("\n Number of Systems : %d\n", + pdu.em_emission.num_systems); + for (i=0; i -#include -#include -#include -#ifndef WIN32 -#include -#endif -#include - -#include -#include -#include - -#ifdef WIN32 -extern DISxApplicationInfo *WinACMDISxInitializeApplication(int, int, int); -extern int WinACMDISReadPDU (DISxApplicationInfo *, dis_pdu*); -extern int WinACMDISWritePDU (DISxApplicationInfo *, dis_pdu*); -#endif - -int acknowledgePDU (dis_acknowledge_pdu *pdu); -int transferControlPDU (dis_transfer_control_pdu *pdu); -int setDataPDU (dis_set_data_pdu *pdu); -int startPDU (dis_start_pdu *); -int stopPDU (dis_stop_pdu *); -static int dis_initializeEMInfo ( Entity_t *e ); - -#define DEFAULT_LOCATION_THRESHOLD 1.0 -#define DEFAULT_ORIENTATION_THRESHOLD (3.0 * M_PI / 180.0) - -#define SEND_TIMEOUT_SECONDS 4.8 -#define RECV_TIMEOUT_SECONDS 12.0 - -static dis_EntityEnterCb entityEnterCb = NULL; -static dis_DetonationCb detonationCb = NULL; - -static double locationThreshold = DEFAULT_LOCATION_THRESHOLD; -static double orientationThreshold = DEFAULT_ORIENTATION_THRESHOLD; - -static int exercise; -static int site; -static int application; - -static OutstandingRequestInfo_t *request_chain_head = 0; -static OutstandingRequestInfo_t *request_chain_tail = 0; - -static int network_enabled = 1; - -TransferControlRequestCallback transferControlRequestCallback = 0; - -void -dis_setTransferControlRequestCallback ( TransferControlRequestCallback p ) -{ - transferControlRequestCallback = p; -} - -static OutstandingRequestInfo_t * -addRequest( dis_request_id request_id ) -{ - OutstandingRequestInfo_t *p = malloc (sizeof(OutstandingRequestInfo_t)); - - if (p) { - memset (p, 0, sizeof(OutstandingRequestInfo_t)); - p->request_id = request_id; - - p->next = NULL; - p->prev = request_chain_tail; - if ( request_chain_tail ) { - p->next = p; - } - if (request_chain_head == NULL) { - request_chain_head = p; - } - request_chain_tail = p; - } - - return p; -} - -/* - * Remove the specified request tracking structure from the - * request tracking list. - */ - -static void -removeRequest(OutstandingRequestInfo_t *pItem) -{ - OutstandingRequestInfo_t *p = request_chain_head; - - /* - * The request list is a mundane doubly linked list. - */ - - if (pItem) { - if (pItem->prev == NULL) { - request_chain_head = p->next; - } - else { - pItem->prev->next = p->next; - } - - if (pItem->next == NULL) { - request_chain_tail = p->prev; - } - else { - pItem->next->prev = p->prev; - } - - free ( pItem ); - } -} - -static OutstandingRequestInfo_t * -findRequestByRequestID ( dis_request_id request_id ) -{ - OutstandingRequestInfo_t *p = request_chain_head; - - while ( p ) { - if (p->request_id == request_id) { - break; - } - p = p->next; - } - - return p; -} - -/* - * We must limit our PDU transmission rate on lower bandwidth - * connections. - */ - -static double bandwidth_bps = 0.0; /* 0.0 turns off limiting */ - -static double theTime; -static int absoluteTime = 0; - -static DISxApplicationInfo *app; - -DISxApplicationInfo * -dis_getApplicationInfo(void) -{ - return app; -} - -extern int killPlayer(craft * c); - -int dis_shouldTransmitPDUs ( Entity_t *e ); - -static Entity_t *entities; -static int entity_top = -1; - -int dis_isLocalEntity (const dis_entity_id *id); -Entity_t * -dis_getEntityTable(void) -{ - return entities; -} - -long -dis_getEntityTop(void) -{ - return entity_top; -} - -void -dis_enableNetwork(int state) -{ - network_enabled = state; -} - -/* - * These coordinate system conversion routines don't do very much today, - * but, eventually, we must support a spheroid world (WGS84 standard). - */ - -void -ACMtoDISWorld(VPoint * in, dis_world_coordinates * out) -{ - out->x = (in->x); - out->y = (in->y); - out->z = (in->z); -} - -void -DIStoACMWorld(dis_world_coordinates * in, VPoint * out) -{ - out->x = (in->x); - out->y = (in->y); - out->z = (in->z); -} - -void -ACMtoDISVelocity(VPoint * in, dis_float_vector * out) -{ - out->x = (float) FEETtoMETERS(in->x); - out->y = (float) FEETtoMETERS(in->y); - out->z = (float) FEETtoMETERS(in->z); -} - -void -DIStoACMVelocity(dis_float_vector * in, VPoint * out) -{ - out->x = METERStoFEET(in->x); - out->y = METERStoFEET(in->y); - out->z = METERStoFEET(in->z); -} - -/* - * Generate a transform matrix to get from geocentric to local NED coordinates - */ - -void -GenerateWorldToLocalMatrix(WorldCoordinates * w, VMatrix * m) -{ - dis_world_coordinates gc; - VPoint p; - - VIdentMatrix(m); - VRotate(m, ZRotation, -w->longitude); - VRotate(m, YRotation, -w->latitude); - VRotate(m, YRotation, -DEGtoRAD(90.0)); - DISWorldCoordinatesToGeocentric(w, &gc); - VTransform((VPoint *) & gc, m, &p); - m->m[0][3] = -p.x; - m->m[1][3] = -p.y; - m->m[2][3] = -p.z; -} - -/* - * f i n d E n t i t y - * - * Find the entity with Dis id id in the local entities table - * and return its index in the table. - * - * The id (index) is returned on success, -1 is returned on failure. - */ - -static int -findEntity(const dis_entity_id * id) -{ - int i; - Entity_t *p = entities; - - for (i = 0; i <= entity_top; i++) { - if (p->local != -1 && - p->entityId.entity_id == id->entity_id && - p->entityId.sim_id.application_id == id->sim_id.application_id && - p->entityId.sim_id.site_id == id->sim_id.site_id) { - return i; - } - ++p; - } - - return -1; -} - -/* - * f i n d L o c a l E n t i t y - * - * Find the local entity with Dis id id in the local entities table - * and return its index in the table. - * - * The id (index) is returned on success, -1 is returned on failure. - */ - -static int -findLocalEntity( const dis_entity_id * id ) -{ - int i; - Entity_t *p = entities; - - for (i = 0; i <= entity_top; i++) { - if (p->local == 1 && - p->entityId.entity_id == id->entity_id && - p->entityId.sim_id.application_id == id->sim_id.application_id && - p->entityId.sim_id.site_id == id->sim_id.site_id) { - return i; - } - ++p; - } - - return -1; -} - -/* - * d i s _ s e t B a n d w i d t h - * - * Set and estimate of the available network bandwidth - * in bits per second. This value is used to limit entity - * state transmissions in an effort to keep UDP traffic - * as close to real-time as possible. - */ - -void -dis_setBandwidth(double bps) -{ - bandwidth_bps = bps; -} - -/* - * d i s _ i n i t - * - * Initialize the DIS library. - * The broadcast device used is specified with device (e.g. "le0" on a Sun). - * The port for receiving DIS packets is specified with port. - * (The port number is currently hardwired to 3000.) - * The DIS exercise number, site number and application number are specified - * by the corresponding arguments. - * (The application number is currently hardwired to a part of the local - * hostid. This will ensure uniqe application numbers on a local network.) - * User callbacks for entity enter, entity exit, fire and detonation are - * specified by the last arguments. NULL callbacks may be used for fire - * and detonation. - * - * Zero is returned on success. - */ - -int -dis_init(int xexercise, int xsite, int xapplication, - dis_EntityEnterCb xentityEnterCb, - dis_DetonationCb xdetonationCb) -{ - int i; - dis_simulation_addr addr; - - entityEnterCb = xentityEnterCb; - detonationCb = xdetonationCb; - - exercise = xexercise; - -#ifdef WIN32 -#define DISxReadPDU WinACMDISReadPDU -#define DISxWritePDU WinACMDISWritePDU - app = WinACMDISxInitializeApplication(xexercise, - xsite, xapplication); - if (app == NULL) { - return -1; - } -#else - app = DISxInitializeApplication(xexercise, xsite, xapplication); - if (app == NULL) { - return -1; - } -#endif - -#ifdef USE_CONTROL_REQUEST - DISxSetPDUProtocolFamily ( PDUTypeExperimentalRequestControl, - PDUFamilySimulationManagement ); - DISxSetPDUProtocolFamily ( PDUTypeExperimentalGrantControl, - PDUFamilySimulationManagement ); -#endif - -/* - * Get the actual simulation address assigned to us. - */ - - DISxGetSimulationAddress(app, &addr); - site = addr.site_id; - application = addr.application_id; - -/* - * Allocate storage for the entity table and initialize it. - */ - - entities = (Entity_t *) calloc(MAX_ENTITIES, sizeof(Entity_t)); - for (i = 0; i < MAX_ENTITIES; i++) { - entities[i].local = -1; - } - - return 0; -} - -/* - * d i s _ c l o s e - * - * Close down the DIS library. - * - * Zero is returned on success. - */ - -int -dis_close(void) -{ - if (entities) { - free (entities); - } - return 0; -} - -/* - * d i s _ s e t D R T h r e s h o l d s - * - * Set the dead reckoning thresholds for location and orientation. - * The values shall be given in meters and radians (psi, theta, phi). - * - * Zero is returned on success. - */ - -int -dis_setDRThresholds(double location, double orientation) -{ - locationThreshold = location; - orientationThreshold = orientation; - - return 0; -} - -static const double timeFactor = 596523.235556; /* 2^31/3600 bits per second */ - -/* - * t i m e D I S T o D o u b l e - * - * Convert a DIS timestamp to a double in UNIX format (seconds since 1970). - * - * If the timestamp _and_ the local time both are absolute times, - * the timestamp is used for the part of hour. The local time 'theTime' - * is used to get the hour part. The returned value will be - * the closest possible to 'theTime'. - * - * If either the timestamp or the local time are _not_ absolute, - * the local time is returned. This could be improved... - */ - -#ifdef WIN32 -#define rint(x) (double)( (int)(x) ) -#endif - -static double -timeDISToDouble(dis_timestamp disTime) -{ - double seconds; /* seconds into the current hour */ - double myseconds; /* ditto for 'theTime' */ - double diffseconds; - double myhour; /* hour part of 'theTime' */ - - /* if either time is not absolute, return the local time */ - if (disTime.type == 0 || absoluteTime == 0) - return theTime; - - seconds = disTime.time / timeFactor; - myseconds = fmod(theTime, 3600.0); - myhour = rint((theTime - myseconds) / 3600.0); - - diffseconds = myseconds - seconds; - -#ifdef DIS_DEBUG_TIME - printf("time diff %f s\n", diffseconds); -#endif - if (diffseconds > 1800.0) - return 3600.0 * (myhour + 1) + seconds; - else if (diffseconds < -1800.0) - return 3600.0 * (myhour - 1) + seconds; - else - return 3600.0 * myhour + seconds; -} - -/* - * t i m e D o u b l e T o D I S - * - * Convert a double in UNIX format (seconds since 1970) to a DIS timestamp. - * If reference is 0, the time will be marked relative. - * If reference is 1, the time will be marked absolute, i.e. true UTC time. - */ - -static dis_timestamp -timeDoubleToDIS(double time, int reference) -{ - unsigned long tmp; - dis_timestamp res; - - tmp = (unsigned long) (fmod(time, 3600.0) * timeFactor); - if (tmp > 2147483647L) /* 2^31 - 1 */ - res.time = 2147483647L; - else - res.time = tmp; - res.type = reference; - - return res; -} - -/* - * d i s _ s e t T i m e - * - * Set the current time in the DIS library as a relative time. - * - * Zero is returned on success. - */ - -int -dis_setTime(double time) -{ - theTime = time; - absoluteTime = 0; - - return 0; -} - -/* - * d i s _ s e t T i m e A b s o l u t e - * - * Set the current time in the DIS library using the system time, - * and mark the time as absolute, i.e. true UTC time. - * This will improve the dead reckoning performance on networks - * with significant delays between players _iff_ this host really - * have true UTC time (and others declaring true time also really - * have it). - * - * Zero is returned on success. - */ - -int -dis_setTimeAbsolute(void) -{ - struct timeval tv; - - gettimeofday(&tv, NULL); - theTime = tv.tv_sec + tv.tv_usec / 1000000.0; - absoluteTime = 1; - - return 0; -} - -/* - * g e t E n t i t y S t a t e D a t a - * - * Read in the entity state data from the entity state PDU es - * and write it to the local entity with id (index) eid. - */ - -static void -getEntityStateData(int eid, dis_entity_state_pdu * es) -{ - - entities[eid].lastTime = timeDISToDouble(es->hdr.time_stamp); - entities[eid].lastLocation[0] = es->pos.x; - entities[eid].lastLocation[1] = es->pos.y; - entities[eid].lastLocation[2] = es->pos.z; - entities[eid].lastVelocity[0] = es->vel.x; - entities[eid].lastVelocity[1] = es->vel.y; - entities[eid].lastVelocity[2] = es->vel.z; - entities[eid].lastOrientation[0] = es->orientation.psi; - entities[eid].lastOrientation[1] = es->orientation.theta; - entities[eid].lastOrientation[2] = es->orientation.phi; - entities[eid].lastLinearAcc[0] = es->dr_parm.linear_acc.x; - entities[eid].lastLinearAcc[1] = es->dr_parm.linear_acc.y; - entities[eid].lastLinearAcc[2] = es->dr_parm.linear_acc.z; - entities[eid].lastAngularVel[0] = es->dr_parm.angular_vel.x; - entities[eid].lastAngularVel[1] = es->dr_parm.angular_vel.y; - entities[eid].lastAngularVel[2] = es->dr_parm.angular_vel.z; - - if (es->marking.charset == DISCharSetASCII) - strcpy(entities[eid].markings, es->marking.marking); - else - entities[eid].markings[0] = '\0'; - - DISProcessNewDRParameters(es, &entities[eid].dr); -} - -/* - * e n t i t y E n t e r - * - * Process the entity state PDU esPDU for a new (currently unknown) - * entity. - * - * Zero is returned on success. - */ - -static int -entityEnter(dis_entity_state_pdu * esPDU) -{ - int eid; - craft *c = NULL; - - for (eid = 0; eid < MAX_ENTITIES; eid++) { - if (entities[eid].local == -1) { - break; - } - } - if (eid >= MAX_ENTITIES) { - return -1; - } - if (eid > entity_top) { - entity_top = eid; - } - entities[eid].local = 0; - entities[eid].state = DIS_ENTITY_STATE_SIMULATING; - entities[eid].pending_state = DIS_ENTITY_STATE_NONE; - entities[eid].emit_while_frozen = 0; - entities[eid].forceId = esPDU->force_id; - entities[eid].entityId = esPDU->id; - entities[eid].entityType = esPDU->type; - entities[eid].altEntityType = esPDU->alt_type; - entities[eid].em = (EntityEM_t *) NULL; - - /* - * We only care about setting the dead reckoning thresholds - * so that we can assume comtrol of an entity. - */ - - DISSetDRThresholds(&entities[eid].dr, SEND_TIMEOUT_SECONDS, - locationThreshold, orientationThreshold); - - getEntityStateData(eid, esPDU); - - /* - * Pass entity information to the main ACM code. Based on the DIS - * entity type, it will determine if this is worth tracking. - */ - - (entityEnterCb) ( eid, &esPDU->type, esPDU->force_id, &c ); - - if (c) { - /* ACM says it's worth tracking */ - entities[eid].c = c; - /* printf("Adding entity type %d\n",c->type); */ -#ifdef DIS_DEBUG - printf ("adding entity %d; entity top %d\n", eid, entity_top); -#endif - } - else { - /* must not be an entity we care about ... */ - entities[eid].local = -1; - if (eid == entity_top) { - entity_top--; - } - return -1; - } - - return eid; -} - -/* - * e n t i t y E x i t - * - * Remove the entity with id (index) eid from the local table. - */ - -static void -entityExit(int eid) -{ - craft *c; - -#ifdef DIS_DEBUG - printf("entityExit (%d)\n", eid); -#endif - - c = entities[eid].c; - if (c != NULL && c->type == CT_DIS_PLANE) { -#ifdef DIS_DEBUG - printf("killing ptbl player index %d in entityExit\n", c->pIndex); -#endif - killPlayer(c); - } - entities[eid].local = -1; - if (eid == entity_top) { - entity_top--; - } -} - -/* - * e n t i t y S t a t e P D U - * - * Process an incoming entity state PDU. - * - * Zero is returned on success. - */ - -static int -entityStatePDU(dis_entity_state_pdu * esPDU) -{ - int eid; - - eid = findEntity(&esPDU->id); - - if ((esPDU->appearance & DISAppearanceDamageDestroyed)) { - /* deactivated or destroyed entity. if we know about it, exit it */ -#ifdef DIS_DEBUG - printf ("entity %d marked as destroyed.\n"); -#endif - if (eid >= 0) { - entityExit(eid); - } - return 0; - } - else { - /* normal entity state PDU. if we know about it, update data, - otherwise enter it */ - if (eid >= 0) { - getEntityStateData(eid, esPDU); - return 0; - } - else { - eid = entityEnter(esPDU); - if (eid >= 0) { - return 0; - } - else - return -1; - } - } -} - -/* - * f i r e P D U - * - * Process an incoming fire PDU. - * - * Zero is returned on success. - */ - - /* - * These munition types are renderable with ACM's cannon simulation - * code. - */ - -static dis_entity_type cannon_types[] = -{ - {2, 2, 225, 2, 1, 0, 0}, - {2, 2, 225, 2, 2, 0, 0}, - {2, 2, 225, 2, 3, 0, 0}, - {2, 2, 225, 2, 4, 0, 0}, - {2, 2, 222, 2, 1, 0, 0}, - {0, 0, 0, 0, 0, 0, 0} -}; - -static int -firePDU(dis_fire_pdu * fPDU) -{ - int i, eid; - craft *m; - dis_entity_type *dp; - - for (dp = cannon_types; dp->kind != 0; ++dp) { - if (fPDU->burst.munition.kind == dp->kind && - fPDU->burst.munition.domain == dp->domain && - fPDU->burst.munition.country == dp->country && - fPDU->burst.munition.category == dp->category && - fPDU->burst.munition.subcategory == dp->subcategory) { - break; - } - } - -/* - * Not one of the ones that we model? Then do nothing. - */ - - if (dp->kind == 0) { - return 0; - } -/* - * Allocate a projectile record - */ - - for ((i = 0, m = mtbl); i < MAXPROJECTILES; (++i, ++m)) { - if (m->type == CT_FREE) { - m->type = CT_DIS_CANNON; - break; - } - } - if (i == MAXPROJECTILES) { - return -1; - } -/* - * Fill out the projectile record - */ - - eid = findEntity(&fPDU->firing_id); - if (eid >= 0) { - m->owner = entities[eid].c->pIndex; - } - else { - m->owner = -1; - } - m->createTime = curTime; - m->curRoll = 0.0; - m->curPitch = 0.0; - m->curHeading = 0.0; - -/* - * Determine the initial position. - */ - - DIStoACMVelocity((dis_float_vector *) &fPDU->vel, &m->Cg); - DIStoACMWorld(&fPDU->pos, &m->Sg); - - m->prevSg = m->Sg; - m->rounds = fPDU->burst.quantity; - m->tracerMod = 10 /*TRACER_MOD */ ; - m->tracerVal = 0; - m->offset = 0.0; - m->interval = deltaT; - m->cinfo = lookupCraft("m61a1 cannon"); - - return 0; -} - -/* - * d e t o n a t i o n P D U - * - * Process an incoming detonation PDU. - * - * Zero is returned on success. - */ - -static int -detonationPDU(dis_detonation_pdu * dPDU) -{ - int firingEid, targetEid, eid, ftype; - double time, worldLocation[3], entityLocation[3]; - craft *c; - - if (detonationCb == NULL) { - eid = findEntity(&dPDU->munition_id); - if (eid >= 0) { - entities[eid].local = -1; - if (eid == entity_top) { - entity_top--; - } - } - return 0; - } - firingEid = findEntity(&dPDU->firing_id); - if (firingEid < 0) - return -1; - targetEid = findEntity(&dPDU->target_id); - if (targetEid < 0) - return -2; - - /* the ftype field isn't relly used anymore */ - - if (dPDU->burst.munition.category == 2) /* Ballistic */ - ftype = DIS_FIRE_M61A1; - else - ftype = DIS_FIRE_AIM9M; - - time = timeDISToDouble(dPDU->hdr.time_stamp); - - worldLocation[0] = dPDU->pos.x; - worldLocation[1] = dPDU->pos.y; - worldLocation[2] = dPDU->pos.z; - - entityLocation[0] = dPDU->loc.x; - entityLocation[1] = dPDU->loc.y; - entityLocation[2] = dPDU->loc.z; - - eid = findEntity(&dPDU->munition_id); - c = (eid < 0) ? NULL : entities[eid].c; - - (detonationCb) (ftype, firingEid, targetEid, time, worldLocation, - entityLocation, c, dPDU); - - if (eid >= 0) { - entities[eid].local = -1; - if (eid == entity_top) { - entity_top--; - } - } - return 0; -} - -/* - * e m i s s i o n P D U - * - * Process an incoming EM emission PDU. - * - * Zero is returned on success. - */ - -static int -emissionPDU(dis_em_emission_pdu * pdu) -{ - Entity_t *e; - int emitterEid; - - - /* printf("Emission PDU received! "); */ - emitterEid = findEntity(&pdu->emitter_id); - if (emitterEid < 0) { - /* printf(" with wierd emitterEid\n"); */ - return -1; - } - else { - e = &entities[emitterEid]; - /* printf(" from entity %d\n", emitterEid); */ - } - -/* - * First emission received? - */ - - if (e->em == (EntityEM_t *) NULL) { - - dis_initializeEMInfo ( e ); - - } - -/* - * Not the first emission. Free the old PDU variable fields and insert - * the new one. - */ - - else { - DISFreePDUComponents((dis_pdu *) & e->em->em); - } - e->em->em = *pdu; - e->em->lastTime = theTime; - return 0; -} - -/* - * d i s _ r e c e i v e - * - * Process all available incoming PDU's from the network. - * User callbacks will be called for entering entities, - * exiting entities, firing entities and detonations. - * - * Zero is returned on success. - */ - -int -dis_receive(void) -{ - int status, err, free_needed; - dis_pdu pdu; - int i; - - memset(&pdu,0,sizeof(dis_pdu)); - if (network_enabled == 0) { - return 0; - } - - err = 0; - while ((status = DISxReadPDU(app, &pdu)) == 0) { - - free_needed = 1; - - /* ignore other exercises */ - if (pdu.hdr.exercise_id != exercise) - goto free_pdu; - - switch (pdu.hdr.pdu_type) { - case PDUTypeEntityState: - /* don't read our own broadcasts */ - if (dis_isLocalEntity(&pdu.entity_state.id)) - goto free_pdu; - - err = entityStatePDU(&pdu.entity_state); - break; - - case PDUTypeFire: - /* don't read our own broadcasts */ - if (dis_isLocalEntity(&pdu.detonation.firing_id)) - goto free_pdu; - - err = firePDU(&pdu.fire); - break; - - case PDUTypeDetonation: - /* don't read our own broadcasts */ - if (dis_isLocalEntity(&pdu.detonation.firing_id)) - goto free_pdu; - - err = detonationPDU(&pdu.detonation); - break; - - case PDUTypeEmission: - /* don't read our own broadcasts */ - if (dis_isLocalEntity(&pdu.em_emission.emitter_id)) - goto free_pdu; - err = emissionPDU(&pdu.em_emission); - free_needed = 0; - break; - - case PDUTypeSetData: - /* don't read our own broadcasts */ - if (dis_isLocalEntity(&pdu.set_data.orig_id)) - goto free_pdu; - err = setDataPDU( &pdu.set_data ); - free_needed = 0; - break; - - case PDUTypeStopFreeze: - /* don't read our own broadcasts */ - if (dis_isLocalEntity(&pdu.stop.orig_id)) - goto free_pdu; - err = stopPDU( &pdu.stop ); - free_needed = 0; - break; - - case PDUTypeStartResume: - /* don't read our own broadcasts */ - if (dis_isLocalEntity(&pdu.start.orig_id)) - goto free_pdu; - err = startPDU( &pdu.start ); - free_needed = 0; - break; - - case PDUTypeTransferControl: - /* don't read our own broadcasts */ - if (dis_isLocalEntity(&pdu.transfer_control.orig_id)) - goto free_pdu; - err = transferControlPDU( &pdu.transfer_control ); - free_needed = 0; - break; - - case PDUTypeAcknowledge: - /* don't read our own broadcasts */ - if (dis_isLocalEntity(&pdu.acknowledge.orig_id)) - goto free_pdu; - err = acknowledgePDU( &pdu.acknowledge ); - free_needed = 0; - break; - - default: - fprintf(stderr, - "dis_receive: Ignoring PDU type %d\n", pdu.hdr.pdu_type); - err = 0; - break; - } - -/* - * Free any dynamically allocated variable components that are part of this - * PDU. - */ - - free_pdu: - if (free_needed) { - DISFreePDUComponents(&pdu); - } - - } /* while (... DISxReadPDU ...) */ - -/* - * check for timeouts on remote entities and look for pending state changes - */ - - for (i = 0; i <= entity_top; i++) { - Entity_t *e = &entities[i]; - if (e->local == 0 - && theTime - e->lastTime > RECV_TIMEOUT_SECONDS) { -#ifdef DIS_DEBUG - printf ("entity state PDU timeout: index %d\n", i); -#endif - entityExit(i); - } - - if ( e->pending_state != DIS_ENTITY_STATE_NONE ) { - if (theTime >= e->pending_time) { - e->state = e->pending_state; - e->pending_state = DIS_ENTITY_STATE_NONE; - } - } - } - - if (err != 0) { - return -2; - } - else { - return 0; - } -} - -/* - * s e n d E n t i t y S t a t e - * - * Send an entity state PDU for the local entity with id (index) eid. - * - * Zero is returned on success. - */ - -static int -sendEntityState(int eid) -{ - dis_entity_state_pdu pdu, *esPDU = &pdu; - int i; - Entity_t *e = &entities[eid]; - - if (network_enabled == 0) { - return 0; - } - - if (dis_shouldTransmitPDUs ( e ) == 0) { - return 0; - } - - esPDU->hdr.pdu_type = PDUTypeEntityState; - esPDU->hdr.time_stamp = timeDoubleToDIS(theTime, absoluteTime); - esPDU->id = e->entityId; - esPDU->force_id = e->forceId; - esPDU->art_parm_count = 0; - esPDU->type = e->entityType; - esPDU->alt_type = e->altEntityType; - esPDU->pos.x = e->location[0]; - esPDU->pos.y = e->location[1]; - esPDU->pos.z = e->location[2]; - esPDU->vel.x = (float) e->velocity[0]; - esPDU->vel.y = (float) e->velocity[1]; - esPDU->vel.z = (float) e->velocity[2]; - esPDU->orientation.psi = (float) e->orientation[0]; - esPDU->orientation.theta = (float) e->orientation[1]; - esPDU->orientation.phi = (float) e->orientation[2]; - esPDU->appearance = e->appearance; - esPDU->dr_parm.algorithm = DISDRMethodRVW; - esPDU->dr_parm.linear_acc.x = (float) e->linearAcceleration[0]; - esPDU->dr_parm.linear_acc.y = (float) e->linearAcceleration[1]; - esPDU->dr_parm.linear_acc.z = (float) e->linearAcceleration[2]; - esPDU->dr_parm.angular_vel.x = (float) e->angularVelocity[0]; - esPDU->dr_parm.angular_vel.y = (float) e->angularVelocity[1]; - esPDU->dr_parm.angular_vel.z = (float) e->angularVelocity[2]; - esPDU->marking.charset = DISCharSetASCII; - memset(esPDU->marking.marking, 0, MARKINGS_LEN); - strcpy(esPDU->marking.marking, e->markings); - esPDU->capabilities = 0; - esPDU->art_parm = NULL; - - if (DISxWritePDU(app, (dis_pdu *) esPDU) != 0) { - printf ("error writing PDU\n"); - return -2; - } - else { - DISProcessNewDRParameters(esPDU, &entities[eid].dr); - entities[eid].lastTime = theTime; - for (i = 0; i < 3; i++) { - entities[eid].lastLocation[i] = entities[eid].location[i]; - entities[eid].lastVelocity[i] = entities[eid].velocity[i]; - entities[eid].lastLinearAcc[i] = entities[eid].linearAcceleration[i]; - entities[eid].lastOrientation[i] = entities[eid].orientation[i]; - entities[eid].lastAngularVel[i] = entities[eid].angularVelocity[i]; - } - - return 0; - } -} - -/* - * s e t P o s D a t a - * - * Set the position data of the entity with id (index) eid to the given - * values. - */ - -static void -setPosData(int eid, double loc[3], double vel[3], double linAcc[3], - double ori[3], double angVel[3]) -{ - int i; - - for (i = 0; i < 3; i++) { - entities[eid].location[i] = loc[i]; - entities[eid].velocity[i] = vel[i]; - entities[eid].linearAcceleration[i] = linAcc[i]; - entities[eid].orientation[i] = ori[i]; - entities[eid].angularVelocity[i] = angVel[i]; - } -} - -/* - * d i s _ e n t i t y E n t e r - * - * Enter an entity of type etype (DIS_ENTITY_XXX). - * The initial location, velocity, linear acceleration, orientation - * and angular velocity will be set from the corresponding arguments. - * Velocity and acceleration shall be given in world coordinates. - * All parameter units are based on meters, radians and seconds. - * - * The world coordinate system used in DIS is GCC (geocentric cartesian - * coordinates), an earth-centered right-handed Cartesian system with - * the positive X-axis passing through the Prime Meridian at the Equator, - * with the positive Y-axis passing through 90 degrees East longitude - * at the Equator and with the positive Z-axis passing through the - * North Pole. - * - * The body coordinate system used in DIS is centered at the center of - * the entity's bounding volume (excluding articulated parts) and have - * the positive x-axis pointing to the front of the entity, the positive - * y-axis pointing to the right side of the entity and the positive z-axis - * pointing out of the bottom of the entity. - * - * Orientation is given as [psi, theta, phi]. Angular velocity is given - * as [angular velocity around body x-axis, ditto y, ditto z]. - * - * The id to be used for further reference is returned in eid. - * - * Zero is returned on success. - */ - -int -dis_entityEnter(int team, - craft * c, - dis_entity_type * e1, - dis_entity_type * e2, - double loc[3], - double vel[3], - double linAcc[3], - double ori[3], - double angVel[3], - int *neid) -{ - static int eid; - - for (eid = 0; eid < MAX_ENTITIES; eid++) { - if (entities[eid].local < 0) { - break; - } - } - if (eid >= MAX_ENTITIES) { - return -1; - } - if (eid > entity_top) { - entity_top = eid; - } -#ifdef DIS_DEBUG - printf("Allocated eid %d; entity_top %d\n", eid, entity_top); -#endif - - entities[eid].local = 1; - entities[eid].c = c; - entities[eid].state = DIS_ENTITY_STATE_SIMULATING; - entities[eid].pending_state = DIS_ENTITY_STATE_NONE; - entities[eid].emit_while_frozen = 0; - - DISxIssueEntityID(app, &entities[eid].entityId); - - entities[eid].forceId = (team == 1) ? - DISForceFriendly : - DISForceOpposing; - entities[eid].entityType = *e1; - entities[eid].altEntityType = *e2; - - memset(entities[eid].markings, 0, MARKINGS_LEN); - entities[eid].markings[0] = '\0'; - entities[eid].appearance = 0; - setPosData(eid, loc, vel, linAcc, ori, angVel); - - *neid = eid; - -/* - * Allocate EM emission fields (optimized for the fact that we have - * only one system, with one beam, and one potentially tracked target. - */ - - entities[eid].em = - (EntityEM_t *) Vmalloc(sizeof(EntityEM_t)); - entities[eid].em->mode = 0; - entities[eid].em->cur_target = -1; - entities[eid].em->em.hdr.pdu_type = PDUTypeEmission; - entities[eid].em->em.emitter_id = entities[eid].entityId; - - entities[eid].em->s = - (dis_em_system_info *) Vmalloc(sizeof(dis_em_system_info)); - entities[eid].em->b = - (dis_beam_info *) Vmalloc(sizeof(dis_beam_info)); - entities[eid].em->target = - (dis_track_info *) Vmalloc(sizeof(dis_track_info)); - entities[eid].em->em.system = entities[eid].em->s; - entities[eid].em->em.num_systems = 1; - entities[eid].em->em.system[0].num_beams = 0; - - DISSetDRThresholds(&entities[eid].dr, SEND_TIMEOUT_SECONDS, - locationThreshold, orientationThreshold); - - /* let the normal dis code do it */ -#ifdef notdef - if (sendEntityState(eid) < 0) - return -1; - else -#endif - return 0; -} - -void -dis_setEntityMarkings(int eid, char *markings) -{ - strncpy(entities[eid].markings, markings, MARKINGS_LEN); -} - -void -dis_getEntityMarkings(int eid, char *markings, int max) -{ - strncpy(markings, entities[eid].markings, max); -} - -void -dis_setEntityAppearance(int eid, dis_entity_appearance x) -{ - entities[eid].appearance = x; -} - -dis_entity_appearance -dis_getEntityAppearance(int eid) -{ - return entities[eid].appearance; -} - -/* - * d i s _ e n t i t y E x i t - * - * Remove the local entity with id eid from the simulation. - * - * Zero is returned on success. - */ - -int -dis_entityExit(int eid) -{ - -#ifdef DIS_DEBUG - printf("Entity_t exit called: eid %d\n", eid); -#endif - - if (entities[eid].local != 1) - return -1; - else { - entities[eid].appearance = DISAppearanceDamageDestroyed; - sendEntityState(eid); - - if (entities[eid].em) { - free(entities[eid].em->s); - free(entities[eid].em->b); - free(entities[eid].em->target); - free(entities[eid].em); - } - entities[eid].local = -1; - if (eid == entity_top) { - entity_top--; - } - return 0; - } -} - -/* - * d i s _ e n t i t y S t a t e - * - * Update the state information for a local entity. - * The information will be broadcasted on the network - * only if it is necessary to keep the other hosts dead - * reckoning from exceeding the thresholds. - * See dis_entityEnter for information about the arguments. - * - * This procedure also handles the transmission of emission PDU's. - * - * Zero is returned on success. - */ - -int -dis_entityState(int eid, double loc[3], double vel[3], - double linAcc[3], - double ori[3], double angVel[3]) -{ - double delta, min_delta; - int needToSend = 0, needEMPDU = 0, status, i, j; - dis_euler_angles ori_e; - - if (entities[eid].local != 1) - return -1; - - setPosData(eid, loc, vel, linAcc, ori, angVel); - -/* - * EM emission PDU possibly needed ? - */ - - delta = theTime - entities[eid].lastTime; - - if (entities[eid].em && entities[eid].em->mode > 0) { - if (delta > SEND_TIMEOUT_SECONDS) { - needEMPDU = 1; - for (i = 0; i < entities[eid].em->em.num_systems; ++i) { - for (j = 0; j < entities[eid].em->em.system[0].num_beams; ++j) { - entities[eid].em->em.system[i].beam[j].fundamental.beam_sweep_sync += (float) delta; - } - } - entities[eid].em->lastTime = theTime; - entities[eid].em->em.state_update = 0; - } - } - - - ori_e.psi = (float) ori[0]; - ori_e.theta = (float) ori[1]; - ori_e.phi = (float) ori[2]; - - needToSend = DISTestDRThresholds(&entities[eid].dr, delta, - (dis_world_coordinates *) loc, &ori_e); - - /* - * Are we limiting PDU tansmissions? - * - * If so, ensure enough time has passed since - * our last entity state transmission. - */ - - if (bandwidth_bps > 0.0) { - min_delta = 1440.0 * entity_top / bandwidth_bps; - if (delta < min_delta) { - needToSend = 0; - } - } - - if (needToSend != 0) { - sendEntityState(eid); - } - else { - /* no need to send ES PDU */ - } - - if ( needEMPDU && entities[eid].state == DIS_ENTITY_STATE_SIMULATING ) { - /* printf("Sending emissions PDU for eid=%d\n",eid); */ - entities[eid].em->em.hdr.time_stamp = - timeDoubleToDIS(theTime, absoluteTime); - status = DISxWritePDU(app, (dis_pdu *) & entities[eid].em->em); - } - return (needToSend > 0) ? 1 : 0; -} - -/* - * d i s _ g e t E n t i t y S t a t e - * - * Return state information for a remote entity. - * The state information is dead reckoned from the last - * received data on the entity. - * - * Zero is returned on success. - */ - -int -dis_getEntityState(int eid, double loc[3], double vel[3], double ori[3]) -{ - int i; - - if (entities[eid].local < 0) { - return -1; - } - else if (entities[eid].local == 1) { - for (i = 0; i < 3; i++) { - loc[i] = entities[eid].location[i]; - ori[i] = entities[eid].orientation[i]; - } - - return 0; - } - else { - VMatrix orientation; - dis_linear_vel_vector drvel; - - DISComputeDRPosition(&entities[eid].dr, - theTime - entities[eid].lastTime, - (dis_world_coordinates *) & entities[eid].location, - &drvel, - &orientation); - - entities[eid].velocity[0] = drvel.x; - entities[eid].velocity[1] = drvel.y; - entities[eid].velocity[2] = drvel.z; - - matrixToEuler(&orientation, - &entities[eid].orientation[0], - &entities[eid].orientation[1], - &entities[eid].orientation[2]); - - for (i = 0; i < 3; i++) { - loc[i] = entities[eid].location[i]; - vel[i] = entities[eid].velocity[i]; - ori[i] = entities[eid].orientation[i]; - } - - return 0; - } -} - -/* - * d i s _ f i r e - * - * Broadcast information about an entity firing a weapon. - * The type of fire is given by ftype as one of the DIS_FIRE_XXX types. - * The id's of the firing entity and the target entity are given with - * firingEid and targetEid or as DIS_ID_NONE if not known. - * The number of rounds, location of the source of fire, the velocity - * vector of the rounds and the range of the rounds are given with - * the corresponding arguments. - * The id of the event generated is returned in eventId. - * If the fire type is a missile, a missile entity is created and its - * id is returned in missileEid. The user program should generate - * position data for the missile during its lifetime by calling - * dis_entityState(). - * - * Zero is returned on success. - * - * Not yet implemented. - */ - -int -dis_fire(int ftype, int firingEid, int targetEid, int rounds, - double location[3], double velocity[3], double range, - int *eventId, int *missileEid) -{ - /* TODO */ - *eventId = 0; - *missileEid = 0; - - return 0; -} - -static dis_entity_id null_id = -{0, 0, 0}; - -int -dis_fire_cannon(craft * c, VPoint * pos, VPoint * vel, int quantity, int rate) -{ - dis_fire_pdu fire; - int status; - - if (network_enabled == 0) { - return 0; - } - - fire.hdr.pdu_type = PDUTypeFire; - - fire.firing_id = entities[c->disId].entityId; - fire.target_id = null_id; - fire.munition_id = null_id; - - DISxIssueEventID(app, &fire.event); - - fire.fire_mission_index = 0; /* NO_FIRE_MISSION */ - - ACMtoDISWorld(pos, &fire.pos); - fire.burst.munition = cannon_types[1]; - fire.burst.warhead = 0; - fire.burst.fuze = 0; - fire.burst.quantity = quantity; - fire.burst.rate = rate; - - ACMtoDISVelocity(vel, (dis_float_vector *) &fire.vel); - - fire.range = 0.0f; - - fire.hdr.time_stamp = timeDoubleToDIS(theTime, absoluteTime); - - status = DISxWritePDU(app, (dis_pdu *) & fire); - return (status == 0) ? 0 : -1; -} - -/* - * d i s _ d e t o n a t i o n - * - * Broadcast information about a detonation. - * The type of fire is given by ftype as one of the DIS_FIRE_XXX types. - * The id's of the firing entity and the target entity are given with - * firingEid and targetEid or as DIS_ID_NONE if not known. - * The id of the corresponding fire event is given as eventId or as - * DIS_ID_NONE if not known. - * If the detonation is from a missile, the id of the missile is given - * as missileEid or as DIS_ID_NONE. The library will exit the - * missile entity. - * The location of the detonation in world coordinates and in target - * body coordinates are given as worldLocation and entityLocation. - * - * Zero is returned on success. - */ - -int -dis_detonation(dis_entity_type * etype, - int firingEid, int targetEid, int missileEid, - double worldLocation[3], double entityLocation[3], - double vel[3]) -{ - dis_detonation_pdu pdu; - int status; - - if (network_enabled == 0) { - return 0; - } - - pdu.hdr.pdu_type = PDUTypeDetonation; - - if (entities[firingEid].local != 1) { - return -1; - } - if (targetEid != DIS_ID_NONE && entities[targetEid].local == -1) { - return -2; - } - pdu.firing_id = entities[firingEid].entityId; - if (targetEid != DIS_ID_NONE) { - pdu.target_id = entities[targetEid].entityId; - } - else { - pdu.target_id = null_id; - } - -#ifdef DIS_DEBUG - printf("detonation: %d %d %d\n", firingEid, targetEid, missileEid); -#endif - - if (missileEid != DIS_ID_NONE) { - pdu.munition_id = entities[missileEid].entityId; - } - else { - pdu.munition_id = null_id; - } - - DISxIssueEventID(app, &pdu.event); - - pdu.vel.x = (float) vel[0]; - pdu.vel.y = (float) vel[1]; - pdu.vel.z = (float) vel[2]; - - pdu.pos.x = worldLocation[0]; - pdu.pos.y = worldLocation[1]; - pdu.pos.z = worldLocation[2]; - - pdu.burst.munition = *etype; - -/* - * This code will need some extra work ... - */ - - if (pdu.burst.munition.category == 2) { - pdu.burst.warhead = DISWarheadKinetic; - pdu.burst.fuze = DISFuzeContact; - pdu.burst.quantity = 1; - pdu.burst.rate = 0; - pdu.result = DISDetonationResultEntityImpact; - } - else { - pdu.burst.warhead = DISWarheadHEFragment; - pdu.burst.fuze = DISFuzeProximity; - pdu.burst.quantity = 1; - pdu.burst.rate = 0; - pdu.result = DISDetonationResultDetonation; - } - - pdu.loc.x = (float) entityLocation[0]; - pdu.loc.y = (float) entityLocation[1]; - pdu.loc.z = (float) entityLocation[2]; - - pdu.result = 0; - pdu.num_art_parms = 0; - pdu.art_parm = NULL; - - pdu.hdr.time_stamp = timeDoubleToDIS(theTime, absoluteTime); - - status = DISxWritePDU(app, (dis_pdu *) & pdu); - return (status == 0) ? 0 : -1; -} - -/* - * d i s _ i n i t i a l i z e E M I n f o - * - * Initialize EM info data structures. Returns zero on success, -1 on error. - */ - -static int -dis_initializeEMInfo ( Entity_t *e ) -{ - int result = 0; - - if (e->em == (EntityEM_t *) NULL) { - -/* - * Allocate EM emission information structure and initialize it to reflect - * that this is an external entity (mode == -1). - */ - - e->em = (EntityEM_t *) Vmalloc(sizeof(EntityEM_t)); - if (e->em) { - e->em->mode = -1; - e->em->cur_target = -1; - } - else { - result = -1; - } - - } - return result; -} - -/* - * Construct an EM emission PDU that reflects the current state of our - * radar set. - */ - -int -constructEmissionPDU(craft * c, int mode, int update) -{ - dis_em_emission_pdu *em; - dis_em_system_info *s; - dis_beam_info *b; - dis_track_info *target; - - entities[c->disId].em->mode = mode; - em = &entities[c->disId].em->em; - s = entities[c->disId].em->s; - b = entities[c->disId].em->b; - target = entities[c->disId].em->target; - - DISxIssueEventID(app, &em->event); - - em->system = s; - em->state_update = update; - em->num_systems = 1; - - s->location.x = 0.0f; - s->location.y = 0.0f; - s->location.z = 0.0f; - s->emitter_system.name = 0; - s->emitter_system.function = DISEmitterFuncAirborneFireControl; - s->emitter_system.id = 1; - - switch (mode) { - case 0: - s->num_beams = 0; - s->beam = NULL; - break; - -/* - * Three-bar track while scan mode - */ - - case 1: - s->num_beams = 1; - s->beam = b; - b->beam_id = 1; - b->beam_parm_index = 0; - b->beam_function = DISBeamFuncAcquisitionAndTracking; - b->fundamental.freq = 9000.0f; - b->fundamental.erp = 100.0f; - b->fundamental.prf = 18000.0f; - b->fundamental.pulse_width = 1.0f; - b->fundamental.beam_azimuth_center = 0.0f; - b->fundamental.beam_azimuth_sweep = 120.0f; - b->fundamental.beam_elev_center = 0.0f; - b->fundamental.beam_elev_sweep = 120.0f; - b->fundamental.beam_sweep_sync = 0.0f; - b->pad = 0; - b->jamming_mode = 0; - break; - -/* - * Four bar 20 x 30 ACM mode - */ - - case 2: - s->num_beams = 1; - s->beam = b; - b->beam_id = 1; - b->beam_parm_index = 1; - b->beam_function = DISBeamFuncAcquisitionAndTracking; - b->fundamental.freq = 9000.0f; - b->fundamental.erp = 100.0f; - b->fundamental.prf = 18000.0f; - b->fundamental.pulse_width = 1.0f; - b->fundamental.beam_azimuth_center = 0.0f; - b->fundamental.beam_azimuth_sweep = 30.0f; - b->fundamental.beam_elev_center = 0.0f; - b->fundamental.beam_elev_sweep = 20.0f; - b->fundamental.beam_sweep_sync = 0.0f; - b->pad = 0; - b->jamming_mode = 0; - break; - -/* - * Single target track - */ - - case 3: - s->num_beams = 1; - s->beam = b; - b->beam_id = 1; - b->beam_parm_index = 2; - b->beam_function = DISBeamFuncAcquisitionAndTracking; - b->fundamental.freq = 9000.0f; - b->fundamental.erp = 100.0f; - b->fundamental.prf = 18000.0f; - b->fundamental.pulse_width = 1.0f; - b->fundamental.beam_azimuth_center = 0.0f; /* wrong, don't care */ - b->fundamental.beam_azimuth_sweep = 0.0f; - b->fundamental.beam_elev_center = 0.0f; /* wrong, don't care */ - b->fundamental.beam_elev_sweep = 0.0f; - b->fundamental.beam_sweep_sync = 0.0f; - b->pad = 0; - b->jamming_mode = 0; - break; - } - - entities[c->disId].em->cur_target = c->curRadarTarget; - - if (c->curRadarTarget == -1) { - b->tracked_target = NULL; - b->num_targets = 0; - } - else { - b->tracked_target = target; - b->num_targets = 1; - - target->target = - entities[ptbl[c->curRadarTarget].disId].entityId; - target->emitter_id = 1; - target->beam_id = 1; - } - return 0; -} - -/* - * Set local entities current radar mode (modes are 0=off, 1=wide scan) - */ - -int -dis_setRadarMode(craft * c, int mode, int update) -{ - int status; - Entity_t *e = &entities[c->disId]; - - if ( e->em == NULL) { - dis_initializeEMInfo ( e ); - } - - if ( e->em->mode == mode) { - return 0; - } - - if ( e->em->mode == -1 ) { - e->em->s = (dis_em_system_info *) Vmalloc(sizeof(dis_em_system_info)); - e->em->b = (dis_beam_info *) Vmalloc(sizeof(dis_beam_info)); - e->em->target = (dis_track_info *) Vmalloc(sizeof(dis_track_info)); - e->em->em.system = e->em->s; - e->em->em.num_systems = 1; - e->em->em.system[0].num_beams = 0; - } - constructEmissionPDU(c, mode, 1); - entities[c->disId].em->em.hdr.time_stamp = - timeDoubleToDIS(theTime, absoluteTime); - entities[c->disId].em->lastTime = theTime; - if (network_enabled == 0) { - return 0; - } - /* printf("Sending emission PDU from dissetradarmode for c->disId=%d\n",c->disId); */ - status = DISxWritePDU(app, (dis_pdu *) & entities[c->disId].em->em); - return (status == 0) ? 0 : -1; -} - -/* - * Notify the world that our current radar target changed - */ - -int -dis_radarTargetChanged(craft * c) -{ - int status; - - if ( entities[c->disId].em == NULL) { - dis_initializeEMInfo ( &entities[c->disId] ); - } - - if (entities[c->disId].em->cur_target == c->curRadarTarget) { - return 0; - } - constructEmissionPDU(c, entities[c->disId].em->mode, 1); - entities[c->disId].em->em.hdr.time_stamp = - timeDoubleToDIS(theTime, absoluteTime); - entities[c->disId].em->lastTime = theTime; - if (network_enabled == 0) { - return 0; - } - status = DISxWritePDU(app, (dis_pdu *) & entities[c->disId].em->em); - return (status == 0) ? 0 : -1; -} - -/* - * Get the number of beams emitted from this aircraft - */ - -int -dis_getBeamCount(craft * c) -{ - if (entities[c->disId].em && entities[c->disId].em->em.num_systems > 0) { - return entities[c->disId].em->em.system[0].num_beams; - } - return 0; -} - -/* - * Get parameters describing the specified beam - */ - -void -dis_getRadarParameters(craft * c, int j, double *az_center, double *az_width, - double *el_center, double *el_width, double *e) -{ - dis_beam_info *b; - - if ( entities[c->disId].em == NULL) { - dis_initializeEMInfo ( &entities[c->disId] ); - } - - b = &entities[c->disId].em->em.system[0].beam[j]; - - *az_center = b->fundamental.beam_azimuth_center; - *az_width = b->fundamental.beam_azimuth_sweep; - *el_center = b->fundamental.beam_elev_center; - *el_width = b->fundamental.beam_elev_sweep; - *e = b->fundamental.erp; -} - -int -dis_isLocalEntity (const dis_entity_id *id) -{ - int eid = findLocalEntity ( id ); - - return (eid >= 0) ? 1 : 0; -} - -int -transferControlPDU ( dis_transfer_control_pdu *pdu ) -{ - Entity_t *e; - int eid; - dis_acknowledge_pdu reply_pdu; - int status = 0; - int error_return_needed = 0; - - reply_pdu.hdr = pdu->hdr; - reply_pdu.hdr.pdu_type = PDUTypeAcknowledge; - reply_pdu.hdr.time_stamp = timeDoubleToDIS( theTime, absoluteTime ); - - reply_pdu.orig_id = pdu->recv_id; - reply_pdu.recv_id = pdu->orig_id; - reply_pdu.request_id = pdu->request_id; - - /* - * Request applies to one of our entities? - */ - - eid = findLocalEntity( &pdu->target_id ); - if ( eid >= 0 ) { - - e = &entities[eid]; - - if (pdu->recv_id.sim_id.site_id == site && - ( pdu->recv_id.sim_id.application_id == ALL_APPLIC || - pdu->recv_id.sim_id.application_id == application )) { - - reply_pdu.acknowledge_flag = 36; /* per CALSPAN */ - reply_pdu.resp_flag = 1; /* per CALSPAN */ - - switch (pdu->transfer_type) { - - /* - * Someone wants us to take control of an entity - */ - - case DISTransferTypeEntityControllerRequest: - - /* - * the transferControlRequestCallback function is - * reponsible for determining if we can feasibly take - * control of the entity. - */ - - if (transferControlRequestCallback != NULL & - (*transferControlRequestCallback)(e, pdu) == 0) { - - status = DISxWritePDU( app, (dis_pdu *) & reply_pdu ); - status = (status == 0) ? 0 : -1; - - if (status == 0) { - e->local = 1; - } - } - else { - error_return_needed = 1; - } - break; - - /* - * Control of this entity is requested by someone else. - */ - - case DISTransferTypeEntityRequest: - - if (transferControlRequestCallback != NULL && - (*transferControlRequestCallback)(e, pdu) == 0) { - - status = DISxWritePDU( app, (dis_pdu *) & reply_pdu ); - status = (status == 0) ? 0 : -1; - - if (status == 0) { - e->local = 0; - } - } - else { - error_return_needed = 1; - } - break; - } - - } - } - else { - /* - * The target entity was not local to us. Still, the PDU might - * look like it is destined for us. In this case, return an - * error reply. - */ - - if (pdu->recv_id.sim_id.site_id == site && - ( pdu->recv_id.sim_id.application_id == ALL_APPLIC || - pdu->recv_id.sim_id.application_id == application )) { - - error_return_needed = 1; - } - } - - if (error_return_needed) { - - reply_pdu.acknowledge_flag = 36; /* per CALSPAN */ - reply_pdu.resp_flag = 5; /* error state, per CALSPAN */ - - status = DISxWritePDU(app, (dis_pdu *) & reply_pdu); - status = (status == 0) ? 0 : -1; - } - - return status; -} - -int -acknowledgePDU ( dis_acknowledge_pdu *pdu ) -{ - Entity_t *e; - int eid; - OutstandingRequestInfo_t *preq; - - preq = findRequestByRequestID ( pdu->request_id ); - - if ( preq != NULL && - preq->request_type == OUTSTANDING_REQUEST_TRANSFER_CONTROL ) { - - e = preq->e; - - /* - * no longer need to track the request - */ - - removeRequest ( preq ); - - /* - * Were we expecting to be granted control? If not, there is some sort - * of error. - * - * This is a non-standard exchange defined by CALSPAN. We are - * processing a response to a control request. The request was - * originated by us, the response we just received comes from the - * controlling application. - */ - - if ( pdu->acknowledge_flag == 36 ) { - - /* - * response flag set to "1" to indicate a success - * "5" indicates a failure - */ - - switch (pdu->resp_flag) { - case 1: - if (e->controlRequestCallback) { - (e->controlRequestCallback)( (dis_pdu *) pdu, - e->callbackData ); - } - e->local = 1; - e->state = DIS_ENTITY_STATE_SIMULATING; - e->pending_state = DIS_ENTITY_STATE_NONE; - break; - - case 5: - if (e->controlRequestCallback) { - (e->controlRequestCallback)( (dis_pdu *) pdu, - e->callbackData ); - } - break; - - default: - printf( "Unrecognized response flag in Acknowledge PDU: %d\n", - pdu->resp_flag ); - break; - } - - e->controlRequestCallback = NULL; - e->callbackData = NULL; - } - } - - return 0; -} - -int -dis_requestControl (Entity_t *e, - int (*callbackFn)(dis_pdu*, void *), - void *arg) -{ - dis_pdu pdu; - int status; - OutstandingRequestInfo_t *preq; - - memset ( &pdu, 0, sizeof(pdu) ); - - if (e->local == -1 || - e->local == 1) { - return -1; - } - - e->callbackData = arg; - e->controlRequestCallback = callbackFn; - - pdu.hdr.pdu_type = PDUTypeTransferControl; - pdu.hdr.time_stamp = timeDoubleToDIS(theTime, absoluteTime); - - pdu.transfer_control.request_id = DISxIssueRequestID ( app ); - - pdu.transfer_control.orig_id.sim_id.site_id = site; - pdu.transfer_control.orig_id.sim_id.application_id = application; - pdu.transfer_control.orig_id.entity_id = NO_ENTITY; - - pdu.transfer_control.recv_id.sim_id = e->entityId.sim_id; - pdu.transfer_control.recv_id.entity_id = NO_ENTITY; - - pdu.transfer_control.target_id = e->entityId; - - pdu.transfer_control.reliability_service = 1; - pdu.transfer_control.num_record_sets = 0; - pdu.transfer_control.transfer_type = DISTransferTypeEntityRequest; - - /* - * Add tracking information so that we know about this - * outstanding request. - */ - - preq = addRequest ( pdu.transfer_control.request_id ); - if (preq) { - preq->request_type = OUTSTANDING_REQUEST_TRANSFER_CONTROL; - preq->e = e; - /* requests can timeout, but we don't track that, yet */ - preq->timeout_time = theTime + 5.0; - } - - status = DISxWritePDU( app, & pdu ); - return (status == 0) ? 0 : -1; -} - -int -setDataPDU (dis_set_data_pdu *pdu) -{ - Entity_t *e; - int eid; - dis_data_pdu reply_pdu; - unsigned int i; - int status; - - reply_pdu.hdr = pdu->hdr; - reply_pdu.hdr.pdu_type = PDUTypeData; - reply_pdu.hdr.time_stamp = timeDoubleToDIS( theTime, absoluteTime ); - - reply_pdu.orig_id = pdu->recv_id; - reply_pdu.recv_id = pdu->orig_id; - reply_pdu.request_id = pdu->request_id; - - DISInitializeDatumInfo (&reply_pdu.datum_info); - - eid = findEntity(&pdu->recv_id); - if (eid < 0) { - return -1; - } - else { - e = &entities[eid]; - } - - for (i=0; idatum_info.num_fixed_data; ++i) { - switch ( pdu->datum_info.variable_datum[i].datum_id ) { - case DatumOrientationX: - break; - case DatumOrientationY: - break; - case DatumOrientationZ: - break; - - case DatumXVelocity: - break; - case DatumYVelocity: - break; - case DatumZVelocity: - break; - } - } - - for (i=0; idatum_info.num_variable_data; ++i) { - switch ( pdu->datum_info.variable_datum[i].datum_id ) { - case DatumGeocentricCoordinatesX: - break; - case DatumGeocentricCoordinatesY: - break; - case DatumGeocentricCoordinatesZ: - break; - } - } - - /* - * Send reply - */ - - status = DISxWritePDU(app, (dis_pdu *) & reply_pdu); - return (status == 0) ? 0 : -1; -} - -int -stopPDU (dis_stop_pdu *pdu) -{ - Entity_t *e; - int eid; - int status = 0; - int need_reply = 1; - int all_local_entities = 0; - dis_acknowledge_pdu reply_pdu; - struct timeval tv; - double changeTime; - - reply_pdu.hdr = pdu->hdr; - reply_pdu.hdr.pdu_type = PDUTypeAcknowledge; - reply_pdu.hdr.time_stamp = timeDoubleToDIS( theTime, absoluteTime ); - - reply_pdu.orig_id = pdu->recv_id; - reply_pdu.recv_id = pdu->orig_id; - - reply_pdu.request_id = pdu->request_id; - reply_pdu.acknowledge_flag = DISAcknowledgeFlagStop; - reply_pdu.resp_flag = DISRequestStatusComplete; - - if (pdu->recv_id.sim_id.site_id == ALL_SITES) { - all_local_entities = 1; - } - else if (pdu->recv_id.sim_id.site_id == site && - pdu->recv_id.sim_id.application_id == ALL_APPLIC) { - all_local_entities = 1; - } - else if (pdu->recv_id.sim_id.site_id == site && - pdu->recv_id.sim_id.application_id == application && - pdu->recv_id.entity_id == ALL_ENTITIES) { - all_local_entities = 1; - } - - DISTimeToTimeval( &pdu->real_time, &tv ); - changeTime = tv.tv_sec + tv.tv_usec / 1000000.0; - - if ( all_local_entities ) { - int i; - - e = &entities[0]; - for ( i=0; ilocal != 1) { - continue; - } - - if ( changeTime <= theTime ) { - e->state = DIS_ENTITY_STATE_STOPPED; - } - else { - e->pending_state = DIS_ENTITY_STATE_STOPPED; - e->pending_time = changeTime; - } - - if ( pdu->behavior & DISFrozenBehaviorRunClock ) { - } - - if ( pdu->behavior & DISFrozenBehaviorTransmit ) { - e->emit_while_frozen = 1; - } - - if ( pdu->behavior & DISFrozenBehaviorReceive ) { - } - } - } - else { - - eid = findEntity(&pdu->recv_id); - if (eid < 0) { - /* cannot comply, entity not found */ - reply_pdu.orig_id.entity_id = NO_ENTITY; - reply_pdu.resp_flag = DISRequestStatusOther; - } - else { - e = &entities[eid]; - - if (e->local == 1) { - - if ( changeTime <= theTime ) { - e->state = DIS_ENTITY_STATE_STOPPED; - } - else { - e->pending_state = DIS_ENTITY_STATE_STOPPED; - e->pending_time = changeTime; - } - - if ( pdu->behavior & DISFrozenBehaviorRunClock ) { - } - - if ( pdu->behavior & DISFrozenBehaviorTransmit ) { - e->emit_while_frozen = 1; - } - - if ( pdu->behavior & DISFrozenBehaviorReceive ) { - } - } - else { - need_reply = 0; - } - } - } - - /* - * Send reply - */ - if (need_reply) { - status = DISxWritePDU(app, (dis_pdu *) & reply_pdu); - } - return (status == 0) ? 0 : -1; -} - -int -startPDU (dis_start_pdu *pdu) -{ - Entity_t *e; - int eid; - int status = 0; - int need_reply = 1; - int all_local_entities = 0; - dis_acknowledge_pdu reply_pdu; - struct timeval tv; - double changeTime; - - reply_pdu.hdr = pdu->hdr; - reply_pdu.hdr.pdu_type = PDUTypeAcknowledge; - reply_pdu.hdr.time_stamp = timeDoubleToDIS( theTime, absoluteTime ); - - reply_pdu.orig_id = pdu->recv_id; - reply_pdu.recv_id = pdu->orig_id; - - reply_pdu.request_id = pdu->request_id; - reply_pdu.acknowledge_flag = DISAcknowledgeFlagStop; - reply_pdu.resp_flag = DISRequestStatusComplete; - - if (pdu->recv_id.sim_id.site_id == ALL_SITES) { - all_local_entities = 1; - } - else if (pdu->recv_id.sim_id.site_id == site && - pdu->recv_id.sim_id.application_id == ALL_APPLIC) { - all_local_entities = 1; - } - else if (pdu->recv_id.sim_id.site_id == site && - pdu->recv_id.sim_id.application_id == application && - pdu->recv_id.entity_id == ALL_ENTITIES) { - all_local_entities = 1; - } - - DISTimeToTimeval( &pdu->real_time, &tv ); - changeTime = tv.tv_sec + tv.tv_usec / 1000000.0; - - if ( all_local_entities ) { - int i; - - e = &entities[0]; - for ( i=0; ilocal != 1) { - continue; - } - - if ( changeTime <= theTime ) { - e->state = DIS_ENTITY_STATE_SIMULATING; - } - else { - e->pending_state = DIS_ENTITY_STATE_SIMULATING; - e->pending_time = changeTime; - } - - e->emit_while_frozen = 0; - } - } - else { - eid = findEntity( &pdu->recv_id ); - if (eid < 0) { - /* cannot comply. entity not found */ - reply_pdu.orig_id.entity_id = NO_ENTITY; - reply_pdu.resp_flag = DISRequestStatusOther; - } - else { - e = &entities[eid]; - - /* - * Is entity local ? - */ - - if ( e->local == 1 ) { - - if ( changeTime <= theTime ) { - e->state = DIS_ENTITY_STATE_SIMULATING; - } - else { - e->pending_state = DIS_ENTITY_STATE_SIMULATING; - e->pending_time = changeTime; - } - - e->emit_while_frozen = 0; - } - else { - need_reply = 0; - } - } - } - - /* - * Send reply - */ - - if (need_reply) { - status = DISxWritePDU(app, (dis_pdu *) & reply_pdu); - } - return (status == 0) ? 0 : -1; -} - -/* - * dis_canSimulate ( int eid ) - * - * Returns 1 (TRUE) if the entity is local and it is int the simulating state - */ - -int -dis_canSimulate ( int eid ) -{ - Entity_t *e; - - if ( eid >= 0 || eid <= entity_top ) { - e = &entities[eid]; - if ( e->local == 1 && e->state == DIS_ENTITY_STATE_SIMULATING ) { - return 1; - } - } - - return 0; -} - -/* - * dis_shouldTransmitPDUs ( Entity_t *e ) - * - * Determines if an entity should emit entity state PDUs based on - * protocol rules - */ - -int -dis_shouldTransmitPDUs ( Entity_t *e ) -{ - int result = 0; - - if (e->local == 1) { - if ( e->state == DIS_ENTITY_STATE_SIMULATING ) { - result = 1; - } - else if ( e->state == DIS_ENTITY_STATE_STOPPED && - e->emit_while_frozen ) { - result = 1; - } - } - - return result; -} - -/* - * d i s _ s n o o p - * - * Process incoming PDUs for the specified number of milliseconds, thus - * priming the enity table. This is called only during program - * initialization, when a complete entity table is required. - */ - -int -dis_snoop ( int millisec ) -{ - int interval_millisec = 500; - - if (disInUse) { - if (disAbsoluteTime) - dis_setTimeAbsolute(); - else - dis_setTime(curTime); - dis_receive(); - } - - dis_receive (); - - while ( millisec > 0 ) { - if ( millisec < interval_millisec ) { - interval_millisec = millisec; - } - usleep ( interval_millisec * 1000 ); - - updateSimTimeFromSystemClock (); - - if (disInUse) { - if (disAbsoluteTime) - dis_setTimeAbsolute(); - else - dis_setTime(curTime); - dis_receive(); - } - - dis_receive (); - millisec -= interval_millisec; - } - - return 0; -} - - - diff -Nru acm-5.0/src/distest.c acm-6.0+20200416/src/distest.c --- acm-5.0/src/distest.c 1998-05-12 03:59:37.000000000 +0000 +++ acm-6.0+20200416/src/distest.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,390 +0,0 @@ - -/* - * $Id: distest.c,v 1.2 1998/05/12 03:59:37 riley Exp $ - * - * Copyright (C) 1995 Mats Lofkvist CelsiusTech Electronics AB - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 dated June, 1991. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. - */ - -#include -#include -#include -#include - -/* - * This is an ugly hack, for now ... - */ -#include "../npsdis/pdu.h" -#include "dis.h" - -#define D2R(x) ((x)*3.141593/180.0) -#define R2D(x) ((x)*180.0/3.141593) - -#define REALTIME -#define ABSOLUTETIME - -#define DT 0.05 -#define RSKIP 10 - -#define MAX_ENTITY 256 - -#ifndef DEVICE -#define DEVICE "le0" -#endif - -static double -sysTime(void) -{ - struct timeval tv; - - gettimeofday(&tv, NULL); - - return tv.tv_sec + tv.tv_usec / 1000000.0; -} - -#ifdef SOL2 - -#include -#include -#include - -void -usleep(unsigned useconds) -{ - struct timeval tv; - fd_set myset; - int seconds; - - seconds = 0; - while (useconds >= 1000000) { - seconds++; - useconds -= 1000000; - } - - tv.tv_sec = seconds; - tv.tv_usec = useconds; - - FD_ZERO(&myset); - - select(1, &myset, &myset, &myset, &tv); -} - -#endif - -static double simtime = 0.0; - -typedef struct { - dis_entity_type etype; - int force; - int remote; -} Entity; - -static Entity inUse[MAX_ENTITY]; - -static void -entityEnterCb(int eid, dis_entity_type * etype, int force) -{ - printf(" %5.2f: enter %d <>\n", fmod(simtime, 60.0), eid); - - if (inUse[eid].force != -1) - fprintf(stderr, "duplicate eid\n"); - - if (eid >= MAX_ENTITY) - fprintf(stderr, "too large eid\n"); - - inUse[eid].etype = *etype; - inUse[eid].force = force; - inUse[eid].remote = 1; -} - -static void -entityExitCb(int eid) -{ - printf(" %4.1f: exit %d <>\n", fmod(simtime, 60.0), eid); - - inUse[eid].force = -1; -} - -static void -fireCb(int ftype, int firingEid, int targetEid, - double time, int rounds, - double location[3], double velocity[3], - double range) -{ -} - -static void -detonationCb(int ftype, int firingEid, int targetEid, - double time, double worldLocation[3], - double entityLocation[3]) -{ - printf(" %4.1f: detonation %d @ %.0f %.0f %.0f (%d from %d)\n", - fmod(simtime, 60.0), - targetEid, worldLocation[0], worldLocation[1], worldLocation[2], - ftype, firingEid); -} - -/* euler = [psi, theta, phi] */ -#define PSI 0 -#define THETA 1 -#define PHI 2 - -void -eul2mat(double eul[3], double factor, double mat[3][3]) -{ - double feul[3], sin_psi, cos_psi, sin_theta, cos_theta, sin_phi, - cos_phi; - - feul[PSI] = factor * eul[PSI]; - feul[THETA] = factor * eul[THETA]; - feul[PHI] = factor * eul[PHI]; - - sin_psi = sin(feul[PSI]); - cos_psi = cos(feul[PSI]); - sin_theta = sin(feul[THETA]); - cos_theta = cos(feul[THETA]); - sin_phi = sin(feul[PHI]); - cos_phi = cos(feul[PHI]); - - mat[0][0] = cos_theta * cos_psi; - mat[0][1] = sin_phi * sin_theta * cos_psi - cos_phi * sin_psi; - mat[0][2] = cos_phi * sin_theta * cos_psi + sin_phi * sin_psi; - mat[1][0] = cos_theta * sin_psi; - mat[1][1] = sin_phi * sin_theta * sin_psi + cos_phi * cos_psi; - mat[1][2] = cos_phi * sin_theta * sin_psi - sin_phi * cos_psi; - mat[2][0] = -sin_theta; - mat[2][1] = sin_phi * cos_theta; - mat[2][2] = cos_phi * cos_theta; -} - -#define EPSILON 0.000001 - -void -mat2eul(double mat[3][3], double eul[3]) -{ - double sin_theta; - - sin_theta = -mat[2][0]; - if (fabs(sin_theta > (1.0 - EPSILON))) { - eul[PHI] = 0.0; - if (sin_theta > 0) - eul[THETA] = M_PI / 2; - else - eul[THETA] = -M_PI / 2; - eul[PSI] = atan2(-mat[0][1], mat[1][1]); - } - else { - eul[PSI] = atan2(mat[1][0], mat[0][0]); - eul[THETA] = asin(sin_theta); - eul[PHI] = atan2(mat[2][1], mat[2][2]); - } -} - -void -matmul(double m1[3][3], double m2[3][3], double res[3][3]) -{ - int r, c; - double tmp[3][3]; - - for (r = 0; r < 3; r++) - for (c = 0; c < 3; c++) - tmp[r][c] = m1[r][0] * m2[0][c] + m1[r][1] * m2[1][c] + m1[r][2] * m2[2][c]; - for (r = 0; r < 3; r++) - for (c = 0; c < 3; c++) - res[r][c] = tmp[r][c]; -} - -void -cleanup(void) -{ - dis_close(); - - exit(0); -} - -int -main(int argc, char *argv[]) -{ - int sendresult, eid, loop, teid, err; - double position[3] = - {0, 0, 0}; - double velocity[3] = - {100, 0, 0}; - double acceleration[3] = - {0, 1, 0}; - double attitude[3] = - {D2R(90.0), 0, 0}; - - /* rotation = angular velocity */ - double rotation[3] = - {D2R(60.0), D2R(10.0), D2R(-13.0)}; - double roteul[3]; - double curmat[3][3], rotmat[3][3]; - double rpos[3], rvel[3], ratt[3]; - double lasttime, dt, halfdtsq; - double wloc[3], eloc[3]; - - eul2mat(attitude, 1.0, curmat); - - for (eid = 0; eid < MAX_ENTITY; eid++) - inUse[eid].force = -1; - - if (dis_init(DEVICE, 3000, 1, 1, argc, entityEnterCb, entityExitCb, - fireCb, detonationCb) != 0) { - fprintf(stderr, "dis_init failed\n"); - exit(17); - } - - signal(SIGINT, cleanup); - - dis_setDRThresholds(5.0, D2R(0.5)); - -#ifdef REALTIME - simtime = sysTime(); -#else - simtime = 0.0; -#endif -#ifdef ABSOLUTETIME - dis_setTimeAbsolute(); -#else - dis_setTime(simtime); -#endif - - if (argc > 1) { - dis_entity_type f16 = - {1, 2, 225, 1, 3, 3, 0}; - dis_entity_type MiG29 = - {1, 2, 222, 1, 2, 5, 0}; - int team_one = 1; - - if (dis_entityEnter(team_one, &f16, &MiG29, - position, velocity, acceleration, - attitude, rotation, &eid) == 0) - fprintf(stderr, "T %5.2f: %d <> enter ok\n", - fmod(simtime, 60.0), eid); - if (eid >= MAX_ENTITY) { - fprintf(stderr, "to big eid\n"); - exit(17); - } - inUse[eid].etype = f16; - inUse[eid].force = team_one; - inUse[eid].remote = 0; - } - - loop = 0; - while (1) { - loop++; - usleep((int) (1000000 * DT)); - lasttime = simtime; -#ifdef REALTIME - simtime = sysTime(); -#else - simtime += DT; -#endif - dt = simtime - lasttime; -#ifdef ABSOLUTETIME - dis_setTimeAbsolute(); -#else - dis_setTime(simtime); -#endif - err = dis_receive(); - if (err != 0) - printf("receive err = %d\n", err); - for (eid = 0; eid < MAX_ENTITY; eid++) - if (inUse[eid].force != -1) { - if (inUse[eid].remote == 1) { - /* remote */ - if (loop % RSKIP == 0) { - if (dis_getEntityState(eid, rpos, rvel, ratt) != 0) { - printf("bar! %d\n", eid); - exit(17); - } - printf("R %5.2f: %d @ %.0f %.0f %.0f [ %.2f %.2f %.2f ]\n", - fmod(simtime, 60.0), eid, rpos[0], rpos[1], rpos[2], - R2D(ratt[0]), R2D(ratt[1]), R2D(ratt[2])); - } - } /* if remote == 1 */ - else { - /* local */ - halfdtsq = dt * dt / 2; - position[0] += dt * velocity[0] + halfdtsq * acceleration[0]; - position[1] += dt * velocity[1] + halfdtsq * acceleration[1]; - position[2] += dt * velocity[2] + halfdtsq * acceleration[2]; - velocity[0] += dt * acceleration[0]; - velocity[1] += dt * acceleration[1]; - velocity[2] += dt * acceleration[2]; - - roteul[0] = rotation[2]; - roteul[1] = rotation[1]; - roteul[2] = rotation[0]; - eul2mat(roteul, dt, rotmat); - matmul(curmat, rotmat, curmat); - mat2eul(curmat, attitude); - - sendresult = dis_entityState(eid, position, velocity, - acceleration, attitude, rotation); - if (sendresult == 1) - printf("T %5.2f: %d @ %5.0f %5.0f %5.0f" - " [ %8.2f %8.2f %8.2f ]\n", - fmod(simtime, 60.0), - eid, position[0], position[1], position[2], - R2D(attitude[0]), R2D(attitude[1]), R2D(attitude[2])); - else if (sendresult < 0) { - fprintf(stderr, " %5.2f foo? %d\n", - fmod(simtime, 60.0), eid); - exit(17); - } - - if ((loop % 100) == 0) { - for (teid = 0; teid < MAX_ENTITY; teid++) - if (inUse[teid].force != -1 && inUse[teid].remote == 1) - break; - if (teid < MAX_ENTITY) { - /* found a target */ - wloc[0] = 1000; - wloc[1] = 2000; - wloc[2] = 3000; - eloc[0] = 4; - eloc[1] = 5; - eloc[2] = 6; - if ((loop % 200) == 0) { - printf(" %5.2f %d detonating M61A1 at %d ", - fmod(simtime, 60.0), eid, teid); - err = dis_detonation(DIS_FIRE_M61A1, eid, teid, - 0, 0, wloc, eloc); - printf("%d\n", err); - } - else { - printf(" %5.2f %d detonating AIM9M at %d ", - fmod(simtime, 60.0), eid, teid); - err = dis_detonation(DIS_FIRE_AIM9M, eid, teid, - 0, 0, wloc, eloc); - printf("%d\n", err); - } - } /* if found target */ - } /* if loop % 100 == 0 */ - - /* 1000 = 50s with DT = 0.05 */ - if (loop == 1000) { - printf(" %5.2f exiting %d\n", fmod(simtime, 60.0), eid); - dis_entityExit(eid); - inUse[eid].force = -1; - } - } /* if remote != 1 */ - } /* if etype != -1 */ - } /* while 1 */ - - return 0; -} diff -Nru acm-5.0/src/drone.c acm-6.0+20200416/src/drone.c --- acm-5.0/src/drone.c 1998-12-30 20:23:34.000000000 +0000 +++ acm-6.0+20200416/src/drone.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,455 +0,0 @@ -/* - * acm : an aerial combat simulator for X - * Copyright (C) 1991-1996 Riley Rainey - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 dated June, 1991. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. - */ - - /* - * The original "Smart Drone" code was created by - * Jason Nyberg (nyberg@ctron.com). Enhancements added by Riley Rainey. - */ - -#include "pm.h" -#include "alarm.h" - -extern double efrandom(void); - -/* - * convert target plane coords from world to drone's - */ - -void -myCoordSys(craft * c, craft * p, VPoint * pos, VPoint * vel) -{ - VPoint tpos; - - VTransform(&p->prevSg, &c->XYZtoNED, &tpos); - VReverseTransform_(&tpos, &c->trihedral, pos); - VTransform_(&p->Cg, &c->XYZtoNED, &tpos); - VReverseTransform_(&tpos, &c->trihedral, vel); -} - -void -unholdFireAlarm(char *arg1, char *arg2) -{ - craft *c = (craft *) arg1; - - if (c->holdCount > 0) { - c->holdCount--; - } -} - -/* - * Dumbly choose the closest hostile plane to be target - */ - -int -pickTarget(craft * c) -{ - int i, target = -1; - craft *p; - double d, min; - VPoint pos, vel; - - min = 100000000.0; - for (i = 0, p = ptbl; i < MAXPLAYERS; ++i, ++p) { - - if (p->pIndex == c->pIndex || p->team == c->team ) { - continue; - } - - if ( p->type == CT_PLANE || - p->type == CT_DIS_PLANE || - p->type == CT_DRONE) { - - - myCoordSys(c, p, &pos, &vel); - - d = mag( pos ); - - if (d < min) { - min = d; - target = p->pIndex; - } - } - } - - return target; -} - -/* - * droneFlyTo - * - * Generate sitck/rudder controls to move the plane to the specified - * geocentric point. - */ - -void -droneFlyTo ( craft *c, VPoint *pos ) -{ - double d; - double phi_rad; - - d = sqrt(pos->x * pos->x + pos->y * pos->y + pos->z * pos->z); - - /* - * DRONE_FACTOR defines just how hard a drone will maneuver into position. - * - * Change to a lower or higher value to make it easier or harder. - * Make sure the value is greater than 0.0 and 1.0 - * 0.2-0.3 makes for good gun practice, 1.0 is virtually impossible to - * shake. - */ - -#define DRONE_MAX_Se (droneAggressiveness) -#define DRONE_MAX_Sa (droneAggressiveness) -#define DRONE_MAX_Sr ((droneAggressiveness) * 0.1) - - /* - * A lot of conventional 1V1 air combat involves keeping your lift - * vector on the target aircraft. Phi is the computed angle between our - * target and the lift vector (simplified to be just the negative Z-axis). - */ - - phi_rad = atan2 ( pos->y, -pos->z ); - - /* - * If the target is behind our 3/9-line, we are defensive. Pull maximum - * G's into the target (after rolling into him). - * - * If we are behind of the target, perform pure pursuit (until the code - * gets a bit smarter). - */ - - if (pos->x < 0.0) { - - /* - * Wait for lift vector to be close to where we want it before - * pulling G's. - */ - if ((fabs(phi_rad) > DEGtoRAD(130.0)) || - fabs(phi_rad) < DEGtoRAD(50.0)) { - c->Se = DRONE_MAX_Se; - } - } - else { - c->Se = - pos->z / d * 3.0; - } - - /* - * Put the lift vector on the target. - */ - - if (pos->z == 0.0) { - c->Sa = 0.0; - } - else if (fabs (phi_rad) > DEGtoRAD(150.0)) { - c->Sa = - 0.2 * phi_rad; - } - else if (fabs (phi_rad) > DEGtoRAD(20.0)) { - c->Sa = phi_rad; - } - else { - c->Sa = 0.2 * phi_rad; - } - - /* - * Don't use the rudder, for now. - */ - - c->Sr = 0.0; - - /* - * Constrain control surface positions to valid values. - */ - - if (c->Se > DRONE_MAX_Se) - c->Se = DRONE_MAX_Se; - else if (c->Se < -DRONE_MAX_Se) - c->Se = -DRONE_MAX_Se; - - if (c->Sa > DRONE_MAX_Sa) - c->Sa = DRONE_MAX_Sa; - else if (c->Sa < -DRONE_MAX_Sa) - c->Sa = -DRONE_MAX_Sa; - - if (c->Sr > DRONE_MAX_Sr) - c->Sr = DRONE_MAX_Sr; - else if (c->Sr < -DRONE_MAX_Sr) - c->Sr = -DRONE_MAX_Sr; - - c->Sa = - c->Sa; - c->Se = - c->Se; - -} - -/* - * Drone flight management in Attack Mode (this is most common) - */ - -int -droneCalculationsAttackMode ( craft * c ) -{ - - double d, phi, htime; - VPoint pos, vel; - int x, y; - - /* - * Our opponent has exited? Return to engagement initiation point. - */ - - if ( (c->flags & FL_END_GAME_DRONE ) ) { - if ( c->curOpponent != -1 && - ptbl[c->curOpponent].type == CT_FREE ) { - c->curDroneMode = DM_RETURN; - } - } - - /* - * No opponent, or opponent isn't there anymore - */ - - else if (c->curOpponent == -1 || - ptbl[c->curOpponent].type == CT_FREE) { - c->curOpponent = pickTarget(c); - c->holdCount = 0; - } - - if (c->curOpponent != -1) { - - myCoordSys(c, &(ptbl[c->curOpponent]), &pos, &vel); - - droneFlyTo ( c, &pos ); - - /* - * Fire at the target, if appropriate. The newDrone() code has - * already selected AIM-9's as our weapon. - * - * We'll have to figure out a way to do lead pursuit in order to - * fire the cannon; we do pure pursuit now, which is the - * (somewhat) right thing to fire a missile. - */ - - if (c->holdCount == 0 && - doWeaponDisplay(c, (viewer *) NULL, &x, &y) == 1) { - fireWeapon(c); - htime = 10.0 + (efrandom() + efrandom()) * 5.0; - addAlarm(htime, unholdFireAlarm, (char *) c, NULL); - c->holdCount++; - } - - - } - - return 0; -} - -/* - * Drone flight management in Return Modes - */ - -int -droneCalculationsReturnMode ( craft * c ) -{ - VPoint tpos, pos, vel; - double dist_meters, closure_meters_per_sec; - int result = 0; - - /* - * Generate body relative position of return point - */ - - VTransform(&c->interceptStartPoint, &c->XYZtoNED, &tpos); - VReverseTransform_(&tpos, &c->trihedral, &pos); - - /* - * Convert NED velocity to body-relative velocity - */ - - VReverseTransform_(&c->Cg, &c->trihedral, &vel); - - dist_meters = mag( pos ); - - closure_meters_per_sec = - ( vel.x * pos.x + vel.y * pos.y + vel.z * pos.z ) / dist_meters; - - droneFlyTo ( c, &pos ); - - /* - * If we are in return mode and turned within 30 degrees towards - * the return point, enter the "return-captured" mode. - */ - - if ( c->curDroneMode == DM_RETURN ) { - - if ( closure_meters_per_sec > 0.866 * FEETtoMETERS(c->VT) ) { - c->curDroneMode = DM_RETURN_CAPTURED; - } - } - - /* - * If we are in return-capture mode and start to move away from the - * intercept point, then we're done; destroy the aircraft. - */ - - else { - if ( closure_meters_per_sec < 0.0 ) { - killPlayer ( c ); - result = 1; - } - } - - return result; -} - -int -droneCalculations( craft * c ) -{ - int result; - - switch (c->curDroneMode) { - - case DM_ATTACK: - result = droneCalculationsAttackMode ( c ); - break; - - case DM_RETURN: - result = droneCalculationsReturnMode ( c ); - break; - - case DM_RETURN_CAPTURED: - result = droneCalculationsReturnMode ( c ); - break; - } - return result; -} - -#ifdef USE_REQUEST_CONTROL - -extern int controlRequestCallback( dis_pdu *pdu, void *pu ); - -/* - * endGameDistanceCheck - * - * This alarm function is invoked periodically (once per second) to look for - * hostile aircraft in the proxmity of this DIS entity -- the entity is - * owned by another application at this point, we may ask to take control of - * it, if a hostile aircraft comes within range. - */ - -void -endGameDistanceCheck (char * p1, char *p2) -{ - double range_meters; - VPoint del; - craft *p; - craft *c = (craft * ) p1; - viewer *u = (viewer *) p2; - int i; - int done = 0; - double threshold_meters; - - if ( c->type == CT_DIS_PLANE && (c->flags & FL_END_GAME_DRONE) ) { - - /* - * Determine the appropriate range threshold; if one was specified - * on the command line, use that. Otherwise use the lock range from - * the aicraft definition. - */ - - if ( end_game_threshold_meters <= 0.0 ) { - threshold_meters = FEETtoMETERS( c->cinfo->radarTRange * NM ); - } - else { - threshold_meters = end_game_threshold_meters; - } - - for ((i = 0, p = ptbl); (i < MAXPLAYERS) && ( ! done ); (++i, ++p)) { - - /* - * Skip this entry if: - * - * 1) It's the entry for our own aircraft. - * 2) The craft isn't a hostile. - */ - - if (p->pIndex == c->pIndex || c->team == p->team ) { - continue; - } - - if ( p->type == CT_PLANE || - p->type == CT_DIS_PLANE || - p->type == CT_DRONE) { - - del.x = p->Sg.x - c->Sg.x; - del.y = p->Sg.y - c->Sg.y; - del.z = p->Sg.z - c->Sg.z; - - range_meters = mag( del ); - - /* - * If the distance is within our threshold, then - * initiate a control request. - */ - - if ( range_meters <= threshold_meters ) { - Entity_t * e = dis_getEntityTable(); - - /* - * Record start point of engagement; we will return - * to this point after a kill. - */ - - c->interceptStartPoint = c->Sg; - - dis_requestControl ( &e[c->disId], - controlRequestCallback, u ); - - done = 1; - } - - } - } - } - - /* - * This craft is no longer a DIS plane. No need to continue proximity - * testing. - */ - - else { - done = 1; - } - - /* - * If nothing was within our threshold range, look again after one - * second has elapsed. - */ - - if ( ! done ) { -#ifdef DEBUG - printf ("not done: adding alarm\n"); -#endif - addAlarm ( 1.0, endGameDistanceCheck, p1, p2 ); - } - -#ifdef DEBUG - printf ("distance check exit\n"); -#endif - -} - -#endif diff -Nru acm-5.0/src/effects.c acm-6.0+20200416/src/effects.c --- acm-5.0/src/effects.c 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/src/effects.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,221 +0,0 @@ -/* - * acm : an aerial combat simulator for X - * Copyright (C) 1991-1997 Riley Rainey - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 dated June, 1991. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. - */ - -#include "pm.h" -#include -#include - -extern int acm_rand(); - -#if defined(NEEDS_COPYSIGN) - -#if defined(HAS_IEEE_NAN) -#include -#endif - -double -copysign(double x, double y) -{ - -#if defined(HAS_IEEE_NAN) - if (isnand(y)) - return fabs(x); -#endif - - return (y < 0.0) ? -fabs(x) : fabs(x); -} - -#endif - -#define SPIKES 16 -#define FLAME_SPIKES 8 -#define SMOKE_INNER 0.2 -#define SMOKE_RADIUS 1.0 -#define SMOKE_MIN_RADIUS 0.5 -#define SMOKE_VARIATION (SMOKE_RADIUS - SMOKE_MIN_RADIUS) -#define FLAME_RADIUS 0.5 -#define FLAME_MIN_RADIUS 0.3 -#define FLAME_VARIATION (FLAME_RADIUS - FLAME_MIN_RADIUS) - -/* - * return a double value from -1.0 .. 1.0 - */ - -double -efrandom(void) -{ - return ((acm_rand() % 32767) - 16384) / 16384.0; -} - -static VObject *explosionTemplate; - -int placeExplosion(Viewport * v, craft * obj, VMatrix * mtx, VPolygon ** poly, long *cnt); - -static craftType expcraft; - -void -newExplosion(VPoint * loc, VPoint *vel, double s_meters, double dur1, double dur2) -{ - - register int i; - register craft *e; - - for (i = 0; i < MAXPROJECTILES; ++i) { - if (mtbl[i].type == CT_FREE) { - e = &mtbl[i]; - e->type = CT_EXPLOSION; - e->Sg = *loc; - DISGeocentricToWorldCoordinates( - (dis_world_coordinates *) & e->Sg, &e->w); - e->Cg = *vel; - e->escale = s_meters; - e->duration = (int) (dur1 / deltaT + 0.5); - e->flameDuration = (int) (dur2 / deltaT + 0.5); - e->cinfo = &expcraft; - e->cinfo->placeProc = placeExplosion; - e->curHeading = e->curRoll = e->curPitch = 0.0; - break; - } - } -} - -static VColor *effectBlackColor; - -void -buildExplosion(void) -{ - - register int i, numSpikes, numFlame, numRed, poly; - register VObject *obj; - VColor *redFlameColor, *orangeFlameColor, *color; - VPoint vp[3]; - double x, s; - - numSpikes = SPIKES; - numFlame = FLAME_SPIKES; - numRed = numFlame / 2; - - effectBlackColor = VAllocColor("black"); - redFlameColor = VAllocColor("red"); -#ifndef EIGHT_COLORS - orangeFlameColor = VAllocColor("#ffc900"); -#endif - - obj = (VObject *) Vmalloc(sizeof(VObject)); - obj->name = strdup("explosion"); - obj->numPolys = numSpikes + numFlame; - obj->polygon = (VPolygon **) Vmalloc(obj->numPolys * sizeof(VPolygon *)); - obj->order = (unsigned short *) NULL; - - poly = 0; - - for (i = 0; i < numSpikes; ++i) { - x = efrandom(); - s = copysign(1.0, x); - x = fabs(x); - vp[0].x = (SMOKE_MIN_RADIUS + x * SMOKE_VARIATION) * s; - x = efrandom(); - s = copysign(1.0, x); - x = fabs(x); - vp[0].y = (SMOKE_MIN_RADIUS + x * SMOKE_VARIATION) * s; - x = efrandom(); - s = copysign(1.0, x); - x = fabs(x); - vp[0].z = (SMOKE_MIN_RADIUS + x * SMOKE_VARIATION) * s; - vp[1].x = efrandom() * SMOKE_INNER; - vp[1].y = efrandom() * SMOKE_INNER; - vp[1].z = efrandom() * SMOKE_INNER; - vp[2].x = efrandom() * SMOKE_INNER; - vp[2].y = efrandom() * SMOKE_INNER; - vp[2].z = efrandom() * SMOKE_INNER; - obj->polygon[poly++] = VCreatePolygon(3, vp, effectBlackColor); - } - - for (i = 0; i < numFlame; ++i) { - x = efrandom(); - s = copysign(1.0, x); - x = fabs(x); - vp[0].x = (FLAME_MIN_RADIUS + x * FLAME_RADIUS) * s; - x = efrandom(); - s = copysign(1.0, x); - x = fabs(x); - vp[0].y = (FLAME_MIN_RADIUS + x * FLAME_RADIUS) * s; - x = efrandom(); - s = copysign(1.0, x); - x = fabs(x); - vp[0].z = (FLAME_MIN_RADIUS + x * FLAME_RADIUS) * s; - vp[1].x = efrandom() * SMOKE_INNER; - vp[1].y = efrandom() * SMOKE_INNER; - vp[1].z = efrandom() * SMOKE_INNER; - vp[2].x = efrandom() * SMOKE_INNER; - vp[2].y = efrandom() * SMOKE_INNER; - vp[2].z = efrandom() * SMOKE_INNER; -#ifndef EIGHT_COLORS - if (i < numRed) - color = redFlameColor; - else - color = orangeFlameColor; -#else - color = redFlameColor; -#endif - obj->polygon[poly++] = VCreatePolygon(3, vp, color); - } - - explosionTemplate = obj; - -} - -int /*ARGSUSED */ -placeExplosion(Viewport * v, craft * obj, VMatrix * mtx, VPolygon ** poly, long *cnt) -{ - - register int i, j, k, n; - register VPolygon **p; - VPoint tmp, *q; - - j = *cnt; - - n = explosionTemplate->numPolys; - p = explosionTemplate->polygon; - - for (i = 0; i < n; ++i) { - if (obj->flameDuration > 0 || p[i]->color == effectBlackColor) { - poly[j] = VCopyPolygon(p[i]); - for ((k = 0, q = poly[j]->vertex); k < poly[j]->numVtces; (++k, ++q)) { - tmp.x = q->x * obj->escale + obj->Sg.x; - tmp.y = q->y * obj->escale + obj->Sg.y; - tmp.z = q->z * obj->escale + obj->Sg.z; - *q = tmp; - } - VTransformPolygon(poly[j], &v->eyeSpace); - ++j; - } - } - - *cnt = j; - - return 0; -} - -void -freeEffects(void) -{ - if (explosionTemplate) { - VDestroyObject ( explosionTemplate ); - } -} diff -Nru acm-5.0/src/eng.xbm acm-6.0+20200416/src/eng.xbm --- acm-5.0/src/eng.xbm 1994-01-20 20:37:18.000000000 +0000 +++ acm-6.0+20200416/src/eng.xbm 1970-01-01 00:00:00.000000000 +0000 @@ -1,72 +0,0 @@ -#define eng_width 80 -#define eng_height 80 -#define eng_x_hot 39 -#define eng_y_hot 39 -static char eng_bits[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xfe, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xfe, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, - 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x01, 0xc0, 0x7f, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xe0, 0x0e, 0xc0, 0x01, 0xb8, 0x03, 0x00, 0x00, - 0x00, 0x00, 0xf0, 0x01, 0xc0, 0x01, 0xc0, 0x04, 0x00, 0x00, 0x00, 0x00, - 0xf0, 0x01, 0xc0, 0x01, 0xc0, 0x04, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, - 0x80, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x80, 0x00, - 0x00, 0x78, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0xe0, - 0x01, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, - 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x78, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x3c, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x12, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xe0, 0x1c, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, - 0x31, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x31, 0x00, - 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x60, 0x00, 0x00, 0x03, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0xc0, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xc0, 0x01, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x40, 0x02, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x40, 0x02, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x03, - 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x05, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x06, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x0c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, - 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x38, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x0e, 0x88, 0x31, 0x00, 0x00, 0x00, 0x00, 0x60, 0x0c, 0x38, - 0x0e, 0x4c, 0x4a, 0x00, 0x00, 0x00, 0x00, 0x90, 0x12, 0x38, 0x0e, 0x48, - 0x4a, 0x00, 0x00, 0x00, 0x00, 0x10, 0x12, 0x38, 0xee, 0x49, 0x4a, 0x00, - 0x00, 0x00, 0x00, 0x10, 0xd2, 0x3b, 0x2e, 0x49, 0x4a, 0x00, 0x80, 0x00, - 0x00, 0x70, 0x52, 0x3a, 0xee, 0x49, 0x4a, 0x00, 0x00, 0x00, 0x00, 0x90, - 0xd2, 0x3b, 0x0e, 0x48, 0x4a, 0x00, 0x00, 0x00, 0x00, 0x90, 0x12, 0x38, - 0x0e, 0x48, 0x4a, 0x00, 0x00, 0x00, 0x00, 0x90, 0x12, 0x38, 0x0e, 0x9c, - 0x31, 0x00, 0x00, 0x00, 0x00, 0x60, 0x0c, 0x38, 0x0e, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x0e, 0x00, 0x00, 0xf0, 0x3c, 0x21, - 0x26, 0x00, 0x00, 0x38, 0x18, 0x00, 0x00, 0x10, 0x45, 0x21, 0x26, 0x00, - 0x00, 0x0c, 0x18, 0x00, 0x00, 0x10, 0x45, 0x21, 0x20, 0x00, 0x00, 0x0c, - 0x18, 0x00, 0x00, 0x10, 0x45, 0x33, 0x18, 0x00, 0x00, 0x0c, 0x18, 0x00, - 0x00, 0x10, 0x45, 0x2d, 0x18, 0x00, 0x00, 0x0c, 0x18, 0x00, 0x00, 0xf0, - 0x3c, 0x2d, 0x04, 0x00, 0x00, 0x0c, 0x30, 0x00, 0x00, 0x50, 0x04, 0x21, - 0x02, 0x00, 0x00, 0x06, 0x30, 0x00, 0x00, 0x90, 0x04, 0x21, 0x02, 0x00, - 0x00, 0x06, 0x30, 0x00, 0x00, 0x10, 0x05, 0x21, 0x32, 0x00, 0x00, 0x06, - 0xf0, 0x00, 0x00, 0x10, 0x05, 0x21, 0x30, 0x00, 0x80, 0x07, 0xe0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x03, 0xe0, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xc0, 0x03, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xc0, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x03, 0x04, 0x00, 0x30, 0x06, 0x00, 0x10, 0x70, 0x00, 0x00, 0xc6, - 0x07, 0x00, 0x48, 0x09, 0x00, 0xf0, 0x31, 0x00, 0x00, 0xc6, 0x07, 0x00, - 0x48, 0x09, 0x00, 0xf0, 0x31, 0x00, 0x00, 0x9c, 0x03, 0x00, 0x48, 0x09, - 0x00, 0xe0, 0x1c, 0x00, 0x00, 0x7c, 0x03, 0x00, 0x30, 0x09, 0x00, 0x60, - 0x1e, 0x00, 0x00, 0x78, 0x00, 0x00, 0x48, 0x09, 0x00, 0x00, 0x0f, 0x00, - 0x00, 0xe0, 0x00, 0x00, 0x48, 0x09, 0x00, 0x80, 0x03, 0x00, 0x00, 0xe0, - 0x00, 0x00, 0x48, 0x09, 0x00, 0x80, 0x03, 0x00, 0x00, 0xc0, 0x03, 0x00, - 0x30, 0x06, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x80, 0x0f, 0x00, 0x80, 0x00, - 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x80, 0x00, 0x00, 0x1f, - 0x00, 0x00, 0x00, 0x00, 0xf8, 0x01, 0x40, 0x01, 0xc0, 0x07, 0x00, 0x00, - 0x00, 0x00, 0xf0, 0x01, 0x40, 0x01, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x00, - 0xe0, 0x0f, 0xc0, 0x01, 0xf8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, - 0x01, 0xc0, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, - 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x3f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x3f, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff -Nru acm-5.0/src/events.c acm-6.0+20200416/src/events.c --- acm-5.0/src/events.c 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/src/events.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,652 +0,0 @@ -/* - * acm : an aerial combat simulator for X - * Copyright (C) 1991-1998 Riley Rainey - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 dated June, 1991. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. - */ - -#include "pm.h" -#include -#include -#include -#include "linux_joystick.h" - -#define MAX_MAPPED_STRING_LEN 20 -#define MAX_POPUP_STRING_LEN 40 - -extern int cur; - -extern void resizePlayerWindow(craft * c, viewer * u, int width, int height, int initial_flag), - resizeChaserWindow(craft * c, viewer * u, int width, int height, int initial_flag), - redrawPanel(craft * c, viewer * u); -extern int debug; - -extern void startBlackBoxRecording(void), endBlackBoxRecording(void); -extern void startBlackBoxPlayback(void); -extern void radioFrequencyChanged(craft * c, radio_t * r); -extern void CalibrateJoystick(void); - -void -doEvents() -{ - - XEvent ev; - craft *c; - viewer *u; - int player; - -/* - * Process events for each viewer - */ - - player = 1; - for (u = vl_head; u != (viewer *) NULL; u = u->vl_next) { - - c = u->c; - - if (real_delta_t || ((cur % redraw_interval) == 0)) { - getStick(c, u); - } - - while (XEventsQueued(u->dpy, QueuedAlready)) { - - if (XCheckWindowEvent(u->dpy, u->win, -1L, &ev)) { - - switch (ev.type) { - - case KeyPress: - if (u->viewer_state == ViewerStateBrowsing || - u->viewer_state == ViewerStatePiggyback) { - if (doBrowseKeyEvent( c, u, &ev, player )) { - return; - } - } - else { - if (doKeyEvent(c, u, &ev, player) < 0) { - return; - } - } - break; - - case ButtonPress: - if (doButtonEvent(c, u, &ev, player) < 0) - return; - break; - - case ButtonRelease: - if (doButtonReleaseEvent(c, u, &ev, player) < 0) - return; - break; - - case ConfigureNotify: - resizePlayerWindow(c, u, - ev.xconfigure.width, - ev.xconfigure.height, 0); - VResizeViewport(u->v, UNITS_METERS, - u->scaleFactor, FEETtoMETERS(0.5), - u->width, - u->height); - break; - - case Expose: - redrawPanel(c, u); - ForceWindowRedraw(u->v->w); - break; - - default: - break; - } - - } - else if (XCheckTypedEvent(u->dpy, ClientMessage, &ev)) { - if (ev.xclient.message_type == u->protocolsAtom - && (ev.xclient.data.l[0] == u->deleteWindowAtom || - ev.xclient.data.l[0] == u->closedownAtom)) { - killPlayer(c); - } - } - } - - player = 0; - - } -} - -/*ARGSUSED */ -int -doButtonEvent(craft * c, viewer * u, XEvent * ev, int player) -{ - - if (ev->xbutton.button == Button1) { - selectCockpitItem( c, u, - ev->xbutton.x, - ev->xbutton.y, - ev->xbutton.time ); - } - else if (ev->xbutton.button == Button2) { - fireWeapon(c); - } - else if (ev->xbutton.button == Button3) { - selectWeapon(c); - } - return 0; -} - -static int last_switches = 0; - -/*ARGSUSED */ -int -doJoystickEvent(craft * c, viewer * u, double rudder, double throttle, int switches) -{ - - int switch_xor = switches ^ last_switches; - -/* - * Change in state of any buttons ? - */ - - if (switch_xor != 0) { - - if (switch_xor & 1) { - -/* - * Button 1 press - */ - if (switches & 1) { - fireWeapon(c); - } - -/* - * Button 1 release - */ - - else { - ceaseFireWeapon(c); - } - } - -/* - * Button 2 press - */ - - if (switch_xor & 2) { - if (switches & 2) { - selectWeapon(c); - } - } - - } - - last_switches = switches; -// c->throttle is 0 to 32768, throttle as given is -1 to 1 -// -2 is no throttle - if(throttle != -2) - c->throttle = 32768 * (throttle+1)/2; - // -1 to 1 didn't seem like enough, and the keyboard would do much more - if(rudder != -2) - c->Sr = 4*rudder; - - return 0; -} - -/*ARGSUSED */ -int -doButtonReleaseEvent(craft * c, viewer * u, XEvent * ev, int player) -{ - - if (ev->xbutton.button == Button2) - ceaseFireWeapon(c); - - return 0; -} - -/*ARGSUSED */ -int -doKeyEvent(craft * c, viewer * u, XEvent * ev, int player) -{ - - KeySym keysym; - XComposeStatus compose; - char buffer[MAX_MAPPED_STRING_LEN]; - int buflen = MAX_MAPPED_STRING_LEN; - -#ifdef SPECIAL_KEYS - FILE *fp; - craft pentry; - -#endif - - (void) XLookupString((XKeyEvent *) ev, buffer, buflen, - &keysym, &compose); - - if (player) { - - switch (keysym) { - -#ifdef sun - case XK_R4: -#else - case XK_Left: -#endif - if (c->flags & FL_NWS) { - c->curNWDef = c->curNWDef - c->cinfo->NWIncr; - if (c->curNWDef < -c->cinfo->maxNWDef) - c->curNWDef = -c->cinfo->maxNWDef; - } - else { - c->Sa = c->Sa + 0.05; - } - break; - -#ifdef sun - case XK_R6: -#else - case XK_Right: -#endif - if (c->flags & FL_NWS) { - c->curNWDef = c->curNWDef + c->cinfo->NWIncr; - if (c->curNWDef > c->cinfo->maxNWDef) - c->curNWDef = c->cinfo->maxNWDef; - } - else { - c->Sa = c->Sa - 0.05; - } - break; - -#ifdef sun - case XK_R2: -#else - case XK_Up: -#endif - c->Se = c->Se + 0.01; - break; - -#ifdef sun - case XK_R5: -#else - case XK_Down: -#endif - c->Se = c->Se - 0.01; - break; - - case XK_z: - case XK_Z: - c->Sr = c->Sr + 0.01; - break; - - case XK_c: - case XK_C: - c->Sr = c->Sr - 0.01; - break; - - case XK_x: - case XK_X: - c->Sr = 0.0; - break; - -#ifdef sun - case XK_R7: -#else - case XK_Home: -#endif - c->Se = 0.0; - c->Sr = 0.0; - c->Sa = 0.0; - break; - -/* - * J : Adjust Elevator Trim - */ - case XK_J: - case XK_j: - c->SeTrim -= c->Se; - break; - -/* - * U : Set Elevator trim to the Takeoff setting - */ - - case XK_U: - case XK_u: - c->SeTrim = c->cinfo->SeTrimTakeoff; - break; - - case XK_y: - case XK_Y: - flapsUp(c); - break; - - case XK_h: - case XK_H: - flapsDown(c); - break; - - case XK_w: - case XK_W: - speedBrakeRetract(c); - break; - - case XK_s: - case XK_S: - speedBrakeExtend(c); - break; - - case XK_2: - case XK_KP_Subtract: - c->throttle = (c->throttle <= 6553) ? 6553 : - c->throttle - 512; - break; - - case XK_3: - case XK_KP_Add: - c->throttle = (c->throttle >= 32768) ? 32768 : - c->throttle + 512; - break; - - case XK_4: - case XK_Prior: - c->throttle = 32768; - break; - - case XK_1: - case XK_Next: - c->throttle = 8192; - break; - - case XK_A: - case XK_a: - c->flags ^= FL_AFTERBURNER; - break; - - case XK_7: - c->hsiSelect->obs_setting = - (c->hsiSelect->obs_setting + 20) % 360; - break; - - case XK_8: - c->hsiSelect->obs_setting = - (c->hsiSelect->obs_setting + 1) % 360; - break; - - case XK_9: - c->hsiSelect->frequency = - (c->hsiSelect->frequency + 20) % - VOR_CHANNEL_COUNT; - radioFrequencyChanged(c, c->hsiSelect); - break; - - case XK_0: - c->hsiSelect->frequency = - (c->hsiSelect->frequency + 1) % - VOR_CHANNEL_COUNT; - radioFrequencyChanged(c, c->hsiSelect); - break; - - case XK_B: - case XK_b: - c->flags ^= FL_BRAKES; - break; - - case XK_G: - case XK_g: - playSound(c, (c->flags & FL_GHANDLE_DN) ? - SoundGearUp : SoundGearDown); - c->flags ^= FL_GHANDLE_DN; - break; - - case XK_L: - case XK_l: - newDrone( c, NULL ); - break; - -#ifdef sun - case XK_Up: -#else - case XK_KP_8: -#endif - u->viewDirection.x = 1.0; - u->viewDirection.y = 0.0; - u->viewDirection.z = 0.0; - u->viewUp.x = 0.0; - u->viewUp.y = 0.0; - u->viewUp.z = -1.0; - break; - -/* look right */ - -#ifdef sun - case XK_Right: -#else - case XK_KP_6: -#endif - u->viewDirection.x = 0.0; - u->viewDirection.y = 1.0; - u->viewDirection.z = 0.0; - u->viewUp.x = 0.0; - u->viewUp.y = 0.0; - u->viewUp.z = -1.0; - break; - -/* look left */ - -#ifdef sun - case XK_Left: -#else - case XK_KP_4: -#endif - u->viewDirection.x = 0.0; - u->viewDirection.y = -1.0; - u->viewDirection.z = 0.0; - u->viewUp.x = 0.0; - u->viewUp.y = 0.0; - u->viewUp.z = -1.0; - break; - -/* look back */ - -#ifdef sun - case XK_Down: -#else - case XK_KP_2: -#endif - u->viewDirection.x = -1.0; - u->viewDirection.y = 0.0; - u->viewDirection.z = 0.0; - u->viewUp.x = 0.0; - u->viewUp.y = 0.0; - u->viewUp.z = -1.0; - break; - -/* look up */ - -#ifdef sun - case XK_R11: -#else - case XK_KP_5: -#endif - u->viewDirection.x = 0.0; - u->viewDirection.y = 0.0; - u->viewDirection.z = -1.0; - u->viewUp.x = -1.0; - u->viewUp.y = 0.0; - u->viewUp.z = 0.0; - break; - - case XK_Q: - case XK_q: - c->curRadarTarget = newRadarTarget(c); -#ifdef HAVE_DIS - dis_radarTargetChanged(c); -#endif - break; - -#ifndef HAVE_DIS - case XK_R: -#endif - case XK_r: - switch (c->radarMode) { - - case RM_STANDBY: - c->radarMode = RM_NORMAL; - c->curRadarTarget = -1; - break; - - case RM_NORMAL: - case RM_ACM: - case RM_STT: - c->radarMode = RM_ILS; - c->curRadarTarget = -1; - break; - - case RM_ILS: - c->radarMode = RM_STANDBY; - c->curRadarTarget = -1; - break; - } -#ifdef HAVE_DIS - switch (c->radarMode) { - case RM_OFF: - case RM_STANDBY: - case RM_ILS: - dis_setRadarMode(c, 0, 1); - break; - case RM_NORMAL: - dis_setRadarMode(c, 1, 1); - break; - } -#endif - break; - -#ifdef HAVE_DIS -/* this is a hack to allow change of beam parameter index - in the outgoing electromagnetic emission pdu's */ - case XK_R: - switch (c->radarMode) { - case RM_OFF: - case RM_STANDBY: - setRadarMode(c, RM_NORMAL); - break; - case RM_NORMAL: - setRadarMode(c, RM_ACM); - break; - case RM_ACM: - setRadarMode(c, RM_STT); - break; - case RM_STT: - setRadarMode(c, RM_ILS); - break; - case RM_ILS: - setRadarMode(c, RM_STANDBY); - break; - } - break; -#endif - - case XK_N: - case XK_n: - c->flags ^= FL_CHASE_VIEW; - break; - -#ifdef SPECIAL_KEYS - - case XK_o: - if (absorbDamage(c, 3) == 0) { - killPlayerEx(c, - "You asked to absorb some damage. The aircraft was destroyed.", - "No further details are available."); - return -1; - } - break; - - case XK_I: - fp = fopen("./flight-state", "w"); - fwrite((char *) &ptbl[c->pIndex], - sizeof(craft), 1, fp); - fclose(fp); - break; - - case XK_i: - if (fp = fopen("./flight-state", "r")) { - fread((char *) &pentry, sizeof(craft), 1, fp); - fclose(fp); - - c->flags = pentry.flags; - c->Sg = pentry.Sg; -#ifndef FLAT_WORLD - c->w = pentry.w; - c->prevw = pentry.prevw; -#endif - c->navReceiver[0] = pentry.navReceiver[0]; - c->navReceiver[1] = pentry.navReceiver[1]; - radioReceptionCheck(c, &c->navReceiver[0]); - radioReceptionCheck(c, &c->navReceiver[1]); - c->prevSg = pentry.prevSg; - c->Cg = pentry.Cg; - c->trihedral = pentry.trihedral; - c->curHeading = pentry.curHeading; - c->curPitch = pentry.curPitch; - c->curRoll = pentry.curRoll; - c->p = pentry.p; - c->q = pentry.q; - c->r = pentry.r; - c->damageBits = pentry.damageBits; - c->structurePts = pentry.structurePts; - c->damageCL = pentry.damageCL; - c->damageCM = pentry.damageCM; - c->curThrust = pentry.curThrust; - c->throttle = pentry.throttle; - } - else { - fprintf(stderr, - "unable to open ./flight-state\n"); - } - break; - - case XK_semicolon: - debug ^= 1; - break; - -#endif - - case XK_P: - case XK_p: - killPlayer(c); - return -1; - return -1; -/*NOTREACHED */ break; - - case XK_braceleft: - startBlackBoxRecording(); - break; - - case XK_braceright: - endBlackBoxRecording(); - break; - - case XK_bracketleft: - startBlackBoxPlayback(); - break; - - case XK_k: - case XK_K: - CalibrateJoystick(); - if(LinuxJoystickPresent) - LinuxCalibrateJoystick(); - break; - - } - - } - return 0; -} Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/src/flaps0.bmp and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/src/flaps0.bmp differ diff -Nru acm-5.0/src/flaps0.xbm acm-6.0+20200416/src/flaps0.xbm --- acm-5.0/src/flaps0.xbm 1990-06-05 15:49:04.000000000 +0000 +++ acm-6.0+20200416/src/flaps0.xbm 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ -#define flaps0_width 64 -#define flaps0_height 32 -#define flaps0_x_hot 4 -#define flaps0_y_hot 25 -static char flaps0_bits[] = { - 0x00, 0xf0, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x80, 0xdf, 0xdd, 0xfd, - 0x1f, 0x00, 0x00, 0x00, 0x60, 0xef, 0xee, 0xee, 0xee, 0x1f, 0x00, 0x00, - 0x70, 0x77, 0x77, 0x77, 0x77, 0xf7, 0x03, 0x00, 0x50, 0xbb, 0xbb, 0xbb, - 0xbb, 0x7b, 0x7f, 0x00, 0x50, 0xdf, 0xdd, 0xdd, 0xdd, 0xbd, 0xff, 0x07, - 0xe0, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00}; Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/src/flaps1.bmp and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/src/flaps1.bmp differ diff -Nru acm-5.0/src/flaps1.xbm acm-6.0+20200416/src/flaps1.xbm --- acm-5.0/src/flaps1.xbm 1990-07-19 17:47:32.000000000 +0000 +++ acm-6.0+20200416/src/flaps1.xbm 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ -#define flaps1_width 64 -#define flaps1_height 32 -#define flaps1_x_hot -1 -#define flaps1_y_hot -1 -static char flaps1_bits[] = { - 0x00, 0xf0, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x80, 0xde, 0xdd, 0xfd, - 0x1f, 0x00, 0x00, 0x00, 0x60, 0xef, 0xee, 0xee, 0xee, 0xff, 0x03, 0x00, - 0x70, 0x77, 0x77, 0x77, 0x77, 0xf7, 0x3f, 0x00, 0x58, 0xbb, 0xbb, 0xbb, - 0xbb, 0x7b, 0x01, 0x00, 0x48, 0xdf, 0xdd, 0xdd, 0xdd, 0x3d, 0x0f, 0x00, - 0xe8, 0xfe, 0xff, 0xff, 0xff, 0x9f, 0x3f, 0x00, 0x38, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x07, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00}; Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/src/flaps2.bmp and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/src/flaps2.bmp differ diff -Nru acm-5.0/src/flaps2.xbm acm-6.0+20200416/src/flaps2.xbm --- acm-5.0/src/flaps2.xbm 1990-07-19 17:49:31.000000000 +0000 +++ acm-6.0+20200416/src/flaps2.xbm 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ -#define flaps2_width 64 -#define flaps2_height 32 -#define flaps2_x_hot -1 -#define flaps2_y_hot -1 -static char flaps2_bits[] = { - 0x00, 0xf0, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xdd, 0xfd, - 0x1f, 0x00, 0x00, 0x00, 0x20, 0xef, 0xee, 0xee, 0xee, 0xff, 0x03, 0x00, - 0x30, 0x77, 0x77, 0x77, 0x77, 0xf7, 0x3f, 0x00, 0x38, 0xbb, 0xbb, 0xbb, - 0xbb, 0x7b, 0x00, 0x00, 0x28, 0xdf, 0xdd, 0xdd, 0xdd, 0x3d, 0x0e, 0x00, - 0x6c, 0xfe, 0xff, 0xff, 0xff, 0x1f, 0x1e, 0x00, 0x3c, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x3c, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00}; Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/src/flaps3.bmp and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/src/flaps3.bmp differ diff -Nru acm-5.0/src/flaps3.xbm acm-6.0+20200416/src/flaps3.xbm --- acm-5.0/src/flaps3.xbm 1990-07-19 19:55:50.000000000 +0000 +++ acm-6.0+20200416/src/flaps3.xbm 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ -#define flaps3_width 64 -#define flaps3_height 32 -#define flaps3_x_hot -1 -#define flaps3_y_hot -1 -static char flaps3_bits[] = { - 0x00, 0xf0, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xdd, 0xfd, - 0x1f, 0x00, 0x00, 0x00, 0x20, 0xef, 0xee, 0xee, 0xee, 0xff, 0x03, 0x00, - 0x30, 0x77, 0x77, 0x77, 0x77, 0xf7, 0x3f, 0x00, 0x38, 0xbb, 0xbb, 0xbb, - 0xbb, 0x7b, 0x00, 0x00, 0x28, 0xdf, 0xdd, 0xdd, 0xdd, 0x3d, 0x0c, 0x00, - 0x6c, 0xfe, 0xff, 0xff, 0xff, 0x1f, 0x3c, 0x00, 0x3c, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x38, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00}; diff -Nru acm-5.0/src/flaps.c acm-6.0+20200416/src/flaps.c --- acm-5.0/src/flaps.c 1998-05-12 03:43:03.000000000 +0000 +++ acm-6.0+20200416/src/flaps.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,175 +0,0 @@ -/* - * acm : an aerial combat simulator for X - * Copyright (C) 1991-1997 Riley Rainey - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 dated June, 1991. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. - */ - -#include "pm.h" - -int -flapsDown(craft * c) -{ - - c->flapSetting += 10.0 * pi / 180.0; - if (c->flapSetting > c->cinfo->maxFlap) - c->flapSetting = c->cinfo->maxFlap; - return 0; -} - -int -flapsUp(craft * c) -{ - - c->flapSetting -= 10.0 * pi / 180.0; - if (c->flapSetting < 0.0) - c->flapSetting = 0.0; - return 0; -} - -void -flapControl(craft * c) -{ - - double geardown; - - if (isFunctioning(c, SYS_FLAPS)) { - - if (c->flapSetting > c->curFlap) { - c->curFlap += c->cinfo->flapRate * deltaT; - if (c->curFlap > c->flapSetting) - c->curFlap = c->flapSetting; - } - else if (c->flapSetting < c->curFlap) { - c->curFlap -= c->cinfo->flapRate * deltaT; - if (c->curFlap < c->flapSetting) - c->curFlap = c->flapSetting; - } - } - - if (isFunctioning(c, SYS_SPEEDBRAKE)) { - - if (c->speedBrakeSetting > c->curSpeedBrake) { - c->curSpeedBrake += c->cinfo->speedBrakeRate * deltaT; - if (c->curSpeedBrake > c->speedBrakeSetting) - c->curSpeedBrake = c->speedBrakeSetting; - } - else if (c->speedBrakeSetting < c->curSpeedBrake) { - c->curSpeedBrake -= c->cinfo->speedBrakeRate * deltaT; - if (c->curSpeedBrake < c->speedBrakeSetting) - c->curSpeedBrake = c->speedBrakeSetting; - } - } - - geardown = pi / 2.0; - - if (isFunctioning(c, SYS_NOSEGEAR)) { - if (c->flags & FL_GHANDLE_DN) { - if (c->curGear[0] != geardown) { - c->curGear[0] += c->cinfo->gearRate * deltaT; - if (c->curGear[0] > geardown) - c->curGear[0] = geardown; - c->flags &= ~FL_GEAR0_UP; - } - } - else { - if (c->curGear[0] != 0.0 && ((c->flags & FL_GND_CONTACT) == 0)) { - c->curGear[0] -= c->cinfo->gearRate * deltaT; - if (c->curGear[0] < 0.0) { - c->flags |= FL_GEAR0_UP; - c->curGear[0] = 0.0; - } - } - } - } - - if (isFunctioning(c, SYS_RIGHTMAIN)) { - if (c->flags & FL_GHANDLE_DN) { - if (c->curGear[1] != geardown) { - c->curGear[1] += c->cinfo->gearRate * deltaT; - if (c->curGear[1] > geardown) - c->curGear[1] = geardown; - c->flags &= ~FL_GEAR1_UP; - } - } - else { - if (c->curGear[1] != 0.0 && ((c->flags & FL_GND_CONTACT) == 0)) { - c->curGear[1] -= c->cinfo->gearRate * deltaT; - if (c->curGear[1] < 0.0) { - c->flags |= FL_GEAR1_UP; - c->curGear[1] = 0.0; - } - } - } - } - - if (isFunctioning(c, SYS_LEFTMAIN)) { - if (c->flags & FL_GHANDLE_DN) { - if (c->curGear[2] != geardown) { - c->curGear[2] += c->cinfo->gearRate * deltaT; - if (c->curGear[2] > geardown) - c->curGear[2] = geardown; - c->flags &= ~FL_GEAR2_UP; - } - } - else { - if (c->curGear[2] != 0.0 && ((c->flags & FL_GND_CONTACT) == 0)) { - c->curGear[2] -= c->cinfo->gearRate * deltaT; - if (c->curGear[2] < 0.0) { - c->flags |= FL_GEAR2_UP; - c->curGear[2] = 0.0; - } - } - } - } - -/* - * Set some status flags - */ - - if (c->fuel < (c->cinfo->maxFuel * 0.15)) - c->damageBits &= ~FLAG_LOWFUEL; - else - c->damageBits |= FLAG_LOWFUEL; - - if (c->flags & FL_BRAKES) - c->damageBits &= ~FLAG_WHEELBRAKE; - else - c->damageBits |= FLAG_WHEELBRAKE; - - if (c->speedBrakeSetting > 0.0) - c->damageBits &= ~FLAG_SPEEDBRAKE; - else - c->damageBits |= FLAG_SPEEDBRAKE; -} - -int -speedBrakeExtend(craft * c) -{ - - c->speedBrakeSetting += c->cinfo->speedBrakeIncr; - if (c->speedBrakeSetting > c->cinfo->maxSpeedBrake) - c->speedBrakeSetting = c->cinfo->maxSpeedBrake; - return 0; -} - -int -speedBrakeRetract(craft * c) -{ - - c->speedBrakeSetting -= c->cinfo->speedBrakeIncr; - if (c->speedBrakeSetting < 0.0) - c->speedBrakeSetting = 0.0; - return 0; -} diff -Nru acm-5.0/src/fpage.c acm-6.0+20200416/src/fpage.c --- acm-5.0/src/fpage.c 1998-08-18 13:45:03.000000000 +0000 +++ acm-6.0+20200416/src/fpage.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,201 +0,0 @@ -/* - * acm : an aerial combat simulator for X - * Copyright (C) 1991-1998 Riley Rainey - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 dated June, 1991. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. - */ - -#include -#include "pm.h" -#include -#ifdef AFDS -#include -#endif - -#define REF_X -1.3 -#define REF_Y -1.1 - -/* There's a bug lurking here, but for now ... */ - -#ifdef WIN32 -#define SCALE_1 5.0 -#else -#define SCALE_1 7.0 -#endif - -void doFSPage(craft * c, viewer * u); - -void -doFlightStatusPage(craft * c, viewer * u) -{ - - if (c->radarMode != RM_FSPAGE) - return; - - doFSPage(c, u); - return; - -} - -void -doFSPage(craft * c, viewer * u) -{ - - XSegment seg[2048], m_seg[256]; - char buf[256], buf1[256]; - XRectangle rect[1]; - int m_i = 0, i = 0, xc, yc, h, x, y; - int xscale, yscale, xoffset; - static ZInfo z; -#ifdef AFDS - AFDS_info *fd = c->flightDirector; -#endif - double yy; - - rect[0].x = u->rx; - rect[0].y = u->ry; - rect[0].width = u->radarWidth; - rect[0].height = u->radarWidth; - - z.depth = --u->v->depth; - z.color = (Color) (u->v->pixel[radarBackgroundColor->cIndex]); - FillRectangle(u->v->w, u->rx, u->ry, - u->radarWidth, u->radarWidth, &z); - - xoffset = (int) ((-15.0 * u->scaleFactor) + 0.5); - xc = u->rx + (u->radarWidth + 1) / 2; - yc = u->ry + (u->radarWidth + 1) / 2; - - - xscale = (int) (u->v->Scale.x / (SCALE_1 * 4)); - yscale = (int) (u->v->Scale.y / (SCALE_1 * 4)); - - h = (int) (11.0 * u->scaleFactor + 0.5); - - yy = 0.5; - - sprintf (buf, "G: %+.2f, %+.2f, %+.2f", c->G.x, c->G.y, c->G.z); - x = (int) (REF_X * u->v->Scale.x / (SCALE_1 * 4)); - y = (int) ((REF_Y + yy) * u->v->Scale.y / (SCALE_1 * 4)); - VDrawStrokeString(u->v, x + xc, y + yc, - buf, - strlen(buf), h, &u->z); - - yy += 0.2; - - sprintf (buf, "Sa Se Sr: %+.2f %+.2f %+.2f", c->Sa, c->Se, c->Sr); - x = (int) (REF_X * u->v->Scale.x / (SCALE_1 * 4)); - y = (int) ((REF_Y + yy) * u->v->Scale.y / (SCALE_1 * 4)); - VDrawStrokeString(u->v, x + xc, y + yc, - buf, - strlen(buf), h, &u->z); - yy += 0.2; - - sprintf (buf, "Angles: %+.0f, %+.0f, %+.0f", - RADtoDEG(c->curRoll), RADtoDEG(c->curPitch), RADtoDEG(c->curHeading)); - - x = (int) (REF_X * u->v->Scale.x / (SCALE_1 * 4)); - y = (int) ((REF_Y + yy) * u->v->Scale.y / (SCALE_1 * 4)); - VDrawStrokeString(u->v, x + xc, y + yc, - buf, - strlen(buf), h, &u->z); - yy += 0.2; - - sprintf (buf, "Rates: %+.1f, %+.1f, %+.1f ]", - RADtoDEG(c->p), RADtoDEG(c->q), RADtoDEG(- c->r)); - - x = (int) (REF_X * u->v->Scale.x / (SCALE_1 * 4)); - y = (int) ((REF_Y + yy) * u->v->Scale.y / (SCALE_1 * 4)); - VDrawStrokeString(u->v, x + xc, y + yc, - buf, - strlen(buf), h, &u->z); - yy += 0.2; - -#ifdef AFDS - sprintf (buf, "psiRef/Lambda: %+.1f, %+.2f", - fd->psiRef_deg, fd->lambda_deg); - - x = (int) (REF_X * u->v->Scale.x / (SCALE_1 * 4)); - y = (int) ((REF_Y + yy) * u->v->Scale.y / (SCALE_1 * 4)); - VDrawStrokeString(u->v, x + xc, y + yc, - buf, - strlen(buf), h, &u->z); - yy += 0.2; - - sprintf (buf, "psiCmd/Coupler:", - fd->psiCommand_deg, fd->x[AFDS_COUPLER_X1]); - - x = (int) (REF_X * u->v->Scale.x / (SCALE_1 * 4)); - y = (int) ((REF_Y + yy) * u->v->Scale.y / (SCALE_1 * 4)); - VDrawStrokeString(u->v, x + xc, y + yc, - buf, - strlen(buf), h, &u->z); - yy += 0.2; - - sprintf (buf, " %+.1f, %+.2f", - fd->psiCommand_deg, fd->x[AFDS_COUPLER_X1]); - - x = (int) (REF_X * u->v->Scale.x / (SCALE_1 * 4)); - y = (int) ((REF_Y + yy) * u->v->Scale.y / (SCALE_1 * 4)); - VDrawStrokeString(u->v, x + xc, y + yc, - buf, - strlen(buf), h, &u->z); - yy += 0.4; - - AFDSGetStatusString ( c, buf, sizeof(buf)); - - x = (int) (REF_X * u->v->Scale.x / (SCALE_1 * 4)); - y = (int) ((REF_Y + yy) * u->v->Scale.y / (SCALE_1 * 4)); - VDrawStrokeString(u->v, x + xc, y + yc, - buf, - strlen(buf), h, &u->z); -#endif /*AFDS*/ - - DISLatitudeToString(buf, c->w.latitude, LLM_DMS); - - yy = 0.0; - x = (int) (REF_X * u->v->Scale.x / (SCALE_1 * 4)); - y = (int) ((REF_Y + yy) * u->v->Scale.y / (SCALE_1 * 4)); - VDrawStrokeString(u->v, x + xc, y + yc, - buf, - strlen(buf), h, &u->z); - yy += 0.2; - - DISLongitudeToString(buf, c->w.longitude, LLM_DMS); - strcat (buf, " "); - sprintf (buf1, "%d m", (int)(c->w.z+0.5)); - strcat (buf, buf1); - - x = (int) (REF_X * u->v->Scale.x / (SCALE_1 * 4)); - y = (int) ((REF_Y + yy) * u->v->Scale.y / (SCALE_1 * 4)); - VDrawStrokeString(u->v, x + xc, y + yc, - buf, - strlen(buf), h, &u->z); - yy += 0.2; - - u->v->w->clip.x1 = rect[0].x; - u->v->w->clip.y1 = rect[0].y; - u->v->w->clip.x2 = rect[0].x + rect[0].width - 1; - u->v->w->clip.y2 = rect[0].y + rect[0].height - 1; - - VDrawSegments(u->v, m_seg, m_i, (Color) (u->v->pixel[HSIMagentaColor->cIndex])); - VDrawSegments(u->v, seg, i, (Color) (u->v->pixel[HUDPixel])); - - u->v->w->clip.x1 = 0; - u->v->w->clip.y1 = 0; - u->v->w->clip.x2 = u->v->w->width - 1; - u->v->w->clip.y2 = u->v->w->height - 1; - - return; -} diff -Nru acm-5.0/src/fsim.dsp acm-6.0+20200416/src/fsim.dsp --- acm-5.0/src/fsim.dsp 1998-08-14 14:59:16.000000000 +0000 +++ acm-6.0+20200416/src/fsim.dsp 1970-01-01 00:00:00.000000000 +0000 @@ -1,309 +0,0 @@ -# Microsoft Developer Studio Project File - Name="fsim" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 5.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Static Library" 0x0104 - -CFG=fsim - Win32 Release -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "fsim.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "fsim.mak" CFG="fsim - Win32 Release" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "fsim - Win32 Release" (based on "Win32 (x86) Static Library") -!MESSAGE "fsim - Win32 Debug" (based on "Win32 (x86) Static Library") -!MESSAGE - -# Begin Project -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe - -!IF "$(CFG)" == "fsim - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir ".\Release" -# PROP BASE Intermediate_Dir ".\Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir ".\Release" -# PROP Intermediate_Dir ".\Release" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c -# ADD CPP /nologo /W3 /GX /Ot /Oa /Ow /Oi /Op /Ob1 /I "..\V\lib" /I "." /I "..\dis" /I "c:\source\include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "HAVE_RAND" /D HAVE_STDLIB=1 /D HAVE_DIS=1 /D "_CTYPE_DISABLE_MACROS" /YX"pm.h" /FD /c -# SUBTRACT CPP /Ox /X -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo /out:"..\Release\fsim.lib" - -!ELSEIF "$(CFG)" == "fsim - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir ".\Debug" -# PROP BASE Intermediate_Dir ".\Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir ".\Debug" -# PROP Intermediate_Dir ".\Debug" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /Z7 /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c -# ADD CPP /nologo /W3 /GX /Z7 /Od /I "..\V\lib" /I "." /I "..\dis" /I "c:\source\include" /D "_WINDOWS" /D "HAVE_RAND" /D HAVE_STDLIB=1 /D HAVE_DIS=1 /D "_CTYPE_DISABLE_MACROS" /D "FLIGHTDEBUG" /D "_DEBUG" /D "WIN32" /YX"pm.h" /FD /c -# SUBTRACT CPP /X -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo /out:"..\Debug\fsim.lib" - -!ENDIF - -# Begin Target - -# Name "fsim - Win32 Release" -# Name "fsim - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;hpj;bat;for;f90" -# Begin Source File - -SOURCE=.\afds.c -# End Source File -# Begin Source File - -SOURCE=.\aim9m.c -# End Source File -# Begin Source File - -SOURCE=.\air.c -# End Source File -# Begin Source File - -SOURCE=.\alarm.c -# End Source File -# Begin Source File - -SOURCE=.\box.c -# End Source File -# Begin Source File - -SOURCE=.\damage.c -# End Source File -# Begin Source File - -SOURCE=.\dis_if.c -# End Source File -# Begin Source File - -SOURCE=.\drone.c -# End Source File -# Begin Source File - -SOURCE=.\effects.c -# End Source File -# Begin Source File - -SOURCE=.\flaps.c -# End Source File -# Begin Source File - -SOURCE=.\fpage.c -# End Source File -# Begin Source File - -SOURCE=.\fplan.c -# End Source File -# Begin Source File - -SOURCE=.\gear.c -# End Source File -# Begin Source File - -SOURCE=.\hsi.c -# End Source File -# Begin Source File - -SOURCE=.\hud.c -# End Source File -# Begin Source File - -SOURCE=.\imath.c -# End Source File -# Begin Source File - -SOURCE=.\init.c -# End Source File -# Begin Source File - -SOURCE=.\interpolate.c -# End Source File -# Begin Source File - -SOURCE=.\inventory.c -# End Source File -# Begin Source File - -SOURCE=.\m61a1.c -# End Source File -# Begin Source File - -SOURCE=.\missile.c -# End Source File -# Begin Source File - -SOURCE=.\missilec.c -# End Source File -# Begin Source File - -SOURCE=.\navaid.c -# End Source File -# Begin Source File - -SOURCE=.\panel.c -# End Source File -# Begin Source File - -SOURCE=.\place.c -# End Source File -# Begin Source File - -SOURCE=.\planes.c -# End Source File -# Begin Source File - -SOURCE=.\pm.c - -!IF "$(CFG)" == "fsim - Win32 Release" - -# ADD CPP /W4 - -!ELSEIF "$(CFG)" == "fsim - Win32 Debug" - -!ENDIF - -# End Source File -# Begin Source File - -SOURCE=.\radar.c -# End Source File -# Begin Source File - -SOURCE=.\redraw.c -# End Source File -# Begin Source File - -SOURCE=.\render.c -# End Source File -# Begin Source File - -SOURCE=.\resupply.c -# End Source File -# Begin Source File - -SOURCE=.\runway.c -# End Source File -# Begin Source File - -SOURCE=.\scale.c -# End Source File -# Begin Source File - -SOURCE=.\terrain.c -# End Source File -# Begin Source File - -SOURCE=.\transpose.c -# End Source File -# Begin Source File - -SOURCE=.\weapon.c -# End Source File -# Begin Source File - -SOURCE=.\windows.c -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl;fi;fd" -# Begin Source File - -SOURCE=.\afds.h -# End Source File -# Begin Source File - -SOURCE=.\alarm.h -# End Source File -# Begin Source File - -SOURCE=.\box.h -# End Source File -# Begin Source File - -SOURCE=.\damage.h -# End Source File -# Begin Source File - -SOURCE=.\deadreckon.h -# End Source File -# Begin Source File - -SOURCE=.\dis.h -# End Source File -# Begin Source File - -SOURCE=.\fplan.h -# End Source File -# Begin Source File - -SOURCE=.\horizon.h -# End Source File -# Begin Source File - -SOURCE=.\hsi.h -# End Source File -# Begin Source File - -SOURCE=.\imath.h -# End Source File -# Begin Source File - -SOURCE=.\interpolate.h -# End Source File -# Begin Source File - -SOURCE=.\manifest.h -# End Source File -# Begin Source File - -SOURCE=.\navaid.h -# End Source File -# Begin Source File - -SOURCE=.\pm.h -# End Source File -# Begin Source File - -SOURCE=.\scale.h -# End Source File -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe" -# End Group -# End Target -# End Project diff -Nru acm-5.0/src/fsim.dsw acm-6.0+20200416/src/fsim.dsw --- acm-5.0/src/fsim.dsw 1998-08-14 14:59:20.000000000 +0000 +++ acm-6.0+20200416/src/fsim.dsw 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ -Microsoft Developer Studio Workspace File, Format Version 5.00 -# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! - -############################################################################### - -Project: "fsim"=.\fsim.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Global: - -Package=<5> -{{{ -}}} - -Package=<3> -{{{ -}}} - -############################################################################### - diff -Nru acm-5.0/src/fsim.mak acm-6.0+20200416/src/fsim.mak --- acm-5.0/src/fsim.mak 1998-05-12 03:43:03.000000000 +0000 +++ acm-6.0+20200416/src/fsim.mak 1970-01-01 00:00:00.000000000 +0000 @@ -1,2179 +0,0 @@ -# Microsoft Developer Studio Generated NMAKE File, Format Version 4.20 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Static Library" 0x0104 - -!IF "$(CFG)" == "" -CFG=fsim - Win32 Debug -!MESSAGE No configuration specified. Defaulting to fsim - Win32 Debug. -!ENDIF - -!IF "$(CFG)" != "fsim - Win32 Release" && "$(CFG)" != "fsim - Win32 Debug" -!MESSAGE Invalid configuration "$(CFG)" specified. -!MESSAGE You can specify a configuration when running NMAKE on this makefile -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "fsim.mak" CFG="fsim - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "fsim - Win32 Release" (based on "Win32 (x86) Static Library") -!MESSAGE "fsim - Win32 Debug" (based on "Win32 (x86) Static Library") -!MESSAGE -!ERROR An invalid configuration is specified. -!ENDIF - -!IF "$(OS)" == "Windows_NT" -NULL= -!ELSE -NULL=nul -!ENDIF -################################################################################ -# Begin Project -# PROP Target_Last_Scanned "fsim - Win32 Debug" -CPP=cl.exe - -!IF "$(CFG)" == "fsim - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Target_Dir "" -OUTDIR=.\Release -INTDIR=.\Release - -ALL : "..\Release\fsim.lib" - -CLEAN : - -@erase "$(INTDIR)\aim9m.obj" - -@erase "$(INTDIR)\air.obj" - -@erase "$(INTDIR)\alarm.obj" - -@erase "$(INTDIR)\audio.obj" - -@erase "$(INTDIR)\box.obj" - -@erase "$(INTDIR)\damage.obj" - -@erase "$(INTDIR)\deadreckon.obj" - -@erase "$(INTDIR)\dis_if.obj" - -@erase "$(INTDIR)\drone.obj" - -@erase "$(INTDIR)\effects.obj" - -@erase "$(INTDIR)\flaps.obj" - -@erase "$(INTDIR)\gear.obj" - -@erase "$(INTDIR)\hsi.obj" - -@erase "$(INTDIR)\hud.obj" - -@erase "$(INTDIR)\imath.obj" - -@erase "$(INTDIR)\init.obj" - -@erase "$(INTDIR)\interpolate.obj" - -@erase "$(INTDIR)\inventory.obj" - -@erase "$(INTDIR)\m61a1.obj" - -@erase "$(INTDIR)\missile.obj" - -@erase "$(INTDIR)\missilec.obj" - -@erase "$(INTDIR)\navaid.obj" - -@erase "$(INTDIR)\panel.obj" - -@erase "$(INTDIR)\place.obj" - -@erase "$(INTDIR)\planes.obj" - -@erase "$(INTDIR)\pm.obj" - -@erase "$(INTDIR)\radar.obj" - -@erase "$(INTDIR)\render.obj" - -@erase "$(INTDIR)\resupply.obj" - -@erase "$(INTDIR)\scale.obj" - -@erase "$(INTDIR)\terrain.obj" - -@erase "$(INTDIR)\transpose.obj" - -@erase "$(INTDIR)\weapon.obj" - -@erase "$(INTDIR)\windows.obj" - -@erase "..\Release\fsim.lib" - -"$(OUTDIR)" : - if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" - -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c -# ADD CPP /nologo /W3 /GX /O2 /I "..\V\lib" /I "." /I "..\dis" /I "c:\msdev\include" /I "c:\source\include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "HAVE_RAND" /D HAVE_STDLIB=1 /D HAVE_DIS=1 /D "_CTYPE_DISABLE_MACROS" /D "FLIGHTDEBUG" /YX"pm.h" /c -# SUBTRACT CPP /X -CPP_PROJ=/nologo /ML /W3 /GX /O2 /I "..\V\lib" /I "." /I "..\dis" /I\ - "c:\msdev\include" /I "c:\source\include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS"\ - /D "HAVE_RAND" /D HAVE_STDLIB=1 /D HAVE_DIS=1 /D "_CTYPE_DISABLE_MACROS" /D\ - "FLIGHTDEBUG" /Fp"$(INTDIR)/fsim.pch" /YX"pm.h" /Fo"$(INTDIR)/" /c -CPP_OBJS=.\Release/ -CPP_SBRS=.\. -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -BSC32_FLAGS=/nologo /o"$(OUTDIR)/fsim.bsc" -BSC32_SBRS= \ - -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo /out:"..\Release\fsim.lib" -LIB32_FLAGS=/nologo /out:"..\Release\fsim.lib" -LIB32_OBJS= \ - "$(INTDIR)\aim9m.obj" \ - "$(INTDIR)\air.obj" \ - "$(INTDIR)\alarm.obj" \ - "$(INTDIR)\audio.obj" \ - "$(INTDIR)\box.obj" \ - "$(INTDIR)\damage.obj" \ - "$(INTDIR)\deadreckon.obj" \ - "$(INTDIR)\dis_if.obj" \ - "$(INTDIR)\drone.obj" \ - "$(INTDIR)\effects.obj" \ - "$(INTDIR)\flaps.obj" \ - "$(INTDIR)\gear.obj" \ - "$(INTDIR)\hsi.obj" \ - "$(INTDIR)\hud.obj" \ - "$(INTDIR)\imath.obj" \ - "$(INTDIR)\init.obj" \ - "$(INTDIR)\interpolate.obj" \ - "$(INTDIR)\inventory.obj" \ - "$(INTDIR)\m61a1.obj" \ - "$(INTDIR)\missile.obj" \ - "$(INTDIR)\missilec.obj" \ - "$(INTDIR)\navaid.obj" \ - "$(INTDIR)\panel.obj" \ - "$(INTDIR)\place.obj" \ - "$(INTDIR)\planes.obj" \ - "$(INTDIR)\pm.obj" \ - "$(INTDIR)\radar.obj" \ - "$(INTDIR)\render.obj" \ - "$(INTDIR)\resupply.obj" \ - "$(INTDIR)\scale.obj" \ - "$(INTDIR)\terrain.obj" \ - "$(INTDIR)\transpose.obj" \ - "$(INTDIR)\weapon.obj" \ - "$(INTDIR)\windows.obj" - -"..\Release\fsim.lib" : "$(OUTDIR)" $(DEF_FILE) $(LIB32_OBJS) - $(LIB32) @<< - $(LIB32_FLAGS) $(DEF_FLAGS) $(LIB32_OBJS) -<< - -!ELSEIF "$(CFG)" == "fsim - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Target_Dir "" -OUTDIR=.\Debug -INTDIR=.\Debug - -ALL : "..\Debug\fsim.lib" - -CLEAN : - -@erase "$(INTDIR)\aim9m.obj" - -@erase "$(INTDIR)\air.obj" - -@erase "$(INTDIR)\alarm.obj" - -@erase "$(INTDIR)\audio.obj" - -@erase "$(INTDIR)\box.obj" - -@erase "$(INTDIR)\damage.obj" - -@erase "$(INTDIR)\deadreckon.obj" - -@erase "$(INTDIR)\dis_if.obj" - -@erase "$(INTDIR)\drone.obj" - -@erase "$(INTDIR)\effects.obj" - -@erase "$(INTDIR)\flaps.obj" - -@erase "$(INTDIR)\gear.obj" - -@erase "$(INTDIR)\hsi.obj" - -@erase "$(INTDIR)\hud.obj" - -@erase "$(INTDIR)\imath.obj" - -@erase "$(INTDIR)\init.obj" - -@erase "$(INTDIR)\interpolate.obj" - -@erase "$(INTDIR)\inventory.obj" - -@erase "$(INTDIR)\m61a1.obj" - -@erase "$(INTDIR)\missile.obj" - -@erase "$(INTDIR)\missilec.obj" - -@erase "$(INTDIR)\navaid.obj" - -@erase "$(INTDIR)\panel.obj" - -@erase "$(INTDIR)\place.obj" - -@erase "$(INTDIR)\planes.obj" - -@erase "$(INTDIR)\pm.obj" - -@erase "$(INTDIR)\radar.obj" - -@erase "$(INTDIR)\render.obj" - -@erase "$(INTDIR)\resupply.obj" - -@erase "$(INTDIR)\scale.obj" - -@erase "$(INTDIR)\terrain.obj" - -@erase "$(INTDIR)\transpose.obj" - -@erase "$(INTDIR)\weapon.obj" - -@erase "$(INTDIR)\windows.obj" - -@erase "..\Debug\fsim.lib" - -"$(OUTDIR)" : - if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" - -# ADD BASE CPP /nologo /W3 /GX /Z7 /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c -# ADD CPP /nologo /W3 /GX /Z7 /Od /I "..\V\lib" /I "." /I "..\dis" /I "c:\msdev\include" /I "c:\source\include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "HAVE_RAND" /D HAVE_STDLIB=1 /D HAVE_DIS=1 /D "_CTYPE_DISABLE_MACROS" /D "FLIGHTDEBUG" /YX"pm.h" /c -# SUBTRACT CPP /X -CPP_PROJ=/nologo /MLd /W3 /GX /Z7 /Od /I "..\V\lib" /I "." /I "..\dis" /I\ - "c:\msdev\include" /I "c:\source\include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS"\ - /D "HAVE_RAND" /D HAVE_STDLIB=1 /D HAVE_DIS=1 /D "_CTYPE_DISABLE_MACROS" /D\ - "FLIGHTDEBUG" /Fp"$(INTDIR)/fsim.pch" /YX"pm.h" /Fo"$(INTDIR)/" /c -CPP_OBJS=.\Debug/ -CPP_SBRS=.\. -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -BSC32_FLAGS=/nologo /o"$(OUTDIR)/fsim.bsc" -BSC32_SBRS= \ - -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo /out:"..\Debug\fsim.lib" -LIB32_FLAGS=/nologo /out:"..\Debug\fsim.lib" -LIB32_OBJS= \ - "$(INTDIR)\aim9m.obj" \ - "$(INTDIR)\air.obj" \ - "$(INTDIR)\alarm.obj" \ - "$(INTDIR)\audio.obj" \ - "$(INTDIR)\box.obj" \ - "$(INTDIR)\damage.obj" \ - "$(INTDIR)\deadreckon.obj" \ - "$(INTDIR)\dis_if.obj" \ - "$(INTDIR)\drone.obj" \ - "$(INTDIR)\effects.obj" \ - "$(INTDIR)\flaps.obj" \ - "$(INTDIR)\gear.obj" \ - "$(INTDIR)\hsi.obj" \ - "$(INTDIR)\hud.obj" \ - "$(INTDIR)\imath.obj" \ - "$(INTDIR)\init.obj" \ - "$(INTDIR)\interpolate.obj" \ - "$(INTDIR)\inventory.obj" \ - "$(INTDIR)\m61a1.obj" \ - "$(INTDIR)\missile.obj" \ - "$(INTDIR)\missilec.obj" \ - "$(INTDIR)\navaid.obj" \ - "$(INTDIR)\panel.obj" \ - "$(INTDIR)\place.obj" \ - "$(INTDIR)\planes.obj" \ - "$(INTDIR)\pm.obj" \ - "$(INTDIR)\radar.obj" \ - "$(INTDIR)\render.obj" \ - "$(INTDIR)\resupply.obj" \ - "$(INTDIR)\scale.obj" \ - "$(INTDIR)\terrain.obj" \ - "$(INTDIR)\transpose.obj" \ - "$(INTDIR)\weapon.obj" \ - "$(INTDIR)\windows.obj" - -"..\Debug\fsim.lib" : "$(OUTDIR)" $(DEF_FILE) $(LIB32_OBJS) - $(LIB32) @<< - $(LIB32_FLAGS) $(DEF_FLAGS) $(LIB32_OBJS) -<< - -!ENDIF - -.c{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.cpp{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.cxx{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.c{$(CPP_SBRS)}.sbr: - $(CPP) $(CPP_PROJ) $< - -.cpp{$(CPP_SBRS)}.sbr: - $(CPP) $(CPP_PROJ) $< - -.cxx{$(CPP_SBRS)}.sbr: - $(CPP) $(CPP_PROJ) $< - -################################################################################ -# Begin Target - -# Name "fsim - Win32 Release" -# Name "fsim - Win32 Debug" - -!IF "$(CFG)" == "fsim - Win32 Release" - -!ELSEIF "$(CFG)" == "fsim - Win32 Debug" - -!ENDIF - -################################################################################ -# Begin Source File - -SOURCE=.\weapon.c - -!IF "$(CFG)" == "fsim - Win32 Release" - -DEP_CPP_WEAPO=\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\V\lib\Alib.h"\ - "..\V\lib\Vlib.h"\ - ".\damage.h"\ - ".\imath.h"\ - ".\interpolate.h"\ - ".\manifest.h"\ - ".\pm.h"\ - ".\scale.h"\ - - -"$(INTDIR)\weapon.obj" : $(SOURCE) $(DEP_CPP_WEAPO) "$(INTDIR)" - - -!ELSEIF "$(CFG)" == "fsim - Win32 Debug" - -DEP_CPP_WEAPO=\ - "..\dis\dis/datum.h"\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\dis\dis/disenum2.h"\ - "..\dis\dis/disenum3.h"\ - "..\dis\dis/disp.h"\ - "..\dis\dis/simx.h"\ - "..\V\lib\Alib.h"\ - "..\V\lib\Vlib.h"\ - ".\damage.h"\ - ".\imath.h"\ - ".\interpolate.h"\ - ".\manifest.h"\ - ".\navaid.h"\ - ".\pm.h"\ - ".\scale.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\weapon.obj" : $(SOURCE) $(DEP_CPP_WEAPO) "$(INTDIR)" - - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\air.c - -"$(INTDIR)\air.obj" : $(SOURCE) "$(INTDIR)" - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\alarm.c -DEP_CPP_ALARM=\ - ".\alarm.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\machine\endian.h"\ - "\source\include\machine\limits.h"\ - "\source\include\machine\param.h"\ - "\source\include\machine\signal.h"\ - "\source\include\machine\trap.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\errno.h"\ - "\source\include\sys\param.h"\ - "\source\include\sys\resource.h"\ - "\source\include\sys\signal.h"\ - "\source\include\sys\syslimits.h"\ - "\source\include\sys\time.h"\ - "\source\include\sys\ucred.h"\ - "\source\include\sys\uio.h"\ - - -"$(INTDIR)\alarm.obj" : $(SOURCE) $(DEP_CPP_ALARM) "$(INTDIR)" - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\box.c - -!IF "$(CFG)" == "fsim - Win32 Release" - -DEP_CPP_BOX_C=\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\V\lib\Alib.h"\ - "..\V\lib\Vlib.h"\ - ".\box.h"\ - ".\damage.h"\ - ".\imath.h"\ - ".\interpolate.h"\ - ".\manifest.h"\ - ".\pm.h"\ - ".\scale.h"\ - - -"$(INTDIR)\box.obj" : $(SOURCE) $(DEP_CPP_BOX_C) "$(INTDIR)" - - -!ELSEIF "$(CFG)" == "fsim - Win32 Debug" - -DEP_CPP_BOX_C=\ - "..\dis\dis/datum.h"\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\dis\dis/disenum2.h"\ - "..\dis\dis/disenum3.h"\ - "..\dis\dis/disp.h"\ - "..\dis\dis/simx.h"\ - "..\V\lib\Alib.h"\ - "..\V\lib\Vlib.h"\ - ".\box.h"\ - ".\damage.h"\ - ".\imath.h"\ - ".\interpolate.h"\ - ".\manifest.h"\ - ".\navaid.h"\ - ".\pm.h"\ - ".\scale.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\box.obj" : $(SOURCE) $(DEP_CPP_BOX_C) "$(INTDIR)" - - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\damage.c - -!IF "$(CFG)" == "fsim - Win32 Release" - -DEP_CPP_DAMAG=\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\V\lib\Alib.h"\ - "..\V\lib\Vlib.h"\ - ".\damage.h"\ - ".\imath.h"\ - ".\interpolate.h"\ - ".\manifest.h"\ - ".\pm.h"\ - ".\scale.h"\ - - -"$(INTDIR)\damage.obj" : $(SOURCE) $(DEP_CPP_DAMAG) "$(INTDIR)" - - -!ELSEIF "$(CFG)" == "fsim - Win32 Debug" - -DEP_CPP_DAMAG=\ - "..\dis\dis/datum.h"\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\dis\dis/disenum2.h"\ - "..\dis\dis/disenum3.h"\ - "..\dis\dis/disp.h"\ - "..\dis\dis/simx.h"\ - "..\V\lib\Alib.h"\ - "..\V\lib\Vlib.h"\ - ".\damage.h"\ - ".\imath.h"\ - ".\interpolate.h"\ - ".\manifest.h"\ - ".\navaid.h"\ - ".\pm.h"\ - ".\scale.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\damage.obj" : $(SOURCE) $(DEP_CPP_DAMAG) "$(INTDIR)" - - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\deadreckon.c -DEP_CPP_DEADR=\ - ".\deadreckon.h"\ - - -"$(INTDIR)\deadreckon.obj" : $(SOURCE) $(DEP_CPP_DEADR) "$(INTDIR)" - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\dis_if.c - -!IF "$(CFG)" == "fsim - Win32 Release" - -DEP_CPP_DIS_I=\ - "..\dis\dis/datum.h"\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\dis\dis/disenum2.h"\ - "..\dis\dis/disenum3.h"\ - "..\dis\dis/disp.h"\ - "..\dis\dis/simx.h"\ - ".\deadreckon.h"\ - ".\dis.h"\ - ".\pm.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\dis_if.obj" : $(SOURCE) $(DEP_CPP_DIS_I) "$(INTDIR)" - - -!ELSEIF "$(CFG)" == "fsim - Win32 Debug" - -DEP_CPP_DIS_I=\ - "..\dis\dis/datum.h"\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\dis\dis/disenum2.h"\ - "..\dis\dis/disenum3.h"\ - "..\dis\dis/disp.h"\ - "..\dis\dis/simx.h"\ - "..\V\lib\Alib.h"\ - "..\V\lib\Vlib.h"\ - ".\damage.h"\ - ".\deadreckon.h"\ - ".\dis.h"\ - ".\imath.h"\ - ".\interpolate.h"\ - ".\manifest.h"\ - ".\navaid.h"\ - ".\pm.h"\ - ".\scale.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\dis_if.obj" : $(SOURCE) $(DEP_CPP_DIS_I) "$(INTDIR)" - - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\drone.c - -!IF "$(CFG)" == "fsim - Win32 Release" - -DEP_CPP_DRONE=\ - "..\dis\dis/datum.h"\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\dis\dis/disenum2.h"\ - "..\dis\dis/disenum3.h"\ - "..\dis\dis/disp.h"\ - "..\dis\dis/simx.h"\ - "..\V\lib\Alib.h"\ - "..\V\lib\Vlib.h"\ - ".\alarm.h"\ - ".\damage.h"\ - ".\imath.h"\ - ".\interpolate.h"\ - ".\manifest.h"\ - ".\pm.h"\ - ".\scale.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\drone.obj" : $(SOURCE) $(DEP_CPP_DRONE) "$(INTDIR)" - - -!ELSEIF "$(CFG)" == "fsim - Win32 Debug" - -DEP_CPP_DRONE=\ - "..\dis\dis/datum.h"\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\dis\dis/disenum2.h"\ - "..\dis\dis/disenum3.h"\ - "..\dis\dis/disp.h"\ - "..\dis\dis/simx.h"\ - "..\V\lib\Alib.h"\ - "..\V\lib\Vlib.h"\ - ".\alarm.h"\ - ".\damage.h"\ - ".\imath.h"\ - ".\interpolate.h"\ - ".\manifest.h"\ - ".\navaid.h"\ - ".\pm.h"\ - ".\scale.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\drone.obj" : $(SOURCE) $(DEP_CPP_DRONE) "$(INTDIR)" - - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\effects.c -DEP_CPP_EFFEC=\ - "..\dis\dis/datum.h"\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\dis\dis/disenum2.h"\ - "..\dis\dis/disenum3.h"\ - "..\dis\dis/disp.h"\ - "..\dis\dis/simx.h"\ - "..\V\lib\Alib.h"\ - "..\V\lib\Vlib.h"\ - ".\damage.h"\ - ".\imath.h"\ - ".\interpolate.h"\ - ".\manifest.h"\ - ".\navaid.h"\ - ".\pm.h"\ - ".\scale.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\effects.obj" : $(SOURCE) $(DEP_CPP_EFFEC) "$(INTDIR)" - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\flaps.c - -!IF "$(CFG)" == "fsim - Win32 Release" - -DEP_CPP_FLAPS=\ - "..\dis\dis/datum.h"\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\dis\dis/disenum2.h"\ - "..\dis\dis/disenum3.h"\ - "..\dis\dis/disp.h"\ - "..\dis\dis/simx.h"\ - "..\V\lib\Alib.h"\ - "..\V\lib\Vlib.h"\ - ".\damage.h"\ - ".\imath.h"\ - ".\interpolate.h"\ - ".\manifest.h"\ - ".\pm.h"\ - ".\scale.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\flaps.obj" : $(SOURCE) $(DEP_CPP_FLAPS) "$(INTDIR)" - - -!ELSEIF "$(CFG)" == "fsim - Win32 Debug" - -DEP_CPP_FLAPS=\ - "..\dis\dis/datum.h"\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\dis\dis/disenum2.h"\ - "..\dis\dis/disenum3.h"\ - "..\dis\dis/disp.h"\ - "..\dis\dis/simx.h"\ - "..\V\lib\Alib.h"\ - "..\V\lib\Vlib.h"\ - ".\damage.h"\ - ".\imath.h"\ - ".\interpolate.h"\ - ".\manifest.h"\ - ".\navaid.h"\ - ".\pm.h"\ - ".\scale.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\flaps.obj" : $(SOURCE) $(DEP_CPP_FLAPS) "$(INTDIR)" - - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\gear.c - -!IF "$(CFG)" == "fsim - Win32 Release" - -DEP_CPP_GEAR_=\ - "..\dis\dis/datum.h"\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\dis\dis/disenum2.h"\ - "..\dis\dis/disenum3.h"\ - "..\dis\dis/disp.h"\ - "..\dis\dis/simx.h"\ - "..\V\lib\Alib.h"\ - "..\V\lib\Vlib.h"\ - ".\damage.h"\ - ".\imath.h"\ - ".\interpolate.h"\ - ".\manifest.h"\ - ".\pm.h"\ - ".\scale.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - - -"$(INTDIR)\gear.obj" : $(SOURCE) $(DEP_CPP_GEAR_) "$(INTDIR)" - - -!ELSEIF "$(CFG)" == "fsim - Win32 Debug" - -DEP_CPP_GEAR_=\ - "..\dis\dis/datum.h"\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\dis\dis/disenum2.h"\ - "..\dis\dis/disenum3.h"\ - "..\dis\dis/disp.h"\ - "..\dis\dis/simx.h"\ - "..\V\lib\Alib.h"\ - "..\V\lib\Vlib.h"\ - ".\damage.h"\ - ".\imath.h"\ - ".\interpolate.h"\ - ".\manifest.h"\ - ".\navaid.h"\ - ".\pm.h"\ - ".\scale.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\gear.obj" : $(SOURCE) $(DEP_CPP_GEAR_) "$(INTDIR)" - - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\hsi.c - -!IF "$(CFG)" == "fsim - Win32 Release" - -DEP_CPP_HSI_C=\ - "..\dis\dis/datum.h"\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\dis\dis/disenum2.h"\ - "..\dis\dis/disenum3.h"\ - "..\dis\dis/disp.h"\ - "..\dis\dis/simx.h"\ - "..\V\lib\Alib.h"\ - "..\V\lib\VFont.h"\ - "..\V\lib\Vlib.h"\ - ".\damage.h"\ - ".\hsi.h"\ - ".\imath.h"\ - ".\interpolate.h"\ - ".\manifest.h"\ - ".\pm.h"\ - ".\scale.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\hsi.obj" : $(SOURCE) $(DEP_CPP_HSI_C) "$(INTDIR)" - - -!ELSEIF "$(CFG)" == "fsim - Win32 Debug" - -DEP_CPP_HSI_C=\ - "..\dis\dis/datum.h"\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\dis\dis/disenum2.h"\ - "..\dis\dis/disenum3.h"\ - "..\dis\dis/disp.h"\ - "..\dis\dis/simx.h"\ - "..\V\lib\Alib.h"\ - "..\V\lib\VFont.h"\ - "..\V\lib\Vlib.h"\ - ".\damage.h"\ - ".\hsi.h"\ - ".\imath.h"\ - ".\interpolate.h"\ - ".\manifest.h"\ - ".\navaid.h"\ - ".\pm.h"\ - ".\scale.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\hsi.obj" : $(SOURCE) $(DEP_CPP_HSI_C) "$(INTDIR)" - - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\hud.c - -!IF "$(CFG)" == "fsim - Win32 Release" - -DEP_CPP_HUD_C=\ - "..\V\lib\VFont.h"\ - ".\horizon.h"\ - ".\pm.h"\ - - -"$(INTDIR)\hud.obj" : $(SOURCE) $(DEP_CPP_HUD_C) "$(INTDIR)" - - -!ELSEIF "$(CFG)" == "fsim - Win32 Debug" - -DEP_CPP_HUD_C=\ - "..\dis\dis/datum.h"\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\dis\dis/disenum2.h"\ - "..\dis\dis/disenum3.h"\ - "..\dis\dis/disp.h"\ - "..\dis\dis/simx.h"\ - "..\V\lib\Alib.h"\ - "..\V\lib\VFont.h"\ - "..\V\lib\Vlib.h"\ - ".\damage.h"\ - ".\horizon.h"\ - ".\imath.h"\ - ".\interpolate.h"\ - ".\manifest.h"\ - ".\navaid.h"\ - ".\pm.h"\ - ".\scale.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\hud.obj" : $(SOURCE) $(DEP_CPP_HUD_C) "$(INTDIR)" - - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\imath.c -DEP_CPP_IMATH=\ - "..\V\lib\Alib.h"\ - "..\V\lib\Vlib.h"\ - ".\imath.h"\ - - -"$(INTDIR)\imath.obj" : $(SOURCE) $(DEP_CPP_IMATH) "$(INTDIR)" - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\interpolate.c -DEP_CPP_INTER=\ - ".\interpolate.h"\ - - -"$(INTDIR)\interpolate.obj" : $(SOURCE) $(DEP_CPP_INTER) "$(INTDIR)" - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\inventory.c - -!IF "$(CFG)" == "fsim - Win32 Release" - -DEP_CPP_INVEN=\ - "..\dis\dis/datum.h"\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\dis\dis/disenum2.h"\ - "..\dis\dis/disenum3.h"\ - "..\dis\dis/disp.h"\ - "..\dis\dis/simx.h"\ - "..\V\lib\Alib.h"\ - "..\V\lib\Vlib.h"\ - ".\damage.h"\ - ".\imath.h"\ - ".\interpolate.h"\ - ".\manifest.h"\ - ".\pm.h"\ - ".\scale.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\inventory.obj" : $(SOURCE) $(DEP_CPP_INVEN) "$(INTDIR)" - - -!ELSEIF "$(CFG)" == "fsim - Win32 Debug" - -DEP_CPP_INVEN=\ - "..\dis\dis/datum.h"\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\dis\dis/disenum2.h"\ - "..\dis\dis/disenum3.h"\ - "..\dis\dis/disp.h"\ - "..\dis\dis/simx.h"\ - "..\V\lib\Alib.h"\ - "..\V\lib\Vlib.h"\ - ".\damage.h"\ - ".\imath.h"\ - ".\interpolate.h"\ - ".\manifest.h"\ - ".\navaid.h"\ - ".\pm.h"\ - ".\scale.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\inventory.obj" : $(SOURCE) $(DEP_CPP_INVEN) "$(INTDIR)" - - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\m61a1.c - -!IF "$(CFG)" == "fsim - Win32 Release" - -DEP_CPP_M61A1=\ - "..\dis\dis/datum.h"\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\dis\dis/disenum2.h"\ - "..\dis\dis/disenum3.h"\ - "..\dis\dis/disp.h"\ - "..\dis\dis/simx.h"\ - "..\V\lib\Alib.h"\ - "..\V\lib\Vlib.h"\ - ".\damage.h"\ - ".\dis.h"\ - ".\imath.h"\ - ".\interpolate.h"\ - ".\manifest.h"\ - ".\pm.h"\ - ".\scale.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\m61a1.obj" : $(SOURCE) $(DEP_CPP_M61A1) "$(INTDIR)" - - -!ELSEIF "$(CFG)" == "fsim - Win32 Debug" - -DEP_CPP_M61A1=\ - "..\dis\dis/datum.h"\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\dis\dis/disenum2.h"\ - "..\dis\dis/disenum3.h"\ - "..\dis\dis/disp.h"\ - "..\dis\dis/simx.h"\ - "..\V\lib\Alib.h"\ - "..\V\lib\Vlib.h"\ - ".\damage.h"\ - ".\dis.h"\ - ".\imath.h"\ - ".\interpolate.h"\ - ".\manifest.h"\ - ".\navaid.h"\ - ".\pm.h"\ - ".\scale.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\m61a1.obj" : $(SOURCE) $(DEP_CPP_M61A1) "$(INTDIR)" - - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\missile.c -DEP_CPP_MISSI=\ - "..\dis\dis/datum.h"\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\dis\dis/disenum2.h"\ - "..\dis\dis/disenum3.h"\ - "..\dis\dis/disp.h"\ - "..\dis\dis/simx.h"\ - "..\V\lib\Alib.h"\ - "..\V\lib\Vlib.h"\ - ".\damage.h"\ - ".\dis.h"\ - ".\imath.h"\ - ".\interpolate.h"\ - ".\manifest.h"\ - ".\navaid.h"\ - ".\pm.h"\ - ".\scale.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\missile.obj" : $(SOURCE) $(DEP_CPP_MISSI) "$(INTDIR)" - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\missilec.c - -!IF "$(CFG)" == "fsim - Win32 Release" - -DEP_CPP_MISSIL=\ - "..\dis\dis/datum.h"\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\dis\dis/disenum2.h"\ - "..\dis\dis/disenum3.h"\ - "..\dis\dis/disp.h"\ - "..\dis\dis/simx.h"\ - "..\V\lib\Alib.h"\ - "..\V\lib\Vlib.h"\ - ".\damage.h"\ - ".\imath.h"\ - ".\interpolate.h"\ - ".\manifest.h"\ - ".\pm.h"\ - ".\scale.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\missilec.obj" : $(SOURCE) $(DEP_CPP_MISSIL) "$(INTDIR)" - - -!ELSEIF "$(CFG)" == "fsim - Win32 Debug" - -DEP_CPP_MISSIL=\ - "..\dis\dis/datum.h"\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\dis\dis/disenum2.h"\ - "..\dis\dis/disenum3.h"\ - "..\dis\dis/disp.h"\ - "..\dis\dis/simx.h"\ - "..\V\lib\Alib.h"\ - "..\V\lib\Vlib.h"\ - ".\damage.h"\ - ".\imath.h"\ - ".\interpolate.h"\ - ".\manifest.h"\ - ".\navaid.h"\ - ".\pm.h"\ - ".\scale.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\missilec.obj" : $(SOURCE) $(DEP_CPP_MISSIL) "$(INTDIR)" - - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\navaid.c - -!IF "$(CFG)" == "fsim - Win32 Release" - -DEP_CPP_NAVAI=\ - "..\dis\dis/datum.h"\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\dis\dis/disenum2.h"\ - "..\dis\dis/disenum3.h"\ - "..\dis\dis/disp.h"\ - "..\dis\dis/simx.h"\ - "..\V\lib\Alib.h"\ - "..\V\lib\Vlib.h"\ - ".\alarm.h"\ - ".\damage.h"\ - ".\imath.h"\ - ".\interpolate.h"\ - ".\manifest.h"\ - ".\pm.h"\ - ".\scale.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\navaid.obj" : $(SOURCE) $(DEP_CPP_NAVAI) "$(INTDIR)" - - -!ELSEIF "$(CFG)" == "fsim - Win32 Debug" - -DEP_CPP_NAVAI=\ - "..\dis\dis/datum.h"\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\dis\dis/disenum2.h"\ - "..\dis\dis/disenum3.h"\ - "..\dis\dis/disp.h"\ - "..\dis\dis/simx.h"\ - "..\V\lib\Alib.h"\ - "..\V\lib\Vlib.h"\ - ".\alarm.h"\ - ".\damage.h"\ - ".\imath.h"\ - ".\interpolate.h"\ - ".\manifest.h"\ - ".\navaid.h"\ - ".\pm.h"\ - ".\scale.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\navaid.obj" : $(SOURCE) $(DEP_CPP_NAVAI) "$(INTDIR)" - - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\panel.c - -!IF "$(CFG)" == "fsim - Win32 Release" - -DEP_CPP_PANEL=\ - "..\dis\dis/datum.h"\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\dis\dis/disenum2.h"\ - "..\dis\dis/disenum3.h"\ - "..\dis\dis/disp.h"\ - "..\dis\dis/simx.h"\ - "..\V\lib\Alib.h"\ - "..\V\lib\Vlib.h"\ - ".\damage.h"\ - ".\imath.h"\ - ".\interpolate.h"\ - ".\manifest.h"\ - ".\pm.h"\ - ".\scale.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - {$(INCLUDE)}"\ddraw.h"\ - -NODEP_CPP_PANEL=\ - ".\bitmap.h"\ - - -"$(INTDIR)\panel.obj" : $(SOURCE) $(DEP_CPP_PANEL) "$(INTDIR)" - - -!ELSEIF "$(CFG)" == "fsim - Win32 Debug" - -DEP_CPP_PANEL=\ - "..\dis\dis/datum.h"\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\dis\dis/disenum2.h"\ - "..\dis\dis/disenum3.h"\ - "..\dis\dis/disp.h"\ - "..\dis\dis/simx.h"\ - "..\V\lib\Alib.h"\ - "..\V\lib\Vlib.h"\ - ".\damage.h"\ - ".\imath.h"\ - ".\interpolate.h"\ - ".\manifest.h"\ - ".\navaid.h"\ - ".\pm.h"\ - ".\scale.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - {$(INCLUDE)}"\ddraw.h"\ - -NODEP_CPP_PANEL=\ - ".\bitmap.h"\ - - -"$(INTDIR)\panel.obj" : $(SOURCE) $(DEP_CPP_PANEL) "$(INTDIR)" - - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\place.c - -!IF "$(CFG)" == "fsim - Win32 Release" - -DEP_CPP_PLACE=\ - "..\dis\dis/datum.h"\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\dis\dis/disenum2.h"\ - "..\dis\dis/disenum3.h"\ - "..\dis\dis/disp.h"\ - "..\dis\dis/simx.h"\ - "..\V\lib\Alib.h"\ - "..\V\lib\Vlib.h"\ - ".\damage.h"\ - ".\imath.h"\ - ".\interpolate.h"\ - ".\manifest.h"\ - ".\pm.h"\ - ".\scale.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\place.obj" : $(SOURCE) $(DEP_CPP_PLACE) "$(INTDIR)" - - -!ELSEIF "$(CFG)" == "fsim - Win32 Debug" - -DEP_CPP_PLACE=\ - "..\dis\dis/datum.h"\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\dis\dis/disenum2.h"\ - "..\dis\dis/disenum3.h"\ - "..\dis\dis/disp.h"\ - "..\dis\dis/simx.h"\ - "..\V\lib\Alib.h"\ - "..\V\lib\Vlib.h"\ - ".\damage.h"\ - ".\imath.h"\ - ".\interpolate.h"\ - ".\manifest.h"\ - ".\navaid.h"\ - ".\pm.h"\ - ".\scale.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\place.obj" : $(SOURCE) $(DEP_CPP_PLACE) "$(INTDIR)" - - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\pm.c - -!IF "$(CFG)" == "fsim - Win32 Release" - -DEP_CPP_PM_C2a=\ - "..\dis\dis/datum.h"\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\dis\dis/disenum2.h"\ - "..\dis\dis/disenum3.h"\ - "..\dis\dis/disp.h"\ - "..\dis\dis/simx.h"\ - "..\V\lib\Alib.h"\ - "..\V\lib\Vlib.h"\ - ".\damage.h"\ - ".\imath.h"\ - ".\interpolate.h"\ - ".\manifest.h"\ - ".\pm.h"\ - ".\scale.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\pm.obj" : $(SOURCE) $(DEP_CPP_PM_C2a) "$(INTDIR)" - - -!ELSEIF "$(CFG)" == "fsim - Win32 Debug" - -DEP_CPP_PM_C2a=\ - "..\dis\dis/datum.h"\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\dis\dis/disenum2.h"\ - "..\dis\dis/disenum3.h"\ - "..\dis\dis/disp.h"\ - "..\dis\dis/simx.h"\ - "..\V\lib\Alib.h"\ - "..\V\lib\Vlib.h"\ - ".\damage.h"\ - ".\imath.h"\ - ".\interpolate.h"\ - ".\manifest.h"\ - ".\navaid.h"\ - ".\pm.h"\ - ".\scale.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\pm.obj" : $(SOURCE) $(DEP_CPP_PM_C2a) "$(INTDIR)" - - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\radar.c - -!IF "$(CFG)" == "fsim - Win32 Release" - -DEP_CPP_RADAR=\ - "..\dis\dis/datum.h"\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\dis\dis/disenum2.h"\ - "..\dis\dis/disenum3.h"\ - "..\dis\dis/disp.h"\ - "..\dis\dis/simx.h"\ - "..\V\lib\Alib.h"\ - "..\V\lib\Vlib.h"\ - ".\damage.h"\ - ".\imath.h"\ - ".\interpolate.h"\ - ".\manifest.h"\ - ".\pm.h"\ - ".\scale.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - {$(INCLUDE)}"\ddraw.h"\ - - -"$(INTDIR)\radar.obj" : $(SOURCE) $(DEP_CPP_RADAR) "$(INTDIR)" - - -!ELSEIF "$(CFG)" == "fsim - Win32 Debug" - -DEP_CPP_RADAR=\ - "..\dis\dis/datum.h"\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\dis\dis/disenum2.h"\ - "..\dis\dis/disenum3.h"\ - "..\dis\dis/disp.h"\ - "..\dis\dis/simx.h"\ - "..\V\lib\Alib.h"\ - "..\V\lib\Vlib.h"\ - ".\damage.h"\ - ".\imath.h"\ - ".\interpolate.h"\ - ".\manifest.h"\ - ".\navaid.h"\ - ".\pm.h"\ - ".\scale.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - {$(INCLUDE)}"\ddraw.h"\ - - -"$(INTDIR)\radar.obj" : $(SOURCE) $(DEP_CPP_RADAR) "$(INTDIR)" - - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\render.c - -!IF "$(CFG)" == "fsim - Win32 Release" - -DEP_CPP_RENDE=\ - "..\dis\dis/datum.h"\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\dis\dis/disenum2.h"\ - "..\dis\dis/disenum3.h"\ - "..\dis\dis/disp.h"\ - "..\dis\dis/simx.h"\ - "..\V\lib\Alib.h"\ - "..\V\lib\Vlib.h"\ - ".\damage.h"\ - ".\imath.h"\ - ".\interpolate.h"\ - ".\manifest.h"\ - ".\pm.h"\ - ".\scale.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - {$(INCLUDE)}"\ddraw.h"\ - -NODEP_CPP_RENDE=\ - ".\bitmap.h"\ - - -"$(INTDIR)\render.obj" : $(SOURCE) $(DEP_CPP_RENDE) "$(INTDIR)" - - -!ELSEIF "$(CFG)" == "fsim - Win32 Debug" - -DEP_CPP_RENDE=\ - "..\dis\dis/datum.h"\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\dis\dis/disenum2.h"\ - "..\dis\dis/disenum3.h"\ - "..\dis\dis/disp.h"\ - "..\dis\dis/simx.h"\ - "..\V\lib\Alib.h"\ - "..\V\lib\Vlib.h"\ - ".\damage.h"\ - ".\imath.h"\ - ".\interpolate.h"\ - ".\manifest.h"\ - ".\navaid.h"\ - ".\pm.h"\ - ".\scale.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - {$(INCLUDE)}"\ddraw.h"\ - -NODEP_CPP_RENDE=\ - ".\bitmap.h"\ - - -"$(INTDIR)\render.obj" : $(SOURCE) $(DEP_CPP_RENDE) "$(INTDIR)" - - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\resupply.c - -!IF "$(CFG)" == "fsim - Win32 Release" - -DEP_CPP_RESUP=\ - "..\dis\dis/datum.h"\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\dis\dis/disenum2.h"\ - "..\dis\dis/disenum3.h"\ - "..\dis\dis/disp.h"\ - "..\dis\dis/simx.h"\ - "..\V\lib\Alib.h"\ - "..\V\lib\Vlib.h"\ - ".\alarm.h"\ - ".\damage.h"\ - ".\imath.h"\ - ".\interpolate.h"\ - ".\manifest.h"\ - ".\pm.h"\ - ".\scale.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\resupply.obj" : $(SOURCE) $(DEP_CPP_RESUP) "$(INTDIR)" - - -!ELSEIF "$(CFG)" == "fsim - Win32 Debug" - -DEP_CPP_RESUP=\ - "..\dis\dis/datum.h"\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\dis\dis/disenum2.h"\ - "..\dis\dis/disenum3.h"\ - "..\dis\dis/disp.h"\ - "..\dis\dis/simx.h"\ - "..\V\lib\Alib.h"\ - "..\V\lib\Vlib.h"\ - ".\alarm.h"\ - ".\damage.h"\ - ".\imath.h"\ - ".\interpolate.h"\ - ".\manifest.h"\ - ".\navaid.h"\ - ".\pm.h"\ - ".\scale.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\resupply.obj" : $(SOURCE) $(DEP_CPP_RESUP) "$(INTDIR)" - - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\scale.c -DEP_CPP_SCALE=\ - "..\V\lib\Alib.h"\ - "..\V\lib\Vlib.h"\ - ".\scale.h"\ - - -"$(INTDIR)\scale.obj" : $(SOURCE) $(DEP_CPP_SCALE) "$(INTDIR)" - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\terrain.c - -!IF "$(CFG)" == "fsim - Win32 Release" - -DEP_CPP_TERRA=\ - "..\dis\dis/datum.h"\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\dis\dis/disenum2.h"\ - "..\dis\dis/disenum3.h"\ - "..\dis\dis/disp.h"\ - "..\dis\dis/simx.h"\ - "..\V\lib\Alib.h"\ - "..\V\lib\Vlib.h"\ - ".\damage.h"\ - ".\imath.h"\ - ".\interpolate.h"\ - ".\manifest.h"\ - ".\pm.h"\ - ".\scale.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\terrain.obj" : $(SOURCE) $(DEP_CPP_TERRA) "$(INTDIR)" - - -!ELSEIF "$(CFG)" == "fsim - Win32 Debug" - -DEP_CPP_TERRA=\ - "..\dis\dis/datum.h"\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\dis\dis/disenum2.h"\ - "..\dis\dis/disenum3.h"\ - "..\dis\dis/disp.h"\ - "..\dis\dis/simx.h"\ - "..\V\lib\Alib.h"\ - "..\V\lib\Vlib.h"\ - ".\damage.h"\ - ".\imath.h"\ - ".\interpolate.h"\ - ".\manifest.h"\ - ".\navaid.h"\ - ".\pm.h"\ - ".\scale.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\terrain.obj" : $(SOURCE) $(DEP_CPP_TERRA) "$(INTDIR)" - - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\transpose.c -DEP_CPP_TRANS=\ - "..\V\lib\Alib.h"\ - "..\V\lib\Vlib.h"\ - - -"$(INTDIR)\transpose.obj" : $(SOURCE) $(DEP_CPP_TRANS) "$(INTDIR)" - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\aim9m.c - -!IF "$(CFG)" == "fsim - Win32 Release" - -DEP_CPP_AIM9M=\ - "..\dis\dis/datum.h"\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\dis\dis/disenum2.h"\ - "..\dis\dis/disenum3.h"\ - "..\dis\dis/disp.h"\ - "..\dis\dis/simx.h"\ - "..\V\lib\Alib.h"\ - "..\V\lib\Vlib.h"\ - ".\damage.h"\ - ".\imath.h"\ - ".\interpolate.h"\ - ".\manifest.h"\ - ".\pm.h"\ - ".\scale.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\aim9m.obj" : $(SOURCE) $(DEP_CPP_AIM9M) "$(INTDIR)" - - -!ELSEIF "$(CFG)" == "fsim - Win32 Debug" - -DEP_CPP_AIM9M=\ - "..\dis\dis/datum.h"\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\dis\dis/disenum2.h"\ - "..\dis\dis/disenum3.h"\ - "..\dis\dis/disp.h"\ - "..\dis\dis/simx.h"\ - "..\V\lib\Alib.h"\ - "..\V\lib\Vlib.h"\ - ".\damage.h"\ - ".\imath.h"\ - ".\interpolate.h"\ - ".\manifest.h"\ - ".\navaid.h"\ - ".\pm.h"\ - ".\scale.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\aim9m.obj" : $(SOURCE) $(DEP_CPP_AIM9M) "$(INTDIR)" - - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\planes.c - -!IF "$(CFG)" == "fsim - Win32 Release" - -DEP_CPP_PLANE=\ - "..\dis\dis/datum.h"\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\dis\dis/disenum2.h"\ - "..\dis\dis/disenum3.h"\ - "..\dis\dis/disp.h"\ - "..\dis\dis/simx.h"\ - "..\V\lib\Alib.h"\ - "..\V\lib\Vlib.h"\ - ".\damage.h"\ - ".\dis.h"\ - ".\imath.h"\ - ".\interpolate.h"\ - ".\manifest.h"\ - ".\pm.h"\ - ".\scale.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\planes.obj" : $(SOURCE) $(DEP_CPP_PLANE) "$(INTDIR)" - - -!ELSEIF "$(CFG)" == "fsim - Win32 Debug" - -DEP_CPP_PLANE=\ - "..\dis\dis/datum.h"\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\dis\dis/disenum2.h"\ - "..\dis\dis/disenum3.h"\ - "..\dis\dis/disp.h"\ - "..\dis\dis/simx.h"\ - "..\V\lib\Alib.h"\ - "..\V\lib\Vlib.h"\ - ".\damage.h"\ - ".\dis.h"\ - ".\imath.h"\ - ".\interpolate.h"\ - ".\manifest.h"\ - ".\navaid.h"\ - ".\pm.h"\ - ".\scale.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\planes.obj" : $(SOURCE) $(DEP_CPP_PLANE) "$(INTDIR)" - - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\audio.c - -!IF "$(CFG)" == "fsim - Win32 Release" - -DEP_CPP_AUDIO=\ - "..\dis\dis/datum.h"\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\dis\dis/disenum2.h"\ - "..\dis\dis/disenum3.h"\ - "..\dis\dis/disp.h"\ - "..\dis\dis/simx.h"\ - "..\V\lib\Alib.h"\ - "..\V\lib\Vlib.h"\ - ".\damage.h"\ - ".\imath.h"\ - ".\interpolate.h"\ - ".\manifest.h"\ - ".\pm.h"\ - ".\scale.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\audio.obj" : $(SOURCE) $(DEP_CPP_AUDIO) "$(INTDIR)" - - -!ELSEIF "$(CFG)" == "fsim - Win32 Debug" - -DEP_CPP_AUDIO=\ - "..\dis\dis/datum.h"\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\dis\dis/disenum2.h"\ - "..\dis\dis/disenum3.h"\ - "..\dis\dis/disp.h"\ - "..\dis\dis/simx.h"\ - "..\V\lib\Alib.h"\ - "..\V\lib\Vlib.h"\ - ".\damage.h"\ - ".\imath.h"\ - ".\interpolate.h"\ - ".\manifest.h"\ - ".\navaid.h"\ - ".\pm.h"\ - ".\scale.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\audio.obj" : $(SOURCE) $(DEP_CPP_AUDIO) "$(INTDIR)" - - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\init.c - -!IF "$(CFG)" == "fsim - Win32 Release" - -DEP_CPP_INIT_=\ - "..\dis\dis/datum.h"\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\dis\dis/disenum2.h"\ - "..\dis\dis/disenum3.h"\ - "..\dis\dis/disp.h"\ - "..\dis\dis/simx.h"\ - "..\V\lib\Alib.h"\ - "..\V\lib\Vlib.h"\ - ".\alarm.h"\ - ".\damage.h"\ - ".\imath.h"\ - ".\interpolate.h"\ - ".\manifest.h"\ - ".\pm.h"\ - ".\scale.h"\ - "\msdev\include\sys\stat.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\init.obj" : $(SOURCE) $(DEP_CPP_INIT_) "$(INTDIR)" - - -!ELSEIF "$(CFG)" == "fsim - Win32 Debug" - -DEP_CPP_INIT_=\ - "..\dis\dis/datum.h"\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\dis\dis/disenum2.h"\ - "..\dis\dis/disenum3.h"\ - "..\dis\dis/disp.h"\ - "..\dis\dis/simx.h"\ - "..\V\lib\Alib.h"\ - "..\V\lib\Vlib.h"\ - ".\alarm.h"\ - ".\damage.h"\ - ".\imath.h"\ - ".\interpolate.h"\ - ".\manifest.h"\ - ".\navaid.h"\ - ".\pm.h"\ - ".\scale.h"\ - "\msdev\include\sys\stat.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\init.obj" : $(SOURCE) $(DEP_CPP_INIT_) "$(INTDIR)" - - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\windows.c - -!IF "$(CFG)" == "fsim - Win32 Release" - -DEP_CPP_WINDO=\ - "..\dis\dis/datum.h"\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\dis\dis/disenum2.h"\ - "..\dis\dis/disenum3.h"\ - "..\dis\dis/disp.h"\ - "..\dis\dis/simx.h"\ - "..\V\lib\Alib.h"\ - "..\V\lib\Vlib.h"\ - ".\damage.h"\ - ".\imath.h"\ - ".\interpolate.h"\ - ".\manifest.h"\ - ".\pm.h"\ - ".\scale.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\windows.obj" : $(SOURCE) $(DEP_CPP_WINDO) "$(INTDIR)" - - -!ELSEIF "$(CFG)" == "fsim - Win32 Debug" - -DEP_CPP_WINDO=\ - "..\dis\dis/datum.h"\ - "..\dis\dis/dis.h"\ - "..\dis\dis/disenum.h"\ - "..\dis\dis/disenum2.h"\ - "..\dis\dis/disenum3.h"\ - "..\dis\dis/disp.h"\ - "..\dis\dis/simx.h"\ - "..\V\lib\Alib.h"\ - "..\V\lib\Vlib.h"\ - ".\damage.h"\ - ".\imath.h"\ - ".\interpolate.h"\ - ".\manifest.h"\ - ".\navaid.h"\ - ".\pm.h"\ - ".\scale.h"\ - "\msdev\include\sys\types.h"\ - "\source\include\byte.h"\ - "\source\include\netinet\in.h"\ - "\source\include\rpc\types.h"\ - "\source\include\rpc\xdr.h"\ - "\source\include\sys\cdefs.h"\ - "\source\include\sys\time.h"\ - - -"$(INTDIR)\windows.obj" : $(SOURCE) $(DEP_CPP_WINDO) "$(INTDIR)" - - -!ENDIF - -# End Source File -# End Target -# End Project -################################################################################ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/src/fsim.mdp and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/src/fsim.mdp differ diff -Nru acm-5.0/src/gear.c acm-6.0+20200416/src/gear.c --- acm-5.0/src/gear.c 1998-12-09 21:53:34.000000000 +0000 +++ acm-6.0+20200416/src/gear.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,648 +0,0 @@ -/* - * acm : an aerial combat simulator for X - * Copyright (C) 1991-1997 Riley Rainey - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 dated June, 1991. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. - */ -#include -#include -#include "pm.h" - -extern void euler(craft *); - -/* - * Determine the time, relative to the beginning of this time interval, - * that the landing gear first make contact with the ground. Return -1 - * if they don't during this interval. - */ - -#ifdef FLIGHTDEBUG -#define DEBUG1 -extern int debug; - -#endif - -double -groundContactTime(craft * c, VPoint * contactSg) -{ - register craftType *p = c->cinfo; - register double tm, tn; - VPoint v, s0, s0n, Sg, gear; - double local_z = 0.0; - -/* - * In this function, our computation of wheel position differs slightly - * with the one used in groundDynamics(). This can introduce a problem where - * this procedure thinks we are not in contact with the ground while - * groundDynamics() does. We'll define an error margin to prevent that - * condition. - */ -#define EPSILON 0.01 -#define geardown (M_PI / 2.0) - -#ifdef DEBUG1 - double cm, cn, cosTheta, sinTheta; - -#endif - - tm = tn = 2.0; - -#ifdef FLAT_WORLD - Sg = c->prevSg; - v.x = c->Sg.x - c->prevSg.x; - v.y = c->Sg.y - c->prevSg.y; - v.z = c->Sg.z - c->prevSg.z; -#else - Sg.x = Sg.y = 0.0; - local_z = localAltitude(&c->prevSg, &c->prevw); - Sg.z = -METERStoFEET(c->w.z - local_z); - c->localTerrain_feet = METERStoFEET( local_z ); - v.x = c->Cg.x; - v.y = c->Cg.y; - v.z = -METERStoFEET(c->w.z - c->prevw.z); -/* printf ("Sg.z = %g, v.z = %g\n", Sg.z, v.z); */ -#endif - -/* - * If we're not on the ground now, and we're not descending, we won't touch - * down during this time interval. - */ - - if (v.z <= 0.0) { - return -1.0; - } - -/* - * Determine the point in world axes relative to the CG that represents the - * "bottom" of the fully extended main gear with a fully extended oleo. - * The determine if (and when) it makes contact with the ground. - * - * Remember, the main gear are considered one unit for purposes of ACM. - */ - - gear = p->rm; - gear.z += p->Gm + p->cmMax; - VTransform(&gear, &(c->trihedral), &s0); -#ifdef FLAT_WORLD - s0.x += c->prevSg.x; - s0.y += c->prevSg.y; - s0.z += c->prevSg.z; -#else - s0.z += -METERStoFEET(c->prevw.z - local_z); -#endif - if (s0.z > (0.0 + EPSILON)) { - *contactSg = c->prevSg; - c->flags |= FL_GND_CONTACT; -#ifdef DEBUG1 - printf("mains already in contact\n"); - cosTheta = cos(-c->curPitch); - sinTheta = sin(-c->curPitch); - cm = -(contactSg->z + p->rm.x * sinTheta) / cosTheta - - p->Gm - p->rm.z; - cn = -(contactSg->z + p->rn.x * sinTheta) / cosTheta - - p->Gn - p->rn.z; - printf("cm/cn cmMax/cnMax %.4f %.4f %.4f %.4f\n\n", - cm, cn, p->cmMax, p->cnMax); -#endif - return 0.0; - } - - if ((s0.z + v.z) > 0.0) { - tm = -s0.z / v.z; - if (c->curGear[1] != geardown || c->curGear[2] != geardown) { - killPlayerEx(c, - "Your main landing gear wasn't down and locked\n", - "Either you forgot to extend the gear, or it was damaged in combat."); - return -1; - } - } - -/* - * Now do the same thing for the nose gear. - */ - - gear = p->rn; - gear.z += p->Gn + p->cnMax; - VTransform(&gear, &(c->trihedral), &s0n); -#ifdef FLAT_WORLD - s0n.x += c->prevSg.x; - s0n.y += c->prevSg.y; - s0n.z += c->prevSg.z; -#else - s0n.z -= METERStoFEET(c->prevw.z - local_z); -#endif - - if (s0n.z > (0.0 + EPSILON)) { - *contactSg = c->prevSg; - c->flags |= FL_GND_CONTACT; -#ifdef DEBUG1 - printf("nose already in contact\n"); -#endif - return 0.0; - } - - if ((s0n.z + v.z) > 0.0) { - tn = -s0n.z / v.z; - if (c->curGear[0] != geardown) { - killPlayerEx(c, - "Your nose gear wasn't down and locked", - "Either you forgot to extend the gear, or it was damaged in combat."); - return -1; - } - } - -/* - * Return the time of initial ground contact (or minus one). - */ - - if (tm != 2.0 || tn != 2.0) { - c->flags |= FL_GND_CONTACT; - if (tn < tm) { - tm = tn; - } - - if (tm < 0.0) { - return -1.0; - } - -#ifdef DEBUG1 - contactSg->x = Sg.x + tm * deltaT * v.x; - contactSg->y = Sg.y + tm * deltaT * v.y; - contactSg->z = Sg.z + tm * deltaT * v.z - METERStoFEET(local_z); - - printf("Ground Contact, time t + %.5f sec\n", tm * deltaT); - cosTheta = cos(-c->curPitch); - sinTheta = sin(-c->curPitch); - cm = -(contactSg->z + p->rm.x * sinTheta) / cosTheta - - p->Gm - p->rm.z; - cn = -(contactSg->z + p->rn.x * sinTheta) / cosTheta - - p->Gn - p->rn.z; - printf("cm/cn cmMax/cnMax %.4f %.4f %.4f %.4f\n\n", - cm, cn, p->cmMax, p->cnMax); -#endif - return tm * deltaT; - } - else - return -1.0; - -} - -/* - * Manage pitch and translation while we're on the ground. - */ - -static VPoint zeroPt = -{0, 0, 0}; - -int -groundDynamics(craft * c, double startT, double CL, - double CD, double CM, double w, double qS) -{ - - register double sinTheta, cosTheta; - register craftType *p; - double theta, theta_dot, dT, cm, cn, cm_dot, cn_dot, m; - double t, next_t, muStatic; - double muKinetic, Mu, nMu; - double lift, drag, pitch_moment, angle; - double v, sinAlphaP, cosAlphaP; - VPoint F, M, mt, Sg, Cg, Fm, Fn, FnMu, FmMu, r, tmpPt, Ftot; - VMatrix turn, mtx; - double theta_damp; - int done = 0, niter = 0; - double smag; - double local_z = 0.0; - - t = 0.0; - Fm.x = Fm.y = Fm.z = 0.0; - Fn.x = Fn.y = Fn.z = 0.0; - Ftot.x = Ftot.y = Ftot.z = 0.0; - - m = w / earth_g; - - dT = 0.002; - - p = c->cinfo; - - theta_damp = 0.25 * p->wingS * c->rho * p->c * p->c * p->Cmq; - -/* - * Grab initial conditions - * - * We restrict the degrees of freedom here to x and z translations and - * pitch rotations. Yawing induced by nosewheel steering is controlled - * by some special code at the end of this procedure. - * - * Note that the pitch of the aircraft is the value theta, with a positive - * value representing a downward pitch. - */ - -/* - * First, change the velocity into a two-dimensional vector. - */ - - v = mag(c->Cg); - Cg.z = c->Cg.z; - Cg.y = 0.0; - Cg.x = sqrt(v * v - Cg.z * Cg.z); - - Sg.x = Sg.y = 0.0; -#ifdef FLATWORLD - Sg.z = c->Sg.z; -#else - local_z = localAltitude(&c->Sg, &c->w); - Sg.z = -METERStoFEET(c->w.z - local_z); - c->localTerrain_feet = METERStoFEET ( local_z ); -#endif - theta = -c->curPitch; - theta_dot = -c->q; - -#ifdef DEBUG - sinTheta = sin(theta); - cosTheta = cos(theta); - cm = -(Sg.z + p->rm.x * sinTheta) / cosTheta - p->Gm - p->rm.z; - cn = -(Sg.z + p->rn.x * sinTheta) / cosTheta - p->Gn - p->rn.z; - printf("start of groundDynamics\n"); - printf("time z theta cm cn Cg.x\n"); - printf("%.3f %.3f %.2f %f %f %f ft/sec\n", t, -Sg.z, - theta * 180.0 / M_PI, cn, cm, Cg.x); -#endif - -#ifdef notdef - printf("theta = %f, theta_dot = % f\n ", theta * 180.0 / M_PI, - theta_dot); -#endif - -/* - * Since the time interval is very short, we'll treat the aero forces - * as constants. - */ - - lift = CL * qS; - drag = CD * qS; - pitch_moment = CM * (c->alpha + elevatorSetting(c, qS, w) * - p->effElevator) * p->c * qS; - - if (c->flags & FL_BRAKES) { - muStatic = p->muBStatic; - muKinetic = p->muBKinetic; - } - else { - muStatic = p->muStatic; - muKinetic = p->muKinetic; - } - -/* - * Since lift and drag are constants in this model, well make their x and z - * force components constant as well. - */ - - sinAlphaP = sin(c->alpha + theta); - cosAlphaP = cos(c->alpha + theta); - - for (t = startT; !done; t = next_t) { - - next_t = t + dT; - if (next_t >= deltaT) { - done = 1; - dT = deltaT - t; - } - - sinTheta = sin(theta); - cosTheta = cos(theta); - -/* - * cm and cn are the current strut positions (i.e. how compressed an oleo - * currently is). Zero corresponds to a fully compressed oleo. Positive - * values mean that the oleo is extended by that amount. Units are feet. - */ - - cm = -(Sg.z + p->rm.x * sinTheta) / cosTheta - p->Gm - p->rm.z; - cn = -(Sg.z + p->rn.x * sinTheta) / cosTheta - p->Gn - p->rn.z; - -/* - * cm_dot and cn_dot are the instantaneous strut motion rates. They are used - * to compute the damping forces in each strut. - */ - cm_dot = -(p->rm.x * theta_dot + Cg.z / cosTheta + - ((Sg.z + p->rm.x * sinTheta) * sinTheta * theta_dot) / - (cosTheta * cosTheta)); - - cn_dot = -(p->rn.x * theta_dot + Cg.z / cosTheta + - ((Sg.z + p->rn.x * sinTheta) * sinTheta * theta_dot) / - (cosTheta * cosTheta)); - -#ifdef experimental - cm_dot = -(cosTheta * Cg.z + theta_dot * (Sg.z * sinTheta + p->rm.x)) / - (cosTheta * cosTheta); - - cn_dot = -(cosTheta * Cg.z + theta_dot * (Sg.z * sinTheta + p->rn.x)) / - (cosTheta * cosTheta); -#endif - -/* - * If cm or cn ever go negative, then that oleo -- and strut -- are considered - * to have collaped. - */ - - if (cm < 0.0) { -#ifdef DEBUG - printf ("main gear smash: %f\n", cm); -#endif - return 1; - } - - if (cn < 0.0) { -#ifdef DEBUG - printf ("nose gear smash: %f\n", cn); -#endif - return 1; - } - -/* - * Compute the force at each landing gear strut location. Note that damping - * only occurs "on the downstroke". That's because the wheel isn't physically - * attached to the ground. - */ - - if (cm < p->cmMax) { - Fm.z = -(p->Km * (p->cmMax - cm)); - if (cm_dot < 0.0) - Fm.z += p->Dm * cm_dot; - } - else - Fm.z = 0.0; - - if (cn < p->cnMax) { - Fn.z = -(p->Kn * (p->cnMax - cn)); - if (cn_dot < 0.0) - Fn.z += p->Dn * cn_dot; - if (cn < 0.1) - /* add resistance in the last 0.1 feet */ - Fn.z += -100 * (p->Kn * (0.1 - cn)); - } - else - Fn.z = 0.0; - -/* - * Add moments contributed by oleo compression and oleo movement - */ - - VCrossProd(&Fm, &p->rm, &M); - - VCrossProd(&Fn, &p->rn, &mt); - M.x += mt.x; - M.y += mt.y; - M.z += mt.z; - -/* - * Add moments contributed by tire friction (we'll use rm/rn for - * the sake of speed here instead of calculating a more accurate - * tire / ground contact position. Note that FmMu and FnMu are forces - * relative to the body axes, not world axes. - */ - - if (fabs(Cg.x) < 0.5) { - nMu = p->muStatic; - Mu = muStatic; - } - else { - nMu = p->muKinetic; - Mu = muKinetic; - } - - if (Cg.x < 0.0) - Mu = -Mu; - else if (Cg.x == 0.0) - Mu = 0.0; - - if (cm < p->cmMax) { - FmMu.x = Fm.z * cosTheta * cosTheta * Mu; - FmMu.y = 0.0; - FmMu.z = Fm.z * cosTheta * sinTheta * Mu; - VCrossProd(&FmMu, &p->rm, &mt); - M.x += mt.x; - M.y += mt.y; - M.z += mt.z; - } - - if (cn < p->cnMax) { - FnMu.x = Fn.z * cosTheta * cosTheta * nMu; - FnMu.y = 0.0; - FnMu.z = Fn.z * cosTheta * sinTheta * nMu; - VCrossProd(&FnMu, &p->rn, &mt); - M.x += mt.x; - M.y += mt.y; - M.z += mt.z; - } - - M.y -= pitch_moment - theta_damp * v * theta_dot; - -/* - * Sum forces in (simplified) world axes - */ - - F.x = -(Fm.z + Fn.z) * sinTheta; - F.x += (Fm.z + Fn.z) * cosTheta * Mu; - F.x += cosTheta * c->curThrust; - F.x -= sinAlphaP * lift; - F.x -= cosAlphaP * drag; - F.y = 0.0; - F.z = w + (Fm.z + Fn.z) * cosTheta; - F.z += sinTheta * c->curThrust; - F.z -= cosAlphaP * lift; - F.z -= sinAlphaP * drag; - - Ftot.x += F.x; - Ftot.y += F.y; - Ftot.z += F.z; - niter++; -/* - * Update position and theta - */ - - Sg.x += Cg.x * dT + 0.5 * F.x / m * dT * dT; - Sg.y += Cg.y * dT + 0.5 * F.y / m * dT * dT; - Sg.z += Cg.z * dT + 0.5 * F.z / m * dT * dT; - - Cg.x += F.x / m * dT; - Cg.y += F.y / m * dT; - Cg.z += F.z / m * dT; - - theta += theta_dot * dT + 0.5 * M.y / p->I.m[1][1] * dT * dT; - theta_dot += M.y / p->I.m[1][1] * dT; - -/* - * Well, okay, it's time for a hack. To simulate dragging the tail, we'll - * constrain theta to be less than 20 degrees (for now). The right way to - * do this would be to determine if the tail contact point is positive and if - * it is, then limit theta. - */ - - if (theta < DEGtoRAD(-20.0)) { - theta = DEGtoRAD(-20.0); - theta_dot = 0.0; - } - -#ifdef DEBUG - if (debug) { - printf("%.3f %.3f %.2f %f %f", t + dT, -Sg.z, - RADtoDEG(theta), cm, cn); - printf(" %f ft/sec\n", Cg.x); - } -#endif - - } - - Sg.x = FEETtoMETERS(Sg.x); - Sg.y = FEETtoMETERS(Sg.y); - Sg.z = FEETtoMETERS(Sg.z); - -/* - * Well, now we've calculated how far we've moved relative to our starting - * point (Sg.x), what our CG's new altitude is (Sg.z), and our ending pitch - * (theta). We'll use this information as an input to nose-wheel steering - * control. - */ - - c->curNWDef = - c->Sa * c->cinfo->maxNWDef * 0.3; - - if (c->curNWDef != 0.0 && v < p->maxNWS && cn < p->cnMax) { - - tmpPt.x = c->cinfo->gearD2; - tmpPt.y = c->cinfo->gearD1 / tan(c->curNWDef); - tmpPt.z = 0.0; - angle = Sg.x / tmpPt.y; - -/* - * Nose wheel steering mode. - * Relocate the aircraft and its trihedral (this code assumes that the - * plane is rolling on a flat surface (i.e. z is constant). - */ - - VTransform(&tmpPt, &(c->trihedral), &r); - - VIdentMatrix(&turn); -#ifdef FLAT_WORLD - turn.m[0][3] = -c->Sg.x - r.x; - turn.m[1][3] = -c->Sg.y - r.y; - turn.m[2][3] = -c->Sg.z; - VRotate(&turn, ZRotation, angle); - turn.m[0][3] = turn.m[0][3] + c->Sg.x + r.x; - turn.m[1][3] = turn.m[1][3] + c->Sg.y + r.y; - turn.m[2][3] = turn.m[2][3] + c->Sg.z; - VTransform(&(c->Sg), &turn, &tmpPt); - c->Sg = tmpPt; -#else - turn.m[0][3] = -r.x; - turn.m[1][3] = -r.y; - turn.m[2][3] = -METERStoFEET(c->w.z); - VRotate(&turn, ZRotation, angle); - turn.m[0][3] = turn.m[0][3] + r.x; - turn.m[1][3] = turn.m[1][3] + r.y; - turn.m[2][3] = turn.m[2][3] + METERStoFEET(c->w.z); - VTransform(&zeroPt, &turn, &tmpPt); - smag = sqrt(tmpPt.x * tmpPt.x + tmpPt.y * tmpPt.y); - DISUpdateWorldCoordinates(&c->w, tmpPt.x / smag, tmpPt.y / smag, - smag); - c->w.z = -FEETtoMETERS(Sg.z); -#endif - - VIdentMatrix(&turn); - VRotate(&turn, ZRotation, angle); - mtx = c->trihedral; - VMatrixMultByRank(&mtx, &turn, &(c->trihedral), 3); - VTransform(&(c->Cg), &turn, &tmpPt); - c->Cg = tmpPt; - c->r = -angle / deltaT; - - euler(c); - - VSetPoint(tmpPt, 1.0, 0.0, 0.0); - VTransform(&tmpPt, &(c->trihedral), &r); - smag = sqrt(r.x * r.x + r.y * r.y); - - } - else { - VSetPoint(tmpPt, 1.0, 0.0, 0.0); - VTransform(&tmpPt, &(c->trihedral), &r); -#ifdef FLAT_WORLD - c->Sg.x += Sg.x * r.x; - c->Sg.y += Sg.x * r.y; /* yes, I really want Sg.x */ -#else - smag = sqrt(r.x * r.x + r.y * r.y); - DISUpdateWorldCoordinates(&c->w, r.x / smag, r.y / smag, Sg.x); -#endif - c->r = 0.0; - } - - c->Cg.x = Cg.x * r.x / smag; - c->Cg.y = Cg.x * r.y / smag; - c->Cg.z = Cg.z; - c->groundCgx = Cg.x; - -#ifdef FLAT_WORLD - c->Sg.z = Sg.z; -#else - c->w.z = -Sg.z + local_z; -#endif - c->curPitch = -theta; - c->curRoll = 0.0; - c->p = 0.0; /* zero roll speed when on ground */ - c->q = -theta_dot; - - buildEulerMatrix(c->curRoll, c->curPitch, c->curHeading, - &(c->trihedral)); - -/* - * Update (averaged) acceleration and the user perceived G-Forces - * Keep in mind that F (and Ftot) are forces in an idealized frame that is - * the NED frame rotated to the heading of the aircraft. - */ - - c->linAcc.x = (Ftot.x * cosTheta - Ftot.z * sinTheta) / (niter * m); - c->linAcc.y = 0.0; - c->linAcc.z = -(Ftot.x * sinTheta + Ftot.z * cosTheta) / (niter * m); - - c->G.z = c->linAcc.x / earth_g; - c->G.y = c->linAcc.y / earth_g; - c->G.z = c->linAcc.z / earth_g - 1.0; - -/* - * Is the plane still in contact with the ground? - */ - - if ((cm >= p->cmMax) && (cn >= p->cnMax)) { - cosTheta = cos(theta); - sinTheta = sin(theta); - cm = -(Sg.z + p->rm.x * sinTheta) / cosTheta - p->Gm - p->rm.z; - cn = -(Sg.z + p->rn.x * sinTheta) / cosTheta - p->Gn - p->rn.z; - if ((cm >= p->cmMax) && (cn >= p->cnMax)) { - c->flags &= ~FL_GND_CONTACT; - c->groundCgx = 0.0; - } - } - -#ifdef DEBUG1 - if (debug) { - printf("Sg.z = %.3f theta=%.2f alpha= %.2f cm/cn %f %f", -Sg.z, - RADtoDEG(theta), RADtoDEG(c->alpha), cm, cn); - printf(" %f ft/sec\n", Cg.x); - printf("cm-dot/cn-dot = %0.2f %0.2f\n", cm_dot, cn_dot); - } -#endif - - return 0; - -} Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/src/gearDown.bmp and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/src/gearDown.bmp differ diff -Nru acm-5.0/src/gearDown.xbm acm-6.0+20200416/src/gearDown.xbm --- acm-5.0/src/gearDown.xbm 1991-02-28 18:51:09.000000000 +0000 +++ acm-6.0+20200416/src/gearDown.xbm 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ -#define gearDown_width 25 -#define gearDown_height 25 -static char gearDown_bits[] = { - 0x00, 0x00, 0x00, 0xfe, 0x00, 0xfe, 0x00, 0xfe, 0x80, 0x01, 0x03, 0xfe, - 0x60, 0xfe, 0x0c, 0xfe, 0xb0, 0xff, 0x1b, 0xfe, 0xd8, 0xff, 0x37, 0xfe, - 0xe8, 0xff, 0x2f, 0xfe, 0xf4, 0xff, 0x5f, 0xfe, 0xf4, 0xff, 0x5f, 0xfe, - 0xfa, 0xff, 0xbf, 0xfe, 0xfa, 0xff, 0xbf, 0xfe, 0xfa, 0xff, 0xbf, 0xfe, - 0xfa, 0xff, 0xbf, 0xfe, 0xfa, 0xff, 0xbf, 0xfe, 0xfa, 0xff, 0xbf, 0xfe, - 0xfa, 0xff, 0xbf, 0xfe, 0xf4, 0xff, 0x5f, 0xfe, 0xf4, 0xff, 0x5f, 0xfe, - 0xe8, 0xff, 0x2f, 0xfe, 0xd8, 0xff, 0x37, 0xfe, 0xb0, 0xff, 0x1b, 0xfe, - 0x60, 0xfe, 0x0c, 0xfe, 0x80, 0x01, 0x03, 0xfe, 0x00, 0xfe, 0x00, 0xfe, - 0x00, 0x00, 0x00, 0xfe}; Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/src/gearTran.bmp and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/src/gearTran.bmp differ diff -Nru acm-5.0/src/gearTran.xbm acm-6.0+20200416/src/gearTran.xbm --- acm-5.0/src/gearTran.xbm 1991-02-28 18:50:53.000000000 +0000 +++ acm-6.0+20200416/src/gearTran.xbm 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ -#define gearTran_width 25 -#define gearTran_height 25 -static char gearTran_bits[] = { - 0x00, 0x00, 0x00, 0xfe, 0x00, 0xfe, 0x00, 0xfe, 0x80, 0x01, 0x03, 0xfe, - 0x60, 0xfe, 0x0c, 0xfe, 0xb0, 0x31, 0x1b, 0xfe, 0xd8, 0x18, 0x37, 0xfe, - 0x68, 0x8c, 0x29, 0xfe, 0x34, 0xc6, 0x58, 0xfe, 0x14, 0x63, 0x5c, 0xfe, - 0x8a, 0x31, 0xa6, 0xfe, 0xca, 0x18, 0xa3, 0xfe, 0x6a, 0x8c, 0xb1, 0xfe, - 0x3a, 0xc6, 0xb8, 0xfe, 0x1a, 0x63, 0xac, 0xfe, 0x8a, 0x31, 0xa6, 0xfe, - 0xca, 0x18, 0xa3, 0xfe, 0x74, 0x8c, 0x51, 0xfe, 0x34, 0xc6, 0x58, 0xfe, - 0x28, 0x63, 0x2c, 0xfe, 0xd8, 0x31, 0x36, 0xfe, 0xb0, 0x39, 0x1b, 0xfe, - 0x60, 0xfe, 0x0c, 0xfe, 0x80, 0x01, 0x03, 0xfe, 0x00, 0xfe, 0x00, 0xfe, - 0x00, 0x00, 0x00, 0xfe}; Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/src/gearUp.bmp and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/src/gearUp.bmp differ diff -Nru acm-5.0/src/gearUp.xbm acm-6.0+20200416/src/gearUp.xbm --- acm-5.0/src/gearUp.xbm 1991-02-28 18:50:39.000000000 +0000 +++ acm-6.0+20200416/src/gearUp.xbm 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ -#define gearUp_width 25 -#define gearUp_height 25 -static char gearUp_bits[] = { - 0x00, 0x00, 0x00, 0xfe, 0x00, 0xfe, 0x00, 0xfe, 0x80, 0x01, 0x03, 0xfe, - 0x60, 0xfe, 0x0c, 0xfe, 0xb0, 0xff, 0x1b, 0xfe, 0xd8, 0xff, 0x37, 0xfe, - 0xe8, 0xff, 0x2f, 0xfe, 0xf4, 0xff, 0x5f, 0xfe, 0x34, 0x33, 0x58, 0xfe, - 0x3a, 0x33, 0xb0, 0xfe, 0x3a, 0x33, 0xb3, 0xfe, 0x3a, 0x33, 0xb3, 0xfe, - 0x3a, 0x33, 0xb0, 0xfe, 0x3a, 0x33, 0xb8, 0xfe, 0x3a, 0x33, 0xbf, 0xfe, - 0x7a, 0x38, 0xbf, 0xfe, 0x74, 0x38, 0x5f, 0xfe, 0xf4, 0xff, 0x5f, 0xfe, - 0xe8, 0xff, 0x2f, 0xfe, 0xd8, 0xff, 0x37, 0xfe, 0xb0, 0xff, 0x1b, 0xfe, - 0x60, 0xfe, 0x0c, 0xfe, 0x80, 0x01, 0x03, 0xfe, 0x00, 0xfe, 0x00, 0xfe, - 0x00, 0x00, 0x00, 0xfe}; diff -Nru acm-5.0/src/gedit/actions.c acm-6.0+20200416/src/gedit/actions.c --- acm-5.0/src/gedit/actions.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/gedit/actions.c 2017-04-16 08:24:25.000000000 +0000 @@ -0,0 +1,244 @@ +/* + * Copyright (c) 1994, Riley Rainey, riley@netcon.com + * + * Permission to use, copy, modify and distribute (without charge) this + * software, documentation, images, etc. is granted, provided that this + * comment and the author's name is retained. + * + * This software is provided by the author as is, and without any expressed + * or implied warranties, including, but not limited to, the implied + * warranties of merchantability and fitness for a particular purpose. In no + * event shall the author be liable for any direct, indirect, incidental, or + * consequential damages arising in any way out of the use of this software. + */ + +#include +#include +#include "shared.h" +#include "gutil.h" +#include "edit.h" +#include "circle.h" + +#define actions_IMPORT +#include "actions.h" + +static String normal_translations = + ": point-begin() \n\ + : point-end()"; + +static String extra_translations = + "Shift: point-begin(extend) \n\ + : point-begin() \n\ + : point-motion() \n\ + : point-end() \n\ + : close-polygon()"; + +static XtTranslations normal, extra; + + +/* + * The next action procedure is typically associated with Button 1 down. + * + * The action taken here depends on the value of edit_state. But we may: + * + * Determine the polygon nearest the click -- within reason. + * + * Begin the process of entering a 3-D point. + * + * Begin the process of relocating the origin. + * + */ + +static void +PointBegin (Widget w, XEvent *event, String *params, Cardinal *num_params) +{ + XButtonEvent *ev = (XButtonEvent *) event; + view_info_t *p; + Boolean extend = False; + + if ((*num_params > 0) && (strcmp (*params, "extend") == 0)) + extend = True; + + XtVaGetValues (w, + XmNuserData, &p, + NULL); + + switch (edit_state) { + case STATE_POINT: + BeginPick (w, p, ev->x, ev->y, extend); + break; + + case STATE_POLYGON: + BeginPolygonPoint(w, p, ev->x, ev->y); + break; + + case STATE_MOVE_ORIGIN: + break; + + case STATE_CIRCLE: + BeginCirclePoint (w, p, ev->x, ev->y); + break; + + case STATE_MARKER: + BeginPolygonPoint(w, p, ev->x, ev->y); + break; + + } +} + +/* + * Move the selected polygon in point mode. + * + * Slide the new point along the perpedicular-axis line. + * + * Move the origin locator. + */ + +static void +PointMotion (Widget w, XEvent *event, String *params, Cardinal *num_params) +{ + XMotionEvent *ev = (XMotionEvent *) event; + view_info_t *p; + + XtVaGetValues (w, + XmNuserData, &p, + NULL); + + switch (edit_state) { + case STATE_POINT: + DragSelection (w, p, ev->x, ev->y); + break; + + case STATE_POLYGON: + case STATE_MARKER: + DragPolygonPoint(w, p, ev->x, ev->y); + break; + + case STATE_CIRCLE: + DragCirclePoint (w, p, ev->x, ev->y); + break; + + case STATE_MOVE_ORIGIN: + break; + } +} + +/* + * Lock in a polygon selection. + * + * The point has been positioned and is ready to be registered. + * + * Relocate the origin. + */ + +static void +PointEnd (Widget w, XEvent *event, String *params, Cardinal *num_params) +{ + XButtonEvent *ev = (XButtonEvent *) event; + view_info_t *p; + + XtVaGetValues (w, + XmNuserData, &p, + NULL); + + switch (edit_state) { + case STATE_POINT: + CompleteDrag(w, p, ev->x, ev->y); + break; + + case STATE_POLYGON: + CompletePolygonPoint (w, p, ev->x, ev->y); + break; + + case STATE_CIRCLE: + CompleteCirclePoint (w, p, ev->x, ev->y); + break; + + case STATE_MOVE_ORIGIN: + break; + + case STATE_MARKER: + CompleteMarker (w, p, ev->x, ev->y); + break; + } +} + +/* + * Delete the currently selected object. + */ + +static void +DeleteCurrent (Widget w, XEvent *event, String *params, Cardinal *num_params) +{ + ClearSelection (); +} + +static void +ClosePolygon (Widget w, XEvent *event, String *params, Cardinal *num_params) +{ + if (cur_polygon != (polygon_t *) NULL) + CompletePolygon (w, cur_polygon); +} + + +static XtActionsRec action_list[] = { + { "point-begin", PointBegin }, + { "point-motion", PointMotion }, + { "point-end", PointEnd }, + { "close-polygon", ClosePolygon }, + { "delete-selection", DeleteCurrent } + }; + + +void +InitializeTranslations (XtAppContext app, Widget w1, Widget w2) +{ + + XtAppAddActions (app, action_list, XtNumber(action_list)); + + normal = XtParseTranslationTable (normal_translations); + extra = XtParseTranslationTable (extra_translations); + + XtVaSetValues (w1, + XmNtranslations, extra, + NULL); + + XtVaSetValues (w2, + XmNtranslations, extra, + NULL); + +} + +void InstallNormalTranslations (Widget w) +{ + view_info_t *p; + + XtVaGetValues (w, + XmNuserData, &p, + NULL); + + XtVaSetValues (w, + XmNtranslations, normal, + NULL); + + XtVaSetValues (p->other_widget, + XmNtranslations, normal, + NULL); +} + +void InstallExtraTranslations (Widget w) +{ + view_info_t *p; + + XtVaGetValues (w, + XmNuserData, &p, + NULL); + + XtVaSetValues (w, + XmNtranslations, extra, + NULL); + + XtVaSetValues (p->other_widget, + XmNtranslations, extra, + NULL); +} \ No newline at end of file diff -Nru acm-5.0/src/gedit/actions.h acm-6.0+20200416/src/gedit/actions.h --- acm-5.0/src/gedit/actions.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/gedit/actions.h 2017-04-16 08:24:25.000000000 +0000 @@ -0,0 +1,31 @@ +/* + * Copyright (c) 1994, Riley Rainey, riley@netcon.com + * + * Permission to use, copy, modify and distribute (without charge) this + * software, documentation, images, etc. is granted, provided that this + * comment and the author's name is retained. + * + * This software is provided by the author as is, and without any expressed + * or implied warranties, including, but not limited to, the implied + * warranties of merchantability and fitness for a particular purpose. In no + * event shall the author be liable for any direct, indirect, incidental, or + * consequential damages arising in any way out of the use of this software. + */ + +#ifndef actions_H +#define actions_H + +#ifdef actions_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +EXTERN void InitializeTranslations (XtAppContext app, Widget w1, Widget w2); + +EXTERN void InstallNormalTranslations (Widget w); + +EXTERN void InstallExtraTranslations (Widget w); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/gedit/balance.c acm-6.0+20200416/src/gedit/balance.c --- acm-5.0/src/gedit/balance.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/gedit/balance.c 2017-08-11 16:47:59.000000000 +0000 @@ -0,0 +1,129 @@ +/* + * Copyright (c) 1994, Riley Rainey, riley@netcon.com + * + * Permission to use, copy, modify and distribute (without charge) this + * software, documentation, images, etc. is granted, provided that this + * comment and the author's name is retained. + * + * This software is provided by the author as is, and without any expressed + * or implied warranties, including, but not limited to, the implied + * warranties of merchantability and fitness for a particular purpose. In no + * event shall the author be liable for any direct, indirect, incidental, or + * consequential damages arising in any way out of the use of this software. + */ + +#include +#include + +#define balance_IMPORT +#include "balance.h" + +void +balance (struct balance_data *s) +{ + + double theta, cosTheta, sinTheta; + double Fmz, Fnz; + +/* + * Determine the rest pitch angle of the aircraft body + */ + + theta = - atan2 (s->rn.z - s->rm.z, s->rn.x - s->rm.x); + cosTheta = cos(theta); + sinTheta = sin(theta); + + printf ("Theta = %f degrees (positive down)\n", theta * 180.0 / M_PI); + +/* + * Determine correct rm/rn values + */ + s->rn.z = s->rn.z - s->Gn - s->cn; + s->rm.z = s->rm.z - s->Gm - s->cm; + +/* + * Determine spring constants + */ + + Fmz = (s->weight * s->rn.x) / (s->rn.x - s->rm.x); + Fnz = s->weight - Fmz; + + s->Km = Fmz / (s->cmMax - s->cm); + s->Kn = Fnz / (s->cnMax - s->cn); + +/* + * Determine the initial grounding point + */ + + s->Gpz = s->rm.x * sinTheta + (s->rm.z + s->Gm + s->cm) * cosTheta; + +} + +#ifdef notdef +main() +{ + + struct balance_data s; + +/* + * Wheel contact locations for the aircraft fully loaded at rest. + */ + + VSetPoint (s.rn, 14.0, 0, 6.5); + VSetPoint (s.rm, -1.0, 0, 6.5); + +/* + * Gross weight + */ + + s.weight = 24326.0; + +/* + * Maximum oleo extension lengths + */ + + s.cnMax = 1.5; + s.cmMax = 1.5; + +/* + * The length of the wheel and lower landing gear strut + */ + s.Gm = 1.5; + s.Gn = 1.5; + +/* + * Rest oleo extension; must be less than cnMax or cmMax; usually about + * half the max value. + */ + + s.cm = 1.0; + s.cn = 1.0; + + printf ("Input:\n"); + printf ("nose contact = %lf %lf %lf\n", s.rn.x, s.rn.y, s.rn.z); + printf ("main's contact = %lf %lf %lf\n", s.rm.x, s.rm.y, s.rm.z); + printf ("Weight = %lf\n", s.weight); + + balance(&s); + + printf ("\nOutput:\n"); + printf ("rm = %lf, %lf, %lf\n", s.rm.x, s.rm.y, s.rm.z); + printf ("rn = %lf, %lf, %lf\n", s.rn.x, s.rn.y, s.rn.z); + printf ("Km = %lf\n", s.Km); + printf ("Kn = %lf\n", s.Kn); + printf ("Grounding point (z) = %lf\n", s.Gpz); + printf ("\n\"inventory\" form:\n\n"); + printf ("\tRm\t\t{%lg, %lg, %lg}\n", s.rm.x, s.rm.y, s.rm.z); + printf ("\tRn\t\t{%lg, %lg, %lg}\n", s.rn.x, s.rn.y, s.rn.z); + printf ("\tKm\t\t%lg\n", s.Km); + printf ("\tKn\t\t%lg\n", s.Kn); + printf ("\tGm\t\t%lg\n", s.Gm); + printf ("\tGn\t\t%lg\n", s.Gn); + printf ("\tCmMax\t\t%lg\n", s.cmMax); + printf ("\tCnMax\t\t%lg\n", s.cnMax); + printf ("\tGroundingPoint\t{0.0, 0.0, %lg}\n", s.Gpz); + + exit (0); +} +#endif + diff -Nru acm-5.0/src/gedit/balance.h acm-6.0+20200416/src/gedit/balance.h --- acm-5.0/src/gedit/balance.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/gedit/balance.h 2017-08-11 16:47:59.000000000 +0000 @@ -0,0 +1,58 @@ +/* + * Copyright (c) 1994, Riley Rainey, riley@netcon.com + * + * Permission to use, copy, modify and distribute (without charge) this + * software, documentation, images, etc. is granted, provided that this + * comment and the author's name is retained. + * + * This software is provided by the author as is, and without any expressed + * or implied warranties, including, but not limited to, the implied + * warranties of merchantability and fitness for a particular purpose. In no + * event shall the author be liable for any direct, indirect, incidental, or + * consequential damages arising in any way out of the use of this software. + */ + +#ifndef balance_H +#define balance_H + +#include "../V/Vlibmath.h" + +#ifdef balance_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +/** + *
+ *   ----------------  z = 0 in body coordinates
+ *      ^
+ *      |       r{m,n}.z        (constant)
+ *      v
+ *      o       gear attachment point
+ *      ^
+ *      |       c{m,n}.z        strut extension  (0 - c{m,n}Max)
+ *      v
+ *      ^
+ *      |       G{m,n}          strut + tire length  (constant)
+ *      v
+ *   ----------------  ground
+ * 
+ */ +struct balance_data { + double weight; /* weight for this test */ + VPoint rm; /* rest main gear ground contact point (input), + rest main gear attachment point (output) */ + VPoint rn; /* rest nose gear ground contact point (input), + rest nose gear attachment point (output) */ + double cm, cn; /* rest extension values of each strut */ + double cmMax, cnMax; /* maximum extension values of each strut */ + double Gm, Gn; /* strut + tire lengths */ + double Km, Kn; /* string constants (output) */ + double Gpz; /* the old "grounding point" Z value */ + }; + +EXTERN void balance (struct balance_data *s); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/gedit/cell.c acm-6.0+20200416/src/gedit/cell.c --- acm-5.0/src/gedit/cell.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/gedit/cell.c 2017-04-16 08:24:25.000000000 +0000 @@ -0,0 +1,76 @@ +/* + * Copyright (c) 1994, Riley Rainey, riley@netcon.com + * + * Permission to use, copy, modify and distribute (without charge) this + * software, documentation, images, etc. is granted, provided that this + * comment and the author's name is retained. + * + * This software is provided by the author as is, and without any expressed + * or implied warranties, including, but not limited to, the implied + * warranties of merchantability and fitness for a particular purpose. In no + * event shall the author be liable for any direct, indirect, incidental, or + * consequential damages arising in any way out of the use of this software. + */ + +#include +#include +#include +#include +#include + +#include "shared.h" + +#define cell_IMPORT +#include "cell.h" + +int +LocateCell (struct cell *p, int id) +{ + int n; + for (n = 0; p->id >= 0; n++, p++) { + if (id == p->id) { + return n; + } + } + + fprintf (stderr, "Unable to locate cell %d\n \ +Cell zero will contain invalid data\n", id); + return 0; +} + +double +GetCellValueDouble (struct cell *p, int n, double *value) +{ + char *s; + + s = XmTextFieldGetString (p[LocateCell(p, n)].field); + *value = atof(s); + XtFree (s); + return *value; +} + +void +SetCellValueDouble (struct cell *p, int n, double value) +{ + char s[64]; + + sprintf (s, "%.8lg", value); + XmTextFieldSetString (p[LocateCell(p, n)].field, s); +} + +char * +GetCellValueString (struct cell *p, int n, char *value) +{ + char *s; + + s = XmTextFieldGetString (p[LocateCell(p, n)].field); + strcpy (value, s); + XtFree (s); + return value; +} + +void +SetCellValueString (struct cell *p, int n, char *value) +{ + XmTextFieldSetString (p[LocateCell(p, n)].field, value); +} diff -Nru acm-5.0/src/gedit/cell.h acm-6.0+20200416/src/gedit/cell.h --- acm-5.0/src/gedit/cell.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/gedit/cell.h 2017-04-16 08:24:25.000000000 +0000 @@ -0,0 +1,44 @@ +/* + * Copyright (c) 1994, Riley Rainey, riley@netcon.com + * + * Permission to use, copy, modify and distribute (without charge) this + * software, documentation, images, etc. is granted, provided that this + * comment and the author's name is retained. + * + * This software is provided by the author as is, and without any expressed + * or implied warranties, including, but not limited to, the implied + * warranties of merchantability and fitness for a particular purpose. In no + * event shall the author be liable for any direct, indirect, incidental, or + * consequential damages arising in any way out of the use of this software. + */ + +#ifndef cell_H +#define cell_H + +#ifdef cell_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +struct cell { + int id; + char *prompt; + char *initial_value; + int field_width; + Widget field; + Widget label; + }; + +EXTERN int LocateCell (struct cell *p, int id); + +EXTERN double GetCellValueDouble (struct cell *p, int n, double *value); + +EXTERN void SetCellValueDouble (struct cell *p, int n, double value); + +EXTERN char * GetCellValueString (struct cell *p, int n, char *value); + +EXTERN void SetCellValueString (struct cell *p, int n, char *value); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/gedit/circle.c acm-6.0+20200416/src/gedit/circle.c --- acm-5.0/src/gedit/circle.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/gedit/circle.c 2017-04-16 08:24:25.000000000 +0000 @@ -0,0 +1,112 @@ +/* + * Copyright (c) 1994, Riley Rainey, riley@netcon.com + * + * Permission to use, copy, modify and distribute (without charge) this + * software, documentation, images, etc. is granted, provided that this + * comment and the author's name is retained. + * + * This software is provided by the author as is, and without any expressed + * or implied warranties, including, but not limited to, the implied + * warranties of merchantability and fitness for a particular purpose. In no + * event shall the author be liable for any direct, indirect, incidental, or + * consequential damages arising in any way out of the use of this software. + */ + +#include + +#include "shared.h" +#include "edit.h" +#include "gutil.h" +#include "gutil1.h" + +#define circle_IMPORT +#include "circle.h" + +#define NUM_POINTS 12 + + +static point_t drag; + +void +ScaleCircle(view_info_t *p, polygon_t *poly, double scale) +{ + double a = 0.0, a_incr = M_PI * 2.0 / NUM_POINTS; + double other = 0.0, ocos, osin; + int i; + + for (i=0; ipoint[i] = drag; + switch (p->layout) { + case VL_NYX: + case VL_NXNY: + poly->point[i].point.x += osin * scale; + poly->point[i].point.y += ocos * scale; + poly->point[i].point.z += other; + break; + case VL_NYZ: + poly->point[i].point.x += other; + poly->point[i].point.y += ocos * scale; + poly->point[i].point.z += osin * scale; + break; + case VL_NXZ: + poly->point[i].point.x += osin * scale; + poly->point[i].point.y += other; + poly->point[i].point.z += ocos * scale; + break; + default: + poly->point[i].point.x += osin * scale; + poly->point[i].point.y += ocos * scale; + poly->point[i].point.z += other; + break; + } + a += a_incr; + PointToXYZ (p, &poly->point[i]); + } + + if (scale > 0.0) { + ComputePlaneEquation (poly); + } +} + +void +BeginCirclePoint (Widget w, view_info_t *p, int x, int y) +{ + polygon_t *poly; + + poly = BeginPolygon(); + poly->num_points = NUM_POINTS; + drag_origin.x = x; + drag_origin.y = y; + PointXY (w, p, x, y, &drag); + ScaleCircle (p, poly, 0.0); +} + +void +DragCirclePoint(Widget w, view_info_t *p, int x, int y) +{ + double dx = x - drag_origin.x, dy = y - drag_origin.y; + double scale = sqrt (dx * dx + dy * dy) * pixel_scale; + Display *dpy = XtDisplay(w); + + XSetFunction (dpy, p->gc, GXxor); + XSetFunction (dpy, p->other_view->gc, GXxor); + + DrawPolygon (w, cur_polygon, True); + DrawPolygon (p->other_widget, cur_polygon, True); + + ScaleCircle (p, cur_polygon, scale); + DrawPolygon (w, cur_polygon, True); + DrawPolygon (p->other_widget, cur_polygon, True); + + XSetFunction (dpy, p->gc, GXcopy); + XSetFunction (dpy, p->other_view->gc, GXcopy); +} + +void +CompleteCirclePoint(Widget w, view_info_t *p, int x, int y) +{ + CompletePolygon (w, cur_polygon); +} diff -Nru acm-5.0/src/gedit/circle.h acm-6.0+20200416/src/gedit/circle.h --- acm-5.0/src/gedit/circle.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/gedit/circle.h 2017-04-16 08:24:25.000000000 +0000 @@ -0,0 +1,33 @@ +/* + * Copyright (c) 1994, Riley Rainey, riley@netcon.com + * + * Permission to use, copy, modify and distribute (without charge) this + * software, documentation, images, etc. is granted, provided that this + * comment and the author's name is retained. + * + * This software is provided by the author as is, and without any expressed + * or implied warranties, including, but not limited to, the implied + * warranties of merchantability and fitness for a particular purpose. In no + * event shall the author be liable for any direct, indirect, incidental, or + * consequential damages arising in any way out of the use of this software. + */ + +#ifndef circle_H +#define circle_H + +#ifdef circle_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +EXTERN void ScaleCircle(view_info_t *p, polygon_t *poly, double scale); + +EXTERN void BeginCirclePoint (Widget w, view_info_t *p, int x, int y); + +EXTERN void DragCirclePoint(Widget w, view_info_t *p, int x, int y); + +EXTERN void CompleteCirclePoint(Widget w, view_info_t *p, int x, int y); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/gedit/COPYRIGHT acm-6.0+20200416/src/gedit/COPYRIGHT --- acm-5.0/src/gedit/COPYRIGHT 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/gedit/COPYRIGHT 2006-01-05 13:58:55.000000000 +0000 @@ -0,0 +1,13 @@ +GEDIT - A 3-D object editor + +Copyright(c) 1994, Riley Rainey, rainey@netcom.com + +Permission to use, copy, modify and distribute (without charge) this +software, documentation, images, etc. is granted, provided that this +comment and the author's name is retained. + +This software is provided by the author as is, and without any expressed +or implied warranties, including, but not limited to, the implied +warranties of merchantability and fitness for a particular purpose. In no +event shall the author be liable for any direct, indirect, incidental, or +consequential damages arising in any way out of the use of this software. diff -Nru acm-5.0/src/gedit/CrExFormDlg.c acm-6.0+20200416/src/gedit/CrExFormDlg.c --- acm-5.0/src/gedit/CrExFormDlg.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/gedit/CrExFormDlg.c 2017-04-16 08:24:25.000000000 +0000 @@ -0,0 +1,162 @@ +/* + * Copyright (c) 1994, Riley Rainey, riley@netcon.com + * + * Permission to use, copy, modify and distribute (without charge) this + * software, documentation, images, etc. is granted, provided that this + * comment and the author's name is retained. + * + * This software is provided by the author as is, and without any expressed + * or implied warranties, including, but not limited to, the implied + * warranties of merchantability and fitness for a particular purpose. In no + * event shall the author be liable for any direct, indirect, incidental, or + * consequential damages arising in any way out of the use of this software. + */ + +#include +#include +#include +#include +#include +#include + +#include "shared.h" + +#define CrExFormDlg_IMPORT +#include "CrExFormDlg.h" + +void +DestroyParentCallback(Widget w, XtPointer client_data, XtPointer call_data) +{ + XtDestroyWidget(XtParent(w)); +} + + +void +SetDialogPosition(Widget w, XtPointer client_data, XtPointer call_data) +{ + Position x, y, x1, y1; + Dimension twidth, width, theight, height; + Widget top = XtParent(w); + + XtVaGetValues(top, + XmNx, &x, + XmNy, &y, + XmNwidth, &twidth, + XmNheight, &theight, + NULL); + + XtVaGetValues(w, + XmNy, &x1, + XmNy, &y1, + XmNwidth, &width, + XmNheight, &height, + NULL); + + if(x1 != 0 && y1 != 0) + return; + + XtVaSetValues(w, + XmNx, x +(twidth - width) / 2, + XmNy, y +(theight - height) / 2, + NULL); + +} + + +Widget +CreateButtonArea(char *name, Widget parent, ActionAreaButton *buttons, int num_buttons, int tightness, int default_button) +{ + + Widget button_area, widget; + register int i; + Dimension height, h; + + button_area = XtVaCreateWidget(name, xmFormWidgetClass, parent, + XmNfractionBase, tightness * num_buttons - 1, + XmNskipAdjust, True, + XmNbottomAttachment, XmATTACH_FORM, + XmNleftAttachment, XmATTACH_FORM, + XmNrightAttachment, XmATTACH_FORM, + NULL); + + for(i=0; i +//#include +//#include +//#include +//#include +//#include +//#include "XrMisc.h" + +EXTERN void +DestroyParentCallback(Widget w, XtPointer client_data, XtPointer call_data); + + +EXTERN void +SetDialogPosition(Widget w, XtPointer client_data, XtPointer call_data); + +/** + * Builds an dialog box action area based on a list of + * buttons passed to it. This code is based on the example in chapter 7 of + * the O'Reilly & Associates Volume 6 by Dan Heller. + */ +EXTERN Widget +CreateButtonArea(char *name, Widget parent, ActionAreaButton *buttons, int num_buttons, int tightness, int default_button); + +EXTERN Widget +CreateExtendedFormDialog(char *name, Widget parent, Widget *content_widget, ActionAreaButton *buttons, int num_buttons, int default_button); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/gedit/dialog.c acm-6.0+20200416/src/gedit/dialog.c --- acm-5.0/src/gedit/dialog.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/gedit/dialog.c 2017-08-11 16:47:59.000000000 +0000 @@ -0,0 +1,466 @@ +/* + * Copyright (c) 1994, Riley Rainey, riley@netcon.com + * + * Permission to use, copy, modify and distribute (without charge) this + * software, documentation, images, etc. is granted, provided that this + * comment and the author's name is retained. + * + * This software is provided by the author as is, and without any expressed + * or implied warranties, including, but not limited to, the implied + * warranties of merchantability and fitness for a particular purpose. In no + * event shall the author be liable for any direct, indirect, incidental, or + * consequential damages arising in any way out of the use of this software. + */ + +#include +#include +#include +#include +#include + +#include "shared.h" +#include "cell.h" +#include "CrExFormDlg.h" + +#define dialog_IMPORT +#include "dialog.h" + +void +balance (struct balance_data *s) +{ + + double theta, cosTheta, sinTheta; + double Fmz; + +/* + * Determine the rest pitch angle of the aircraft body + */ + + theta = - atan2 (s->rn.z - s->rm.z, s->rn.x - s->rm.x); + cosTheta = cos(theta); + sinTheta = sin(theta); + s->theta = theta; + +/* + * Determine correct rm/rn values + */ + s->rn.z = s->rn.z - s->Gn - s->cn; + s->rm.z = s->rm.z - s->Gm - s->cm; + +/* + * Determine spring constants + */ + + Fmz = (s->weight * cosTheta * s->rn.x) / (s->rm.x - s->rn.x); + + s->Km = - Fmz * s->cm; + s->Kn = (- Fmz - s->weight * cosTheta) * - s->cn; + +/* + * Determine the initial grounding point + */ + + s->Gpz = s->rm.x * sinTheta + (s->rm.z + s->Gm + s->cm) * cosTheta; + +} + + +enum { + InfoName, + InfoEmptyWeight, + InfoIxx, + InfoIyy, + InfoIzz, + InfoWingSpan, + InfoWingArea, + InfoWingChord, + + GearGm, + GearcmMax, + GearDm, + GearKm, + GearGn, + GearcnMax, + GearDn, + GearKn, + + DerivClda, + DerivCldr, + DerivClp, + DerivCmq, + DerivCnr, + DerivCmAlpha, + DerivCmFactor, + + PowerplantFuel, + PowerplantThrust, + PowerplantABThrust, + PowerplantLag, + PowerplantSpFuelConsump, + PowerplantSpABFuelConsump + }; + +struct cell info_dialog_items[] = { + { InfoName, "Aircraft Name", + "Unknown", 10, NULL, NULL + }, + { InfoEmptyWeight, "Empty Weight [lbs]", + "10000", 10, NULL, NULL + }, + { InfoIxx, "Ixx [slug*ft^2]", + "5000", 10, NULL, NULL + }, + { InfoIyy, "Iyy [slug*ft^2]", + "50000", 10, NULL, NULL + }, + { InfoIzz, "Izz [slug*ft^2]", + "50000", 10, NULL, NULL + }, + { InfoWingSpan, "WingSpan [ft]", + "50000", 10, NULL, NULL + }, + { InfoWingArea, "Wing Area [ft]", + "50000", 10, NULL, NULL + }, + { InfoWingChord, "Wing Chord [ft]", + "50000", 10, NULL, NULL + }, + { -1, NULL, NULL, 0, NULL, NULL } + }; + +struct cell gear_dialog_items[] = { + { + GearGm, "Main Gear Assembly Length (Gm) [ft]", + "2.0", 10, NULL, NULL + }, + { + GearcmMax, "Main Gear Max Extension (cmMax) [ft]", + "1.0", 10, NULL, NULL + }, + { + GearDm, "Main Gear Damping Factor (Dm) [lb/ft/sec]", + "2.0", 10, NULL, NULL + }, + { + GearKm, "Main Gear Spring Factor (Km) [*]", + "0.0", 10, NULL, NULL + }, + { + GearGn, "Nose Gear Assembly Length (Gn) [ft]", + "2.0", 10, NULL, NULL + }, + { + GearcnMax, "Nose Gear Max Extension (cnMax) [ft]", + "1.0", 10, NULL, NULL + }, + { + GearDn, "Nose Gear Damping Factor (Dn) [lb/ft/sec]", + "2.0", 10, NULL, NULL + }, + { + GearKn, "Nose Gear Spring Factor (Kn) [*]", + "0.0", 10, NULL, NULL + }, + { -1, NULL, NULL, 0, NULL, NULL } +}; + +struct cell deriv_dialog_items[] = { + { + DerivClda, "Roll moment from aileron offset", + "0.03", 10, NULL, NULL + }, + { + DerivCldr, "Roll moment from rudder offset", + "0.003", 10, NULL, NULL + }, + { + DerivClp, "Roll damping", + "-0.3", 10, NULL, NULL + }, + { + DerivCmq, "Pitch damping", + "-8.0", 10, NULL, NULL + }, + { + DerivCnr, "Yaw damping", + "-2.0", 10, NULL, NULL + }, + { + DerivCmAlpha, "Pitch due to angle of attack", + "-0.3", 10, NULL, NULL + }, + { + DerivClda, "Pitch due to angle of attack [stalled]", + "-0.2", 10, NULL, NULL + }, + { -1, NULL, NULL, 0, NULL, NULL } + }; + +struct cell pwr_dialog_items[] = { + { + PowerplantFuel, "Internal Fuel Capacity [lbs]", + "1000", 10, NULL, NULL + }, + { + PowerplantThrust, "Military Thrust [lbs]", + "10000", 10, NULL, NULL + }, + { + PowerplantABThrust, "Afterburner Thrust [lbs]", + "10000", 10, NULL, NULL + }, + { + PowerplantLag, "Engine response lag [negative value]", + "-3.0", 10, NULL, NULL + }, + { + PowerplantSpFuelConsump, + "Specific fuel consumption, afterburner off [lb fuel/lb T * hr]", + "0.7", 10, NULL, NULL + }, + { + PowerplantSpABFuelConsump, + "Specific fuel consumption, afterburner on [lb fuel/lb T * hr]", + "2.50", 10, NULL, NULL + }, + { -1, NULL, NULL, 0, NULL, NULL } + }; + + + + + +static Widget +CreatePanelDialog (char *name, Widget parent, struct cell *p, int count, int calc_fn, int cancel) +{ + Arg args[10]; + char s1[32], s2[32]; + static ActionAreaButton action_items[] = { + { "Calculate", MenuCB, (XtPointer) NULL }, + { "Dismiss", MenuCB, (XtPointer) NULL }, + { "Help", NULL, NULL }, + }; + Widget dialog, form; + int i, n; + XmString s; + + count --; + + /* + * Nasty cast here to assign int param to a 32 or 64 bits pointer + * preventing gcc -Wall complains :-) + */ + action_items[0].client_data = (XtPointer) shared_IntToPtr(calc_fn); + action_items[1].client_data = (XtPointer) shared_IntToPtr(cancel); + + dialog = CreateExtendedFormDialog (name, parent, &form, action_items, + XtNumber (action_items), 0); + + for (i=0; iemptyWeight); + SetCellValueDouble (info_dialog_items, InfoIxx, c->I.m[0][0]); + SetCellValueDouble (info_dialog_items, InfoIyy, c->I.m[1][1]); + SetCellValueDouble (info_dialog_items, InfoIzz, c->I.m[2][2]); + SetCellValueDouble (info_dialog_items, InfoWingSpan, c->wings * 2.0); + SetCellValueDouble (info_dialog_items, InfoWingArea, c->wingS); + SetCellValueDouble (info_dialog_items, InfoWingChord, c->c); + + SetCellValueDouble (gear_dialog_items, GearGm, c->Gm); + SetCellValueDouble (gear_dialog_items, GearcmMax, c->cmMax); + SetCellValueDouble (gear_dialog_items, GearDm, c->Dm); + SetCellValueDouble (gear_dialog_items, GearKm, c->Km); + SetCellValueDouble (gear_dialog_items, GearGn, c->Gn); + SetCellValueDouble (gear_dialog_items, GearcnMax, c->cnMax); + SetCellValueDouble (gear_dialog_items, GearDn, c->Dn); + SetCellValueDouble (gear_dialog_items, GearKn, c->Kn); + + SetCellValueDouble (pwr_dialog_items, PowerplantFuel, + c->maxFuel); + SetCellValueDouble (pwr_dialog_items, PowerplantThrust, + c->maxThrust); + SetCellValueDouble (pwr_dialog_items, PowerplantABThrust, + c->maxABThrust); + SetCellValueDouble (pwr_dialog_items, PowerplantLag, + c->engineLag); + SetCellValueDouble (pwr_dialog_items, PowerplantSpFuelConsump, + c->spFuelConsump); + SetCellValueDouble (pwr_dialog_items, PowerplantSpABFuelConsump, + c->spABFuelConsump); +} + +void +GetCraftInfo(craftType *c) +{ + GetCellValueString (info_dialog_items, InfoName, craft_name); + GetCellValueDouble (info_dialog_items, InfoEmptyWeight, + &c->emptyWeight); + GetCellValueDouble (info_dialog_items, InfoIxx, &c->I.m[0][0]); + GetCellValueDouble (info_dialog_items, InfoIyy, &c->I.m[1][1]); + GetCellValueDouble (info_dialog_items, InfoIzz, &c->I.m[2][2]); + GetCellValueDouble (info_dialog_items, InfoWingSpan, &c->wings); + c->wings /= 2.0; + GetCellValueDouble (info_dialog_items, InfoWingArea, &c->wingS); + GetCellValueDouble (info_dialog_items, InfoWingChord, &c->c); + + GetCellValueDouble (gear_dialog_items, GearGm, &c->Gm); + GetCellValueDouble (gear_dialog_items, GearcmMax, &c->cmMax); + GetCellValueDouble (gear_dialog_items, GearDm, &c->Dm); + GetCellValueDouble (gear_dialog_items, GearKm, &c->Km); + GetCellValueDouble (gear_dialog_items, GearGn, &c->Gn); + GetCellValueDouble (gear_dialog_items, GearcnMax, &c->cnMax); + GetCellValueDouble (gear_dialog_items, GearDn, &c->Dn); + GetCellValueDouble (gear_dialog_items, GearKn, &c->Kn); + + GetCellValueDouble (pwr_dialog_items, PowerplantFuel, + &c->maxFuel); + GetCellValueDouble (pwr_dialog_items, PowerplantThrust, + &c->maxThrust); + GetCellValueDouble (pwr_dialog_items, PowerplantABThrust, + &c->maxABThrust); + GetCellValueDouble (pwr_dialog_items, PowerplantLag, + &c->engineLag); + GetCellValueDouble (pwr_dialog_items, PowerplantSpFuelConsump, + &c->spFuelConsump); + GetCellValueDouble (pwr_dialog_items, PowerplantSpABFuelConsump, + &c->spABFuelConsump); + + c->viewPoint = marker_list[MARKER_HEAD].location.point; + +} + +void +GearCalculate(craftType *c) +{ + struct balance_data b; + + b.weight = c->emptyWeight + c->maxFuel; + b.rm = marker_list[MARKER_MAIN_GEAR].location.point; + b.rn = marker_list[MARKER_NOSE_GEAR].location.point; + b.cm = GetCellValueDouble (gear_dialog_items, GearcmMax, &c->cmMax); + b.cm *= 0.6; + b.cn = GetCellValueDouble (gear_dialog_items, GearcnMax, &c->cnMax); + b.cn *= 0.6; + b.Gm = GetCellValueDouble (gear_dialog_items, GearGm, &c->Gm); + b.Gn = GetCellValueDouble (gear_dialog_items, GearGn, &c->Gn); + +#ifdef notdef + printf ("Input:\n"); + printf ("nose contact = %lf %lf %lf\n", b.rn.x, b.rn.y, b.rn.z); + printf ("main's contact = %lf %lf %lf\n", b.rm.x, b.rm.y, b.rm.z); + printf ("Weight = %lf\n", b.weight); +#endif + + balance (&b); + +#ifdef notdef + printf ("\nOutput:\n"); + printf ("rm = %lf, %lf, %lf\n", b.rm.x, b.rm.y, b.rm.z); + printf ("rn = %lf, %lf, %lf\n", b.rn.x, b.rn.y, b.rn.z); + printf ("Km = %lf\n", b.Km); + printf ("Kn = %lf\n", b.Kn); + printf ("Grounding point (z) = %lf\n", b.Gpz); + printf ("\n\"inventory\" form:\n\n"); + printf ("\tRm\t\t{%lg, %lg, %lg}\n", b.rm.x, b.rm.y, b.rm.z); + printf ("\tRn\t\t{%lg, %lg, %lg}\n", b.rn.x, b.rn.y, b.rn.z); + printf ("\tKm\t\t%lg\n", b.Km); + printf ("\tKn\t\t%lg\n", b.Kn); + printf ("\tGm\t\t%lg\n", b.Gm); + printf ("\tGn\t\t%lg\n", b.Gn); + printf ("\tCmMax\t\t%lg\n", c->cmMax); + printf ("\tCnMax\t\t%lg\n", c->cnMax); + printf ("\tGroundingPoint\t{0.0, 0.0, %lg}\n", b.Gpz); +#endif + + c->rm = b.rm; + c->rn = b.rn; + c->Km = b.Km; + c->Kn = b.Kn; + //c->groundingPoint.x = c->groundingPoint.y = 0.0; + //c->groundingPoint.z = b.Gpz; + SetCellValueDouble (gear_dialog_items, GearKm, c->Km); + SetCellValueDouble (gear_dialog_items, GearKn, c->Kn); +} + + diff -Nru acm-5.0/src/gedit/dialog.h acm-6.0+20200416/src/gedit/dialog.h --- acm-5.0/src/gedit/dialog.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/gedit/dialog.h 2017-09-07 20:20:33.000000000 +0000 @@ -0,0 +1,55 @@ +/* + * Copyright (c) 1994, Riley Rainey, riley@netcon.com + * + * Permission to use, copy, modify and distribute (without charge) this + * software, documentation, images, etc. is granted, provided that this + * comment and the author's name is retained. + * + * This software is provided by the author as is, and without any expressed + * or implied warranties, including, but not limited to, the implied + * warranties of merchantability and fitness for a particular purpose. In no + * event shall the author be liable for any direct, indirect, incidental, or + * consequential damages arising in any way out of the use of this software. + */ + +#ifndef dialog_H +#define dialog_H + +#include "../V/Vlibmath.h" + +#ifdef dialog_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + + +struct balance_data { + double weight; /* weight for this test */ + VPoint rm; /* rest main gear location (input) */ + VPoint rn; /* rest nose gear location (input) */ + double cm, cn; /* rest compression values of each strut */ + double Gm, Gn; /* strut + tire lengths */ + double Km, Kn; /* string constants (output) */ + double Gpz; /* the old "grounding point" Z value */ + double theta; + }; + +EXTERN void balance(struct balance_data *s); + +EXTERN Widget CreateInfoDialog(Widget parent); + +EXTERN Widget CreateGearDialog(Widget parent); + +EXTERN Widget CreateDerivDialog(Widget parent); + +EXTERN Widget CreatePowerplantDialog(Widget parent); + +EXTERN void InitializeDialogs(craftType *c); + +EXTERN void GetCraftInfo(craftType *c); + +EXTERN void GearCalculate(craftType *c); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/gedit/edit.c acm-6.0+20200416/src/gedit/edit.c --- acm-5.0/src/gedit/edit.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/gedit/edit.c 2017-09-14 17:46:26.000000000 +0000 @@ -0,0 +1,302 @@ +/* + * Copyright (c) 1994, Riley Rainey, riley@netcon.com + * + * Permission to use, copy, modify and distribute (without charge) this + * software, documentation, images, etc. is granted, provided that this + * comment and the author's name is retained. + * + * This software is provided by the author as is, and without any expressed + * or implied warranties, including, but not limited to, the implied + * warranties of merchantability and fitness for a particular purpose. In no + * event shall the author be liable for any direct, indirect, incidental, or + * consequential damages arising in any way out of the use of this software. + */ + +#include +#include + +#include "../util/memory.h" +#include "shared.h" +#include "gutil.h" +#include "gutil1.h" + +#define edit_IMPORT +#include "edit.h" + +void +Mirror (int op) +{ + + int i, j; + polygon_t *new, *poly; + view_info_t *p; + XtVaGetValues (twindow, + XmNuserData, &p, + NULL); + + for (i = sel_polygon; i >= 0; i = polygon_list[i].next) { + new = BeginPolygon (); + poly = &polygon_list[i]; + new->num_points = poly->num_points; + new->point = + (point_t *) memory_allocate(new->num_points * sizeof (point_t), NULL); + + for (j=0; j < poly->num_points; ++j) { + + switch (op) { + + case MENU_MIRROR_XZ: + new->point[j] = + poly->point[poly->num_points - j - 1]; + new->point[j].point.y = + - new->point[j].point.y; + PointToXYZ (p, &new->point[j]); + break; + + case MENU_MIRROR_XY: + new->point[j] = + poly->point[poly->num_points - j - 1]; + new->point[j].point.z = + - new->point[j].point.z; + PointToXYZ (p, &new->point[j]); + break; + + case MENU_MIRROR_YZ: + new->point[j] = + poly->point[poly->num_points - j - 1]; + new->point[j].point.x = + - new->point[j].point.x; + PointToXYZ (p, &new->point[j]); + break; + + } + } + + ComputePlaneEquation (new); + new->next = sel_polygon; + sel_polygon = new->id; + cur_polygon = (polygon_t *) NULL; + } + + DrawWidget (twindow, False); + DrawWidget (p->other_widget, False); +} + +void +PointToXYZ (view_info_t *p, point_t *point) +{ + +/* + * warning, signs assume the original layout only + */ + + switch (p->layout) { + + case VL_NXZ: + point->x = (int) (- point->point.x / pixel_scale) + + p->origin_x; + point->y = (int) (- point->point.y / pixel_scale) + + p->other_view->origin_y; + point->z = (int) (point->point.z / pixel_scale) + + p->origin_y; + break; + + case VL_NXNY: + point->x = (int) (- point->point.x / pixel_scale) + + p->origin_x; + point->y = (int) (- point->point.y / pixel_scale) + + p->origin_y; + point->z = (int) (point->point.z / pixel_scale) + + p->other_view->origin_y; + break; + + case VL_NYZ: + point->x = (int) (point->point.x / pixel_scale) + + p->other_view->origin_y; + point->y = (int) (- point->point.y / pixel_scale) + + p->origin_x; + point->z = (int) (point->point.z / pixel_scale) + + p->origin_y; + break; + + case VL_NYX: + point->x = (int) (point->point.x / pixel_scale) + + p->origin_y; + point->y = (int) (- point->point.y / pixel_scale) + + p->origin_x; + point->z = (int) (point->point.z / pixel_scale) + + p->other_view->origin_y; + break; + } +} + +void +ClearSelection() +{ + + int i, j; + view_info_t *p; + + XtVaGetValues (twindow, + XmNuserData, &p, + NULL); + + for (i=sel_polygon; i>= 0; i = j) { + j = polygon_list[i].next; + FreePolygon (&polygon_list[i]); + } + + sel_polygon = -1; + + DrawWidget (twindow, False); + DrawWidget (p->other_widget, False); +} + +void +CopySelection() +{ + int i, j, nn = 0; + view_info_t *p; + polygon_t *new, *poly; + + XtVaGetValues (twindow, + XmNuserData, &p, + NULL); + + ClearClipboard(); + + for (i = sel_polygon; i >= 0; i = polygon_list[i].next) { + new = BeginPolygon (); + poly = &polygon_list[i]; + new->num_points = poly->num_points; + new->point = + (point_t *) memory_allocate(new->num_points * sizeof (point_t), NULL); + + for (j=0; j < poly->num_points; ++j) { + new->point[j] = poly->point[j]; + PointToXYZ (p, &new->point[j]); + } + + ComputePlaneEquation (new); + new->next = clipboard_polygon; + clipboard_polygon = new->id; + cur_polygon = (polygon_t *) NULL; + ++nn; + } +} + +void +ClearClipboard() +{ + int i, j; + view_info_t *p; + + XtVaGetValues (twindow, + XmNuserData, &p, + NULL); + + for (i=clipboard_polygon; i>= 0; i = j) { + j = polygon_list[i].next; + FreePolygon (&polygon_list[i]); + } + + clipboard_polygon = -1; +} + +void +PasteSelection() +{ + int i, j, nn = 0; + view_info_t *p; + polygon_t *new, *poly; + + XtVaGetValues (twindow, + XmNuserData, &p, + NULL); + + ClearSelection(); + + for (i = clipboard_polygon; i >= 0; i = polygon_list[i].next) { + new = BeginPolygon (); + poly = &polygon_list[i]; + new->num_points = poly->num_points; + new->point = + (point_t *) memory_allocate(new->num_points * sizeof (point_t), NULL); + + for (j=0; j < poly->num_points; ++j) { + new->point[j] = poly->point[j]; + /*new->point[j].y += 1.0; + new->point[j].z += 1.0;*/ + PointToXYZ (p, &new->point[j]); + } + + ComputePlaneEquation (new); + new->next = sel_polygon; + sel_polygon = new->id; + cur_polygon = (polygon_t *) NULL; + ++nn; + } + + DrawWidget (twindow, False); + DrawWidget (p->other_widget, False); +} + +void +RotateXSelection() +{ + int i, j; + view_info_t *p; + double tmp; + polygon_t *poly; + + XtVaGetValues (twindow, + XmNuserData, &p, + NULL); + + for (i = sel_polygon; i >= 0; i = polygon_list[i].next) { + poly = &polygon_list[i]; + + for (j=0; j < poly->num_points; ++j) { + tmp = poly->point[j].point.z; + poly->point[j].point.z = poly->point[j].point.y; + poly->point[j].point.y = tmp; + PointToXYZ (p, &poly->point[j]); + } + + ComputePlaneEquation (poly); + + } + + DrawWidget (twindow, False); + DrawWidget (p->other_widget, False); +} + +void +PrintList(int start) +{ + int i; + + if (start == -1) { + printf ("NULL"); + } + else { + for (i = start; i >= 0; i = polygon_list[i].next) { + printf ("%d ", i); + } + } + printf ("\n"); +} + +void +PrintDiagnostics() +{ + printf ("sel_polygon list : "); + PrintList (sel_polygon); + printf ("unsel_polygon list : "); + PrintList (unsel_polygon); + printf ("clipboard_polygon list : "); + PrintList (clipboard_polygon); +} + + + diff -Nru acm-5.0/src/gedit/edit.h acm-6.0+20200416/src/gedit/edit.h --- acm-5.0/src/gedit/edit.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/gedit/edit.h 2017-04-16 08:24:25.000000000 +0000 @@ -0,0 +1,43 @@ +/* + * Copyright (c) 1994, Riley Rainey, riley@netcon.com + * + * Permission to use, copy, modify and distribute (without charge) this + * software, documentation, images, etc. is granted, provided that this + * comment and the author's name is retained. + * + * This software is provided by the author as is, and without any expressed + * or implied warranties, including, but not limited to, the implied + * warranties of merchantability and fitness for a particular purpose. In no + * event shall the author be liable for any direct, indirect, incidental, or + * consequential damages arising in any way out of the use of this software. + */ + +#ifndef edit_H +#define edit_H + +#ifdef edit_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +EXTERN void Mirror (int op); + +EXTERN void PointToXYZ (view_info_t *p, point_t *point); + +EXTERN void ClearSelection(void); + +EXTERN void CopySelection(void); + +EXTERN void ClearClipboard(void); + +EXTERN void PasteSelection(void); + +EXTERN void RotateXSelection(void); + +EXTERN void PrintList(int start); + +EXTERN void PrintDiagnostics(void); + +#undef EXTERN +#endif Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/src/gedit/gdf-big-endian/ewacs.gdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/src/gedit/gdf-big-endian/ewacs.gdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/src/gedit/gdf-big-endian/f181.gdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/src/gedit/gdf-big-endian/f181.gdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/src/gedit/gdf-big-endian/f18.gdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/src/gedit/gdf-big-endian/f18.gdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/src/gedit/gdf-big-endian/kc135.gdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/src/gedit/gdf-big-endian/kc135.gdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/src/gedit/gdf-big-endian/mig25.gdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/src/gedit/gdf-big-endian/mig25.gdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/src/gedit/gdf-big-endian/mig29.gdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/src/gedit/gdf-big-endian/mig29.gdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/src/gedit/gdf-big-endian/scaled-c172.gdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/src/gedit/gdf-big-endian/scaled-c172.gdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/src/gedit/gdf-big-endian/scaled-ewacs.gdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/src/gedit/gdf-big-endian/scaled-ewacs.gdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/src/gedit/gdf-big-endian/scaled-mig29.gdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/src/gedit/gdf-big-endian/scaled-mig29.gdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/src/gedit/gdf-big-endian/scale-f18.gdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/src/gedit/gdf-big-endian/scale-f18.gdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/src/gedit/gdf-big-endian/xmig29.gdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/src/gedit/gdf-big-endian/xmig29.gdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/src/gedit/gdf-little-endian/sa10-s.gdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/src/gedit/gdf-little-endian/sa10-s.gdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/src/gedit/gdf-little-endian/sa11-u.gdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/src/gedit/gdf-little-endian/sa11-u.gdf differ Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/src/gedit/gdf-little-endian/sa5-u.gdf and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/src/gedit/gdf-little-endian/sa5-u.gdf differ diff -Nru acm-5.0/src/gedit/gedit.c acm-6.0+20200416/src/gedit/gedit.c --- acm-5.0/src/gedit/gedit.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/gedit/gedit.c 2017-10-22 15:05:29.000000000 +0000 @@ -0,0 +1,1330 @@ +/* + * Copyright (c) 1994, Riley Rainey, riley@netcon.com + * + * Permission to use, copy, modify and distribute (without charge) this + * software, documentation, images, etc. is granted, provided that this + * comment and the author's name is retained. + * + * This software is provided by the author as is, and without any expressed + * or implied warranties, including, but not limited to, the implied + * warranties of merchantability and fitness for a particular purpose. In no + * event shall the author be liable for any direct, indirect, incidental, or + * consequential damages arising in any way out of the use of this software. + */ + +/* + * LINKER_OPTIONS -lX11 + * LINKER_OPTIONS -lXt + * LINKER_OPTIONS -lXm + */ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../util/memory.h" +#include "shared.h" +#include "dialog.h" +#include "CrExFormDlg.h" +#include "gutil1.h" +#include "io.h" +#include "actions.h" +#include "VWriteObject.h" +#include "VReadObject.h" +#include "xbm/curs_poly.xbm" +#include "xbm/curs_poly_mask.xbm" +#include "xbm/curs_marker.xbm" +#include "xbm/curs_marker_mask.xbm" + + +static char grid_dash_list[2] = { 1, 4 }; + +static XmStringCharSet charset = (XmStringCharSet) XmSTRING_DEFAULT_CHARSET; + +/* + * fallback resources + */ + +static String fallback[] = { + "*.Background: GhostWhite", + "*buttons*highlightColor: GhostWhite", + + "*.fontList: -*-helvetica-medium-r-*-*-*-140-*", + "*.rulerFont: -*-courier-bold-r-*-*-*-140-*", + "*XmTextField.fontList: -*-courier-medium-r-*-*-*-140-*", + "*XmPushButton.shadowThickness: 3", + "*XmDrawingArea.traversalOn: false", + "*.menu_bar*Background: #bbb", + "*.menu_bar.spacing: 10", + "*.top_frame.shadowType: XmSHADOW_ETCHED_OUT", + "*.bottom_frame.shadowType: XmSHADOW_ETCHED_OUT", + "*.twindow.background: #d8d8d8", + "*.twindow.foreground: black", + "*.bwindow.background: #e1caac", + "*.bwindow.foreground: black", + "*.main.form.height: 700", + "*.main.form.width: 950", + + "*set_views.labelString: Set Views ...", + "*mirror_xz.labelString: Mirror left/right", + "*mirror_xz.acceleratorText: Alt-L", + "*mirror_xz.accelerator: Metal:", + "*mirror_xz.mnemonic: l", + "*mirror_xy.labelString: Mirror top/bottom", + "*mirror_xy.acceleratorText: Alt-T", + "*mirror_xy.accelerator: Metat:", + "*mirror_xy.mnemonic: t", + "*mirror_yz.labelString: Mirror front/back", + "*mirror_yz.acceleratorText: Alt-F", + "*mirror_yz.accelerator: Metaf:", + "*mirror_yz.mnemonic: f", + "*rescale.labelString: Rescale Object ...", + "*rescale.mnemonic: R", + + "*info.labelString: Aircraft Information ...", + "*gear.labelString: Landing Gear ...", + "*stability.labelString: Stability Derivatives ...", + "*powerplant.labelString: Powerplant ...", + + "*rescale_dialog.dialogTitle: Rescale Object", + + "*open_d.dialogTitle: Open a File", + "*open_d.okLabelString: Open", + "*open_d.selectionLabelString: Open which file?", + "*open_d.autoUnmanage: true", + "*open_d*pattern: *.gdf", + + "*save_as_d.dialogTitle: Save Work", + "*save_as_d.selectionLabelString: File name:", + "*save_as_d.okLabelString: Save", + "*save_as_d.*.fontList: -*-helvetica-medium-r-*-*-*-120-*", + + "*gedit_format.labelString: Gedit format", + "*gedit_format.set: true", + "*v_format.labelString: V format", + "*rayshade_format.labelString: ACM Inventory format", + + "*show_grid.visibleWhenOff: true", + "*show_ruler.visibleWhenOff: true", + + "*coodinates*columns: 8", + "*coodinates*sensitive: false", + + "*new.labelString: New", + "*open.labelString: Open ...", + "*save.labelString: Save", + "*save_as.labelString: Save As ...", + "*exit.labelString: Exit", + + "*new.acceleratorText: Alt-N", + "*new.accelerator: Metan:", + "*new.mnemonic: N", + "*open.acceleratorText: Alt-O", + "*open.accelerator: Metao:", + "*open.mnemonic: O", + "*save.acceleratorText: Alt-S", + "*save.accelerator: Metas:", + "*save.mnemonic: S", + "*save_as.mnemonic: A", + "*exit.acceleratorText: Alt-E", + "*exit.accelerator: Metae:", + "*exit.mnemonic: E", + + "*cut.labelString: Cut", + "*cut.acceleratorText: Shift-Del", + "*cut.accelerator: ShiftDelete:", + "*cut.mnemonic: t", + "*copy.labelString: Copy", + "*copy.acceleratorText: Ctrl-Ins", + "*copy.accelerator: CtrlInsert:", + "*copy.mnemonic: C", + "*paste.labelString: Paste", + "*paste.acceleratorText: Shift-Ins", + "*paste.accelerator: ShiftInsert:", + "*paste.mnemonic: P", + "*clear.labelString: Clear", + "*clear.mnemonic: e", + "*rotx.labelString: Rotate 90 about X-Axis", + + "*info_dialog*XmLabelGadget.topOffset: 7", + "*info_dialog*XmLabelGadget.rightOffset: 10", + "*info_dialog*XmLabelGadget.leftOffset: 10", + "*info_dialog*XmTextField.rightOffset: 10", + "*gear_dialog*XmLabelGadget.topOffset: 7", + "*gear_dialog*XmLabelGadget.rightOffset: 10", + "*gear_dialog*XmLabelGadget.leftOffset: 10", + "*gear_dialog*XmTextField.rightOffset: 10", + "*powerplant_dialog*XmLabelGadget.topOffset: 7", + "*powerplant_dialog*XmLabelGadget.rightOffset: 10", + "*powerplant_dialog*XmLabelGadget.leftOffset: 10", + "*powerplant_dialog*XmTextField.rightOffset: 10", + "*stability_dialog*XmLabelGadget.topOffset: 7", + "*stability_dialog*XmLabelGadget.rightOffset: 10", + "*stability_dialog*XmLabelGadget.leftOffset: 10", + "*stability_dialog*XmTextField.rightOffset: 10", + + "*stability_dialog*Calculate.sensitive: false", + "*info_dialog*Calculate.sensitive: false", + "*info_dialog*Calculate.sensitive: false", + + NULL + }; + +static XrmOptionDescRec options[] = { + {"-controllerClass", "*controllerClass", XrmoptionSepArg, "is"}, + }; + +static XtResource resources[] = { + { + XtNselectionColor, + XtCSelectionColor, + XtRPixel, + sizeof(Pixel), + XtOffset(AppDataPtr, select_pixel), + XtRString, + (caddr_t) "firebrick" + }, + { + XtNgridColor, + XtCGridColor, + XtRPixel, + sizeof(Pixel), + XtOffset(AppDataPtr, grid_pixel), + XtRString, + (caddr_t) "black" + }, + { + XtNlineThickness, + XtCLineThickness, + XtRInt, + sizeof(int), + XtOffset(AppDataPtr, line_thickness), + XtRImmediate, + (caddr_t) 0 + }, + { + XtNselectionThickness, + XtCSelectionThickness, + XtRInt, + sizeof(int), + XtOffset(AppDataPtr, selection_thickness), + XtRImmediate, + (caddr_t) 2 + }, + { + XtNboxSize, + XtCBoxSize, + XtRInt, + sizeof(int), + XtOffset(AppDataPtr, box_size), + XtRImmediate, + (caddr_t) 5 + }, + { + XtNpickSensitivity, + XtCPickSensitivity, + XtRInt, + sizeof(int), + XtOffset(AppDataPtr, pick_sensitivity), + XtRImmediate, + (caddr_t) 64 + }, + { + XtNbuttonSize, + XtCButtonSize, + XtRInt, + sizeof(int), + XtOffset(AppDataPtr, button_size), + XtRImmediate, + (caddr_t) 32 + }, + { + XtNcursorForeground, + XtCCursorForeground, + XtRPixel, + sizeof(Pixel), + XtOffset(AppDataPtr, cursor_foreground), + XtRString, + (caddr_t) "black" + }, + { + XtNcursorBackground, + XtCCursorBackground, + XtRPixel, + sizeof(Pixel), + XtOffset(AppDataPtr, cursor_background), + XtRString, + (caddr_t) "white" + }, + { + XtNshowGrid, + XtCShowGrid, + XmRBoolean, + sizeof(Boolean), + XtOffset(AppDataPtr, show_grid), + XtRString, + (caddr_t) "true" + }, + { + XtNshowRuler, + XtCShowRuler, + XmRBoolean, + sizeof(Boolean), + XtOffset(AppDataPtr, show_ruler), + XtRString, + (caddr_t) "false" + }, + { + XtNrulerFont, + XtCFont, + XtRFontStruct, + sizeof(XFontStruct *), + XtOffset(AppDataPtr, ruler_font), + XtRString, + (caddr_t) "fixed" + } + + }; + +typedef struct { + Boolean defined_in_this_version; + Widget widget; + char *name; + char *pixmap_file; + } button_list_t; + +button_list_t button_list[] = { + { True, NULL, "point", "xbm/cursor_%d.xbm" }, + { False, NULL, "hand", "xbm/hand_%d.xbm" }, + { True, NULL, "polygon", "xbm/polygon_%d.xbm" }, + { True, NULL, "circle", "xbm/circle_%d.xbm" }, + { True, NULL, "origin", "xbm/origin_%d.xbm" }, + { True, NULL, "zoom_out", "xbm/zoom_out_%d.xbm" }, + { True, NULL, "zoom_in", "xbm/zoom_in_%d.xbm" } + }; + + +#define MAX_ARGS 16 +#define APP_CLASS "Gedit" + + +static Widget help_box; +//static Widget view_box = (Widget) NULL; + + +static void +ViewCB (w, client_data, call_data) +Widget w; +caddr_t client_data; +caddr_t call_data; +{ + register XmToggleButtonCallbackStruct *cbs = + (XmToggleButtonCallbackStruct *) call_data; + + if (cbs->set == False) + return; + + if (client_data == 0) + desired_view = VIEW_LEFT_TOP; + else + desired_view = VIEW_FRONT_TOP; + +} + +static Widget +CreateHelp (parent) +Widget parent; +{ + + Widget button; + Widget message_box; + Arg args[MAX_ARGS]; + register int n; + + static char message[BUFSIZ]; + XmString title_string = NULL; + XmString message_string = NULL; + XmString button_string = NULL; + + sprintf (message, "\ +Gedit: A Three Dimensional Object Editor\n\ +\n\ +Copyright (c) 1991 Riley Rainey\n\ +\n\n"); + + message_string = XmStringCreateLtoR (message, charset); + button_string = XmStringCreateLtoR ("Continue", charset); + title_string = XmStringCreateLtoR ("graphics editor help", charset); + + n = 0; + XtSetArg (args[n], XmNdialogTitle, title_string); n++; + XtSetArg (args[n], XmNokLabelString, button_string); n++; + XtSetArg (args[n], XmNmessageString, message_string); n++; + message_box = XmCreateMessageDialog (parent, "help_box", args, n); + + button = XmMessageBoxGetChild (message_box, XmDIALOG_CANCEL_BUTTON); + XtUnmanageChild (button); + button = XmMessageBoxGetChild (message_box, XmDIALOG_HELP_BUTTON); + XtUnmanageChild (button); + + if (title_string) + XmStringFree (title_string); + if (message_string) + XmStringFree (message_string); + if (button_string) + XmStringFree (button_string); + + return (message_box); +} + +static Widget +CreateViewsDialog (parent) +Widget parent; +{ + + XmString string; + static ActionAreaButton action_items[] = { + { "Ok", MenuCB, (XtPointer) MENU_SET_VIEWS_COMPLETE}, + { "Cancel", MenuCB, (XtPointer) MENU_SET_VIEWS_CANCEL}, + { "Help", NULL, NULL }, + }; + Widget dialog, string_w, form, box; + + dialog = CreateExtendedFormDialog("dialog", parent, &form, action_items, + XtNumber (action_items), 0); + + string = XmStringCreateSimple("Select the desired views:"); + string_w = XtVaCreateManagedWidget("label", xmLabelGadgetClass, form, + XmNlabelString, string, + XmNleftAttachment, XmATTACH_FORM, + XmNtopAttachment, XmATTACH_FORM, + NULL); + XmStringFree(string); + + box = XmVaCreateSimpleRadioBox (form, "box", 0, ViewCB, + XmVaRADIOBUTTON, + XmStringCreateSimple("Left side / Top"), NULL, NULL, NULL, + XmVaRADIOBUTTON, + XmStringCreateSimple("Front / Top"), NULL, NULL, NULL, + XmNleftAttachment, XmATTACH_FORM, + XmNrightAttachment, XmATTACH_FORM, + XmNtopAttachment, XmATTACH_WIDGET, + XmNtopWidget, string_w, + NULL); + + XtManageChild (box); + XtManageChild (form); + return dialog; + +} + +static Widget +CreateRescaleDialog (parent) +Widget parent; +{ + + XmString string; + static ActionAreaButton action_items[] = { + { "Apply", MenuCB, (XtPointer) MENU_RESCALE_APPLY}, + { "Cancel", MenuCB, (XtPointer) MENU_RESCALE_CANCEL}, + { "Help", NULL, NULL }, + }; + Widget dialog, string_w, prompt, form; + + dialog = CreateExtendedFormDialog("rescale_dialog", parent, &form, + action_items, XtNumber (action_items), 0); + + string = XmStringCreateSimple("Current object dimensions:"); + string_w = XtVaCreateManagedWidget("label", xmLabelGadgetClass, form, + XmNlabelString, string, + XmNleftAttachment, XmATTACH_FORM, + XmNtopAttachment, XmATTACH_FORM, + NULL); + XmStringFree(string); + + extent_x = XtVaCreateManagedWidget("label_x", xmLabelGadgetClass, form, + XmNleftAttachment, XmATTACH_FORM, + XmNtopAttachment, XmATTACH_WIDGET, + XmNtopWidget, string_w, + NULL); + + extent_y = XtVaCreateManagedWidget("label_y", xmLabelGadgetClass, form, + XmNleftAttachment, XmATTACH_FORM, + XmNtopAttachment, XmATTACH_WIDGET, + XmNtopWidget, extent_x, + NULL); + + extent_z = XtVaCreateManagedWidget("label_z", xmLabelGadgetClass, form, + XmNleftAttachment, XmATTACH_FORM, + XmNtopAttachment, XmATTACH_WIDGET, + XmNtopWidget, extent_y, + NULL); + + string = XmStringCreateSimple("Enter the object scaling factor:"); + prompt = XtVaCreateManagedWidget("label_z", xmLabelGadgetClass, form, + XmNlabelString, string, + XmNleftAttachment, XmATTACH_FORM, + XmNtopAttachment, XmATTACH_WIDGET, + XmNtopWidget, extent_z, + NULL); + XmStringFree(string); + + rescale_field = XtVaCreateManagedWidget("rescale_field", + xmTextFieldWidgetClass, form, + XmNleftAttachment, XmATTACH_FORM, + XmNtopAttachment, XmATTACH_WIDGET, + XmNtopWidget, prompt, + XmNcolumns, 32, + NULL); + + XtManageChild (form); + return dialog; + +} + +static void +InitializeCursors() +{ + + unsigned long fg = 1, bg = 0; + XColor colors[2]; + Drawable d; + Display *dpy; + Pixmap source, mask; + Colormap cmap; + + dpy = XtDisplay (twindow); + d = RootWindow(dpy, DefaultScreen(dpy)); + + XtVaGetValues (twindow, + XmNcolormap, &cmap, + NULL); + + cursors[CURSOR_POINT] = XCreateFontCursor (dpy, XC_left_ptr); + + source = XCreatePixmapFromBitmapData (dpy, d, curs_poly_bits, + curs_poly_width, curs_poly_height, + fg, bg, 1); + mask = XCreatePixmapFromBitmapData (dpy, d, curs_poly_mask_bits, + curs_poly_width, curs_poly_height, + fg, bg, 1); + + colors[0].pixel = app_data.cursor_foreground; + colors[1].pixel = app_data.cursor_background; + XQueryColors (dpy, cmap, colors, 2); + + cursors[CURSOR_POLY] = XCreatePixmapCursor (dpy, source, + mask, &colors[0], &colors[1], + curs_poly_x_hot, curs_poly_y_hot); + XFreePixmap (dpy, source); + XFreePixmap (dpy, mask); + + source = XCreatePixmapFromBitmapData (dpy, d, curs_marker_bits, + curs_marker_width, curs_marker_height, + fg, bg, 1); + mask = XCreatePixmapFromBitmapData (dpy, d, curs_marker_mask_bits, + curs_marker_width, curs_marker_height, + fg, bg, 1); + + cursors[CURSOR_MARKER] = XCreatePixmapCursor (dpy, source, + mask, &colors[0], &colors[1], + curs_marker_x_hot, curs_marker_y_hot); + XFreePixmap (dpy, source); + XFreePixmap (dpy, mask); + + cursors[CURSOR_ORIGIN] = XCreateFontCursor (dpy, XC_crosshair); + +} + +static void +QuitCB (w, client_data, call_data) +Widget w; +caddr_t client_data; +caddr_t call_data; +{ + + exit (0); +} + +static void +HelpCB (w, client_data, call_data) +Widget w; +caddr_t client_data; +caddr_t call_data; +{ + + XtManageChild (help_box); +} + +static void +ButtonCB (w, client_data, call_data) +Widget w; +caddr_t client_data; +caddr_t call_data; +{ + + switch ( shared_PtrToInt(client_data) ) { + + case 0: + edit_state = STATE_POINT; + SetCursor (CURSOR_POINT); + break; + + case 1: + break; + + case 2: + edit_state = STATE_POLYGON; + SetCursor (CURSOR_POLY); + break; + + case 3: + edit_state = STATE_CIRCLE; + SetCursor (CURSOR_CIRCLE); + break; + + case 4: + edit_state = STATE_MOVE_ORIGIN; + SetCursor (CURSOR_ORIGIN); + break; + + case 5: + RescaleView(twindow, 1 / 1.2); + XmProcessTraversal (button_list[0].widget, XmTRAVERSE_CURRENT); + edit_state = STATE_POINT; + SetCursor (CURSOR_POINT); + break; + + case 6: + RescaleView(twindow, 1.2); + XmProcessTraversal (button_list[0].widget, XmTRAVERSE_CURRENT); + edit_state = STATE_POINT; + SetCursor (CURSOR_POINT); + break; + + default: + printf ("button %d\n", shared_PtrToInt(client_data)); + + } +} + +static void +FileCB (w, client_data, call_data) +Widget w; +caddr_t client_data; +caddr_t call_data; +{ + register int menu_id = shared_PtrToInt(client_data), i; + register XmSelectionBoxCallbackStruct *p = + (XmSelectionBoxCallbackStruct *) call_data; + char *value; + Boolean state; + + XmStringGetLtoR (p->value, charset, &value); + + switch (menu_id) { + + case MENU_OPEN: + ReadGeditFile (value); + break; + + case MENU_SAVE_AS: + for (i=0; i < 3; ++i) { + + XtVaGetValues (save_formats[i], + XmNset, &state, + NULL); + + if (state) { + switch (i) { + + case 0: + WriteGeditFile (value); + break; + case 1: + WriteVFile (value); + break; + } + + break; + } + } + break; + } + + strcpy (filename, value); + filename_valid = True; + + XtFree (value); +} + +static void +AllocPixmap (w, width, height) +Widget w; +Dimension width, height; +{ + + Pixel bg; + view_info_t *p; + Display *d; + int depth; + + d = XtDisplay (w); + + XtVaGetValues (w, + XmNbackground, &bg, + XmNuserData, &p, + XmNdepth, &depth, + NULL); + + if (p->flags & VI_PIXMAP_ALLOCATED) + XFreePixmap (d, p->pixmap); + + p->pixmap = XCreatePixmap (d, RootWindow (d, DefaultScreen(d)), + width, height, depth); + + XSetForeground (d, p->erase_gc, bg); + XSetLineAttributes (d, p->erase_gc, app_data.selection_thickness, + LineSolid, CapButt, JoinMiter); + + XFillRectangle (d, p->pixmap, p->erase_gc, 0, 0, width, height); + + p->width = width; + p->height = height; + p->flags |= VI_PIXMAP_ALLOCATED; +} + + +static void +WindowCB (w, client_data, call_data) +Widget w; +caddr_t client_data; +caddr_t call_data; +{ + + register XmDrawingAreaCallbackStruct *q; + view_info_t *p; + + q = (XmDrawingAreaCallbackStruct *) call_data; + + XtVaGetValues (w, + XmNuserData, &p, + NULL); + + switch (q->reason) { + + case XmCR_EXPOSE: + if ((p->flags & VI_PIXMAP_ALLOCATED) == 0) { + XtVaGetValues (w, + XmNwidth, &p->width, + XmNheight, &p->height, + NULL); + AllocPixmap (w, p->width, p->height); + } + XCopyArea (XtDisplay(w), p->pixmap, XtWindow(w), + p->gc, 0, 0, p->width, p->height, 0, 0); + break; + + case XmCR_RESIZE: + XtVaGetValues (w, + XmNwidth, &p->width, + XmNheight, &p->height, + NULL); + AllocPixmap (w, p->width, p->height); + p->origin_x = (p->width + 1) / 2; + p->origin_y = (p->height + 1) / 2; + DrawWidget (w, False); + break; + + } + +} + + +static char *markers[] = { + "Pilot's Head Location", + "Nose/Tail Gear Ground Contact Point", + "Main Gear Ground Contact Point", + "Tail Ground Contact Point", + NULL + }; + + +static void +CreateMarkerList(Widget parent) +{ + + register char **p; + register int count = 0, i, n; + XmString string; + Widget item, menu, cascade; + Arg args[4]; + char s[32]; + + for (p=markers; *p; ++p) { + ++count; + } + + marker_count = count; + + n = 0; + menu = XmCreatePulldownMenu (parent, "marker_menu", args, n); + + marker_list = (marker_t *) XtMalloc (count * sizeof(marker_t)); + + for (i=0; ifid; + t_info.gc = XCreateGC (display, + RootWindow(display, DefaultScreen(display)), + GCGraphicsExposures | GCFont, &gcv); + t_info.erase_gc = XCreateGC (display, + RootWindow(display, DefaultScreen(display)), + GCGraphicsExposures, &gcv); + t_info.grid_gc = XCreateGC (display, + RootWindow(display, DefaultScreen(display)), + GCGraphicsExposures | GCLineStyle, &gcv); + XSetDashes (display, t_info.grid_gc, 0, grid_dash_list, 2); + + XtVaSetValues (twindow, + XmNuserData, &t_info, + NULL); + + display = XtDisplay (twindow); + b_info.flags = 0; + b_info.other_view = &t_info; + b_info.layout = VL_NXNY; + b_info.other_widget = twindow; + b_info.other_window = XtWindow (twindow); + b_info.gc = XCreateGC (display, + RootWindow(display, DefaultScreen(display)), + GCGraphicsExposures | GCFont, &gcv); + b_info.erase_gc = XCreateGC (display, + RootWindow(display, DefaultScreen(display)), + GCGraphicsExposures, &gcv); + b_info.grid_gc = XCreateGC (display, + RootWindow(display, DefaultScreen(display)), + GCGraphicsExposures | GCLineStyle, &gcv); + XSetDashes (display, b_info.grid_gc, 0, grid_dash_list, 2); + + XtVaSetValues (bwindow, + XmNuserData, &b_info, + NULL); + + help_box = CreateHelp (toplevel); + + edit_state = STATE_POINT; + cur_polygon = (polygon_t *) NULL; + polygon_max = 256; + polygon_list = (polygon_t *) memory_allocate(polygon_max * sizeof (polygon_t), NULL); + sel_polygon = unsel_polygon = clipboard_polygon = -1; + drag_mode = False; + + for (i=0; i +#include + +#include "shared.h" +#include "edit.h" + +#define gutil1_IMPORT +#include "gutil1.h" + +#define MINIMUM_GRID_SPACING 50 +#define MINIMUM_RULER_SPACING 50 +#define RULER_MARGIN 2 +#define RULER_MAJOR_LENGTH 7 +#define RULER_MINOR1_LENGTH 4 +#define RULER_MINOR2_LENGTH 2 +#define RULER_THICKNESS 2 + +void +RescaleView (Widget w, double factor) +{ + polygon_t *poly; + point_t *q; + view_info_t *p; + register int i, j, xc, yc, zc; + + XtVaGetValues (w, + XmNuserData, &p, + NULL); + + switch (p->layout) { + + case VL_NXNY: + case VL_NYX: + xc = (p->width + 1) / 2; + yc = (p->height + 1) / 2; + zc = (p->other_view->height + 1) / 2; + p->other_view->origin_x = + p->origin_x = (p->origin_x - xc) * factor + xc; + p->origin_y = (p->origin_y - yc) * factor + yc; + p->other_view->origin_y = + (p->other_view->origin_y - zc) * factor + zc; + break; + + case VL_NXZ: + xc = (p->width + 1) / 2; + yc = (p->other_view->height + 1) / 2; + zc = (p->height + 1) / 2; + p->other_view->origin_x = + p->origin_x = (p->origin_x - xc) * factor + xc; + p->origin_y = (p->origin_y - zc) * factor + zc; + p->other_view->origin_y = + (p->other_view->origin_y - yc) * factor + yc; + break; + + case VL_NYZ: + xc = (p->other_view->height + 1) / 2; + yc = (p->width + 1) / 2; + zc = (p->height + 1) / 2; + p->other_view->origin_x = + p->origin_x = (p->origin_x - yc) * factor + yc; + p->origin_y = (p->origin_y - zc) * factor + zc; + p->other_view->origin_y = + (p->other_view->origin_y - xc) * factor + xc; + break; + + } + + pixel_scale /= factor; + + for (i=0, poly=polygon_list; i < polygon_max; ++i, ++poly) { + for (j=0, q=poly->point; j < poly->num_points; ++j, ++q) { + PointToXYZ (p, q); + } + } + + DrawWidget (w, False); + DrawWidget (p->other_widget, False); +} + +void +DrawWidget (Widget w, Boolean immediate) +{ + polygon_t *poly; + point_t *q; + view_info_t *p; + register int i, j; + int x1, y1, x2, y2; + Display *dpy; + Drawable d; + Pixel fg, bg; + + XtVaGetValues (w, + XmNuserData, &p, + XmNforeground, &fg, + XmNbackground, &bg, + NULL); + + dpy = XtDisplay (w); + d = XtWindow (w); + + if (d == 0) + immediate = False; + + XSetForeground (dpy, p->gc, bg); + if (immediate) + XFillRectangle (dpy, d, p->gc, 0, 0, p->width, p->height); + XFillRectangle (dpy, p->pixmap, p->gc, 0, 0, p->width, p->height); + + XSetForeground (dpy, p->gc, fg); + XSetLineAttributes (dpy, p->gc, app_data.line_thickness, LineSolid, + CapButt, JoinMiter); + + for (i=unsel_polygon; i >= 0; i = polygon_list[i].next) { + poly = &polygon_list[i]; + if (poly->num_points == 0) + continue; + WorldToWidget (p, &poly->point[poly->num_points-1], &x1, &y1); + for (j=0, q=poly->point; j < poly->num_points; ++j, ++q) { + WorldToWidget (p, q, &x2, &y2); + if (immediate) + XDrawLine (dpy, d, p->gc, x1, y1, x2, y2); + XDrawLine (dpy, p->pixmap, p->gc, x1, y1, x2, y2); + x1 = x2; + y1 = y2; + } + } + + XSetForeground (dpy, p->gc, app_data.select_pixel); + XSetLineAttributes (dpy, p->gc, app_data.selection_thickness, LineSolid, + CapButt, JoinMiter); + + for (i=sel_polygon; i >= 0; i = polygon_list[i].next) { + poly = &polygon_list[i]; + if (poly->num_points == 0) + continue; + WorldToWidget (p, &poly->point[poly->num_points-1], &x1, &y1); + for (j=0, q=poly->point; j < poly->num_points; ++j, ++q) { + WorldToWidget (p, q, &x2, &y2); + if (immediate) + XDrawLine (dpy, d, p->gc, x1, y1, x2, y2); + XDrawLine (dpy, p->pixmap, p->gc, x1, y1, x2, y2); + x1 = x2; + y1 = y2; + } + } + + if (immediate) + DrawGrid (p, dpy, d); + DrawGrid (p, dpy, p->pixmap); + + if (immediate) + DrawRuler (p, dpy, d, bg); + DrawRuler (p, dpy, p->pixmap, bg); + + if (immediate == False && d != 0) + XCopyArea (dpy, p->pixmap, d, p->gc, 0, 0, p->width, p->height, + 0, 0); +} + +void +DrawPolygon (Widget w, polygon_t *poly, Boolean immediate) +{ + + point_t *q; + view_info_t *p; + register int j; + int x1, y1, x2, y2; + Display *dpy; + Drawable d; + Pixel fg, bg; + + XtVaGetValues (w, + XmNuserData, &p, + XmNforeground, &fg, + XmNbackground, &bg, + NULL); + + dpy = XtDisplay (w); + d = XtWindow (w); + + if (d == 0) + immediate = False; + + XSetForeground (dpy, p->gc, fg); + XSetLineAttributes (dpy, p->gc, app_data.line_thickness, LineSolid, + CapButt, JoinMiter); + + if (poly->num_points == 0) + return; + + WorldToWidget (p, &poly->point[poly->num_points-1], &x1, &y1); + for (j=0, q=poly->point; j < poly->num_points; ++j, ++q) { + WorldToWidget (p, q, &x2, &y2); + if (immediate) + XDrawLine (dpy, d, p->gc, x1, y1, x2, y2); + XDrawLine (dpy, p->pixmap, p->gc, x1, y1, x2, y2); + x1 = x2; + y1 = y2; + } + + if (immediate == False && d != 0) + XCopyArea (dpy, p->pixmap, d, p->gc, 0, 0, p->width, p->height, + 0, 0); +} + +void +WorldToWidget (view_info_t *p, point_t *q, int *x, int *y) +{ + switch (p->layout) { + + case VL_NXZ: + *x = q->x; + *y = q->z; + break; + + case VL_NXNY: + *x = q->x; + *y = q->y; + break; + + case VL_NYX: + *x = q->y; + *y = q->x; + break; + + case VL_NYZ: + *x = q->y; + *y = q->z; + break; + } +} + +void +DrawGrid (view_info_t *p, Display *dpy, Drawable d) +{ + int exp, n, x, y; + + if (app_data.show_grid == False) + return; + + XSetForeground (dpy, p->grid_gc, app_data.grid_pixel); + + for (exp = 1; ; exp *= 10) { + if (exp / pixel_scale >= MINIMUM_GRID_SPACING) + break; + if (5.0 * exp / pixel_scale >= MINIMUM_GRID_SPACING) { + exp = 5 * exp; + break; + } + } + +/* + * Y-axis lines + */ + + for (x=p->origin_x, n = 0; x > 0; ) { + XDrawLine (dpy, d, p->grid_gc, x, 0, x, p->height); + ++ n; + x = p->origin_x - (int) (n * exp / pixel_scale); + } + + for (x=p->origin_x, n = 0; x < p->width; ) { + ++ n; + x = p->origin_x + (int) (n * exp / pixel_scale); + XDrawLine (dpy, d, p->grid_gc, x, 0, x, p->height); + } + +/* + * X-axis lines + */ + + for (y=p->origin_y, n = 0; y > 0; ) { + XDrawLine (dpy, d, p->grid_gc, 0, y, p->width, y); + ++ n; + y = p->origin_y - (int) (n * exp / pixel_scale); + } + + for (y=p->origin_y, n = 0; y < p->height; ) { + ++ n; + y = p->origin_y + (int) (n * exp / pixel_scale); + XDrawLine (dpy, d, p->grid_gc, 0, y, p->width, y); + } +} + +void DrawSelectedPolygon (Widget w, polygon_t *poly, Boolean immediate, Boolean erase) +{ + register int i; + int x1, x2, y1, y2; + point_t *q; + view_info_t *p; + Pixel bg; + Display *dpy; + Drawable d; + + dpy = XtDisplay (w); + d = XtWindow (w); + + if (d == 0) + immediate = False; + + XtVaGetValues (w, + XmNuserData, &p, + XmNbackground, &bg, + NULL); + + if (erase) + XSetForeground (dpy, p->gc, bg); + else + XSetForeground (dpy, p->gc, app_data.select_pixel); + + XSetLineAttributes (dpy, p->gc, app_data.selection_thickness, LineSolid, + CapButt, JoinMiter); + + WorldToWidget (p, &poly->point[poly->num_points-1], &x1, &y1); + for (i=0, q=poly->point; i < poly->num_points; ++i, ++q) { + WorldToWidget (p, q, &x2, &y2); + if (immediate) + XDrawLine (dpy, d, p->gc, x1, y1, x2, y2); + XDrawLine (dpy, p->pixmap, p->gc, x1, y1, x2, y2); + x1 = x2; + y1 = y2; + } +} + +void +DrawRuler (view_info_t *p, Display *dpy, Drawable d, Pixel bg) +{ + + int ruler_y, font_y, nseg, exp, n, x, xw, yw, xv; + XSegment seg[256]; + char s[32]; + +/* + * we'll only display the horizontal ruler in the top window + */ + + if (p->other_widget == twindow) + return; + + if (app_data.show_ruler == False) + return; + + for (exp = 1; ; exp *= 10) { + if (exp / pixel_scale >= MINIMUM_RULER_SPACING) + break; + if (2.0 * exp / pixel_scale >= MINIMUM_RULER_SPACING) { + exp = 2 * exp; + break; + } + if (5.0 * exp / pixel_scale >= MINIMUM_RULER_SPACING) { + exp = 5 * exp; + break; + } + } + + ruler_y = p->height - (RULER_THICKNESS + 2 * RULER_MARGIN + + RULER_MAJOR_LENGTH + app_data.ruler_font->max_bounds.ascent); + + font_y = ruler_y + RULER_THICKNESS + RULER_MARGIN + + app_data.ruler_font->max_bounds.ascent - 2; + + XSetForeground (dpy, p->gc, bg); + XFillRectangle (dpy, d, p->gc, + 0, ruler_y, p->width, p->height - ruler_y); + + XSetForeground (dpy, p->gc, app_data.grid_pixel); + + seg[0].x1 = 0; + seg[0].x2 = p->width - 1; + seg[0].y1 = seg[0].y2 = ruler_y; + nseg = 1; + +/* + * Major tick marks + */ + + for (x=p->origin_x, n = 0; x > 0; ) { + seg[nseg].x1 = seg[nseg].x2 = x; + seg[nseg].y1 = p->height - 1; + seg[nseg].y2 = p->height - RULER_MAJOR_LENGTH; + ++ nseg; + xv = (int) (n * exp); + sprintf (s, "%d", xv); + StringSize (s, &xw, &yw); + XDrawString (dpy, d, p->gc, x - xw / 2, font_y, s, strlen(s)); + ++ n; + x = p->origin_x - (int) (n * exp / pixel_scale); + } + + for (x=p->origin_x, n = 0; x < p->width; ) { + ++ n; + x = p->origin_x + (int) (n * exp / pixel_scale); + xv = (int) (n * exp); + sprintf (s, "%d", xv); + StringSize (s, &xw, &yw); + XDrawString (dpy, d, p->gc, x - xw / 2, font_y, s, strlen(s)); + seg[nseg].x1 = seg[nseg].x2 = x; + seg[nseg].y1 = p->height - 1; + seg[nseg].y2 = p->height - RULER_MAJOR_LENGTH; + ++ nseg; + } + + XSetLineAttributes (dpy, p->gc, RULER_THICKNESS, LineSolid, + CapButt, JoinMiter); + + XDrawSegments (dpy, d, p->gc, seg, nseg); +} + +void +StringSize (char *s, int *xw, int *yw) +{ + + *xw = XTextWidth (app_data.ruler_font, s, strlen (s)); + *yw = app_data.ruler_font->max_bounds.ascent; + +} diff -Nru acm-5.0/src/gedit/gutil1.h acm-6.0+20200416/src/gedit/gutil1.h --- acm-5.0/src/gedit/gutil1.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/gedit/gutil1.h 2017-04-16 08:24:25.000000000 +0000 @@ -0,0 +1,42 @@ +/* + * Copyright (c) 1994, Riley Rainey, riley@netcon.com + * + * Permission to use, copy, modify and distribute (without charge) this + * software, documentation, images, etc. is granted, provided that this + * comment and the author's name is retained. + * + * This software is provided by the author as is, and without any expressed + * or implied warranties, including, but not limited to, the implied + * warranties of merchantability and fitness for a particular purpose. In no + * event shall the author be liable for any direct, indirect, incidental, or + * consequential damages arising in any way out of the use of this software. + */ + +#ifndef gutil1_H +#define gutil1_H + +#ifdef gutil1_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + + +EXTERN void RescaleView (Widget w, double factor); + +EXTERN void DrawWidget (Widget w, Boolean immediate); + +EXTERN void DrawPolygon (Widget w, polygon_t *poly, Boolean immediate); + +EXTERN void WorldToWidget (view_info_t *p, point_t *q, int *x, int *y); + +EXTERN void DrawGrid (view_info_t *p, Display *dpy, Drawable d); + +EXTERN void DrawSelectedPolygon (Widget w, polygon_t *poly, Boolean immediate, Boolean erase); + +EXTERN void DrawRuler (view_info_t *p, Display *dpy, Drawable d, Pixel bg); + +EXTERN void StringSize (char *s, int *xw, int *yw); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/gedit/gutil.c acm-6.0+20200416/src/gedit/gutil.c --- acm-5.0/src/gedit/gutil.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/gedit/gutil.c 2017-09-14 17:46:26.000000000 +0000 @@ -0,0 +1,918 @@ +/* + * Copyright (c) 1994, Riley Rainey, riley@netcon.com + * + * Permission to use, copy, modify and distribute (without charge) this + * software, documentation, images, etc. is granted, provided that this + * comment and the author's name is retained. + * + * This software is provided by the author as is, and without any expressed + * or implied warranties, including, but not limited to, the implied + * warranties of merchantability and fitness for a particular purpose. In no + * event shall the author be liable for any direct, indirect, incidental, or + * consequential damages arising in any way out of the use of this software. + */ + +#include +#include +#include +#include +#include +#include + +#include "../util/memory.h" +#include "shared.h" +#include "edit.h" +#include "gutil1.h" + +#define gutil_IMPORT +#include "gutil.h" + + +/* + * Once we have three points entered, we can compute the equation associated + * with the plane defined by them. The general equation looks like this: + * + * a x + b y + c z + d = 0 + * + * Where the normal vector is N=[a, b, c] and d = - a x0 - b y0 - c z0; + * the origin is O=[x0, y0, z0]. + * + * Once the plane equation is computed, it's a trivial task to determine + * the xyz coordinates of any subsequent points entered for this polygon + * -- since all points on the polygon are, by our definition, coplanar. + */ + +#define magv(v) sqrt( v.x * v.x + v.y * v.y + v.z * v.z ) + +void +ComputePlaneEquation (polygon_t *p) +{ + + VPoint a, b; + register double length; + + VSetPoint (&a, + p->point[0].point.x - p->point[1].point.x, + p->point[0].point.y - p->point[1].point.y, + p->point[0].point.z - p->point[1].point.z); + + VSetPoint (&b, + p->point[2].point.x - p->point[1].point.x, + p->point[2].point.y - p->point[1].point.y, + p->point[2].point.z - p->point[1].point.z); + + VCrossProd (&a, &b, &(p->normal)); + + length = magv(p->normal); + p->normal.x /= length; + p->normal.y /= length; + p->normal.z /= length; + + p->d = - VDotProd (&p->normal, &p->point[1].point); + p->origin = p->point[1].point; +} + +void +DisplayPoint(point_t *p) +{ + char value[64]; + + sprintf (value, "%d", p->x); + XmTextFieldSetString (x_field, value); + sprintf (value, "%d", p->y); + XmTextFieldSetString (y_field, value); + sprintf (value, "%d", p->z); + XmTextFieldSetString (z_field, value); +} + +polygon_t * +AllocPolygon () +{ + register int i, n; + register polygon_t *tmp; + + for (i=0; i < polygon_max; ++i) { + if (polygon_list[i].num_points == 0) { + polygon_list[i].next = -1; + return &polygon_list[i]; + } + } + + n = polygon_max * 2; + + tmp = (polygon_t *) memory_allocate (n * sizeof (polygon_t), NULL); + + bcopy ((char *) polygon_list, (char *) tmp, + polygon_max * sizeof (polygon_t)); + + for (i = polygon_max; i < n; ++i) { + tmp[i].next = tmp[i].num_points = 0; + tmp[i].id = i; + } + + polygon_max = n; + memory_dispose ((char *) polygon_list); + polygon_list = tmp; + return tmp; +} + +void +FreePolygon (polygon_t *p) +{ + p->num_points = 0; + if (p->point != tmp_point) + memory_dispose ((char *) p->point); +} + +polygon_t * +BeginPolygon () +{ + + register polygon_t *p; + + if ((p = AllocPolygon()) == (polygon_t *) NULL) { + fprintf (stderr, "out of memory\n"); + exit (1); + } + + p->num_points = 0; + p->point = tmp_point; + cur_polygon = p; + + return p; +} + +void PointXY (Widget w, view_info_t *p, int x, int y, point_t *q) +{ + switch (p->layout) { + + case VL_NXZ: + q->x = x; + q->y = p->other_view->origin_y; + q->z = y; + q->point.x = - (x - p->origin_x) * pixel_scale; + q->point.y = 0.0; + q->point.z = (y - p->origin_y) * pixel_scale; + break; + + case VL_NXNY: + q->x = x; + q->y = y; + q->z = p->other_view->origin_y; + q->point.x = - (x - p->origin_x) * pixel_scale; + q->point.y = - (y - p->origin_y) * pixel_scale; + q->point.z = 0.0; + break; + + case VL_NYZ: + q->x = p->other_view->origin_y; + q->y = x; + q->z = y; + q->point.x = 0.0; + q->point.y = - (x - p->origin_x) * pixel_scale; + q->point.z = (y - p->origin_y) * pixel_scale; + break; + + case VL_NYX: + q->x = y; + q->y = x; + q->z = p->other_view->origin_y; + q->point.x = (y - p->origin_y) * pixel_scale; + q->point.y = -(x - p->origin_x) * pixel_scale; + q->point.z = 0.0; + break; + + default: + printf ("oops\n"); + } + +} + +int +PinPoint (Widget w, view_info_t *p, polygon_t *poly, int x, int y, XPoint *pt, XPoint *opt) +{ + point_t *q, *oq; + int z; + Boolean plane_established; + + if (poly->num_points == 0) + oq = (point_t *) NULL; + else + oq = &poly->point[poly->num_points-1]; + + q = &poly->point[poly->num_points++]; + + plane_established = (poly->num_points > 3) ? True : False; + + switch (p->layout) { + + case VL_NXZ: + if (oq != (point_t *) NULL) { + pt->x = opt->x = oq->x; + pt->y = oq->z; + opt->y = oq->y; + q->y = oq->y; + } + else { + q->y = p->other_view->origin_y; + } + + q->x = x; + q->z = y; + z = q->y; + q->point.x = - (x - p->origin_x) * pixel_scale; + q->point.z = (y - p->origin_y) * pixel_scale; + + switch (p->other_view->layout) { + + case VL_NXNY: + if (plane_established) { + q->point.y = - (poly->normal.x * q->point.x + + poly->normal.z * q->point.z + poly->d) / + poly->normal.y; + z = q->y = - q->point.y / pixel_scale + + p->other_view->origin_y; + } + else + q->point.y = - (q->y - p->other_view->origin_y)* + pixel_scale; + break; + + case VL_NXY: + if (plane_established) { + q->point.y = - (poly->normal.x * q->point.x + + poly->normal.z * q->point.z + poly->d) / + poly->normal.y; + z = q->y = q->point.y / pixel_scale + + p->other_view->origin_y; + } + else + q->point.y = (q->y - p->other_view->origin_y) * + pixel_scale; + break; + } + + break; + + case VL_NXNY: + if (oq != (point_t *) NULL) { + pt->x = opt->x = oq->x; + pt->y = oq->y; + opt->y = oq->z; + q->z = oq->z; + } + else { + q->z = p->other_view->origin_y; + } + + q->x = x; + q->y = y; + z = q->z; + q->point.x = - (x - p->origin_x) * pixel_scale; + q->point.y = - (y - p->origin_y) * pixel_scale; + + switch (p->other_view->layout) { + + case VL_NXNZ: + if (plane_established) { + q->point.z = - (poly->normal.x * q->point.x + + poly->normal.y * q->point.y + poly->d) / + poly->normal.z; + z = q->z = q->point.z / pixel_scale + + p->other_view->origin_y; + } + else + q->point.z = - (q->z - p->other_view->origin_y)* + pixel_scale; + break; + + case VL_NXZ: + if (plane_established) { + q->point.z = - (poly->normal.x * q->point.x + + poly->normal.y * q->point.y + poly->d) / + poly->normal.z; + z = q->z = q->point.z / pixel_scale + + p->other_view->origin_y; + } + else + q->point.z = (q->z - p->other_view->origin_y) * + pixel_scale; + break; + } + + break; + + case VL_NYZ: + if (oq != (point_t *) NULL) { + pt->x = opt->x = oq->y; + pt->y = oq->z; + opt->y = oq->x; + q->x = oq->x; + } + else { + q->x = p->other_view->origin_y; + } + + q->y = x; + q->z = y; + z = q->x; + q->point.y = - (x - p->origin_x) * pixel_scale; + q->point.z = (y - p->origin_y) * pixel_scale; + + switch (p->other_view->layout) { + + case VL_NYX: + if (plane_established) { + q->point.x = - (poly->normal.y * q->point.y + + poly->normal.z * q->point.z + poly->d) / + poly->normal.x; + z = q->x = q->point.x / pixel_scale + + p->other_view->origin_y; + } + else + q->point.x = (q->x - p->other_view->origin_y) * + pixel_scale; + break; + + case VL_NYNX: + if (plane_established) { + q->point.x = - (poly->normal.y * q->point.y + + poly->normal.z * q->point.z + poly->d) / + poly->normal.x; + z = q->x = - q->point.x / pixel_scale + + p->other_view->origin_y; + } + else + q->point.x = -(q->x - p->other_view->origin_y)* + pixel_scale; + break; + } + + break; + + case VL_NYX: + if (oq != (point_t *) NULL) { + pt->x = opt->x = oq->y; + pt->y = oq->x; + opt->y = oq->z; + q->z = oq->z; + } + else { + q->z = p->other_view->origin_y; + } + + q->x = y; + q->y = x; + z = q->z; + q->point.x = - (y - p->origin_x) * pixel_scale; + q->point.y = (x - p->origin_y) * pixel_scale; + + switch (p->other_view->layout) { + + case VL_NYZ: + if (plane_established) { + q->point.z = - (poly->normal.x * q->point.x + + poly->normal.y * q->point.y + poly->d) / + poly->normal.z; + z = q->z = q->point.z / pixel_scale + + p->other_view->origin_y; + } + else + q->point.z = (q->z - p->other_view->origin_y)* + pixel_scale; + break; + + case VL_NYNZ: + if (plane_established) { + q->point.z = - (poly->normal.x * q->point.x + + poly->normal.y * q->point.y + poly->d) / + poly->normal.z; + z = q->z = - q->point.z / pixel_scale + + p->other_view->origin_y; + } + else + q->point.z = - (q->z - p->other_view->origin_y)* + pixel_scale; + break; + } + + break; + } + + DisplayPoint (q); + + return z; + +} + +int +DragPoint (Widget w, view_info_t *p, polygon_t *poly, int delta, XPoint *pt, XPoint *opt) +{ + point_t *q, *oq; + int z; + + if (poly->num_points == 1) + oq = (point_t *) NULL; + else + oq = &poly->point[poly->num_points-2]; + + q = &poly->point[poly->num_points-1]; + + switch (p->layout) { + + case VL_NXZ: + if (oq != (point_t *) NULL) { + pt->x = opt->x = oq->x; + pt->y = oq->z; + opt->y = oq->y; + } + + switch (p->other_view->layout) { + + case VL_NXNY: + q->y = drag_origin.y + delta; + q->point.y = - (q->y - p->other_view->origin_y) * + pixel_scale; + break; + + case VL_NXY: + q->y = drag_origin.y + delta; + q->point.y = (q->y - p->other_view->origin_y) * + pixel_scale; + break; + } + + z = q->y; + + break; + + case VL_NXNY: + if (oq != (point_t *) NULL) { + pt->x = opt->x = oq->x; + pt->y = oq->y; + opt->y = oq->z; + } + + switch (p->other_view->layout) { + + case VL_NXNZ: + q->z = drag_origin.y + delta; + q->point.z = - (q->z - p->other_view->origin_y) * + pixel_scale; + break; + + case VL_NXZ: + q->z = drag_origin.y + delta; + q->point.z = (q->z - p->other_view->origin_y) * + pixel_scale; + break; + } + + z = q->z; + + break; + + case VL_NYX: + if (oq != (point_t *) NULL) { + pt->x = opt->x = oq->y; + pt->y = oq->x; + opt->y = oq->z; + } + + switch (p->other_view->layout) { + + case VL_NYNZ: + q->z = drag_origin.y + delta; + q->point.z = - (q->z - p->other_view->origin_y) * + pixel_scale; + break; + + case VL_NYZ: + q->z = drag_origin.y + delta; + q->point.x = (q->z - p->other_view->origin_y) * + pixel_scale; + break; + } + + z = q->z; + + break; + + case VL_NYZ: + if (oq != (point_t *) NULL) { + pt->x = opt->x = oq->y; + pt->y = oq->z; + opt->y = oq->x; + } + + switch (p->other_view->layout) { + + case VL_NYNX: + q->x = drag_origin.y + delta; + q->point.x = - (q->x - p->other_view->origin_y) * + pixel_scale; + break; + + case VL_NYX: + q->x = drag_origin.y + delta; + q->point.x = (q->x - p->other_view->origin_y) * + pixel_scale; + break; + } + + z = q->x; + + break; + } + + DisplayPoint (q); + + return z; + +} + +void +BeginPolygonPoint (Widget w, view_info_t *p, int x, int y) +{ + + int z; + Display *dpy; + Drawable w1, w2; + XPoint last, last_other; + polygon_t *poly; + + dpy = XtDisplay (w); + w1 = XtWindow (w); + w2 = XtWindow (p->other_widget); + + if (cur_polygon == NULL) + BeginPolygon (); + + poly = cur_polygon; + + drag_origin.x = x; + drag_origin.y = y; + XSetFunction (dpy, p->gc, GXxor); + XSetForeground (dpy, p->gc, app_data.select_pixel); + XSetLineAttributes (dpy, p->gc, app_data.selection_thickness, LineSolid, + CapButt, JoinMiter); + + XFillRectangle (dpy, w1, p->gc, + x + app_data.box_offset, y + app_data.box_offset, + app_data.box_size, app_data.box_size); + z = PinPoint (w, p, poly, x, y, &last, &last_other); + XFillRectangle (dpy, w2, p->gc, + x + app_data.box_offset, z + app_data.box_offset, + app_data.box_size, app_data.box_size); + + if (poly->num_points > 1) { + XDrawLine (dpy, w1, p->gc, last.x, last.y, x, y); + XDrawLine (dpy, w2, p->gc, last_other.x, last_other.y, x, z); + rubber_lines[0].x1 = last.x; + rubber_lines[0].y1 = last.y; + rubber_lines[0].x2 = x; + rubber_lines[0].y2 = y; + rubber_lines[1].x1 = last_other.x; + rubber_lines[1].y1 = last_other.y; + } + rubber_lines[1].x2 = x; + rubber_lines[1].y2 = z; + XSetFunction (dpy, p->gc, GXcopy); + +} + +void +DragPolygonPoint(Widget w, view_info_t *p, int x, int y) +{ + int z, nx, delta; + Display *dpy; + //Drawable w1; + Drawable w2; + XPoint last, last_other; + polygon_t *poly; + + dpy = XtDisplay (w); + //w1 = XtWindow (w); + w2 = XtWindow (p->other_widget); + + poly = cur_polygon; + +/* + * We don't drag points once the polygon's plane is determined. + */ + + if (poly->num_points > 3) + return; + +/* + * Erase old stuff + */ + XSetFunction (dpy, p->other_view->gc, GXxor); + XFillRectangle (dpy, w2, p->other_view->gc, + rubber_lines[1].x2 + app_data.box_offset, + rubber_lines[1].y2 + app_data.box_offset, + app_data.box_size, app_data.box_size); + if (poly->num_points > 1) { + XDrawSegments (dpy, w2, p->other_view->gc, + &rubber_lines[1], 1); + } + +/* + * Draw new line/point + */ + + delta = y - drag_origin.y; + nx = rubber_lines[1].x2; + z = DragPoint (w, p, poly, delta, &last, &last_other); + XFillRectangle (dpy, w2, p->other_view->gc, + nx + app_data.box_offset, z + app_data.box_offset, + app_data.box_size, app_data.box_size); + + if (poly->num_points > 1) { + XDrawLine (dpy, w2, p->other_view->gc, + last_other.x, last_other.y, nx, z); + } + rubber_lines[1].y2 = z; + + XSetFunction (dpy, p->other_view->gc, GXcopy); +} + +void +CompletePolygonPoint(Widget w, view_info_t *p, int x, int y) +{ + if (cur_polygon) + if (cur_polygon->num_points == 3) + ComputePlaneEquation (cur_polygon); +} + +void +CompletePolygon (Widget w, polygon_t *p) +{ + + register point_t *points; + view_info_t *q; + + XtVaGetValues (w, + XmNuserData, &q, + NULL); + + if (p == (polygon_t *) NULL) + return; + + if (p->num_points < 3) { + p->num_points = 0; + return; + } + + points = (point_t *) memory_allocate (p->num_points * sizeof(point_t), NULL); + + bcopy ((char *) tmp_point, (char *) points, + p->num_points * sizeof (point_t)); + + p->point = points; + +/* + * Add this polygon to the selected list. + */ + + p->next = sel_polygon; + sel_polygon = p->id; + cur_polygon = (polygon_t *) NULL; + +#ifdef notdef + DrawPolygon (w, p, True); + DrawPolygon (q->other_widget, p, True); +#endif + DrawWidget (w, False); + DrawWidget (q->other_widget, False); + +} + +int +PolygonProximity (view_info_t *p, polygon_t *poly, int x, int y) +{ + + register long i, min_distance, d; + int xp, yp; + + min_distance = 0x3fffffff; + + for (i=0; i < poly->num_points; ++ i) { + WorldToWidget (p, &poly->point[i], &xp, &yp); + xp -= x; + yp -= y; + d = (int) sqrt ((double) (xp * xp + yp * yp)); + if (d < min_distance) { + min_distance = d; + } + } + + return min_distance; +} + +int +PickObject (view_info_t *p, int x, int y) +{ + + register int i, dist, d, id = -1; + + dist = 0x3fffffff; + + for (i=0; i < polygon_max; ++i) { + if (polygon_list[i].num_points == 0) + continue; + if ((d = PolygonProximity (p, &polygon_list[i], x, y)) < dist) { + dist = d; + id = i; + } + } + + if (dist < app_data.pick_sensitivity) + return id; + else + return -1; +} + +void +CompleteMarker(Widget w, view_info_t *p, int x, int y) +{ + if (cur_polygon) { + marker_list[current_marker].defined = True; + marker_list[current_marker].location = cur_polygon->point[0]; + cur_polygon = NULL; + DrawWidget (w, False); + DrawWidget (p->other_widget, False); + } +} + +void +BeginPick (Widget w, view_info_t *p, int x, int y, Boolean extend) +{ + + register int id, last, i; + + id = PickObject (p, x, y); + + if (extend) { + if (id >= 0) { + SelectObject (id); + } + } + else { + if (id == -1) { + if (sel_polygon >= 0) { + for (i=sel_polygon; i >= 0; i = polygon_list[i].next) + last = i; + polygon_list[last].next = unsel_polygon; + unsel_polygon = sel_polygon; + sel_polygon = -1; + } + } + else if (sel_polygon >= 0) { + drag_origin.x = x; + drag_origin.y = y; + drag_mode = True; + } + else { + SelectObject (id); + } + } + + DrawWidget (w, False); + DrawWidget (p->other_widget, False); +} + +void +DragSelection (Widget w, view_info_t *p, int x, int y) +{ + register int dx, dy, i, j; + point_t q; + polygon_t *poly; + + dx = x - drag_origin.x + p->origin_x; + dy = y - drag_origin.y + p->origin_y; + drag_origin.x = x; + drag_origin.y = y; + + PointXY (w, p, dx, dy, &q); + + for (i=sel_polygon; i >= 0; i = polygon_list[i].next) + DrawSelectedPolygon (w, &polygon_list[i], True, True); + + for (i=sel_polygon; i >= 0; i = polygon_list[i].next) { + poly = &polygon_list[i]; + for (j=0; jnum_points; ++j) { + poly->point[j].point.x += q.point.x; + poly->point[j].point.y += q.point.y; + poly->point[j].point.z += q.point.z; + PointToXYZ (p, &poly->point[j]); + } + DrawSelectedPolygon (w, poly, True, False); + } + +} + +void +CompleteDrag (Widget w, view_info_t *p, int x, int y) +{ + drag_mode = False; + DrawWidget (w, False); + DrawWidget (p->other_widget, False); +} + +void +SelectObject (int id) +{ + register int i, last; + + if (unsel_polygon == -1) { + polygon_list[id].next = sel_polygon; + sel_polygon = id; + return; + } + + if (unsel_polygon == id) { + unsel_polygon = polygon_list[id].next; + polygon_list[id].next = sel_polygon; + sel_polygon = id; + return; + } + + last = unsel_polygon; + for (i=polygon_list[unsel_polygon].next; i >= 0; + i = polygon_list[i].next) { + if (i == id) { + polygon_list[last].next = polygon_list[id].next; + polygon_list[id].next = sel_polygon; + sel_polygon = id; + return; + } + last = i; + } + +} + +void +DetermineObjectExtent (VPoint *extent) +{ + + VPoint min, max; + register int i, j; + polygon_t *poly; + + min.x = min.y = min.z = 10000000.0; + max.x = max.y = max.z = -10000000.0; + + for (i=0; i < polygon_max; ++i) { + if (polygon_list[i].num_points == 0) + continue; + poly = &polygon_list[i]; + for (j=0; jnum_points; ++j) { + if (poly->point[j].point.x > max.x) + max.x = poly->point[j].point.x; + if (poly->point[j].point.y > max.y) + max.y = poly->point[j].point.y; + if (poly->point[j].point.z > max.z) + max.z = poly->point[j].point.z; + if (poly->point[j].point.x < min.x) + min.x = poly->point[j].point.x; + if (poly->point[j].point.y < min.y) + min.y = poly->point[j].point.y; + if (poly->point[j].point.z < min.z) + min.z = poly->point[j].point.z; + } + } + + extent->x = max.x - min.x; + extent->y = max.y - min.y; + extent->z = max.z - min.z; +} + +void +RescaleObject (double factor) +{ + + register int i, j; + polygon_t *poly; + + for (i=0; i < polygon_max; ++i) { + if (polygon_list[i].num_points == 0) + continue; + poly = &polygon_list[i]; + for (j=0; jnum_points; ++j) { + poly->point[j].point.x *= factor; + poly->point[j].point.y *= factor; + poly->point[j].point.z *= factor; + } + } + + for (i=0; i < marker_count; ++i) { + if (marker_list[i].defined) { + marker_list[i].location.point.x *= factor; + marker_list[i].location.point.y *= factor; + marker_list[i].location.point.z *= factor; + } + } + + RescaleView (twindow, 1.0); +} diff -Nru acm-5.0/src/gedit/gutil.h acm-6.0+20200416/src/gedit/gutil.h --- acm-5.0/src/gedit/gutil.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/gedit/gutil.h 2017-04-16 08:24:25.000000000 +0000 @@ -0,0 +1,69 @@ +/* + * Copyright (c) 1994, Riley Rainey, riley@netcon.com + * + * Permission to use, copy, modify and distribute (without charge) this + * software, documentation, images, etc. is granted, provided that this + * comment and the author's name is retained. + * + * This software is provided by the author as is, and without any expressed + * or implied warranties, including, but not limited to, the implied + * warranties of merchantability and fitness for a particular purpose. In no + * event shall the author be liable for any direct, indirect, incidental, or + * consequential damages arising in any way out of the use of this software. + */ + +#ifndef gutil_H +#define gutil_H + +#include "shared.h" + +#ifdef gutil_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +EXTERN void ComputePlaneEquation (polygon_t *p); + +EXTERN void DisplayPoint(point_t *p); + +EXTERN polygon_t * AllocPolygon (void); + +EXTERN void FreePolygon (polygon_t *p); + +EXTERN polygon_t * BeginPolygon (void); + +EXTERN void PointXY (Widget w, view_info_t *p, int x, int y, point_t *q); + +EXTERN int PinPoint (Widget w, view_info_t *p, polygon_t *poly, int x, int y, XPoint *pt, XPoint *opt); + +EXTERN int DragPoint (Widget w, view_info_t *p, polygon_t *poly, int delta, XPoint *pt, XPoint *opt); + +EXTERN void BeginPolygonPoint (Widget w, view_info_t *p, int x, int y); + +EXTERN void DragPolygonPoint(Widget w, view_info_t *p, int x, int y); + +EXTERN void CompletePolygonPoint(Widget w, view_info_t *p, int x, int y); + +EXTERN void CompletePolygon (Widget w, polygon_t *p); + +EXTERN int PolygonProximity (view_info_t *p, polygon_t *poly, int x, int y); + +EXTERN int PickObject (view_info_t *p, int x, int y); + +EXTERN void CompleteMarker(Widget w, view_info_t *p, int x, int y); + +EXTERN void BeginPick (Widget w, view_info_t *p, int x, int y, Boolean extend); + +EXTERN void DragSelection (Widget w, view_info_t *p, int x, int y); + +EXTERN void CompleteDrag (Widget w, view_info_t *p, int x, int y); + +EXTERN void SelectObject (int id); + +EXTERN void DetermineObjectExtent (VPoint *extent); + +EXTERN void RescaleObject (double factor); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/gedit/io.c acm-6.0+20200416/src/gedit/io.c --- acm-5.0/src/gedit/io.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/gedit/io.c 2017-04-16 08:24:25.000000000 +0000 @@ -0,0 +1,327 @@ +/* + * Copyright (c) 1994, Riley Rainey, riley@netcon.com + * + * Permission to use, copy, modify and distribute (without charge) this + * software, documentation, images, etc. is granted, provided that this + * comment and the author's name is retained. + * + * This software is provided by the author as is, and without any expressed + * or implied warranties, including, but not limited to, the implied + * warranties of merchantability and fitness for a particular purpose. In no + * event shall the author be liable for any direct, indirect, incidental, or + * consequential damages arising in any way out of the use of this software. + */ + +#include +#include +#include +#include + +#include "../util/memory.h" +#include "shared.h" +#include "gutil.h" +#include "gutil1.h" +#include "dialog.h" +#include "edit.h" + +#define io_IMPORT +#include "io.h" + +static char magic_header[] = { 'R', 'R', '1', '1', 0, 0, 0, 1 }; + +#define REVISION 1 + + +void +ClearWorkspace (Boolean redisplay) +{ + + register int i; + + for (i=sel_polygon; i >= 0; i = polygon_list[i].next) + FreePolygon (&polygon_list[i]); + + sel_polygon = -1; + + for (i=unsel_polygon; i >= 0; i = polygon_list[i].next) + FreePolygon (&polygon_list[i]); + + unsel_polygon = -1; + + if (cur_polygon != NULL) + FreePolygon (cur_polygon); + + if (redisplay) { + DrawWidget (twindow, False); + DrawWidget (bwindow, False); + } + + for (i=0; i 4 && strcmp(&name[n-4], ".obj") == 0) { + return -1; // FIXME: handle error + } + + if ((f = fopen (name, "r")) == (FILE *) NULL) { + fprintf (stderr, "Unable to open %s\n", name); + return -1; + } + + ClearWorkspace (False); + + if (fread ((char *) magic, sizeof (magic), 1, f) != 1) { + return -1; // FIXME: handle error + } + + if (strncmp (magic, magic_header, 8) != 0) { + gedit_error ("That file does not appear to be\n\ +a gedit data file. It cannot be\n\ +edited by this program."); + return -1; + } + + if (fread ((char *) &revision, sizeof (revision), 1, f) != 1) { + return -1; // FIXME: handle error + } + + if (fread ((char *) &object_count, sizeof (object_count), 1, f) != 1) { + return -1; // FIXME: handle error + } + + if (fread ((char *) &scale, sizeof (scale), 1, f) != 1) { + return -1; // FIXME: handle error + } + + pixel_scale = scale; + + while (object_count-- > 0) { + ReadObject (f); + } + +/* + * Now try to read markers + */ + + if (fread ((char *) &object_count, sizeof (object_count), 1, f) == 1) { + while (object_count-- > 0) { + ReadMarker (f); + } + } + +/* + * Attempt to read the craft structure. + */ + + if (fread ((char *) &craft_name, sizeof (craft_name), 1, f) != 1) { + return -1; // FIXME: handle error + } + + if (fread ((char *) &c, sizeof (c), 1, f) == 1) { + craft_valid = 1; + c.name = craft_name; + InitializeDialogs (&c); + } + + fclose (f); + + DrawWidget (twindow, False); + DrawWidget (bwindow, False); + + return 0; +} + +int +ReadObject (FILE *f) +{ + + polygon_t poly, *p; + view_info_t *q; + register int i; + + fread ((char *) &poly, sizeof (poly), 1, f); + + XtVaGetValues (twindow, + XmNuserData, &q, + NULL); + + p = AllocPolygon (); + + p->normal = poly.normal; + p->origin = poly.origin; + p->d = poly.d; + p->num_points = poly.num_points; + p->point = (point_t *) memory_allocate(poly.num_points * sizeof (point_t), NULL); + + fread ((char *) p->point, sizeof (point_t), poly.num_points, f); + + for (i=0; i < p->num_points; ++i) + PointToXYZ (q, &p->point[i]); + + p->next = unsel_polygon; + unsel_polygon = p->id; + + return 0; +} + +int +ReadMarker (FILE *f) +{ + + marker_t m; + register int i; + + fread ((char *) &m, sizeof (m), 1, f); + + for (i=0; i= 0; i = polygon_list[i].next) { + p = &polygon_list[i]; + if (!(p->point[0].point.x == 0.0 && + p->point[0].point.y == 0.0 && + p->point[0].point.z == 0.0 && + p->point[1].point.x == 0.0 && + p->point[1].point.y == 0.0 && + p->point[1].point.z == 0.0)) + object_count ++; + } + + for (i=unsel_polygon; i >= 0; i = polygon_list[i].next){ + p = &polygon_list[i]; + if (!(p->point[0].point.x == 0.0 && + p->point[0].point.y == 0.0 && + p->point[0].point.z == 0.0 && + p->point[1].point.x == 0.0 && + p->point[1].point.y == 0.0 && + p->point[1].point.z == 0.0)) + object_count ++; + } + + if (fwrite ((char *) &object_count, sizeof (object_count), 1, f) != 1) { + return -1; // FIXME: handle error + } + + if (fwrite ((char *) &pixel_scale, sizeof (pixel_scale), 1, f) != 1) { + return -1; // FIXME: handle error + } + + for (i=sel_polygon; i >= 0; i = polygon_list[i].next) + WriteObject (f, &polygon_list[i]); + + for (i=unsel_polygon; i >= 0; i = polygon_list[i].next) + WriteObject (f, &polygon_list[i]); + + object_count = 0; + for (i=0; ipoint[0].point.x == 0.0 && + p->point[0].point.y == 0.0 && + p->point[0].point.z == 0.0 && + p->point[1].point.x == 0.0 && + p->point[1].point.y == 0.0 && + p->point[1].point.z == 0.0) { + return; + } + + fwrite ((char *) p, sizeof (polygon_t), 1, f); + + fwrite ((char *) p->point, sizeof (point_t), p->num_points, f); + +} + +void +WriteMarker (FILE *f, marker_t *p) +{ + + fwrite ((char *) p, sizeof (marker_t), 1, f); + +} + +int +gedit_error (char *s) +{ + + fprintf (stderr, s); + return 0; +} + diff -Nru acm-5.0/src/gedit/io.h acm-6.0+20200416/src/gedit/io.h --- acm-5.0/src/gedit/io.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/gedit/io.h 2017-09-14 17:46:26.000000000 +0000 @@ -0,0 +1,43 @@ +/* + * Copyright (c) 1994, Riley Rainey, riley@netcon.com + * + * Permission to use, copy, modify and distribute (without charge) this + * software, documentation, images, etc. is granted, provided that this + * comment and the author's name is retained. + * + * This software is provided by the author as is, and without any expressed + * or implied warranties, including, but not limited to, the implied + * warranties of merchantability and fitness for a particular purpose. In no + * event shall the author be liable for any direct, indirect, incidental, or + * consequential damages arising in any way out of the use of this software. + */ + +#ifndef io_H +#define io_H + +#include + +#ifdef io_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +EXTERN void ClearWorkspace (Boolean redisplay); + +EXTERN int ReadGeditFile (char *name); + +EXTERN int ReadObject (FILE *f); + +EXTERN int ReadMarker (FILE *f); + +EXTERN int WriteGeditFile (char *name); + +EXTERN void WriteObject (FILE *f, polygon_t *p); + +EXTERN void WriteMarker (FILE *f, marker_t *p); + +EXTERN int gedit_error (char *s); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/gedit/Makefile acm-6.0+20200416/src/gedit/Makefile --- acm-5.0/src/gedit/Makefile 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/gedit/Makefile 2020-04-16 12:05:40.000000000 +0000 @@ -0,0 +1,67 @@ +# This file generated by make-makefile, do not edit! +# Create Makefile-include.txt instead for your customizations. +CC := gcc +CFLAGS := -Wall -Werror -g -fmax-errors=99 -Wuninitialized -Wmissing-prototypes -Wredundant-decls +LIBS := + +.PHONY: all +all: + make CrExFormDlg.o VReadObject.o VWriteObject.o actions.o balance.o cell.o circle.o dialog.o edit.o gedit.exe gutil.o gutil1.o io.o shared.o + +include Makefile-include.txt + +.PHONY: test +test: gedit.exe + ./gedit.exe + + +.PHONY: clean +clean: + rm -f *.o *.exe *.stackdump gedit + +CrExFormDlg.o: CrExFormDlg.c CrExFormDlg.h ../V/Vlibmath.h shared.h + $(CC) $(CFLAGS) -c CrExFormDlg.c -o CrExFormDlg.o + +VReadObject.o: VReadObject.c VReadObject.h ../V/VColor.h ../V/VObjects.h ../V/VPoly.h ../V/Vlibmath.h ../util/memory.h ../util/units.h + $(CC) $(CFLAGS) -c VReadObject.c -o VReadObject.o + +VWriteObject.o: VWriteObject.c VWriteObject.h ../V/VColor.h ../V/VObjects.h ../V/VPoly.h ../V/Vlibmath.h ../util/error.h ../util/units.h shared.h + $(CC) $(CFLAGS) -c VWriteObject.c -o VWriteObject.o + +actions.o: actions.c actions.h ../V/Vlibmath.h circle.h edit.h gutil.h shared.h + $(CC) $(CFLAGS) -c actions.c -o actions.o + +balance.o: balance.c balance.h ../V/Vlibmath.h + $(CC) $(CFLAGS) -c balance.c -o balance.o + +cell.o: cell.c cell.h ../V/Vlibmath.h shared.h + $(CC) $(CFLAGS) -c cell.c -o cell.o + +circle.o: circle.c circle.h ../V/Vlibmath.h edit.h gutil.h gutil1.h shared.h + $(CC) $(CFLAGS) -c circle.c -o circle.o + +dialog.o: dialog.c dialog.h ../V/Vlibmath.h CrExFormDlg.h cell.h shared.h + $(CC) $(CFLAGS) -c dialog.c -o dialog.o + +edit.o: edit.c edit.h ../V/Vlibmath.h ../util/memory.h gutil.h gutil1.h shared.h + $(CC) $(CFLAGS) -c edit.c -o edit.o + +gedit.o: gedit.c ../V/VColor.h ../V/VObjects.h ../V/VPoly.h ../V/Vlibmath.h ../util/memory.h ../util/units.h CrExFormDlg.h VReadObject.h VWriteObject.h actions.h dialog.h gutil1.h io.h shared.h + $(CC) $(CFLAGS) -c gedit.c -o gedit.o + +gedit.exe: ../V/VColor.o ../V/VObjects.o ../V/VPoly.o ../V/Vlibmath.o ../util/error.o ../util/gui.o ../util/memory.o ../util/sparsearray.o ../util/units.o CrExFormDlg.o VReadObject.o VWriteObject.o actions.o cell.o circle.o dialog.o edit.o gedit.o gutil.o gutil1.o io.o shared.o + $(CC) $(CFLAGS) -o gedit.exe ../V/VColor.o ../V/VObjects.o ../V/VPoly.o ../V/Vlibmath.o ../util/error.o ../util/gui.o ../util/memory.o ../util/sparsearray.o ../util/units.o CrExFormDlg.o VReadObject.o VWriteObject.o actions.o cell.o circle.o dialog.o edit.o gedit.o gutil.o gutil1.o io.o shared.o $(LIBS) -lX11 -lXm -lXt -lm + +gutil.o: gutil.c gutil.h ../V/Vlibmath.h ../util/memory.h edit.h gutil1.h shared.h + $(CC) $(CFLAGS) -c gutil.c -o gutil.o + +gutil1.o: gutil1.c gutil1.h ../V/Vlibmath.h edit.h shared.h + $(CC) $(CFLAGS) -c gutil1.c -o gutil1.o + +io.o: io.c io.h ../V/Vlibmath.h ../util/memory.h dialog.h edit.h gutil.h gutil1.h shared.h + $(CC) $(CFLAGS) -c io.c -o io.o + +shared.o: shared.c shared.h ../V/Vlibmath.h dialog.h edit.h gutil.h gutil1.h io.h + $(CC) $(CFLAGS) -c shared.c -o shared.o + +# Checksum of the original file: 1198779506 diff -Nru acm-5.0/src/gedit/Makefile-include.txt acm-6.0+20200416/src/gedit/Makefile-include.txt --- acm-5.0/src/gedit/Makefile-include.txt 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/gedit/Makefile-include.txt 2020-04-16 12:05:40.000000000 +0000 @@ -0,0 +1,8 @@ +# OS specific compilation options: +ifeq ($(OS),Windows_NT) + +all: + @echo gedit is a X-Window program only, cannot compile under Windows, sorry! + exit 0 + +endif \ No newline at end of file diff -Nru acm-5.0/src/gedit/README acm-6.0+20200416/src/gedit/README --- acm-5.0/src/gedit/README 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/gedit/README 2006-01-05 13:58:55.000000000 +0000 @@ -0,0 +1,92 @@ +GEDIT - A 3-D object editor + +Copyright(c) 1993-1998, Riley Rainey, rainey@netcom.com + +Permission to use, copy, modify and distribute (without charge) this +software, documentation, images, etc. is granted, provided that this +comment and the author's name is retained. + +This software is provided by the author as is, and without any expressed +or implied warranties, including, but not limited to, the implied +warranties of merchantability and fitness for a particular purpose. In no +event shall the author be liable for any direct, indirect, incidental, or +consequential damages arising in any way out of the use of this software. + + + + +WHAT IS GEDIT? + +Well, this can be considered "work in progress", but it works. GEDIT can be +used to build displayable objects for ACM. It requires Motif 1.1 or later. + +Generating three dimensional objects on a two dimensional screen is a bit of +a challenge. GEDIT solves the problem by displaying two views of the same +object simultaneously. + +The main GEDIT window displays a top and side view of an area used to build +an object out of planar polygons. As an experiment, press the Polygon +button on the left-hand side of the display. You must then define the +three points that will determine the polygon's plane. + +You do that by clicking the mouse in one of the two view windows -- +hold mouse button one down and move the mouse. See how the +point in the opposite window moves up and down when you move the mouse +up and down? + +What you're doing is defining a point in 3-space -- the first +two coordinates are determined from where you clicked the mouse in the +first window. The remaining coordinate is determined by the location of the +point in the other window when you're finished dragging and you release the +mouse button. Do that three times and you've defined three points that +define a plane -- more mouse clicks immediately define a point on the +polygon since the polygon's plane has already been determined by the +location of the first three points. + +How is that useful? Picture this: take your favorite airplane book that +contains three-views (top, left, front view) of a given aircraft. Now take the +book over to a copier and copy those diagrams onto an overhead slide (the +clear paper ;-)). Now cut out each view. You can then fire up GEDIT on your +workstation, and tape the side view in the top window and the top view over +the bottom one (I usually have enough static electricity around to hold it +up without any tape) (make sure the two diagrams line up correctly). Now +start defining wings, tails, etc ... cute, no? You can then change views +(see the Layout menu) and do a similar thing with the front view. + +In the SaveAs dialog, you can output a file in V format. If you want the +object to be revisable, save a copy under another filename in GEDIT +(GDF) format. + + +-- RBR + + +BUILDING GEDIT +-------------- + +GEDIT uses the ACM V graphics library. You must have the ACM sources +available in order to build GEDIT. You will need to edit GEDIT's Makefile to +set the "ACM" variable to point to the top-level ACM source directory +(i.e. the directory that contains ACM's README file). + + +The GEDIT File Format +--------------------- + +Unfortunately, I was in a rush when I defined this graphics file format. +It stores information in your platform's binary form (with its definition of +structure alignment and floating point values) -- this is likely to +be incompatible with the binary format of someone else's machine. So, +until someone defines a "PGDF" (portable GDF) file format and a +converter between "PGDF" and GDF, you are limited in the sharing that +you'll be able to do with raw GDF files. + +A gdf directory that includes several files that I created (on a Sun-4) have +been provided for you to examine. + +OTHER NOTES +----------- + +This software is designed to run on paletted visuals. It will run, but +produce undesireable results in DirectColor visual. + diff -Nru acm-5.0/src/gedit/shared.c acm-6.0+20200416/src/gedit/shared.c --- acm-5.0/src/gedit/shared.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/gedit/shared.c 2017-04-26 14:18:36.000000000 +0000 @@ -0,0 +1,270 @@ +/* + * Copyright (c) 1994, Riley Rainey, riley@netcon.com + * + * Permission to use, copy, modify and distribute (without charge) this + * software, documentation, images, etc. is granted, provided that this + * comment and the author's name is retained. + * + * This software is provided by the author as is, and without any expressed + * or implied warranties, including, but not limited to, the implied + * warranties of merchantability and fitness for a particular purpose. In no + * event shall the author be liable for any direct, indirect, incidental, or + * consequential damages arising in any way out of the use of this software. + */ + +#include +#include +#include + +#define shared_IMPORT +#include "shared.h" + +#include "dialog.h" +#include "gutil.h" +#include "gutil1.h" +#include "edit.h" +#include "io.h" + + +void SetCursor (int id) +{ + + Cursor cursor; + + switch (id) { + + case CURSOR_POINT: + cursor = cursors[CURSOR_POINT]; + break; + + case CURSOR_POLY_PLANE: + cursor = cursors[CURSOR_POLY]; + break; + + case CURSOR_CIRCLE: + case CURSOR_POLY: + cursor = cursors[CURSOR_POLY]; + break; + + case CURSOR_ORIGIN: + cursor = cursors[CURSOR_ORIGIN]; + break; + + case CURSOR_MARKER: + cursor = cursors[CURSOR_MARKER]; + break; + } + + XDefineCursor (XtDisplay(twindow), XtWindow(twindow), cursor); + XDefineCursor (XtDisplay(bwindow), XtWindow(bwindow), cursor); +} + + +void +MenuCB (Widget w, void *client_data, void *call_data) +{ + + int menu_id = shared_PtrToInt(client_data); + Boolean value; + VPoint extent; + XmString string; + char s[64], *factor_s; + double factor; + + if (menu_id >= MENU_MARKER && menu_id < MENU_MARKER+32) { + current_marker = menu_id - MENU_MARKER; + if (marker_list[current_marker].defined) + DisplayPoint(&marker_list[current_marker].location); + SetCursor (CURSOR_MARKER); + edit_state = STATE_MARKER; + return; + } + + switch (menu_id) { + + case MENU_MIRROR_XZ: + case MENU_MIRROR_XY: + case MENU_MIRROR_YZ: + Mirror (menu_id); + break; + + case MENU_CLEAR: + ClearSelection(); + break; + + case MENU_COPY: + CopySelection(); + break; + + case MENU_PASTE: + PasteSelection(); + break; + + case MENU_ROTATE_X: + RotateXSelection(); + break; + + case MENU_SAVE: + if (filename_valid) + WriteGeditFile (filename); + else + XtManageChild (save_as_dialog); + break; + + case MENU_GRID: + XtVaGetValues (w, + XmNset, &value, + NULL); + + if (value != app_data.show_grid) { + app_data.show_grid = value; + DrawWidget (twindow, False); + DrawWidget (bwindow, False); + } + else { + app_data.show_grid = value; + } + break; + + case MENU_RULER: + XtVaGetValues (w, + XmNset, &value, + NULL); + + if (value != app_data.show_ruler) { + app_data.show_ruler = value; + DrawWidget (twindow, False); + DrawWidget (bwindow, False); + } + else { + app_data.show_ruler = value; + } + break; + + case MENU_OPEN: + XtManageChild (open_dialog); + break; + + case MENU_SAVE_AS: + XtManageChild (save_as_dialog); + break; + + case MENU_SET_VIEWS: + XtManageChild (set_views_dialog); + break; + + case MENU_SET_VIEWS_COMPLETE: + switch (desired_view) { + + case VIEW_LEFT_TOP: + t_info.layout = VL_NXZ; + b_info.layout = VL_NXNY; + break; + + case VIEW_FRONT_TOP: + t_info.layout = VL_NYZ; + b_info.layout = VL_NYX; + break; + } + + RescaleView (twindow, 1.0); + XtUnmanageChild (set_views_dialog); + break; + + case MENU_SET_VIEWS_CANCEL: + XtUnmanageChild (set_views_dialog); + break; + + case MENU_RESCALE: + DetermineObjectExtent (&extent); + + sprintf (s, " %s : %f", "X", extent.x); + string = XmStringCreateSimple(s); + XtVaSetValues (extent_x, + XmNlabelString, string, + NULL); + XmStringFree (string); + + sprintf (s, " %s : %f", "Y", extent.y); + string = XmStringCreateSimple(s); + XtVaSetValues (extent_y, + XmNlabelString, string, + NULL); + XmStringFree (string); + + sprintf (s, " %s : %f", "Z", extent.z); + string = XmStringCreateSimple(s); + XtVaSetValues (extent_z, + XmNlabelString, string, + NULL); + XmStringFree (string); + + XtManageChild (rescale_dialog); + break; + + case MENU_RESCALE_APPLY: + factor_s = XmTextFieldGetString (rescale_field); + factor = atof(factor_s); + if (factor != 0.0) + RescaleObject (factor); + break; + + case MENU_RESCALE_CANCEL: + XtUnmanageChild (rescale_dialog); + break; + + case MENU_GEAR: + XtManageChild (gear_dialog); + break; + + case MENU_GEAR_CANCEL: + GetCraftInfo (&c); + XtUnmanageChild (gear_dialog); + break; + + case MENU_GEAR_CALCULATE: + GearCalculate (&c); + GetCraftInfo (&c); + break; + + case MENU_INFO: + XtManageChild (info_dialog); + break; + + case MENU_INFO_CANCEL: + GetCraftInfo (&c); + XtUnmanageChild (info_dialog); + break; + + case MENU_INFO_CALCULATE: + GetCraftInfo (&c); + break; + + case MENU_DERIV: + XtManageChild (deriv_dialog); + break; + + case MENU_DERIV_CANCEL: + GetCraftInfo (&c); + XtUnmanageChild (deriv_dialog); + break; + + case MENU_DERIV_CALCULATE: + GetCraftInfo (&c); + break; + + case MENU_PWR: + XtManageChild (powerplant_dialog); + break; + + case MENU_PWR_CANCEL: + GetCraftInfo (&c); + XtUnmanageChild (powerplant_dialog); + break; + + case MENU_PWR_CALCULATE: + GetCraftInfo (&c); + break; + } + +} \ No newline at end of file diff -Nru acm-5.0/src/gedit/shared.h acm-6.0+20200416/src/gedit/shared.h --- acm-5.0/src/gedit/shared.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/gedit/shared.h 2017-09-07 20:20:33.000000000 +0000 @@ -0,0 +1,306 @@ +/* + * Copyright (c) 1994, Riley Rainey, riley@netcon.com + * + * Permission to use, copy, modify and distribute (without charge) this + * software, documentation, images, etc. is granted, provided that this + * comment and the author's name is retained. + * + * This software is provided by the author as is, and without any expressed + * or implied warranties, including, but not limited to, the implied + * warranties of merchantability and fitness for a particular purpose. In no + * event shall the author be liable for any direct, indirect, incidental, or + * consequential damages arising in any way out of the use of this software. + */ + +#ifndef shared_H +#define shared_H + +#include + +#include "../V/Vlibmath.h" + +#ifdef shared_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + + +/* + * Application resources + */ + +typedef struct { + char *name; /* pushbutton's name */ + XtCallbackProc callback; /* activate callback */ + XtPointer client_data; /* data to register for callback */ + } ActionAreaButton; + + +typedef struct { + Pixel select_pixel; + Pixel grid_pixel; + int line_thickness; + int selection_thickness; + int box_size; + int box_offset; /* half of box_size */ + int pick_sensitivity; + int button_size; + Pixel cursor_foreground; + Pixel cursor_background; + Boolean show_grid; + Boolean show_ruler; + XFontStruct *ruler_font; + } AppData, *AppDataPtr; + +#define XtNselectionColor "selectionColor" +#define XtCSelectionColor "SelectionColor" +#define XtNgridColor "gridColor" +#define XtCGridColor "GridColor" +#define XtNlineThickness "lineThickness" +#define XtCLineThickness "LineThickness" +#define XtNselectionThickness "selectionThickness" +#define XtCSelectionThickness "SelectionThickness" +#define XtNboxSize "boxSize" +#define XtCBoxSize "BoxSize" +#define XtNpickSensitivity "pickSensitivity" +#define XtCPickSensitivity "PickSensitivity" +#define XtNbuttonSize "buttonSize" +#define XtCButtonSize "ButtonSize" +#define XtNcursorForeground "cursorColor" +#define XtCCursorForeground "CursorColor" +#define XtNcursorBackground "cursorBackgroundColor" +#define XtCCursorBackground "CursorBackgroundColor" +#define XtNshowGrid "showGrid" +#define XtCShowGrid "ShowGrid" +#define XtNshowRuler "showRuler" +#define XtCShowRuler "ShowRuler" +#define XtNrulerFont "rulerFont" + +/* + * Menu dialog identification codes + */ + +#define MENU_SET_VIEWS 1 +#define MENU_COPY 2 +#define MENU_CUT 3 +#define MENU_PASTE 4 +#define MENU_MIRROR_XZ 5 +#define MENU_MIRROR_XY 6 +#define MENU_MIRROR_YZ 7 +#define MENU_CLEAR 8 +#define MENU_SAVE 9 +#define MENU_SAVE_AS 10 +#define MENU_OPEN 11 +#define MENU_NEW 12 +#define MENU_GRID 13 +#define MENU_RULER 14 +#define MENU_SET_VIEWS_COMPLETE 15 +#define MENU_SET_VIEWS_CANCEL 16 +#define MENU_RESCALE_APPLY 17 +#define MENU_RESCALE_CANCEL 18 +#define MENU_RESCALE 19 +#define MENU_MARKER 20 /* 32 markers are available */ +#define MENU_MARKER_LAST 51 /* This is the highest marker */ +#define MENU_GEAR_CALCULATE 52 +#define MENU_GEAR_CANCEL 53 +#define MENU_GEAR 54 +#define MENU_INFO_CALCULATE 55 +#define MENU_INFO_CANCEL 56 +#define MENU_INFO 57 +#define MENU_DERIV_CALCULATE 58 +#define MENU_DERIV_CANCEL 59 +#define MENU_DERIV 60 +#define MENU_PWR_CALCULATE 61 +#define MENU_PWR_CANCEL 62 +#define MENU_PWR 63 +#define MENU_ROTATE_X 64 + + +typedef struct _view_info_t { + struct _view_info_t *other_view; + unsigned int flags; + Widget other_widget; /* the other view */ + Window other_window; /* XtWindow (other_widget) */ + Pixmap pixmap; /* A copy of this window's contents */ + GC gc; + GC erase_gc; + GC grid_gc; + short origin_x, origin_y; /* view's origin screen location */ + int layout; /* axes that we're viewing */ + Dimension width, height; + } view_info_t; + +#define VI_PIXMAP_ALLOCATED 1 + +typedef struct { + long numerator, denominator; + } fraction_t; + +typedef struct { + fraction_t x, y, z; + } loc_t; + +typedef struct { + loc_t location; /* precise point location */ + VPoint point; /* location as doubles */ + short x, y, z; /* pixel offset from origin */ + } point_t; + +typedef struct _polygon_t { + long id; + long next; + VPoint normal; /* normal vector of this polygon's plane */ + VPoint origin; /* plane's origin */ + double d; /* plane equation: a x + b y + c z + d = 0 */ + VPoint trihedral; /* used to transform from planar to world */ + int num_points; /* number of points defined */ + point_t *point; /* an array of points */ + } polygon_t; + +typedef struct { + Boolean defined; /* is the marker defined yet? */ + int id; /* a unique identifier for each marker */ + char name[32]; /* name of this marker */ + point_t location; /* where is this marker located */ + } marker_t; + +EXTERN AppData app_data; +EXTERN int edit_state; +EXTERN polygon_t *cur_polygon; +EXTERN int sel_polygon; /* list of selected polygons */ +EXTERN int unsel_polygon; /* list of unselected polygons */ +EXTERN int clipboard_polygon; +EXTERN polygon_t *polygon_list; /* array of polygon pool */ +EXTERN int polygon_count, polygon_max; +EXTERN double pixel_scale; /* display scale (units per pixel) */ +EXTERN long ruler_divisions; +EXTERN point_t *tmp_point; +EXTERN int tmp_point_max; +EXTERN Widget twindow; +EXTERN Widget bwindow; +EXTERN Widget open_dialog; +EXTERN Widget save_as_dialog; +EXTERN Widget save_formats[3]; +EXTERN Widget set_views_dialog; +EXTERN Widget rescale_field; +EXTERN Widget rescale_dialog; +EXTERN Widget gear_dialog; +EXTERN Widget info_dialog; +EXTERN Widget deriv_dialog; +EXTERN Widget powerplant_dialog; +EXTERN Widget extent_x, extent_y, extent_z; +EXTERN Widget x_field, y_field, z_field; +EXTERN XPoint drag_origin; /* where a drag operation started */ +EXTERN Boolean drag_mode; +EXTERN XSegment rubber_lines[2]; +EXTERN Cursor cursors[6]; +EXTERN Boolean filename_valid; +EXTERN char filename[256]; +EXTERN int desired_view; +EXTERN marker_t *marker_list; +EXTERN int current_marker; +EXTERN int marker_count; +EXTERN Boolean craft_valid; +EXTERN char craft_name[128]; + + +// A copy of the craft type structure from the acm/inventory.h file with only +// the fields here left. +typedef struct craftType { + char *name; /* short name of aircraft class */ + double Clda; /* roll moment from aileron offset */ + double Cldr; /* roll moment from rudder offset */ + double Clp; /* roll damping */ + double Cmq; /* damping in pitch */ + double Cnr; /* damping in yaw */ + VMatrix I; /* Moments of Inertia about CG in AXYZ (lb ft^2) */ + double cmSlope; /* CmAlpha curve slope */ + double wingS; /* wing area (ft^2) */ + double wings; /* wing half-span (ft) */ + double c; /* mean aerodynamic chord (MAC) (ft) */ + double emptyWeight; /* empty mass (lb) */ + double maxFuel; /* maximum internal fuel (lb) */ + double maxThrust; /* max static thrust, military power (lbf) */ + double maxABThrust; /* max static thrust, afterburner on (lbf) */ + double engineLag; /* controls lag between throttle and RPM */ + double spFuelConsump; /* specific fuel consump(lb fuel/lbf T x hr) */ + double spABFuelConsump; + VPoint viewPoint; /* pilot's viewing location wrt CG (ft) */ + VPoint rm, rn; /* location if main/nose gear attachments */ + double Dm, Dn; /* main/nose oleo damping factor */ + double Km, Kn; /* main/nose oleo spring factor */ + double Gm, Gn; /* main/nose strut length with tire */ + double cmMax, cnMax; /* main/nose maximum oleo extension distance */ +} craftType; + + +EXTERN craftType c; + +/* + * edit_state values + */ + +#define STATE_POINT 0 +#define STATE_POLYGON 1 +#define STATE_MOVE_ORIGIN 2 +#define STATE_CIRCLE 3 +#define STATE_MARKER 4 + +/* + * view layouts + */ + +#define VL_XZ 0 +#define VL_XY 1 +#define VL_NXZ 2 +#define VL_NXY 3 +#define VL_NXNZ 4 +#define VL_NXNY 5 +#define VL_NYX 6 +#define VL_NYZ 7 +#define VL_NYNX 8 +#define VL_NYNZ 9 + +/* + * Cursor definitions + */ + +#define CURSOR_POINT 0 +#define CURSOR_POLY_PLANE 1 +#define CURSOR_POLY 2 +#define CURSOR_ORIGIN 3 +#define CURSOR_CIRCLE 4 +#define CURSOR_MARKER 5 + +/* + * Valid view configurations + */ + +#define VIEW_LEFT_TOP 0 +#define VIEW_FRONT_TOP 1 + +/* + * Markers + */ + +#define MARKER_HEAD 0 +#define MARKER_NOSE_GEAR 1 +#define MARKER_MAIN_GEAR 2 +#define MARKER_TAIL_SCRAPE 3 + +/* + * Nasty pointer to/from int conversions that prevent gcc -Wall complains + * on both 32 and 64 bits systems. The code use them here and there where + * Xt callbacks expects users' data be pointers instead. + */ +#define shared_PtrToInt(p) ((int)((void *)(p) - (void *) 0)) +#define shared_IntToPtr(i) ((void *)((char *) 0 + i)) + +EXTERN view_info_t t_info, b_info; + +EXTERN void SetCursor (int id); +EXTERN void MenuCB (Widget w, void *client_data, void *call_data); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/gedit/VReadObject.c acm-6.0+20200416/src/gedit/VReadObject.c --- acm-5.0/src/gedit/VReadObject.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/gedit/VReadObject.c 2017-08-11 16:47:59.000000000 +0000 @@ -0,0 +1,65 @@ +/* + * Copyright (c) 1994, Riley Rainey, riley@netcon.com + * + * Permission to use, copy, modify and distribute (without charge) this + * software, documentation, images, etc. is granted, provided that this + * comment and the author's name is retained. + * + * This software is provided by the author as is, and without any expressed + * or implied warranties, including, but not limited to, the implied + * warranties of merchantability and fitness for a particular purpose. In no + * event shall the author be liable for any direct, indirect, incidental, or + * consequential damages arising in any way out of the use of this software. + */ + +#include + +#include "../util/memory.h" + +#define VReadObject_IMPORT +#include "VReadObject.h" + + +VObject *VReadObject2(FILE *f) +{ + short I, J, vertex, vertices, NumPts, NumPolys; + float x, y, z; + char str[64], name[128]; + VPoint *tmpPts, pts[VmaxVP]; + VPolygon **polygons; + VObject *object; + + fscanf(f, "%s\n", name); + fscanf(f, "%hd", &NumPts); + fscanf(f, "%hd", &NumPolys); + + tmpPts = (VPoint *) memory_allocate(NumPts * sizeof(VPoint), NULL); + polygons = (VPolygon **) memory_allocate(NumPolys * sizeof(VPolygon *), NULL); + + for (I=0; Iname = memory_strdup (name); + object->numPolys = NumPolys; + object->polygon = polygons; + + memory_dispose(tmpPts); + return ferror(f) ? (VObject *) 0 : object; +} diff -Nru acm-5.0/src/gedit/VReadObject.h acm-6.0+20200416/src/gedit/VReadObject.h --- acm-5.0/src/gedit/VReadObject.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/gedit/VReadObject.h 2017-04-16 08:24:47.000000000 +0000 @@ -0,0 +1,30 @@ +/* + * Copyright (c) 1994, Riley Rainey, riley@netcon.com + * + * Permission to use, copy, modify and distribute (without charge) this + * software, documentation, images, etc. is granted, provided that this + * comment and the author's name is retained. + * + * This software is provided by the author as is, and without any expressed + * or implied warranties, including, but not limited to, the implied + * warranties of merchantability and fitness for a particular purpose. In no + * event shall the author be liable for any direct, indirect, incidental, or + * consequential damages arising in any way out of the use of this software. + */ + +#ifndef VReadObject_H +#define VReadObject_H + +#include +#include "../V/VObjects.h" + +#ifdef VReadObject_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +EXTERN VObject *VReadObject2(FILE *f); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/gedit/VWriteObject.c acm-6.0+20200416/src/gedit/VWriteObject.c --- acm-5.0/src/gedit/VWriteObject.c 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/gedit/VWriteObject.c 2017-10-26 09:38:40.000000000 +0000 @@ -0,0 +1,156 @@ +/* + * Copyright (c) 1994, Riley Rainey, riley@netcon.com + * + * Permission to use, copy, modify and distribute (without charge) this + * software, documentation, images, etc. is granted, provided that this + * comment and the author's name is retained. + * + * This software is provided by the author as is, and without any expressed + * or implied warranties, including, but not limited to, the implied + * warranties of merchantability and fitness for a particular purpose. In no + * event shall the author be liable for any direct, indirect, incidental, or + * consequential damages arising in any way out of the use of this software. + */ + +#include +#include + +#include "../util/error.h" +#include "shared.h" + +#define VWriteObject_IMPORT +#include "VWriteObject.h" + + +int WriteVFile(char *name) +{ + + int i, j, k, points = 0, polygons = 0, error; + register point_t *p; + FILE *f; + char ivname[1024]; + + if ((f = fopen (name, "w")) == (FILE *) NULL) { + perror ("can't open file"); + } + +/* + * Total the number of vertices in all of the object's polygons + */ + + for (i=sel_polygon; i >= 0; i = polygon_list[i].next) { + polygons ++; + points += polygon_list[i].num_points; + } + + for (i=unsel_polygon; i >= 0; i = polygon_list[i].next) { + polygons ++; + points += polygon_list[i].num_points; + } + +/* + * Print the header + */ + + fprintf (f, "%s\n%d %d\n", "object", points, polygons); + +/* + * Print the point list + */ + + k = 1; + + for (i=sel_polygon; i >= 0; i = polygon_list[i].next) { + for (j=0; j < polygon_list[i].num_points; ++j) { + p = &polygon_list[i].point[j]; + fprintf (f, "%d %lg %lg %lg\n", k, p->point.x, + p->point.y, p->point.z); + ++k; + } + } + + for (i=unsel_polygon; i >= 0; i = polygon_list[i].next) { + for (j=0; j < polygon_list[i].num_points; ++j) { + p = &polygon_list[i].point[j]; + fprintf (f, "%d %lg %lg %lg\n", k, p->point.x, + p->point.y, p->point.z); + ++k; + } + } + + +/* + * Print the polygon list + */ + + k = 1; + + for (i=sel_polygon; i >= 0; i = polygon_list[i].next) { + fprintf(f, "%s %d", "gray44", polygon_list[i].num_points); + for (j=0; j < polygon_list[i].num_points; ++j) { + fprintf(f, " %d", k++); + } + fprintf (f, "\n"); + } + + for (i=unsel_polygon; i >= 0; i = polygon_list[i].next) { + fprintf(f, "%s %d", "gray44", polygon_list[i].num_points); + for (j=0; j < polygon_list[i].num_points; ++j) { + fprintf(f, " %d", k++); + } + fprintf (f, "\n"); + } + + error = ferror(f) ? -1 : 0; + + fclose (f); + +/* + * Now write the aircraft inventory information + */ + + snprintf(ivname, sizeof(ivname), "%s.inv", name); + if ((f = fopen (ivname, "w")) == NULL) + error_system("opening %s for writing", ivname); + + c.viewPoint = marker_list[MARKER_HEAD].location.point; + + fprintf (f, "aircraft \"%s\" {\n\n", c.name); + fprintf (f, "\tWingArea\t%lg\n", c.wingS); + fprintf (f, "\tWingHalfSpan\t%lg\n", c.wings); + fprintf (f, "\tChord\t\t%lg\n", c.c); + fprintf (f, "\tEmptyWeight\t%lg\n", c.emptyWeight); + fprintf (f, "\tMaxFuel\t\t%lg\n", c.maxFuel); + fprintf (f, "\tIxx\t\t%lg\n", c.I.m[0][0]); + fprintf (f, "\tIyy\t\t%lg\n", c.I.m[1][1]); + fprintf (f, "\tIzz\t\t%lg\n", c.I.m[2][2]); + fprintf (f, "\tRm\t\t{%lg, %lg, %lg}\n", c.rm.x, c.rm.y, c.rm.z); + fprintf (f, "\tRn\t\t{%lg, %lg, %lg}\n", c.rn.x, c.rn.y, c.rn.z); + fprintf (f, "\tKm\t\t%lg\n", c.Km); + fprintf (f, "\tKn\t\t%lg\n", c.Kn); + fprintf (f, "\tGm\t\t%lg\n", c.Gm); + fprintf (f, "\tGn\t\t%lg\n", c.Gn); + fprintf (f, "\tCmMax\t\t%lg\n", c.cmMax); + fprintf (f, "\tCnMax\t\t%lg\n", c.cnMax); + //fprintf (f, "\tGroundingPoint\t{0.0, 0.0, %lg}\n", c.groundingPoint.z); + fprintf (f, "\tViewPoint\t{%lg, %lg, %lg}\n", + c.viewPoint.x, c.viewPoint.y, c.viewPoint.z); + fprintf (f, "\n"); + fprintf (f, "\tMaxThrust\t%lg\n", c.maxThrust); + fprintf (f, "\tMaxABThrust\t%lg\n", c.maxABThrust); + fprintf (f, "\tSpFuelConsump\t%lg\n", c.spFuelConsump); + fprintf (f, "\tSpABFuelConsump\t%lg\n", c.spABFuelConsump); + fprintf (f, "\tEngineLag\t%lg\n", c.engineLag); + fprintf (f, "\n"); + fprintf (f, "\tClda\t\t%lg\n", c.Clda); + fprintf (f, "\tCldr\t\t%lg\n", c.Cldr); + fprintf (f, "\tClp\t\t%lg\n", c.Clp); + fprintf (f, "\tCmq\t\t%lg\n", c.Cmq); + fprintf (f, "\tCnr\t\t%lg\n", c.Cnr); + fprintf (f, "\tCmAlpha\t\t%lg\n", c.cmSlope); + //fprintf (f, "\tCmFactor\t%lg\n", c.cmFactor); + fprintf (f, "\t}\n"); + fclose (f); + + return error; +} diff -Nru acm-5.0/src/gedit/VWriteObject.h acm-6.0+20200416/src/gedit/VWriteObject.h --- acm-5.0/src/gedit/VWriteObject.h 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/gedit/VWriteObject.h 2017-04-16 08:24:47.000000000 +0000 @@ -0,0 +1,30 @@ +/* + * Copyright (c) 1994, Riley Rainey, riley@netcon.com + * + * Permission to use, copy, modify and distribute (without charge) this + * software, documentation, images, etc. is granted, provided that this + * comment and the author's name is retained. + * + * This software is provided by the author as is, and without any expressed + * or implied warranties, including, but not limited to, the implied + * warranties of merchantability and fitness for a particular purpose. In no + * event shall the author be liable for any direct, indirect, incidental, or + * consequential damages arising in any way out of the use of this software. + */ + +#ifndef VWriteObject_H +#define VWriteObject_H + +#include +#include "../V/VObjects.h" + +#ifdef VWriteObject_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +EXTERN int WriteVFile(char *name); + +#undef EXTERN +#endif diff -Nru acm-5.0/src/gedit/xbm/circle_32.xbm acm-6.0+20200416/src/gedit/xbm/circle_32.xbm --- acm-5.0/src/gedit/xbm/circle_32.xbm 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/gedit/xbm/circle_32.xbm 2006-01-05 13:58:55.000000000 +0000 @@ -0,0 +1,14 @@ +#define circle_32_width 32 +#define circle_32_height 32 +static char circle_32_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x98, 0x19, 0x00, + 0x00, 0x02, 0x40, 0x00, 0x80, 0x00, 0x00, 0x01, 0x30, 0x00, 0x00, 0x0e, + 0x30, 0x00, 0x00, 0x0c, 0x10, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x40, + 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, + 0x02, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x70, 0x00, 0x00, 0x0c, + 0x70, 0x00, 0x00, 0x0e, 0x80, 0x00, 0x00, 0x01, 0x00, 0x02, 0x40, 0x00, + 0x00, 0x98, 0x19, 0x00, 0x00, 0x80, 0x01, 0x00}; diff -Nru acm-5.0/src/gedit/xbm/circle_64.xbm acm-6.0+20200416/src/gedit/xbm/circle_64.xbm --- acm-5.0/src/gedit/xbm/circle_64.xbm 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/gedit/xbm/circle_64.xbm 2006-01-05 13:58:55.000000000 +0000 @@ -0,0 +1,46 @@ +#define polygon_width 64 +#define polygon_height 64 +static char polygon_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xfc, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xe3, + 0xe3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x30, 0xe0, 0x03, 0x06, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x60, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, + 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xfa, 0x00, 0x80, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0xfc, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, + 0x80, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x80, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0xf8, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, + 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x1f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7c, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, + 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x1f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7c, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, + 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x1f, 0x00, 0x00, + 0x00, 0x00, 0xf8, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, + 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x3f, 0x00, 0x00, + 0x00, 0x00, 0xfa, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, + 0x00, 0x00, 0x03, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x30, 0xe0, 0x03, 0x06, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0xe3, 0xe3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, + 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0x00}; diff -Nru acm-5.0/src/gedit/xbm/curs_marker_mask.xbm acm-6.0+20200416/src/gedit/xbm/curs_marker_mask.xbm --- acm-5.0/src/gedit/xbm/curs_marker_mask.xbm 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/gedit/xbm/curs_marker_mask.xbm 2006-01-05 13:58:55.000000000 +0000 @@ -0,0 +1,16 @@ +#define curs_marker_mask_width 32 +#define curs_marker_mask_height 32 +#define curs_marker_mask_x_hot 15 +#define curs_marker_mask_y_hot 15 +static char curs_marker_mask_bits[] = { + 0x00, 0xc0, 0x01, 0x00, 0x00, 0xfc, 0x1e, 0x00, 0x00, 0xff, 0x60, 0x00, + 0xc0, 0xff, 0x80, 0x01, 0xe0, 0xff, 0x00, 0x02, 0xf0, 0xff, 0x00, 0x04, + 0xf8, 0xff, 0x00, 0x08, 0xf8, 0xff, 0x00, 0x08, 0xfc, 0xff, 0x00, 0x10, + 0xfc, 0xff, 0x00, 0x10, 0xfe, 0xff, 0x00, 0x20, 0xfe, 0xff, 0x00, 0x20, + 0xfe, 0xff, 0x02, 0x20, 0xfe, 0x3f, 0x04, 0x20, 0xff, 0x1f, 0x00, 0x40, + 0xff, 0x9f, 0xfc, 0x7f, 0x01, 0x00, 0xfc, 0x7f, 0x02, 0x10, 0xfe, 0x3f, + 0x02, 0xa0, 0xff, 0x3f, 0x02, 0x80, 0xff, 0x3f, 0x02, 0x80, 0xff, 0x3f, + 0x04, 0x80, 0xff, 0x1f, 0x04, 0x80, 0xff, 0x1f, 0x08, 0x80, 0xff, 0x0f, + 0x08, 0x80, 0xff, 0x0f, 0x10, 0x80, 0xff, 0x07, 0x20, 0x80, 0xff, 0x03, + 0xc0, 0x80, 0xff, 0x01, 0x00, 0x83, 0x7f, 0x00, 0x00, 0xbc, 0x1f, 0x00, + 0x00, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00}; diff -Nru acm-5.0/src/gedit/xbm/curs_marker.xbm acm-6.0+20200416/src/gedit/xbm/curs_marker.xbm --- acm-5.0/src/gedit/xbm/curs_marker.xbm 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/gedit/xbm/curs_marker.xbm 2006-01-05 13:58:55.000000000 +0000 @@ -0,0 +1,16 @@ +#define curs_marker_width 32 +#define curs_marker_height 32 +#define curs_marker_x_hot 15 +#define curs_marker_y_hot 15 +static char curs_marker_bits[] = { + 0x00, 0xc0, 0x01, 0x00, 0x00, 0xfc, 0x1e, 0x00, 0x00, 0xab, 0x60, 0x00, + 0xc0, 0xd5, 0x80, 0x01, 0xa0, 0xaa, 0x00, 0x02, 0x50, 0xd5, 0x00, 0x04, + 0xa8, 0xaa, 0x00, 0x08, 0x58, 0xd5, 0x00, 0x08, 0xac, 0xaa, 0x00, 0x10, + 0x54, 0xd5, 0x00, 0x10, 0xaa, 0xaa, 0x00, 0x20, 0x56, 0xd5, 0x00, 0x20, + 0xaa, 0xaa, 0x02, 0x20, 0x56, 0x15, 0x04, 0x20, 0xab, 0x0a, 0x00, 0x40, + 0xff, 0x9f, 0xfc, 0x7f, 0x01, 0x00, 0xa8, 0x6a, 0x02, 0x10, 0x54, 0x35, + 0x02, 0xa0, 0xaa, 0x2a, 0x02, 0x80, 0x55, 0x35, 0x02, 0x80, 0xaa, 0x2a, + 0x04, 0x80, 0x55, 0x15, 0x04, 0x80, 0xaa, 0x1a, 0x08, 0x80, 0x55, 0x0d, + 0x08, 0x80, 0xaa, 0x0a, 0x10, 0x80, 0x55, 0x05, 0x20, 0x80, 0xaa, 0x02, + 0xc0, 0x80, 0xd5, 0x01, 0x00, 0x83, 0x6a, 0x00, 0x00, 0xbc, 0x1f, 0x00, + 0x00, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00}; diff -Nru acm-5.0/src/gedit/xbm/cursor_32.xbm acm-6.0+20200416/src/gedit/xbm/cursor_32.xbm --- acm-5.0/src/gedit/xbm/cursor_32.xbm 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/gedit/xbm/cursor_32.xbm 2006-01-05 13:58:55.000000000 +0000 @@ -0,0 +1,14 @@ +#define cursor_32_width 32 +#define cursor_32_height 32 +static char cursor_32_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x07, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, + 0x80, 0xff, 0x00, 0x00, 0xc0, 0xff, 0x03, 0x00, 0xc0, 0xff, 0x0f, 0x00, + 0xc0, 0xff, 0x03, 0x00, 0xc0, 0xff, 0x01, 0x00, 0x80, 0x7f, 0x00, 0x00, + 0x80, 0x7f, 0x00, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xeb, 0x03, 0x00, + 0x80, 0xf2, 0x07, 0x00, 0x80, 0xc1, 0x0f, 0x00, 0x00, 0xe0, 0x1f, 0x00, + 0x00, 0x80, 0x3f, 0x00, 0x00, 0x40, 0xff, 0x00, 0x00, 0x00, 0xff, 0x01, + 0x00, 0x80, 0xfe, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x1d, 0x00, + 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff -Nru acm-5.0/src/gedit/xbm/cursor_64.xbm acm-6.0+20200416/src/gedit/xbm/cursor_64.xbm --- acm-5.0/src/gedit/xbm/cursor_64.xbm 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/gedit/xbm/cursor_64.xbm 2006-01-05 13:58:55.000000000 +0000 @@ -0,0 +1,46 @@ +#define cursor_width 64 +#define cursor_height 64 +static char cursor_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x0f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe8, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe8, 0xff, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xe8, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe8, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, + 0x01, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, + 0x7f, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, + 0x00, 0xd0, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xff, 0xff, + 0x03, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0x1f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x9f, 0xfe, 0x03, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xef, 0xfe, + 0x07, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x13, 0xfd, 0x0f, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0x0c, 0xfd, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x40, 0x02, 0xfa, + 0x7f, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x01, 0xfa, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x40, 0x00, 0xf4, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf4, + 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe8, 0xff, 0x07, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xe8, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, + 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0xff, 0x7f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xa0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, + 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x40, 0xff, 0xff, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x40, 0xfe, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x80, + 0xfe, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0xfc, 0x7f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf9, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfa, 0x07, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff -Nru acm-5.0/src/gedit/xbm/curs_poly_mask.xbm acm-6.0+20200416/src/gedit/xbm/curs_poly_mask.xbm --- acm-5.0/src/gedit/xbm/curs_poly_mask.xbm 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/gedit/xbm/curs_poly_mask.xbm 2006-01-05 13:58:55.000000000 +0000 @@ -0,0 +1,16 @@ +#define curs_poly_mask_width 32 +#define curs_poly_mask_height 32 +#define curs_poly_mask_x_hot 15 +#define curs_poly_mask_y_hot 15 +static char curs_poly_mask_bits[] = { + 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, + 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, + 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, + 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, + 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0xff, 0x3f, 0xfe, 0xff, + 0xff, 0x3f, 0xfe, 0xff, 0xff, 0x3f, 0xfe, 0xff, 0x00, 0xc0, 0x01, 0x00, + 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, + 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, + 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, + 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, + 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00}; diff -Nru acm-5.0/src/gedit/xbm/curs_poly.xbm acm-6.0+20200416/src/gedit/xbm/curs_poly.xbm --- acm-5.0/src/gedit/xbm/curs_poly.xbm 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/gedit/xbm/curs_poly.xbm 2006-01-05 13:58:55.000000000 +0000 @@ -0,0 +1,16 @@ +#define curs_poly_width 32 +#define curs_poly_height 32 +#define curs_poly_x_hot 15 +#define curs_poly_y_hot 15 +static char curs_poly_bits[] = { + 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x1f, 0xfc, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00}; diff -Nru acm-5.0/src/gedit/xbm/curs_reshape_mask.xbm acm-6.0+20200416/src/gedit/xbm/curs_reshape_mask.xbm --- acm-5.0/src/gedit/xbm/curs_reshape_mask.xbm 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/gedit/xbm/curs_reshape_mask.xbm 2006-01-05 13:58:55.000000000 +0000 @@ -0,0 +1,16 @@ +#define curs_reshape_mask_width 32 +#define curs_reshape_mask_height 32 +#define curs_reshape_mask_x_hot 15 +#define curs_reshape_mask_y_hot 15 +static char curs_reshape_mask_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x04, 0x38, 0x00, 0x00, 0x0e, 0x70, 0x00, 0x00, 0x07, + 0xe0, 0x00, 0x80, 0x03, 0xc0, 0x01, 0xc0, 0x01, 0x80, 0x03, 0xe0, 0x00, + 0x00, 0x07, 0x70, 0x00, 0x00, 0x0e, 0x38, 0x00, 0x00, 0x1c, 0x1c, 0x00, + 0x00, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x18, 0x0c, 0x00, 0x00, 0x1c, 0x1c, 0x00, 0x00, 0x0e, 0x38, 0x00, + 0x00, 0x07, 0x70, 0x00, 0x80, 0x03, 0xe0, 0x00, 0xc0, 0x01, 0xc0, 0x01, + 0xe0, 0x00, 0x80, 0x03, 0x70, 0x00, 0x00, 0x07, 0x38, 0x00, 0x00, 0x0e, + 0x10, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff -Nru acm-5.0/src/gedit/xbm/curs_reshape.xbm acm-6.0+20200416/src/gedit/xbm/curs_reshape.xbm --- acm-5.0/src/gedit/xbm/curs_reshape.xbm 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/gedit/xbm/curs_reshape.xbm 2006-01-05 13:58:55.000000000 +0000 @@ -0,0 +1,16 @@ +#define curs_reshape_width 32 +#define curs_reshape_height 32 +#define curs_reshape_x_hot 15 +#define curs_reshape_y_hot 15 +static char curs_reshape_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x04, 0x20, 0x00, 0x00, 0x02, + 0x40, 0x00, 0x00, 0x01, 0x80, 0x00, 0x80, 0x00, 0x00, 0x01, 0x40, 0x00, + 0x00, 0x02, 0x20, 0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x08, 0x08, 0x00, + 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x04, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x04, 0x10, 0x00, + 0x00, 0x02, 0x20, 0x00, 0x00, 0x01, 0x40, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x40, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x02, 0x10, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff -Nru acm-5.0/src/gedit/xbm/hand_32.xbm acm-6.0+20200416/src/gedit/xbm/hand_32.xbm --- acm-5.0/src/gedit/xbm/hand_32.xbm 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/gedit/xbm/hand_32.xbm 2006-01-05 13:58:55.000000000 +0000 @@ -0,0 +1,14 @@ +#define hand_32_width 32 +#define hand_32_height 32 +static char hand_32_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0x80, 0x00, 0xd0, + 0x00, 0xa0, 0x01, 0x50, 0x00, 0xf0, 0x00, 0x30, 0x00, 0xd8, 0x00, 0x6e, + 0x00, 0x70, 0x00, 0x7f, 0x00, 0x7c, 0x80, 0x3f, 0x00, 0x6a, 0xc0, 0x1f, + 0x00, 0x27, 0x60, 0x0e, 0x00, 0x33, 0xf0, 0x01, 0x80, 0x1f, 0x38, 0x03, + 0x00, 0x11, 0xfa, 0xc0, 0xc0, 0x8f, 0x06, 0xd0, 0x00, 0x98, 0x3b, 0x1e, + 0x40, 0x70, 0xfc, 0x4b, 0x20, 0x07, 0xe8, 0xe6, 0xa0, 0xf9, 0x7f, 0xfa, + 0x60, 0xc0, 0xfe, 0xff, 0x70, 0x03, 0xa4, 0xaf, 0xf0, 0x3f, 0xde, 0x67, + 0xf0, 0x08, 0xbe, 0x7f, 0x30, 0x86, 0xff, 0x7f, 0x38, 0x0d, 0x20, 0x19, + 0xf8, 0xee, 0xf8, 0x07, 0xf8, 0x00, 0xec, 0x07, 0x5c, 0x80, 0x74, 0x02, + 0xfc, 0x7f, 0x8e, 0x01, 0x9c, 0x7f, 0x0c, 0x01, 0x7a, 0x80, 0x07, 0x00, + 0x06, 0x87, 0x7f, 0x00, 0xed, 0xb0, 0x0d, 0x00}; diff -Nru acm-5.0/src/gedit/xbm/hand_64.xbm acm-6.0+20200416/src/gedit/xbm/hand_64.xbm --- acm-5.0/src/gedit/xbm/hand_64.xbm 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/gedit/xbm/hand_64.xbm 2006-01-05 13:58:55.000000000 +0000 @@ -0,0 +1,46 @@ +#define hand_width 64 +#define hand_height 64 +static char hand_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0xd8, + 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0xe8, + 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x78, 0x01, 0x00, 0x80, 0xae, + 0x00, 0x00, 0x00, 0xec, 0x01, 0x00, 0x80, 0xbb, 0x00, 0x00, 0x00, 0x75, + 0x01, 0x00, 0xe0, 0x66, 0x00, 0x00, 0x00, 0xd7, 0x00, 0x00, 0xa0, 0xad, + 0x00, 0x00, 0x80, 0xed, 0x01, 0x00, 0x78, 0xeb, 0x00, 0x00, 0xc0, 0x5b, + 0x00, 0x00, 0xd4, 0x36, 0x00, 0x00, 0xc0, 0xf6, 0x00, 0x00, 0xbe, 0x2d, + 0x00, 0x00, 0xa0, 0xb5, 0x00, 0x00, 0x57, 0x15, 0x00, 0x00, 0xe0, 0x6a, + 0x00, 0x00, 0xab, 0x07, 0x00, 0x00, 0xd8, 0x35, 0x00, 0xc0, 0x5d, 0x05, + 0x00, 0x00, 0x3c, 0x5d, 0x00, 0xc0, 0xea, 0x02, 0x00, 0x00, 0xec, 0x36, + 0x00, 0x70, 0x57, 0x01, 0x00, 0x00, 0x96, 0x1a, 0x00, 0xa8, 0x75, 0x00, + 0x00, 0x00, 0xbd, 0x0e, 0x00, 0xbe, 0x5e, 0x00, 0x00, 0x00, 0xa7, 0x06, + 0x00, 0xaa, 0x15, 0x00, 0x00, 0x00, 0xad, 0x05, 0x80, 0x57, 0x0b, 0x00, + 0x00, 0x80, 0x4b, 0x03, 0x40, 0x55, 0x05, 0x00, 0x00, 0x40, 0x55, 0x03, + 0x60, 0xad, 0x05, 0x80, 0x00, 0xc0, 0xd5, 0x02, 0xb8, 0x55, 0x01, 0xe0, + 0x00, 0xa0, 0xab, 0x01, 0x6c, 0x75, 0x00, 0xf8, 0x00, 0xe0, 0x6a, 0x01, + 0xdb, 0x56, 0x00, 0xff, 0x00, 0x50, 0xd5, 0xc0, 0xb6, 0x2a, 0x80, 0x5b, + 0x00, 0xf0, 0xfa, 0xa0, 0x5b, 0x0f, 0xf0, 0xfd, 0x00, 0xa8, 0xca, 0x6b, + 0x6d, 0x05, 0x5e, 0xab, 0x00, 0xb0, 0x7a, 0xdd, 0xd5, 0x4a, 0xb5, 0x76, + 0x00, 0xb8, 0xaa, 0xb7, 0x5a, 0xdf, 0xef, 0xba, 0x00, 0xb4, 0xde, 0x6a, + 0xb5, 0x7d, 0x99, 0xed, 0x00, 0xac, 0xb5, 0xaa, 0xea, 0xd6, 0xb6, 0xfe, + 0x00, 0xba, 0xaa, 0xb6, 0xdd, 0xaf, 0xd5, 0xbd, 0x00, 0x6c, 0x6b, 0x55, + 0x55, 0xb5, 0x6e, 0x77, 0x00, 0xde, 0xaa, 0x6a, 0xbb, 0xab, 0xfa, 0xdd, + 0x00, 0xb4, 0xaa, 0xda, 0x56, 0xdd, 0x5f, 0xf7, 0x00, 0x6e, 0x55, 0xad, + 0xea, 0xb6, 0xba, 0xba, 0x00, 0xb5, 0xad, 0xaa, 0x9a, 0xee, 0xd7, 0x6e, + 0x80, 0x5e, 0xab, 0xd5, 0x6a, 0xb5, 0x5a, 0xdb, 0x00, 0x77, 0x55, 0xad, + 0x56, 0xdb, 0xb5, 0x36, 0x80, 0xad, 0xaa, 0x6a, 0xa9, 0xb6, 0xd6, 0x6f, + 0x80, 0xdf, 0xea, 0xaa, 0x56, 0x6d, 0xfd, 0x35, 0x80, 0xba, 0xad, 0x56, + 0xb5, 0xea, 0x7f, 0x2f, 0x80, 0xaf, 0xb6, 0x6a, 0x55, 0x55, 0xd7, 0x1d, + 0x40, 0xfb, 0x6d, 0xd5, 0x56, 0xf5, 0xbd, 0x16, 0xc0, 0xad, 0x5b, 0xaa, + 0xaa, 0xae, 0x6b, 0x0b, 0x80, 0x7f, 0x55, 0x55, 0x5b, 0x59, 0xd7, 0x07, + 0xc0, 0xd5, 0x56, 0xd4, 0x6a, 0xd7, 0xbd, 0x00, 0x40, 0xbf, 0x4a, 0x55, + 0x55, 0xa9, 0xd6, 0x10, 0xc0, 0xd7, 0xaa, 0xaa, 0xda, 0xd6, 0x1d, 0x02, + 0xe0, 0xad, 0xaa, 0x56, 0xab, 0x5a, 0x2b, 0x00, 0xf0, 0xbb, 0xaa, 0xea, + 0xba, 0xb5, 0x8e, 0x00, 0x50, 0x55, 0x55, 0x55, 0x55, 0xad, 0x15, 0x00, + 0xf0, 0x57, 0x55, 0xb5, 0xd6, 0x6a, 0x03, 0x00, 0xb8, 0xac, 0xaa, 0xaa, + 0x55, 0xab, 0x86, 0x00, 0x78, 0x6b, 0x55, 0xb5, 0xda, 0xaa, 0x01, 0x00, + 0xa8, 0x5a, 0x55, 0x55, 0x57, 0x75, 0x11, 0x00, 0x6c, 0x95, 0xaa, 0x6a, + 0xb5, 0xaa, 0x00, 0x00, 0xd4, 0x56, 0x49, 0x55, 0xab, 0x2a, 0x00, 0x00, + 0xbc, 0x2a, 0xb5, 0x6a, 0x5d, 0x15, 0x00, 0x00, 0xa6, 0x52, 0x55, 0xd5, + 0x56, 0x03, 0x00, 0x00, 0xdb, 0x56, 0x2a, 0x6d, 0xdb, 0x00, 0x00, 0x00, + 0xb7, 0xaa, 0xaa, 0xba, 0x05, 0x08, 0x00, 0x00}; diff -Nru acm-5.0/src/gedit/xbm/marker.xbm acm-6.0+20200416/src/gedit/xbm/marker.xbm --- acm-5.0/src/gedit/xbm/marker.xbm 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/gedit/xbm/marker.xbm 2006-01-05 13:58:55.000000000 +0000 @@ -0,0 +1,46 @@ +#define marker_width 64 +#define marker_height 64 +static char marker_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x3f, + 0xfe, 0xff, 0xff, 0x07, 0xc0, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0x07, + 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff -Nru acm-5.0/src/gedit/xbm/origin_32.xbm acm-6.0+20200416/src/gedit/xbm/origin_32.xbm --- acm-5.0/src/gedit/xbm/origin_32.xbm 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/gedit/xbm/origin_32.xbm 2006-01-05 13:58:55.000000000 +0000 @@ -0,0 +1,14 @@ +#define origin_32_width 32 +#define origin_32_height 32 +static char origin_32_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x03, 0x00, 0x10, 0x00, 0x03, + 0x00, 0x08, 0x00, 0x03, 0x00, 0x10, 0x00, 0x03, 0x00, 0x08, 0x00, 0x03, + 0x00, 0x10, 0x00, 0x03, 0x00, 0x08, 0x00, 0x03, 0x00, 0x10, 0x00, 0x03, + 0x00, 0x08, 0x00, 0x03, 0x00, 0x10, 0x00, 0x03, 0x00, 0x08, 0x00, 0x03, + 0x55, 0x55, 0x55, 0x17, 0xaa, 0xaa, 0xaa, 0x0b, 0x00, 0x10, 0x00, 0x03, + 0x00, 0x48, 0x00, 0x03, 0x00, 0x90, 0x01, 0x03, 0x00, 0x08, 0x22, 0x03, + 0x00, 0x10, 0x3c, 0x03, 0x00, 0x08, 0x70, 0x03, 0x00, 0x10, 0x78, 0x03, + 0x00, 0x08, 0x00, 0x03, 0xe0, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, + 0x00, 0x10, 0x00, 0x03, 0x00, 0x08, 0x00, 0x03, 0x00, 0x10, 0x00, 0x03, + 0x00, 0x08, 0x00, 0x03, 0x00, 0x10, 0x00, 0x03, 0x00, 0x08, 0x00, 0x03, + 0x00, 0x10, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00}; diff -Nru acm-5.0/src/gedit/xbm/origin_64.xbm acm-6.0+20200416/src/gedit/xbm/origin_64.xbm --- acm-5.0/src/gedit/xbm/origin_64.xbm 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/gedit/xbm/origin_64.xbm 2006-01-05 13:58:55.000000000 +0000 @@ -0,0 +1,46 @@ +#define origin_width 64 +#define origin_height 64 +static char origin_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, + 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x00, + 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x0e, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x80, 0x02, + 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x00, + 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x0e, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x80, 0x02, + 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x00, + 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x0e, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x80, 0x02, + 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x00, + 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x0e, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xae, 0x02, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x5f, 0x01, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xae, 0x02, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x0e, 0x00, + 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x80, 0xf2, + 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x0e, 0x00, + 0x00, 0x00, 0x80, 0x82, 0x07, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x0e, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x80, 0x02, 0x1c, 0x00, 0x0e, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x70, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x80, 0x02, + 0xe0, 0x10, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x13, 0x0e, 0x00, + 0x00, 0x00, 0x80, 0x02, 0x00, 0x3f, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x38, 0x0e, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x7e, 0x0e, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x7e, 0x0e, 0x00, 0x00, 0x00, 0x80, 0x02, + 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x00, + 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x7f, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x80, 0x02, + 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x00, + 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x0e, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x80, 0x02, + 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x00, + 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x0e, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x80, 0x02, + 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff -Nru acm-5.0/src/gedit/xbm/polygon_32.xbm acm-6.0+20200416/src/gedit/xbm/polygon_32.xbm --- acm-5.0/src/gedit/xbm/polygon_32.xbm 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/gedit/xbm/polygon_32.xbm 2006-01-05 13:58:55.000000000 +0000 @@ -0,0 +1,14 @@ +#define polygon_32_width 32 +#define polygon_32_height 32 +static char polygon_32_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, 0x3c, + 0x40, 0x03, 0x00, 0x12, 0x40, 0x04, 0x80, 0x11, 0x40, 0x08, 0x40, 0x10, + 0x20, 0x10, 0x30, 0x10, 0x20, 0x60, 0x08, 0x20, 0x20, 0x80, 0x07, 0x20, + 0x20, 0x80, 0x03, 0x20, 0x20, 0x80, 0x03, 0x20, 0x20, 0x00, 0x00, 0x20, + 0x20, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x20, + 0x10, 0x00, 0x00, 0x20, 0x10, 0x00, 0x00, 0x20, 0x10, 0x00, 0x00, 0x20, + 0x38, 0x00, 0x00, 0x40, 0xf8, 0x00, 0x00, 0x40, 0x38, 0x3f, 0x00, 0x40, + 0x00, 0xc0, 0x1f, 0x40, 0x00, 0x00, 0xe0, 0xe7, 0x00, 0x00, 0x00, 0xf8, + 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff -Nru acm-5.0/src/gedit/xbm/polygon_64.xbm acm-6.0+20200416/src/gedit/xbm/polygon_64.xbm --- acm-5.0/src/gedit/xbm/polygon_64.xbm 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/gedit/xbm/polygon_64.xbm 2006-01-05 13:58:55.000000000 +0000 @@ -0,0 +1,46 @@ +#define polygon_width 64 +#define polygon_height 64 +static char polygon_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x07, 0x00, 0x7c, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0x07, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x07, + 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x07, 0x00, 0x7c, 0x00, 0x00, + 0x00, 0x00, 0xe0, 0x07, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x38, 0x03, + 0x00, 0xb8, 0x01, 0x00, 0x00, 0x00, 0x1c, 0x03, 0x00, 0x18, 0x07, 0x00, + 0x00, 0x00, 0x06, 0x03, 0x00, 0x18, 0x0e, 0x00, 0x00, 0x80, 0x03, 0x03, + 0x00, 0x18, 0x38, 0x00, 0x00, 0xc0, 0x01, 0x03, 0x00, 0x18, 0x70, 0x00, + 0x00, 0x70, 0x00, 0x06, 0x00, 0x18, 0xc0, 0x00, 0x00, 0x38, 0x00, 0x06, + 0x00, 0x1c, 0x80, 0x03, 0x00, 0x0e, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x07, + 0x00, 0x07, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x1c, 0x80, 0x01, 0x00, 0x06, + 0x00, 0x0c, 0x00, 0x38, 0xe0, 0x00, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x60, + 0x70, 0x00, 0x00, 0x06, 0x00, 0x0c, 0x00, 0xc0, 0x1f, 0x00, 0x00, 0x06, + 0x00, 0x0e, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x80, + 0x0f, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x06, + 0x00, 0x06, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0c, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, + 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0c, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, + 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x80, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0c, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, + 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x80, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0c, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, + 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xc0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0c, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, + 0xc0, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0xfc, 0x1f, 0x00, + 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0x00, 0x18, + 0x00, 0x00, 0xc0, 0xff, 0x01, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0xf0, + 0x7f, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x1f, 0x00, 0x18, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x07, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0xff, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x1f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff -Nru acm-5.0/src/gedit/xbm/zoom_in_32.xbm acm-6.0+20200416/src/gedit/xbm/zoom_in_32.xbm --- acm-5.0/src/gedit/xbm/zoom_in_32.xbm 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/gedit/xbm/zoom_in_32.xbm 2006-01-05 13:58:55.000000000 +0000 @@ -0,0 +1,14 @@ +#define zoom_in_32_width 32 +#define zoom_in_32_height 32 +static char zoom_in_32_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x07, + 0xf0, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0x0f, 0xe0, 0xff, 0xff, 0x0f, + 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xf8, 0x07, 0x00, 0x00, 0xfc, 0x01, + 0x00, 0x00, 0xff, 0x00, 0x00, 0x80, 0x7f, 0x00, 0x00, 0xc0, 0x3f, 0x00, + 0x00, 0xe0, 0x0f, 0x00, 0x00, 0xf0, 0x07, 0x00, 0x00, 0xfc, 0x01, 0x00, + 0x00, 0xff, 0x00, 0x00, 0x80, 0x7f, 0x00, 0x00, 0xc0, 0x1f, 0x00, 0x00, + 0xe0, 0x1f, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x07, 0xf0, 0xff, 0xff, 0x0f, + 0xf0, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0x07, + 0xe0, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff -Nru acm-5.0/src/gedit/xbm/zoom_in_64.xbm acm-6.0+20200416/src/gedit/xbm/zoom_in_64.xbm --- acm-5.0/src/gedit/xbm/zoom_in_64.xbm 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/gedit/xbm/zoom_in_64.xbm 2006-01-05 13:58:55.000000000 +0000 @@ -0,0 +1,46 @@ +#define zoom_in_width 64 +#define zoom_in_height 64 +static char zoom_in_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x80, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x3f, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, + 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x80, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x7f, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, + 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x7f, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x1f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x1f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xf0, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, + 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0x1f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xe0, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xfe, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0f, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, + 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x80, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x7f, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, + 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x80, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x7f, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, + 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x3f, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, + 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff -Nru acm-5.0/src/gedit/xbm/zoom_out_32.xbm acm-6.0+20200416/src/gedit/xbm/zoom_out_32.xbm --- acm-5.0/src/gedit/xbm/zoom_out_32.xbm 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/gedit/xbm/zoom_out_32.xbm 2006-01-05 13:58:55.000000000 +0000 @@ -0,0 +1,14 @@ +#define zoom_out_32_width 32 +#define zoom_out_32_height 32 +static char zoom_out_32_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x80, 0xff, 0x7f, 0x00, + 0x00, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x1e, 0x00, + 0x00, 0x80, 0x0f, 0x00, 0x00, 0xc0, 0x07, 0x00, 0x00, 0xe0, 0x01, 0x00, + 0x00, 0xf8, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, + 0x80, 0xff, 0x3f, 0x00, 0x80, 0xff, 0x7f, 0x00, 0x80, 0xff, 0x7f, 0x00, + 0x00, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff -Nru acm-5.0/src/gedit/xbm/zoom_out_64.xbm acm-6.0+20200416/src/gedit/xbm/zoom_out_64.xbm --- acm-5.0/src/gedit/xbm/zoom_out_64.xbm 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/gedit/xbm/zoom_out_64.xbm 2006-01-05 13:58:55.000000000 +0000 @@ -0,0 +1,46 @@ +#define zoom_out_width 64 +#define zoom_out_height 64 +static char zoom_out_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, + 0xff, 0x0f, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, + 0x00, 0xc0, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, + 0xff, 0x3f, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, + 0x00, 0x80, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x1f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfc, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfe, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, + 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x1f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xfc, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x1f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfc, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, + 0xff, 0x1f, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, + 0x00, 0xc0, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, + 0xff, 0x3f, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, + 0x00, 0x80, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/src/handleDn.bmp and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/src/handleDn.bmp differ diff -Nru acm-5.0/src/handleDn.xbm acm-6.0+20200416/src/handleDn.xbm --- acm-5.0/src/handleDn.xbm 1991-02-28 16:56:42.000000000 +0000 +++ acm-6.0+20200416/src/handleDn.xbm 1970-01-01 00:00:00.000000000 +0000 @@ -1,28 +0,0 @@ -#define handleDn_width 32 -#define handleDn_height 75 -static char handleDn_bits[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, - 0x00, 0x2f, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, - 0x00, 0x2d, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, - 0x00, 0x2d, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, - 0x00, 0x21, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x0f, 0x00, 0xfc, 0xff, 0x1f, 0x00, - 0xfe, 0xff, 0x3f, 0x00, 0xf6, 0xff, 0x37, 0x00, 0xf6, 0xff, 0x37, 0x00, - 0xf6, 0xff, 0x37, 0x00, 0xf6, 0xff, 0x37, 0x00, 0xf6, 0xff, 0x37, 0x00, - 0xf6, 0xff, 0x37, 0x00, 0xf6, 0xff, 0x37, 0x00, 0xf6, 0xff, 0x37, 0x00, - 0xf6, 0xff, 0x37, 0x00, 0xf6, 0xff, 0x37, 0x00, 0xf6, 0xff, 0x37, 0x00, - 0xf6, 0xff, 0x37, 0x00, 0xf6, 0xff, 0x37, 0x00, 0xf6, 0xff, 0x37, 0x00, - 0xf6, 0xff, 0x37, 0x00, 0xf6, 0xff, 0x37, 0x00, 0xf6, 0xff, 0x27, 0x00, - 0xf6, 0xff, 0x27, 0x00, 0xb6, 0xff, 0x36, 0x00, 0x92, 0x9b, 0x36, 0x00, - 0xf2, 0xcb, 0x22, 0x00, 0xb2, 0x89, 0x22, 0x00, 0x52, 0x69, 0x23, 0x00, - 0x52, 0x5b, 0x22, 0x00, 0x52, 0x59, 0x26, 0x00, 0x52, 0x58, 0x26, 0x00, - 0x52, 0x74, 0x27, 0x00, 0x52, 0x57, 0x27, 0x00, 0x5e, 0x00, 0x3d, 0x00, - 0x3c, 0x00, 0x1c, 0x00, 0xf8, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00}; Binary files /tmp/tmpznRzzm/xT9A4e9WsH/acm-5.0/src/handleUp.bmp and /tmp/tmpznRzzm/ZjiYAZeoV8/acm-6.0+20200416/src/handleUp.bmp differ diff -Nru acm-5.0/src/handleUp.xbm acm-6.0+20200416/src/handleUp.xbm --- acm-5.0/src/handleUp.xbm 1991-02-28 16:55:22.000000000 +0000 +++ acm-6.0+20200416/src/handleUp.xbm 1970-01-01 00:00:00.000000000 +0000 @@ -1,28 +0,0 @@ -#define handleUp_width 32 -#define handleUp_height 75 -static char handleUp_bits[] = { - 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x0f, 0x00, 0xfc, 0xff, 0x1f, 0x00, - 0xfe, 0xff, 0x3f, 0x00, 0xf6, 0xff, 0x37, 0x00, 0xf6, 0xff, 0x37, 0x00, - 0xf6, 0xff, 0x37, 0x00, 0xf6, 0xff, 0x37, 0x00, 0xf6, 0xff, 0x37, 0x00, - 0xf6, 0xff, 0x37, 0x00, 0xf6, 0xff, 0x37, 0x00, 0xf6, 0xff, 0x37, 0x00, - 0xf6, 0xff, 0x37, 0x00, 0xf6, 0xff, 0x37, 0x00, 0xf6, 0xff, 0x37, 0x00, - 0xf6, 0xff, 0x37, 0x00, 0xf6, 0xff, 0x37, 0x00, 0xf6, 0xff, 0x37, 0x00, - 0xf2, 0xff, 0x37, 0x00, 0xf2, 0xff, 0x35, 0x00, 0xd6, 0xbf, 0x37, 0x00, - 0xd6, 0xaf, 0x37, 0x00, 0x56, 0xbf, 0x27, 0x00, 0x56, 0xb7, 0x26, 0x00, - 0x52, 0xd6, 0x26, 0x00, 0x52, 0xd6, 0x25, 0x00, 0x52, 0xf5, 0x25, 0x00, - 0x92, 0x55, 0x25, 0x00, 0x92, 0x4d, 0x25, 0x00, 0x92, 0x41, 0x25, 0x00, - 0x12, 0x44, 0x25, 0x00, 0x12, 0x01, 0x24, 0x00, 0x5e, 0x00, 0x3c, 0x00, - 0x1c, 0x00, 0x1c, 0x00, 0xf8, 0xff, 0x0f, 0x00, 0x00, 0x2d, 0x00, 0x00, - 0x00, 0x21, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff -Nru acm-5.0/src/horizon.h acm-6.0+20200416/src/horizon.h --- acm-5.0/src/horizon.h 1998-05-12 03:43:03.000000000 +0000 +++ acm-6.0+20200416/src/horizon.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,1332 +0,0 @@ -/* - * This file created by horizon.c - */ -#include -VGlyphPath horizon_path[] = -{ - {2, 0}, - {2, 2}, - {3, 4}, - {3, 7}, - {2, 10}, - {2, 12}, - {2, 14}, - {2, 16}, - {2, 18}, - {2, 20}, - {2, 22}, - {2, 24}, - {4, 26}, - {17, 30}, - {17, 47}, - {4, 64}, - {4, 68}, - {17, 72}, - {17, 89}, - {4, 106}, - {3, 110}, - {3, 113}, - {2, 116}, - {2, 118}, - {2, 120}, - {2, 122}, - {2, 124}, - {2, 126}, - {2, 128}, - {2, 130}, - {14, 132}, - {17, 146}, - {17, 163}, - {14, 180}, - {14, 194}, - {17, 208}, - {17, 225}, - {14, 242}, - {3, 256}, - {3, 259}, - {2, 262}, - {2, 264}, - {2, 266}, - {2, 268}, - {2, 270}, - {2, 272}, - {2, 274}, - {2, 276}, - {15, 278}, - {17, 293}, - {17, 310}, - {15, 327}, - {15, 342}, - {17, 357}, - {17, 374}, - {15, 391}, - {3, 406}, - {3, 409}, - {2, 412}, - {2, 414}, - {2, 416}, - {2, 418}, - {2, 420}, - {2, 422}, - {2, 424}, - {2, 426}, - {3, 428}, - {2, 431}, - {17, 433}, - {17, 450}, - {3, 467}, - {2, 470}, - {3, 472}, - {2, 475}, - {17, 477}, - {17, 494}, - {3, 511}, - {2, 514}, - {3, 516}, - {3, 519}, - {2, 522}, - {2, 524}, - {2, 526}, - {2, 528}, - {2, 530}, - {2, 532}, - {2, 534}, - {2, 536}, - {17, 538}, - {17, 555}, - {17, 572}, - {17, 589}, - {17, 606}, - {17, 623}, - {17, 640}, - {17, 657}, - {3, 674}, - {3, 677}, - {2, 680}, - {2, 682}, - {2, 684}, - {2, 686}, - {2, 688}, - {2, 690}, - {2, 692}, - {2, 694}, - {23, 696}, - {17, 719}, - {17, 736}, - {23, 753}, - {23, 776}, - {17, 799}, - {17, 816}, - {23, 833}, - {3, 856}, - {3, 859}, - {2, 862}, - {2, 864}, - {2, 866}, - {2, 868}, - {2, 870}, - {2, 872}, - {2, 874}, - {2, 876}, - {2, 878}, - {2, 880}, - {17, 882}, - {17, 899}, - {2, 916}, - {2, 918}, - {2, 920}, - {2, 922}, - {17, 924}, - {17, 941}, - {2, 958}, - {2, 960}, - {3, 962}, - {3, 965}, - {2, 968}, - {2, 970}, - {2, 972}, - {2, 974}, - {2, 976}, - {2, 978}, - {2, 980}, - {2, 982}, - {29, 984}, - {17, 1013}, - {17, 1030}, - {29, 1047}, - {29, 1076}, - {17, 1105}, - {17, 1122}, - {29, 1139}, -}; -VGlyphVertex3 horizon_vertex[] = -{ - {4090, -214, 0}, - {4096, -1021, 0}, - {4090, 214, 0}, - {4096, 1021, 0}, - {4028, -214, 710}, - {3970, -712, 711}, - {3988, -712, 610}, - {4028, 214, 710}, - {3970, 712, 711}, - {3988, 712, 610}, - {4028, -214, -710}, - {4013, -343, -710}, - {4006, -398, -710}, - {3991, -528, -710}, - {3985, -583, -711}, - {3970, -712, -711}, - {3970, -712, -711}, - {3988, -712, -610}, - {4028, 214, -710}, - {4013, 343, -710}, - {4006, 398, -710}, - {3991, 528, -710}, - {3985, 583, -711}, - {3970, 712, -711}, - {3970, 712, -711}, - {3988, 712, -610}, - {4019, 835, 792}, - {4018, 845, 797}, - {4015, 860, 812}, - {4033, 860, 711}, - {4015, 950, 812}, - {4016, 935, 807}, - {4019, 926, 792}, - {4023, 921, 768}, - {4026, 921, 754}, - {4030, 926, 730}, - {4032, 935, 716}, - {4033, 950, 711}, - {4033, 960, 711}, - {4032, 974, 716}, - {4030, 984, 730}, - {4026, 989, 754}, - {4023, 989, 768}, - {4019, 984, 792}, - {4016, 974, 807}, - {4015, 960, 812}, - {4015, 950, 812}, - {4015, -852, 812}, - {4016, -867, 807}, - {4019, -877, 792}, - {4023, -882, 768}, - {4026, -882, 754}, - {4030, -877, 730}, - {4032, -867, 716}, - {4033, -852, 711}, - {4033, -843, 711}, - {4032, -828, 716}, - {4030, -818, 730}, - {4026, -813, 754}, - {4023, -813, 768}, - {4019, -818, 792}, - {4016, -828, 807}, - {4015, -843, 812}, - {4015, -852, 812}, - {4019, -967, 792}, - {4018, -957, 797}, - {4015, -943, 812}, - {4033, -943, 711}, - {4048, 835, -629}, - {4049, 845, -624}, - {4051, 860, -610}, - {4033, 860, -711}, - {4051, 950, -610}, - {4050, 935, -615}, - {4048, 926, -629}, - {4043, 921, -653}, - {4041, 921, -668}, - {4037, 926, -692}, - {4034, 935, -706}, - {4033, 950, -711}, - {4033, 960, -711}, - {4034, 974, -706}, - {4037, 984, -692}, - {4041, 989, -668}, - {4043, 989, -653}, - {4048, 984, -629}, - {4050, 974, -615}, - {4051, 960, -610}, - {4051, 950, -610}, - {4051, -852, -610}, - {4050, -867, -615}, - {4048, -877, -629}, - {4043, -882, -653}, - {4041, -882, -668}, - {4037, -877, -692}, - {4034, -867, -706}, - {4033, -852, -711}, - {4033, -843, -711}, - {4034, -828, -706}, - {4037, -818, -692}, - {4041, -813, -668}, - {4043, -813, -653}, - {4048, -818, -629}, - {4050, -828, -615}, - {4051, -843, -610}, - {4051, -852, -610}, - {4048, -967, -629}, - {4049, -957, -624}, - {4051, -943, -610}, - {4033, -943, -711}, - {3843, -214, 1398}, - {3781, -716, 1400}, - {3817, -716, 1304}, - {3843, 214, 1398}, - {3781, 716, 1400}, - {3817, 716, 1304}, - {3843, -214, -1398}, - {3827, -344, -1399}, - {3820, -400, -1399}, - {3804, -530, -1400}, - {3797, -585, -1400}, - {3781, -716, -1400}, - {3781, -716, -1400}, - {3817, -716, -1304}, - {3843, 214, -1398}, - {3827, 344, -1399}, - {3820, 400, -1399}, - {3804, 530, -1400}, - {3797, 585, -1400}, - {3781, 716, -1400}, - {3781, 716, -1400}, - {3817, 716, -1304}, - {3822, 822, 1474}, - {3820, 822, 1478}, - {3817, 827, 1487}, - {3815, 832, 1492}, - {3813, 841, 1497}, - {3813, 861, 1497}, - {3815, 871, 1492}, - {3817, 875, 1487}, - {3820, 880, 1478}, - {3823, 880, 1469}, - {3827, 875, 1460}, - {3832, 866, 1446}, - {3848, 817, 1400}, - {3848, 885, 1400}, - {3813, 953, 1497}, - {3815, 939, 1492}, - {3820, 929, 1478}, - {3828, 924, 1455}, - {3833, 924, 1442}, - {3842, 929, 1419}, - {3847, 939, 1405}, - {3848, 953, 1400}, - {3848, 963, 1400}, - {3847, 978, 1405}, - {3842, 988, 1419}, - {3833, 992, 1442}, - {3828, 992, 1455}, - {3820, 988, 1478}, - {3815, 978, 1492}, - {3813, 963, 1497}, - {3813, 953, 1497}, - {3813, -856, 1497}, - {3815, -871, 1492}, - {3820, -880, 1478}, - {3828, -885, 1455}, - {3833, -885, 1442}, - {3842, -880, 1419}, - {3847, -871, 1405}, - {3848, -856, 1400}, - {3848, -846, 1400}, - {3847, -832, 1405}, - {3842, -822, 1419}, - {3833, -817, 1442}, - {3828, -817, 1455}, - {3820, -822, 1478}, - {3815, -832, 1492}, - {3813, -846, 1497}, - {3813, -856, 1497}, - {3822, -988, 1474}, - {3820, -988, 1478}, - {3817, -983, 1487}, - {3815, -978, 1492}, - {3813, -968, 1497}, - {3813, -949, 1497}, - {3815, -939, 1492}, - {3817, -934, 1487}, - {3820, -929, 1478}, - {3823, -929, 1469}, - {3827, -934, 1460}, - {3832, -944, 1446}, - {3848, -992, 1400}, - {3848, -924, 1400}, - {3875, 822, -1327}, - {3877, 822, -1323}, - {3880, 827, -1313}, - {3882, 832, -1309}, - {3884, 841, -1304}, - {3884, 861, -1304}, - {3882, 871, -1309}, - {3880, 875, -1313}, - {3877, 880, -1323}, - {3873, 880, -1332}, - {3870, 875, -1341}, - {3865, 866, -1355}, - {3848, 817, -1400}, - {3848, 885, -1400}, - {3884, 953, -1304}, - {3882, 939, -1309}, - {3877, 929, -1323}, - {3868, 924, -1345}, - {3863, 924, -1359}, - {3855, 929, -1382}, - {3850, 939, -1396}, - {3848, 953, -1400}, - {3848, 963, -1400}, - {3850, 978, -1396}, - {3855, 988, -1382}, - {3863, 992, -1359}, - {3868, 992, -1345}, - {3877, 988, -1323}, - {3882, 978, -1309}, - {3884, 963, -1304}, - {3884, 953, -1304}, - {3884, -856, -1304}, - {3882, -871, -1309}, - {3877, -880, -1323}, - {3868, -885, -1345}, - {3863, -885, -1359}, - {3855, -880, -1382}, - {3850, -871, -1396}, - {3848, -856, -1400}, - {3848, -846, -1400}, - {3850, -832, -1396}, - {3855, -822, -1382}, - {3863, -817, -1359}, - {3868, -817, -1345}, - {3877, -822, -1323}, - {3882, -832, -1309}, - {3884, -846, -1304}, - {3884, -856, -1304}, - {3875, -988, -1327}, - {3877, -988, -1323}, - {3880, -983, -1313}, - {3882, -978, -1309}, - {3884, -968, -1304}, - {3884, -949, -1304}, - {3882, -939, -1309}, - {3880, -934, -1313}, - {3877, -929, -1323}, - {3873, -929, -1332}, - {3870, -934, -1341}, - {3865, -944, -1355}, - {3848, -992, -1400}, - {3848, -924, -1400}, - {3542, -214, 2045}, - {3473, -721, 2047}, - {3525, -721, 1959}, - {3542, 214, 2045}, - {3473, 721, 2047}, - {3525, 721, 1959}, - {3542, -214, -2045}, - {3524, -345, -2045}, - {3516, -402, -2046}, - {3498, -533, -2046}, - {3491, -589, -2047}, - {3473, -721, -2047}, - {3473, -721, -2047}, - {3525, -721, -1959}, - {3542, 214, -2045}, - {3524, 345, -2045}, - {3516, 402, -2046}, - {3498, 533, -2046}, - {3491, 589, -2047}, - {3473, 721, -2047}, - {3473, 721, -2047}, - {3525, 721, -1959}, - {3496, 832, 2136}, - {3496, 885, 2136}, - {3515, 856, 2102}, - {3515, 871, 2102}, - {3517, 881, 2098}, - {3520, 885, 2094}, - {3527, 890, 2081}, - {3532, 890, 2073}, - {3539, 885, 2060}, - {3544, 876, 2052}, - {3547, 861, 2047}, - {3547, 846, 2047}, - {3544, 832, 2052}, - {3542, 827, 2056}, - {3537, 822, 2064}, - {3496, 959, 2136}, - {3498, 944, 2132}, - {3505, 934, 2119}, - {3517, 929, 2098}, - {3525, 929, 2086}, - {3537, 934, 2064}, - {3544, 944, 2052}, - {3547, 959, 2047}, - {3547, 968, 2047}, - {3544, 983, 2052}, - {3537, 993, 2064}, - {3525, 998, 2086}, - {3517, 998, 2098}, - {3505, 993, 2119}, - {3498, 983, 2132}, - {3496, 968, 2136}, - {3496, 959, 2136}, - {3496, -861, 2136}, - {3498, -876, 2132}, - {3505, -885, 2119}, - {3517, -890, 2098}, - {3525, -890, 2086}, - {3537, -885, 2064}, - {3544, -876, 2052}, - {3547, -861, 2047}, - {3547, -851, 2047}, - {3544, -837, 2052}, - {3537, -827, 2064}, - {3525, -822, 2086}, - {3517, -822, 2098}, - {3505, -827, 2119}, - {3498, -837, 2132}, - {3496, -851, 2136}, - {3496, -861, 2136}, - {3496, -988, 2136}, - {3496, -934, 2136}, - {3515, -963, 2102}, - {3515, -949, 2102}, - {3517, -939, 2098}, - {3520, -934, 2094}, - {3527, -929, 2081}, - {3532, -929, 2073}, - {3539, -934, 2060}, - {3544, -944, 2052}, - {3547, -959, 2047}, - {3547, -973, 2047}, - {3544, -988, 2052}, - {3542, -993, 2056}, - {3537, -998, 2064}, - {3598, 832, -1959}, - {3598, 885, -1959}, - {3578, 856, -1993}, - {3578, 871, -1993}, - {3576, 881, -1997}, - {3574, 885, -2001}, - {3566, 890, -2014}, - {3561, 890, -2022}, - {3554, 885, -2035}, - {3549, 876, -2043}, - {3547, 861, -2047}, - {3547, 846, -2047}, - {3549, 832, -2043}, - {3552, 827, -2039}, - {3556, 822, -2031}, - {3598, 959, -1959}, - {3596, 944, -1963}, - {3588, 934, -1976}, - {3576, 929, -1997}, - {3569, 929, -2009}, - {3556, 934, -2031}, - {3549, 944, -2043}, - {3547, 959, -2047}, - {3547, 968, -2047}, - {3549, 983, -2043}, - {3556, 993, -2031}, - {3569, 998, -2009}, - {3576, 998, -1997}, - {3588, 993, -1976}, - {3596, 983, -1963}, - {3598, 968, -1959}, - {3598, 959, -1959}, - {3598, -861, -1959}, - {3596, -876, -1963}, - {3588, -885, -1976}, - {3576, -890, -1997}, - {3569, -890, -2009}, - {3556, -885, -2031}, - {3549, -876, -2043}, - {3547, -861, -2047}, - {3547, -851, -2047}, - {3549, -837, -2043}, - {3556, -827, -2031}, - {3569, -822, -2009}, - {3576, -822, -1997}, - {3588, -827, -1976}, - {3596, -837, -1963}, - {3598, -851, -1959}, - {3598, -861, -1959}, - {3598, -988, -1959}, - {3598, -934, -1959}, - {3578, -963, -1993}, - {3578, -949, -1993}, - {3576, -939, -1997}, - {3574, -934, -2001}, - {3566, -929, -2014}, - {3561, -929, -2022}, - {3554, -934, -2035}, - {3549, -944, -2043}, - {3547, -959, -2047}, - {3547, -973, -2047}, - {3549, -988, -2043}, - {3552, -993, -2039}, - {3556, -998, -2031}, - {3133, -214, 2629}, - {3052, -726, 2632}, - {3119, -726, 2555}, - {3133, 214, 2629}, - {3052, 726, 2632}, - {3119, 726, 2555}, - {3133, -214, -2629}, - {3112, -347, -2630}, - {3103, -404, -2630}, - {3082, -536, -2631}, - {3073, -593, -2631}, - {3052, -726, -2632}, - {3052, -726, -2632}, - {3119, -726, -2555}, - {3133, 214, -2629}, - {3112, 347, -2630}, - {3103, 404, -2630}, - {3082, 536, -2631}, - {3073, 593, -2631}, - {3052, 726, -2632}, - {3052, 726, -2632}, - {3119, 726, -2555}, - {3071, 874, 2711}, - {3115, 825, 2659}, - {3115, 898, 2659}, - {3071, 874, 2711}, - {3137, 874, 2632}, - {3071, 964, 2711}, - {3075, 950, 2707}, - {3084, 940, 2696}, - {3100, 935, 2677}, - {3109, 935, 2666}, - {3125, 940, 2647}, - {3134, 950, 2636}, - {3137, 964, 2632}, - {3137, 974, 2632}, - {3134, 989, 2636}, - {3125, 998, 2647}, - {3109, 1003, 2666}, - {3100, 1003, 2677}, - {3084, 998, 2696}, - {3075, 989, 2707}, - {3071, 974, 2711}, - {3071, 964, 2711}, - {3071, -867, 2711}, - {3075, -881, 2707}, - {3084, -891, 2696}, - {3100, -896, 2677}, - {3109, -896, 2666}, - {3125, -891, 2647}, - {3134, -881, 2636}, - {3137, -867, 2632}, - {3137, -857, 2632}, - {3134, -842, 2636}, - {3125, -833, 2647}, - {3109, -828, 2666}, - {3100, -828, 2677}, - {3084, -833, 2696}, - {3075, -842, 2707}, - {3071, -857, 2711}, - {3071, -867, 2711}, - {3071, -957, 2711}, - {3115, -1006, 2659}, - {3115, -933, 2659}, - {3071, -957, 2711}, - {3137, -957, 2632}, - {3203, 874, -2554}, - {3159, 825, -2606}, - {3159, 898, -2606}, - {3203, 874, -2554}, - {3137, 874, -2632}, - {3203, 964, -2554}, - {3200, 950, -2558}, - {3190, 940, -2569}, - {3175, 935, -2588}, - {3165, 935, -2599}, - {3150, 940, -2617}, - {3140, 950, -2629}, - {3137, 964, -2632}, - {3137, 974, -2632}, - {3140, 989, -2629}, - {3150, 998, -2617}, - {3165, 1003, -2599}, - {3175, 1003, -2588}, - {3190, 998, -2569}, - {3200, 989, -2558}, - {3203, 974, -2554}, - {3203, 964, -2554}, - {3203, -867, -2554}, - {3200, -881, -2558}, - {3190, -891, -2569}, - {3175, -896, -2588}, - {3165, -896, -2599}, - {3150, -891, -2617}, - {3140, -881, -2629}, - {3137, -867, -2632}, - {3137, -857, -2632}, - {3140, -842, -2629}, - {3150, -833, -2617}, - {3165, -828, -2599}, - {3175, -828, -2588}, - {3190, -833, -2569}, - {3200, -842, -2558}, - {3203, -857, -2554}, - {3203, -867, -2554}, - {3203, -957, -2554}, - {3159, -1006, -2606}, - {3159, -933, -2606}, - {3203, -957, -2554}, - {3137, -957, -2632}, - {2629, -214, 3133}, - {2529, -731, 3137}, - {2609, -731, 3073}, - {2629, 214, 3133}, - {2529, 731, 3137}, - {2609, 731, 3073}, - {2629, -214, -3133}, - {2603, -348, -3134}, - {2592, -405, -3135}, - {2566, -539, -3136}, - {2555, -597, -3136}, - {2529, -731, -3137}, - {2529, -731, -3137}, - {2609, -731, -3073}, - {2629, 214, -3133}, - {2603, 348, -3134}, - {2592, 405, -3135}, - {2566, 539, -3136}, - {2555, 597, -3136}, - {2529, 731, -3137}, - {2529, 731, -3137}, - {2609, 731, -3073}, - {2554, 891, 3203}, - {2554, 842, 3203}, - {2588, 837, 3175}, - {2584, 842, 3178}, - {2580, 856, 3181}, - {2580, 871, 3181}, - {2584, 886, 3178}, - {2591, 895, 3172}, - {2602, 900, 3162}, - {2610, 900, 3156}, - {2621, 895, 3147}, - {2629, 886, 3140}, - {2632, 871, 3137}, - {2632, 856, 3137}, - {2629, 842, 3140}, - {2625, 837, 3143}, - {2617, 832, 3150}, - {2554, 969, 3203}, - {2558, 954, 3200}, - {2569, 944, 3190}, - {2588, 939, 3175}, - {2599, 939, 3165}, - {2617, 944, 3150}, - {2629, 954, 3140}, - {2632, 969, 3137}, - {2632, 978, 3137}, - {2629, 993, 3140}, - {2617, 1003, 3150}, - {2599, 1008, 3165}, - {2588, 1008, 3175}, - {2569, 1003, 3190}, - {2558, 993, 3200}, - {2554, 978, 3203}, - {2554, 969, 3203}, - {2554, -871, 3203}, - {2558, -886, 3200}, - {2569, -895, 3190}, - {2588, -900, 3175}, - {2599, -900, 3165}, - {2617, -895, 3150}, - {2629, -886, 3140}, - {2632, -871, 3137}, - {2632, -861, 3137}, - {2629, -847, 3140}, - {2617, -837, 3150}, - {2599, -832, 3165}, - {2588, -832, 3175}, - {2569, -837, 3190}, - {2558, -847, 3200}, - {2554, -861, 3203}, - {2554, -871, 3203}, - {2554, -949, 3203}, - {2554, -998, 3203}, - {2588, -1003, 3175}, - {2584, -998, 3178}, - {2580, -983, 3181}, - {2580, -969, 3181}, - {2584, -954, 3178}, - {2591, -944, 3172}, - {2602, -939, 3162}, - {2610, -939, 3156}, - {2621, -944, 3147}, - {2629, -954, 3140}, - {2632, -969, 3137}, - {2632, -983, 3137}, - {2629, -998, 3140}, - {2625, -1003, 3143}, - {2617, -1008, 3150}, - {2711, 891, -3071}, - {2711, 842, -3071}, - {2677, 837, -3100}, - {2681, 842, -3096}, - {2685, 856, -3093}, - {2685, 871, -3093}, - {2681, 886, -3096}, - {2673, 895, -3103}, - {2662, 900, -3112}, - {2655, 900, -3118}, - {2644, 895, -3128}, - {2636, 886, -3134}, - {2632, 871, -3137}, - {2632, 856, -3137}, - {2636, 842, -3134}, - {2640, 837, -3131}, - {2647, 832, -3125}, - {2711, 969, -3071}, - {2707, 954, -3075}, - {2696, 944, -3084}, - {2677, 939, -3100}, - {2666, 939, -3109}, - {2647, 944, -3125}, - {2636, 954, -3134}, - {2632, 969, -3137}, - {2632, 978, -3137}, - {2636, 993, -3134}, - {2647, 1003, -3125}, - {2666, 1008, -3109}, - {2677, 1008, -3100}, - {2696, 1003, -3084}, - {2707, 993, -3075}, - {2711, 978, -3071}, - {2711, 969, -3071}, - {2711, -871, -3071}, - {2707, -886, -3075}, - {2696, -895, -3084}, - {2677, -900, -3100}, - {2666, -900, -3109}, - {2647, -895, -3125}, - {2636, -886, -3134}, - {2632, -871, -3137}, - {2632, -861, -3137}, - {2636, -847, -3134}, - {2647, -837, -3125}, - {2666, -832, -3109}, - {2677, -832, -3100}, - {2696, -837, -3084}, - {2707, -847, -3075}, - {2711, -861, -3071}, - {2711, -871, -3071}, - {2711, -949, -3071}, - {2711, -998, -3071}, - {2677, -1003, -3100}, - {2681, -998, -3096}, - {2685, -983, -3093}, - {2685, -969, -3093}, - {2681, -954, -3096}, - {2673, -944, -3103}, - {2662, -939, -3112}, - {2655, -939, -3118}, - {2644, -944, -3128}, - {2636, -954, -3134}, - {2632, -969, -3137}, - {2632, -983, -3137}, - {2636, -998, -3134}, - {2640, -1003, -3131}, - {2647, -1008, -3125}, - {2045, -214, 3542}, - {1913, -731, 3547}, - {2003, -731, 3498}, - {2045, 214, 3542}, - {1913, 731, 3547}, - {2003, 731, 3498}, - {2045, -214, -3542}, - {2010, -348, -3543}, - {1996, -405, -3544}, - {1961, -539, -3545}, - {1947, -597, -3545}, - {1913, -731, -3547}, - {1913, -731, -3547}, - {2003, -731, -3498}, - {2045, 214, -3542}, - {2010, 348, -3543}, - {1996, 405, -3544}, - {1961, 539, -3545}, - {1947, 597, -3545}, - {1913, 731, -3547}, - {1913, 731, -3547}, - {2003, 731, -3498}, - {1971, 893, 3591}, - {1963, 888, 3596}, - {1959, 874, 3598}, - {1959, 864, 3598}, - {1963, 849, 3596}, - {1976, 839, 3588}, - {1997, 835, 3576}, - {2018, 835, 3564}, - {2035, 839, 3554}, - {2043, 849, 3549}, - {2048, 864, 3547}, - {2048, 869, 3547}, - {2043, 883, 3549}, - {2035, 893, 3554}, - {2022, 898, 3561}, - {2018, 898, 3564}, - {2005, 893, 3571}, - {1997, 883, 3576}, - {1993, 869, 3578}, - {1993, 864, 3578}, - {1997, 849, 3576}, - {2005, 839, 3571}, - {2018, 835, 3564}, - {1959, 969, 3598}, - {1963, 954, 3596}, - {1976, 944, 3588}, - {1997, 939, 3576}, - {2009, 939, 3569}, - {2031, 944, 3556}, - {2043, 954, 3549}, - {2048, 969, 3547}, - {2048, 978, 3547}, - {2043, 993, 3549}, - {2031, 1003, 3556}, - {2009, 1008, 3569}, - {1997, 1008, 3576}, - {1976, 1003, 3588}, - {1963, 993, 3596}, - {1959, 978, 3598}, - {1959, 969, 3598}, - {1959, -871, 3598}, - {1963, -886, 3596}, - {1976, -896, 3588}, - {1997, -900, 3576}, - {2009, -900, 3569}, - {2031, -896, 3556}, - {2043, -886, 3549}, - {2048, -871, 3547}, - {2048, -861, 3547}, - {2043, -847, 3549}, - {2031, -837, 3556}, - {2009, -832, 3569}, - {1997, -832, 3576}, - {1976, -837, 3588}, - {1963, -847, 3596}, - {1959, -861, 3598}, - {1959, -871, 3598}, - {1971, -947, 3591}, - {1963, -952, 3596}, - {1959, -966, 3598}, - {1959, -976, 3598}, - {1963, -991, 3596}, - {1976, -1000, 3588}, - {1997, -1005, 3576}, - {2018, -1005, 3564}, - {2035, -1000, 3554}, - {2043, -991, 3549}, - {2048, -976, 3547}, - {2048, -971, 3547}, - {2043, -956, 3549}, - {2035, -947, 3554}, - {2022, -942, 3561}, - {2018, -942, 3564}, - {2005, -947, 3571}, - {1997, -956, 3576}, - {1993, -971, 3578}, - {1993, -976, 3578}, - {1997, -991, 3576}, - {2005, -1000, 3571}, - {2018, -1005, 3564}, - {2124, 893, -3503}, - {2132, 888, -3498}, - {2136, 874, -3496}, - {2136, 864, -3496}, - {2132, 849, -3498}, - {2119, 839, -3505}, - {2098, 835, -3517}, - {2077, 835, -3530}, - {2060, 839, -3539}, - {2052, 849, -3544}, - {2048, 864, -3547}, - {2048, 869, -3547}, - {2052, 883, -3544}, - {2060, 893, -3539}, - {2073, 898, -3532}, - {2077, 898, -3530}, - {2090, 893, -3522}, - {2098, 883, -3517}, - {2102, 869, -3515}, - {2102, 864, -3515}, - {2098, 849, -3517}, - {2090, 839, -3522}, - {2077, 835, -3530}, - {2136, 969, -3496}, - {2132, 954, -3498}, - {2119, 944, -3505}, - {2098, 939, -3517}, - {2086, 939, -3525}, - {2064, 944, -3537}, - {2052, 954, -3544}, - {2048, 969, -3547}, - {2048, 978, -3547}, - {2052, 993, -3544}, - {2064, 1003, -3537}, - {2086, 1008, -3525}, - {2098, 1008, -3517}, - {2119, 1003, -3505}, - {2132, 993, -3498}, - {2136, 978, -3496}, - {2136, 969, -3496}, - {2136, -871, -3496}, - {2132, -886, -3498}, - {2119, -896, -3505}, - {2098, -900, -3517}, - {2086, -900, -3525}, - {2064, -896, -3537}, - {2052, -886, -3544}, - {2048, -871, -3547}, - {2048, -861, -3547}, - {2052, -847, -3544}, - {2064, -837, -3537}, - {2086, -832, -3525}, - {2098, -832, -3517}, - {2119, -837, -3505}, - {2132, -847, -3498}, - {2136, -861, -3496}, - {2136, -871, -3496}, - {2124, -947, -3503}, - {2132, -952, -3498}, - {2136, -966, -3496}, - {2136, -976, -3496}, - {2132, -991, -3498}, - {2119, -1000, -3505}, - {2098, -1005, -3517}, - {2077, -1005, -3530}, - {2060, -1000, -3539}, - {2052, -991, -3544}, - {2048, -976, -3547}, - {2048, -971, -3547}, - {2052, -956, -3544}, - {2060, -947, -3539}, - {2073, -942, -3532}, - {2077, -942, -3530}, - {2090, -947, -3522}, - {2098, -956, -3517}, - {2102, -971, -3515}, - {2102, -976, -3515}, - {2098, -991, -3517}, - {2090, -1000, -3522}, - {2077, -1005, -3530}, - {1398, -214, 3843}, - {1203, -716, 3848}, - {1301, -716, 3818}, - {1398, 214, 3843}, - {1203, 716, 3848}, - {1301, 716, 3818}, - {1398, -214, -3843}, - {1348, -344, -3845}, - {1326, -400, -3845}, - {1275, -530, -3847}, - {1254, -586, -3847}, - {1203, -716, -3848}, - {1203, -716, -3848}, - {1301, -716, -3818}, - {1398, 214, -3843}, - {1348, 344, -3845}, - {1326, 400, -3845}, - {1275, 530, -3847}, - {1254, 586, -3847}, - {1203, 716, -3848}, - {1203, 716, -3848}, - {1301, 716, -3818}, - {1304, 886, 3884}, - {1400, 837, 3848}, - {1304, 818, 3884}, - {1304, 886, 3884}, - {1304, 954, 3884}, - {1309, 940, 3882}, - {1323, 930, 3877}, - {1345, 925, 3868}, - {1359, 925, 3863}, - {1382, 930, 3855}, - {1396, 940, 3850}, - {1400, 954, 3848}, - {1400, 964, 3848}, - {1396, 979, 3850}, - {1382, 988, 3855}, - {1359, 993, 3863}, - {1345, 993, 3868}, - {1323, 988, 3877}, - {1309, 979, 3882}, - {1304, 964, 3884}, - {1304, 954, 3884}, - {1304, -857, 3884}, - {1309, -871, 3882}, - {1323, -881, 3877}, - {1345, -886, 3868}, - {1359, -886, 3863}, - {1382, -881, 3855}, - {1396, -871, 3850}, - {1400, -857, 3848}, - {1400, -847, 3848}, - {1396, -832, 3850}, - {1382, -823, 3855}, - {1359, -818, 3863}, - {1345, -818, 3868}, - {1323, -823, 3877}, - {1309, -832, 3882}, - {1304, -847, 3884}, - {1304, -857, 3884}, - {1304, -925, 3884}, - {1400, -974, 3848}, - {1304, -993, 3884}, - {1304, -925, 3884}, - {1497, 886, -3813}, - {1400, 837, -3848}, - {1497, 818, -3813}, - {1497, 886, -3813}, - {1497, 954, -3813}, - {1492, 940, -3815}, - {1478, 930, -3820}, - {1455, 925, -3828}, - {1442, 925, -3833}, - {1419, 930, -3842}, - {1405, 940, -3847}, - {1400, 954, -3848}, - {1400, 964, -3848}, - {1405, 979, -3847}, - {1419, 988, -3842}, - {1442, 993, -3833}, - {1455, 993, -3828}, - {1478, 988, -3820}, - {1492, 979, -3815}, - {1497, 964, -3813}, - {1497, 954, -3813}, - {1497, -857, -3813}, - {1492, -871, -3815}, - {1478, -881, -3820}, - {1455, -886, -3828}, - {1442, -886, -3833}, - {1419, -881, -3842}, - {1405, -871, -3847}, - {1400, -857, -3848}, - {1400, -847, -3848}, - {1405, -832, -3847}, - {1419, -823, -3842}, - {1442, -818, -3833}, - {1455, -818, -3828}, - {1478, -823, -3820}, - {1492, -832, -3815}, - {1497, -847, -3813}, - {1497, -857, -3813}, - {1497, -925, -3813}, - {1400, -974, -3848}, - {1497, -993, -3813}, - {1497, -925, -3813}, - {710, -214, 4028}, - {349, -619, 4033}, - {451, -619, 4024}, - {710, 214, 4028}, - {349, 619, 4033}, - {451, 619, 4024}, - {710, -214, -4028}, - {616, -319, -4029}, - {576, -364, -4030}, - {482, -469, -4031}, - {442, -514, -4032}, - {349, -619, -4033}, - {349, -619, -4033}, - {451, -619, -4024}, - {710, 214, -4028}, - {616, 319, -4029}, - {576, 364, -4030}, - {482, 469, -4031}, - {442, 514, -4032}, - {349, 619, -4033}, - {349, 619, -4033}, - {451, 619, -4024}, - {610, 745, 4051}, - {615, 730, 4050}, - {624, 725, 4049}, - {634, 725, 4047}, - {644, 730, 4045}, - {648, 740, 4044}, - {653, 760, 4043}, - {658, 774, 4043}, - {668, 784, 4041}, - {677, 789, 4039}, - {692, 789, 4037}, - {701, 784, 4035}, - {706, 779, 4034}, - {711, 764, 4033}, - {711, 745, 4033}, - {706, 730, 4034}, - {701, 725, 4035}, - {692, 721, 4037}, - {677, 721, 4039}, - {668, 725, 4041}, - {658, 735, 4043}, - {653, 750, 4043}, - {648, 769, 4044}, - {644, 779, 4045}, - {634, 784, 4047}, - {624, 784, 4049}, - {615, 779, 4050}, - {610, 764, 4051}, - {610, 745, 4051}, - {610, 857, 4051}, - {615, 842, 4050}, - {629, 833, 4048}, - {653, 828, 4043}, - {668, 828, 4041}, - {692, 833, 4037}, - {706, 842, 4034}, - {711, 857, 4033}, - {711, 867, 4033}, - {706, 881, 4034}, - {692, 891, 4037}, - {668, 896, 4041}, - {653, 896, 4043}, - {629, 891, 4048}, - {615, 881, 4050}, - {610, 867, 4051}, - {610, 857, 4051}, - {610, -760, 4051}, - {615, -774, 4050}, - {629, -784, 4048}, - {653, -789, 4043}, - {668, -789, 4041}, - {692, -784, 4037}, - {706, -774, 4034}, - {711, -760, 4033}, - {711, -750, 4033}, - {706, -735, 4034}, - {692, -725, 4037}, - {668, -721, 4041}, - {653, -721, 4043}, - {629, -725, 4048}, - {615, -735, 4050}, - {610, -750, 4051}, - {610, -760, 4051}, - {610, -872, 4051}, - {615, -886, 4050}, - {624, -891, 4049}, - {634, -891, 4047}, - {644, -886, 4045}, - {648, -877, 4044}, - {653, -857, 4043}, - {658, -842, 4043}, - {668, -833, 4041}, - {677, -828, 4039}, - {692, -828, 4037}, - {701, -833, 4035}, - {706, -838, 4034}, - {711, -852, 4033}, - {711, -872, 4033}, - {706, -886, 4034}, - {701, -891, 4035}, - {692, -896, 4037}, - {677, -896, 4039}, - {668, -891, 4041}, - {658, -882, 4043}, - {653, -867, 4043}, - {648, -847, 4044}, - {644, -838, 4045}, - {634, -833, 4047}, - {624, -833, 4049}, - {615, -838, 4050}, - {610, -852, 4051}, - {610, -872, 4051}, - {812, 745, -4015}, - {807, 730, -4016}, - {797, 725, -4018}, - {788, 725, -4020}, - {778, 730, -4021}, - {773, 740, -4022}, - {768, 760, -4023}, - {764, 774, -4024}, - {754, 784, -4026}, - {744, 789, -4027}, - {730, 789, -4030}, - {720, 784, -4032}, - {716, 779, -4032}, - {711, 764, -4033}, - {711, 745, -4033}, - {716, 730, -4032}, - {720, 725, -4032}, - {730, 721, -4030}, - {744, 721, -4027}, - {754, 725, -4026}, - {764, 735, -4024}, - {768, 750, -4023}, - {773, 769, -4022}, - {778, 779, -4021}, - {788, 784, -4020}, - {797, 784, -4018}, - {807, 779, -4016}, - {812, 764, -4015}, - {812, 745, -4015}, - {812, 857, -4015}, - {807, 842, -4016}, - {792, 833, -4019}, - {768, 828, -4023}, - {754, 828, -4026}, - {730, 833, -4030}, - {716, 842, -4032}, - {711, 857, -4033}, - {711, 867, -4033}, - {716, 881, -4032}, - {730, 891, -4030}, - {754, 896, -4026}, - {768, 896, -4023}, - {792, 891, -4019}, - {807, 881, -4016}, - {812, 867, -4015}, - {812, 857, -4015}, - {812, -760, -4015}, - {807, -774, -4016}, - {792, -784, -4019}, - {768, -789, -4023}, - {754, -789, -4026}, - {730, -784, -4030}, - {716, -774, -4032}, - {711, -760, -4033}, - {711, -750, -4033}, - {716, -735, -4032}, - {730, -725, -4030}, - {754, -721, -4026}, - {768, -721, -4023}, - {792, -725, -4019}, - {807, -735, -4016}, - {812, -750, -4015}, - {812, -760, -4015}, - {812, -872, -4015}, - {807, -886, -4016}, - {797, -891, -4018}, - {788, -891, -4020}, - {778, -886, -4021}, - {773, -877, -4022}, - {768, -857, -4023}, - {764, -842, -4024}, - {754, -833, -4026}, - {744, -828, -4027}, - {730, -828, -4030}, - {720, -833, -4032}, - {716, -838, -4032}, - {711, -852, -4033}, - {711, -872, -4033}, - {716, -886, -4032}, - {720, -891, -4032}, - {730, -896, -4030}, - {744, -896, -4027}, - {754, -891, -4026}, - {764, -882, -4024}, - {768, -867, -4023}, - {773, -847, -4022}, - {778, -838, -4021}, - {788, -833, -4020}, - {797, -833, -4018}, - {807, -838, -4016}, - {812, -852, -4015}, - {812, -872, -4015}, -}; diff -Nru acm-5.0/src/hsi.c acm-6.0+20200416/src/hsi.c --- acm-5.0/src/hsi.c 1999-01-06 19:59:20.000000000 +0000 +++ acm-6.0+20200416/src/hsi.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,367 +0,0 @@ -/* - * acm : an aerial combat simulator for X - * Copyright (C) 1991-1998 Riley Rainey - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 dated June, 1991. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. - */ - -#include -#include "pm.h" -#include "hsi.h" -#include -#ifdef AFDS -#include -#endif - -#define CDI_DOT_SPACE 0.125 /* must agree with tools/hsi_header.c */ -#define GS_DOT_SPACE 0.35 -#define FREQ_X 0.8 -#define FREQ_Y 1.1 -#define DME_X -1.0 -#define DME_Y -1.1 - -/* There's a bug lurking here, but for now ... */ - -#ifdef WIN32 -#define SCALE_1 5.0 -#else -#define SCALE_1 8.5 -#endif - -void doHSICompassCard(craft * c, viewer * u); -extern double radial(navaid_t * n, craft * c, VPoint * vec); -extern double glideSlopeOffset(navaid_t * n, craft * c); -extern void ShortTransform(short_point_t *, short_matrix_t * m, short_point_t * b); -extern void VMatrixToShortMatrix(VMatrix * v, short_matrix_t * s); -extern double magHeading(craft *); - -void -doHSI(craft * c, viewer * u) -{ - - if (c->radarMode != RM_ILS) - return; - - doHSICompassCard(c, u); - return; - -} - -void -doHSICompassCard(craft * c, viewer * u) -{ - - XSegment seg[1024], m_seg[256]; - XRectangle rect[1]; - int npath, m_i = 0, i = 0, j, k, kmax, xc, yc, h, x, y; - int vor_orientation; - VMatrix m; - VPoint rloc, xobs; - short_matrix_t im; - short_point_t it1, it2; - VGlyphVertex3 jt1, jt2; - int xscale, yscale, xoffset, icdi_offset, igs_offset; - double cdi_offset, gs_offset, obs, r, diff, adiff, so, co; - static ZInfo z; - - rect[0].x = u->rx; - rect[0].y = u->ry; - rect[0].width = u->radarWidth; - rect[0].height = u->radarHeight; - - z.depth = --u->v->depth; - z.color = u->v->pixel[radarBackgroundColor->cIndex]; - FillRectangle(u->v->w, u->rx, u->ry, - u->radarWidth, u->radarWidth, &z); - - xoffset = (int) ((-15.0 * u->scaleFactor) + 0.5); - xc = u->rx + (u->radarWidth + 1) / 2 + xoffset; - yc = u->ry + (u->radarHeight + 1) / 2; - -/* - * Build a transformation matrix to be used to display the compass card. - */ - - VIdentMatrix(&m); - VRotate(&m, XRotation, magHeading(c)); - VMatrixToShortMatrix(&m, &im); - - xscale = 80 * u->scaleFactor; - yscale = 80 * u->scaleFactor; - - h = (int) (8.0 * u->scaleFactor + 0.5); - x = FREQ_X * xscale; - y = FREQ_Y * yscale; - VDrawStrokeString(u->v, x + xc, y + yc, c->hsiSelect->freq_readout, - strlen(c->hsiSelect->freq_readout), h, &u->z); - - if (c->hsiSelect->station && - (c->hsiSelect->station->flags & NAVAID_DME)) { - x = DME_X * xscale; - y = DME_Y * yscale; - VDrawStrokeString(u->v, x + xc, y + yc, - c->hsiSelect->dme_readout, - strlen(c->hsiSelect->dme_readout), h, &u->z); - } - -/* - * Our compass card structure is a list of point paths on a unit circle. - * Traverse that structure, transforming each set of points into screen - * coordinates, and add a segment entry for each one that'll be displayed. - */ - - npath = sizeof(heading_path) / sizeof(heading_path[0]); - - for (i = 0, j = 0; j < npath; ++j) { - k = heading_path[j].vertex_start; - ShortTransform((short_point_t *) &heading_vertex[k], &im, &it1); - kmax = k + heading_path[j].vertex_count; - for (++k; k < kmax; ++k) { - ShortTransform((short_point_t *) &heading_vertex[k], &im, &it2); - seg[i].x1 = xc + (xscale * it1.y / it1.x); - seg[i].y1 = yc - (yscale * it1.z / it1.x); - seg[i].x2 = xc + (xscale * it2.y / it2.x); - seg[i++].y2 = yc - (yscale * it2.z / it2.x); - it1 = it2; - } - } - -/* - * Draw the legend - */ - - npath = sizeof(legend_path) / sizeof(legend_path[0]); - - for (j = 0; j < npath; ++j) { - k = legend_path[j].vertex_start; - jt1 = legend_vertex[k]; - kmax = k + legend_path[j].vertex_count; - for (++k; k < kmax; ++k) { - jt2 = legend_vertex[k]; - seg[i].x1 = xc + (xscale * jt1.y / jt1.x); - seg[i].y1 = yc - (yscale * jt1.z / jt1.x); - seg[i].x2 = xc + (xscale * jt2.y / jt2.x); - seg[i++].y2 = yc - (yscale * jt2.z / jt2.x); - jt1 = jt2; - } - } - -/* - * Build a transformation matrix to be used to display the selected course - * pointer. - */ - - VIdentMatrix(&m); - obs = DEGtoRAD(c->hsiSelect->obs_setting); - VRotate(&m, XRotation, magHeading(c) - obs); - VMatrixToShortMatrix(&m, &im); - -/* - * Draw the Selected Course Pointer - */ - - npath = sizeof(scp_path) / sizeof(scp_path[0]); - - for (j = 0; j < npath; ++j) { - k = scp_path[j].vertex_start; - ShortTransform((short_point_t *) &scp_vertex[k], &im, &it1); - kmax = k + scp_path[j].vertex_count; - for (++k; k < kmax; ++k) { - ShortTransform((short_point_t *) &scp_vertex[k], &im, &it2); - seg[i].x1 = xc + (xscale * it1.y / it1.x); - seg[i].y1 = yc - (yscale * it1.z / it1.x); - seg[i].x2 = xc + (xscale * it2.y / it2.x); - seg[i++].y2 = yc - (yscale * it2.z / it2.x); - it1 = it2; - } - } - -/* - * Draw the Course Deviation Indicator - */ - - if (c->hsiSelect->station != NULL) { - - r = radial(c->hsiSelect->station, c, &rloc); - - if (c->hsiSelect->station->flags & NAVAID_LOC) { - diff = atan2(rloc.y, rloc.x); - } - else { - co = cos(obs); - so = sin(obs); - xobs.x = co * rloc.x + so * rloc.y; - xobs.y = -so * rloc.x + co * rloc.y; - diff = atan2(xobs.y, xobs.x); - } - - if (diff > pi / 2.0) { - adiff = pi - diff; - } - else if (diff < -pi / 2.0) { - adiff = -pi - diff; - } - else { - adiff = diff; - } - -#ifdef AFDS - AFDSSetTrackingParameters ( c, RADtoDEG(obs), RADtoDEG(adiff) ); -#endif - -/* - - - * Full localizer/SDF offsets will vary based on the beam width of the - * transmitter (typical localizer values are 3 to 6 degrees). - * - * VOR offsets are 1.7 degrees per dot on the HSI. - */ - -#define CDI_MAX 5.0 - - if (c->hsiSelect->station->flags & NAVAID_LOC) { - vor_orientation = 0; - cdi_offset = CDI_MAX * 2.0 * adiff / - c->hsiSelect->station->beam_width; - } - else { - vor_orientation = (fabs(diff) > pi / 2.0) ? 1 : -1; - cdi_offset = -adiff / DEGtoRAD(1.7); - } - - if (cdi_offset > CDI_MAX) - icdi_offset = (int) (UNITY * CDI_MAX * CDI_DOT_SPACE); - else if (cdi_offset < -CDI_MAX) - icdi_offset = (int) (UNITY * -CDI_MAX * CDI_DOT_SPACE); - else - icdi_offset = (int) (UNITY * cdi_offset * CDI_DOT_SPACE); - - npath = sizeof(cdi_path) / sizeof(cdi_path[0]); - - for (j = 0; j < npath; ++j) { - k = cdi_path[j].vertex_start; - jt1 = cdi_vertex[k]; - jt1.y += icdi_offset; - ShortTransform((short_point_t *) &jt1, &im, &it1); - kmax = k + cdi_path[j].vertex_count; - for (++k; k < kmax; ++k) { - jt1 = cdi_vertex[k]; - jt1.y += icdi_offset; - ShortTransform((short_point_t *) &jt1, &im, &it2); - m_seg[m_i].x1 = xc + (xscale * it1.y / it1.x); - m_seg[m_i].y1 = yc - (yscale * it1.z / it1.x); - m_seg[m_i].x2 = xc + (xscale * it2.y / it2.x); - m_seg[m_i++].y2 = yc - (yscale * it2.z / it2.x); - it1 = it2; - } - } - - if (vor_orientation != 0) { - - npath = sizeof(vor_to_from_path) / - sizeof(vor_to_from_path[0]); - - for (j = 0; j < npath; ++j) { - k = vor_to_from_path[j].vertex_start; - jt1 = vor_to_from_vertex[k]; - jt1.z *= vor_orientation; - ShortTransform((short_point_t *) &jt1, &im, &it1); - kmax = k + vor_to_from_path[j].vertex_count; - for (++k; k < kmax; ++k) { - jt1 = vor_to_from_vertex[k]; - jt1.z *= vor_orientation; - ShortTransform((short_point_t *) &jt1, &im, &it2); - seg[i].x1 = xc + (xscale * it1.y / it1.x); - seg[i].y1 = yc - (yscale * it1.z / it1.x); - seg[i].x2 = xc + (xscale * it2.y / it2.x); - seg[i++].y2 = yc - (yscale * it2.z / it2.x); - it1 = it2; - } - } - } - -/* - * Draw the Glide Slope scale - */ - - if (c->hsiSelect->station->flags & NAVAID_GS) { - - npath = sizeof(gs_scale_path) / sizeof(gs_scale_path[0]); - - for (j = 0; j < npath; ++j) { - k = gs_scale_path[j].vertex_start; - jt1 = gs_scale_vertex[k]; - kmax = k + gs_scale_path[j].vertex_count; - for (++k; k < kmax; ++k) { - jt2 = gs_scale_vertex[k]; - seg[i].x1 = xc + (xscale * jt1.y / jt1.x); - seg[i].y1 = yc - (yscale * jt1.z / jt1.x); - seg[i].x2 = xc + (xscale * jt2.y / jt2.x); - seg[i++].y2 = yc - (yscale * jt2.z / jt2.x); - jt1 = jt2; - } - } - -/* - * Draw the Glide Slope Deviation Indicator - */ - - gs_offset = RADtoDEG( - glideSlopeOffset(c->hsiSelect->station, c)) / 0.35; - - if (gs_offset > 2.5) - igs_offset = (int) (UNITY * (2.5 * GS_DOT_SPACE)); - else if (gs_offset < -2.5) - igs_offset = (int) (UNITY * (-2.5 * GS_DOT_SPACE)); - else - igs_offset = (int) (UNITY * (gs_offset * GS_DOT_SPACE)); - - npath = sizeof(gs_pointer_path) / - sizeof(gs_pointer_path[0]); - - for (j = 0; j < npath; ++j) { - k = gs_pointer_path[j].vertex_start; - jt1 = gs_pointer_vertex[k]; - jt1.z += igs_offset; - kmax = k + gs_pointer_path[j].vertex_count; - for (++k; k < kmax; ++k) { - jt2 = gs_pointer_vertex[k]; - jt2.z += igs_offset; - m_seg[m_i].x1 = xc + (xscale * jt1.y / jt1.x); - m_seg[m_i].y1 = yc - (yscale * jt1.z / jt1.x); - m_seg[m_i].x2 = xc + (xscale * jt2.y / jt2.x); - m_seg[m_i++].y2 = yc - (yscale * jt2.z / jt2.x); - jt1 = jt2; - } - } - - } - } - - u->v->w->clip.x1 = rect[0].x; - u->v->w->clip.y1 = rect[0].y; - u->v->w->clip.x2 = rect[0].x + rect[0].width - 1; - u->v->w->clip.y2 = rect[0].y + rect[0].height - 1; - - VDrawSegments(u->v, m_seg, m_i, u->v->pixel[HSIMagentaColor->cIndex]); - VDrawSegments(u->v, seg, i, u->v->pixel[HUDPixel]); - - u->v->w->clip.x1 = 0; - u->v->w->clip.y1 = 0; - u->v->w->clip.x2 = u->v->w->width - 1; - u->v->w->clip.y2 = u->v->w->height - 1; - - return; -} diff -Nru acm-5.0/src/hsi.h acm-6.0+20200416/src/hsi.h --- acm-5.0/src/hsi.h 1998-05-12 03:43:04.000000000 +0000 +++ acm-6.0+20200416/src/hsi.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,728 +0,0 @@ - -/* - * This file created by tools/hsi_heading.c - */ -#include -VGlyphPath heading_path[] = -{ - {2, 0}, - {2, 2}, - {2, 4}, - {2, 6}, - {2, 8}, - {2, 10}, - {2, 12}, - {2, 14}, - {2, 16}, - {2, 18}, - {15, 20}, - {2, 35}, - {2, 37}, - {2, 39}, - {2, 41}, - {2, 43}, - {2, 45}, - {23, 47}, - {2, 70}, - {2, 72}, - {2, 74}, - {2, 76}, - {2, 78}, - {2, 80}, - {2, 82}, - {2, 84}, - {2, 86}, - {2, 88}, - {2, 90}, - {2, 92}, - {2, 94}, - {2, 96}, - {2, 98}, - {2, 100}, - {4, 102}, - {14, 106}, - {2, 120}, - {2, 122}, - {2, 124}, - {2, 126}, - {2, 128}, - {2, 130}, - {4, 132}, - {17, 136}, - {2, 153}, - {2, 155}, - {2, 157}, - {2, 159}, - {2, 161}, - {2, 163}, - {20, 165}, - {2, 185}, - {2, 187}, - {2, 189}, - {2, 191}, - {2, 193}, - {2, 195}, - {14, 197}, - {4, 211}, - {2, 215}, - {2, 217}, - {2, 219}, - {2, 221}, - {2, 223}, - {2, 225}, - {14, 227}, - {3, 241}, - {2, 244}, - {2, 246}, - {2, 248}, - {2, 250}, - {2, 252}, - {2, 254}, - {2, 256}, - {2, 258}, - {2, 260}, - {2, 262}, - {2, 264}, - {2, 266}, - {2, 268}, - {2, 270}, - {2, 272}, - {2, 274}, - {2, 276}, - {15, 278}, - {17, 293}, - {2, 310}, - {2, 312}, - {2, 314}, - {2, 316}, - {2, 318}, - {2, 320}, - {15, 322}, - {15, 337}, - {2, 352}, - {2, 354}, - {2, 356}, - {2, 358}, - {2, 360}, -}; -VGlyphVertex3 heading_vertex[] = -{ - {4096, 0, 4096}, - {4096, 0, 3809}, - {4096, -123, 3594}, - {4096, -123, 3194}, - {4096, -123, 3594}, - {4096, 142, 3194}, - {4096, 142, 3594}, - {4096, 142, 3194}, - {4096, 356, 4080}, - {4096, 346, 3958}, - {4096, 711, 4033}, - {4096, 661, 3751}, - {4096, 1060, 3956}, - {4096, 1028, 3837}, - {4096, 1400, 3848}, - {4096, 1302, 3579}, - {4096, 1731, 3712}, - {4096, 1679, 3600}, - {4096, 2047, 3547}, - {4096, 1904, 3298}, - {4096, 1723, 3155}, - {4096, 1904, 3050}, - {4096, 1729, 2976}, - {4096, 1778, 2947}, - {4096, 1802, 2912}, - {4096, 1809, 2886}, - {4096, 1797, 2827}, - {4096, 1777, 2794}, - {4096, 1733, 2754}, - {4096, 1681, 2740}, - {4096, 1622, 2752}, - {4096, 1572, 2781}, - {4096, 1532, 2826}, - {4096, 1525, 2852}, - {4096, 1528, 2894}, - {4096, 2349, 3355}, - {4096, 2278, 3254}, - {4096, 2632, 3137}, - {4096, 2448, 2918}, - {4096, 2896, 2896}, - {4096, 2809, 2809}, - {4096, 3137, 2632}, - {4096, 2918, 2448}, - {4096, 3355, 2349}, - {4096, 3254, 2278}, - {4096, 3547, 2048}, - {4096, 3298, 1904}, - {4096, 3120, 1669}, - {4096, 3143, 1705}, - {4096, 3131, 1764}, - {4096, 3112, 1797}, - {4096, 3067, 1837}, - {4096, 2999, 1841}, - {4096, 2907, 1810}, - {4096, 2825, 1762}, - {4096, 2768, 1708}, - {4096, 2754, 1656}, - {4096, 2766, 1597}, - {4096, 2776, 1580}, - {4096, 2821, 1541}, - {4096, 2873, 1527}, - {4096, 2932, 1539}, - {4096, 2948, 1548}, - {4096, 2988, 1593}, - {4096, 3002, 1645}, - {4096, 2990, 1704}, - {4096, 2980, 1721}, - {4096, 2935, 1760}, - {4096, 2883, 1774}, - {4096, 2825, 1762}, - {4096, 3712, 1731}, - {4096, 3600, 1679}, - {4096, 3848, 1400}, - {4096, 3579, 1302}, - {4096, 3956, 1060}, - {4096, 3837, 1028}, - {4096, 4033, 711}, - {4096, 3751, 661}, - {4096, 4080, 356}, - {4096, 3958, 346}, - {4096, 4096, 0}, - {4096, 3809, 0}, - {4096, 3594, 114}, - {4096, 3194, 114}, - {4096, 3594, 114}, - {4096, 3594, -133}, - {4096, 3404, 114}, - {4096, 3404, -38}, - {4096, 3194, 114}, - {4096, 3194, -133}, - {4096, 4080, -356}, - {4096, 3958, -346}, - {4096, 4033, -711}, - {4096, 3751, -661}, - {4096, 3956, -1060}, - {4096, 3837, -1028}, - {4096, 3848, -1400}, - {4096, 3579, -1302}, - {4096, 3712, -1731}, - {4096, 3600, -1679}, - {4096, 3547, -2047}, - {4096, 3298, -1904}, - {4096, 3165, -1553}, - {4096, 3163, -1595}, - {4096, 3184, -1673}, - {4096, 2838, -1473}, - {4096, 2973, -1848}, - {4096, 2989, -1857}, - {4096, 3013, -1893}, - {4096, 3020, -1919}, - {4096, 3017, -1961}, - {4096, 2979, -2027}, - {4096, 2944, -2051}, - {4096, 2918, -2058}, - {4096, 2875, -2055}, - {4096, 2842, -2036}, - {4096, 2819, -2001}, - {4096, 2788, -1939}, - {4096, 2719, -1679}, - {4096, 2586, -1910}, - {4096, 3355, -2349}, - {4096, 3254, -2278}, - {4096, 3137, -2632}, - {4096, 2918, -2448}, - {4096, 2896, -2896}, - {4096, 2809, -2809}, - {4096, 2632, -3137}, - {4096, 2448, -2918}, - {4096, 2349, -3355}, - {4096, 2278, -3254}, - {4096, 2047, -3547}, - {4096, 1904, -3298}, - {4096, 1964, -2927}, - {4096, 1941, -2963}, - {4096, 1920, -3041}, - {4096, 1720, -2695}, - {4096, 1517, -3274}, - {4096, 1681, -3179}, - {4096, 1612, -3021}, - {4096, 1605, -3047}, - {4096, 1565, -3092}, - {4096, 1516, -3121}, - {4096, 1457, -3133}, - {4096, 1405, -3119}, - {4096, 1360, -3079}, - {4096, 1341, -3046}, - {4096, 1329, -2987}, - {4096, 1343, -2935}, - {4096, 1383, -2890}, - {4096, 1432, -2861}, - {4096, 1491, -2849}, - {4096, 1517, -2856}, - {4096, 1553, -2880}, - {4096, 1731, -3712}, - {4096, 1679, -3600}, - {4096, 1400, -3848}, - {4096, 1302, -3579}, - {4096, 1060, -3956}, - {4096, 1028, -3837}, - {4096, 711, -4033}, - {4096, 661, -3751}, - {4096, 356, -4080}, - {4096, 346, -3958}, - {4096, 0, -4096}, - {4096, 0, -3809}, - {4096, -142, -3537}, - {4096, -104, -3575}, - {4096, -47, -3594}, - {4096, 28, -3594}, - {4096, 85, -3575}, - {4096, 123, -3537}, - {4096, 123, -3499}, - {4096, 104, -3461}, - {4096, 85, -3442}, - {4096, 47, -3423}, - {4096, -66, -3385}, - {4096, -104, -3366}, - {4096, -123, -3347}, - {4096, -142, -3308}, - {4096, -142, -3251}, - {4096, -104, -3213}, - {4096, -47, -3194}, - {4096, 28, -3194}, - {4096, 85, -3213}, - {4096, 123, -3251}, - {4096, -356, -4080}, - {4096, -346, -3958}, - {4096, -711, -4033}, - {4096, -661, -3751}, - {4096, -1060, -3956}, - {4096, -1028, -3837}, - {4096, -1400, -3848}, - {4096, -1302, -3579}, - {4096, -1731, -3712}, - {4096, -1679, -3600}, - {4096, -2048, -3547}, - {4096, -1904, -3298}, - {4096, -1486, -3182}, - {4096, -1495, -3198}, - {4096, -1531, -3222}, - {4096, -1557, -3229}, - {4096, -1599, -3226}, - {4096, -1665, -3188}, - {4096, -1688, -3153}, - {4096, -1695, -3127}, - {4096, -1693, -3084}, - {4096, -1674, -3051}, - {4096, -1638, -3028}, - {4096, -1577, -2998}, - {4096, -1317, -2928}, - {4096, -1548, -2795}, - {4096, -1915, -2956}, - {4096, -1957, -2953}, - {4096, -2035, -2974}, - {4096, -1836, -2628}, - {4096, -2349, -3355}, - {4096, -2278, -3254}, - {4096, -2632, -3137}, - {4096, -2448, -2918}, - {4096, -2896, -2896}, - {4096, -2809, -2809}, - {4096, -3137, -2632}, - {4096, -2918, -2448}, - {4096, -3355, -2349}, - {4096, -3254, -2278}, - {4096, -3547, -2048}, - {4096, -3298, -1904}, - {4096, -2878, -2013}, - {4096, -2894, -2022}, - {4096, -2937, -2025}, - {4096, -2963, -2018}, - {4096, -2998, -1994}, - {4096, -3036, -1928}, - {4096, -3039, -1886}, - {4096, -3032, -1860}, - {4096, -3008, -1824}, - {4096, -2975, -1805}, - {4096, -2933, -1803}, - {4096, -2864, -1807}, - {4096, -2605, -1877}, - {4096, -2738, -1646}, - {4096, -3250, -1558}, - {4096, -2924, -1589}, - {4096, -3067, -1342}, - {4096, -3250, -1558}, - {4096, -2904, -1358}, - {4096, -3712, -1731}, - {4096, -3600, -1679}, - {4096, -3848, -1400}, - {4096, -3579, -1302}, - {4096, -3956, -1060}, - {4096, -3837, -1028}, - {4096, -4033, -711}, - {4096, -3751, -661}, - {4096, -4080, -356}, - {4096, -3958, -346}, - {4096, -4096, 0}, - {4096, -3809, 0}, - {4096, -3594, -180}, - {4096, -3194, -85}, - {4096, -3594, 9}, - {4096, -3194, -85}, - {4096, -3594, 9}, - {4096, -3194, 104}, - {4096, -3594, 199}, - {4096, -3194, 104}, - {4096, -4080, 356}, - {4096, -3958, 346}, - {4096, -4033, 711}, - {4096, -3751, 661}, - {4096, -3956, 1060}, - {4096, -3837, 1028}, - {4096, -3848, 1400}, - {4096, -3579, 1302}, - {4096, -3712, 1731}, - {4096, -3600, 1679}, - {4096, -3547, 2048}, - {4096, -3298, 1904}, - {4096, -3255, 1550}, - {4096, -3150, 1731}, - {4096, -3076, 1556}, - {4096, -3047, 1605}, - {4096, -3012, 1629}, - {4096, -2986, 1636}, - {4096, -2927, 1624}, - {4096, -2894, 1605}, - {4096, -2854, 1560}, - {4096, -2840, 1508}, - {4096, -2852, 1449}, - {4096, -2880, 1399}, - {4096, -2925, 1359}, - {4096, -2951, 1352}, - {4096, -2994, 1355}, - {4096, -3008, 1978}, - {4096, -3020, 1919}, - {4096, -2989, 1857}, - {4096, -2916, 1793}, - {4096, -2867, 1765}, - {4096, -2775, 1734}, - {4096, -2707, 1738}, - {4096, -2662, 1778}, - {4096, -2643, 1811}, - {4096, -2631, 1870}, - {4096, -2661, 1931}, - {4096, -2734, 1995}, - {4096, -2783, 2024}, - {4096, -2875, 2055}, - {4096, -2944, 2051}, - {4096, -2989, 2011}, - {4096, -3008, 1978}, - {4096, -3355, 2349}, - {4096, -3254, 2278}, - {4096, -3137, 2632}, - {4096, -2918, 2448}, - {4096, -2896, 2896}, - {4096, -2809, 2809}, - {4096, -2632, 3137}, - {4096, -2448, 2918}, - {4096, -2349, 3355}, - {4096, -2278, 3254}, - {4096, -2048, 3547}, - {4096, -1904, 3298}, - {4096, -2044, 2970}, - {4096, -1863, 3074}, - {4096, -1885, 2885}, - {4096, -1836, 2914}, - {4096, -1793, 2916}, - {4096, -1767, 2909}, - {4096, -1722, 2870}, - {4096, -1703, 2837}, - {4096, -1691, 2778}, - {4096, -1705, 2726}, - {4096, -1745, 2681}, - {4096, -1795, 2652}, - {4096, -1853, 2640}, - {4096, -1879, 2647}, - {4096, -1915, 2671}, - {4096, -1681, 3179}, - {4096, -1500, 3283}, - {4096, -1523, 3095}, - {4096, -1474, 3123}, - {4096, -1431, 3126}, - {4096, -1405, 3119}, - {4096, -1360, 3079}, - {4096, -1341, 3046}, - {4096, -1329, 2987}, - {4096, -1343, 2935}, - {4096, -1383, 2890}, - {4096, -1432, 2861}, - {4096, -1491, 2849}, - {4096, -1517, 2856}, - {4096, -1553, 2880}, - {4096, -1731, 3712}, - {4096, -1679, 3600}, - {4096, -1400, 3848}, - {4096, -1302, 3579}, - {4096, -1060, 3956}, - {4096, -1028, 3837}, - {4096, -711, 4033}, - {4096, -661, 3751}, - {4096, -356, 4080}, - {4096, -346, 3958}, -}; - -VGlyphPath legend_path[] = -{ - {2, 0}, - {2, 2}, - {2, 4}, - {2, 6}, - {2, 8}, - {2, 10}, - {2, 12}, - {2, 14}, - {3, 16}, - {3, 19}, - {2, 22}, - {2, 24}, -}; -VGlyphVertex3 legend_vertex[] = -{ - {4096, 0, 4096}, - {4096, 0, 4505}, - {4096, 2896, 2896}, - {4096, 3185, 3185}, - {4096, 4096, 0}, - {4096, 4505, 0}, - {4096, 2896, -2896}, - {4096, 3185, -3185}, - {4096, 0, -4096}, - {4096, 0, -4505}, - {4096, -2896, -2896}, - {4096, -3185, -3185}, - {4096, -4096, 0}, - {4096, -4505, 0}, - {4096, -2896, 2896}, - {4096, -3185, 3185}, - {4096, 163, 819}, - {4096, 163, -819}, - {4096, 532, -819}, - {4096, -163, 819}, - {4096, -163, -819}, - {4096, -532, -819}, - {4096, 163, 273}, - {4096, 1024, 273}, - {4096, -163, 273}, - {4096, -1024, 273}, -}; - -VGlyphPath cdi_path[] = -{ - {5, 0}, -}; -VGlyphVertex3 cdi_vertex[] = -{ - {4096, 163, 2048}, - {4096, 163, -2048}, - {4096, -163, -2048}, - {4096, -163, 2048}, - {4096, 163, 2048}, -}; - -VGlyphPath scp_path[] = -{ - {6, 0}, - {5, 6}, - {9, 11}, - {9, 20}, - {9, 29}, - {9, 38}, - {9, 47}, - {9, 56}, - {9, 65}, - {9, 74}, - {9, 83}, - {9, 92}, -}; -VGlyphVertex3 scp_vertex[] = -{ - {4096, 163, 2048}, - {4096, 163, 2867}, - {4096, 0, 3358}, - {4096, -163, 2867}, - {4096, -163, 2048}, - {4096, 163, 2048}, - {4096, 163, -2048}, - {4096, 163, -2867}, - {4096, -163, -2867}, - {4096, -163, -2048}, - {4096, 163, -2048}, - {4096, 2560, 81}, - {4096, 2617, 57}, - {4096, 2641, 0}, - {4096, 2617, -57}, - {4096, 2560, -81}, - {4096, 2502, -57}, - {4096, 2478, 0}, - {4096, 2502, 57}, - {4096, 2560, 81}, - {4096, -2560, 81}, - {4096, -2502, 57}, - {4096, -2478, 0}, - {4096, -2502, -57}, - {4096, -2560, -81}, - {4096, -2617, -57}, - {4096, -2641, 0}, - {4096, -2617, 57}, - {4096, -2560, 81}, - {4096, 2048, 81}, - {4096, 2105, 57}, - {4096, 2129, 0}, - {4096, 2105, -57}, - {4096, 2048, -81}, - {4096, 1990, -57}, - {4096, 1966, 0}, - {4096, 1990, 57}, - {4096, 2048, 81}, - {4096, -2048, 81}, - {4096, -1990, 57}, - {4096, -1966, 0}, - {4096, -1990, -57}, - {4096, -2048, -81}, - {4096, -2105, -57}, - {4096, -2129, 0}, - {4096, -2105, 57}, - {4096, -2048, 81}, - {4096, 1536, 81}, - {4096, 1593, 57}, - {4096, 1617, 0}, - {4096, 1593, -57}, - {4096, 1536, -81}, - {4096, 1478, -57}, - {4096, 1454, 0}, - {4096, 1478, 57}, - {4096, 1536, 81}, - {4096, -1536, 81}, - {4096, -1478, 57}, - {4096, -1454, 0}, - {4096, -1478, -57}, - {4096, -1536, -81}, - {4096, -1593, -57}, - {4096, -1617, 0}, - {4096, -1593, 57}, - {4096, -1536, 81}, - {4096, 1024, 81}, - {4096, 1081, 57}, - {4096, 1105, 0}, - {4096, 1081, -57}, - {4096, 1024, -81}, - {4096, 966, -57}, - {4096, 942, 0}, - {4096, 966, 57}, - {4096, 1024, 81}, - {4096, -1024, 81}, - {4096, -966, 57}, - {4096, -942, 0}, - {4096, -966, -57}, - {4096, -1024, -81}, - {4096, -1081, -57}, - {4096, -1105, 0}, - {4096, -1081, 57}, - {4096, -1024, 81}, - {4096, 512, 81}, - {4096, 569, 57}, - {4096, 593, 0}, - {4096, 569, -57}, - {4096, 512, -81}, - {4096, 454, -57}, - {4096, 430, 0}, - {4096, 454, 57}, - {4096, 512, 81}, - {4096, -512, 81}, - {4096, -454, 57}, - {4096, -430, 0}, - {4096, -454, -57}, - {4096, -512, -81}, - {4096, -569, -57}, - {4096, -593, 0}, - {4096, -569, 57}, - {4096, -512, 81}, -}; - -VGlyphPath gs_scale_path[] = -{ - {9, 0}, - {9, 9}, - {9, 18}, - {9, 27}, - {5, 36}, -}; -VGlyphVertex3 gs_scale_vertex[] = -{ - {4096, 5734, 3072}, - {4096, 5879, 3012}, - {4096, 5939, 2867}, - {4096, 5879, 2722}, - {4096, 5734, 2662}, - {4096, 5589, 2722}, - {4096, 5529, 2867}, - {4096, 5589, 3012}, - {4096, 5734, 3072}, - {4096, 5734, -2662}, - {4096, 5879, -2722}, - {4096, 5939, -2867}, - {4096, 5879, -3012}, - {4096, 5734, -3072}, - {4096, 5589, -3012}, - {4096, 5529, -2867}, - {4096, 5589, -2722}, - {4096, 5734, -2662}, - {4096, 5734, 1638}, - {4096, 5879, 1578}, - {4096, 5939, 1433}, - {4096, 5879, 1288}, - {4096, 5734, 1228}, - {4096, 5589, 1288}, - {4096, 5529, 1433}, - {4096, 5589, 1578}, - {4096, 5734, 1638}, - {4096, 5734, -1228}, - {4096, 5879, -1288}, - {4096, 5939, -1433}, - {4096, 5879, -1578}, - {4096, 5734, -1638}, - {4096, 5589, -1578}, - {4096, 5529, -1433}, - {4096, 5589, -1288}, - {4096, 5734, -1228}, - {4096, 5939, 122}, - {4096, 5529, 122}, - {4096, 5529, -122}, - {4096, 5939, -122}, - {4096, 5939, 122}, -}; - -VGlyphPath gs_pointer_path[] = -{ - {5, 0}, -}; -VGlyphVertex3 gs_pointer_vertex[] = -{ - {4096, 5529, 204}, - {4096, 5529, -204}, - {4096, 4915, -409}, - {4096, 4915, 409}, - {4096, 5529, 204}, -}; - -VGlyphPath vor_to_from_path[] = -{ - {4, 0}, -}; -VGlyphVertex3 vor_to_from_vertex[] = -{ - {4096, 0, 1466}, - {4096, 278, 983}, - {4096, -278, 983}, - {4096, 0, 1466}, -}; diff -Nru acm-5.0/src/hud.c acm-6.0+20200416/src/hud.c --- acm-5.0/src/hud.c 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/src/hud.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,341 +0,0 @@ - -/* - * acm : an aerial combat simulator for X - * Copyright (C) 1991-1998 Riley Rainey - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 dated June, 1991. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. - */ - -#include -#include "pm.h" -#include "horizon.h" -#include - -extern void doScale(Viewport * vp, scaleControl * s, double value), doCompassScale(Viewport * vp, scaleControl * s, double value); -extern void ShortTransform(short_point_t *, short_matrix_t * m, short_point_t * b); -void doLadder(craft * c, viewer * u, double vel); -extern void VMatrixToShortMatrix(VMatrix * v, short_matrix_t * s); -extern double magHeading(craft *); -extern int doWeaponDisplay(craft * c, viewer * u, int *x, int *y); - -void -doHUD(craft * c, viewer * u) -{ - - char buffer[80]; - int i, x, x1, y, scale, fth, scale1; - double vel; - - scale1 = (int) (u->scaleFactor * 2048.0); - - scale = (int) (12.0 * u->scaleFactor + 0.5); - fth = (int) (18.0 * u->scaleFactor + 0.5); - - if (u->viewDirection.x < 0.90) - return; - -#ifdef notdef - vel = mag(c->Cg); - sprintf(buffer, "a=%.1f b=%.1f", RADtoDEG(c->alpha), - RADtoDEG(c->beta)); -#else - if ((vel = mag(c->Cg)) < 50.0) - sprintf(buffer, "a=0.0"); - else - sprintf(buffer, "a=%.1f", RADtoDEG(c->alpha)); -#endif - - if ( (c->flags & FL_GND_CONTACT) == 0 - && (c->alpha > c->cinfo->CLPosStall - || c->alpha < - c->cinfo->CLNegStall) ) - { - // Start stall warning if it isn't already playing - if(u->flow[SoundStallWarning] == 0) - playContinuousSound(c, SoundStallWarning); - } - else if (u->flow[SoundStallWarning] != 0) - { - stopSound(c, SoundStallWarning); - } - - - /* Angle of Attack */ - x = 750 * scale1 / 2048; - y = u->yCenter - u->velScale.length / 2 - (int) (u->scaleFactor * 50); - VDrawStrokeString(u->v, x, y, buffer, strlen(buffer), - scale, &u->z); - - /* Accelerometer */ - x1 = 375 * scale1 / 2048; - sprintf(buffer, "%4.1f", - c->G.z); - VDrawStrokeString(u->v, x1, y, buffer, strlen(buffer), - scale, &u->z); - - /* vertical velocity */ - x = 725 * scale1 / 2048; - y = u->yCenter + u->velScale.length / 2 + (int) (u->scaleFactor * 14.0); - sprintf(buffer, "%6d0", (int) (-c->Cg.z * 6.0)); - VDrawStrokeString(u->v, x, y, buffer, strlen(buffer), - scale, &u->z); - - /* Compass, altititude and airspeed cards */ - doCompassScale(u->v, &(u->hdgScale), RADtoDEG(magHeading(c)) * 100.0); - doScale(u->v, &(u->altScale), METERStoFEET(c->w.z)); - doScale(u->v, &(u->velScale), FPStoKTS(mag(c->Cg))); - - /* Mach number */ - if (c->mach >= 0.20) { - sprintf(c->leftHUD[1], " %4.2f", c->mach); - } - else { - strcpy(c->leftHUD[1], ""); - } - - x = 395 * scale1 / 2048; - y = u->yCenter - 3; - VDrawStrokeString(u->v, x, y, "C", 1, - scale * 9 / 10, &u->z); - - x = 340 * scale1 / 2048; - y = u->yCenter + u->velScale.length / 2 + (int) (u->scaleFactor * 50); - - doLadder(c, u, vel); - - for (i = 0; i < 5; ++i) { - VDrawStrokeString(u->v, x, y, c->leftHUD[i], - strlen(c->leftHUD[i]), scale, &u->z); - y += fth; - } - - x = 765 * scale1 / 2048; - y = u->yCenter + u->velScale.length / 2 + (int) (u->scaleFactor * 50); - - for (i = 0; i < 5; ++i) { - VDrawStrokeString(u->v, x, y, c->rightHUD[i], - strlen(c->rightHUD[i]), scale, &u->z); - y += fth; - } - - return; - -} - -void -doLadder(craft * c, viewer * u, double vel) -{ - - int a1, a2, a3, a4, a5, plotFPM, npath; - XSegment seg[400]; - XRectangle rect[1]; - int i, j, k, kmax, windX, windY, w, tx, ty, scale, x, y; - VPoint tmp, tmp1, t1; - VMatrix m; - double v, d; - short_matrix_t im; - short_point_t it1, it2; - short_fixed_t limit; - register short xscale, yscale; - extern void buildEulerMatrix(double roll, double pitch, double heading, VMatrix * m); - - limit = (short) (0.92 * UNITY); - - scale = (int) (12.0 * u->scaleFactor + 0.5); - - rect[0].x = u->xCenter - (int) (137.5 * u->scaleFactor + 0.5); - rect[0].y = u->yCenter - (int) (116.0 * u->scaleFactor + 0.5); - rect[0].width = (unsigned short) (275.0 * u->scaleFactor + 0.5); - rect[0].height = (unsigned short) (252.0 * u->scaleFactor + 0.5); - - - npath = sizeof(horizon_path) / sizeof(horizon_path[0]); - -/* - * Build a transformation matrix to be used to display the flight - * path ladder (artificial horizon). - * - * One thing we do is to keep the ladder centered on the flight path - * marker. The correction angle "v" is calculated to make that happen. - */ - - if (fabs(c->Cg.x) < 5.0 && fabs(c->Cg.y) < 5.0) { - v = 0.0; - } - else { - t1.x = cos(c->curHeading) * c->Cg.x + - sin(c->curHeading) * c->Cg.y; - t1.y = -sin(c->curHeading) * c->Cg.x + - cos(c->curHeading) * c->Cg.y; - v = atan2(t1.y, t1.x); - } - - VIdentMatrix(&m); - VRotate(&m, ZRotation, v); - VRotate(&m, YRotation, -c->curPitch); - VRotate(&m, XRotation, c->curRoll); - VMatrixToShortMatrix(&m, &im); - - xscale = (short) u->v->Scale.x >> 2; - yscale = (short) u->v->Scale.y >> 2; - -/* - * Our horizon structure is a list of point paths on a unit circle. Traverse - * that structure, transforming each set of points into screen coordinates, - * and add a segment entry for each one that'll be displayed. - */ - - for (i = 0, j = 0; j < npath; ++j) { - k = horizon_path[j].vertex_start; - ShortTransform((short_point_t *) &horizon_vertex[k], - &im, &it1); - if (it1.x > limit) { - kmax = k + horizon_path[j].vertex_count; - for (++k; k < kmax; ++k) { - ShortTransform((short_point_t *) &horizon_vertex[k], - &im, &it2); - if (it2.x > limit) { - seg[i].x1 = u->xCenter + (xscale * it1.y / it1.x); - seg[i].y1 = u->yCenter - (yscale * it1.z / it1.x); - seg[i].x2 = u->xCenter + (xscale * it2.y / it2.x); - seg[i++].y2 = u->yCenter - (yscale * it2.z / it2.x); - } - it1 = it2; - } - } - } - - /*u->v->w->clip.x1 = rect[0].x; - u->v->w->clip.y1 = rect[0].y; - u->v->w->clip.x2 = rect[0].x + rect[0].width - 1; - u->v->w->clip.y2 = rect[0].y + rect[0].height - 1;*/ - - VSetClipRect (u->v, rect[0].x, rect[0].y, rect[0].x + rect[0].width - 1, - rect[0].y + rect[0].height - 1); - - -/* - * Determine the location of the flight path marker - */ - - VReverseTransform_(&c->Cg, &c->trihedral, &tmp); - - plotFPM = 1; - - if (vel < 50.0 || tmp.x == 0.0) { - windX = u->xCenter; - windY = u->yCenter; - } - else if (tmp.x > 0.0) { - windX = u->xCenter + ((int) (tmp.y * u->v->Scale.x / tmp.x) / 4); - windY = u->yCenter + ((int) (tmp.z * u->v->Scale.y / tmp.x) / 4); - } - else - plotFPM = 0; - - if (plotFPM) { - - a1 = (int) (18.0 * u->scaleFactor + 0.5); - a2 = (int) (9.0 * u->scaleFactor + 0.5); - a3 = (int) (15.0 * u->scaleFactor + 0.5); - - seg[i].x1 = windX - a1; - seg[i].y1 = windY; - seg[i].x2 = windX - a2; - seg[i++].y2 = windY; - - seg[i].x1 = windX + a1; - seg[i].y1 = windY; - seg[i].x2 = windX + a2; - seg[i++].y2 = windY; - - seg[i].x1 = windX; - seg[i].y1 = windY - a2; - seg[i].x2 = windX; - seg[i++].y2 = windY - a1; - } - -/* - * Gather weapon display info (and maybe draw a reticle). - */ - - x = y = -1; - doWeaponDisplay(c, u, &x, &y); - -/* - * Draw a target designator around the current primary radar target. - */ - - if (c->curRadarTarget >= 0) { - - w = (int) (DESIGNATOR_SIZE * u->scaleFactor); - - VTransform(&ptbl[c->curRadarTarget].Sg, &c->XYZtoNED, &tmp1); - VReverseTransform_(&tmp1, &c->trihedral, &tmp); - -/* radar target is assumed to be ahead of us (tmp.z > 0.0) */ - - tx = (u->v->Middl.x + ((int) (tmp.y * u->v->Scale.x / tmp.x)) >> 2); - ty = (u->v->Middl.y + ((int) (tmp.z * u->v->Scale.y / tmp.x)) >> 2); - - d = sqrt((double) ((x - tx) * (x - tx) + (y - ty) * (y - ty))); - -/* - * If no LCOS reticle is was plotted or if the distance to the LCOS reticle is - * sufficient, then plot a radar target designator box. - */ - - if (x == -1 || d > w * 2.5) { - - seg[i].x1 = tx - w; - seg[i].y1 = ty - w; - seg[i].x2 = tx + w; - seg[i++].y2 = ty - w; - - seg[i].x1 = tx + w; - seg[i].y1 = ty - w; - seg[i].x2 = tx + w; - seg[i++].y2 = ty + w; - - seg[i].x1 = tx + w; - seg[i].y1 = ty + w; - seg[i].x2 = tx - w; - seg[i++].y2 = ty + w; - - seg[i].x1 = tx - w; - seg[i].y1 = ty + w; - seg[i].x2 = tx - w; - seg[i++].y2 = ty - w; - } - } - - VDrawSegments(u->v, seg, i, (unsigned short) (u->v->pixel[HUDPixel])); - - VDrawArc(u->v, u->xCenter - 2, u->yCenter - 2, 4, 4, 0, 360 * 64, - (unsigned short) (u->v->pixel[HUDPixel])); - - if (plotFPM) { - a4 = (int) (16.0 * u->scaleFactor + 0.5); - a5 = (a4 + 1) / 2; - VDrawArc(u->v, windX - a5, windY - a5, a4, a4, 0, 360 * 64, - (unsigned short) (u->v->pixel[HUDPixel])); - } - - /* u->v->w->clip.x1 = 0; - u->v->w->clip.y1 = 0; - u->v->w->clip.x2 = u->v->w->width - 1; - u->v->w->clip.y2 = u->v->w->height - 1; */ - - VSetClipRect (u->v, 0, 0, -1, -1); - - return; -} diff -Nru acm-5.0/src/imath.c acm-6.0+20200416/src/imath.c --- acm-5.0/src/imath.c 1998-05-12 03:43:04.000000000 +0000 +++ acm-6.0+20200416/src/imath.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,43 +0,0 @@ - -/* - * acm : an aerial combat simulator for X - * Copyright (C) 1991,1992 Riley Rainey - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 dated June, 1991. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. - */ -#include -#include "imath.h" - -void -VMatrixToShortMatrix(VMatrix * v, short_matrix_t * s) -{ - register int i, j; - - for (i = 0; i < 4; ++i) { - for (j = 0; j < 4; ++j) { - s->m[i][j] = (short) ((double) UNITY * v->m[i][j]); - } - } -} - -void -ShortTransform(short_point_t * a, short_matrix_t * m, short_point_t * b) -{ - b->x = (a->x * m->m[0][0] + a->y * m->m[0][1] + - a->z * m->m[0][2]) / UNITY + m->m[0][3]; - b->y = (a->x * m->m[1][0] + a->y * m->m[1][1] + - a->z * m->m[1][2]) / UNITY + m->m[1][3]; - b->z = (a->x * m->m[2][0] + a->y * m->m[2][1] + - a->z * m->m[2][2]) / UNITY + m->m[2][3]; -} diff -Nru acm-5.0/src/imath.h acm-6.0+20200416/src/imath.h --- acm-5.0/src/imath.h 1998-05-12 03:43:04.000000000 +0000 +++ acm-6.0+20200416/src/imath.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ - -/* - * acm : an aerial combat simulator for X - * Copyright (C) 1991,1992 Riley Rainey - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 dated June, 1991. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. - */ -typedef short short_fixed_t; - -typedef struct { - short_fixed_t x, y, z; -} short_point_t; - -typedef struct { - short_fixed_t m[4][4]; -} short_matrix_t; - -#define UNITY (1 << 12) diff -Nru acm-5.0/src/ImUtil.c acm-6.0+20200416/src/ImUtil.c --- acm-5.0/src/ImUtil.c 1998-08-15 03:17:01.000000000 +0000 +++ acm-6.0+20200416/src/ImUtil.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,1017 +0,0 @@ -/* $XConsortium: ImUtil.c /main/47 1996/10/22 14:19:42 kaleb $ */ -/* - -Copyright (c) 1986 X Consortium - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN -AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -Except as contained in this notice, the name of the X Consortium shall not be -used in advertising or otherwise to promote the sale, use or other dealings -in this Software without prior written authorization from the X Consortium. - -*/ - -#include -#include -#include - -#ifdef __STDC__ -#define Const const -#else -#define Const /**/ -#endif - -#if NeedFunctionPrototypes -static int _XDestroyImage(XImage *); -static unsigned long _XGetPixel(XImage *, int, int); -static unsigned long _XGetPixel1(XImage *, int, int); -static unsigned long _XGetPixel8(XImage *, int, int); -static unsigned long _XGetPixel16(XImage *, int, int); -static unsigned long _XGetPixel32(XImage *, int, int); -static int _XPutPixel(XImage *, int, int, unsigned long); -static int _XPutPixel1(XImage *, int, int, unsigned long); -static int _XPutPixel8(XImage *, int, int, unsigned long); -static int _XPutPixel16(XImage *, int, int, unsigned long); -static int _XPutPixel32(XImage *, int, int, unsigned long); -static XImage *_XSubImage(XImage *, int, int, unsigned int, unsigned int); -static int _XAddPixel(XImage *, long); -#endif - -static unsigned char Const _lomask[0x09] = { 0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff }; -static unsigned char Const _himask[0x09] = { 0xff, 0xfe, 0xfc, 0xf8, 0xf0, 0xe0, 0xc0, 0x80, 0x00 }; - -/* These two convenience routines return the scanline_pad and bits_per_pixel - associated with a specific depth of ZPixmap format image for a - display. */ - - _XGetScanlinePad(dpy, depth) - Display *dpy; - int depth; - { - register ScreenFormat *fmt = dpy->pixmap_format; - register int i; - - for (i = dpy->nformats + 1; --i; ++fmt) - if (fmt->depth == depth) - return(fmt->scanline_pad); - - return(dpy->bitmap_pad); - } - - _XGetBitsPerPixel(dpy, depth) - Display *dpy; - int depth; - { - register ScreenFormat *fmt = dpy->pixmap_format; - register int i; - - for (i = dpy->nformats + 1; --i; ++fmt) - if (fmt->depth == depth) - return(fmt->bits_per_pixel); - if (depth <= 4) - return 4; - if (depth <= 8) - return 8; - if (depth <= 16) - return 16; - return 32; - } - - -/* - * This module provides rudimentary manipulation routines for image data - * structures. The functions provided are: - * - * XCreateImage Creates a default XImage data structure - * _XDestroyImage Deletes an XImage data structure - * _XGetPixel Reads a pixel from an image data structure - * _XGetPixel32 Reads a pixel from a 32-bit Z image data structure - * _XGetPixel16 Reads a pixel from a 16-bit Z image data structure - * _XGetPixel8 Reads a pixel from an 8-bit Z image data structure - * _XGetPixel1 Reads a pixel from an 1-bit image data structure - * _XPutPixel Writes a pixel into an image data structure - * _XPutPixel32 Writes a pixel into a 32-bit Z image data structure - * _XPutPixel16 Writes a pixel into a 16-bit Z image data structure - * _XPutPixel8 Writes a pixel into an 8-bit Z image data structure - * _XPutPixel1 Writes a pixel into an 1-bit image data structure - * _XSubImage Clones a new (sub)image from an existing one - * _XSetImage Writes an image data pattern into another image - * _XAddPixel Adds a constant value to every pixel in an image - * - * The logic contained in these routines makes several assumptions about - * the image data structures, and at least for current implementations - * these assumptions are believed to be true. They are: - * - * For all formats, bits_per_pixel is less than or equal to 32. - * For XY formats, bitmap_unit is always less than or equal to bitmap_pad. - * For XY formats, bitmap_unit is 8, 16, or 32 bits. - * For Z format, bits_per_pixel is 1, 4, 8, 16, 24, or 32 bits. - */ -static void _xynormalizeimagebits (bp, img) - register unsigned char *bp; - register XImage *img; -{ - register unsigned char c; - - if (img->byte_order != img->bitmap_bit_order) { - switch (img->bitmap_unit) { - - case 16: - c = *bp; - *bp = *(bp + 1); - *(bp + 1) = c; - break; - - case 32: - c = *(bp + 3); - *(bp + 3) = *bp; - *bp = c; - c = *(bp + 2); - *(bp + 2) = *(bp + 1); - *(bp + 1) = c; - break; - } - } - if (img->bitmap_bit_order == MSBFirst) - _XReverse_Bytes (bp, img->bitmap_unit >> 3); -} - -static void _znormalizeimagebits (bp, img) - register unsigned char *bp; - register XImage *img; -{ - register unsigned char c; - switch (img->bits_per_pixel) { - - case 4: - *bp = ((*bp >> 4) & 0xF) | ((*bp << 4) & ~0xF); - break; - - case 16: - c = *bp; - *bp = *(bp + 1); - *(bp + 1) = c; - break; - - case 24: - c = *(bp + 2); - *(bp + 2) = *bp; - *bp = c; - break; - - case 32: - c = *(bp + 3); - *(bp + 3) = *bp; - *bp = c; - c = *(bp + 2); - *(bp + 2) = *(bp + 1); - *(bp + 1) = c; - break; - } -} - -static void _putbits (src, dstoffset, numbits, dst) - register char *src; /* address of source bit string */ - int dstoffset; /* bit offset into destination; range is 0-31 */ - register int numbits;/* number of bits to copy to destination */ - register char *dst; /* address of destination bit string */ -{ - register unsigned char chlo, chhi; - int hibits; - dst = dst + (dstoffset >> 3); - dstoffset = dstoffset & 7; - hibits = 8 - dstoffset; - chlo = *dst & _lomask[dstoffset]; - for (;;) { - chhi = (*src << dstoffset) & _himask[dstoffset]; - if (numbits <= hibits) { - chhi = chhi & _lomask[dstoffset + numbits]; - *dst = (*dst & _himask[dstoffset + numbits]) | chlo | chhi; - break; - } - *dst = chhi | chlo; - dst++; - numbits = numbits - hibits; - chlo = (unsigned char) (*src & _himask[hibits]) >> hibits; - src++; - if (numbits <= dstoffset) { - chlo = chlo & _lomask[numbits]; - *dst = (*dst & _himask[numbits]) | chlo; - break; - } - numbits = numbits - dstoffset; - } -} - - -/* - * Macros - * - * The ROUNDUP macro rounds up a quantity to the specified boundary, - * then truncates to bytes. - * - * The XYNORMALIZE macro determines whether XY format data requires - * normalization and calls a routine to do so if needed. The logic in - * this module is designed for LSBFirst byte and bit order, so - * normalization is done as required to present the data in this order. - * - * The ZNORMALIZE macro performs byte and nibble order normalization if - * required for Z format data. - * - * The XYINDEX macro computes the index to the starting byte (char) boundary - * for a bitmap_unit containing a pixel with coordinates x and y for image - * data in XY format. - * - * The ZINDEX macro computes the index to the starting byte (char) boundary - * for a pixel with coordinates x and y for image data in ZPixmap format. - * - */ - -#define ROUNDUP(nbytes, pad) ((((nbytes) + ((pad)-1)) / (pad)) * ((pad)>>3)) - -#define XYNORMALIZE(bp, img) \ - if ((img->byte_order == MSBFirst) || (img->bitmap_bit_order == MSBFirst)) \ - _xynormalizeimagebits((unsigned char *)(bp), img) - -#define ZNORMALIZE(bp, img) \ - if (img->byte_order == MSBFirst) \ - _znormalizeimagebits((unsigned char *)(bp), img) - -#define XYINDEX(x, y, img) \ - ((y) * img->bytes_per_line) + \ - (((x) + img->xoffset) / img->bitmap_unit) * (img->bitmap_unit >> 3) - -#define ZINDEX(x, y, img) ((y) * img->bytes_per_line) + \ - (((x) * img->bits_per_pixel) >> 3) - -/* - * This routine initializes the image object function pointers. The - * intent is to provide native (i.e. fast) routines for native format images - * only using the generic (i.e. slow) routines when fast ones don't exist. - * However, with the current rather botched external interface, clients may - * have to mung image attributes after the image gets created, so the fast - * routines always have to check to make sure the optimization is still - * valid, and reinit the functions if not. - */ -void _XInitImageFuncPtrs (image) - register XImage *image; -{ - image->f.create_image = XCreateImage; - image->f.destroy_image = _XDestroyImage; - if ((image->format == ZPixmap) && (image->bits_per_pixel == 8)) { - image->f.get_pixel = _XGetPixel8; - image->f.put_pixel = _XPutPixel8; - } else if (((image->bits_per_pixel | image->depth) == 1) && - (image->byte_order == image->bitmap_bit_order)) { - image->f.get_pixel = _XGetPixel1; - image->f.put_pixel = _XPutPixel1; - } else if ((image->format == ZPixmap) && - (image->bits_per_pixel == 32)) { - image->f.get_pixel = _XGetPixel32; - image->f.put_pixel = _XPutPixel32; - } else if ((image->format == ZPixmap) && - (image->bits_per_pixel == 16)) { - image->f.get_pixel = _XGetPixel16; - image->f.put_pixel = _XPutPixel16; - } else { - image->f.get_pixel = _XGetPixel; - image->f.put_pixel = _XPutPixel; - } - image->f.sub_image = _XSubImage; -/* image->f.set_image = _XSetImage;*/ - image->f.add_pixel = _XAddPixel; -} - -/* - * CreateImage - * - * Allocates the memory necessary for an XImage data structure. - * Initializes the structure with "default" values and returns XImage. - * - */ - -XImage *XCreateImage (dpy, visual, depth, format, offset, data, width, height, - xpad, image_bytes_per_line) - register Display *dpy; - register Visual *visual; - unsigned int depth; - int format; - int offset; /*How many pixels from the start of the data does the - picture to be transmitted start?*/ - - char *data; - unsigned int width; - unsigned int height; - int xpad; - int image_bytes_per_line; - /*How many bytes between a pixel on one line and the pixel with - the same X coordinate on the next line? 0 means - XCreateImage can calculate it.*/ -{ - register XImage *image; - int bits_per_pixel = 1; - - if (depth == 0 || depth > 32 || - (format != XYBitmap && format != XYPixmap && format != ZPixmap) || - (format == XYBitmap && depth != 1) || - (xpad != 8 && xpad != 16 && xpad != 32) || - offset < 0 || image_bytes_per_line < 0) - return (XImage *) NULL; - if ((image = (XImage *) Xcalloc(1, (unsigned) sizeof(XImage))) == NULL) - return (XImage *) NULL; - - image->width = width; - image->height = height; - image->format = format; - image->byte_order = dpy->byte_order; - image->bitmap_unit = dpy->bitmap_unit; - image->bitmap_bit_order = dpy->bitmap_bit_order; - if (visual != NULL) { - image->red_mask = visual->red_mask; - image->green_mask = visual->green_mask; - image->blue_mask = visual->blue_mask; - } - else { - image->red_mask = image->green_mask = image->blue_mask = 0; - } - if (format == ZPixmap) - { - bits_per_pixel = _XGetBitsPerPixel(dpy, (int) depth); - } - - image->xoffset = offset; - image->bitmap_pad = xpad; - image->depth = depth; - image->data = data; - /* - * compute per line accelerator. - */ - if (image_bytes_per_line == 0) - { - if (format == ZPixmap) - image->bytes_per_line = - ROUNDUP((bits_per_pixel * width), image->bitmap_pad); - else - image->bytes_per_line = - ROUNDUP((width + offset), image->bitmap_pad); - } - else image->bytes_per_line = image_bytes_per_line; - - image->bits_per_pixel = bits_per_pixel; - image->obdata = NULL; - _XInitImageFuncPtrs (image); - - return image; -} - -Status XInitImage (image) - XImage *image; -{ - if (image->depth == 0 || image->depth > 32 || - (image->format != XYBitmap && - image->format != XYPixmap && - image->format != ZPixmap) || - (image->format == XYBitmap && image->depth != 1) || - (image->bitmap_pad != 8 && - image->bitmap_pad != 16 && - image->bitmap_pad != 32) || - image->xoffset < 0 || image->bytes_per_line < 0) - return 0; - - /* - * compute per line accelerator. - */ - if (image->bytes_per_line == 0) - { - if (image->format == ZPixmap) - image->bytes_per_line = - ROUNDUP((image->bits_per_pixel * image->width), - image->bitmap_pad); - else - image->bytes_per_line = - ROUNDUP((image->width + image->xoffset), image->bitmap_pad); - } - - _XInitImageFuncPtrs (image); - - return 1; -} - -/* - * _DestroyImage - * - * Deallocates the memory associated with the ximage data structure. - * this version handles the case of the image data being malloc'd - * entirely by the library. - */ - -static int _XDestroyImage (ximage) - XImage *ximage; - -{ - if (ximage->data != NULL) Xfree((char *)ximage->data); - if (ximage->obdata != NULL) Xfree((char *)ximage->obdata); - Xfree((char *)ximage); - return 1; -} - - -/* - * GetPixel - * - * Returns the specified pixel. The X and Y coordinates are relative to - * the origin (upper left [0,0]) of the image. The pixel value is returned - * in normalized format, i.e. the LSB of the long is the LSB of the pixel. - * The algorithm used is: - * - * copy the source bitmap_unit or Zpixel into temp - * normalize temp if needed - * extract the pixel bits into return value - * - */ - -static unsigned long Const low_bits_table[] = { - 0x00000000, 0x00000001, 0x00000003, 0x00000007, - 0x0000000f, 0x0000001f, 0x0000003f, 0x0000007f, - 0x000000ff, 0x000001ff, 0x000003ff, 0x000007ff, - 0x00000fff, 0x00001fff, 0x00003fff, 0x00007fff, - 0x0000ffff, 0x0001ffff, 0x0003ffff, 0x0007ffff, - 0x000fffff, 0x001fffff, 0x003fffff, 0x007fffff, - 0x00ffffff, 0x01ffffff, 0x03ffffff, 0x07ffffff, - 0x0fffffff, 0x1fffffff, 0x3fffffff, 0x7fffffff, - 0xffffffff -}; - -static unsigned long _XGetPixel (ximage, x, y) - register XImage *ximage; - int x; - int y; - -{ - unsigned long pixel, px; - register char *src; - register char *dst; - register int i, j; - int bits, nbytes; - long plane; - - if ((ximage->bits_per_pixel | ximage->depth) == 1) { - src = &ximage->data[XYINDEX(x, y, ximage)]; - dst = (char *)&pixel; - pixel = 0; - for (i = ximage->bitmap_unit >> 3; --i >= 0; ) *dst++ = *src++; - XYNORMALIZE(&pixel, ximage); - bits = (x + ximage->xoffset) % ximage->bitmap_unit; - pixel = ((((char *)&pixel)[bits>>3])>>(bits&7)) & 1; - } else if (ximage->format == XYPixmap) { - pixel = 0; - plane = 0; - nbytes = ximage->bitmap_unit >> 3; - for (i = ximage->depth; --i >= 0; ) { - src = &ximage->data[XYINDEX(x, y, ximage)+ plane]; - dst = (char *)&px; - px = 0; - for (j = nbytes; --j >= 0; ) *dst++ = *src++; - XYNORMALIZE(&px, ximage); - bits = (x + ximage->xoffset) % ximage->bitmap_unit; - pixel = (pixel << 1) | - (((((char *)&px)[bits>>3])>>(bits&7)) & 1); - plane = plane + (ximage->bytes_per_line * ximage->height); - } - } else if (ximage->format == ZPixmap) { - src = &ximage->data[ZINDEX(x, y, ximage)]; - dst = (char *)&px; - px = 0; - for (i = (ximage->bits_per_pixel + 7) >> 3; --i >= 0; ) - *dst++ = *src++; - ZNORMALIZE(&px, ximage); - pixel = 0; - for (i=sizeof(unsigned long); --i >= 0; ) - pixel = (pixel << 8) | ((unsigned char *)&px)[i]; - if (ximage->bits_per_pixel == 4) { - if (x & 1) - pixel >>= 4; - else - pixel &= 0xf; - } - } else { - return 0; /* bad image */ - } - if (ximage->bits_per_pixel == ximage->depth) - return pixel; - else - return (pixel & low_bits_table[ximage->depth]); -} - -#ifndef WORD64 -static unsigned long byteorderpixel = MSBFirst << 24; -#endif - -static unsigned long _XGetPixel32 (ximage, x, y) - register XImage *ximage; - int x; - int y; -{ - register unsigned char *addr; - unsigned long pixel; - - if ((ximage->format == ZPixmap) && (ximage->bits_per_pixel == 32)) { - addr = &((unsigned char *)ximage->data) - [y * ximage->bytes_per_line + (x << 2)]; -#ifndef WORD64 - if (*((char *)&byteorderpixel) == ximage->byte_order) - pixel = *((CARD32 *)addr); - else -#endif - if (ximage->byte_order == MSBFirst) - pixel = ((unsigned long)addr[0] << 24 | - (unsigned long)addr[1] << 16 | - (unsigned long)addr[2] << 8 | - addr[3]); - else - pixel = ((unsigned long)addr[3] << 24 | - (unsigned long)addr[2] << 16 | - (unsigned long)addr[1] << 8 | - addr[0]); - if (ximage->depth != 32) - pixel &= low_bits_table[ximage->depth]; - return pixel; - } else { - _XInitImageFuncPtrs(ximage); - return XGetPixel(ximage, x, y); - } -} - -static unsigned long _XGetPixel16 (ximage, x, y) - register XImage *ximage; - int x; - int y; -{ - register unsigned char *addr; - unsigned long pixel; - - if ((ximage->format == ZPixmap) && (ximage->bits_per_pixel == 16)) { - addr = &((unsigned char *)ximage->data) - [y * ximage->bytes_per_line + (x << 1)]; - if (ximage->byte_order == MSBFirst) - pixel = addr[0] << 8 | addr[1]; - else - pixel = addr[1] << 8 | addr[0]; - if (ximage->depth != 16) - pixel &= low_bits_table[ximage->depth]; - return pixel; - } else { - _XInitImageFuncPtrs(ximage); - return XGetPixel(ximage, x, y); - } -} - -static unsigned long _XGetPixel8 (ximage, x, y) - register XImage *ximage; - int x; - int y; -{ - unsigned char pixel; - - if ((ximage->format == ZPixmap) && (ximage->bits_per_pixel == 8)) { - pixel = ((unsigned char *)ximage->data) - [y * ximage->bytes_per_line + x]; - if (ximage->depth != 8) - pixel &= low_bits_table[ximage->depth]; - return pixel; - } else { - _XInitImageFuncPtrs(ximage); - return XGetPixel(ximage, x, y); - } -} - -static unsigned long _XGetPixel1 (ximage, x, y) - register XImage *ximage; - int x; - int y; -{ - unsigned char bit; - int xoff, yoff; - - if (((ximage->bits_per_pixel | ximage->depth) == 1) && - (ximage->byte_order == ximage->bitmap_bit_order)) { - xoff = x + ximage->xoffset; - yoff = y * ximage->bytes_per_line + (xoff >> 3); - xoff &= 7; - if (ximage->bitmap_bit_order == MSBFirst) - bit = 0x80 >> xoff; - else - bit = 1 << xoff; - return (ximage->data[yoff] & bit) ? 1 : 0; - } else { - _XInitImageFuncPtrs(ximage); - return XGetPixel(ximage, x, y); - } -} - -/* - * PutPixel - * - * Overwrites the specified pixel. The X and Y coordinates are relative to - * the origin (upper left [0,0]) of the image. The input pixel value must be - * in normalized format, i.e. the LSB of the long is the LSB of the pixel. - * The algorithm used is: - * - * copy the destination bitmap_unit or Zpixel to temp - * normalize temp if needed - * copy the pixel bits into the temp - * renormalize temp if needed - * copy the temp back into the destination image data - * - */ - -static int _XPutPixel (ximage, x, y, pixel) - register XImage *ximage; - int x; - int y; - unsigned long pixel; - -{ - unsigned long px, npixel; - register char *src; - register char *dst; - register int i; - int j, nbytes; - long plane; - - if (ximage->depth == 4) - pixel &= 0xf; - npixel = pixel; - for (i=0, px=pixel; i>=8) - ((unsigned char *)&pixel)[i] = px; - if ((ximage->bits_per_pixel | ximage->depth) == 1) { - src = &ximage->data[XYINDEX(x, y, ximage)]; - dst = (char *)&px; - px = 0; - nbytes = ximage->bitmap_unit >> 3; - for (i = nbytes; --i >= 0; ) *dst++ = *src++; - XYNORMALIZE(&px, ximage); - i = ((x + ximage->xoffset) % ximage->bitmap_unit); - _putbits ((char *)&pixel, i, 1, (char *)&px); - XYNORMALIZE(&px, ximage); - src = (char *) &px; - dst = &ximage->data[XYINDEX(x, y, ximage)]; - for (i = nbytes; --i >= 0; ) *dst++ = *src++; - } else if (ximage->format == XYPixmap) { - plane = (ximage->bytes_per_line * ximage->height) * - (ximage->depth - 1); /* do least signif plane 1st */ - nbytes = ximage->bitmap_unit >> 3; - for (j = ximage->depth; --j >= 0; ) { - src = &ximage->data[XYINDEX(x, y, ximage) + plane]; - dst = (char *) &px; - px = 0; - for (i = nbytes; --i >= 0; ) *dst++ = *src++; - XYNORMALIZE(&px, ximage); - i = ((x + ximage->xoffset) % ximage->bitmap_unit); - _putbits ((char *)&pixel, i, 1, (char *)&px); - XYNORMALIZE(&px, ximage); - src = (char *)&px; - dst = &ximage->data[XYINDEX(x, y, ximage) + plane]; - for (i = nbytes; --i >= 0; ) *dst++ = *src++; - npixel = npixel >> 1; - for (i=0, px=npixel; i>=8) - ((unsigned char *)&pixel)[i] = px; - plane = plane - (ximage->bytes_per_line * ximage->height); - } - } else if (ximage->format == ZPixmap) { - src = &ximage->data[ZINDEX(x, y, ximage)]; - dst = (char *)&px; - px = 0; - nbytes = (ximage->bits_per_pixel + 7) >> 3; - for (i = nbytes; --i >= 0; ) *dst++ = *src++; - ZNORMALIZE(&px, ximage); - _putbits ((char *)&pixel, - (x * ximage->bits_per_pixel) & 7, - ximage->bits_per_pixel, (char *)&px); - ZNORMALIZE(&px, ximage); - src = (char *)&px; - dst = &ximage->data[ZINDEX(x, y, ximage)]; - for (i = nbytes; --i >= 0; ) *dst++ = *src++; - } else { - return 0; /* bad image */ - } - return 1; -} - -static int _XPutPixel32 (ximage, x, y, pixel) - register XImage *ximage; - int x; - int y; - unsigned long pixel; -{ - unsigned char *addr; - - if ((ximage->format == ZPixmap) && (ximage->bits_per_pixel == 32)) { - addr = &((unsigned char *)ximage->data) - [y * ximage->bytes_per_line + (x << 2)]; -#ifndef WORD64 - if (*((char *)&byteorderpixel) == ximage->byte_order) - *((CARD32 *)addr) = pixel; - else -#endif - if (ximage->byte_order == MSBFirst) { - addr[0] = pixel >> 24; - addr[1] = pixel >> 16; - addr[2] = pixel >> 8; - addr[3] = pixel; - } else { - addr[3] = pixel >> 24; - addr[2] = pixel >> 16; - addr[1] = pixel >> 8; - addr[0] = pixel; - } - return 1; - } else { - _XInitImageFuncPtrs(ximage); - return XPutPixel(ximage, x, y, pixel); - } -} - -static int _XPutPixel16 (ximage, x, y, pixel) - register XImage *ximage; - int x; - int y; - unsigned long pixel; -{ - unsigned char *addr; - - if ((ximage->format == ZPixmap) && (ximage->bits_per_pixel == 16)) { - addr = &((unsigned char *)ximage->data) - [y * ximage->bytes_per_line + (x << 1)]; - if (ximage->byte_order == MSBFirst) { - addr[0] = pixel >> 8; - addr[1] = pixel; - } else { - addr[1] = pixel >> 8; - addr[0] = pixel; - } - return 1; - } else { - _XInitImageFuncPtrs(ximage); - return XPutPixel(ximage, x, y, pixel); - } -} - -static int _XPutPixel8 (ximage, x, y, pixel) - register XImage *ximage; - int x; - int y; - unsigned long pixel; -{ - if ((ximage->format == ZPixmap) && (ximage->bits_per_pixel == 8)) { - ximage->data[y * ximage->bytes_per_line + x] = pixel; - return 1; - } else { - _XInitImageFuncPtrs(ximage); - return XPutPixel(ximage, x, y, pixel); - } -} - -static int _XPutPixel1 (ximage, x, y, pixel) - register XImage *ximage; - int x; - int y; - unsigned long pixel; -{ - unsigned char bit; - int xoff, yoff; - - if (((ximage->bits_per_pixel | ximage->depth) == 1) && - (ximage->byte_order == ximage->bitmap_bit_order)) { - xoff = x + ximage->xoffset; - yoff = y * ximage->bytes_per_line + (xoff >> 3); - xoff &= 7; - if (ximage->bitmap_bit_order == MSBFirst) - bit = 0x80 >> xoff; - else - bit = 1 << xoff; - if (pixel & 1) - ximage->data[yoff] |= bit; - else - ximage->data[yoff] &= ~bit; - return 1; - } else { - _XInitImageFuncPtrs(ximage); - return XPutPixel(ximage, x, y, pixel); - } -} - -/* - * SubImage - * - * Creates a new image that is a subsection of an existing one. - * Allocates the memory necessary for the new XImage data structure. - * Pointer to new image is returned. The algorithm used is repetitive - * calls to get and put pixel. - * - */ - -static XImage *_XSubImage (ximage, x, y, width, height) - XImage *ximage; - register int x; /* starting x coordinate in existing image */ - register int y; /* starting y coordinate in existing image */ - unsigned int width; /* width in pixels of new subimage */ - unsigned int height;/* height in pixels of new subimage */ - -{ - register XImage *subimage; - int dsize; - register int row, col; - register unsigned long pixel; - char *data; - - if ((subimage = (XImage *) Xcalloc (1, sizeof (XImage))) == NULL) - return (XImage *) NULL; - subimage->width = width; - subimage->height = height; - subimage->xoffset = 0; - subimage->format = ximage->format; - subimage->byte_order = ximage->byte_order; - subimage->bitmap_unit = ximage->bitmap_unit; - subimage->bitmap_bit_order = ximage->bitmap_bit_order; - subimage->bitmap_pad = ximage->bitmap_pad; - subimage->bits_per_pixel = ximage->bits_per_pixel; - subimage->depth = ximage->depth; - /* - * compute per line accelerator. - */ - if (subimage->format == ZPixmap) - subimage->bytes_per_line = - ROUNDUP(subimage->bits_per_pixel * width, - subimage->bitmap_pad); - else - subimage->bytes_per_line = - ROUNDUP(width, subimage->bitmap_pad); - subimage->obdata = NULL; - _XInitImageFuncPtrs (subimage); - dsize = subimage->bytes_per_line * height; - if (subimage->format == XYPixmap) dsize = dsize * subimage->depth; - if (((data = Xcalloc (1, (unsigned) dsize)) == NULL) && (dsize > 0)) { - Xfree((char *) subimage); - return (XImage *) NULL; - } - subimage->data = data; - - /* - * Test for cases where the new subimage is larger than the region - * that we are copying from the existing data. In those cases, - * copy the area of the existing image, and allow the "uncovered" - * area of new subimage to remain with zero filled pixels. - */ - if (height > ximage->height - y ) height = ximage->height - y; - if (width > ximage->width - x ) width = ximage->width - x; - - for (row = y; row < (y + height); row++) { - for (col = x; col < (x + width); col++) { - pixel = XGetPixel(ximage, col, row); - XPutPixel(subimage, (col - x), (row - y), pixel); - } - } - return subimage; -} - - -/* - * SetImage - * - * Overwrites a section of one image with all of the data from another. - * If the two images are not of the same format (i.e. XYPixmap and ZPixmap), - * the image data is converted to the destination format. The following - * restrictions apply: - * - * 1. The depths of the source and destination images must be equal. - * - * 2. If the height of the source image is too large to fit between - * the specified y starting point and the bottom of the image, - * then scanlines are truncated on the bottom. - * - * 3. If the width of the source image is too large to fit between - * the specified x starting point and the end of the scanline, - * then pixels are truncated on the right. - * - * The images need not have the same bitmap_bit_order, byte_order, - * bitmap_unit, bits_per_pixel, bitmap_pad, or xoffset. - * - */ - -int _XSetImage (srcimg, dstimg, x, y) - XImage *srcimg; - register XImage *dstimg; - register int x; - register int y; - -{ - register unsigned long pixel; - register int row, col; - int width, height, startrow, startcol; - if (x < 0) { - startcol = -x; - x = 0; - } else - startcol = 0; - if (y < 0) { - startrow = -y; - y = 0; - } else - startrow = 0; - width = dstimg->width - x; - if (srcimg->width < width) - width = srcimg->width; - height = dstimg->height - y; - if (srcimg->height < height) - height = srcimg->height; - - /* this is slow, will do better later */ - for (row = startrow; row < height; row++) { - for (col = startcol; col < width; col++) { - pixel = XGetPixel(srcimg, col, row); - XPutPixel(dstimg, x + col, y + row, pixel); - } - } - return 1; -} - -/* - * AddPixel - * - * Adds a constant value to every pixel in a pixmap. - * - */ - -static _XAddPixel (ximage, value) - register XImage *ximage; - register long value; -{ - register int x; - register int y; - - if (!value) - return 0; - if ((ximage->bits_per_pixel | ximage->depth) == 1) { - /* The only value that we can add here to an XYBitmap - * is one. Since 1 + value = ~value for one bit wide - * data, we do this quickly by taking the ones complement - * of the entire bitmap data (offset and pad included!). - * Note that we don't need to be concerned with bit or - * byte order at all. - */ - register unsigned char *dp = (unsigned char *) ximage->data; - x = ximage->bytes_per_line * ximage->height; - while (--x >= 0) { - *dp = ~*dp; - dp++; - } - } else if ((ximage->format == ZPixmap) && - (ximage->bits_per_pixel == 8)) { - register unsigned char *dp = (unsigned char *) ximage->data; - x = ximage->bytes_per_line * ximage->height; - while (--x >= 0) - *dp++ += value; -#ifndef WORD64 - } else if ((ximage->format == ZPixmap) && - (ximage->bits_per_pixel == 16) && - (*((char *)&byteorderpixel) == ximage->byte_order)) { - register unsigned short *dp = (unsigned short *) ximage->data; - x = (ximage->bytes_per_line >> 1) * ximage->height; - while (--x >= 0) - *dp++ += value; - } else if ((ximage->format == ZPixmap) && - (ximage->bits_per_pixel == 32) && - (*((char *)&byteorderpixel) == ximage->byte_order)) { - register CARD32 *dp = (CARD32 *) ximage->data; - x = (ximage->bytes_per_line >> 2) * ximage->height; - while (--x >= 0) - *dp++ += value; -#endif - } else { - for (y = ximage->height; --y >= 0; ) { - for (x = ximage->width; --x >= 0; ) { - register unsigned long pixel = XGetPixel(ximage, x, y); - pixel = pixel + value; - XPutPixel(ximage, x, y, pixel); - } - } - } - return 0; -} - diff -Nru acm-5.0/src/init.c acm-6.0+20200416/src/init.c --- acm-5.0/src/init.c 1998-12-09 21:53:13.000000000 +0000 +++ acm-6.0+20200416/src/init.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,721 +0,0 @@ -/* - * acm : an aerial combat simulator for X - * Copyright (C) 1991-1998 Riley Rainey - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 dated June, 1991. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. - */ - -#ifndef WIN32 -#include -#endif -#include -#include - -#include "pm.h" -#include "alarm.h" - -extern craftType *newCraft (void); -extern int compileAircraftInventory (void); -extern void initaim9 (void), initm61a1 (void), initmk82(void), initaim120(void); -extern void buildExplosion (void); -extern void placeObject (); -extern void InitNavaidSystem (); -extern void DMECheckAlarm (char *arg1, char *arg2); -extern void resupplyCheck (char *arg1, char *arg2); -extern void acm_srand PARAMS ((int seed)); -extern void addAltitudeEntry (WorldCoordinates * w); -extern int AddNavaid (char *ident, char *type, WorldCoordinates * w, - char *magvar, double freq); -extern int AddILS (char *ident, char *type, WorldCoordinates * w, - WorldCoordinates * gsw, char *magvar, double freq, double loc_width, - double loc_bearing, double gs_angle); - -/* - * Defined in doViews.c : - */ - -extern VPolygon **poly; -extern long polyCount; - -void undersampleObject (VObject * obj, int rate); - -static char *errmsg = "Sorry, I cannot find the file %s in ../objects/, %s or %s\n"; - -extern void - AddRunway (VMatrix * RWYtoXYZ, double length, double width, int flags, - VPolygon *** poly, int *poly_count); - -/* - * acm_fopen : Open an important acm data file (or die trying). - */ - -char _acm_fopen_library_dir[2048]; - -FILE * -acm_fopen(char *name, char *access) -{ - - FILE *f; - char libname[256]; - - if ((f = fopen(name, access)) == (FILE *) NULL) { - strcpy(libname, "../objects/"); - strcat(libname, name); - if ((f = fopen(libname, access)) == (FILE *) NULL) { - strcpy(libname, _acm_fopen_library_dir); - strcat(libname, name); - if ((f = fopen(libname, access)) == (FILE *) NULL) { - strcpy (libname, SRCDIR); - strcat (libname, "/../objects/"); - strcat (libname, name); - if ((f = fopen(libname, access)) == (FILE *) NULL) { - fprintf(stderr, errmsg, name, _acm_fopen_library_dir, libname); - exit(1); - } - } - } - } - - return f; -} - -/* - * acm_find_file : Find an important acm data file (or die trying). - */ - -char * -acm_find_file(char *name) -{ - static char pname[1024]; - struct stat statbuf; - - strcpy(pname, name); - if (stat(name, &statbuf) != 0) { - strcpy(pname, "../objects/"); - strcat(pname, name); - if (stat(pname, &statbuf) != 0) { - strcpy(pname, _acm_fopen_library_dir); - strcat(pname, name); - if (stat(pname, &statbuf) != 0) { - fprintf(stderr, errmsg, name, _acm_fopen_library_dir); - exit(1); - } - } - } - - return pname; -} - -enum state_t { - SKIPPING_SPACES, - ARGUMENT -}; - -int -split (char *s, int *argc, char *argv[]) -{ - int done = 0; - enum state_t state = SKIPPING_SPACES; - - *argc = 0; - - for (; done == 0; ++s) { - - switch (state) { - - case SKIPPING_SPACES: - if (isspace (*s)) { - } - else if (isascii (*s)) { - argv[*argc] = s; - (*argc)++; - state = ARGUMENT; - } - else if (*s == '\0') { - done = 1; - } - break; - - case ARGUMENT: - if (isspace (*s)) { - *s = '\0'; - state = SKIPPING_SPACES; - } - else if (*s == '\0') { - *s = '\0'; - done = 1; - } - } - } - return 0; -} - -/* - * readScene : Process the scene description file, returns zero if successful - * or -1 otherwise. - */ - -int -readScene (char *ground, int len) -{ - FILE *f, *f1; - char file[256], *name, *filep; - char *argv[32], line[1024]; - char lat[64], lon[64], lat_lon[64]; - double z, heading, freq, mag, length, width; - int s, i = 0, j, undersample, depthcue, argc; - craftType *c; - extern char *sceneFile; /* from server.c */ - VPoint scale, down, local_fwd, local_right, local_down; - int done = 0; - WorldCoordinates w, w1, w2, gsw; - dis_world_coordinates xyz, xyz1; - double loc_width, loc_bearing, gs_angle; - VObject *object = NULL; - VPolygon **rpoly; - int rpoly_count; - VMatrix RWYtoXYZ, XYZtoNED; - - /* initialize list of active viewers -- null list */ - - vl_head = vl_tail = NULL; - vl_count = 0; - - rpoly = NULL; - rpoly_count = 0; - - name = (sceneFile) ? sceneFile : "default-scene"; - - /* - * The units used in the objects we've created ate expressed in FEET. - * Internally, graphics objects should be METERS. - */ - - scale.x = scale.y = scale.z = FEETtoMETERS (1.0); - VSetReadObjectScale (&scale); - - f = acm_fopen (name, "r"); - - fscanf (f, "%s %s %lf %lf", lat, lon, &z, &heading); -#ifdef FLAT_WORLD - teamLoc[1].x = x * NM; - teamLoc[1].y = y * NM; - teamLoc[1].z = z; -#else - strcat (lat, lon); - DISStringToLatLong (lat, &teamLatLon[1]); - teamLatLon[1].z = FEETtoMETERS (z); -#endif - teamHeading[1] = DEGtoRAD (heading); - - fscanf (f, "%s %s %lf %lf", lat, lon, &z, &heading); -#ifdef FLAT_WORLD - teamLoc[2].x = x * NM; - teamLoc[2].y = y * NM; - teamLoc[2].z = z; -#else - strcat (lat, lon); - DISStringToLatLong (lat, &teamLatLon[2]); - teamLatLon[2].z = FEETtoMETERS (z); -#endif - teamHeading[2] = DEGtoRAD (heading); - - /* - * Get the ground color (the first call to fgets() gets us to a new line). - */ - - ground[0] = '\0'; - if (fgets (ground, len, f) == (char *) NULL) { - return -1; - } - if (fgets (ground, len, f) == (char *) NULL) { - return -1; - } - len = strlen (ground); - if (len > 0 && ground[len - 1] == '\n') { - ground[len - 1] = '\0'; - if (len > 0 && ground[len - 2] == '\r') { - ground[len - 2] = '\0'; - } - } - - /* - * Now get the NAVAID and runway records - */ - - fgets (line, sizeof (line), f); - done = 0; - while (done == 0) { - len = strlen (line); - if (len > 0 && line[len - 1] == '\n') { - line[len - 1] = '\0'; - } - split (line, &argc, argv); - - /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* - * - * RWY : Runway record - * - *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ - - if (strcmp (argv[0], "RWY") == 0) { - - /* - * Parse Latitude/Longitude of both runway ends - */ - length = FEETtoMETERS (atoi (argv[4])); - width = FEETtoMETERS (atoi (argv[5])); - - strcpy (lat_lon, argv[6]); - strcat (lat_lon, argv[7]); - DISStringToLatLong (lat_lon, &w); - w.z = FEETtoMETERS (atoi (argv[3])); - - addAltitudeEntry (&w); - - strcpy (lat_lon, argv[8]); - strcat (lat_lon, argv[9]); - DISStringToLatLong (lat_lon, &w1); - w1.z = w.z; - - DISWorldCoordinatesToGeocentric (&w, - (dis_world_coordinates *) & xyz); - mag = sqrt (xyz.x * xyz.x + xyz.y * xyz.y + xyz.z * xyz.z); - - DISWorldCoordinatesToGeocentric (&w1, - (dis_world_coordinates *) & xyz1); - - /* - * Average those two points to generate a midpoint that will be the - * origin of a runway coordinate system. - */ - - local_fwd.x = xyz1.x - xyz.x; - local_fwd.y = xyz1.y - xyz.y; - local_fwd.z = xyz1.z - xyz.z; - - xyz.x = (xyz.x + xyz1.x) / 2.0; - xyz.y = (xyz.y + xyz1.y) / 2.0; - xyz.z = (xyz.z + xyz1.z) / 2.0; - - DISGeocentricToWorldCoordinates (&xyz, &w2); - GenerateWorldToLocalMatrix (&w2, &XYZtoNED); - down.z = 1.0; - down.x = down.y = 0.0; - VReverseTransform_ (&down, &XYZtoNED, &local_down); - - mag = sqrt ( - local_fwd.x * local_fwd.x + - local_fwd.y * local_fwd.y + - local_fwd.z * local_fwd.z - ); - local_fwd.x /= mag; - local_fwd.y /= mag; - local_fwd.z /= mag; - - /* - * A basic property of Cross Products: k x i = j - */ - - VCrossProd (&local_down, &local_fwd, &local_right); - - /* - * Generate a transformation matrix to get from "runway" coordinates to - * Geocentric. - */ - VIdentMatrix (&RWYtoXYZ); - - RWYtoXYZ.m[0][0] = local_fwd.x; - RWYtoXYZ.m[1][0] = local_fwd.y; - RWYtoXYZ.m[2][0] = local_fwd.z; - - RWYtoXYZ.m[0][1] = local_right.x; - RWYtoXYZ.m[1][1] = local_right.y; - RWYtoXYZ.m[2][1] = local_right.z; - - RWYtoXYZ.m[0][2] = local_down.x; - RWYtoXYZ.m[1][2] = local_down.y; - RWYtoXYZ.m[2][2] = local_down.z; - - RWYtoXYZ.m[0][3] = xyz.x; - RWYtoXYZ.m[1][3] = xyz.y; - RWYtoXYZ.m[2][3] = xyz.z; - - /* - * AddRunway will return rpoly_count indicating the number of polygons - * that were generated. rpoly is a malloc'ed vector of pointers to - * the polygons. - */ - - AddRunway (&RWYtoXYZ, length, width, 0, - &rpoly, &rpoly_count); - - /* - * optimize a bit here and put all the - * runways for a given airport in the same object ... - * object->name is the identifier of the current airport. - */ - - if ((object != NULL) && (strcmp (object->name, argv[1]) == 0)) { - - /* - * New runway at same airport as last .. add a polygon to the last object. - */ - - object->polygon = (VPolygon **) realloc ( - object->polygon, - sizeof (VPolygon *) * (object->numPolys + rpoly_count)); - if (!object->polygon) { - printf ("memory allocation error\n"); - exit (1); - } - for (j = 0; j < rpoly_count; ++j) { - object->polygon[object->numPolys + j] = rpoly[j]; - } - object->numPolys += rpoly_count; - free (rpoly); - rpoly_count = 0; - VComputeObjectExtent (object); - } - else { - - /* - * New airport. New object and craftInfo. - */ - object = (VObject *) Vmalloc (sizeof (VObject)); - memset (object, 0, sizeof (VObject)); - object->name = strdup (argv[1]); - object->numPolys = rpoly_count; - object->polygon = rpoly; - object->order = (unsigned short *) NULL; - - VComputeObjectExtent (object); - - stbl[i].type = CT_SURFACE; - stbl[i].flags = FL_FIXED_OBJECT; - stbl[i].cinfo = newCraft (); - if (! stbl[i].cinfo) { - fprintf (stderr, "Out of craft types while loading scene.\n"); - exit(1); - } - stbl[i].cinfo->name = strdup (argv[1]); - stbl[i].cinfo->object = object; - stbl[i].cinfo->placeProc = NULL; - stbl[i].curHeading = stbl[i].curPitch = stbl[i].curRoll = 0.0; - stbl[i].Sg.x = stbl[i].Sg.y = stbl[i].Sg.z = 0.0; - if (++i == MAXSURFACE) { - fprintf (stderr, - "Only the first %d surface objects will be displayed.\n", - MAXSURFACE); - i = MAXSURFACE - 1; - } - } - } - - /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* - * - * NAV: NAVAID record - * - *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ - - else if (strcmp (argv[0], "NAV") == 0) { - - /* - * Parse Latitude/Longitude - */ - - strcpy (lat_lon, argv[3]); - strcat (lat_lon, argv[4]); - DISStringToLatLong (lat_lon, &w); - w.z = FEETtoMETERS (atoi (argv[5])); - freq = strtod (argv[7], (char **) NULL); - - AddNavaid (argv[1], argv[2], &w, argv[6], freq); - } - - /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* - * - * ILS : Instrument Landing System record - * - *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ - - else if (strcmp (argv[0], "ILS") == 0) { - - /* - * Parse Latitude/Longitude of localizer transmitter - */ - - strcpy (lat_lon, argv[5]); - strcat (lat_lon, argv[6]); - DISStringToLatLong (lat_lon, &w); - w.z = FEETtoMETERS (atoi (argv[9])); - - /* - * Is Glide Slope transmitter information present? - */ - - if (strcmp (argv[7], "-") != 0) { - strcpy (lat_lon, argv[7]); - strcat (lat_lon, argv[8]); - DISStringToLatLong (lat_lon, &gsw); - gsw.z = w.z; - } - freq = strtod (argv[4], (char **) NULL); - loc_width = strtod (argv[11], (char **) NULL); - loc_bearing = strtod (argv[12], (char **) NULL); - gs_angle = strtod (argv[13], (char **) NULL); - - AddILS (argv[3], argv[2], &w, &gsw, argv[10], freq, - loc_width, loc_bearing, gs_angle); - } - else if (strcmp (argv[0], "FEATURES") == 0) { - done = 1; - } - if (done == 0) { - fgets (line, sizeof (line), f); - } - } - - /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* - * - * Now the simple terrain/man-made features - * - *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ - - while (s = fscanf (f, "%s %s %s %lf %lf", - file, lat, lon, &z, &heading) == 5) { - - depthcue = 1; - - if (file[0] == '@') { - filep = &file[1]; - undersample = 1; - } - else if (file[0] == '+') { - filep = &file[1]; - depthcue = 0; - } - else { - filep = file; - undersample = 0; - } - stbl[i].type = CT_SURFACE; - if ((c = lookupCraft (filep))) { - stbl[i].cinfo = c; - } - else { - char *p = strrchr (filep, '.'); - - f1 = acm_fopen (filep, "r"); - stbl[i].cinfo = newCraft (); - stbl[i].cinfo->name = strdup (filep); - stbl[i].cinfo->object = NULL; - if (p != NULL && (strcmp (p, ".dxf") == 0 || - strcmp (p, ".DXF") == 0)) { - stbl[i].cinfo->object = VReadDepthCueuedDXFObject (f1, - depthcue); - } - else { - stbl[i].cinfo->object = VReadDepthCueuedObject (f1, - depthcue); - } - - if (!stbl[i].cinfo->object) { - fprintf (stderr, - "Error reading object %s\n", filep); - exit (1); - } - if (undersample) { - undersampleObject (stbl[i].cinfo->object, 3); - } - fclose (f1); - } -#ifdef FLAT_WORLD - stbl[i].Sg.x = x * NM; - stbl[i].Sg.y = y * NM; - stbl[i].Sg.z = z; -#else - strcat (lat, lon); - DISStringToLatLong (lat, &stbl[i].w); - stbl[i].w.z = FEETtoMETERS (z); - DISWorldCoordinatesToGeocentric (&stbl[i].w, - (dis_world_coordinates *) & stbl[i].Sg); -#endif - stbl[i].curHeading = DEGtoRAD (heading); - stbl[i].curPitch = stbl[i].curRoll = 0.0; - if (++i == MAXSURFACE) { - fprintf (stderr, - "Only the first %d surface objects will be displayed.\n", - MAXSURFACE); - fclose (f); - return 0; - } - } - fclose (f); - return (s == EOF || s == 0) ? 0 : -1; -} - -/* - * undersampleObject - * - * Remove some of the detail in an object to reduce the CPU overhead - * of transforming and clipping it. - */ - -void -undersampleObject (VObject * obj, int rate) -{ - int i, j, k; - - k = 0; - - for (i = 1; i < obj->numPolys; ++i) { - for (j = 0; j < obj->polygon[i]->numVtces; j += rate) { - obj->polygon[i]->vertex[k++] = - obj->polygon[i]->vertex[j]; - } - obj->polygon[i]->numVtces = k; - } -} - -/* - * init : Set up the acm server - */ - -int -init (const char *runtime_directory) -{ - int i; - craft *p; - alarm_id_t id; - char ground[256]; - - if (runtime_directory != NULL) { - strcpy (_acm_fopen_library_dir, runtime_directory); - } - - polyCount = 32768; - poly = (VPolygon **) Vmalloc (sizeof (VPolygon *) * polyCount); - - cbase = -CLOUD_BASE; - ctop = -CLOUD_TOP; - - /* - * VSetDepthCue() must be called before calling VSetVisibility(). - */ - - VSetDepthCue (VAllocColor ("#A6BBCD"), depth_cue_steps); - VSetVisibility (visibility); - - for ((i = 0, p = stbl); i < MAXSURFACE; (++i, ++p)) - p->type = CT_FREE; - - for ((i = 0, p = ptbl); i < MAXPLAYERS; (++i, ++p)) { - p->pIndex = i; - p->type = CT_FREE; - } - - for ((i = 0, p = mtbl); i < MAXPROJECTILES; (++i, ++p)) { - p->pIndex = i; - p->type = CT_FREE; - } - - acm_srand ((int) time (0)); - - HUDColor = VAllocColor ("white"); - whiteColor = VAllocColor ("white"); - blackColor = VAllocColor ("black"); - radarColor = VAllocColor ("#0c0"); - HSIMagentaColor = VAllocColor ("magenta"); - radarBackgroundColor = VAllocColor ("#094200"); - cloudColor = VAllocDepthCueuedColor ("#ccc", 1); - - buildExplosion (); - - /* - * Set up the scene - */ - - if (readScene (ground, sizeof (ground)) != 0) { - fprintf (stderr, "Fatal error\n"); - exit (1); - } - - groundColor = VAllocDepthCueuedColor (ground, 1); - - /* - * Compile the aircraft inventory, DIS entity/munition maps - */ - - if (compileAircraftInventory () != 0) { - fprintf (stderr, "Fatal error\n"); - exit (1); - } - - if (compileEntityMap("object-map.txt", &eo_map_count, &eo_map) != 0) { - fprintf (stderr, "Fatal error\n"); - exit(1); - } - - if (compileMunitionMap("munition-map.txt", - &mun_map_count, &mun_map) != 0) { - fprintf (stderr, "Fatal error\n"); - exit(1); - } - - /* - * Initialize weapons - */ - - initaim9 (); - initm61a1 (); - initmk82 (); - initaim120 (); - - /* - * Set up the radio/navaid check. - */ - - id = addAlarm (5.0, DMECheckAlarm, NULL, NULL); - - /* - * Add the periodic resupply check procedure - */ - - id = addAlarm (RESUPPLY_INTERVAL, resupplyCheck, NULL, NULL); - - return 0; -} - -void -closeScene() -{ - int i; - - for (i=0; i -#include -#ifdef DUMP -#include -#endif - -/* - * interpolate : determine the value of a function of one variable - * by interpolation. Interpolation tables are built by - * the ibuild utility. - */ - -static char *ierrmsg = "interpolate: x value is out of bounds\n"; - -float_t -interpolate(ITable * table, double x) -{ - - register int i, count = table->count; - float_t result; - - if (x < table->minX) { - fprintf(stderr, ierrmsg); - fprintf(stderr, "minimum x = %g; x = %g\n", table->minX, x); -#ifdef DUMP - kill(getpid(), SIGBUS); -#endif - return (float_t) I_NaN; - } - - for (i = 0; i < count; ++i) { - if (x <= table->entry[i].x) { - result = (float_t) (table->entry[i].m * x + table->entry[i].b); - if (isnan(result)) { - fprintf(stderr, "interpolate: internal error\n"); - } - return result; - } - } - - fprintf(stderr, ierrmsg); - fprintf(stderr, "maximum x = %g; x = %g\n", table->entry[i - 1].x, x); - -#ifdef DUMP - kill(getpid(), SIGBUS); -#endif - - return (float_t) I_NaN; -} - -ITable * -copyITable (ITable *oldp) -{ - ITable * newp; - int i; - - if (oldp) { - newp = (ITable *) malloc(sizeof(ITable)); - if (newp) { - *newp = *oldp; - newp->entry = (IEntry *) malloc(sizeof(IEntry) * (oldp->count)); - if (newp->entry == NULL) { - return NULL; - } - for (i=0; icount; ++i) { - newp->entry[i] = oldp->entry[i]; - } - } - } - - return newp; -} - -void -freeITable (ITable *oldp) -{ - if ( oldp ) { - free ( oldp->entry ); - free ( oldp ); - } -} - diff -Nru acm-5.0/src/interpolate.h acm-6.0+20200416/src/interpolate.h --- acm-5.0/src/interpolate.h 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/src/interpolate.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,59 +0,0 @@ -/* - * acm : an aerial combat simulator for X - * Copyright (C) 1991,1992,1997 Riley Rainey - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 dated June, 1991. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. - */ - -/* - * Some data structures to perform fast 2-D interpolation - * - * Alot of aircraft information is in tabular form. We perform linear - * interpolation to determine values. In order to speed up that process, - * we'll create preprocessed tables. Each entry in the table contains the - * upper bound of the domain value (x) and the equation of the line that - * defines the data for that interval (y = m * x + b). - * - * The program ibuild preprocesses the tabular information into a - * corresponding C structure that the interpolate() function can use. - */ - -#include - -typedef struct { - float_t x; /* upper x value for this interval */ - float_t m; /* slope of line in this interval */ - float_t b; /* y-intercept of line in this interval */ -} IEntry; - -typedef struct { - int count; /* entry count in the interpolation table */ - float_t minX; /* minimum x value that can be interpolated */ - IEntry *entry; /* vector of intterpolation entries */ -} ITable; - -/* - * I'm doing this to catch bad interpolation requests. If an invalid - * domain value is submitted, (and we're on an IEEE FP system) we'll - * get back the IEEE NaN value as the interpolated result. - */ - -#define I_NaN (sqrt(-1.0)) - -#ifdef WIN32 -#include -#define isnan _isnan -#endif - -extern float_t interpolate(ITable * table, double x); diff -Nru acm-5.0/src/inventory.c acm-6.0+20200416/src/inventory.c --- acm-5.0/src/inventory.c 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/src/inventory.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,1422 +0,0 @@ -/* - * acm : an aerial combat simulator for X - * Copyright (C) 1991-1998 Riley Rainey - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 dated June, 1991. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. - */ - -#include -#include -#include -#include -#if defined(HAVE_STDLIB_H) -#include -#else -#include -#endif -#include - -struct lex_record; - -int ParseAircraft(struct lex_record *p, craftType ** c1), ParseValue(struct lex_record *p), - ParseTable(struct lex_record *p), ParsePoint(struct lex_record *p); -int ParseStation(struct lex_record *p); -int ParseDISEntityType(struct lex_record *p); -int ParseEntityMapEntry(struct lex_record *p, entity_object_map *po); -int ParseMunitionMapEntry(struct lex_record *p, munition_map *po); - -static craftType c; - -extern craftType *newCraft(void); -extern ITable * copyITable (ITable *oldp); - -extern double genericThrust PARAMS((craft *)); -extern void genericResupply PARAMS((craft *)); - -typedef enum { - RESERVED_WORD, - vtDOUBLE, - vtLONG, - vtANGLE, - vtNMILES, - vtKNOTS, - vtTABLE, - vtPOINT, - vtSTRING, - vtSTATION, - vtENTITY -} value_type; - -typedef enum { - Nil, - EndOfFile, - -/* - * Reserved words must be added to this section - */ - - TOKEN_NUMBER, - RW_PUNCTUATION, - TOKEN_STRING, - TOKEN_LEFT_BRACE, - TOKEN_RIGHT_BRACE, - TOKEN_COMMA, - TOKEN_COLON, - TOKEN_SEMICOLON, - RW_USE, - RW_AIRCRAFT, - RW_DESCRIPTION, - RW_HARDPOINT, - RW_KINETIC, - RW_EXPLOSIVE, - RW_M61A1, - RW_AIM9M, - RW_MK82, - -/* - * Fields in the craftType structure must be added in this section - */ - - Object, - InternalModel, - AspectRatio, - CLPosStall, - CLNegStall, - BetaStall, - CLift, - CDb, - CnBeta, - ClBeta, - CDBOrigin, - CDBFactor, - CDBPhase, - CYbeta, - Clda, - Cldr, - Clp, - Cmq, - Cnr, - maxAileron, - maxRudder, - effElevator, - effRudder, - SeTrimTakeoff, - Ixx, - Iyy, - Izz, - CmAlpha, - CmFactor, - MaxFlap, - CFlap, - FlapDrag, - FlapRate, - CGearDrag, - GearRate, - MaxSpeedBrake, - CSpeedBrake, - SpeedBrakeRate, - SpeedBrakeIncr, - WingArea, - WingSpan, - WingChord, - EmptyWeight, - MaxFuel, - MaxThrust, - MaxABThrust, - Thrust, - ABThrust, - EngineLag, - SpFuelConsump, - SpABFuelConsump, - GroundingPoint, - ViewPoint, - MuStatic, - MuKinetic, - MuBStatic, - MuBKinetic, - MaxNWDef, - NWincr, - MaxNWS, - Rm, - Rn, - Dm, - Dn, - Km, - Kn, - Gm, - Gn, - CmMax, - CnMax, - TailExtent, - StructurePts, - RadarOutput, - RadarTRange, - RadarDRange, - TEWSThreshold, - HardPoint0, - HardPoint1, - HardPoint2, - HardPoint3, - HardPoint4, - HardPoint5, - HardPoint6, - HardPoint7, - HardPoint8, - WeaponStation, - WeaponCount, - DISEntityType, - Description -} field_id; - -struct keyword_info { - char *word; - value_type type; - field_id id; - char *ptr; -}; - -#define A(x) (char *) x - -struct keyword_info keywords[] = -{ - - {"Description", vtSTRING, Description, A(&c.description)}, - {"Object", vtSTRING, Object, A(&c.objname)}, - {"InternalModel", vtSTRING, InternalModel, A(&c.modelname)}, - {"AspectRatio", vtDOUBLE, AspectRatio, A(&c.aspectRatio)}, - {"CLPosStall", vtANGLE, CLPosStall, A(&c.CLPosStall)}, - {"CLNegStall", vtANGLE, CLNegStall, A(&c.CLNegStall)}, - {"BetaStall", vtANGLE, BetaStall, A(&c.betaStall)}, - {"CLift", vtTABLE, CLift, A(&c.CLift)}, - {"CDb", vtTABLE, CDb, A(&c.CDb)}, - {"CnBeta", vtTABLE, CnBeta, A(&c.CnBeta)}, - {"ClBeta", vtTABLE, ClBeta, A(&c.ClBeta)}, - {"CDBOrigin", vtDOUBLE, CDBOrigin, A(&c.CDBOrigin)}, - {"CDBFactor", vtDOUBLE, CDBFactor, A(&c.CDBFactor)}, - {"CDBPhase", vtANGLE, CDBPhase, A(&c.CDBPhase)}, - {"CYBeta", vtDOUBLE, CYbeta, A(&c.CYbeta)}, - {"Clda", vtDOUBLE, Clda, A(&c.Clda)}, - {"Cldr", vtDOUBLE, Cldr, A(&c.Cldr)}, - {"Clp", vtDOUBLE, Clp, A(&c.Clp)}, - {"Cmq", vtDOUBLE, Cmq, A(&c.Cmq)}, - {"Cnr", vtDOUBLE, Cnr, A(&c.Cnr)}, - {"MaxAileron", vtANGLE, maxAileron, A(&c.maxAileron)}, - {"MaxRudder", vtANGLE, maxRudder, A(&c.maxRudder)}, - {"EffElevator", vtDOUBLE, effElevator, A(&c.effElevator)}, - {"EffRudder", vtDOUBLE, effRudder, A(&c.effRudder)}, - {"SeTrimTakeoff", vtANGLE, SeTrimTakeoff, A(&c.SeTrimTakeoff)}, - {"Ixx", vtDOUBLE, Ixx, A(&c.I.m[0][0])}, - {"Iyy", vtDOUBLE, Iyy, A(&c.I.m[1][1])}, - {"Izz", vtDOUBLE, Izz, A(&c.I.m[2][2])}, - {"CmAlpha", vtDOUBLE, CmAlpha, A(&c.cmSlope)}, - {"CmFactor", vtDOUBLE, CmFactor, A(&c.cmFactor)}, - {"MaxFlap", vtANGLE, MaxFlap, A(&c.maxFlap)}, - {"CFlap", vtDOUBLE, CFlap, A(&c.cFlap)}, - {"CFlapDrag", vtDOUBLE, FlapDrag, A(&c.cFlapDrag)}, - {"FlapRate", vtANGLE, FlapRate, A(&c.flapRate)}, - {"CGearDrag", vtDOUBLE, CGearDrag, A(&c.cGearDrag)}, - {"GearRate", vtANGLE, GearRate, A(&c.gearRate)}, - {"MaxSpeedBrake", vtANGLE, MaxSpeedBrake, A(&c.maxSpeedBrake)}, - {"CSpeedBrake", vtDOUBLE, CSpeedBrake, A(&c.cSpeedBrake)}, - {"SpeedBrakeRate", vtANGLE, SpeedBrakeRate, A(&c.speedBrakeRate)}, - {"SpeedBrakeIncr", vtANGLE, SpeedBrakeIncr, A(&c.speedBrakeIncr)}, - {"WingArea", vtDOUBLE, WingArea, A(&c.wingS)}, - {"WingHalfSpan", vtDOUBLE, WingSpan, A(&c.wings)}, - {"Chord", vtDOUBLE, WingChord, A(&c.c)}, - {"EmptyWeight", vtDOUBLE, EmptyWeight, A(&c.emptyWeight)}, - {"MaxFuel", vtDOUBLE, MaxFuel, A(&c.maxFuel)}, - {"MaxThrust", vtDOUBLE, MaxThrust, A(&c.maxThrust)}, - {"MaxABThrust", vtDOUBLE, MaxABThrust, A(&c.maxABThrust)}, - {"Thrust", vtTABLE, Thrust, A(&c.Thrust)}, - {"ABThrust", vtTABLE, ABThrust, A(&c.ABThrust)}, - {"EngineLag", vtDOUBLE, EngineLag, A(&c.engineLag)}, - {"SpFuelConsump", vtDOUBLE, SpFuelConsump, A(&c.spFuelConsump)}, - {"SpABFuelConsump", vtDOUBLE, SpABFuelConsump, A(&c.spABFuelConsump)}, - {"GroundingPoint", vtPOINT, GroundingPoint, A(&c.groundingPoint)}, - {"ViewPoint", vtPOINT, ViewPoint, A(&c.viewPoint)}, - {"MuStatic", vtDOUBLE, MuStatic, A(&c.muStatic)}, - {"MuKinetic", vtDOUBLE, MuKinetic, A(&c.muKinetic)}, - {"MuBStatic", vtDOUBLE, MuBStatic, A(&c.muBStatic)}, - {"MuBKinetic", vtDOUBLE, MuBKinetic, A(&c.muBKinetic)}, - {"MaxNWDef", vtANGLE, MaxNWDef, A(&c.maxNWDef)}, - {"NWIncr", vtANGLE, NWincr, A(&c.NWIncr)}, - {"MaxNWS", vtKNOTS, MaxNWS, A(&c.maxNWS)}, - {"Rm", vtPOINT, Rm, A(&c.rm)}, - {"Rn", vtPOINT, Rn, A(&c.rn)}, - {"Dm", vtDOUBLE, Dm, A(&c.Dm)}, - {"Dn", vtDOUBLE, Dn, A(&c.Dn)}, - {"Km", vtDOUBLE, Km, A(&c.Km)}, - {"Kn", vtDOUBLE, Kn, A(&c.Kn)}, - {"Gm", vtDOUBLE, Gm, A(&c.Gm)}, - {"Gn", vtDOUBLE, Gn, A(&c.Gn)}, - {"CmMax", vtDOUBLE, CmMax, A(&c.cmMax)}, - {"CnMax", vtDOUBLE, CnMax, A(&c.cnMax)}, - {"TailExtent", vtPOINT, TailExtent, A(&c.tailExtent)}, - {"StructurePoints", vtLONG, StructurePts, A(&c.structurePts)}, - {"RadarOutput", vtDOUBLE, RadarOutput, A(&c.radarOutput)}, - {"RadarTRange", vtNMILES, RadarTRange, A(&c.radarTRange)}, - {"RadarDRange", vtNMILES, RadarDRange, A(&c.radarDRange)}, - {"TEWSThreshold", vtDOUBLE, TEWSThreshold, A(&c.TEWSThreshold)}, - {"HardPoint1", vtPOINT, HardPoint1, A(&c.wStation[1])}, - {"HardPoint2", vtPOINT, HardPoint2, A(&c.wStation[2])}, - {"HardPoint3", vtPOINT, HardPoint3, A(&c.wStation[3])}, - {"HardPoint4", vtPOINT, HardPoint4, A(&c.wStation[4])}, - {"HardPoint5", vtPOINT, HardPoint5, A(&c.wStation[5])}, - {"HardPoint6", vtPOINT, HardPoint6, A(&c.wStation[6])}, - {"HardPoint7", vtPOINT, HardPoint7, A(&c.wStation[7])}, - {"HardPoint8", vtPOINT, HardPoint8, A(&c.wStation[8])}, - {"HardPoint0", vtPOINT, HardPoint0, A(&c.wStation[0])}, - {"WeaponCount", vtLONG, WeaponCount, A(&c.sCount)}, - {"WeaponStation", vtSTATION, WeaponStation, 0}, - - {"use", RESERVED_WORD, RW_USE, 0}, - {"aircraft", RESERVED_WORD, RW_AIRCRAFT, 0}, - {"description", RESERVED_WORD, RW_DESCRIPTION, 0}, - {"hardpoint", RESERVED_WORD, RW_HARDPOINT, 0}, - {"kinetic", RESERVED_WORD, RW_KINETIC, 0}, - {"explosive", RESERVED_WORD, RW_EXPLOSIVE, 0}, - {"blast", RESERVED_WORD, RW_EXPLOSIVE, 0}, - - {"M61A1", RESERVED_WORD, RW_M61A1, 0}, - {"AIM9M", RESERVED_WORD, RW_AIM9M, 0}, - {"MK82", RESERVED_WORD, RW_MK82, 0}, - - {"DISEntityType", vtENTITY, DISEntityType, A(&c.entityType)}, - {"DISAltEntityType", vtENTITY, DISEntityType, A(&c.altEntityType)}, - - {NULL, RESERVED_WORD, Nil, 0} -}; - -typedef union { - struct keyword_info *kw; - double double_value; - ITable *table_value; - char *string_value; - long long_value; -} lex_val; - -static lex_val lex_value; - -struct lex_record { - char *filename; - FILE *f; - int lineno; - int lookahead_valid; - int lookahead; - int stack_top; - lex_val value_stack[16]; -}; - -field_id NextToken(struct lex_record * p); -void Resync(struct lex_record *p, field_id token); - -#define push_value(p, type, val) \ - p->value_stack[p->stack_top++].type = val - -#define pop_value(p, type) (p->value_stack[--p->stack_top].type) - -#define input(p) (p->lookahead_valid \ - ? (p->lookahead_valid = 0, p->lookahead) \ - : (((p->lookahead = getc(p->f)) == '\n') \ - ? (p->lineno++, p->lookahead) \ - : p->lookahead)) - -#define unput(p, c) { p->lookahead = c; p->lookahead_valid = 1; } - -#define InitializeLexRecord(p) { p->lookahead_valid = 0; } - -static char token[256]; -static int token_length = 0; - -#define STATE_INITIAL 0 -#define STATE_WORD 1 -#define STATE_NUMBER 2 -#define STATE_STRING 3 -#define STATE_COMMENT 4 - -extern FILE *acm_fopen(char *name, char *access); - -struct lex_record * -OpenSourceFile(char *name) -{ - struct lex_record *p; - FILE *f; - - if ((f = acm_fopen(name, "r")) == (FILE *) NULL) { - return (struct lex_record *) NULL; - } - - p = (struct lex_record *) malloc(sizeof(struct lex_record)); - - p->filename = strdup(name); - p->lineno = 1; - p->lookahead_valid = 0; - p->stack_top = 0; - p->f = f; - - return p; -} - -int -compileAircraftInventory(void) -{ - struct lex_record *p; - craftType *c, *c1; - int code = 0; - FILE *f; - - if ((p = OpenSourceFile("inventory")) == NULL) { - fprintf(stderr, "unable to open aircraft inventory file\n"); - return -1; - } - - while (1) { - if (ParseAircraft(p, &c) == 0) { - if (c) { - c1 = newCraft(); - *c1 = *c; - free((char *) c); - -/* - * Initialize some other interesting values - */ - - f = acm_fopen(c1->objname, "r"); - c1->object = VReadDepthCueuedObject(f, 1); - fclose(f); - c1->placeProc = NULL; - c1->damageBits = SYS_NODAMAGE; - c1->damageBits &= ~SYS_ENGINE2; - c1->thrust = genericThrust; - c1->resupply = genericResupply; - -/* - * Some older values are now derived from more precise information - */ - - c1->gearD1 = c1->rn.x - c1->rm.x; - c1->gearD2 = c1->rm.x; - c1->CLOrigin = interpolate(c1->CLift, 0.0); - c1->CLSlope = (interpolate(c1->CLift, DEGtoRAD(10.0)) - - c1->CLOrigin) / DEGtoRAD(10.0); - } - else { - break; - } - } - else { - code = -1; - break; - } - } - - fclose(p->f); - free(p->filename); - free((char *) p); - return code; -} - -int -compileEntityMap(char *name, int *count, entity_object_map **pmap) -{ - struct lex_record *p; - int code = 0; - entity_object_map po; - int n = 0; - - *pmap = NULL; - *count = 0; - - if ((p = OpenSourceFile(name)) == NULL) { - fprintf(stderr, "unable to open entity map file\n"); - return -1; - } - - while (ParseEntityMapEntry(p, &po) == 0 && code == 0) { - *pmap = realloc (*pmap, sizeof(entity_object_map) * (n+1) ); - if (!pmap) { - code = -1; - } - (*pmap)[n] = po; - n++; - } - - *count = n; - - fclose(p->f); - free(p->filename); - free((char *) p); - return code; -} - -int -compileMunitionMap(char *name, int *count, munition_map **pmap) -{ - struct lex_record *p; - int code = 0; - munition_map po; - int n = 0; - - *pmap = NULL; - *count = 0; - - if ((p = OpenSourceFile(name)) == NULL) { - fprintf(stderr, "unable to open entity map file\n"); - return -1; - } - - while (ParseMunitionMapEntry(p, &po) == 0 && code == 0) { - *pmap = realloc (*pmap, sizeof(munition_map) * (n+1) ); - if (!pmap) { - code = -1; - } - (*pmap)[n] = po; - n++; - } - - *count = n; - - fclose(p->f); - free(p->filename); - free((char *) p); - return code; -} - -int -ParseEntityMapEntry(struct lex_record *p, entity_object_map *po) -{ - long ival, result; - - memset (po, 0, sizeof(entity_object_map)); - - result = ParseDISEntityType(p); - - /* end-of-file */ - if (result == -2) { - return -1; - } - - /* other error */ - if (result != 0) { - Resync(p, TOKEN_SEMICOLON); - return -1; - } - - ival = pop_value(p, long_value); - if (ival == -1) { - po->entity_mask.extra = 0; - } - else { - po->entity_mask.extra = 1; - po->entity_type.extra = (unsigned char) ival; - } - - ival = pop_value(p, long_value); - if (ival == -1) { - po->entity_mask.specific = 0; - } - else { - po->entity_mask.specific = 1; - po->entity_type.specific = (unsigned char) ival; - } - - ival = pop_value(p, long_value); - if (ival == -1) { - po->entity_mask.subcategory = 0; - } - else { - po->entity_mask.subcategory = 1; - po->entity_type.subcategory = (unsigned char) ival; - } - - ival = pop_value(p, long_value); - if (ival == -1) { - po->entity_mask.category = 0; - } - else { - po->entity_mask.category = 1; - po->entity_type.category = (unsigned char) ival; - } - - ival = pop_value(p, long_value); - if (ival == -1) { - po->entity_mask.country = 0; - } - else { - po->entity_mask.country = 1; - po->entity_type.country = (unsigned short) ival; - } - - ival = pop_value(p, long_value); - if (ival == -1) { - po->entity_mask.domain = 0; - } - else { - po->entity_mask.domain = 1; - po->entity_type.domain = (unsigned char) ival; - } - - ival = pop_value(p, long_value); - if (ival == -1) { - po->entity_mask.kind = 0; - } - else { - po->entity_mask.kind = 1; - po->entity_type.kind = (unsigned char) ival; - } - - if (NextToken(p) != TOKEN_COMMA) { - Resync(p, TOKEN_SEMICOLON); - return -1; - } - - if (NextToken(p) != TOKEN_STRING) { - Resync(p, TOKEN_SEMICOLON); - return -1; - } - - po->object_name = strdup( token ); - - if (NextToken(p) != TOKEN_SEMICOLON) { - Resync(p, TOKEN_SEMICOLON); - return -1; - } - - return 0; -} - -/* - * munition_entity_type , warhead_type , explosion_diameter , damage_factor ; - */ - -int -ParseMunitionMapEntry(struct lex_record *p, munition_map *po) -{ - long ival, result; - field_id t; - - memset (po, 0, sizeof(munition_map)); - - result = ParseDISEntityType(p); - - /* end-of-file */ - if (result == -2) { - return -1; - } - - /* other error */ - if (result != 0) { - Resync(p, TOKEN_SEMICOLON); - return -1; - } - - ival = pop_value(p, long_value); - if (ival == -1) { - po->entity_mask.extra = 0; - } - else { - po->entity_mask.extra = 1; - po->entity_type.extra = (unsigned char) ival; - } - - ival = pop_value(p, long_value); - if (ival == -1) { - po->entity_mask.specific = 0; - } - else { - po->entity_mask.specific = 1; - po->entity_type.specific = (unsigned char) ival; - } - - ival = pop_value(p, long_value); - if (ival == -1) { - po->entity_mask.subcategory = 0; - } - else { - po->entity_mask.subcategory = 1; - po->entity_type.subcategory = (unsigned char) ival; - } - - ival = pop_value(p, long_value); - if (ival == -1) { - po->entity_mask.category = 0; - } - else { - po->entity_mask.category = 1; - po->entity_type.category = (unsigned char) ival; - } - - ival = pop_value(p, long_value); - if (ival == -1) { - po->entity_mask.country = 0; - } - else { - po->entity_mask.country = 1; - po->entity_type.country = (unsigned short) ival; - } - - ival = pop_value(p, long_value); - if (ival == -1) { - po->entity_mask.domain = 0; - } - else { - po->entity_mask.domain = 1; - po->entity_type.domain = (unsigned char) ival; - } - - ival = pop_value(p, long_value); - if (ival == -1) { - po->entity_mask.kind = 0; - } - else { - po->entity_mask.kind = 1; - po->entity_type.kind = (unsigned char) ival; - } - - if (NextToken(p) != TOKEN_COMMA) { - Resync(p, TOKEN_SEMICOLON); - return -1; - } - - if (NextToken(p) != TOKEN_NUMBER) { - Resync(p, TOKEN_SEMICOLON); - return -1; - } - - /* warhead type */ - - if (lex_value.double_value >= 0) { - ival = (int) (lex_value.double_value + 0.5); - } - else { - ival = (long)(lex_value.double_value - 0.5); - } - - if (ival == -1) { - po->warhead_mask = 0; - } - else { - po->warhead_mask = 1; - po->warhead_type = (unsigned short) ival; - } - - if (NextToken(p) != TOKEN_COMMA) { - Resync(p, TOKEN_SEMICOLON); - return -1; - } - - /* explosion diameter */ - - if (NextToken(p) != TOKEN_NUMBER) { - Resync(p, TOKEN_SEMICOLON); - return -1; - } - - po->explosion_diameter_meters = FEETtoMETERS(lex_value.double_value); - - if (NextToken(p) != TOKEN_COMMA) { - Resync(p, TOKEN_SEMICOLON); - return -1; - } - - /* damage factor */ - - if (NextToken(p) != TOKEN_NUMBER) { - Resync(p, TOKEN_SEMICOLON); - return -1; - } - - po->damage_factor = lex_value.double_value; - - if (NextToken(p) != TOKEN_COMMA) { - Resync(p, TOKEN_SEMICOLON); - return -1; - } - - /* warhead class: kinetic or explosive */ - - t = NextToken(p); - - if (t != RW_KINETIC && t != RW_EXPLOSIVE) { - Resync(p, TOKEN_SEMICOLON); - return -1; - } - - po->kinetic_flag = (t == RW_KINETIC) ? 1 : 0; - - if (NextToken(p) != TOKEN_SEMICOLON) { - Resync(p, TOKEN_SEMICOLON); - return -1; - } - - return 0; -} - -void -ParseError(struct lex_record *p, char *s) -{ - fprintf(stderr, "error in file %s (line %d):\n\t%s\n", p->filename, - p->lineno, s); -} - -field_id -NextTokenx(struct lex_record *p) -{ - register int c, state = STATE_INITIAL; - register struct keyword_info *q; - - token_length = 0; - - while ((c = input(p)) != EOF) { - - switch (state) { - - case STATE_INITIAL: - - if (isalpha(c)) { - token[token_length++] = c; - state = STATE_WORD; - } - else if (isspace(c)) { - continue; - } - else if (isdigit(c) || c == '-' || c == '+' || c == '.') { - token[token_length++] = c; - state = STATE_NUMBER; - } - else if (c == '"') { - state = STATE_STRING; - } - else if (c == '#') { - state = STATE_COMMENT; - } - else { - token[0] = c; - token[1] = '\0'; -#ifdef DEBUG - printf("other %s\n", token); -#endif - switch (c) { - case ',': - return TOKEN_COMMA; - case ':': - return TOKEN_COLON; - case ';': - return TOKEN_SEMICOLON; - case '{': - return TOKEN_LEFT_BRACE; - case '}': - return TOKEN_RIGHT_BRACE; - default: - ParseError(p, "invalid character"); - state = STATE_INITIAL; - } - } - break; - - case STATE_WORD: - case STATE_NUMBER: - if (isspace(c) || c == ':' || c == ',' || c == '{' || c == '}') { - token[token_length] = '\0'; - unput(p, c); - if (state == STATE_WORD) { - for (q = keywords; q->word; ++q) { - if (strcmp(q->word, token) == 0) { - lex_value.kw = q; - return q->id; - } - } - return Nil; - } - else { - errno = 0; - lex_value.double_value = strtod( token, NULL ); - if (errno == ERANGE) { - printf ("invalid numeric constant: %s\n", token); - } - return TOKEN_NUMBER; - } - } - else { - token[token_length++] = c; - } - break; - - case STATE_STRING: - - switch (c) { - - case '"': - token[token_length] = '\0'; - return TOKEN_STRING; - - case '\n': - ParseError(p, "strings cannot span a line"); - unput(p, c); - state = STATE_INITIAL; - break; - - case '\\': - - switch (c = input(p)) { - - case EOF: - ParseError(p, "Premature End-of-file"); - break; - - case 'n': - token[token_length++] = '\n'; - break; - - case 't': - token[token_length++] = '\t'; - break; - - default: - token[token_length++] = c; - break; - } - - default: - token[token_length++] = c; - break; - } - break; - - case STATE_COMMENT: - while (c != EOF) { - if (c == '\n') - break; - c = input(p); - } - state = STATE_INITIAL; - break; - - } - } - - return EndOfFile; -} - -field_id -NextToken(struct lex_record * p) -{ - field_id t; - - t = NextTokenx(p); - -#ifdef DEBUG - printf("token %s\n", token); -#endif - return t; -} - -/* - * Skip to the specified token, if token is Nil, then skip to the end of the - * current line. - */ - -void -Resync(struct lex_record *p, field_id token) -{ - field_id t; - int c; - - if (token == Nil) { - while ((c = input(p)) != EOF) { - if (c == '\n') - break; - } - } - else { - while ((t = NextToken(p)) != EndOfFile) { - if (t == token) - break; - } - } - -} - -int -ParseAircraft(struct lex_record *p, craftType ** c1) -{ - field_id t; - long n, i; - double d; - VPoint pt; - ITable *table; - dis_entity_type entity; - char s[256]; - struct keyword_info *kw; - craftType *used; - - memset(&c, 0, sizeof(c)); - *c1 = NULL; - - if ((t = NextToken(p)) != RW_AIRCRAFT) { - if (t == EndOfFile) { - return 0; - } - else { - return -1; - } - } - - if (NextToken(p) != TOKEN_STRING) { - return -1; - } - - c.name = strdup(token); - - if (NextToken(p) != TOKEN_LEFT_BRACE) { - return -1; - } - - while ((t = NextToken(p)) != EndOfFile) { - - if (t >= Object || t == RW_USE) { - - kw = lex_value.kw; - - switch (kw->type) { - - case RESERVED_WORD: - - /* - * use "aircraft-type-name" - * - * uses a previously defined aircraft as the starting point for defining another - */ - - if (kw->id == RW_USE) { - if ( NextToken(p) == TOKEN_STRING ) { - char * ptmp = c.name; - - n = 1; - used = lookupCraft( token ); - if (used) { - c = *used; - c.CLift = copyITable (used->CLift ); - c.CDb = copyITable (used->CDb ); - c.CnBeta = copyITable (used->CnBeta ); - c.ClBeta = copyITable (used->ClBeta ); - c.Thrust = copyITable (used->Thrust ); - c.ABThrust = copyITable (used->ABThrust); - //if (used->name) { - // c.name = strdup( used->name ); - //} - c.name = ptmp; - if (used->description) { - c.description = strdup( used->description ); - } - if (used->modelname) { - c.modelname = strdup( used->modelname ); - } - if (used->objname) { - c.objname = strdup( used->objname ); - } - for (i=0; istation[i].type ) { - c.station[i].type = strdup( used->station[i].type) ; - } - } - - - n = 0; - - } - else { - sprintf(s, "\"%s\" is not a valid aircraft type", token); - ParseError(p, s); - } - } - } - break; - - case vtSTRING: - if (NextToken(p) == TOKEN_STRING) { - n = 0; - *((char **) kw->ptr) = strdup(token); - } - else - n = -1; - break; - - case vtDOUBLE: - case vtNMILES: - case vtKNOTS: - if ((n = ParseValue(p)) == 0) { - d = pop_value(p, double_value); - if (kw->type == vtNMILES) - d *= NM; - else if (kw->type == vtKNOTS) - d *= NM / 3600; - *((double *) kw->ptr) = d; - } - break; - - case vtANGLE: - if ((n = ParseValue(p)) == 0) { - d = DEGtoRAD(pop_value(p, double_value)); - *((double *) kw->ptr) = d; - } - break; - - case vtLONG: - if ((n = ParseValue(p)) == 0) { - d = pop_value(p, double_value); - *((long *) kw->ptr) = (long) (d + 0.5); - } - break; - - case vtTABLE: - if ((n = ParseTable(p)) == 0) { - table = pop_value(p, table_value); - *((ITable **) kw->ptr) = table; - } - break; - - case vtPOINT: - if ((n = ParsePoint(p)) == 0) { - pt.z = pop_value(p, double_value); - pt.y = pop_value(p, double_value); - pt.x = pop_value(p, double_value); - *((VPoint *) kw->ptr) = pt; - } - break; - - case vtSTATION: - if ((n = ParseStation(p)) == 0) { - i = pop_value(p, long_value); - c.station[i].type = - pop_value(p, string_value); - c.station[i].info = - pop_value(p, long_value); - c.station[i].info2 = - pop_value(p, long_value); - c.station[i].info3 = - pop_value(p, long_value); - } - break; - - case vtENTITY: - if ((n = ParseDISEntityType(p)) == 0) { - entity.extra = (unsigned char) - pop_value(p, long_value); - entity.specific = (unsigned char) - pop_value(p, long_value); - entity.subcategory = (unsigned char) - pop_value(p, long_value); - entity.category = (unsigned char) - pop_value(p, long_value); - entity.country = (unsigned char) - pop_value(p, long_value); - entity.domain = (unsigned char) - pop_value(p, long_value); - entity.kind = (unsigned char) - pop_value(p, long_value); - *((dis_entity_type *) kw->ptr) = entity; - } - break; - } - - if (n != 0) { - sprintf(s, "invalid syntax for %s\ - parameter", kw->word); - ParseError(p, s); - } - } - else if (t == TOKEN_RIGHT_BRACE) { - *c1 = (craftType *) malloc(sizeof(craftType)); - **c1 = c; - return 0; - } - else { - sprintf(s, "\"%s\" was found where another token was\ - expected", token); - ParseError(p, s); - return -1; - } - } - - return -1; -} - -/* - * Parse syntax: '{' number ',' number ',' number '}' - */ - -int -ParsePoint(struct lex_record *p) -{ - - if (NextToken(p) != TOKEN_LEFT_BRACE) { - Resync(p, TOKEN_RIGHT_BRACE); - return -1; - } - - if (NextToken(p) != TOKEN_NUMBER) { - Resync(p, TOKEN_RIGHT_BRACE); - return -1; - } - - push_value(p, double_value, lex_value.double_value); - - if (NextToken(p) != TOKEN_COMMA) { - Resync(p, TOKEN_RIGHT_BRACE); - return -1; - } - - if (NextToken(p) != TOKEN_NUMBER) { - Resync(p, TOKEN_RIGHT_BRACE); - return -1; - } - - push_value(p, double_value, lex_value.double_value); - - if (NextToken(p) != TOKEN_COMMA) { - Resync(p, TOKEN_RIGHT_BRACE); - return -1; - } - - if (NextToken(p) != TOKEN_NUMBER) { - Resync(p, TOKEN_RIGHT_BRACE); - return -1; - } - - push_value(p, double_value, lex_value.double_value); - - if (NextToken(p) != TOKEN_RIGHT_BRACE) { - Resync(p, TOKEN_RIGHT_BRACE); - return -1; - } - - return 0; -} - -/* - * Parse syntax: '{' number_list '}' - * - * Where number_list is a collection of zero or more comma separated - * numbers. The list of numbers must be an even count. - * - */ - -int -ParseTable(struct lex_record *p) -{ - field_id t; - double x[64], y[64]; - int count = 0, i; - ITable *table; - IEntry *entry; - - if (NextToken(p) != TOKEN_LEFT_BRACE) { - Resync(p, TOKEN_RIGHT_BRACE); - return -1; - } - - while ((t = NextToken(p)) != TOKEN_RIGHT_BRACE) { - - if (t == EndOfFile) - return -1; - - if (t == TOKEN_NUMBER) { - - if (count == 64) { - ParseError(p, "too many table entries"); - return -1; - } - - x[count] = lex_value.double_value; - - if (NextToken(p) != TOKEN_COMMA) { - Resync(p, TOKEN_RIGHT_BRACE); - return -1; - } - - if (NextToken(p) != TOKEN_NUMBER) { - Resync(p, TOKEN_RIGHT_BRACE); - return -1; - } - y[count++] = lex_value.double_value; - - t = NextToken(p); - - if (t == TOKEN_RIGHT_BRACE) - goto done; - else if (t != TOKEN_COMMA) { - Resync(p, TOKEN_RIGHT_BRACE); - return -1; - } - } - else { - Resync(p, TOKEN_RIGHT_BRACE); - return -1; - } - } - - done: - -/* - * Build an interpolation table - */ - - table = (ITable *) malloc(sizeof(ITable)); - entry = (IEntry *) malloc(sizeof(IEntry) * (count - 1)); - table->minX = (float_t) x[0]; - table->count = count - 1; - table->entry = entry; - - for (i = 1; i < count; ++i) { - entry[i - 1].x = (float_t) x[i]; - entry[i - 1].m = (float_t) ((y[i] - y[i - 1]) / (x[i] - x[i - 1])); - entry[i - 1].b = (float_t) (y[i] - (x[i] * entry[i - 1].m)); - } - - push_value(p, table_value, table); - - return 0; -} - -int -ParseValue(struct lex_record *p) -{ - if (NextToken(p) != TOKEN_NUMBER) { - Resync(p, Nil); - return -1; - } - push_value(p, double_value, lex_value.double_value); - return 0; -} - -int -ParseWeaponType(struct lex_record *p) -{ - field_id t; - int result = 0; - - t = NextToken(p); - - if (t == RW_M61A1) { - push_value( p, long_value, WK_M61A1 ); - } - else if (t == RW_AIM9M) { - push_value( p, long_value, WK_AIM9M ); - } - else if (t == RW_MK82) { - push_value( p, long_value, WK_MK82 ); - } - else { - Resync(p, Nil); - result = -1; - } - - return 0; -} - -/* - * Parse syntax: number weapon-type number number - */ - -int -ParseStation(struct lex_record *p) -{ - - long i, a1, b1, c1; - char *ptr; - - if (NextToken(p) != TOKEN_NUMBER) { - Resync(p, Nil); - return -1; - } - - i = (long) (lex_value.double_value + 0.5); - - if (NextToken(p) != TOKEN_STRING) { - Resync(p, Nil); - return -1; - } - - ptr = strdup(token); - - if (NextToken(p) != TOKEN_NUMBER) { - Resync(p, Nil); - return -1; - } - - a1 = (long) (lex_value.double_value + 0.5); - - if (NextToken(p) != TOKEN_NUMBER) { - Resync(p, Nil); - return -1; - } - - b1 = (long) (lex_value.double_value + 0.5); - - if (NextToken(p) != TOKEN_NUMBER) { - Resync(p, Nil); - return -1; - } - - c1 = (long) (lex_value.double_value + 0.5); - - push_value(p, long_value, c1); - push_value(p, long_value, b1); - push_value(p, long_value, a1); - push_value(p, string_value, ptr); - push_value(p, long_value, i); - - return 0; -} - -/* - * Parse syntax: n.n.n.n.n.n.n - */ - -int -ParseDISEntityType(struct lex_record *p) -{ - - long i, av; - field_id t; - - for (i = 0; i < 7; ++i) { - - t = NextToken(p); - - if (t != TOKEN_NUMBER) { - if (t == EndOfFile) { - return -2; - } - Resync(p, Nil); - return -1; - } - - if (lex_value.double_value > 0) { - av = (long) (lex_value.double_value + 0.5); - } - else { - av = (long) (lex_value.double_value - 0.5); - } - push_value(p, long_value, av); - - if (i < 6 && NextToken(p) != TOKEN_COLON) { - Resync(p, Nil); - return -1; - } - } - - return 0; -} diff -Nru acm-5.0/src/joystick.c acm-6.0+20200416/src/joystick.c --- acm-5.0/src/joystick.c 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/src/joystick.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,264 +0,0 @@ -/* - * acm : an aerial combat simulator for X - * Copyright (C) 1991-1998 Riley Rainey - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 dated June, 1991. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. - */ - -#include -#include -#include -#include -#include - -static int min[4] = {999, 999, 999, 999}; -static int max[4] = {-1, -1, -1, -1}; -static int home[4]; -static int value[5] = {128, 128, 128, 128, 0}; - -static char *joystick_port = NULL; - -void -SetJoystickPort (char * name) -{ - joystick_port = name; -} - -void -CalibrateJoystick() -{ - int i; - - printf("\n\nCenter the joystick, click when ready!\n\n"); - for (;;) - if (ProcessJoystickInput()) - if (value[4] != 0) break; - for (i = 0; i < 4; i++) home[i] = value[i]; - for (;;) if (ProcessJoystickInput()) if (value[4] == 0) break; - - printf("\n\nPosition stick in minimum and maximum values, then click\n\n"); - for (;;) - { - if (ProcessJoystickInput()) - { - for (i = 0; i < 4; i++) - { - if (value[i] < min[i]) min[i] = value[i]; - if (value[i] > max[i]) max[i] = value[i]; - } - if (value[4] != 0) break; - } - } - for (;;) if (ProcessJoystickInput()) if (value[4] == 0) break; - printf("\n\nJoystick Calibrated\n"); -} - -double fixJoy(int i) -{ - // Forward joysticks. - if (min[i] < max[i]) - { - if (value[i] <= home[i]) - return (double) (value[i] - min[i]) / (double)(home[i] - min[i]) - 1.0; - else - return (double) (value[i] - home[i]) / (double)(max[i] - home[i]); - } - // Backwards joysticks. - else - if (value[i] >= home[i]) - return ((double)(min[i] - value[i]) / (double)(min[i] - home[i]) - 1.0); - else - return ((double)(home[i] - value[i]) / (double)(home[i] - max[i])); -} - -void -GetJoystickPosition(double *x1, double *y1, - double *x2, double *y2, int *switches) -{ - if (min[0] == 999) - { - *x1 = 0.0; *y1 = 0.0; *x2 = 0.0; *y2 = 0.0; *switches = value[4]; - return; - } - - *x1 = fixJoy(0); - if (*x1 < -1.0) *x1 = -1.0; - - *y1 = fixJoy(1); - if (*y1 < -1.0) *y1 = -1.0; - - *x2 = fixJoy(2); - if (*x2 < -1.0) *x2 = -1.0; - - *y2 = fixJoy(3); - if (*y2 < -1.0) *y2 = -1.0; - *switches = value[4]; -} - -/* - * ProcessJoystickInput() - * - * This procedure should be called just before you call GetJoystickInput(). - * In processes any pending input from the Workstation Gameport. - */ - -static int init = 0, state; - -int -ProcessJoystickInput() -{ - static int fd; - static int x1, y1, x2, y2, switches; - int on = 1; - int flags, n, i, updated = 0; - unsigned char bytes[512], *p; - - if (init < 0) { - return init; - } else if (init == 0) { - struct termios term; - - init = -1; - - if (!joystick_port) { - return init; - } - - if ((fd = open(joystick_port, O_RDWR)) < 0) { - perror("joystick port open failed"); - return -1; - } - -/* - * Set POSIX non-blocking I/O - */ - - if ((flags = fcntl(fd, F_GETFL, 0)) == -1) { - perror("F_GETFL failed"); - return -1; - } - if (fcntl(fd, F_SETFL, flags | O_NONBLOCK) != 0) { - perror("F_SETFL failed"); - return -1; - } - -/* - * Assert both DTR and RTS (these pins supply power to - * the Workstation Gameport). - */ - -#ifdef TIOCM_RTS - flags = TIOCM_RTS | TIOCM_DTR | TIOCM_LE; - if (ioctl(fd, TIOCMSET, &flags) == -1) { - perror("ioctl failed"); - return -1; - } -#endif - -/* - * Condition the TTY line to talk to the converter - */ - - if (tcgetattr(fd, &term) != 0) { - perror("tcgetattr failed"); - return -1; - } - term.c_iflag = IGNBRK | IGNPAR; - term.c_oflag = 0; - term.c_cflag = CLOCAL | CS8 | CSTOPB | CREAD; - term.c_lflag &= ~(ECHO | ICANON); - for (i = 0; i < NCCS; ++i) { - term.c_cc[i] = -1; - } - term.c_cc[VMIN] = 1; - term.c_cc[VTIME] = 0; - cfsetospeed(&term, B9600); - cfsetispeed(&term, B9600); - if (tcsetattr(fd, TCSAFLUSH, &term) != 0) { - perror("tcsetattr failed"); - return -1; - } - state = 0; - init = 1; - } -/* - * Read a whole bunch of characters from the tty - */ - - n = read(fd, bytes, sizeof bytes); - if (n != -1) { - printf("%d ->", n); - for (state = 0; state < n; state++) printf(" %d", bytes[state]); - printf("\n"); - } - -/* - * And then process them ... - */ - - for (p = bytes; n > 0; --n) { - - switch (state) { - - case 0: - if ((*p & 0x80) != 0) { - switches = (((int) *p) >> 3) & 0x0F; - x1 = (((int) *p) & 0x07) << 5; - state = 1; - } - break; - - case 1: - if ((*p & 0x80) != 0) { state = 0; break; } - x1 += (((int) *p) >> 2) & 0x1F; - y1 = (((int) *p) & 0x03) << 6; - state = 2; - break; - - case 2: - if ((*p & 0x80) != 0) { state = 0; break; } - y1 += (((int) *p) >> 1) & 0x3F; - x2 = (((int) *p) & 0x01) << 7; - state = 3; - break; - - case 3: - if ((*p & 0x80) != 0) { state = 0; break; } - x2 += ((int) *p) & 0x7F; - state = 4; - break; - - case 4: - if ((*p & 0x80) != 0) { state = 0; break; } - y2 = ((int) *p) << 1; - state = 5; - break; - - case 5: - if ((*p & 0x80) != 0) { state = 0; break; } - y2 += ((int) *p) & 0x01; - value[0] = 255 - x1; - value[1] = 255 - y1; - value[2] = x2; - value[3] = y2; - value[4] = switches; - state = 0; - updated = 1; - // printf("%d %d %d -> %d %d\n", switches, x1, y1, x2, y2); - break; - } - ++p; - } - return updated; -} diff -Nru acm-5.0/src/joystick-cms.c acm-6.0+20200416/src/joystick-cms.c --- acm-5.0/src/joystick-cms.c 1998-05-12 03:43:04.000000000 +0000 +++ acm-6.0+20200416/src/joystick-cms.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,251 +0,0 @@ - -/* - * acm : an aerial combat simulator for X - * Copyright (C) 1991-1994 Riley Rainey - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 dated June, 1991. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. - */ - -/* - * Colorado Spectrum Workstation Gameport(TM) - * - * Interface Notes by Riley Rainey (rainey@netcom.com) - * - * The Colorado Spectrum Workstation Gameport allows you to connect - * a PC joystick to a serial port on your Unix workstation. It presents - * a DB-9 plug that can be attached directly into any system that has a - * PC-style 9 pin serial port. I created a simple adapter cable to convert a - * Sparc IPX DIN-8 serial connector to the 9-pin that this unit requires. - * - * The Workstation Gameport costs about $100. - * Colorado Spectrum accepts credit card phone orders: +1 (970) 225-6929 - * - * The workstation gameport emits asynchronous six byte sequences - * up to 30 times per second. If the state of switches and joystick pots - * does not change, no packet is emitted. The data rate is 9600 bps; - * eight data bits and two stop bits. - * - * Byte Contents - * ---- ---------------------------------------------- - * 0 Sync Byte (always zero) - * 1 Switches (J2s2, J2s1, J1s2, J1s1, 0, 0, 0, 0) - * 2 J1x - * 3 J1y - * 4 J2x - * 5 J2y - * - * The driver (this module) must ensure that both DTR and RTS - * are raised to supply power to the joystick adapter. - */ - -#include -#include -#include - -static int min[4] = -{0, 0, 0, 0}; -static int max[4] = -{255, 255, 255, 255}; -static int home[4] = -{128, 128, 128, 128}; -static int value[5] = -{128, 128, 128, 128, 0}; - -static char *joystick_port = NULL; - -void -SetJoystickPort(char *name) -{ - joystick_port = name; -} - -void -CalibrateJoystick(void) -{ - int i; - - for (i = 0; i < 4; ++i) { - home[i] = value[i]; - } -} - -void -GetJoystickPosition(double *x1, double *y1, - double *x2, double *y2, int *switches) -{ - *x1 = (double) (value[0] - home[0]) / (max[0] - home[0]); - if (*x1 < -1.0) { - *x1 = -1.0; - } - *y1 = (double) (value[1] - home[1]) / (max[1] - home[1]); - if (*y1 < -1.0) { - *y1 = -1.0; - } - *x2 = (double) (value[2] - home[2]) / (max[2] - home[2]); - if (*x2 < -1.0) { - *x2 = -1.0; - } - *y2 = (double) (value[3] - home[3]) / (max[3] - home[3]); - if (*y2 < -1.0) { - *y2 = -1.0; - } - *switches = value[4]; -} - -/* - * ProcessJoystickInput() - * - * This procedure should be called just before you call GetJoystickInput(). - * In processes any pending input from the Workstation Gameport. - */ - -static int init = 0, state; - -int -ProcessJoystickInput(void) -{ - static int fd; - static int x1, y1, x2, switches; - int on = 1; - int flags, n, i, updated = 0; - unsigned char bytes[512], *p; - - if (init < 0) { - return init; - } - else if (init == 0) { - struct termios term; - - init = -1; - - if (!joystick_port) { - return init; - } - - if ((fd = open(joystick_port, O_RDWR)) < 0) { - perror("joystick port open failed"); - return -1; - } - -/* - * Set POSIX non-blocking I/O - */ - - if ((flags = fcntl(fd, F_GETFL, 0)) == -1) { - perror("F_GETFL failed"); - return -1; - } - if (fcntl(fd, F_SETFL, flags | O_NONBLOCK) != 0) { - perror("F_SETFL failed"); - return -1; - } - -/* - * Assert both DTR and RTS (these pins supply power to - * the Workstation Gameport). - */ - -#ifdef TIOCM_RTS - flags = TIOCM_RTS | TIOCM_DTR | TIOCM_LE; - if (ioctl(fd, TIOCMSET, &flags) == -1) { - perror("ioctl failed"); - return -1; - } -#endif - -/* - * Condition the TTY line to talk to the converter - */ - - if (tcgetattr(fd, &term) != 0) { - perror("tcgetattr failed"); - return -1; - } - term.c_iflag = IGNBRK | IGNPAR; - term.c_oflag = 0; - term.c_cflag = CLOCAL | CS8 | CSTOPB | CREAD; - term.c_lflag &= ~(ECHO | ICANON); - for (i = 0; i < NCCS; ++i) { - term.c_cc[i] = -1; - } - term.c_cc[VMIN] = 1; - term.c_cc[VTIME] = 0; - cfsetospeed(&term, B9600); - cfsetispeed(&term, B9600); - if (tcsetattr(fd, TCSAFLUSH, &term) != 0) { - perror("tcsetattr failed"); - return -1; - } - state = 0; - init = 1; - } -/* - * Read a whole bunch of characters from the tty - */ - - n = read(fd, bytes, sizeof bytes); - -/* - * And then process them ... - */ - - for (p = bytes; n > 0; --n) { - - switch (state) { - - case 0: - if (*p == 0) { - state = 1; - } - break; - - case 1: - if (*p & 0x0f == 0 || 1) { - switches = *p >> 4; - state = 2; - } - else { - state = 0; - } - break; - - case 2: - x1 = *p; - state = 3; - break; - - case 3: - y1 = *p; - state = 4; - break; - - case 4: - x2 = *p; - state = 5; - break; - - case 5: - state = 0; - value[0] = x1; - value[1] = y1; - value[2] = x2; - value[3] = *p; - value[4] = switches; - updated = 1; - break; - } - ++p; - } - return updated; -} diff -Nru acm-5.0/src/linux_joystick.c acm-6.0+20200416/src/linux_joystick.c --- acm-5.0/src/linux_joystick.c 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/src/linux_joystick.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,147 +0,0 @@ -/* - * acm : an aerial combat simulator for X - * : Joystick support for the Linux Joystick driver v2.0.0 - * : documentation on the joystick driver is available in the - * : linux kernel in linux/Documentation/input/joystick.txt - * : and http://linuxconsole.sourceforge.net/input/joystick.html - * Copyright (C) 2003 David Fries - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 dated June, 1991. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. - */ -#include -#include -#include -#include -#include -#include - -static int fd = -1; -int LinuxJoystickPresent = 0; - -void -LinuxSetJoystickPort(const char * name) -{ - fd = open(name, O_RDONLY|O_NONBLOCK); - if(fd == -1) - { - fprintf(stderr, "Error opening joystick device "); - perror(name); - return; - } - LinuxJoystickPresent = 1; -} - -void -LinuxCalibrateJoystick() -{ - fprintf(stderr, "Please run jscal to calibrate " - "the Linux joystick driver.\n"); - fprintf(stderr, - "http://linuxconsole.sourceforge.net/input/joystick.html\n"); -} - -#ifndef __linux__ -#warning useful only on Linux -int -LinuxGetJoystickPosition( double *x1, double *y1, - double *rudder, double *throttle, int *switches) -{ - return -1; -} -#else -#include - -/* x1 ailerons - * y1 elevator - * x2 rudder - * y2 throttle - * switches bit 0 guns, bit 1 select weapon - */ -int -LinuxGetJoystickPosition( double *x1, double *y1, - double *rudder, double *throttle, int *switches) -{ - struct js_event jevent; - #define AXIS_MAX 4 - // rudder input is -1 to 1 with -2 being no rudder, same for throttle - static double axis[AXIS_MAX] = {0,0,-2,-2}; - /* If we get a button press event followed by a release event - * we still want to report that the button had been pressed. - * When we enter the routine release any pressed buttons that - * have release set on them, then reset the release. - * As we process the events a button press sets the buttons - * and unsets the release, while a button release sets the - * release. This is so the calling program always sees a button - * press no matter what the interval, while it might not - * see that a button was released for a short amount of time. - */ - int previous; - static int buttons = 0; - static int release = 0; - int result; - int b; - - if(fd == -1) - return -1; - - // reset any buttons that had been released, yet hadn't been reported - if((buttons & 1) && (release & 1 )) - buttons &= ~1; - if((buttons & 2) && (release & 2 )) - buttons &= ~2; - release = 0; - - previous = buttons; - - while((result = read(fd, &jevent, sizeof(jevent)))!=-1) - { - switch(jevent.type & ~JS_EVENT_INIT) - { - case JS_EVENT_BUTTON: - b = 1 << jevent.number; - if(jevent.value) // press - { - buttons |= b; - release &= ~b; - } - else // release - { - // we've arleady sent a press - if(previous & b) - { - buttons &= ~b; - release &= ~b; - previous &= ~b; - } - else - { - release |= b; - } - } - break; - case JS_EVENT_AXIS: - if(jevent.number < AXIS_MAX) - axis[jevent.number] = - -1 * (double)jevent.value/32768.0; - } - } - *x1 = axis[0]; - *y1 = axis[1]; - *rudder = axis[2]; - *throttle = axis[3]; - *switches = buttons; - - return 0; -} -#endif diff -Nru acm-5.0/src/linux_joystick.h acm-6.0+20200416/src/linux_joystick.h --- acm-5.0/src/linux_joystick.h 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/src/linux_joystick.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,36 +0,0 @@ -/* - * acm : an aerial combat simulator for X - * : Joystick support for the Linux Joystick driver v2.0.0 - * : documentation on the joystick driver is available in the - * : linux kernel in linux/Documentation/input/joystick.txt - * : and http://linuxconsole.sourceforge.net/input/joystick.html - * Copyright (C) 2003 David Fries - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 dated June, 1991. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. - */ - -#ifndef _LINUX_JOYSTICK_H -#define _LINUX_JOYSTICK_H 1 - -extern int LinuxJoystickPresent; - -void -LinuxSetJoystickPort(const char * name); -void -LinuxCalibrateJoystick(); -int -LinuxGetJoystickPosition( double *x1, double *y1, - double *x2, double *y2, int *switches); - -#endif // _LINUX_JOYSTICK_H diff -Nru acm-5.0/src/m61a1.c acm-6.0+20200416/src/m61a1.c --- acm-5.0/src/m61a1.c 1998-12-09 21:53:21.000000000 +0000 +++ acm-6.0+20200416/src/m61a1.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,857 +0,0 @@ -/* - * acm : an aerial combat simulator for X - * Copyright (C) 1991-1997 Riley Rainey - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 dated June, 1991. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. - */ - -#include -#include -#include - -#include "pm.h" -#ifdef HAVE_DIS -#include "dis.h" -#endif - -#define BORE_CROSS_SIZE 7 -#define MUZZLE_VELOCITY (3.2808 * 1036.0) -#define TRACER_MOD 10 -#define OFFSET_ANGLE (DEGtoRAD(6.0)) /* the gun points up at this angle */ -#define RATE_OF_FIRE (3000.0 / 60.0) /* rounds per second */ -#define FUZZ (DEGtoRAD(1.0)) /* distribution due to vibration */ - -int select_m61a1(craft *); -int display_m61a1(craft *, craftType *, viewer *, int *, int *); -int update_m61a1(craft *); -int press_m61a1(craft *); -int release_m61a1(craft *); -extern FILE *acm_fopen(char *name, char *access); -extern int acm_rand PARAMS((void)); -void lcos(craft * c, viewer * u, int *x, int *y); -extern int - dis_fire_cannon(craft * c, VPoint * pos, VPoint * vel, int quantity, int rate); -int isCannonHit(double min, craft * c); - -int cdebug = 0; /* set to 1 to debug cannon fire */ - -weaponDesc m61a1Desc = -{ - WK_M61A1, - select_m61a1, /* select */ - update_m61a1, /* update */ - display_m61a1, /* display procedure */ - press_m61a1, /* fire */ - release_m61a1, /* fire button release */ -}; - -/* - * We'll take a running average of our pitch and yaw rates to keep the - * aiming reticle from jumping all over the screen. - */ - -#define HIST 8 - -typedef struct { - double pitch_hist[HIST]; - double yaw_hist[HIST]; - int cur; /* current entry in the histories */ - int count; /* number of valid entries */ - double pitch_total; - double yaw_total; -} hist_t; - -static hist_t history[MAXPLAYERS]; - -/* - * m61a1 selection function - * - * A selection function normally determines whether there are any weapons - * of this type on-board. If so, and the weapon system is functional - * (in other words, undamaged) then return 1; otherwise return 0. - */ - -int -select_m61a1(craft * c) -{ - - hist_t *p; - - p = &history[c->pIndex]; - p->count = p->cur = 0; - p->pitch_total = p->yaw_total = 0.0; - -/* - * The cannon must be located at station zero, for now. We should - * change that. - */ - - if (strcmp(c->station[0].type, "m61a1") == 0 && c->station[0].info > 0) { - c->station[0].info4 = 0.0; - return 1; - } - else - return 0; - -} - -/* - * m61a1 display function - * - * Update the HUD display strings associated with this weapon system. - */ - -/*ARGSUSED */ -int -display_m61a1(craft * c, craftType * w, viewer * u, int *x, int *y) -{ - - char s[16]; - register int tx, ty, m; - XSegment seg[2]; - hist_t *p; - - p = &history[c->pIndex]; - if ((m = p->cur = p->cur + 1) >= HIST) - m = p->cur = 0; - if (p->count != HIST) - (p->count)++; - else { - p->pitch_total -= p->pitch_hist[m]; - p->yaw_total -= p->yaw_hist[m]; - } - p->pitch_hist[m] = c->q; - p->yaw_hist[m] = c->r; - p->pitch_total += c->q; - p->yaw_total += c->r; - - strcpy(c->leftHUD[2], "LCOS"); - sprintf(s, "%.3d M-61A1", c->station[0].info); - strcpy(c->leftHUD[3], s); - if (c->station[0].info3) - strcpy(c->leftHUD[4], "FIRING"); - else - strcpy(c->leftHUD[4], ""); - -/* - * Draw the boresight cross - */ - - m = (int) ((double) BORE_CROSS_SIZE * u->scaleFactor); - - tx = u->xCenter; - ty = u->yCenter - (int) (3.0 * 9.0 * u->scaleFactor + 0.5); - seg[0].x1 = tx - m; - seg[0].x2 = tx + m; - seg[0].y1 = seg[0].y2 = ty; - seg[1].x1 = seg[1].x2 = tx; - seg[1].y1 = ty - m; - seg[1].y2 = ty + m; - VDrawSegments(u->v, seg, 2, (Color) u->v->pixel[HUDPixel]); - -/* - * Plot the reticle. - */ - - lcos(c, u, x, y); - - return 0; - -} - -int -press_m61a1(craft * c) -{ - c->station[0].info3 |= 1; - if (c->station[0].info > 0) { - playContinuousSound(c, SoundCannonFiring); - } - return 0; -} - -int -release_m61a1(craft * c) -{ - c->station[0].info3 &= ~1; - c->station[0].info4 = 0.0; - stopSound(c, SoundCannonFiring); - return 0; -} - -int -update_m61a1(craft * c) -{ - - craft *m; - int i; - VPoint tmp, tmp1, mvel; - double fuzz, fuzzAngle, phiY, phiZ, tm, mv = MUZZLE_VELOCITY; - - if (c->station[0].info3 == 0) - return 0; - -/* - * Got any ammunition ? - */ - - if (c->station[0].info <= 0) - return -1; - -/* - * It is possible (especially on today's faster machines) that no rounds - * actually left the barrel during this time interval. - */ - - if (c->station[0].info4 > deltaT) { - if (cdebug) { - printf("no rounds interval offset = %.3f, deltaT = %.3f\n", - c->station[0].info4, deltaT); - } - c->station[0].info4 -= deltaT; - } - else { - -/* - * Allocate a projectile record - */ - - for ((i = 0, m = &mtbl[0]); i < MAXPROJECTILES; (++i, ++m)) - if (m->type == CT_FREE) { - m->type = CT_CANNON; - break; - } - if (i == MAXPROJECTILES) - return -1; - -/* - * Determine how far we're fuzzed off the ideal boresight. - */ - - fuzz = ((double) (acm_rand() & 32767) + - (double) (acm_rand() & 32767)) / 32767.0 - 1.0; - fuzz = fuzz * FUZZ; - fuzzAngle = 2.0 * pi * (double) (acm_rand() & 511) / 511.0; - -/* - * Determine the initial velocity of the projectile stream. - */ - - phiZ = fuzz * sin(fuzzAngle); - phiY = fuzz * cos(fuzzAngle); - tm = mv * cos(OFFSET_ANGLE + phiZ); - - tmp.x = tm * cos(phiY); - tmp.y = tm * sin(phiY); - tmp.z = mv * sin(-OFFSET_ANGLE + phiZ); - VTransform(&tmp, &(c->trihedral), &mvel); - - m->owner = c->pIndex; - m->createTime = curTime; - - m->gvs_instance = (GVS_OBI) NULL; - - m->curRoll = c->curRoll; - m->curPitch = c->curPitch; - m->curHeading = c->curHeading; - - m->Cg = c->Cg; - m->Cg.x += mvel.x; - m->Cg.y += mvel.y; - m->Cg.z += mvel.z; - -/* - * Determine the initial position. - */ - - VTransform_(&c->cinfo->wStation[0], &c->trihedral, &tmp1); - VReverseTransform_(&tmp1, &c->XYZtoNED, &tmp); - m->Sg.x = c->Sg.x + FEETtoMETERS(tmp.x); - m->Sg.y = c->Sg.y + FEETtoMETERS(tmp.y); - m->Sg.z = c->Sg.z + FEETtoMETERS(tmp.z); - m->prevSg = m->Sg; - - DISGeocentricToWorldCoordinates - ((dis_world_coordinates *) & m->Sg, &m->w); - m->prevw = m->w; - GenerateWorldToLocalMatrix(&m->w, &m->XYZtoNED); - -/* - * Subtract the number of rounds fired. - */ - - m->offset = c->station[0].info4; - m->interval = deltaT; - m->rounds = 1 + (int) (RATE_OF_FIRE * (deltaT - m->offset)); - m->rounds = (m->rounds > c->station[0].info) ? - c->station[0].info : m->rounds; - if (cdebug) { - printf("rounds = %d, offset = %.3f sec, interval = %.4f\n", - m->rounds, m->offset, m->interval); - } - -/* - * Compute time interval until the next round leaves the barrel (in a - * subsequent time interval). - */ - - c->station[0].info4 = 1.0 / RATE_OF_FIRE - - fmod(deltaT - m->offset, 1.0 / RATE_OF_FIRE); - -/* - * include tracer information - */ - - m->tracerMod = TRACER_MOD; - m->tracerVal = c->station[0].info2 % m->tracerMod; - if (arcadeMode == 0) { - c->station[0].info -= m->rounds; - } - c->station[0].info2 += m->rounds; - - m->cinfo = lookupCraft("m61a1 cannon"); - -#ifdef HAVE_DIS - dis_fire_cannon(c, &m->Sg, &m->Cg, m->rounds, (int) RATE_OF_FIRE); -#endif - - } - - if (c->station[0].info <= 0) { - stopSound(c, SoundCannonFiring); - } - return 0; - -} - -extern craftType *newCraft(void); - -int -placeCannon(Viewport * vp, craft * c, VMatrix * m, VPolygon ** poly, long *cnt) -{ - - double t, startT; - VPoint v, s; - int i, j, k, n; - VPoint *q, tmp; - VPolygon **p; - -/* - * Reduce the shell path to a set of parametric equations. - */ - - v.x = c->Sg.x - c->prevSg.x; - v.y = c->Sg.y - c->prevSg.y; - v.z = c->Sg.z - c->prevSg.z; - -/* - * Now add each tracer shell to the view. - */ - - startT = (c->offset + (c->tracerVal / RATE_OF_FIRE)) / c->interval; - - for (t = startT; t <= 1.0; t += TRACER_MOD / (RATE_OF_FIRE * c->interval)) { - - s.x = -v.x * t; - s.y = -v.y * t; - s.z = -v.z * t; - -/* TODO: check should be based on local altitude */ -/* underground? don't plot it */ - - if (c->w.z + s.z < 0.0) { - continue; - } - - n = c->cinfo->object->numPolys; - p = c->cinfo->object->polygon; - j = *cnt; - for (i = 0; i < n; ++i) { - poly[j] = VCopyPolygon(p[i]); - for ((k = 0, q = poly[j]->vertex); k < poly[j]->numVtces; (++k, ++q)) { - VTransform(q, m, &tmp); - tmp.x += s.x; - tmp.y += s.y; - tmp.z += s.z; - *q = tmp; - } - VTransformPolygon(poly[j], &vp->eyeSpace); - ++j; - } - *cnt = j; - } - - return 0; -} - -void -initm61a1(void) -{ - - craftType *c; - FILE *f; - dis_entity_type em1 = - {2, 9, 225, 2, 1, 0, 0}; - dis_entity_type em2 = - {2, 1, 222, 2, 3, 0, 0}; - - wtbl[1] = m61a1Desc; - - c = newCraft(); - c->name = strdup("m61a1 cannon"); - - c->entityType = em1; - c->altEntityType = em2; - - c->placeProc = placeCannon; - - f = acm_fopen("tracer.obv", "r"); - c->object = VReadObject(f); - fclose(f); - -} - -int -cannonCalculations(craft * c) -{ - double dNorth, dEast, dmag; - -/* - * Kill projectile streams after 10.0 seconds of flight or when - * they strike the ground. - */ - - if (curTime - c->createTime > 10.0) - return 1; - -/* TODO */ - if (c->w.z < 0.0) { - return 1; - } - - c->prevSg = c->Sg; - c->prevw = c->w; - - dNorth = FEETtoMETERS(c->Cg.x * deltaT); - dEast = FEETtoMETERS(c->Cg.y * deltaT); - c->w.z -= FEETtoMETERS(c->Cg.z * deltaT + earth_g * halfDeltaTSquared); - - dmag = sqrt(dNorth * dNorth + dEast * dEast); - - DISUpdateWorldCoordinates(&c->w, dNorth / dmag, dEast / dmag, dmag); - DISWorldCoordinatesToGeocentric(&c->w, - (dis_world_coordinates *) & c->Sg); - - c->Cg.z += earth_g * deltaT; - - return 0; - -} - -/* - * plotReticle : draws the aiming reticle onto the HUD. - * - * An aiming reticle is a circle with an inner arc that clues the - * pilot as to the range of the target. Twelve tic marks are used - * to demarcate the range -- each tic represents 1000 feet of - * distance. - */ - -static struct { - double x, y; -} ticTable[12] = { - - { - 0.0, -1.0 - }, - { - 0.5, -0.866 - }, - { - 0.866, -0.5 - }, - { - 1.0, 0.0 - }, - { - 0.866, 0.5 - }, - { - 0.5, 0.866 - }, - { - 0.0, 1.0 - }, - { - -0.5, 0.866 - }, - { - -0.866, 0.5 - }, - { - -1.0, 0.0 - }, - { - -0.866, -0.5 - }, - { - -0.5, -0.866 - } -}; - -/*ARGSUSED */ -void -plotReticle(craft * c, viewer * u, int x, int y, int range) -{ - -#define RETICLE_SIZE 65 -#define RANGE_SIZE 59 -#define TICK_SIZE (RETICLE_SIZE + 12) - - register int i, size, xt, yt, size1, xt1, yt1, nseg, arc; - XSegment seg[16]; - register double rs, rt; - - size = (int) (RETICLE_SIZE * u->scaleFactor); - if ((size & 1) == 0) - ++size; /* insure it is an odd value */ - xt = x - size / 2; - yt = y - size / 2; - rs = size / 2; - rt = ((TICK_SIZE + 1) / 2) * u->scaleFactor; - - for (i = 0; i < 12; i++) { - seg[i].x1 = x + - (int) (rs * ticTable[i].x + 0.5); - seg[i].y1 = y + - (int) (rs * ticTable[i].y + 0.5); - seg[i].x2 = x + - (int) (rt * ticTable[i].x + 0.5); - seg[i].y2 = y + - (int) (rt * ticTable[i].y + 0.5); - } - - nseg = 12; - VDrawArc(u->v, xt, yt, size, size, 0, - 360 * 64, (Color) (u->v->pixel[HUDPixel])); - - if (range != -1) { - if (range > 12000) - range = 12000; - arc = -range * 23040 / 12000; - size1 = (int) (RANGE_SIZE * u->scaleFactor); - if ((size1 & 1) == 0) - ++size1; - if (size == size1) - --size1; - xt1 = x - size1 / 2; - yt1 = y - size1 / 2; - VDrawArc(u->v, xt1, yt1, size1, size1, - 90 * 64, arc, (Color) (u->v->pixel[HUDPixel])); - } - VDrawSegments(u->v, seg, nseg, (Color) (u->v->pixel[HUDPixel])); - -} - -void -lcos(craft * c, viewer * u, int *x, int *y) -{ - -/* - * How does this LCOS thing work, anyway? - * - * First, let me say that this may or, more probably, may not look - * anything like the technique used in a real fighter's gun sighting - * system. Having said that, here's the basic assumptions and steps - * used to generate the reticle on the HUD: - * - * 1) Using radar, we know the distance to the target. Assuming that the - * radar is in working order and is locked onto something. - * - * 2) We know the muzzle velocity of the shells we're firing and can - * use that value to closely estimate the flight time of the shells - * to a target that's a certain distance away (the target). Call - * this value "fTime". - * - * 3) Use the muzzle velocity vector to determine the - * relative position (w.r.t. our craft) of a shell "fTime" seconds into - * its flight. Call this vector "pos". - * - * 4) Gravity will accelerate the shells. Use d = 0.5 * g * t ^ 2 - * to add a distance (along the Z axis that will approximate the - * effect of gravity. Add that to "pos". - * - * 5) We know our pitch and yaw rates. These rotations will have the - * effect of visually "bending" the cannon stream, from the pilot's - * perspective. Use the values to generate a matrix to transform - * "pos" by an amount proportional to our "fTime" value. - * - * 6) Convert our "pos" vector to screen x,y coordinates and call - * plotReticle. - */ - - double fTime, range, gm, pitch_rate, yaw_rate; - VPoint pos, tmp; - VPoint zg, z; - VMatrix rotation; - int clue; - hist_t *hist; - - hist = &history[c->pIndex]; - -/* Step 1 */ - - if (c->curRadarTarget >= 0) - range = c->targetDistance; - else - range = 2500.0; - -/* Step 2 */ - - fTime = range / MUZZLE_VELOCITY; - -/* Step 3 */ - - pos.x = fTime * MUZZLE_VELOCITY * cos(OFFSET_ANGLE); - pos.y = 0.0; - pos.z = -fTime * MUZZLE_VELOCITY * sin(OFFSET_ANGLE); - -/* Step 4 */ - - zg.x = zg.y = 0.0; - zg.z = 1.0; - - VReverseTransform_(&zg, &c->trihedral, &z); - - gm = 0.5 * earth_g * fTime * fTime; - pos.x += z.x * gm; - pos.y += z.y * gm; - pos.z += z.z * gm; - -/* Step 5 */ - - VIdentMatrix(&rotation); - - pitch_rate = hist->pitch_total / (double) hist->count; - yaw_rate = hist->yaw_total / (double) hist->count; - - if (pitch_rate != 0.0) - VRotate(&rotation, YRotation, pitch_rate * fTime); - if (yaw_rate != 0.0) - VRotate(&rotation, ZRotation, yaw_rate * fTime); - - VTransform(&pos, &rotation, &tmp); - -/* Step 6 */ - - *x = (u->v->Middl.x + (int) (tmp.y * u->v->Scale.x / tmp.x)) >> 2; - *y = (u->v->Middl.y + (int) (tmp.z * u->v->Scale.y / tmp.x)) >> 2; - - if (c->curRadarTarget >= 0) - clue = (int) c->targetDistance; - else - clue = -1; - - plotReticle(c, u, *x, *y, clue); -} - -/* - * lookForCannonImpacts : Track cannon shells and look for impacts with - * aircraft. This algorithm tracks each shell's - * flight. - */ - -typedef struct _entry { - double time; - double min; - VPoint Sg; - VPoint rvel; - craft *c; - struct _entry *next; -} entry; - -extern int cdebug; - -void -lookForCannonImpacts(craft * m) -{ - - craft *c; - entry p[MAXPLAYERS], *list, *q, *r, *rprev; - VPoint v, s0, prevSg, Vm, zeroVec = {0, 0, 0}; - double t, d, roundT, startT, explosion_diameter_meters; - int j; - -#ifdef HAVE_DIS - double worldLocation[3], entityLocation[3]; - -#endif - - startT = m->offset / m->interval; - - Vm.x = m->Sg.x - m->prevSg.x; - Vm.y = m->Sg.y - m->prevSg.y; - Vm.z = m->Sg.z - m->prevSg.z; - - for (roundT = startT; roundT < 1.0; roundT += 1.0 / (RATE_OF_FIRE * m->interval)) { - - prevSg.x = m->prevSg.x - Vm.x * (1.0 - roundT); - prevSg.y = m->prevSg.y - Vm.y * (1.0 - roundT); - prevSg.z = m->prevSg.z - Vm.z * (1.0 - roundT); - - list = (entry *) NULL; - for (c = ptbl, j = 0; j < MAXPLAYERS; ++j, ++c) { - - if (c->type == CT_FREE || m->owner == c->pIndex) - continue; - -/* - * Reduce the relative motion of this object to a the parametric system - * of equations: - * x(t) = vx * t + s0x - * y(t) = vy * t + s0y - * z(t) = vz * t + s0z - * - * We can then compute the time of perigee (closest pass) along with - * the associated minimum distance. - */ - - v.x = c->Sg.x - c->prevSg.x - Vm.x; - v.y = c->Sg.y - c->prevSg.y - Vm.y; - v.z = c->Sg.z - c->prevSg.z - Vm.z; - s0.x = c->prevSg.x - prevSg.x; - s0.y = c->prevSg.y - prevSg.y; - s0.z = c->prevSg.z - prevSg.z; - -/* - * Compute time of minimum distance between the two objects (note that units - * here are UPDATE_INTERVAL seconds). - */ - - t = -(v.x * s0.x + v.y * s0.y + v.z * s0.z) / - (v.x * v.x + v.y * v.y + v.z * v.z); - - if (cdebug) { - printf("perigee in %g seconds with player %d\n", - t * deltaT, j); - } - -/* - * If the closest pass occurs during this update interval, check for a hit. - * We'll build a linked list of all craft that this projectile may strike - * during this period, arranged in ascending order by time of "perigee" - * (closest pass). We'll then test for strikes. If a projectile misses - * the first object, then it may have struck subsequent objects in the - * list ... - */ - -/* - * One special case occurs when a target or missile's turn suddenly - * changes the perigee time from positive to negative. If the missile - * is within hitting range at t=0 and the time of perigee is negative, - * then zap 'em. - */ - - if (t < 0.0) { - d = sqrt(s0.x * s0.x + s0.y * s0.y + - s0.z * s0.z); - if (isCannonHit(d, c)) { - t = 0.0; - } - } - if (t >= 0.0 && t <= 1.0) { - q = &p[j]; - - q->Sg = prevSg; - q->Sg.x += Vm.x * t; - q->Sg.y += Vm.y * t; - q->Sg.z += Vm.z * t; - - q->rvel = v; - - if (list == (entry *) NULL) { - q->next = list; - list = q; - } - else if (list->time > t) { - q->next = list; - list = q; - } - else { - for (rprev = list, r = list->next; r != (entry *) NULL;) { - if (r->time > t) - break; - rprev = r; - r = r->next; - } - if (rprev != list) - rprev->next = q; - q->next = r; - } - q->time = t; - q->c = c; - q->min = sqrt(pow(v.x * t + s0.x, 2.0) + - pow(v.y * t + s0.y, 2.0) + - pow(v.z * t + s0.z, 2.0)); - if (cdebug) { - printf("perigee %g feet; craft %d.\n", - q->min, j); - } - } - } - -/* - * Now look for cannon hits in the list of perigees. - */ - - for (r = list; r != (entry *) NULL; r = r->next) - if (isCannonHit(r->min, r->c)) { - newExplosion(&(r->Sg), &zeroVec, 1.0, 2.0, 0.5); -#ifdef HAVE_DIS - /* can only damage local player */ - if (r->c->type != CT_DIS_PLANE) -#endif - if (absorbDISDamage(r->c, &m->cinfo->entityType, 0, 0, - 0.0, - mag(r->rvel), - &explosion_diameter_meters) == 0) { - - killPlayerEx(r->c, - "Your aircraft was destroyed by cannon fire.", - "No further information is available."); - } -#ifdef HAVE_DIS - worldLocation[0] = r->Sg.x; - worldLocation[1] = r->Sg.y; - worldLocation[2] = r->Sg.z; - entityLocation[0] = 0.0; - entityLocation[1] = 0.0; - entityLocation[2] = 0.0; - if (disInUse) - dis_detonation( &m->cinfo->entityType, - c->disId, r->c->disId, - DIS_ID_NONE, worldLocation, entityLocation, - (double *) &r->rvel ); -#endif - break; - } - } -} - -/*ARGSUSED */ -int -isCannonHit(double min, craft * c) -{ - - return (min < 3.0) ? 1 : 0; -} diff -Nru acm-5.0/src/main.c acm-6.0+20200416/src/main.c --- acm-5.0/src/main.c 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/src/main.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,844 +0,0 @@ -/* - * acm : an aerial combat simulator for X - * Copyright (C) 1991-1998 Riley Rainey - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 dated June, 1991. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. - */ - -#if defined(SVR4) -#include -#endif - -#include "manifest.h" -#include "patchlevel.h" -#include -#include -#include -#include -#include -#include -#include "pm.h" -#include "dis/dis.h" - -#undef a - -#ifdef SVR4 -/* - * This forces the inclusion of filio.h (and other things) in ioctl.h - * on NCR SVR4. - */ -#define BSD_COMP 1 -#endif /* SVR4 */ - -#include -#include -#ifdef _AIX -#include -#endif -#include -#include -#include - -#include "linux_joystick.h" - -#ifdef SVR4 -static sigset_t sigset_mask, sigset_omask; -#endif /* SVR4 */ - -#if !defined(lint) && !defined(SABER) -static char sccsid[] = "@(#) acm by Riley Rainey; Revision 5.0"; -#endif - -extern struct servent *getservent( /* ??? */ ); -int sdebug = 1; -int listen_socket; -char *sceneFile = (char *) NULL; -extern double atof(const char *); - -extern void SetJoystickPort PARAMS((char *)); - -int processCommandFile(const char *fname, - int *argc, - char *argv[], - char *display, - char *auserver, - char *name, - char *switches); - -int processCommandSwitches (int argc, - char *argv[], - char *display, - char *auserver, - char *name, - char *switches); - -#ifdef HAVE_DIS - -#include "dis.h" - -int dis_site = DIS_SITE; -int dis_application = DIS_APPLICATION; -int dis_exercise = DIS_EXERCISE; -int no_splash; - -void -disEntityEnterCb(int eid, dis_entity_type * etype, int force, craft ** cptr) -{ - int i, j, top, mtype; - craft *c; - char *type; - int team; - craft *tbl; - - *cptr = NULL; - -#ifdef DIS_DEBUG - printf("%8.2f: Network Entity enter: %d\n", curTime, eid); -#endif - - if (etype->kind == DISKindPlatform) { - tbl = ptbl; - top = MAXPLAYERS; - mtype = CT_DIS_PLANE; - } - else if (etype->kind == DISKindMunition) { - tbl = mtbl; - top = MAXPROJECTILES; - mtype = CT_DIS_MUNITION; - } - else { - return; - } - -/* - * most of this is a copy of the newDrone code in newPlane.c - */ - - for (i = 0; i < top; ++i) { - - if (tbl[i].type == CT_FREE) { - - if (force == DISForceFriendly) { - team = 1; - } - else { - team = 2; - } - - c = &tbl[i]; - *cptr = c; - - c->createTime = curTime; - c->vl = NULL; - c->disId = eid; - c->team = team; - c->curOpponent = -1; - c->holdCount = 0; - - c->vl = NULL; - c->type = mtype; - c->cinfo = lookupCraftByEntityType(etype); - -/* - * If we don't know about a given entity type, then we will not track it. - */ - - if (!c->cinfo) { - *cptr = NULL; - c->type = CT_FREE; - return; - } - strncpy(c->name, "DIS", sizeof(c->name)); - - c->curNWDef = 0.0; - c->flags = 0; - c->radarMode = RM_OFF; - c->curRadarTarget = -1; - - for (j = 0; j < 6; ++j) { - c->leftHUD[j] = Vmalloc(32); - c->rightHUD[j] = Vmalloc(32); - strcpy(c->leftHUD[j], ""); - strcpy(c->rightHUD[j], ""); - } - - break; - } - } - - if (i == top) - fprintf(stderr, "Out of players (increase MAXPLAYERS)\n"); -} - -void -disDetonationCb(int ftype, - int firingEid, - int targetEid, - double time, - double *worldLocation, - double *entityLocation, - craft * m, - dis_detonation_pdu *dpdu) -{ - craft *c; - int j; - VPoint Sg, rloc, rvel, tmp; - double exp_diameter, dist_meters, vel_meters_per_sec; - - if (m) { - killMissile(m, (craft *) NULL); - } - -#ifdef DIS_DEBUG - printf("DIS detonation seen; target %d\n", targetEid); -#endif - - Sg.x = worldLocation[0]; - Sg.y = worldLocation[1]; - Sg.z = worldLocation[2]; - - for (c = ptbl, j = 0; j < MAXPLAYERS; ++j, ++c) - - if (c->type != CT_FREE && c->disId == targetEid) { - - /* found the target */ - - if (c->type != CT_DIS_PLANE) { - - /* impact distance from C.G. */ - - rloc.x = c->Sg.x - Sg.x; - rloc.y = c->Sg.y - Sg.y; - rloc.z = c->Sg.z - Sg.z; - dist_meters = mag(rloc); - - /* impact velocity */ - - tmp.x = FEETtoMETERS(c->Cg.x); - tmp.y = FEETtoMETERS(c->Cg.y); - tmp.z = FEETtoMETERS(c->Cg.z); - VReverseTransform_(&tmp, &c->XYZtoNED, &rvel); - rvel.x = dpdu->vel.x - rvel.x; - rvel.y = dpdu->vel.y - rvel.y; - rvel.z = dpdu->vel.z - rvel.z; - vel_meters_per_sec = mag(rvel); - - /* the target is a local player, damage him */ - if (absorbDISDamage(c, - &dpdu->burst.munition, - dpdu->burst.warhead, - dpdu->burst.fuze, - dist_meters, - vel_meters_per_sec, - &exp_diameter) == 0) { - killPlayerEx(c, - "Your aircraft has been destroyed.", - (ftype == DIS_FIRE_M61A1 ? - "You were struck by cannon fire." : - "Something (presumably a missile) detotated close enough to your aircraft to destroy it.")); - } - if (exp_diameter > 0.0) { - VPoint vel = { 0, 0, 0 }; - newExplosion (&Sg, &vel, exp_diameter * 0.3, exp_diameter, 3.0); - } - - } - break; - } -} - -int -disInit(void) -{ - int err, count; - char name[32]; - struct sockaddr_in sin; - - err = dis_init(dis_exercise, - dis_site, dis_application, - disEntityEnterCb, disDetonationCb); - dis_setDRThresholds(DIS_LOCATION_THRESHOLD, DIS_ORIENTATION_THRESHOLD); - - return err; -} - -#endif - -void -parseinfo(char *s, char *a, char *b, char *c) -{ - - char *p; - - for (p = a; *s; ++s, ++p) - if ((*p = *s) == ' ') { - *p = '\0'; - break; - } - ++s; - - for (p = b; *s; ++s, ++p) - if ((*p = *s) == ' ') { - *p = '\0'; - break; - } - ++s; - - strcpy(c, s); - - return; -} - -/* HACK; fix the switch handling in newPlayer */ -static char switches[1024]; - -main(int argc, char **argv) -{ - - struct sockaddr_in sin; - int on = 1; - int i, news; - char name[64]; - char display[64]; - char auserver[64]; - char *sargv[2]; - Display *dpy; - FILE *splash_file; - - strcpy( display, "" ); - strcpy( auserver, "" ); - strcpy( name, "" ); - -#ifdef MALLOC_DEBUG - mcheck((char *) NULL); -#endif - - curTime = 0.0; - - real_delta_t = 1; - - depth_cue_steps = 8; - - /* - * An endGameThreshold of -1.0 means "use the radar lock range for - * the current aircraft. - */ - - end_game_threshold_meters = -1.0; - end_game_mode = 0; - - /* - * When accepting control of an entity, the default is to use our - * site ID and keep everything else the same. - */ - - transferEntityIdBits = 0x4; - - /* - * these only apply to non-real time updating - */ - - update_interval_millisec = 1000.0 / 50.0; /* 50.0 hertz */ - frame_interval_millisec = 1000.0 / 15.0; /* 15.0 hertz */ - - watch_frame_rate = 0; - - droneAggressiveness = DEFAULT_DRONE_FACTOR; - -#ifdef HAVE_DIS - disAbsoluteTime = 0; -#endif - - ptblCount = ctblCount = 0; - visibility = FEETtoMETERS(50.0 * NM); - - /* - * Define handler for DIS transfer control requests - */ - - dis_setTransferControlRequestCallback ( transferControlRequestHandler ); - -/* - * parse arguments - */ - - switches[0] = '\0'; - - processCommandSwitches (argc, argv, display, auserver, name, switches); - -#ifdef HAVE_DIS - { - -/* - * If the user has not specified a DIS application ID and has not referred - * us to a SIM/x server, automatically generate an application id based - * on the low-order 16-bits of this host's IP address. This is a bit of a - * hack, but it will assure that we get a unique application id so long as we - * are not using any sort of DIS bridge software. - */ - - char name[256], *p; - struct hostent *h; - - gethostname(name, sizeof(name)); - - if (dis_application == DIS_APPLICATION) { - if ((h = gethostbyname(name)) != (struct hostent *) NULL) { - p = h->h_addr; - dis_application = (p[2] << 8) | p[3]; - } - } - } - - if (real_delta_t == 0) { - - redraw_interval = (int) - (frame_interval_millisec / update_interval_millisec + 0.5); - /* - * Set time intervals. - */ - - deltaT = update_interval_millisec / 1000.0; - - halfDeltaTSquared = 0.5 * deltaT * deltaT; - - } - - if (disInit() == 0) - disInUse = 1; - else - disInUse = 0; -#endif - - if (strlen(display) == 0) { - if (getenv("DISPLAY")) { - strncpy(display, getenv("DISPLAY"), sizeof(display)); - if (strlen(auserver) == 0) { - strcpy(auserver, display); - } - } - else { - fprintf(stderr, "Excuse me, but you have no DISPLAY.\n" - "How do you use X, anyway?\n"); - exit(1); - } - } - - printf("\ -ACM version %s, Copyright (C) 1991-1998 Riley Rainey (rrainey@ix.netcom.com)\n\n\ -ACM comes with ABSOLUTELY NO WARRANTY.\n\ -This is free software, and you are welcome to distribute it under the\n\ -conditions described in the COPYING file.\n\n", REVISION_STRING); - -#ifdef HAVE_DIS - if (disInUse) - if (DISDisableWrite == 1) - printf("DIS protocol silent.\n\n"); - else - printf("DIS protocol active.\n\n"); -#endif - -#if defined(NETAUDIO) - printf("This ACM program was built with sound support (netaudio).\n\n"); -#else -#if defined(_HPUX_SOURCE) - printf("This ACM program was built with sound support (HP AAPI).\n\n"); -#endif -#endif - - init("/usr/share/games/acm/"); - - dpy = XOpenDisplay(display); - splash_file = acm_fopen ("acmlogo-unix.xwd", "r"); - - sargv[0] = "acm"; - sargv[1] = NULL; - - if (!no_splash) - splashScreen(dpy, splash_file, 1, sargv); - - news = 2; - - if (newPlayer(news, display, auserver, name, switches) == 0) { - } - - input(); -#ifdef LINT - return 0; -#endif - -} - -#ifdef HAVE_STRUCT_SIGACTION -static struct sigaction alrm; -#else -static struct sigvec alrm; -#endif - -int doUpdate = 0; - -acm_sig_t -myalarm(int s) -{ - doUpdate++; -#ifdef HAVE_STRUCT_SIGACTION - sigaction(SIGALRM, &alrm, (struct sigaction *) 0); -#else - sigvec (SIGALRM, &alrm, (struct sigvec *) 0); -#endif -} - -acm_sig_t -killed(int i) -{ - printf("\ninterrupt\n"); - shutdown(listen_socket, 2); - close(listen_socket); -#ifdef HAVE_DIS - dis_close(); -#endif - exit(0); -} - -input(void) -{ - - fd_set fdset, ofdset; - int news = -1, playerchange = 0, n, pno, addrlen; - int on = 1; - struct sockaddr addr; - struct itimerval update; - char *bp, buf[128], name[64], display[64], args[256]; - struct timeval zero_timeout, update_timeout; - - signal(SIGINT, killed); - signal(SIGQUIT, killed); - - zero_timeout.tv_sec = 0; - zero_timeout.tv_usec = 0; - update_timeout.tv_sec = 0; - update_timeout.tv_usec = (long) (update_interval_millisec * 1000); - - /* - * If we aren't supposed to be running full-bore, then setup the - * real time interval clock. - */ - - if (real_delta_t == 0) { - -#ifdef HAVE_STRUCT_SIGACTION - alrm.sa_handler = myalarm; - sigemptyset( &alrm.sa_mask ); - alrm.sa_flags = 0; - sigaction( SIGALRM, &alrm, (struct sigaction *) 0 ); -#else - alrm.sv_handler = myalarm; - sigemptyset( &alrm.sv_mask ); -#ifdef __hpux - alrm.sv_flags = SV_BSDSIG; -#else - alrm.sv_flags = SV_INTERRUPT; -#endif - sigvec(SIGALRM, &alrm, (struct sigvec *) 0); -#endif - - /* - * Set real time clock to interrupt us at the appropriate interval - */ - - update.it_interval.tv_sec = 0; - update.it_interval.tv_usec = (long) (update_interval_millisec * 1000); - update.it_value.tv_sec = 0; - update.it_value.tv_usec = (long) (update_interval_millisec * 1000); - - setitimer(ITIMER_REAL, &update, 0); - - } - - FD_ZERO(&ofdset); - FD_ZERO(&fdset); - FD_SET(listen_socket, &ofdset); - - for (;;) { - -#ifdef SVR4 - (void) sigprocmask(SIG_SETMASK, &sigset_omask, NULL); -#else - sigsetmask(0); -#endif /* SVR4 */ - - fdset = ofdset; - - if (real_delta_t == 0) { - pno = select(32, &fdset, (fd_set *) NULL, (fd_set *) NULL, - (struct timeval *) NULL); - } - else { - if (ptblCount == 0) { - pno = select(32, &fdset, (fd_set *) NULL, (fd_set *) NULL, - &update_timeout); - } - else { - pno = select(32, &fdset, (fd_set *) NULL, (fd_set *) NULL, - &zero_timeout); - } - doUpdate++; - } - -#ifdef SVR4 - (void) sigemptyset(&sigset_mask); - (void) sigaddset(&sigset_mask, SIGALRM); - (void) sigprocmask(SIG_BLOCK, &sigset_mask, &sigset_omask); -#else - sigblock(sigmask(SIGALRM)); -#endif /* SVR4 */ - - if (pno < 0) { - FD_CLR(listen_socket, &fdset); - if (news > 0) - FD_CLR(news, &fdset); - } - if (doUpdate) { - doUpdate = 0; - redraw(); - } - } -} - -int -processCommandFile(const char *fname, - int *argc, - char *argv[], - char *display, - char *auserver, - char *name, - char *switches) -{ - FILE *f; - char commands[4096]; - int i, c; - - f = fopen (fname, "r"); - if (f == NULL) { - return -1; - } - - i = 0; - while ((c = fgetc(f)) != EOF) { - if (i >= sizeof(commands)) { - return -2; - } - if (c == '\n') { - c = ' '; - } - commands[i++] = c; - } - commands[i] = '\0'; - - split (commands, argc, &argv[1]); - - processCommandSwitches ( *argc, argv, display, auserver, name, switches); - - fclose (f); - - return 0; -} - -int -processCommandSwitches (int argc, char *argv[], - char *display, - char *auserver, - char *name, - char *switches) -{ - int i; - int xargc; - char *xargv[128]; - - for (i = 1; i < argc; ++i) { - -#ifdef HAVE_DIS - if (strcmp(argv[i], "-simx") == 0) { - dis_site = 0; - dis_application = 0; - } - else if (strcmp(argv[i], "-dis-site") == 0 && ++i < argc) { - dis_site = strtol(argv[i], (char **) NULL, 0); - } - else if (strcmp(argv[i], "-dis-appl") == 0 && ++i < argc) { - dis_application = strtol(argv[i], (char **) NULL, 0); - } - else if (strcmp(argv[i], "-dis-exercise") == 0 && ++i < argc) { - dis_exercise = strtol(argv[i], (char **) NULL, 0); - } - else if (strcmp(argv[i], "-dis-absolute-time") == 0) { - disAbsoluteTime = 1; - } - else if (strcmp(argv[i], "-dis-silent") == 0) { - DISDisableWrite = 1; - } - else if (strncmp(argv[i], "-dis", 4) == 0) { - fprintf(stderr, "Acm DIS arguments:\n" - " -dis-exercise (default %d)\n" - " -dis-site (default %d)\n" - " -dis-appl (default %d)\n" - " -dis-absolute-time\n", - DIS_EXERCISE, DIS_SITE, DIS_APPLICATION); - exit(1); - } - else -#endif - if (strcmp(argv[i], "-init") == 0 && ++i < argc) { - processCommandFile (argv[i], &xargc, xargv, - display, auserver, name, switches); - } - else if (strcmp(argv[i], "-arcade") == 0) { - arcadeMode = 1; - } - else if (strcmp(argv[i], "-depth_steps") == 0 && ++i < argc) { - depth_cue_steps = atoi(argv[i]); - if (depth_cue_steps < 1) { - depth_cue_steps = 1; - } - } - else if (strcmp(argv[i], "-da") == 0 && ++i < argc) { - droneAggressiveness = atof(argv[i]) * NM; - if (droneAggressiveness <= MIN_DRONE_FACTOR) { - droneAggressiveness = MIN_DRONE_FACTOR; - } - else if (droneAggressiveness > 1.0) { - droneAggressiveness = 1.0; - } - } - else if (strcmp(argv[i], "-display") == 0 && ++i < argc) { - strncpy( display, argv[i], 64 ); - } - else if (strcmp(argv[i], "-audio") == 0 && ++i < argc) { - strncpy( auserver, argv[i], 64 ); - } - else if (strcmp(argv[i], "-geometry") == 0 && ++i < argc) { - sprintf(&switches[strlen(switches)], "|-geometry|%s", argv[i]); - } - else if (strcmp(argv[i], "-linuxjs") == 0) { - if (argv[i + 1] && *(argv[i + 1]) != '-') { - LinuxSetJoystickPort(argv[++i]); - } - else { - LinuxSetJoystickPort("/dev/js0"); - } - } - else if (strcmp(argv[i], "-js") == 0) { - if (argv[i + 1] && *(argv[i + 1]) != '-') { - SetJoystickPort(argv[++i]); - } - else { - SetJoystickPort("/dev/cua0"); - } - } - else if (strcmp(argv[i], "-name") == 0 && ++i < argc) { - strncpy(name, argv[i], 64); - } - else if (strcmp(argv[i], "-plane") == 0 && ++i < argc) { - sprintf(&switches[strlen(switches)], "|-plane|%s", argv[i]); - } - else if (strcmp(argv[i], "-scene") == 0 && ++i < argc) { - sceneFile = argv[i]; - } - else if (strcmp(argv[i], "-nosplash") == 0) { - no_splash = 1; - } - else if (strcmp(argv[i], "-stealth") == 0) { - sprintf(&switches[strlen(switches)], "|-stealth"); - } - else if (strcmp(argv[i], "-end-game") == 0) { - sprintf(&switches[strlen(switches)], "|-end-game"); - } - else if (strcmp(argv[i], "-threshold-range") == 0 && ++i < argc) { - double end_game_threshold_nm; - - end_game_threshold_nm = atof( argv[i] ); - if (end_game_threshold_nm < 1.0) { - end_game_threshold_nm = 1.0; - } - end_game_threshold_meters = FEETtoMETERS(end_game_threshold_nm*NM); - } - else if (strcmp(argv[i], "-control") == 0) { - sprintf(&switches[strlen(switches)], "|-stealth"); - /* and, yes, that really should read "|-stealth" */ - } - else if (strcmp(argv[i], "-team") == 0 && ++i < argc) { - sprintf(&switches[strlen(switches)], "|-team|%s", argv[i]); - } - else if (strcmp(argv[i], "-latitude") == 0 && ++i < argc) { - sprintf(&switches[strlen(switches)], "|-altitude|%s", argv[i]); - } - else if (strcmp(argv[i], "-longitude") == 0 && ++i < argc) { - sprintf(&switches[strlen(switches)], "|-altitude|%s", argv[i]); - } - else if (strcmp(argv[i], "-altitude") == 0 && ++i < argc) { - sprintf(&switches[strlen(switches)], "|-altitude|%s", argv[i]); - } - else if (strcmp(argv[i], "-heading") == 0 && ++i < argc) { - sprintf(&switches[strlen(switches)], "|-heading|%s", argv[i]); - } - else if (strcmp(argv[i], "-airspeed-kts") == 0 && ++i < argc) { - sprintf(&switches[strlen(switches)], "|-airspeed-kts|%s", argv[i]); - } - else if (strcmp(argv[i], "-visibility") == 0 && ++i < argc) { - visibility = atof(argv[i]); - if (visibility < 1.0) { - visibility = 1.0; - } - else if (visibility > 500.0) { - visibility = 500.0; - } - visibility *= NM; - visibility = FEETtoMETERS(visibility); - } - else if (strcmp(argv[i], "-frame-rate") == 0 && ++i < argc) { - double val = atof(argv[i]); - frame_interval_millisec = 1000.0 / val; - - real_delta_t = 0; - } - else if (strcmp(argv[i], "-update-rate") == 0 && ++i < argc) { - double val = atof(argv[i]); - update_interval_millisec = 1000.0 / val; - real_delta_t = 0; - } - else if (strcmp(argv[i], "-watch-frame-rate") == 0) { - watch_frame_rate = 1; - } - else if (strcmp(argv[i], "-transfer-entity-mode") == 0 && ++i < argc) { - transferEntityIdBits = strtol ( argv[i], NULL, 0 ); - } - else if (strcmp(argv[i], "-subject-entity-id") == 0 && ++i < argc) { - dis_entity_id id; - if (DISParseEntityID ( &id, argv[i], - strlen(argv[i])+1, ":/." ) == 0) { - subjectEntityID = id; - subjectEntitySpecified = 1; - } - else { - fprintf(stderr, "Invalid entity ID \"%s\"\n", argv[i]); - exit (1); - } - } - else { - fprintf(stderr, "Invalid switch \"%s\"\n", argv[i]); - exit(1); - break; - } - } -} diff -Nru acm-5.0/src/Makefile acm-6.0+20200416/src/Makefile --- acm-5.0/src/Makefile 1970-01-01 00:00:00.000000000 +0000 +++ acm-6.0+20200416/src/Makefile 2020-04-16 12:05:39.000000000 +0000 @@ -0,0 +1,17 @@ +all: + find . -mindepth 2 -name Makefile \ + | while read m; do make -C $$(dirname $$m) all || exit 1; done + +clean: + rm -rf doxygen-html + find . -mindepth 2 -name Makefile \ + | while read m; do make -C $$(dirname $$m) clean || exit 1; done + +rebuild: + find . -mindepth 2 -name Makefile \ + | while read m; do make -C $$(dirname $$m) rebuild || exit 1; done + +doc: + rm -rf doxygen-html + find . -mindepth 2 -name Makefile \ + | while read m; do make -C $$(dirname $$m) doc || exit 1; done \ No newline at end of file diff -Nru acm-5.0/src/Makefile.in acm-6.0+20200416/src/Makefile.in --- acm-5.0/src/Makefile.in 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/src/Makefile.in 1970-01-01 00:00:00.000000000 +0000 @@ -1,106 +0,0 @@ -# @configure_input@ - - srcdir = @srcdir@ - prefix = @prefix@ - bindir = $(prefix)/games - VPATH = @srcdir@ - SHELL = /bin/sh - CC = @CC@ - SLIBS = @LIBS@ - INSTALL = @INSTALL@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_DATA = @INSTALL_DATA@ -STD_INCLUDES = \ - -I. -I$(srcdir) \ - -I$(srcdir)/../V/lib \ - -I$(srcdir)/../dis \ - -I../dis - TOPDIR = .. - CLEAN_THESE = flight-state black_box_input black_box_output bitmap.h TAGS tags - manext = 6 - MAKEDEPEND = makedepend - - PROGRAMS = acm - DEFINES = -DSRCDIR=\"$(srcdir)\" -DACM_LIBRARY=\"@OBVDIR@\" - CFLAGS = $(DEFINES) $(DEBCFLAGS) @DEFS@ $(STD_INCLUDES) - LDFLAGS = @LDFLAGS@ - SRCS = main.c pm.c gear.c flaps.c drone.c init.c aim9m.c box.c \ - aim120.c ccip.c \ - m61a1.c weapon.c players.c planes.c inventory.c missile.c\ - chaser.c missilec.c update.c events.c mouse.c \ - linux_joystick.c joystick.c damage.c panel.c render.c hud.c \ - hsi.c navaid.c windows.c \ - radar.c place.c transpose.c scale.c \ - interpolate.c resupply.c air.c effects.c redraw.c \ - imath.c alarm.c audio.c dis_if.c transfer.c terrain.c \ - runway.c fpage.c vlist.c browse.c splash.c \ - @SRC_EXTRA_C_FILES@ - - OBJS = main.o pm.o gear.o flaps.o drone.o init.o aim9m.o box.o \ - aim120.o ccip.o \ - m61a1.o weapon.o players.o planes.o inventory.o missile.o\ - chaser.o missilec.o update.o events.o mouse.o \ - linux_joystick.o joystick.o damage.o panel.o render.o hud.o \ - hsi.o navaid.o windows.o \ - radar.o place.o transpose.o scale.o \ - interpolate.o resupply.o air.o effects.o redraw.o \ - imath.o alarm.o audio.o dis_if.o transfer.o terrain.o \ - runway.o fpage.o vlist.o browse.o splash.o \ - @SRC_EXTRA_O_FILES@ - - VLIB = ../V/lib/libV.a - DISLIB = ../dis/lib/libdis.a -BITMAP_FILES = $(srcdir)/eng.xbm $(srcdir)/flaps0.xbm \ - $(srcdir)/flaps1.xbm $(srcdir)/flaps2.xbm \ - $(srcdir)/flaps3.xbm $(srcdir)/gearDown.xbm \ - $(srcdir)/gearTran.xbm $(srcdir)/gearUp.xbm \ - $(srcdir)/handleDn.xbm $(srcdir)/handleUp.xbm - - -# Programs to make tags files. - ETAGS = etags -tw - CTAGS = ctags -tw -tagsrcs = $(SRCS) $(srcdir)/../V/lib/*.c $(srcdir)/../dis/lib/*.c - -all: $(PROGRAMS) - -acm: $(OBJS) $(VLIB) $(DISLIB) - $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(OBJS) $(VLIB) $(DISLIB) $(SLIBS) - -../V/lib/libV.a: - cd ../V/lib; $(MAKE) -e - -mostlyclean clean: - rm -f $(PROGRAMS) *.o core *~ - -distclean: clean - rm -f Makefile $(CLEAN_THESE) - -realclean: distclean - rm -f TAGS tags - -install: $(PROGRAMS) - $(INSTALL_PROGRAM) acm $(bindir)/acm - $(INSTALL_DATA) $(srcdir)/acm.man \ - $(prefix)/man/man$(manext)/acm.$(manext) - -uninstall: - rm -f $(bindir)/acm - -render.o panel.o: bitmap.h - -bitmap.h: $(BITMAP_FILES) - grep '^#define' $(BITMAP_FILES) | sed -e 's/^.*://g' > $@ - -depend: bitmap.h - $(MAKEDEPEND) -- $(CFLAGS) -- $(SRCS) - -check test tar shar: - -TAGS: $(tagsrcs) - $(ETAGS) $(tagsrcs) - -tags: $(tagsrcs) - $(CTAGS) $(tagsrcs) - -# DO NOT DELETE THIS LINE -- make depend depends on it. diff -Nru acm-5.0/src/manifest.h acm-6.0+20200416/src/manifest.h --- acm-5.0/src/manifest.h 1998-08-14 14:59:54.000000000 +0000 +++ acm-6.0+20200416/src/manifest.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,261 +0,0 @@ - -/* - * acm : an aerial combat simulator for X - * Copyright (C) 1991-1996 Riley Rainey - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 dated June, 1991. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. - */ - -/* - * PLATFORM-SPECIFIC VALUES - */ - -#ifdef WIN32 -#define printf acm_printf -#define fprintf acm_fprintf -#endif - -#if !defined(HAVE_COPYSIGN) -#define NEEDS_COPYSIGN -#endif - -#if defined(HAVE_UNISTD_H) -#include -#endif - -#ifdef __hpux -#define sigvec sigvector -#endif /* hpux */ - -#if defined(HAVE_STDLIB_H) -#include -#else -#if defined(HAVE_MALLOC_H) -#include -#endif -#endif - -/* - * GENERAL VALUES - */ - -/* - * Maximum number of surface objects - */ - -#ifndef MAXSURFACE -#define MAXSURFACE 128 -#endif - -/* - * Maximum number of players and drones - */ - -#ifndef MAXPLAYERS -#define MAXPLAYERS 32 -#endif - -/* - * Maximum number of observers - */ - -#ifndef MAXOBSERVERS -#define MAXOBSERVERS 1 -#endif - -/* - * Maximum number of chasers - */ - -#ifndef MAXCHASERS -#define MAXCHASERS 1 -#endif - -/* - * Maximum number of missiles and cannon streams - */ - -#ifndef MAXPROJECTILES -#define MAXPROJECTILES (MAXPLAYERS * 8) -#endif - -#ifndef MAXEXPLOSIONS -#define MAXEXPLOSIONS MAXPROJECTILES -#endif - -#ifndef MAXCRAFTTYPES -#define MAXCRAFTTYPES 128 -#endif - -#ifndef STATIONS -#define STATIONS 9 -#endif - -#ifndef WEAPONTYPES -#define WEAPONTYPES 4 -#endif - -/* - * We'll check every now and again to see if any aircraft are waiting to - * be resupplied. RESUPPLY_EVERY defines the number of seconds - * between each check (30 seconds, here). - */ - -#ifndef RESUPPLY_INTERVAL -#define RESUPPLY_INTERVAL ((double) 30) -#endif - -/* - * The default exercise id and site id to use for DIS. - * These are overrriden on the acm command line with the "-dis-xxx" - * options. - * (Note that the default DIS application id of zero means that acm - * will choose an application id from the host address that have - * a high probability of beeing unique.) - */ - -#define DIS_EXERCISE 1 -#define DIS_SITE 17 -#define DIS_APPLICATION 0 - -/* - * The maximum allowed dead reckoning errors for DIS. - * (Note: the units are meters and radians.) - */ - -#define DIS_LOCATION_THRESHOLD 3.0 -#define DIS_ORIENTATION_THRESHOLD (2*3.141593/180.0) - -/* - * ACM becomes the name used to lookup X resources on a particular - * X server. - */ - -#ifndef ACM -#define ACM "acm" -#endif - -/* - * Linear response to control stick inputs are closer to reality, but can - * make the plane harder to fly. - */ - -/* #define LINEAR_CONTROL_RESPONSE */ - -/* - * NO_FUZZ removes the "no response" area around center stick position. - */ - -/* #define NO_FUZZ */ - -/* - * We have code in-place to perform flight debugging. Define this to - * compile in that code. - */ - -/* #define FLIGHTDEBUG */ - -/* - * When on the ground, we won't allow planes to stray too far from their - * team's airport. MAX_GROUND_DISTANCE defines that distance. - */ - -#ifndef MAX_GROUND_DISTANCE -#define MAX_GROUND_DISTANCE (3.0 * NM) -#endif - -/* - * Define a library directory to contain the acm files - */ - -#ifndef ACM_LIBRARY -#define ACM_LIBRARY "/usr/local/games/acm/" -#endif - -/* - * SRCDIR is the toplevel directory of the source tree - */ - -#ifndef SRCDIR -#define SRCDIR ".." -#endif - -/* - * a signal handler function type - */ - -#ifdef RETSIGTYPE -#define acm_sig_t RETSIGTYPE -#else -#ifdef SIGVOID -#define acm_sig_t void /* System V returns void */ -#else -#define acm_sig_t int /* BSD does int's */ -#endif -#endif - -/* - * I have defined some special purpose, debugging keys; define - * SPECIAL_KEYS to enable their use. - */ - -#define SPECIAL_KEYS - -/* - * If you want the simulation clock to run closer to real-time, - * define REAL_DELTA_T. In this mode the master update loop will tweak - * the time interval (deltaT) based on the amount of real-time that the - * last update took. A drawback to using this mode is that back-box - * input/output works, but creates bogus output -- the current black-box - * code assumes that the time interval between samples is fixed. - * - * Defining WATCH_FRAME_RATE causes statistics to be printed periodically - * at the acms server's tty. - */ - -/* #define WATCH_FRAME_RATE */ - -/* - * MAX_GAME_IDLE_SECONDS defines the amount of time that a server is allowed - * to remain idle before it should exit. - */ - -#define MAX_GAME_IDLE_SECONDS 0.0 - -/* - * DEFAULT_DRONE_FACTOR controls how hard drones are allowed to maneuver. - * Values vary from 0.0 to 1.0. - */ - -#define DEFAULT_DRONE_FACTOR 0.5 - -/* - * MIN_DRONE_FACTOR sets the minimum reasonable drone maneuvering factor. - */ - -#define MIN_DRONE_FACTOR 0.05 - -/* - * MAG_VAR sets the magnetic heading offset from true heading. - */ - -#define MAG_VAR 0.0 - -/* - * CLOUD_BASE and CLOUD_TOP sets the altitude of base and top of - * the cloud layer in feet. If base == top, no clouds are used. - */ - -#define CLOUD_BASE 0 -#define CLOUD_TOP 0 diff -Nru acm-5.0/src/missile.c acm-6.0+20200416/src/missile.c --- acm-5.0/src/missile.c 1998-12-09 21:53:25.000000000 +0000 +++ acm-6.0+20200416/src/missile.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,614 +0,0 @@ -/* - * acm : an aerial combat simulator for X - * Copyright (C) 1991-1998 Riley Rainey - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 dated June, 1991. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. - */ - -#include - -#include "pm.h" -#ifdef HAVE_DIS -#include "dis.h" -#endif - -typedef struct _entry { - double time; - double min; - craft *c; - VPoint Sg; - VPoint rvel; - struct _entry *next; -} entry; - -extern int mdebug; -extern void lookForCannonImpacts(craft * m); -extern int absorbDamage(); -int isMissileHit(double min, craft * c); - -int -inCloud(craft * c) -{ - int state; - - if (c->w.z > ctop) { - state = 0; - } - else if (c->w.z > cbase) { - state = 1; - } - else { - state = 2; - } - return state; -} - -int -fireMissile(craft * c, int ind) -{ - - register craft *m; - register int i; - VPoint s, s1; - VPoint cY, mX, mY, mZ; - double v; - -#ifdef HAVE_DIS - double disLocation[3]; - double disVelocity[3]; - double disZeroVec[3]; - double disOrientation[3]; - -#endif - - for ((i = 0, m = &mtbl[0]); i < MAXPROJECTILES; (++i, ++m)) - if (m->type == CT_FREE) { - m->type = CT_MISSILE; - break; - } - - if (i == MAXPROJECTILES) - return -1; - - m->cinfo = lookupCraft("aim-9m"); - m->fuel = m->cinfo->maxFuel; - m->curThrust = m->cinfo->maxThrust; - m->owner = c->pIndex; - - m->gvs_instance = (GVS_OBI) NULL; - -/* - * Build trihedral based on the launching aircraft's current velocity vector - * rather than simply it's current direction vector. - * - * (1) build a unit velocity vector. - * (2) calculate missiles local Z axis from - * plane's-y-axis CROSS missile's-unit-velocity-vector - * (3) calculate missile's Y axis. - */ - - if ((v = mag(c->Cg)) < 1.0) { - m->trihedral = c->trihedral; - m->curRoll = c->curRoll; - m->curPitch = c->curPitch; - m->curHeading = c->curHeading; - } - else { - mX = c->Cg; - mX.x /= v; - mX.y /= v; - mX.z /= v; - cY.x = c->trihedral.m[0][1]; - cY.y = c->trihedral.m[1][1]; - cY.z = c->trihedral.m[2][1]; - - VCrossProd(&mX, &cY, &mZ); - VCrossProd(&mZ, &mX, &mY); - - m->trihedral.m[0][0] = mX.x; - m->trihedral.m[1][0] = mX.y; - m->trihedral.m[2][0] = mX.z; - m->trihedral.m[0][1] = mY.x; - m->trihedral.m[1][1] = mY.y; - m->trihedral.m[2][1] = mY.z; - m->trihedral.m[0][2] = mZ.x; - m->trihedral.m[1][2] = mZ.y; - m->trihedral.m[2][2] = mZ.z; - - euler(m); - } - - m->Cg = c->Cg; - VTransform(&(c->cinfo->wStation[ind]), &(c->trihedral), &s1); - VReverseTransform_(&s1, &c->XYZtoNED, &s); - m->Sg.x = c->prevSg.x + FEETtoMETERS(s.x); - m->Sg.y = c->prevSg.y + FEETtoMETERS(s.y); - m->Sg.z = c->prevSg.z + FEETtoMETERS(s.z); - DISGeocentricToWorldCoordinates - ((dis_world_coordinates *) & m->Sg, &m->w); - m->prevw = m->w; - GenerateWorldToLocalMatrix(&m->w, &m->XYZtoNED); - m->armTimer = m->cinfo->armDelay; - m->flags = FL_HAS_GYRO; - m->createTime = curTime; - -/* - * kludge - */ - - m->curRadarTarget = c->curRadarTarget; - -#ifdef HAVE_DIS - -/* - * ACM missiles are DIS "tracked munitions", so we are - * responsible for sending entity state PDU's for them - */ - - if (disInUse) { - VPoint tmp; - - disLocation[0] = m->Sg.x; - disLocation[1] = m->Sg.y; - disLocation[2] = m->Sg.z; - tmp.x = FEETtoMETERS(m->Cg.x); - tmp.y = FEETtoMETERS(m->Cg.y); - tmp.z = FEETtoMETERS(m->Cg.z); - VReverseTransform_(&tmp, &m->XYZtoNED, (VPoint *) & disVelocity[0]); - disZeroVec[0] = 0.0; - disZeroVec[1] = 0.0; - disZeroVec[2] = 0.0; - disOrientation[0] = m->curHeading; - disOrientation[1] = m->curPitch; - disOrientation[2] = m->curRoll; - dis_entityEnter(c->team, m, - &m->cinfo->entityType, - &m->cinfo->altEntityType, - disLocation, disVelocity, - disZeroVec, disOrientation, - disZeroVec, &m->disId); -#ifdef DIS_DEBUG - printf("Missile Entering m%d %d\n", i, m->disId); -#endif - } -#endif - return 0; -} - -int -killMissile(craft * c, craft * target) -{ -#ifdef HAVE_DIS - double worldLocation[3], entityLocation[3]; - int target_eid, missile_eid; - VPoint worldVel, tmp; - - if (c->type == CT_MISSILE || c->type == CT_CANNON) { - - if (target == NULL) { - target_eid = DIS_ID_NONE; - } - else { - target_eid = target->disId; - } - - if (c->type == CT_CANNON) { - missile_eid = DIS_ID_NONE; - } - else { - missile_eid = c->disId; - } - - worldLocation[0] = c->Sg.x; - worldLocation[1] = c->Sg.y; - worldLocation[2] = c->Sg.z; - -/* - * killMissile's calling sequence needs to be updated to allow for the - * entity detonation location to be passed. - */ - - entityLocation[0] = 0.0; - entityLocation[1] = 0.0; - entityLocation[2] = 0.0; - - tmp.x = FEETtoMETERS(c->Cg.x); - tmp.y = FEETtoMETERS(c->Cg.y); - tmp.z = FEETtoMETERS(c->Cg.z); - VReverseTransform_(&tmp, &c->XYZtoNED, &worldVel); - - if (disInUse) { - dis_detonation(&c->cinfo->entityType, - ptbl[c->owner].disId, - target_eid, - missile_eid, - worldLocation, - entityLocation, - (double *) &worldVel); - } - } -#endif - c->type = CT_FREE; - return 0; -} - -int -lookForImpacts(void) -{ - - craft *c, *m; - entry p[MAXPLAYERS], *list, *q, *r, *rprev; - VPoint v, s0; - double t, d, explosion_diameter_meters; - int i, j; - - for (m = mtbl, i = 0; i < MAXPROJECTILES; ++i, ++m) { - - if (m->type == CT_CANNON) { - lookForCannonImpacts(m); - continue; - } - else if (m->type != CT_MISSILE || m->armTimer > 0.0) - continue; - - list = (entry *) NULL; - for (c = ptbl, j = 0; j < MAXPLAYERS; ++j, ++c) { - - if (c->type == CT_FREE) - continue; - -/* - * Reduce the relative motion of this object to a the parametric system - * of equations: - * x(t) = vx * t + s0x - * y(t) = vy * t + s0y - * z(t) = vz * t + s0z - * - * We can then compute the time of perigee (closest pass) along with - * the associated minimum distance. - */ - - v.x = c->Sg.x - c->prevSg.x - m->Sg.x + m->prevSg.x; - v.y = c->Sg.y - c->prevSg.y - m->Sg.y + m->prevSg.y; - v.z = c->Sg.z - c->prevSg.z - m->Sg.z + m->prevSg.z; - s0.x = c->prevSg.x - m->prevSg.x; - s0.y = c->prevSg.y - m->prevSg.y; - s0.z = c->prevSg.z - m->prevSg.z; - -/* - * Compute time of minimum distance between the two objects (note that units - * here are UPDATE_INTERVAL seconds). - */ - - t = -(v.x * s0.x + v.y * s0.y + v.z * s0.z) / - (v.x * v.x + v.y * v.y + v.z * v.z); - - if (mdebug) - printf("perigee in %g seconds with player %d\n", - t * deltaT, j); - -/* - * If the closest pass occurs during this update interval, check for a hit. - * We'll build a linked list of all craft that this projectile may strike - * during this period, arranged in ascending order by time of "perigee" - * (closest pass). We'll then test for strikes. If a projectile misses - * the first object, then it may have struck subsequent objects in the - * list ... - */ - -/* - * One special case occurs when a target or missile's turn suddenly - * changes the perigee time from positive to negative. If the missile - * is within hitting range at t=0 and the time of perigee is negative, - * then zap 'em. - */ - - if (t < 0.0) { - d = sqrt(s0.x * s0.x + s0.y * s0.y + - s0.z * s0.z); - if (isMissileHit(d, c)) { - t = 0.0; - } - } - - if (t >= 0.0 && t <= 1.0) { - q = &p[j]; - - q->Sg = m->prevSg; - q->Sg.x += (m->Sg.x - m->prevSg.x) * t; - q->Sg.y += (m->Sg.y - m->prevSg.y) * t; - q->Sg.z += (m->Sg.z - m->prevSg.z) * t; - - q->rvel = v; - - if (list == (entry *) NULL) { - q->next = list; - list = q; - } - else if (list->time > t) { - q->next = list; - list = q; - } - else { - for (rprev = list, r = list->next; r != (entry *) NULL;) { - if (r->time > t) - break; - rprev = r; - r = r->next; - } - rprev->next = q; - q->next = r; - } - q->time = t; - q->c = c; - q->min = sqrt(pow(v.x * t + s0.x, 2.0) + - pow(v.y * t + s0.y, 2.0) + - pow(v.z * t + s0.z, 2.0)); -#ifdef FLIGHTDEBUG - if (mdebug) - printf("perigee %g feet; craft %d.\n", - q->min, j); -#endif - } - } - -/* - * Now look for missile hits in the list of perigees. - */ - - for (r = list; r != (entry *) NULL; r = r->next) - if (isMissileHit(r->min, r->c)) { - m->Sg = r->Sg; /* Set detonation point for killMissile() */ - killMissile(m, r->c); -#ifdef HAVE_DIS - /* can only damage local player */ - if (r->c->type != CT_DIS_PLANE) -#endif - if (absorbDISDamage(r->c, - &m->cinfo->entityType, 0, 0, - r->min, - mag(r->rvel), - &explosion_diameter_meters) == 0) { - killPlayerEx(r->c, - "Your aircraft was destroyed by an air-to-air missile.", - "The missile's warhead detonated %.1f meters from your plane.", - r->min); - } - newExplosion(&(r->Sg), &r->rvel, 5.0, 10.0, 3.0); - break; - } - } - - return (0); -} - -/*ARGSUSED */ -int -isMissileHit(double min, craft * c) -{ - - return (min < 15.0) ? 1 : 0; -} - -#define IRMaxRange FEETtoMETERS(15.0 * NM) - -int -isIRVisible(craft * m, craft * c, VPoint * t, double IRScanSlope) -{ - - VPoint relPos, tmp; - int cstate, mstate; - - if (c->type == CT_FREE) - return 0; - -/* - * If the seeker is in clouds, or the target is not at the same level - * (e.g seeker is above clouds, but target is below), then the target is - * not IR visible. - */ - - if ((mstate = inCloud(m)) == 1) { - return 0; - } - - if ((cstate = inCloud(c)) != mstate) { - return 0; - } - - VTransform(&c->prevSg, &m->XYZtoNED, &tmp); - VReverseTransform_(&tmp, &m->trihedral, t); - - if (sqrt(t->x * t->x + t->y * t->y + t->z * t->z) > IRMaxRange) - return 0; - - if (t->x <= 0.0) - return 0; - - relPos.z = t->z / (t->x * IRScanSlope); - relPos.y = t->y / (t->x * IRScanSlope); - - return (sqrt(relPos.z * relPos.z + relPos.y * relPos.y) > 1.0) ? 0 : 1; -} - -int -getIRTarget(craft * c, VPoint * t, double scanSlope) -{ - - int i, n; - craft *p; - VPoint tNew, tMin; - double m1, min; - - if (c->curRadarTarget != -1 && - isIRVisible(c, &ptbl[c->curRadarTarget], t, scanSlope)) - return c->curRadarTarget; - -/* - * Look for a target. Designate the closest one as a new target. - */ - - min = 1000000.0; - n = -1; - for (i = 0, p = ptbl; i < MAXPLAYERS; ++i, ++p) { - if (p == c) - continue; - if (p->type != CT_FREE) - if (isIRVisible(c, p, &tNew, scanSlope)) { - m1 = mag(tNew); - if (m1 < min) { - n = i; - min = m1; - tMin = tNew; - } - } - } - - *t = tMin; - return n; -} - -/* - * Track target using proportional navigation guidance (N = 4). - */ - -#define AIM9SLOPE 0.57735 - -void -trackTarget(craft * c) -{ - - VMatrix mtx, mtx1; - VPoint t, t1, v, vrel, zeroVec = {0,0,0}; - double h, maxTurn, omegap, omegay; - double hs; - double deltaRoll, deltaPitch, deltaYaw; - craft *target; - -/* - * Now let's get to target tracking; the missile won't start tracking until - * 0.60 seconds has elapsed. Then, if we don't already have a target - * designated, get one. - */ - - if (curTime - c->createTime < 0.60) { - deltaPitch = 0.0; - deltaYaw = 0.0; - goto change; - } - else if ((c->curRadarTarget = getIRTarget(c, &t, AIM9SLOPE)) == -1) { - -/* - * Not target; missile goes ballistic - */ - - deltaPitch = 0.0; - deltaYaw = 0.0; - goto change; - -#ifdef FLIGHTDEBUG - if (mdebug) - printf("Missile elects to self-destruct\n"); -#endif - newExplosion(&(c->Sg), &zeroVec, 5.0, 10.0, 3.0); - killMissile(c, (craft *) NULL); - return; - } - -/* - * We'll steer towards the target at a rate proportional to the - * rate of change of the target's position in the missile's XZ (pitch) - * and XY (yaw) planes. - */ - - target = &ptbl[c->curRadarTarget]; - - v.x = target->Cg.x - c->Cg.x; - v.y = target->Cg.y - c->Cg.y; - v.z = target->Cg.z - c->Cg.z; - - t.x = METERStoFEET(t.x); - t.y = METERStoFEET(t.y); - t.z = METERStoFEET(t.z); - - VReverseTransform_( &v, &c->trihedral, &vrel ); - - hs = t.x * t.x + t.y * t.y; - - omegay = (vrel.y * t.x - vrel.x * t.y) / hs; - - omegap = (vrel.z * hs - t.z * (vrel.x * t.x + vrel.y * t.y)) / - (sqrt(hs) * (hs + t.z * t.z)); - - deltaPitch = omegap * 4.0 * deltaT; - deltaYaw = omegay * 4.0 * deltaT; - - h = sqrt( deltaPitch * deltaPitch + deltaYaw * deltaYaw ); - -/* - * We'll constrain missile turns to about 20 degree/second unless it's velocity - * would make that greater than a 25g load factor. - */ - - if ( c->VT > 0.0 ) { - maxTurn = (earth_g / c->VT) * sqrt( 25.0 * 25.0 - 1.0 ); - } - else { - maxTurn = 0.0; - } - - if (maxTurn > DEGtoRAD(20.0)) { - maxTurn = DEGtoRAD(20.0); - } - maxTurn *= deltaT; - -#ifdef FLIGHTDEBUG - if (mdebug) - printf("\nturn rate = %g; maxTurn = %g\n", h, maxTurn); -#endif - - if (h > maxTurn) { - deltaPitch *= maxTurn / h; - deltaYaw *= maxTurn / h; - } - -/* - * Re-orient the missile and velocity vector. - */ - - change: - - deltaRoll = 0.0; - -#ifdef FLIGHTDEBUG - if (mdebug) { - printf("Missile changes: pitch/yaw: %g %g (deg).\n", - RADtoDEG(deltaPitch), RADtoDEG(deltaYaw)); - printf("position [%g, %g, %g]\n", t.x, t.y, t.z); - printf("target pitch/yaw rates: %g, %g (deg/sec)\n", - RADtoDEG(omegap), RADtoDEG(omegay)); - } -#endif - - buildEulerMatrix(deltaRoll, -deltaPitch, deltaYaw, &mtx); - - VReverseTransform_(&c->Cg, &c->trihedral, &t); - VTransform(&t, &mtx, &t1); - VTransform(&t1, &c->trihedral, &c->Cg); - - VMatrixMultByRank(&mtx, &c->trihedral, &mtx1, 3); - c->trihedral = mtx1; - euler(c); - -} diff -Nru acm-5.0/src/missilec.c acm-6.0+20200416/src/missilec.c --- acm-5.0/src/missilec.c 1998-12-09 21:54:43.000000000 +0000 +++ acm-6.0+20200416/src/missilec.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,160 +0,0 @@ -/* - * acm : an aerial combat simulator for X - * Copyright (C) 1991-1997 Riley Rainey - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 dated June, 1991. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. - */ - -#include -#include - -#include "pm.h" - -int mdebug = 0; -extern double calcRho(double alt, double *mach); -extern void trackTarget(craft *); -extern void craftToGround(craft * c, VPoint * p, VPoint * g); -extern void calcGForces(craft *, VPoint *, double); - -int -missileCalculations(craft * c) -{ - double q, rho; - double FLift, FDrag, FWeight; - double dNorth, dEast, dmag; - VPoint F, Fg; - -/* - * Check for ground impact. We do this at the beginning to permit us to - * kill ground targets. - */ - - if (c->w.z < localAltitude(&c->Sg, &c->w)) { - q = -c->prevSg.z / (c->Sg.z - c->prevSg.z); - c->Sg.x = c->prevSg.x + q * (c->Sg.x - c->prevSg.x); - c->Sg.y = c->prevSg.y + q * (c->Sg.y - c->prevSg.z); - c->Sg.z = 0.0; - return 1; - } - - trackTarget(c); - -/* - * If we haven't armed the missile, yet. Decrement the delay timer. - * If the FL_BALLISTIC flag is set, we have no target; self-destruct - * if the timer expires. - */ - - if (c->armTimer != 0.0) { - if ((c->armTimer -= deltaT) < 0.0) { - if (c->flags & FL_BALLISTIC) { - return 1; - } - c->armTimer = 0.0; - } - } - -/* - * Re-orient the body of the missile towards it's intended target. - */ - - c->prevSg = c->Sg; - - rho = calcRho(METERStoFEET(c->w.z), &q); - -/* - * Compute the resultant force vector on the missile. - */ - - c->VT = mag(c->Cg); - q = rho * c->cinfo->wingS * c->VT * c->VT * 0.5; - FLift = 0.0; - FDrag = c->cinfo->CDOrigin * q; - -#ifdef FLIGHTDEBUG - if (mdebug) { - printf("rho = %g, FLift = %g, FDrag = %g\n", rho, FLift, FDrag); - printf("FThrust = %g\n", c->curThrust); - } -#endif - - F.x = c->curThrust - FDrag; - F.y = 0.0; - F.z = 0.0; - -/* - * Now calculate changes in position (Sg) and velocity (Cg). - */ - - if ((c->fuel -= fuelUsed(c)) <= 0.0) { - if (c->curThrust > 0.0) - if (mdebug) - printf("Missile burnout; velocity = %g fps (%g kts)\n", c->VT, - FPStoKTS(c->VT)); - c->fuel = 0.0; - c->curThrust = 0.0; - } - -/* - * The missile's trihedral matrix is managed by - * trackTarget(). - */ - - craftToGround(c, &F, &Fg); - FWeight = c->cinfo->emptyWeight + c->fuel; - Fg.z += FWeight; - calcGForces(c, &Fg, FWeight); - -#ifdef FLIGHTDEBUG - if (mdebug) { - printf("v = %g kts, Fg = { %g, %g, %g }\n", FPStoKTS(c->VT), - Fg.x, Fg.y, Fg.z); - printf("F = { %g, %g, %g }\n", F.x, F.y, F.z); - } -#endif - -/* - * Update the missile's position and velocity. - */ - - dNorth = FEETtoMETERS(c->Cg.x * deltaT + Fg.x / FWeight - * earth_g * halfDeltaTSquared); - dEast = FEETtoMETERS(c->Cg.y * deltaT + Fg.y / FWeight - * earth_g * halfDeltaTSquared); - c->w.z -= FEETtoMETERS(c->Cg.z * deltaT + Fg.z / FWeight - * earth_g * halfDeltaTSquared); - - dmag = sqrt(dNorth * dNorth + dEast * dEast); - - DISUpdateWorldCoordinates(&c->w, dNorth / dmag, dEast / dmag, dmag); - DISWorldCoordinatesToGeocentric(&c->w, - (dis_world_coordinates *) & c->Sg); - GenerateWorldToLocalMatrix(&c->w, &c->XYZtoNED); - - c->Cg.x += Fg.x / FWeight * earth_g * deltaT; - c->Cg.y += Fg.y / FWeight * earth_g * deltaT; - c->Cg.z += Fg.z / FWeight * earth_g * deltaT; - -#ifdef FLIGHTDEBUG - if (mdebug) { - printf("Altitude = %g ft\n", METERStoFEET(c->w.z)); - printf("Euler angles { %g, %g, %g }\n", RADtoDEG(c->curRoll), - RADtoDEG(c->curPitch), RADtoDEG(c->curHeading)); - printf("Cg = { %g, %g, %g }\n", c->Cg.x, c->Cg.y, c->Cg.z); - printf("Sg = { %g, %g, %g }\n", c->Sg.x, c->Sg.y, c->Sg.z); - } -#endif - - return 0; -} diff -Nru acm-5.0/src/mouse.c acm-6.0+20200416/src/mouse.c --- acm-5.0/src/mouse.c 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/src/mouse.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,110 +0,0 @@ -/* - * acm : an aerial combat simulator for X - * Copyright (C) 1991,1992 Riley Rainey - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 dated June, 1991. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. - */ - -#include "pm.h" -#include -#include "linux_joystick.h" - -extern int ProcessJoystickInput PARAMS((void)); -extern void GetJoystickPosition PARAMS((double *x1, - double *y1, double *x2, double *y2, int *)); - -/* - * getStick : get stick input from mouse - * inputs Sa and Se range from -1.0 to 1.0. - */ - -int -getStick(craft * c, viewer * u) -{ - - int rootX, rootY, x, y; - Window root, child; - unsigned int mask; - double d, fuzz; - -/* - * Sample joystick, if present - */ - - if (LinuxJoystickPresent){ - double rudder, throttle; - int sw; - - XSync(u->dpy, False); - if(LinuxGetJoystickPosition(&c->Sa, &c->Se, - &rudder, &throttle, &sw) != -1) { - doJoystickEvent(c, u, rudder, throttle, sw); - return 1; - } - } - else if (ProcessJoystickInput() >= 0) { - double dummy, throttle; - int sw; - - XSync(u->dpy, False); - GetJoystickPosition(&c->Sa, &c->Se, &dummy, &throttle, &sw); - // rudder expects -1 to 1 with -2 being no rudder input - doJoystickEvent(c, u, -2, throttle, sw); - return 1; - - } - -/* - * No joystick, sample mouse - */ - - if (XQueryPointer(u->dpy, u->win, &root, &child, &rootX, &rootY, - &x, &y, &mask) == True) { - - if (x >= 0 && y >= 0 && x < u->width && y < u->height) { - -#ifndef NO_FUZZ - fuzz = u->scaleFactor * 8.0; -#else - fuzz = 0.0; -#endif - x = x - u->xCenter; - y = y - u->yCenter; - d = sqrt((double) (x * x + y * y)); - - if (d > fuzz) { - c->Sa = - (double) x / (double) u->xCenter * (d - fuzz) / d; - c->Se = - (double) y / (double) u->yCenter * (d - fuzz) / d; -#ifndef LINEAR_CONTROL_RESPONSE - if (c->Sa < 0.0) - c->Sa = -c->Sa * c->Sa; - else - c->Sa = c->Sa * c->Sa; - - if (c->Se < 0.0) - c->Se = -c->Se * c->Se; - else - c->Se = c->Se * c->Se; -#endif - } - else { - c->Sa = 0.0; - c->Se = 0.0; - } - return 1; - - } - } - return 0; -} diff -Nru acm-5.0/src/navaid.c acm-6.0+20200416/src/navaid.c --- acm-5.0/src/navaid.c 1998-08-14 15:00:09.000000000 +0000 +++ acm-6.0+20200416/src/navaid.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,331 +0,0 @@ -/* - * acm : an aerial combat simulator for X - * Copyright (C) 1991,1992,1997 Riley Rainey - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 dated June, 1991. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. - */ -#include "pm.h" -#include "alarm.h" -#include - -extern double strtod(const char *, char **); - -struct _navaid_t *vhf_navaid[VOR_CHANNEL_COUNT]; - -static char *bad_freq = "*****"; - -static navaid_t *test_navaid = NULL; - -#ifdef MAG_VAR -double mag_var = DEGtoRAD(MAG_VAR); - -#else -double mag_var = DEGtoRAD(8.0); /* eight degrees east */ - -#endif - -void InitNavaid(navaid_t * n); -char *PrintableVHFFreq(freq_t f, char *s); - -extern alarm_id_t addAlarm(double delta, void (*proc) (char *, char *), char *arg1, char *arg2); -extern double heading(VPoint * x); - -double -magHeading(craft * c) -{ - register double h = c->curHeading + mag_var; - - return (h < 0.0) ? h + 2.0 * pi : h; -} - -/* - * Search for a NAVAID receivable at the frequency specified - * by the supplied radio receiver. - * - * Return 1 for success (r->station is set to the NAVAID). - * Return 0 if no station was found. - */ - -int -radioReceptionCheck(craft * c, radio_t * r) -{ - navaid_t *n; - VPoint p; - - for (n = test_navaid; n; n = n->next) { - if (r->frequency == n->frequency) { - if (n->flags & NAVAID_LOC) { - VTransform(&c->Sg, &n->lt, &p); -#ifdef DEBUG - printf("tested: %s %f %f %f\n", n->id, p.x, p.y, p.z); -#endif - if (p.x > 0.0 && fabs(p.y / p.x) < 1.192) { -#ifdef DEBUG - printf("locked: %s %f %f %f\n", n->id, p.x, p.y, p.z); -#endif - r->station = n; - return 1; - } - } - else { - r->station = n; - return 1; - } - } - } - - return 0; -} - -void -radioFrequencyChanged(craft * c, radio_t * r) -{ - r->station = NULL; - radioReceptionCheck(c, r); - PrintableVHFFreq(r->frequency, r->freq_readout); - strcpy(r->dme_readout, "DME ----"); -} - -void -initRadio(craft * c, radio_t * r) -{ - r->frequency = r->standby_frequency = 0; - r->obs_setting = 0; - radioFrequencyChanged(c, r); -} - -void -freeAllNavaids (void) -{ - navaid_t *n = test_navaid, *p; - while (n) { - p = n; - n = n->next; - free (p); - } -} - -int -AddNavaid(char *ident, char *type, WorldCoordinates * w, - char *magvar, double freq) -{ - navaid_t *n; - char var[3]; - double mvar; - - n = (navaid_t *) malloc(sizeof(navaid_t)); - strncpy(var, magvar, 2); - var[2] = '\0'; - mvar = strtod(var, (char **) NULL); - mvar = (magvar[2] == 'E') ? -mvar : mvar; - n->bearing = n->magvar = DEGtoRAD(mvar); - - strncpy(n->id, ident, 4); - n->loc = *w; - GenerateWorldToLocalMatrix(w, &n->lt); - VRotate(&n->lt, ZRotation, n->magvar); - DISWorldCoordinatesToGeocentric(w, (dis_world_coordinates *) & n->Sg); - - if (strcmp(type, "VORTAC") == 0) { - n->flags = NAVAID_VOR | NAVAID_DME; - } - else if (strcmp(type, "TACAN") == 0) { - n->flags = NAVAID_VOR | NAVAID_DME; - } - else if (strcmp(type, "VOR/DME") == 0) { - n->flags = NAVAID_VOR | NAVAID_DME; - } - else if (strcmp(type, "VOR") == 0) { - n->flags = NAVAID_VOR; - } - else if (strcmp(type, "NDB") == 0) { - n->flags = NAVAID_NDB; - } - else { - free(n); - return -1; - } - - if (n->flags & NAVAID_VOR) { - n->frequency = (int) ((freq - 108.00) * 20.0 + 0.5); - } - else { - n->frequency = -(int) (freq + 0.5); - } - n->next = test_navaid; - test_navaid = n; - return 0; -} - -int -AddILS(char *ident, char *type, WorldCoordinates * w, - WorldCoordinates * gsw, char *magvar, double freq, double loc_width, - double loc_bearing, double gs_angle) -{ - navaid_t *n; - char var[3]; - double mvar; - - n = (navaid_t *) malloc(sizeof(navaid_t)); - strncpy(var, magvar, 2); - var[2] = '\0'; - mvar = strtod(var, (char **) NULL); - mvar = (magvar[2] == 'E') ? -mvar : mvar; - n->magvar = DEGtoRAD(mvar); - - strncpy(n->id, ident, 4); - n->bearing = DEGtoRAD(loc_bearing); - - n->loc = *w; - GenerateWorldToLocalMatrix(w, &n->lt); - VRotate(&n->lt, ZRotation, -n->bearing + n->magvar - M_PI); - DISWorldCoordinatesToGeocentric(w, (dis_world_coordinates *) & n->Sg); - - n->gs_loc = *gsw; - GenerateWorldToLocalMatrix(gsw, &n->gst); - VRotate(&n->gst, ZRotation, -n->bearing + n->magvar - M_PI); - - n->slope = DEGtoRAD(gs_angle); - n->beam_width = DEGtoRAD(loc_width); - - if (strcmp(type, "ILS") == 0) { - n->flags = NAVAID_LOC | NAVAID_GS; - } - else if (strcmp(type, "ILS/DME") == 0) { - n->flags = NAVAID_LOC | NAVAID_GS | NAVAID_DME; - } - else if (strcmp(type, "LOCALIZER") == 0) { - n->flags = NAVAID_LOC; - } - else if (strcmp(type, "LOC/GS") == 0) { - n->flags = NAVAID_LOC | NAVAID_GS; - } - else if (strcmp(type, "LOC/DME") == 0) { - n->flags = NAVAID_LOC | NAVAID_DME; - } - else { - free(n); - return -1; - } - - n->frequency = (int) ((freq - 108.00) * 20.0 + 0.5); - n->next = test_navaid; - test_navaid = n; - return 0; -} - -void -InitNavaid(navaid_t * n) -{ - VMatrix m; - VPoint p; - - VIdentMatrix(&m); - VSetPoint(p, 1.0, 0.0, 0.0); - - switch (n->flags & (NAVAID_VOR | NAVAID_LOC | NAVAID_GS)) { - - case NAVAID_VOR: - case NAVAID_LOC: - break; - - case (NAVAID_LOC | NAVAID_GS): - VRotate(&m, ZRotation, n->bearing); - VRotate(&m, YRotation, n->slope); - n->gst = m; - break; - } -} - -double -glideSlopeOffset(navaid_t * n, craft * c) -{ - VPoint p; - - VTransform(&c->Sg, &n->gst, &p); - return -(atan(-p.z / p.x) - n->slope); - -} - -double -radial(navaid_t * n, craft * c, VPoint * vec) -{ - VTransform(&c->Sg, &n->lt, vec); - return heading(vec); -} - -char * -PrintableVHFFreq(freq_t f, char *s) -{ - if (f > VOR_CHANNEL_COUNT) { - fprintf(stderr, - "invalid frequency passed to PrintableVHFFreq\n"); - return bad_freq; - } - - sprintf(s, "%5d", 10800 + 5 * f); - s[6] = '\0'; - s[5] = s[4]; - s[4] = s[3]; - s[3] = '.'; - - return s; -} - -char * -PrintableTACANChannel(freq_t f, char *s) -{ - if (f > VOR_CHANNEL_COUNT) { - fprintf(stderr, - "invalid frequency passed to PrintableTACANChannel\n"); - return bad_freq; - } - - sprintf(s, "%d%c", f / 2 + 17, (f % 2) ? 'Y' : 'X'); - return s; -} - -/* ARGSUSED */ -void -DMECheckAlarm(char *arg1, char *arg2) -{ - - int i; - craft *c; - VPoint p; - navaid_t *n; - alarm_id_t id; - - for (i = 0, c = ptbl; i < MAXPLAYERS; ++i, ++c) { - -/* Ensure that we're still receiving the same station */ - - if (c->hsiSelect) { - radioReceptionCheck(c, c->hsiSelect); - } - - if ((c->type == CT_PLANE) && c->hsiSelect->station) { - - n = c->hsiSelect->station; - p.x = c->Sg.x - n->Sg.x; - p.y = c->Sg.y - n->Sg.y; - p.z = c->Sg.z - n->Sg.z; - - sprintf(c->hsiSelect->dme_readout, "DME %.1f", - METERStoFEET(mag(p)) / NM); - } - } - - id = addAlarm(5.0, DMECheckAlarm, (char *) NULL, (char *) NULL); -} diff -Nru acm-5.0/src/navaid.h acm-6.0+20200416/src/navaid.h --- acm-5.0/src/navaid.h 1998-05-12 03:43:04.000000000 +0000 +++ acm-6.0+20200416/src/navaid.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,59 +0,0 @@ -/* - * acm : an aerial combat simulator for X - * Copyright (C) 1991,1992 Riley Rainey - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 dated June, 1991. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. - */ - -typedef unsigned short freq_t; - -typedef struct _navaid_t { - struct _navaid_t *next; /* links navaids on the same channel */ - char id[4]; /* identifier (e.g. "IHNL") */ - freq_t frequency; /* channel number */ - double magvar; /* converts True to Magnetic (rad) */ - unsigned short flags; - WorldCoordinates loc; /* lat/long/altitude */ - VPoint Sg; /* geocentric location */ - WorldCoordinates gs_loc; /* lat/long/altitude of glide-slope */ - double bearing; /* geodetic azimuth of loc bearing */ - double beam_width; /* beam width for localizers (rad) */ - /*see navaid.c on how to calculate it */ - double slope; /* angle of glide slope (rad) */ - VMatrix lt; /* transform geocentric to loc local coordinates */ - VMatrix gst; /* transform geocentric to gs local coordinates */ -} navaid_t; - -typedef struct { - freq_t frequency; /* active frequency */ - freq_t standby_frequency; /* alternate frequency */ - short obs_setting; /* omni bearing selector setting */ - char dme_readout[16]; /* Current DME reading */ - char freq_readout[8]; /* current printable freq */ - navaid_t *station; /* station being received */ -} radio_t; - -#define VOR_CHANNEL_COUNT 200 - -/* - * Definition of the navaid flag word - */ - -#define NAVAID_LOC 0x0001 -#define NAVAID_VOR 0x0002 -#define NAVAID_DME 0x0004 -#define NAVAID_GS 0x0008 -#define NAVAID_OMARKER 0x0010 -#define NAVAID_MMARKER 0x0020 -#define NAVAID_NDB 0x0040 diff -Nru acm-5.0/src/panel.c acm-6.0+20200416/src/panel.c --- acm-5.0/src/panel.c 1998-05-12 03:43:03.000000000 +0000 +++ acm-6.0+20200416/src/panel.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,521 +0,0 @@ - -/* - * acm : an aerial combat simulator for X - * Copyright (C) 1991-1997 Riley Rainey - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 dated June, 1991. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. - */ - -#include "pm.h" - -int doGearLights(craft * c, viewer * u); - -#ifdef WIN32 - -#include -#include "..\pc\resource.h" -#define handleDn_width 30 - -extern LPDIRECTDRAWSURFACE - LoadACMBitmap(char *szBitmap, int *width, int *height); -extern void - PutACMBitmap(LPDIRECTDRAWSURFACE bm, char *szBitmap, int w, int h, int x, int y, int len); - -static LPDIRECTDRAWSURFACE gear_h[2]; -int gh_width, gh_height; -static LPDIRECTDRAWSURFACE gear_light[3]; -int gl_width, gl_height; -static LPDIRECTDRAWSURFACE flaps[4]; -int flaps_width, flaps_height; - -extern LPDIRECTDRAW GetDirectDrawInterface(int iWndIndex); -extern LPDIRECTDRAWSURFACE GetBackBuffer(int iWndIndex); - -#else -#include "bitmap.h" -#endif - -static struct { - long mask; - char *name; -} *pptr, panelVec[] = { - - { - SYS_ENGINE1, "OIL PRES" - }, - { - SYS_HYD1, "HYD1 PRES" - }, - { - SYS_HYD2, "HYD2 PRES" - }, - { - SYS_GEN1, "GEN1 FAIL" - }, - { - SYS_GEN2, "GEN2 FAIL" - }, - { - SYS_FLAPS, "FLAP FAIL" - }, - { - SYS_SPEEDBRAKE, "SPBRK FAIL" - }, - { - SYS_RADAR, "RADAR FAIL" - }, - { - SYS_TEWS, "TEWS FAIL" - }, - { - SYS_HUD, " HUD FAIL" - }, - { - FLAG_LOWFUEL, " LOW FUEL" - }, - { - FLAG_SPEEDBRAKE, "SPD BRAKE" - }, - { - FLAG_WHEELBRAKE, " BRAKES" - }, - { - 0, (char *) 0 - } -}; - -#define panelRows 7 -#define panelColumns 2 -#define panelChars 10 -#define lightMargin ((rftw) / 3) -#define panelWMargin (rftw * 2) -#define panelHMargin (rfth / 3) - -long lastBits[MAXPLAYERS]; -int lastPos[MAXPLAYERS]; -int lastGPos[MAXPLAYERS][3]; - -#ifdef WIN32 -void -printDDError(char *p, HRESULT code) -{ - printf("Direct Draw error: %s ", p); - - switch (code) { - case DDERR_DCALREADYCREATED: - printf("DC already created\n"); - break; - case DDERR_GENERIC: - printf("generic error\n"); - break; - case DDERR_INVALIDOBJECT: - printf("invalid object\n"); - break; - case DDERR_INVALIDPARAMS: - printf("invalid params\n"); - break; - case DDERR_INVALIDSURFACETYPE: - printf("invalid surface type\n"); - break; - case DDERR_SURFACELOST: - printf("surface lost\n"); - break; - case DDERR_UNSUPPORTED: - printf("unsupported\n"); - break; - case DDERR_WASSTILLDRAWING: - printf("was still drawing\n"); - break; - case DDERR_INCOMPATIBLEPRIMARY: - printf("incompatible primary\n"); - break; - case DDERR_INVALIDCAPS: - printf("invalid caps\n"); - break; - case DDERR_INVALIDPIXELFORMAT: - printf("invalid pixel format\n"); - break; - case DDERR_NOALPHAHW: - printf("no alpha hardware\n"); - break; - case DDERR_NOCOOPERATIVELEVELSET: - printf("no flip hardware\n"); - break; - case DDERR_NODIRECTDRAWHW: - printf("no direct draw hardware\n"); - break; - case DDERR_NOEMULATION: - printf("no emulation\n"); - break; - case DDERR_NOEXCLUSIVEMODE: - printf("no exclusive mode\n"); - break; - case DDERR_NOFLIPHW: - printf("no flip hardware\n"); - break; - case DDERR_NOMIPMAPHW: - printf("no mip map hardware\n"); - break; - case DDERR_NOZBUFFERHW: - printf("no z-buffer hardware\n"); - break; - case DDERR_OUTOFMEMORY: - printf("out of memory\n"); - break; - case DDERR_OUTOFVIDEOMEMORY: - printf("out of video memory\n"); - break; - case DDERR_PRIMARYSURFACEALREADYEXISTS: - printf("primary surface already exists\n"); - break; - case DDERR_UNSUPPORTEDMODE: - printf("unsupported mode\n"); - break; - default: - printf("error code 0x%x, %d\n", code, code); - break; - } -} -#endif - -void -initPanel(craft * c) -{ - lastPos[c->pIndex] = -1; - lastGPos[c->pIndex][0] = lastGPos[c->pIndex][1] = - lastGPos[c->pIndex][2] = -1; - lastBits[c->pIndex] = SYS_NODAMAGE; -} - -void -redrawPanel(craft * c, viewer * u) -{ - lastPos[c->pIndex] = -1; - lastGPos[c->pIndex][0] = lastGPos[c->pIndex][1] = - lastGPos[c->pIndex][2] = -1; - lastBits[c->pIndex] = ~lastBits[c->pIndex]; - u->lastRPM = -1; - redrawAllItems(&u->drawControl); -} - -static int rfth = 0, rftw = 0; - -void -resizePanel(craft * c, viewer * u) -{ -#ifdef WIN32 - if (rfth == 0) { - LPDIRECTDRAWSURFACE lpBB = GetBackBuffer(0); - TEXTMETRIC tm; - HFONT hfont, hOldFont; - HDC hdc; - HRESULT result; - - result = lpBB->lpVtbl->GetDC(lpBB, &hdc); - if (result != DD_OK) { - printDDError("resizePanel", result); - exit(1); - } - - hfont = GetStockObject(ANSI_FIXED_FONT); - hOldFont = SelectObject(hdc, hfont); - GetTextMetrics(hdc, &tm); - rfth = tm.tmHeight; - rftw = tm.tmAveCharWidth; - result = lpBB->lpVtbl->ReleaseDC(lpBB, hdc); - } -#else - - rftw = u->rfont->max_bounds.width; - -#endif - - u->panelx = u->TEWSx - (int) (20 * u->scaleFactor + 0.5) - - (u->TEWSSize + 1) / 2 - - panelColumns * (panelChars * rftw + 2 * lightMargin + - panelWMargin); - u->panely = u->ry + (int) (5.0 * u->scaleFactor + 0.5); - redrawPanel(c, u); - -} - -void -doPanel(craft * c, viewer * u) -{ - int cellH, cellW; - int xi, yi, x, y, i; - long changeBits; - XPoint topLeft; - _BOOL force_redraw; - -#ifdef WIN32 - HFONT hfont, hOldFont; - HDC hdc; - HRESULT result; - HBRUSH hbrush; - LPDIRECTDRAWSURFACE lpBB = GetBackBuffer(0); - - result = lpBB->lpVtbl->GetDC(lpBB, &hdc); - if (result != DD_OK) { - printDDError("doPanel", result); - exit(1); - } - - hfont = GetStockObject(ANSI_FIXED_FONT); - hOldFont = SelectObject(hdc, hfont); - if (rfth == 0) { - TEXTMETRIC tm; - - GetTextMetrics(hdc, &tm); - rfth = tm.tmHeight; - rftw = tm.tmAveCharWidth; - } - -#else - - rfth = u->rfont->max_bounds.ascent + u->rfont->max_bounds.descent; - rftw = u->rfont->max_bounds.width; - -#endif - - cellH = rfth + 2 * lightMargin + panelHMargin + 1; - cellW = rftw * panelChars + 2 * lightMargin + panelWMargin; - - changeBits = lastBits[c->pIndex] ^ c->damageBits; - if (changeBits != 0) { - redrawItem(&u->annunciatorState); - } - force_redraw = isRedrawRequired(&u->annunciatorState); - - for (pptr = &panelVec[0], i = 0; pptr->mask != 0; ++pptr, ++i) { - - if ((changeBits & pptr->mask) != 0 || force_redraw == TRUE) { - xi = i / panelRows; - yi = i % panelRows; - x = u->panelx; - x += xi * cellW + lightMargin; - y = u->panely; - y += yi * cellH + lightMargin; - if ((c->damageBits & pptr->mask) == 0) { - topLeft.x = x - lightMargin; - topLeft.y = y - lightMargin; - -#ifdef WIN32 - { - RECT rect; - - hbrush = GetStockObject(GRAY_BRUSH); - rect.left = topLeft.x; - rect.top = topLeft.y; - rect.right = rect.left + cellW - panelWMargin; - rect.bottom = rect.top + cellH - panelHMargin; - FrameRect(hdc, &rect, hbrush); - SetTextColor(hdc, RGB(230, 230, 230)); - SetBkColor(hdc, RGB(0, 0, 0)); - TextOut(hdc, x, y, pptr->name, strlen(pptr->name)); - } -#else - XDrawRectangle(u->dpy, u->win, u->gc, - topLeft.x, topLeft.y, - cellW - panelWMargin, - cellH - panelHMargin); - XDrawImageString(u->dpy, u->win, u->gauge_gc, - x, y + rfth, pptr->name, strlen(pptr->name)); -#endif - } - else { - topLeft.x = x - lightMargin; - topLeft.y = y - lightMargin; -#ifdef WIN32 - { - RECT rect; - - hbrush = GetStockObject(GRAY_BRUSH); - rect.left = topLeft.x; - rect.top = topLeft.y; - rect.right = rect.left + cellW - panelWMargin; - rect.bottom = rect.top + cellH - panelHMargin; - FrameRect(hdc, &rect, hbrush); - rect.top += lightMargin; - rect.left += lightMargin; - rect.right = rect.left + rftw * panelChars; - rect.bottom = rect.top + rfth + lightMargin; - hbrush = GetStockObject(BLACK_BRUSH); - FillRect(hdc, &rect, hbrush); - } -#else - XDrawRectangle(u->dpy, u->win, u->gc, - topLeft.x, topLeft.y, - cellW - panelWMargin, - cellH - panelHMargin); - /*y -= rfth; */ - XClearArea(u->dpy, u->win, x, y, - rftw * panelChars, - rfth + lightMargin, False); -#endif - } - } - } - - lastBits[c->pIndex] = c->damageBits; - -#ifdef WIN32 - result = lpBB->lpVtbl->ReleaseDC(lpBB, hdc); -#endif - - doGearLights(c, u); - -} - -static int gear_flag[3] = -{FL_GEAR0_UP, FL_GEAR1_UP, FL_GEAR2_UP}; - -#ifdef WIN32 -/* - * These tables hold resource id's of the bitmaps used on the control panel - */ -static char *gear_h_id[] = -{ - MAKEINTRESOURCE(IDB_GH_UP), - MAKEINTRESOURCE(IDB_GH_DOWN) -}; -static char *gear_light_id[] = -{ - MAKEINTRESOURCE(IDB_GEAR_UP), - MAKEINTRESOURCE(IDB_GEAR_TRANSIT), - MAKEINTRESOURCE(IDB_GEAR_DOWN) -}; -static char *flaps_id[] = -{ - MAKEINTRESOURCE(IDB_FLAPS0), - MAKEINTRESOURCE(IDB_FLAPS1), - MAKEINTRESOURCE(IDB_FLAPS2), - MAKEINTRESOURCE(IDB_FLAPS3) -}; - -#endif - -int -doGearLights(craft * c, viewer * u) -{ - int i, x, y, x1, y1, pos[3], ghpos; - double geardown; - - ghpos = (c->flags & FL_GHANDLE_DN) ? 1 : 0; - - x = u->xCenter + (u->radarWidth + 1) / 2 + (int) (20.0 * - u->scaleFactor + 0.5); - - y = u->height + (int) ((VISOR_MARGIN + 80.0) * u->scaleFactor + 0.5); - -#ifdef WIN32 - /* - * First time through, load bitmaps - */ - if (gear_h[0] == 0) { - gear_h[0] = LoadACMBitmap(gear_h_id[0], - &gh_width, &gh_height); - gear_h[1] = LoadACMBitmap(gear_h_id[1], - &gh_width, &gh_height); - gear_light[0] = LoadACMBitmap(gear_light_id[0], - &gl_width, &gl_height); - gear_light[1] = LoadACMBitmap(gear_light_id[1], - &gl_width, &gl_height); - gear_light[2] = LoadACMBitmap(gear_light_id[2], - &gl_width, &gl_height); - flaps[0] = LoadACMBitmap(flaps_id[0], - &flaps_width, &flaps_height); - flaps[1] = LoadACMBitmap(flaps_id[1], - &flaps_width, &flaps_height); - flaps[0] = LoadACMBitmap(flaps_id[2], - &flaps_width, &flaps_height); - flaps[1] = LoadACMBitmap(flaps_id[3], - &flaps_width, &flaps_height); - } - - PutACMBitmap(gear_h[ghpos], gear_h_id[ghpos], gh_width, gh_height, x, y, 0); -#else - -#ifdef notdef - XSetForeground(u->dpy, u->gc, (u->v->flags & VPMono) ? - WhitePixel(u->v->dpy, u->v->screen) : - VConstantColor(u->v, whitePixel)); - - XSetPlaneMask(u->dpy, u->gc, AllPlanes); -#endif - - if (ghpos != lastPos[c->pIndex]) { - XCopyPlane(u->dpy, u->handle[ghpos], u->win, u->gauge_gc, 0, 0, - handleDn_width, handleDn_height, x, y, 1); - lastPos[c->pIndex] = ghpos; - } - -#endif - - geardown = pi / 2.0; - - for (i = 0; i < 3; ++i) { - if (c->flags & FL_GEAR0_UP) - pos[i] = 0; - else if (c->curGear[i] != geardown) - pos[i] = 1; - else - pos[i] = 2; - - if (pos[i] != lastGPos[c->pIndex][i]) { - redrawItem(&u->gearState); - } - } - - if (isRedrawRequired(&u->gearState)) { - - x1 = x + handleDn_width + 12 + (int) (8.0 * u->scaleFactor + 0.5); - y1 = y + 10 + (int) (1.0 * u->scaleFactor + 0.5); -#ifdef WIN32 - PutACMBitmap(gear_light[pos[0]], gear_light_id[pos[0]], - gl_width, gl_height, x1, y1, 0); -#else - XCopyPlane(u->dpy, u->gearLight[pos[0]], u->win, u->gauge_gc, - 0, 0, - gearDown_width, gearDown_height, x1, y1, 1); -#endif - lastGPos[c->pIndex][0] = pos[0]; - - x1 = x + handleDn_width; - y1 = y + 50 + (int) (5.0 * u->scaleFactor + 0.5); -#ifdef WIN32 - PutACMBitmap(gear_light[pos[1]], gear_light_id[pos[1]], - gl_width, gl_height, x1, y1, 0); -#else - XCopyPlane(u->dpy, u->gearLight[pos[1]], u->win, u->gauge_gc, - 0, 0, - gearDown_width, gearDown_height, x1, y1, 1); -#endif - lastGPos[c->pIndex][1] = pos[1]; - - x1 = x + handleDn_width + 25 + (int) (15.0 * u->scaleFactor + 0.5); - y1 = y + 50 + (int) (5.0 * u->scaleFactor + 0.5); -#ifdef WIN32 - PutACMBitmap(gear_light[pos[2]], gear_light_id[pos[2]], - gl_width, gl_height, x1, y1, 0); -#else - XCopyPlane(u->dpy, u->gearLight[pos[2]], u->win, u->gauge_gc, - 0, 0, - gearDown_width, gearDown_height, x1, y1, 1); -#endif - lastGPos[c->pIndex][2] = pos[2]; - } - return 0; - -} diff -Nru acm-5.0/src/patchlevel.h acm-6.0+20200416/src/patchlevel.h --- acm-5.0/src/patchlevel.h 1998-05-12 03:43:04.000000000 +0000 +++ acm-6.0+20200416/src/patchlevel.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ -#define REVISION 5 -#define PATCHLEVEL 0 - -#define REVISION_STRING "5.0" diff -Nru acm-5.0/src/pcaudio.c acm-6.0+20200416/src/pcaudio.c --- acm-5.0/src/pcaudio.c 1997-04-10 19:00:32.000000000 +0000 +++ acm-6.0+20200416/src/pcaudio.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,142 +0,0 @@ -/* This routine will initialize a new direct sound buffer, - set the data in the buffer, - set the rate, format, etc... - - Input: - pFileInfo - Pointer to file info with all - nessecary info filled, - like pbData, cbData, etc... - - Output: - 0 if successful, else the error code. - -*/ - -int NewDirectSoundBuffer( - FILEINFO *pFileInfo - ) -{ - - DSBUFFERDESC dsbd; - DSBCAPS dsbc; - HRESULT hr; - BYTE *pbData = NULL; - BYTE *pbData2 = NULL; - DWORD dwLength; - DWORD dwLength2; - - // Set up the direct sound buffer. - memset(&dsbd, 0, sizeof(DSBUFFERDESC)); - dsbd.dwSize = sizeof(DSBUFFERDESC); - dsbd.dwFlags = 0; - dsbd.dwFlags |= DSBCAPS_STATIC; - // Use new GetCurrentPosition() accuracy (DirectX 2 feature) - dsbd.dwFlags |= DSBCAPS_CTRLDEFAULT | DSBCAPS_GETCURRENTPOSITION2; - if (pFileInfo->fSticky) - dsbd.dwFlags |= DSBCAPS_STICKYFOCUS; - dsbd.dwBufferBytes = pFileInfo->cbSize; - dsbd.lpwfxFormat = pFileInfo->pwfx; - if ((hr = gpds->lpVtbl->CreateSoundBuffer(gpds, - &dsbd, - &(pFileInfo->pDSB), - NULL )) != 0) - { - goto ERROR_IN_ROUTINE; - } - - // Ok, lock the sucker down, and copy the memory to it. - if ((hr = pFileInfo->pDSB->lpVtbl->Lock(pFileInfo->pDSB, - 0, - pFileInfo->cbSize, - &pbData, - &dwLength, - &pbData2, - &dwLength2, - 0L)) != 0) - { - goto ERROR_IN_ROUTINE; - } - - Assert(pbData != NULL); - memcpy(pbData, pFileInfo->pbData, pFileInfo->cbSize); - - // Ok, now unlock the buffer, we don't need it anymore. - if ((hr = pFileInfo->pDSB->lpVtbl->Unlock(pFileInfo->pDSB, - pbData, pFileInfo->cbSize, - NULL, 0)) != 0) - { - goto ERROR_IN_ROUTINE; - } - - pbData = NULL; - - if ((hr = pFileInfo->pDSB->lpVtbl->SetVolume(pFileInfo->pDSB, - MAXVOL_VAL)) != 0) - { - goto ERROR_IN_ROUTINE; - } - - if ((hr = pFileInfo->pDSB->lpVtbl->SetPan(pFileInfo->pDSB, - MIDPAN_VAL)) != 0) - { - goto ERROR_IN_ROUTINE; - } - - dsbc.dwSize = sizeof(dsbc); - if (hr = IDirectSoundBuffer_GetCaps(pFileInfo->pDSB, &dsbc)) - { - goto ERROR_IN_ROUTINE; - } - - if (dsbc.dwFlags & DSBCAPS_LOCHARDWARE) { - pFileInfo->fHardware = TRUE; - } else { - pFileInfo->fHardware = FALSE; - } - - goto DONE_ROUTINE; - -ERROR_IN_ROUTINE: - if (pbData != NULL) - { - hr = pFileInfo->pDSB->lpVtbl->Unlock(pFileInfo->pDSB, pbData, - pFileInfo->cbSize, NULL, 0); - pbData = NULL; - } - - if (pFileInfo->pDSB != NULL) - { - pFileInfo->pDSB->lpVtbl->Release(pFileInfo->pDSB); - pFileInfo->pDSB = NULL; - } - -DONE_ROUTINE: - - return(hr); - -} - -/* This routine will release a direct sound buffer, - freeing up memory, resources, - whatever. - - Input: - pFileInfo - Pointer to the file info, - with the proper stuff set. - - Output: - 0 if successful, else the error code. - -*/ -int ReleaseDirectSoundBuffer( FILEINFO *pFileInfo ) -{ - - if (pFileInfo->pDSB != NULL) - { - pFileInfo->pDSB->lpVtbl->Release(pFileInfo->pDSB); - pFileInfo->pDSB = NULL; - } - - return(0); - - diff -Nru acm-5.0/src/place.c acm-6.0+20200416/src/place.c --- acm-5.0/src/place.c 1998-08-14 15:00:12.000000000 +0000 +++ acm-6.0+20200416/src/place.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,245 +0,0 @@ -/* - * acm : an aerial combat simulator for X - * Copyright (C) 1991-1997 Riley Rainey - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 dated June, 1991. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. - */ - -#include "pm.h" - -static VPoint origin = -{0.0, 0.0, 0.0}; - -void -placeCraft(Viewport * v, - craft * c, - viewer *u, - craft * obj, - VPolygon ** poly, - long *cnt) -{ - - int i, k, n; - long j; - VPoint *q, tmp, tmp1, center, nc; - VMatrix mtx, mtx1, m, m1; - VPolygon **p, *p1; - double dist; - int aspect, offset; - VObject *op; - - j = *cnt; - -/* - * Build a transformation matrix to convert from object to world coordinates. - */ - - if ((obj->flags & FL_FIXED_OBJECT) == 0) { - - VIdentMatrix(&m); - - VRotate(&m, YRotation, DEGtoRAD(90.0)); - VRotate(&m, YRotation, obj->w.latitude); - VRotate(&m, ZRotation, obj->w.longitude); - - buildEulerMatrix(obj->curRoll, - obj->curPitch, - obj->curHeading, - &m1); - - VMatrixMultByRank(&m1, &m, &mtx, 3); - - VTranslatePoint(&mtx, obj->Sg); - } - else { - VIdentMatrix(&mtx); - } - -/* - * If the object uses a special method to render itself, call that procedure. - */ - - if (obj->cinfo->placeProc != NULL) { - (*obj->cinfo->placeProc) (v, obj, &mtx, poly, cnt); - return; - } - -/* - * Build a matrix to transform from world to eye coordinate systems. - */ - - VMatrixMult(&mtx, &v->eyeSpace, &mtx1); - -/* - * Reject the object if is completely outside any of the clipping planes - */ - - if (obj->flags & FL_FIXED_OBJECT) - tmp = obj->cinfo->object->center; - else - VTransform(&obj->cinfo->object->center, &mtx, &tmp); - - VTransform(&tmp, &u->v->eyeSpace, ¢er); - for (i = 0; i < 4; ++i) { - dist = VPointToClipPlaneDistance(¢er, - &(u->v->clipNormals[i])); - if (dist > obj->cinfo->object->extent) - return; - } - - op = obj->cinfo->object; - n = op->numPolys; - p = op->polygon; - if (op->order) { - VTransform(&origin, &mtx1, &nc); - VTransform_(&_VUnitVectorI, &mtx1, &op->xaxis); - VTransform_(&_VUnitVectorJ, &mtx1, &op->yaxis); - VTransform_(&_VUnitVectorK, &mtx1, &op->zaxis); - aspect = VComputeObjectAspect(op, &nc); -#ifdef notdef - printf("%s: %s\n", op->name, VGetAspectName(aspect)); -#endif - offset = aspect * n; - } - - for (i = 0; i < n; ++i) { - -/* - * Here is an opportunity to cull back-facing polygons without - * copying or transforming them. tmp1 becomes the transformed coordinates - * of the first vertex in the polygon. - */ - - p1 = (op->order) ? p[op->order[offset + i]] : p[i]; - - VTransform(&p1->vertex[0], &mtx1, &tmp1); - if (p1->flags & PolyNormalValid) { - VTransform_(&p1->normal, &mtx1, &tmp); - } - if (p1->flags & PolyClipBackface) { - if (VDotProd(&tmp1, &tmp) >= 0.0) { - continue; - } - } - -/* - * Beyond the culling distance? Don't plot this polygon - */ - - if (p1->flags & PolyUseCullDistance) { - if (sqrt(tmp1.x * tmp1.x + tmp1.y * tmp1.y + tmp1.z * tmp1.z) > - p1->cullDistance) { - continue; - } - } - - poly[j] = VCopyPolygon(p1); - -/* - * First copy the normal vector and the transformed first point, then loop - * over all remaining points. - */ - - if (poly[j]->flags & PolyNormalValid) { - poly[j]->normal = tmp; - } - - q = poly[j]->vertex; - -/* - * First, copy the previously transformed first vertex. - */ - - *q = tmp1; - q++; - -/* - * Now transform and copy the remaining vertices. - */ - - for (k = 1; k < poly[j]->numVtces; (++k, ++q)) { - VTransform(q, &mtx1, &tmp); - *q = tmp; - } - ++j; - } - - *cnt = j; -} - -/* - * OBSOLETE CODE: we no longer need this function. We used to transform - * objects to their world coordinates and then transform them to eye - * coordinates. Those are now consolidated into one step. - * - * Place an object in world space based on the template object description, - * Euler angles, and [xyz] location. This procedure is called only once - * for each fixed object (in init.c). - */ - -#ifdef notdef - -void -placeObject(obj) -craft *obj; -{ - - register int i, j, n; - VPoint *q, tmp; - VMatrix mtx; - VPolygon **p; - VObject *newObj; - - VIdentMatrix(&mtx); - if (obj->curRoll != 0.0) - VRotate(&mtx, XRotation, obj->curRoll); - if (obj->curPitch != 0.0) - VRotate(&mtx, YRotation, -obj->curPitch); - if (obj->curHeading != 0.0) - VRotate(&mtx, ZRotation, obj->curHeading); - VTranslatePoint(&mtx, obj->Sg); - - if (obj->cinfo->placeProc != NULL) { - fprintf(stderr, "This object cannot be placed this way.\n"); - exit(1); - } - - newObj = VCopyObject(obj->cinfo->object); - - n = newObj->numPolys; - p = newObj->polygon; - for (i = 0; i < n; ++i) { - for ((j = 0, q = p[i]->vertex); j < p[i]->numVtces; (++j, ++q)) { - VTransform(q, &mtx, &tmp); - *q = tmp; - } - if (p[i]->flags & PolyNormalValid) { - VTransform(&p[i]->normal, &mtx, &tmp); - p[i]->normal = tmp; - p[i]->normal.x -= mtx.m[0][3]; - p[i]->normal.y -= mtx.m[1][3]; - p[i]->normal.z -= mtx.m[2][3]; - - } - } - - VTransform(&newObj->center, &mtx, &tmp); - newObj->center = tmp; - - obj->cinfo->object = newObj; - - obj->flags |= FL_FIXED_OBJECT; -} - -#endif diff -Nru acm-5.0/src/planes.c acm-6.0+20200416/src/planes.c --- acm-5.0/src/planes.c 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/src/planes.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,573 +0,0 @@ -/* - * acm : an aerial combat simulator for X - * Copyright (C) 1991-1998 Riley Rainey - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 dated June, 1991. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. - */ - -#include -#include -#include -#include - -#include -#ifdef AFDS -#include -#endif -#ifdef HAVE_DIS -#include "dis.h" -#endif - -static craftType ctype[MAXCRAFTTYPES]; - -extern FILE *acm_fopen(char *, char *); -craftType *newCraft(void); -craftType *readPlane(); -double genericThrust PARAMS((craft *)); -void genericResupply PARAMS((craft *)); - -extern int radioReceptionCheck(craft * c, radio_t * r); -extern void initRadio(craft * c, radio_t * r); -extern void initDamage(craft *); -extern double efrandom(void); - -void -freeCraftTypes (void) -{ - int i, j; - - for (i = 0; i < MAXCRAFTTYPES; ++i) { - - if (ctype[i].name != (char *) NULL) { - - free(ctype[i].name); - - if (ctype[i].object) { - VDestroyObject (ctype[i].object); - } - - if (ctype[i].objname) { - free (ctype[i].objname); - } - - if (ctype[i].description) { - free(ctype[i].description); - } - - if (ctype[i].modelname) { - free(ctype[i].modelname); - } - - if (ctype[i].CLift) { - free (ctype[i].CLift->entry); - free (ctype[i].CLift); - } - if (ctype[i].CDb) { - free (ctype[i].CDb->entry); - free (ctype[i].CDb); - } - if (ctype[i].CnBeta) { - free (ctype[i].CnBeta->entry); - free (ctype[i].CnBeta); - } - if (ctype[i].ClBeta) { - free (ctype[i].ClBeta->entry); - free (ctype[i].ClBeta); - } - if (ctype[i].Thrust) { - free (ctype[i].Thrust->entry); - free (ctype[i].Thrust); - } - if (ctype[i].ABThrust) { - free (ctype[i].ABThrust->entry); - free (ctype[i].ABThrust); - } - for (j=0; jkind && - ctype[i].entityType.domain == id->domain && - ctype[i].entityType.country == id->country && - ctype[i].entityType.category == id->category && - ctype[i].entityType.subcategory == id->subcategory && - ctype[i].entityType.specific == id->specific && - ctype[i].entityType.extra == id->extra) { - return &ctype[i]; - } - } - } - - /* - * Well, there wasn't a craft type defined that matched the desired - * entity type. So, we'll look for an entry in the patterns contained - * in the eo_map. If we find a match, create a new craftType entry - * and return it. - */ - - ep = eo_map; - - for (i = 0; i < eo_map_count; ++ i) { - - FILE *f1; - - if (entityWildcardMatch (id, &ep->entity_type, &ep->entity_mask)) { - - c = newCraft(); - if (c) { - char *p = strrchr (ep->object_name, '.'); - - f1 = acm_fopen (ep->object_name, "r"); - c->name = strdup (ep->object_name); - c->objname = strdup (ep->object_name); - c->entityType = *id; - c->altEntityType = *id; - c->object = NULL; - if (p != NULL && (strcmp (p, ".dxf") == 0 || - strcmp (p, ".DXF") == 0)) { - c->object = VReadDepthCueuedDXFObject (f1, depthcue); - } - else { - c->object = VReadDepthCueuedObject (f1, depthcue); - } - - if (c->object) { - ep->obj = c->object; - } - else { - printf ("error reading object file: %s\n", ep->object_name); - } - - fclose (f1); - return c; - } - else { - printf ("craft table overflow in lookupCraftByEntityType()\n"); - } - } - ++ ep; - } - - return c; -} - -#endif - -#ifndef WIN32 - -void -printValidAircraft(int s) -{ - char buf[256]; - int i; - - sprintf(buf, "Valid aircraft types are:\n\n"); - write(s, buf, strlen(buf)); - - for (i = 0; i < MAXCRAFTTYPES; ++i) { - if (ctype[i].name != (char *) NULL) { - if (ctype[i].CLift) { - sprintf(buf, " %s\n", ctype[i].name); - write(s, buf, strlen(buf)); - } - } - } -} -#endif - -craftType * -newCraft(void) -{ - int i; - - for (i = 0; i < MAXCRAFTTYPES; ++i) - if (ctype[i].name == (char *) NULL) { - memset (&ctype[i], 0, sizeof (craft)); - ctype[i].name = "*allocated*"; - return &ctype[i]; - } - - return (craftType *) NULL; -} - -double -genericThrust( craft * c ) -{ - register double t, ts; - - if (c->flags & FL_AFTERBURNER) { - t = interpolate(c->cinfo->ABThrust, c->mach) * c->cinfo->maxABThrust; - } - else { - t = interpolate(c->cinfo->Thrust, c->mach) * c->cinfo->maxThrust; - } - - ts = c->throttle / 32768.0; - c->rpm = (c->rpm - ts) * exp(deltaT / c->cinfo->engineLag) + ts; - - return t * c->rpm * c->rpm * c->rho / 0.002377; -} - -double -fuelUsed( craft * c ) -{ - double spFuelConsump; - - if (c->flags & FL_AFTERBURNER) { - spFuelConsump = c->cinfo->spABFuelConsump; - } - else { - spFuelConsump = c->cinfo->spFuelConsump; - } - return spFuelConsump * c->curThrust * deltaT / 3600.0; -} - -void -genericResupply(craft * c) -{ - - int i; - - c->fuel = c->cinfo->maxFuel; - - for (i = 0; i < c->cinfo->sCount; i++) { - c->station[i] = c->cinfo->station[i]; - } - initDamage(c); -} - -extern void initPanel(craft * c); - -int -newPlaneReserve(void) -{ - int i; - - for (i = 0; i < MAXPLAYERS; ++i) { - if (ptbl[i].type == CT_FREE) { - ptbl[i].type = CT_RESERVED; - return i; - } - } - - return -1; -} - -int -newPlane(const char *planeType, int reservation_index) -{ - - int i, j; - craft *c; - - /* - * Begin our search for an entry at the specified reservation location - */ - - if (reservation_index == -1) { - i = 0; - } - else { - i = reservation_index; - } - - for (; i < MAXPLAYERS; ++i) { - if (ptbl[i].type == CT_FREE || ptbl[i].type == CT_RESERVED) { - - c = &ptbl[i]; - if ((c->cinfo = lookupCraft(planeType)) == NULL) { - return -2; - } - - c->type = CT_PLANE; - -#ifdef AFDS - AFDSInit( c ); -#endif - - c->Cg.x = 0.0; - c->Cg.y = 0.0; - c->Cg.z = 0.0; -#ifdef FLAT_WORLD - c->Sg.x = 0.0; - c->Sg.y = 0.0; - c->Sg.z = -c->cinfo->groundingPoint.z; - c->prevSg = c->Sg; -#else - c->w.z = FEETtoMETERS(c->cinfo->groundingPoint.z); - c->prevw = c->w; -#endif - - c->p = c->q = c->r = 0.0; - c->Se = c->Sr = c->Sa = 0.0; - c->SeTrim = c->SaTrim = 0.0; - - c->throttle = 8192; - c->curThrust = (c->cinfo->thrust) (c); - c->rpm = (double) c->throttle / 32768.0; - c->curFlap = 0.0; - c->flapSetting = 0.0; - c->curGear[0] = c->curGear[1] = - c->curGear[2] = pi / 2.0; - c->curSpeedBrake = 0.0; - c->speedBrakeSetting = 0.0; - c->curHeading = c->curPitch = c->curRoll = 0.0; - VIdentMatrix(&(c->trihedral)); - c->curNWDef = 0.0; - c->flags = FL_NWS | FL_GHANDLE_DN | FL_GND_CONTACT; - c->radarMode = RM_STANDBY; - c->curRadarTarget = -1; - c->groundCgx = 0.0; - for (j = 0; j < 6; ++j) { - c->leftHUD[j] = Vmalloc(32); - c->rightHUD[j] = Vmalloc(32); - strcpy(c->leftHUD[j], ""); - strcpy(c->rightHUD[j], ""); - } - -/* - * rearm and fuel the aircraft. - */ - - (*c->cinfo->resupply) (c); - - initPanel(c); - -/* a trick to select a valid weapon */ - - c->curWeapon = WEAPONTYPES - 1; - selectWeapon(c); - -/* - * Set up the radios - */ - initRadio(c, &c->navReceiver[0]); - initRadio(c, &c->navReceiver[1]); - c->hsiSelect = &c->navReceiver[0]; - - break; - - } - } - - if (i == MAXPLAYERS) - return -1; - - return i; -} - -int -newDrone(craft * p, const char *plane_type) -{ - - int i, j, droneTeam; - craft *c; - const char *type; - VPoint s, tmp; - -#ifdef HAVE_DIS - double disLocation[3]; - double disZeroVec[3]; - double disOrientation[3]; - -#endif - - for (i = 0; i < MAXPLAYERS; ++i) { - if (ptbl[i].type == CT_FREE) { - - if (p->team == 1) { - type = "MiG-29"; - droneTeam = 2; - } - else { - type = "F-16"; - droneTeam = 1; - } - - if (plane_type) { - type = plane_type; - } - - c = &ptbl[i]; - *c = *p; - c->pIndex = i; -#ifdef AFDS - c->fp = NULL; - c->flightDirector = NULL; - AFDSInit( c ); -#endif - - /* - * Enter attack mode with no oppenent assigned - */ - - c->curDroneMode = DM_ATTACK; - c->team = droneTeam; - c->curOpponent = -1; - c->holdCount = 0; - - c->vl = NULL; - c->type = CT_DRONE; - c->cinfo = lookupCraft(type); - -/* - * Position the drone about 1500 meters ahead of the player's craft. - */ - - strncpy(c->name, "drone", sizeof(c->name)); - s.x = 500.0 + 100.0 * (efrandom() + efrandom()); - s.y = 100.0 * (efrandom() + efrandom()); - s.z = 0.0; - VTransform_(&s, &(p->trihedral), &tmp); - -/* convert NED (meters) to Geocentric (meters) */ - - VReverseTransform_(&tmp, &(p->XYZtoNED), &c->Sg); - c->Sg.x += p->Sg.x; - c->Sg.y += p->Sg.y; - c->Sg.z += p->Sg.z; - c->prevSg = c->Sg; - - DISGeocentricToWorldCoordinates - ((dis_world_coordinates *) & c->Sg, &c->w); - c->prevw = c->w; - GenerateWorldToLocalMatrix(&c->w, &c->XYZtoNED); - - c->curThrust = (c->cinfo->thrust) (c); - - c->curNWDef = 0.0; - c->flags = p->flags & FL_AFTERBURNER; - c->radarMode = RM_ACM; - c->curRadarTarget = -1; - - for (j = 0; j < 6; ++j) { - c->leftHUD[j] = Vmalloc(32); - c->rightHUD[j] = Vmalloc(32); - strcpy(c->leftHUD[j], ""); - strcpy(c->rightHUD[j], ""); - } - -/* - * rearm and fuel the aircraft. - */ - - (*c->cinfo->resupply) (c); - - c->hsiSelect = NULL; - - selectNamedWeapon(c, WK_AIM9M); - - type = ""; - strcpy(c->lastTotal, type); - strcpy(c->lastConsump, type); - strcpy(c->lastFlap, type); - strcpy(c->lastRPM, type); - -#ifdef HAVE_DIS - if (disInUse) { - disLocation[0] = c->Sg.x; - disLocation[1] = c->Sg.y; - disLocation[2] = c->Sg.z; - disZeroVec[0] = 0.0; - disZeroVec[1] = 0.0; - disZeroVec[2] = 0.0; - disOrientation[0] = c->curHeading; - disOrientation[1] = c->curPitch; - disOrientation[2] = c->curRoll; - dis_entityEnter(droneTeam, c, - &c->cinfo->entityType, - &c->cinfo->altEntityType, - disLocation, disZeroVec, - disZeroVec, disOrientation, - disZeroVec, &c->disId); - dis_setRadarMode(c, 1, 1); -#ifdef DIS_DEBUG - printf("Entering %d %d\n", c->pIndex, c->disId); -#endif - } -#endif - - break; - } - } - - if (i == MAXPLAYERS) - return -1; - - return i; -} diff -Nru acm-5.0/src/players.c acm-6.0+20200416/src/players.c --- acm-5.0/src/players.c 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/src/players.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,1016 +0,0 @@ -/* - * acm : an aerial combat simulator for X - * Copyright (C) 1991-1998 Riley Rainey - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 dated June, 1991. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. - */ - -#include "pm.h" -#include "eng.xbm" -#include "flaps0.xbm" -#include "flaps1.xbm" -#include "flaps2.xbm" -#include "flaps3.xbm" -#include "handleUp.xbm" -#include "handleDn.xbm" -#include "gearUp.xbm" -#include "gearTran.xbm" -#include "gearDown.xbm" -#include -#include -#ifndef __hpux -#include -#endif -#include -#ifdef HAVE_DIS -#include "dis.h" -#endif - -#if defined(HAVE_STDLIB_H) -#ifndef bzero -#define bzero(s,n) memset ((s), 0, (n)) -#endif -#endif /* HAVE_STDLIB_H */ - -extern void resizePlayerWindow(craft * c, - viewer * u, - int width, - int height, - int initial_flag); -extern void blackBoxKillPlayer(int id); -extern void printValidAircraft(int s); -extern void buildEulerMatrix(double roll, double pitch, double heading, - VMatrix * m); -extern void transpose(VMatrix * m, VMatrix * r); - -#define BORDER 1 - -#define ARG_FONT "font" -#define ARG_RADAR_FONT "radarfont" -#define ARG_BORDER_COLOR "bordercolor" -#define ARG_BORDER "borderwidth" -#define ARG_GEOMETRY "geometry" -/* #define DEFAULT_BACKGROUND "#93bde4" /* my version of sky blue */ -/* #define DEFAULT_BACKGROUND "#7491ae" /* my version of sky blue */ -#define DEFAULT_BACKGROUND "#7c99b6" /* my version of sky blue */ -#define DEFAULT_BORDER "black" -#define DEFAULT_RADAR_FONT "-misc-fixed-medium-*-*-*-*-120-*-*-*-*-*-*" - -#define SW_BORDER 1 -#define SW_BACKGROUND 2 -#define SW_HUDFONT 3 -#define SW_GEOM 4 -#define SW_RADARFONT 5 -#define SW_TEAM 6 -#define SW_DEFAULT_VISUAL 8 -#define SW_PLANE 9 -#define SW_LIST_PLAYER 10 -#define SW_MONOCHROME 11 -/* 12 unused */ -#define SW_PASSIVE 13 -#define SW_LATITUDE 14 -#define SW_LONGITUDE 15 -#define SW_ALTITUDE 16 -#define SW_AIRSPEED_KTS 17 -#define SW_HEADING 18 -#define SW_END_GAME 19 -#define SW_LAST 19 /* last entry in list */ - -struct { - char *sw; - int value; -} swt[] = { - "-bw", SW_BORDER, - "-skycolor", SW_BACKGROUND, - "-hudfont", SW_HUDFONT, - "-radarfont", SW_RADARFONT, - "-geometry", SW_GEOM, - "-team", SW_TEAM, - "-stealth", SW_PASSIVE, - "-cmap", SW_DEFAULT_VISUAL, - "-mono", SW_MONOCHROME, - "-plane", SW_PLANE, - "-list", SW_LIST_PLAYER, - "-latitude", SW_LATITUDE, - "-longitude", SW_LONGITUDE, - "-altitude", SW_ALTITUDE, - "-airspeed-kts", SW_AIRSPEED_KTS, - "-heading", SW_HEADING, - "-end-game", SW_END_GAME, - NULL, 0 -}, *swp; - -void -recoverAcmArgv(char *args, int *argc, char **argv) -{ - - char *s; - - argv[0] = ACM; - argv[1] = args; - - if (*args == '\0') { - *argc = 1; - argv[1] = (char *) NULL; - return; - } - else - *argc = 2; - - for (s = args; *s;) { - if (*s == '|') { - *s = '\0'; - argv[(*argc)++] = ++s; - } - else - ++s; - } - - argv[*argc] = (char *) NULL; -} - -Visual * -get_pseudo_visual(Display * display, int screen, unsigned int *depth) -{ - - XVisualInfo vTemplate; - XVisualInfo *visualList; - int i, visualsMatched; - -/* - * Get all Visuals on this screen - */ - - vTemplate.screen = screen; - visualList = XGetVisualInfo(display, VisualScreenMask, - &vTemplate, &visualsMatched); - - if (visualsMatched == 0) - return NULL; - -/* - * look first for a suitable PseudoColor visual, then a GreyScale visual - * if no PseudoColor is present - */ - - for (i = 0; i < visualsMatched; ++i) { - if (visualList[i].visual->class == PseudoColor && - visualList[i].depth >= 4) { - *depth = visualList[i].depth; - XFree((char *) visualList); - return visualList[i].visual; - } - } - - for (i = 0; i < visualsMatched; ++i) { - if (visualList[i].visual->class == GrayScale && - visualList[i].depth >= 4) { - *depth = visualList[i].depth; - XFree((char *) visualList); - return visualList[i].visual; - } - } - - XFree((char *) visualList); - - return NULL; -} - -int -newPlayer(int s, char *display, char *auserver, char *logname, char *switches) -{ - - char *fontName; /* Name of font for string */ - XSizeHints xsh; /* Size hints for window manager */ - Colormap cmap; - XGCValues gcv; - unsigned long pad; /* Font size parameters */ - unsigned long bd; /* Pixel values */ - unsigned long bw; /* Border width */ - char *tempstr; /* Temporary string */ - XColor color; /* Temporary color */ - char *geomSpec; /* Window geometry string */ - XWMHints xwmh; /* Window manager hints */ - Cursor cursor; - char **c; - char err[256]; - static char *background = NULL; - int borderWidth = -1; - int player; - viewer *u; - craft *cf; - int argc; - char *argv[32]; - int screen; - char *hudfont = NULL, *radarfont = NULL; - int team = 1; - char *plane = NULL; /* name of plane type */ - int obsrver = -1; - int width, height; /* dimensions of main window */ - double scale; - unsigned depth, mono = 0; - long win_attr_mask; - Visual *theVisual; - XSetWindowAttributes window_attributes; - int useDefaultVisual = 1; - int passive = 0; - Atom atom[2]; - int overrides[SW_LAST+1]; - double overrideLatitude, overrideLongitude, overrideAltitude; - double overrideHeading_rad, overrideAirspeed_fps; - int end_game = 0; - -#ifdef HAVE_DIS - double disLocation[3]; - double disZeroVec[3]; - double disOrientation[3]; - int disType; - -#endif - - memset(overrides, 0, sizeof(overrides)); - - recoverAcmArgv(switches, &argc, argv); - - geomSpec = NULL; - u = (viewer *) malloc(sizeof(viewer)); - if (!u) { - printf ("unable to allocate viewer\n"); - exit (1); - } - u->watchedCraft = NULL; - u->viewer_state = ViewerStateNormal; - u->browseBase = 0; - u->browseSelectedItem = -1; - u->browseClickTime = 0; - u->viewDirection.x = 1.0; - u->viewDirection.y = 0.0; - u->viewDirection.z = 0.0; - u->viewUp.x = 0.0; - u->viewUp.y = 0.0; - u->viewUp.z = -1.0; - -/* - * Parse command line - */ - - for (c = &argv[1]; *c != (char *) NULL; ++c) - if (**c == '-') { - for (swp = &swt[0]; swp->value != 0; ++swp) - if (strcmp(swp->sw, *c) == 0) { - - switch (swp->value) { - - case SW_GEOM: - geomSpec = *(++c); - break; - - case SW_END_GAME: - end_game = 1; - break; - - case SW_BORDER: - borderWidth = atoi(*(++c)); - break; - - case SW_BACKGROUND: - background = *(++c); - break; - - case SW_HUDFONT: - hudfont = *(++c); - break; - - case SW_RADARFONT: - radarfont = *(++c); - break; - - case SW_TEAM: - team = atoi(*(++c)); - break; - - case SW_PASSIVE: - passive = 1; - break; - - case SW_PLANE: - plane = *(++c); - break; - - case SW_MONOCHROME: - mono = 1; - break; - - case SW_LATITUDE: - overrideLatitude = DEGtoRAD(atof(*(++c))); - overrides[SW_LATITUDE] = 1; - break; - - case SW_LONGITUDE: - overrideLongitude = DEGtoRAD(atof(*(++c))); - overrides[SW_LONGITUDE] = 1; - break; - - case SW_ALTITUDE: - overrideAltitude = FEETtoMETERS(atof(*(++c))); - overrides[SW_ALTITUDE] = 1; - break; - - case SW_AIRSPEED_KTS: - overrideAirspeed_fps = KTStoFPS(atof(*(++c))); - if (overrideAirspeed_fps > KTStoFPS(2500.0)) { - printf ("You really should slow down.\n"); - printf ("At least to less than 2500 knots.\n"); - exit (1); - } - overrides[SW_AIRSPEED_KTS] = 1; - break; - - case SW_HEADING: - overrideHeading_rad = DEGtoRAD(atof(*(++c))); - overrides[SW_HEADING] = 1; - break; - - case SW_LIST_PLAYER: - sprintf(err, "\nname\t\tnumber\n"); - write(s, err, strlen(err)); - sprintf(err, "-------------------------\n"); - write(s, err, strlen(err)); - for (team = 0; team < MAXPLAYERS; team++) { - if (ptbl[team].type == CT_PLANE) { - sprintf(err, "%-16s %d\n", - ptbl[team].name, team); - write(s, err, strlen(err)); - } - } - return -1; - - case SW_DEFAULT_VISUAL: - useDefaultVisual = 0; - break; - } - break; - } - if (swp->value == 0) { - free((char *) u); - sprintf(err, "%s: invalid switch %s", ACM, *c); - write(s, err, strlen(err)); - return -1; - } - } - - if ( 1 ) { - - if (!plane) { - plane = (team == 1) ? "F-16" : "MiG-29"; - } - - if ((player = newPlane(plane, -1)) < 0) { - if (player == -1) { - sprintf(err, - "Sorry, no room for any more players at this moment.\n"); - write(s, err, strlen(err)); - } - else { - sprintf(err, - "You have selected an unknown plane type.\n"); - write(s, err, strlen(err)); - printValidAircraft(s); - } - return -1; - } - - cf = &ptbl[player]; - -/* - * assign an initial location basewd on the player's team. - */ - - if (team != 2) { - team = 1; - } - - cf->w.latitude = teamLatLon[team].latitude; - cf->w.longitude = teamLatLon[team].longitude; - cf->w.z = cf->prevw.z = cf->w.z + teamLatLon[team].z; - DISWorldCoordinatesToGeocentric(&cf->w, - (dis_world_coordinates *) & cf->Sg); - GenerateWorldToLocalMatrix(&cf->w, &cf->XYZtoNED); - - cf->curHeading = teamHeading[team]; - - buildEulerMatrix(cf->curRoll, cf->curPitch, cf->curHeading, - &(cf->trihedral)); - } - - /* - * If we're passive (stealth mode), wipe out aircraft information; - * this entry will become a placeholder for our browsing view. - */ - - if ( passive ) { - - u->viewer_state = ViewerStateBrowsing; - cf->type = CT_DIS_STEALTH; - cf->cinfo = NULL; - cf->radarMode = RM_DIS_BROWSE; - - if ( end_game ) { - end_game_mode = 1; - } - - /* - * Stealth a specific entity? Go ahead and set it as the subject. - * - * This requires snooping for entities in the PDU stream prior - * to looking for the entity in the table. - */ - - if ( subjectEntitySpecified ) { - craft *c; - - printf ("Building entity database ... "); - fflush ( stdout ); - - updateSimTimeFromSystemClock (); - dis_snoop ( 5500 ); - - printf ("done.\n"); - - c = locateCraftByDISEntityID ( & subjectEntityID ); - if ( c ) { - - stealthCraft ( c, u, -1, 1); - - } - } - - } - else { - - if ( end_game ) { - fprintf ( stderr, "The -end-game switch is only valid when used " ); - fprintf ( stderr, "with stealth mode.\n" ); - fprintf ( stderr, "The switch will be ignored.\n\n" ); - } - - if ( subjectEntitySpecified ) { - fprintf ( stderr, "The -subject-entity-id switch is only valid when used " ); - fprintf ( stderr, "with stealth mode.\n" ); - fprintf ( stderr, "The switch will be ignored.\n\n" ); - } - - } - - if ((u->dpy = XOpenDisplay(display)) == (Display *) NULL) { - free((char *) u); - cf->type = CT_FREE; - sprintf(err, "%s: can't open %s\n", ACM, display); - write(s, err, strlen(err)); - return -1; - } - screen = DefaultScreen(u->dpy); - - /* - * Add viewer to list - */ - - addViewer ( u ); - u->c = cf; - - if (radarfont) - fontName = radarfont; - else if ((fontName = XGetDefault(u->dpy, ACM, ARG_RADAR_FONT)) == NULL) { - fontName = DEFAULT_RADAR_FONT; - } - if ((u->rfont = XLoadQueryFont(u->dpy, fontName)) == NULL) { - XCloseDisplay(u->dpy); - free((char *) u); - cf->type = CT_FREE; - sprintf(err, "%s: display %s doesn't know font %s\n", - ACM, display, fontName); - write(s, err, strlen(err)); - return -1; - } - -/* - * If the player has specified that the want the default Visual, simply - * give 'em that along with the default Colormap. - */ - - if (useDefaultVisual) { - - theVisual = DefaultVisual(u->dpy, screen); - cmap = DefaultColormap(u->dpy, screen); - depth = DisplayPlanes(u->dpy, screen); - - } - -/* - * Look for a visual; if we can't find one, - * fall back to monochrome mode. - */ - - else { - if ((theVisual = get_pseudo_visual(u->dpy, screen, &depth)) == NULL) { - theVisual = DefaultVisual(u->dpy, screen); - cmap = DefaultColormap(u->dpy, screen); - depth = DefaultDepth(u->dpy, screen); - } - else { - cmap = XCreateColormap(u->dpy, RootWindow(u->dpy, screen), - theVisual, AllocNone); - } - } - -/* - * Select colors for the border, the window background, and the - * foreground. We use the default colormap to allocate the colors in. - */ - - if (background == NULL) - background = DEFAULT_BACKGROUND; - - if ((tempstr = XGetDefault(u->dpy, ACM, ARG_BORDER_COLOR)) == NULL) - tempstr = DEFAULT_BORDER; - if (XParseColor(u->dpy, cmap, tempstr, &color) == 0) { - XCloseDisplay(u->dpy); - free((char *) u); - cf->type = CT_FREE; - sprintf(err, "Can't get border color %s\n", tempstr); - write(s, err, strlen(err)); - return -1; - } - - if (depth == 1) - bd = BlackPixel(u->dpy, screen); - else { - if (XAllocColor(u->dpy, cmap, &color) == 0) { - XCloseDisplay(u->dpy); - free((char *) u); - cf->type = CT_FREE; - sprintf(err, "Cannot allocate color cells\n"); - write(s, err, strlen(err)); - return -1; - } - bd = color.pixel; - } - -/* - * Set the border width of the window, and the gap between the text - * and the edge of the window, "pad". - */ - - pad = BORDER; - if (borderWidth >= 0) - bw = borderWidth; - else if ((tempstr = XGetDefault(u->dpy, ACM, ARG_BORDER)) == NULL) - bw = 1; - else - bw = atoi(tempstr); - -/* - * Deal with providing the window with an initial position & size. - * Fill out the XSizeHints struct to inform the window manager. - */ - - if (geomSpec == NULL) - geomSpec = XGetDefault(u->dpy, ACM, ARG_GEOMETRY); - -/* - * If the defaults database doesn't contain a specification of the - * initial size & position, locate it in the center of the screen. - */ - - if (geomSpec == NULL) { - xsh.flags = PPosition | PSize; - xsh.height = FS_WINDOW_HEIGHT * DisplayWidth(u->dpy, screen) / 1280; - xsh.width = FS_WINDOW_WIDTH * DisplayWidth(u->dpy, screen) / 1280; - xsh.x = (DisplayWidth(u->dpy, screen) - xsh.width) / 2; - xsh.y = (DisplayHeight(u->dpy, screen) - xsh.height) / 2; - } - else { - int bitmask; - - bzero((char *) &xsh, sizeof(xsh)); - bitmask = XParseGeometry(geomSpec, &xsh.x, &xsh.y, - &xsh.width, &xsh.height); - if (bitmask & (XValue | YValue)) { - xsh.flags |= USPosition; - } - if (bitmask & (WidthValue | HeightValue)) { - xsh.flags |= USSize; - } - } - - width = xsh.width; - height = xsh.height; - -/* - * Create the Window with the information in the XSizeHints, the - * border width, and the border & background pixels. - */ - - win_attr_mask = CWColormap | CWBitGravity | CWBackPixel; - window_attributes.colormap = cmap; - window_attributes.bit_gravity = NorthWestGravity; - window_attributes.background_pixel = BlackPixel(u->dpy, screen); - - u->win = XCreateWindow(u->dpy, RootWindow(u->dpy, screen), - xsh.x, xsh.y, xsh.width, xsh.height, bw, depth, - InputOutput, theVisual, win_attr_mask, &window_attributes); - - scale = (double) xsh.width / (double) FS_WINDOW_WIDTH; - -/* - * Create a pixmap of the engine RPM gauge and flap indicators. - */ - - u->eng = XCreateBitmapFromData(u->dpy, u->win, eng_bits, eng_width, - eng_height); - u->flap[0] = XCreateBitmapFromData(u->dpy, u->win, flaps0_bits, - flaps0_width, flaps0_height); - u->flap[1] = XCreateBitmapFromData(u->dpy, u->win, flaps1_bits, - flaps1_width, flaps1_height); - u->flap[2] = XCreateBitmapFromData(u->dpy, u->win, flaps2_bits, - flaps2_width, flaps2_height); - u->flap[3] = XCreateBitmapFromData(u->dpy, u->win, flaps3_bits, - flaps3_width, flaps3_height); - u->handle[0] = XCreateBitmapFromData(u->dpy, u->win, handleUp_bits, - handleUp_width, handleUp_height); - u->handle[1] = XCreateBitmapFromData(u->dpy, u->win, handleDn_bits, - handleDn_width, handleDn_height); - u->gearLight[0] = XCreateBitmapFromData(u->dpy, u->win, gearUp_bits, - gearUp_width, gearUp_height); - u->gearLight[1] = XCreateBitmapFromData(u->dpy, u->win, gearTran_bits, - gearTran_width, gearTran_height); - u->gearLight[2] = XCreateBitmapFromData(u->dpy, u->win, gearDown_bits, - gearDown_width, gearDown_height); - -/* - * Set the standard properties and hints for the window managers. - */ - - XSetStandardProperties(u->dpy, u->win, ACM, ACM, None, argv, argc, &xsh); - xwmh.flags = InputHint | StateHint; - xwmh.input = True; - xwmh.initial_state = NormalState; - XSetWMHints(u->dpy, u->win, &xwmh); - cursor = XCreateFontCursor(u->dpy, XC_tcross); - XDefineCursor(u->dpy, u->win, cursor); - -/* - * Tell the window manager that we'd like to participate in the - * WM_CLOSEDOWN and WM_DELETE_WINDOW protocols. - */ - - u->protocolsAtom = XInternAtom(u->dpy, "WM_PROTOCOLS", False); - atom[0] = - u->closedownAtom = XInternAtom(u->dpy, "WM_CLOSEDOWN", False); - atom[1] = - u->deleteWindowAtom = XInternAtom(u->dpy, "WM_DELETE_WINDOW", False); - XSetWMProtocols(u->dpy, u->win, atom, 2); - -/* - * Fill-in the viewer structure - */ - XSelectInput(u->dpy, u->win, KeyPressMask | ButtonPressMask | - StructureNotifyMask | ButtonReleaseMask | ExposureMask); - cf->team = team; - - cf->vl = u; - strncpy(cf->name, logname, sizeof(cf->name)); - strncpy(cf->display, display, sizeof(cf->display)); - u->next = (viewer *) NULL; - -/* - * We use the drawController to optimize areas that we'll - * be drawing using X, as well. - */ - initializeDrawnItemController(&u->drawControl); - addDrawnItem(&u->drawControl, &u->rpmState); - addDrawnItem(&u->drawControl, &u->flapState); - addDrawnItem(&u->drawControl, &u->fuelState); - addDrawnItem(&u->drawControl, &u->consumpState); - addDrawnItem(&u->drawControl, &u->gearState); - addDrawnItem(&u->drawControl, &u->annunciatorState); - addDrawnItem(&u->drawControl, &u->radarState); - redrawAllItems(&u->drawControl); - -/* - * Connect to the audio server - */ - - if (initializeAudio(cf, u, display, auserver) != 0) { - sprintf(err, "Sound is not available on workstation %s\n", display); - write(s, err, strlen(err)); - } - -#ifdef USE_PIXMAP_ANIMATION - if (depth != 1) - _VDefaultWorkContext->usePixmaps = 1; -#endif - - _VDefaultWorkContext->usePixmaps = mono ? 1 : 0; - - u->v = VOpenViewport(u->dpy, screen, u->win, cmap, theVisual, - UNITS_METERS, scale, FEETtoMETERS(0.50), - width * VIEW_WINDOW_WIDTH / FS_WINDOW_WIDTH, - height * VIEW_WINDOW_HEIGHT / FS_WINDOW_HEIGHT); - -/* - * If this is a color-rich visual, then enable depth-cueing mode - */ - - if (depth >= 6) { - ViewportSetDepthCueing(u->v, 1); - } - - if (VBindColors(u->v, background) < 0) { - XCloseDisplay(u->dpy); - free((char *) u); - ptbl[player].type = CT_FREE; - sprintf(err, "Error in binding colors.\n"); - write(s, err, strlen(err)); - return -1; - } - - whitePixel = whiteColor->cIndex; - blackPixel = blackColor->cIndex; - HUDPixel = HUDColor->cIndex; - -/* - * Create the GC for drawing the picture. - */ - - gcv.graphics_exposures = False; - gcv.font = u->rfont->fid; - u->gc = XCreateGC(u->dpy, u->win, GCGraphicsExposures | GCFont, &gcv); - - gcv.graphics_exposures = False; - gcv.foreground = u->v->flags & VPMono ? - WhitePixel(u->v->dpy, u->v->screen) : - VConstantColor(u->v, whitePixel); - gcv.background = u->v->flags & VPMono ? - BlackPixel(u->v->dpy, u->v->screen) : - VConstantColor(u->v, blackPixel); - gcv.line_width = 2; - gcv.font = u->rfont->fid; - u->gauge_gc = XCreateGC(u->dpy, u->win, - GCGraphicsExposures | GCForeground | GCBackground | - GCLineWidth | GCFont, &gcv); - - - resizePlayerWindow(cf, u, width, height, 1); - -/* - * Map the window to make it visible. - */ - - XMapWindow(u->dpy, u->win); - if (depth != 1) { -#ifdef notdef - register int curPixel; - - VExposeBuffer(u->v, u->gc); - curPixel = *(u->v->pixel); - XSetForeground(u->dpy, u->gc, curPixel); - XFillRectangle(u->dpy, u->win, u->gc, 0, 0, u->width, u->height); -#endif - } - - if (depth == 1) - XSetWindowBackground(u->dpy, u->win, BlackPixel(u->dpy, screen)); - else - XSetWindowBackground(u->dpy, u->win, VConstantColor(u->v, blackPixel)); - - u->z.color = u->v->pixel[HUDPixel]; - u->z.depth = 1; - - u->rz.color = u->v->pixel[radarColor->cIndex]; - u->rz.depth = 2; - - ++ptblCount; - - /* - * Take appropriate actions based on any overrides specified by the user - */ - - if (overrides[SW_LATITUDE] || - overrides[SW_LONGITUDE] || - overrides[SW_ALTITUDE]) { - - if (overrides[SW_LATITUDE]) { - cf->w.latitude = overrideLatitude; - } - - if (overrides[SW_LONGITUDE]) { - cf->w.longitude = overrideLongitude; - } - - if (overrides[SW_ALTITUDE]) { - cf->w.z = overrideAltitude; - } - else { - cf->w.z = 0.0; - } - - DISWorldCoordinatesToGeocentric(&cf->w, - (dis_world_coordinates *) & cf->Sg); - - if (overrides[SW_ALTITUDE] == 0) { - cf->w.z = localAltitude( &cf->Sg, &cf->w ) + - FEETtoMETERS( cf->cinfo->groundingPoint.z ); - DISWorldCoordinatesToGeocentric(&cf->w, - (dis_world_coordinates *) &cf->Sg); - } - - cf->prevw = cf->w; - cf->prevSg = cf->Sg; - - GenerateWorldToLocalMatrix(&cf->w, &cf->XYZtoNED); - } - - if (overrides[SW_HEADING]) { - - cf->curHeading = overrideHeading_rad; - - buildEulerMatrix(cf->curRoll, cf->curPitch, cf->curHeading, - &(cf->trihedral)); - } - - if (overrides[SW_AIRSPEED_KTS]) { - VPoint v = { overrideAirspeed_fps, 0.0, 0.0 }; - VTransform_ ( &v, &cf->trihedral, &cf->Cg ); - } - - /* - * Transmit initial DIS entity state PDU - */ - -#ifdef HAVE_DIS - if ( disInUse && cf->type != CT_DIS_STEALTH ) { - - DISWorldCoordinatesToGeocentric(&cf->w, - (dis_world_coordinates *) disLocation); - disZeroVec[0] = 0.0; - disZeroVec[1] = 0.0; - disZeroVec[2] = 0.0; - disOrientation[0] = cf->curHeading; - disOrientation[1] = 0.0; - disOrientation[2] = 0.0; - - dis_entityEnter(team, cf, - &cf->cinfo->entityType, - &cf->cinfo->altEntityType, - disLocation, disZeroVec, disZeroVec, - disOrientation, disZeroVec, &cf->disId); - } -#endif - - return 0; - -} - -#ifndef WIN32 - -/* - * Until we have a "you're dead" dialog box in the UNIX version of ACM, - * this will have to do ... - */ - -int -killPlayerEx(craft * c,...) -{ - return killPlayer(c); -} -#endif - -int -killPlayer(craft * c) -{ - - viewer *v, *vn; - int i; - VPoint vel = { 0, 0, 0 }; - - playSound(c, SoundCrash); - -/* - * Decrement the player count, iff this is a real person that just got - * killed. - */ - - if (c->type == CT_PLANE && (c->flags & FL_BLACK_BOX) == 0) { - --ptblCount; - } - -/* - * Erase our radar emissions - */ - - for (i = 0; i < MAXPLAYERS; ++i) - ptbl[i].rval[c->pIndex] = 0.0; - -/* - * Replace the plane with an explosion. - */ - - newExplosion(&(c->Sg), &vel, 30.0, 15.0, 4.0); - -/* - * Free flight director storage - */ - -#ifdef AFDS - AFDSFree( c ); - - if (c->fp) { - freeFlightPlan ( c->fp ); - } -#endif - -/* - * Free HUD string storage - */ - - if (c->leftHUD[0] != (char *) NULL) - for (i = 0; i < 6; ++i) { - free(c->leftHUD[i]); - free(c->rightHUD[i]); - } - -/* - * Close viewers' display - */ - - for (v = c->vl; v != (viewer *) NULL;) { - - /* - * If this was a situation where we had grabbed control in steath - * mode and then died, return to the browsing state. - */ - - if ( v->viewer_state == ViewerStateNormal && - v->watchedCraft != NULL && - v->watchedCraft->type == CT_DIS_STEALTH ) { - printf ("player killed: returning to stealth browsing mode\n"); - v->viewer_state = ViewerStateBrowsing; - v->c = v->watchedCraft; - v->watchedCraft = NULL; - v = NULL; - } - else { - - /* - * remove viewer from viewer list - */ - - if (removeViewer ( v )) { - printf ("unable to locate viewer in viewer list\n"); - } - - /* - * shutdown the viewer - */ - - VCloseViewport(v->v); - XCloseDisplay(v->dpy); - shutdownAudio(c, v); - vn = (viewer *) v->next; - free((char *) v); - v = NULL; - } - } - - if (c->flags & FL_RECORD) { - --recordCount; - } - - if (c->flags & FL_BLACK_BOX) - blackBoxKillPlayer(c->pIndex); - -#ifdef HAVE_DIS - if (c->type == CT_PLANE || c->type == CT_DRONE) { - /* active (broadcasting) player, announce its death */ -#ifdef DIS_DEBUG - printf("Killed local player/drone: %d %d\n", c->pIndex, c->disId); -#endif - dis_entityExit(c->disId); - } -#endif - - c->type = CT_FREE; - return 0; -} diff -Nru acm-5.0/src/pm.c acm-6.0+20200416/src/pm.c --- acm-5.0/src/pm.c 1998-08-18 13:44:49.000000000 +0000 +++ acm-6.0+20200416/src/pm.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,877 +0,0 @@ -/* - * acm : an aerial combat simulator for X - * Copyright (C) 1991-1998 Riley Rainey - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 dated June, 1991. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. - */ - -#include -#include -#define ALLOCATE_SPACE -#include "pm.h" -#ifdef AFDS -#include -#endif -#include "dis.h" - -#ifdef WIN32 -#include -#endif - -//extern void transpose(); - -int debug = 0; - -/* - * We keep a table of atmospheric constants for different altitudes. - */ - -struct { - double alt; /* altitude in feet */ - double rho; /* rho value (air density) */ - double mach1; /* speed of sound in feet per second */ -} *rhop, rhoTable[] = { - -#ifdef notdef - { - 0.0, 23.77, 1116.9 - }, - { - 2.0, 22.41, 1109.2 - }, - { - 4.0, 21.11, 1101.4 - }, - { - 6.0, 19.87, 1093.6 - }, - { - 8.0, 18.68, 1085.7 - }, - { - 10.0, 17.55, 1077.8 - }, - { - 15.0, 14.96, 1057.7 - }, - { - 20.0, 12.66, 1037.3 - }, - { - 25.0, 10.65, 1016.4 - }, - { - 30.0, 8.89, 995.1 - }, - { - 35.0, 7.365, 973.3 - }, - { - 40.0, 5.851, 968.5 - }, - { - 50.0, 3.618, 968.5 - }, -#endif - { - 60.0, 2.238, 968.5 - }, - { - 80.0, 0.9065, 980.0 - }, - { - 100.0, 0.3371, 1015.0 - }, - { - 120.0, 0.1340, 1053.0 - }, - { - 160.0, 0.02622, 1083.0 - }, - { - 100000.0, 0.02622, 1083.0 - } -}; /* a large value for alt at the end */ - -double deltaT; /* Update interval in seconds */ -double halfDeltaTSquared; /* 0.5 * deltaT * deltaT */ -double CM, CN, C_Y; - -extern double groundContactTime(craft * c, VPoint * contactSg); -extern int groundDynamics(craft * c, double startT, double CL, double CD, double CM, double w, double qS); - -/* - * calcRho : Calculate air density and the speed of sound by interpolation. - */ - -double -calcRho(double alt, double *mach) -{ - - double deltaAlt, b; - extern void airProperties(double h, double *rho, double *mach1); - double rho; - - if (alt <= 60000.0) { - airProperties(alt, &rho, mach); - return rho; - } - - alt = alt / 1000.0; - - for (rhop = rhoTable; alt > (rhop + 1)->alt; ++rhop); - deltaAlt = (rhop + 1)->alt - rhop->alt; - b = ((rhop + 1)->mach1 - rhop->mach1) / deltaAlt; - *mach = rhop->mach1 + b * (alt - rhop->alt); - b = ((rhop + 1)->rho - rhop->rho) / deltaAlt; - return (rhop->rho + b * (alt - rhop->alt)) / 10000.0; - -} - -/* - * twoorder: solve linear second-order differential equation with initial - * conditions known. - * - * y_prime_prime + d * y_prime + k * y = 0 - * - * given initial conditions: - * y == y. - * y_prime == v. - * - * results are *newy and *newv for x+deltaT seconds into the future. - * - */ - -void -twoOrder(double k, double d, double y, double v, double *newy, double *newv) -{ - - double s, s1, s2, t, ac, x, c1, c2, exp_s1_x, exp_s2_x; - int return_zero = 0; - - k = -k; - d = -d; - - /* - * Get root(s) to the charateristic equation - */ - - ac = d * d - 4.0 * k; - if (ac < 0.0) { - /* - * Imaginary roots - */ - s = -d / 2.0; - t = sqrt(-ac) / 2.0; - } - else if (ac == 0.0) { - /* - * one real root - */ - s = (-d + sqrt(ac)) / 2.0; - t = 0.0; - } - else { - - /* - * Two, unequal real roots - */ - - s1 = (-d + sqrt(ac)) / 2.0; - s2 = (-d - sqrt(ac)) / 2.0; - c1 = (s2 * y - v) / (s2 - s1); - c2 = y - c1; - x = deltaT; - exp_s1_x = exp(s1 * x); - exp_s2_x = exp(s2 * x); - *newy = c1 * exp_s1_x + c2 * exp_s2_x; - *newv = c1 * s1 * exp_s1_x + c2 * s2 * exp_s2_x; - return; - } - - if (t == 0.0 || y == 0.0) { - x = 0.0; - } - else { - x = atan2(y * s - v, t * y) / t; - } - - if (x == 0.0) { - c1 = y; - } - else if (cos(t * x) != 0.0) { - exp_s1_x = exp(s * x); - if (exp_s1_x == 0.0) { - return_zero = 1; - } - else { - c1 = y / (exp_s1_x * cos(t * x)); - } - } - else { - return_zero = 1; - } - - if (return_zero) { - *newy = 0.0; - *newv = v; - return; - } - -/* - * Now we can compute the values of y and v at the end of this - * time interval; - */ - -#ifdef notdef - printf("s = %g, t = %g, x = %g, y = %g, c1 = %g\n", s, t, x, - y, c1); - - if (fabs(y - (exp(s * x) * c1 * cos(t * x))) > 0.001) - printf("*** possible error ***\n"); - - *newv = exp(s * x) * c1 * (s * cos(t * x) - t * sin(t * x)); - if (fabs(v - *newv) > 0.001) - printf("*** possible v error *** %g %g\n", v, *newv); -#endif - - x += deltaT; - - *newy = exp(s * x) * c1 * cos(t * x); - *newv = exp(s * x) * c1 * (s * cos(t * x) - t * sin(t * x)); - - if (isnan(*newy) || isnan(*newv)) { - printf("Gotcha\n"); - } - -#ifdef notdef - printf("ny = %g, nv = %g\n", *newy, *newv); -#endif - -} - -/* - * calcCoefficients : Calculate CLift and friends - */ - -void -calcCoefficients(craft * c, double *CLift, double *CDrag) -{ - - double CDAlpha, CDBeta; - register craftType *p = c->cinfo; - -/* - * We used to interpolate these values, but now use several characteristic - * equations to compute these values for a given alpha value. The basic - * formulas are: - * - * - * C = C + (alpha * (C + sin(curFlap) * cFlap )) - * L LOrigin LSlope - * - * - * C = zero-lift-wave-and-body-drag + induced-drag + - * D speed-brake-drag + flap drag + landing-gear-drag + - * drag-based-on-sideslip - * - * There are independent equations defining drag resulting from alpha - * and beta values. The hypoteneuse of those two values becomes the - * resultant CDrag value. - */ - - *CLift = interpolate(p->CLift, c->alpha) + - sin(c->curFlap) * p->cFlap; - - CM = p->cmSlope + c->damageCM; - - CDAlpha = interpolate(p->CDb, c->mach) + - *CLift * *CLift / (pi * p->aspectRatio); - CDAlpha += sin(c->curSpeedBrake) * p->cSpeedBrake; - CDAlpha += sin(c->curFlap) * p->cFlapDrag; - CDAlpha += (sin(c->curGear[0]) - + sin(c->curGear[1]) - + sin(c->curGear[2])) / 3.0 * p->cGearDrag; - - if (fabs(c->beta) > p->betaStall) - CN = interpolate(p->CnBeta, fabs(c->alpha)) * fabs(sin(c->beta)); - else - CN = interpolate(p->CnBeta, fabs(c->alpha)); - - CDBeta = p->CDBOrigin + p->CDBFactor * - sin(c->beta + p->CDBPhase); - - *CDrag = sqrt(CDAlpha * CDAlpha + CDBeta * CDBeta); - - C_Y = p->CYbeta * c->beta /* * fabs(cos(c->beta))*/; - -} - -double -heading(VPoint * x) -{ - - double m; - - if (x->x == 0.0 && x->y == 0.0) - return 0.0; - - if ((m = atan2(x->y, x->x)) < 0.0) - return (pi * 2.0 + m); - else - return m; -} - -/* - * Convert a transformation matrix into the equivalent - * heading, pitch and roll angles. - */ - -#define EPSILON 1.0e-6 - -void -matrixToEuler(VMatrix * mt, double *heading, double *pitch, double *roll) -{ - double sin_theta; - - sin_theta = -mt->m[2][0]; - - if (fabs(sin_theta) > 1.0 - EPSILON) { - /* we have the nose pointing very close to straight up or straight down, - set roll to zero and compute the resulting heading */ - - *heading = atan2(-mt->m[0][1], mt->m[1][1]); - if (*heading < 0.0) - *heading += 2.0 * M_PI; - - if (sin_theta > 0.0) - *pitch = M_PI / 2.0; - else - *pitch = -M_PI / 2.0; - - *roll = 0.0; - } - else { - *heading = atan2(mt->m[1][0], mt->m[0][0]); - if (*heading < 0.0) - *heading += 2.0 * M_PI; - - *pitch = asin(sin_theta); - - *roll = atan2(mt->m[2][1], mt->m[2][2]); - } -} - -void -euler(craft * c) -{ - - register double i, j, k, m; - -/* - * Compute the heading ... - */ - - i = c->trihedral.m[0][0]; - j = c->trihedral.m[1][0]; - k = c->trihedral.m[2][0]; - - if (i == 0.0 && j == 0.0) - c->curHeading = 0.0; - else if ((m = atan2(j, i)) < 0.0) - c->curHeading = pi * 2.0 + m; - else - c->curHeading = m; - -/* - * and Pitch ... - */ - - c->curPitch = -asin(k); - -/* - * and Roll ... - */ - - c->curRoll = atan2(c->trihedral.m[2][1], c->trihedral.m[2][2]); - -} - -void -craftToGround(craft * c, VPoint * p, VPoint * g) -{ - - VTransform_(p, &(c->trihedral), g); - -} - -void -calcGForces(craft * c, VPoint * f, double w) -{ - - VPoint t, t1; - double m_slugs; - - m_slugs = w / earth_g; - - t = *f; - t.x = t.x / m_slugs; - t.y = t.y / m_slugs; - t.z = t.z / m_slugs; - - VReverseTransform_(&t, &c->trihedral, &c->linAcc); - - t.z -= earth_g; - - VReverseTransform_ (&t, &c->trihedral, &t1); - - c->G.x = t1.x / earth_g; - c->G.y = t1.y / earth_g; - c->G.z = t1.z / earth_g; - -} - -void -calcAlphaBeta(craft * c, double *alpha, double *beta) -{ - - VPoint C; - double h; - - if (mag(c->Cg) > 0.0) { - VReverseTransform_(&c->Cg, &c->trihedral, &C); - *beta = atan2(C.y, C.x); - h = sqrt(C.y * C.y + C.x * C.x); - *alpha = atan(C.z / h); - } - else { - *alpha = 0.0; - *beta = 0.0; - } - -} - -/* - * buildEulerMatrix : Build a transformation matrix based on the supplied - * euler angles. - */ - -void -buildEulerMatrix(double roll, double pitch, double heading, VMatrix * m) -{ - - register double sinPhi, cosPhi, sinTheta, cosTheta, sinPsi, cosPsi; - - sinPhi = sin(roll); - cosPhi = cos(roll); - sinTheta = sin(pitch); - cosTheta = cos(pitch); - sinPsi = sin(heading); - cosPsi = cos(heading); - - m->m[0][0] = cosTheta * cosPsi; - m->m[0][1] = sinPhi * sinTheta * cosPsi - cosPhi * sinPsi; - m->m[0][2] = cosPhi * sinTheta * cosPsi + sinPhi * sinPsi; - m->m[1][0] = cosTheta * sinPsi; - m->m[1][1] = sinPhi * sinTheta * sinPsi + cosPhi * cosPsi; - m->m[1][2] = cosPhi * sinTheta * sinPsi - sinPhi * cosPsi; - m->m[2][0] = -sinTheta; - m->m[2][1] = sinPhi * cosTheta; - m->m[2][2] = cosPhi * cosTheta; - m->m[0][3] = m->m[1][3] = m->m[2][3] = 0.0; - m->m[3][0] = m->m[3][1] = m->m[3][2] = 0.0; - m->m[3][3] = 1.0; - -} - -double -elevatorSetting(craft * c, double qS, double w) -{ - - register double s, n, L, an; - register craftType *p = c->cinfo; - - s = c->Se + c->SeTrim; - - if (s > 1.0) - s = 1.0; - else if (s < -1.0) - s = -1.0; - -/* - * Limit the load factor that will be generated. - */ - - L = p->effElevator * p->CLSlope; - - an = cos(s * p->effElevator); - - n = an * (- s * L + p->CLOrigin) * qS / w; - - if (n > 9.5) - s = - (9.5 / (an * qS) * w - p->CLOrigin) / L; - else if (n < -3.0) - s = - (-3.0 / (an * qS) * w - p->CLOrigin) / L; - - return s; -} - -double -aileronSetting(craft * c) -{ - double Sa = c->Sa + c->SaTrim; - - if (Sa > 1.0) { - Sa = 1.0; - } - else if (Sa < -1.0) { - Sa = -1.0; - } - return Sa; -} - -int -flightCalculations(craft * c) -{ - - register craftType *p = c->cinfo; - double qS, s, CLift, CDrag; - double ClBeta; - double FLift, FDrag, FWeight, FSideForce; - double deltaRoll, deltaPitch, deltaYaw; - double y, newy; - double xa, xb, xc, xd, r0; - double dNorth, dEast, dmag, dHeading_rad; - double mass_slugs; - VPoint F, Fg, tmp; - VMatrix mtx, new_trihedral; - dis_entity_appearance appearance; - int airborne = 1; - - c->prevSg = c->Sg; -#ifndef FLAT_WORLD - c->prevw = c->w; -#endif - - c->rho = calcRho(METERStoFEET(c->w.z), &c->mach1); - calcAlphaBeta(c, &(c->alpha), &(c->beta)); - -/* - * A note about thrust: Normal thrust diminishes in proportion to the - * decrease in air density. - */ - - c->VT = mag(c->Cg); - c->mach = c->VT / c->mach1; - - if (disInUse) { - appearance = dis_getEntityAppearance(c->disId); - appearance &= ~(DISAppearanceAirAfterburnerOn | DISAppearancePlatformPowerplantOn); - } - - if (c->fuel <= 0.0 || isFunctioning(c, SYS_ENGINE1) == 0) { - c->curThrust = 0.0; - } - else { - c->curThrust = (*p->thrust) (c); - if (c->flags & FL_AFTERBURNER) { - appearance |= DISAppearanceAirAfterburnerOn; - } - appearance |= DISAppearancePlatformPowerplantOn; - } - - if (disInUse) { - dis_setEntityAppearance(c->disId, appearance); - } - - calcCoefficients(c, &CLift, &CDrag); - ClBeta = interpolate(p->ClBeta, fabs(c->alpha)); - -#ifdef FLIGHTDEBUG - if (debug) { - printf("\n------\ntime = %g secs.\n", curTime); - printf("alpha = %g deg, beta = %g deg\nCL = %g, CD = %g\n", - RADtoDEG(c->alpha), RADtoDEG(c->beta), CLift, CDrag); - printf("CnBeta = %g, ClBeta = %g\n", CN, ClBeta); - } -#endif - -/* - * Compute the resultant force vector on the aircraft. By the way, the - * variable "qS" should more properly be named "qS" -- it is the dynamic - * pressure times S, the reference wing area. - */ - - qS = c->rho * p->wingS * c->VT * c->VT * 0.5; - s = p->wings; - FLift = CLift * qS; - FDrag = CDrag * qS; - FSideForce = C_Y * qS; - FWeight = p->emptyWeight + c->fuel; - - setBackgroundSound(c, - c->rpm, - (c->flags & FL_AFTERBURNER) ? 1 : 0, - qS / p->wingS); - -#ifdef FLIGHTDEBUG - if (debug) { - printf("rho = %g, FLift = %g lbs, FThrust = %g lbs, ", - c->rho, FLift, c->curThrust); - printf("FDrag = %g lbs\n", FDrag); - } -#endif - -/* - * These expressions convert lift and drag forces from wind axes to the - * aircraft fixed axes. The conversion is based on the wind to - * aircraft transformation matrix supplied in "Airplane Design" by - * Donald Crawford (page 90). - */ - - F.x = c->curThrust - + FLift * sin(c->alpha) - - FDrag * cos(c->alpha) * cos(c->beta); - F.y = -FDrag * sin(c->beta) - + FSideForce; - F.z = -FLift * cos(c->alpha) - - FDrag * cos(c->beta) * sin(c->alpha); - -/* - * Now calculate changes in position (Sg) and velocity (Cg). - */ - - if ((c->VT > p->maxNWS) || ((c->flags & FL_GND_CONTACT) == 0)) - c->flags &= ~FL_NWS; - else - c->flags |= FL_NWS; - - if (c->flags & FL_GND_CONTACT) { - - airborne = 0; - -/* - * groundDynamics handles movement when we're in contact with the earth. - */ - - if (groundDynamics(c, 0.0, CLift, CDrag, CM, FWeight, qS)) { - return 1; - } - - craftToGround(c, &F, &Fg); - - if ((c->fuel -= fuelUsed(c) + c->leakRate * deltaT) <= 0.0) { - c->fuel = 0.0; - c->curThrust = 0.0; - c->throttle = 0; - } - - Fg.z += FWeight; - -/* Nose wheel steering is only active when we cannot lift off -- cancel z */ - - Fg.z = 0.0; - - } - else { - -/* - * Resolve moments - */ - - xa = p->wings * p->wings * p->wingS - * c->rho * c->VT * p->Clp; - xb = -p->I.m[0][0]; - xc = qS * p->wings * 2.0 * - (p->Clda * - aileronSetting(c) * p->maxAileron - + ClBeta * c->beta - + p->Cldr * c->Sr * p->maxRudder) - + c->damageCL * qS; - xd = c->p + xc / xa; - r0 = -xd * xb / xa; - deltaRoll = -xd * xb / xa * exp(-xa / xb * deltaT) - - deltaT * xc / xa - r0; - c->p = xd * exp(-xa / xb * deltaT) - xc / xa; - -/* - * Resolve pitch-axis (Y-axis) changes - */ - - y = c->alpha + elevatorSetting(c, qS, FWeight) * - p->effElevator; - twoOrder(CM * qS * p->c / p->I.m[1][1], - (0.25 * p->wingS * c->rho * p->c * p->c * - c->VT * p->Cmq) / p->I.m[1][1], - y, c->q, &newy, &(c->q)); - deltaPitch = newy - y; - -/* - * Resolve yaw-axis (Z-axis) changes. - * - * We do some trickery here. - * If the absolute value of the sideslip angle is greater than 90 degrees, - * we trick the code into believing that the sideslip angle is the negative - * of its reciprocal value (e.g. -176 becomes -4 degrees). We do this with - * the (somewhat inaccurate) assumption that the CN value for that angle is - * roughly equal to the other. - */ - - y = c->beta - c->Sr * p->effRudder; - - if (y > pi / 2.0) { - y = pi - y; - } - else if (y < -pi / 2.0) { - y = -pi - y; - } - - twoOrder(CN * qS * s / p->I.m[2][2], - (p->wingS * c->rho * s * s * - c->VT * p->Cnr) / p->I.m[2][2], - y, c->r, &newy, &(c->r)); - deltaYaw = y - newy; - -#ifdef FLIGHTDEBUG - if (debug) { - printf("p = %g deg/sec, qS = %g\ - deg/sec, r = %g deg/sec\n", RADtoDEG(c->p), RADtoDEG(c->q), RADtoDEG(c->r)); - } -#endif - -/* - * Compute new aicraft trihedral, but don't set it yet. - */ - - buildEulerMatrix(deltaRoll, deltaPitch, deltaYaw, &mtx); - VMatrixMultByRank(&mtx, &c->trihedral, &new_trihedral, 3); - - craftToGround(c, &F, &Fg); - -/* - * Compute fuel consumption - */ - - if ((c->fuel -= fuelUsed(c) + c->leakRate * deltaT) <= 0.0) { - c->fuel = 0.0; - c->curThrust = 0.0; - } - - Fg.z += FWeight; - -#ifdef FLIGHTDEBUG - if (debug) { - printf("v = %g kts (Mach %.3g), Fg = { %g, %g, %g }\n", - FPStoKTS(c->VT), c->mach, Fg.x, Fg.y, Fg.z); - printf("F = { %g, %g, %g }\n", - F.x, F.y, F.z); - } -#endif - -/* - * on ground G-forces are calculated in gear.c - */ - - if (airborne) { - calcGForces(c, &Fg, FWeight); - } - -/* - * Update our position (in flight mode). - */ - mass_slugs = FWeight / earth_g; - - dNorth = FEETtoMETERS(c->Cg.x * deltaT + Fg.x / mass_slugs * halfDeltaTSquared); - dEast = FEETtoMETERS(c->Cg.y * deltaT + Fg.y / mass_slugs * halfDeltaTSquared); - c->w.z -= FEETtoMETERS(c->Cg.z * deltaT + Fg.z / mass_slugs * halfDeltaTSquared); - - dmag = sqrt(dNorth * dNorth + dEast * dEast); - - DISUpdateWorldCoordinatesEx (&c->w, dNorth / dmag, dEast / dmag, dmag, - &dHeading_rad); - -/* - * Update velocity vector based on acceleration - */ - - c->Cg.x += Fg.x / mass_slugs * deltaT; - c->Cg.y += Fg.y / mass_slugs * deltaT; - c->Cg.z += Fg.z / mass_slugs * deltaT; - -/* - * Now rotate the trihedral and velocity vector to reflect the change in heading - * at the new spheroid location. - */ - - VIdentMatrix( &mtx ); - VRotate( &mtx, ZRotation, dHeading_rad ); - VMatrixMultByRank( &mtx, &new_trihedral, &c->trihedral, 3 ); - c->trihedral = new_trihedral; - VTransform_ (&c->Cg, &mtx, &tmp); - c->Cg = tmp; - - euler(c); - -#ifdef FLIGHTDEBUG - if (debug) { - printf ("heading change %f (deg)\n", RADtoDEG(dHeading_rad)); - } -#endif - -/* - * Post processing - * - * Check to see if we make ground contact during this interval; if so, - * recalculate the aircraft position taking into account the ground - * dynamics after touchdown. - */ - y = groundContactTime(c, &tmp); - if (y >= 0.0) { -#ifdef FLAT_WORLD - c->Sg = tmp; -#endif - if (groundDynamics(c, y, CLift, CDrag, CM, FWeight, qS)) { - return 1; - } - playSound(c, SoundTouchdown); - } - - } /* if GND_CONTACT */ - - DISWorldCoordinatesToGeocentric(&c->w, - (dis_world_coordinates *) & c->Sg); - GenerateWorldToLocalMatrix(&c->w, &c->XYZtoNED); - -#ifdef FLIGHTDEBUG - if (debug) { - printf("Altitude = %g ft\n", c->w.z); - printf("Euler angles RPY { %g, %g, %g }\n", - RADtoDEG(c->curRoll), - RADtoDEG(c->curPitch), RADtoDEG(c->curHeading)); - printf("Cg = { %g, %g, %g } ", c->Cg.x, c->Cg.y, c->Cg.z); - printf("Sg = { %g, %g, %g }\n", c->Sg.x, c->Sg.y, c->Sg.z); - } -#endif - -#ifdef AFDS - executeFlightPlan ( c, deltaT ); - - /* - * Flight Director Control Law + integration - */ - - AFDSIntegrate ( c, deltaT ); -#endif - - return 0; -} diff -Nru acm-5.0/src/pm.h acm-6.0+20200416/src/pm.h --- acm-5.0/src/pm.h 2020-12-06 19:23:18.000000000 +0000 +++ acm-6.0+20200416/src/pm.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,960 +0,0 @@ -/* - * acm : an aerial combat simulator for X - * Copyright (C) 1991-1998 Riley Rainey - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 dated June, 1991. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA. - */ - -#ifndef _pm_h -#define _pm_h - -#include - -#include -#include -#include -#include -#include -#if defined(NETAUDIO) -#include